diff --git a/harbour-fernschreiber.pro b/harbour-fernschreiber.pro
index 1f255f1..4121b6b 100644
--- a/harbour-fernschreiber.pro
+++ b/harbour-fernschreiber.pro
@@ -64,6 +64,8 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/StickerPicker.qml \
qml/components/PhotoTextsListItem.qml \
qml/components/TDLibImage.qml \
+ qml/components/TDLibMinithumbnail.qml \
+ qml/components/TDLibPhoto.qml \
qml/components/TDLibThumbnail.qml \
qml/components/VoiceNoteOverlay.qml \
qml/components/chatInformationPage/ChatInformationPageContent.qml \
diff --git a/qml/components/TDLibMinithumbnail.qml b/qml/components/TDLibMinithumbnail.qml
new file mode 100644
index 0000000..50f169a
--- /dev/null
+++ b/qml/components/TDLibMinithumbnail.qml
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2020 Sebastian J. Wolf and other contributors
+
+ This file is part of Fernschreiber.
+
+ Fernschreiber is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Fernschreiber is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Fernschreiber. If not, see .
+*/
+import QtQuick 2.6
+import Sailfish.Silica 1.0
+import QtGraphicalEffects 1.0
+
+Loader {
+ id: loader
+ property var minithumbnail
+ property bool highlighted
+ anchors.fill: parent
+ active: !!minithumbnail
+ visible: active
+ sourceComponent: Component {
+ Item {
+ Image {
+ id: minithumbnailImage
+ anchors.fill: parent
+ source: "data:image/jpg;base64,"+minithumbnail.data
+ asynchronous: true
+ fillMode: tdLibImage.fillMode
+ opacity: status === Image.Ready ? 1.0 : 0.0
+ cache: false
+ visible: opacity > 0
+ Behavior on opacity { FadeAnimation {} }
+
+ layer {
+ enabled: loader.highlighted
+ effect: PressEffect { source: minithumbnailImage }
+ }
+ }
+
+ FastBlur {
+ anchors.fill: parent
+ source: minithumbnailImage
+ radius: Theme.paddingLarge
+ }
+ }
+ }
+}
diff --git a/qml/components/TDLibPhoto.qml b/qml/components/TDLibPhoto.qml
new file mode 100644
index 0000000..4de80a5
--- /dev/null
+++ b/qml/components/TDLibPhoto.qml
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2020 Sebastian J. Wolf and other contributors
+
+ This file is part of Fernschreiber.
+
+ Fernschreiber is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Fernschreiber is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Fernschreiber. If not, see .
+*/
+import QtQuick 2.6
+import WerkWolf.Fernschreiber 1.0
+import Sailfish.Silica 1.0
+import QtGraphicalEffects 1.0
+
+Item {
+ id: tdLibPhoto
+ property var photo
+ property bool highlighted
+ readonly property alias fileInformation: tdLibImage.fileInformation
+ readonly property alias image: tdLibImage
+
+ onWidthChanged: setImageFile()
+ onPhotoChanged: setImageFile()
+
+ function setImageFile() {
+ if (photo) {
+ var photoSize;
+ for (var i = 0; i < photo.sizes.length; i++) {
+ photoSize = photo.sizes[i].photo;
+ if (photo.sizes[i].width >= width) {
+ break;
+ }
+ }
+ if (photoSize && photoSize.id !== tdLibImage.fileInformation.id) {
+ tdLibImage.fileInformation = photoSize;
+ }
+ }
+ }
+
+ TDLibMinithumbnail {
+ id: minithumbnailLoader
+ active: !!minithumbnail && tdLibImage.opacity < 1.0
+ minithumbnail: tdLibPhoto.photo.minithumbnail
+ highlighted: parent.highlighted
+ }
+
+ BackgroundImage {
+ visible: tdLibImage.opacity < 1.0
+ }
+
+ TDLibImage {
+ id: tdLibImage
+ width: parent.width //don't use anchors here for easier custom scaling
+ height: parent.height
+ cache: false
+ highlighted: parent.highlighted
+ }
+
+ Component.onCompleted: setImageFile()
+}
diff --git a/qml/components/TDLibThumbnail.qml b/qml/components/TDLibThumbnail.qml
index 8454dd7..291f507 100644
--- a/qml/components/TDLibThumbnail.qml
+++ b/qml/components/TDLibThumbnail.qml
@@ -50,7 +50,7 @@ Item {
- video
- videoNote
*/
- property var minithumbnail
+ property alias minithumbnail: minithumbnailLoader.minithumbnail
property bool useBackgroundImage: true
property bool highlighted
@@ -65,29 +65,12 @@ Item {
effect: PressEffect { source: tdlibThumbnail }
}
- Loader {
- id: backgroundLoader
- anchors.fill: parent
- active: !parent.hasVisibleThumbnail
- asynchronous: true
- sourceComponent: !!parent.minithumbnail ? miniThumbnailComponent : parent.useBackgroundImage ? backgroundImageComponent : ""
- Component {
- id: backgroundImageComponent
- BackgroundImage {}
- }
- Component {
- id: miniThumbnailComponent
- Image {
- clip: true
- asynchronous: true
- fillMode: Image.PreserveAspectCrop
- opacity: status === Image.Ready ? 1.0 : 0.0
- smooth: false
- source: "data:image/jpg;base64," + tdlibThumbnail.miniThumbnail.data
- visible: opacity > 0
- Behavior on opacity { FadeAnimation {} }
- }
- }
+ TDLibMinithumbnail {
+ id: minithumbnailLoader
+ active: !!minithumbnail && thumbnailImage.opacity < 1.0
+ }
+ BackgroundImage {
+ visible: tdlibThumbnail.useBackgroundImage && thumbnailImage.opacity < 1.0
}
// image thumbnail
diff --git a/qml/components/inlineQueryResults/InlineQueryResultPhoto.qml b/qml/components/inlineQueryResults/InlineQueryResultPhoto.qml
index f278b76..e9e995d 100644
--- a/qml/components/inlineQueryResults/InlineQueryResultPhoto.qml
+++ b/qml/components/inlineQueryResults/InlineQueryResultPhoto.qml
@@ -17,52 +17,13 @@
along with Fernschreiber. If not, see .
*/
import QtQuick 2.6
-import Sailfish.Silica 1.0
-import QtMultimedia 5.6
-import WerkWolf.Fernschreiber 1.0
import "../"
InlineQueryResult {
id: queryResultItem
-
- TDLibFile {
- id: file
- tdlib: tdLibWrapper
- autoLoad: true
- }
-
- Loader {
- asynchronous: true
- active: file.isDownloadingCompleted
+ TDLibPhoto {
anchors.fill: parent
- opacity: item && item.status === Image.Ready ? 1.0 : 0.0
- Behavior on opacity { FadeAnimation {} }
- sourceComponent: Component {
- Image {
- id: image
- source: file.path
- asynchronous: true
- clip: true
- fillMode: Image.PreserveAspectCrop
- layer.enabled: queryResultItem.pressed
- layer.effect: PressEffect { source: image }
- }
- }
- }
- Component.onCompleted: {
- if (model.photo) {
- // Check first which size fits best...
- var photo
- for (var i = 0; i < model.photo.sizes.length; i++) {
- photo = model.photo.sizes[i].photo
- if (model.photo.sizes[i].width >= queryResultItem.width) {
- break
- }
- }
- if (photo) {
- file.fileInformation = photo
- }
- }
+ photo: model.photo
}
}
diff --git a/qml/components/messageContent/MessageLocation.qml b/qml/components/messageContent/MessageLocation.qml
index 1b26e18..845f4f0 100644
--- a/qml/components/messageContent/MessageLocation.qml
+++ b/qml/components/messageContent/MessageLocation.qml
@@ -22,72 +22,51 @@ import Sailfish.Silica 1.0
import "../"
MessageContentBase {
-
- id: imagePreviewItem
-
- property var locationData : ( rawMessage.content['@type'] === "messageLocation" ) ? rawMessage.content.location : ( ( rawMessage.content['@type'] === "messageVenue" ) ? rawMessage.content.venue.location : "" )
-
- property string chatId: rawMessage.chat_id
- property var pictureFileInformation;
+ id: contentItem
height: width * 0.66666666;
- property string fileExtra
- Component.onCompleted: {
- updatePicture();
- }
+ property var locationData : rawMessage.content.location
+ property string fileExtra;
+
onClicked: {
if(!processLauncher.launchProgram('harbour-pure-maps', ["geo:"+locationData.latitude+","+locationData.longitude])) {
imageNotification.show(qsTr("Install Pure Maps to inspect this location."));
}
}
+ onLocationDataChanged: updatePicture()
+ onWidthChanged: updatePicture()
+
function updatePicture() {
- imagePreviewItem.pictureFileInformation = null;
if (locationData) {
- fileExtra = "location:" + locationData.latitude + ":" + locationData.longitude + ":" + Math.round(imagePreviewItem.width) + ":" + Math.round(imagePreviewItem.height);
- tdLibWrapper.getMapThumbnailFile(chatId, locationData.latitude, locationData.longitude, Math.round(imagePreviewItem.width), Math.round(imagePreviewItem.height), fileExtra);
+ fileExtra = "location:" + locationData.latitude + ":" + locationData.longitude + ":" + Math.round(contentItem.width) + ":" + Math.round(contentItem.height);
+ tdLibWrapper.getMapThumbnailFile(rawMessage.chat_id, locationData.latitude, locationData.longitude, Math.round(contentItem.width), Math.round(contentItem.height), fileExtra);
}
}
Connections {
target: tdLibWrapper
onFileUpdated: {
- if(fileInformation["@extra"] !== imagePreviewItem.fileExtra && (!imagePreviewItem.pictureFileInformation || imagePreviewItem.pictureFileInformation.id !== fileInformation.id)) {
- return;
+ if(fileInformation["@extra"] === contentItem.fileExtra) {
+ if(fileInformation.id !== image.file.fileId) {
+ image.fileInformation = fileInformation
+ }
}
- if(fileInformation.local.is_downloading_completed) {
- singleImage.source = fileInformation.local.path;
- } else if(fileInformation.local.can_be_downloaded && !fileInformation.local.is_downloading_active) {
- tdLibWrapper.downloadFile(fileInformation.id);
- }
-
- imagePreviewItem.pictureFileInformation = fileInformation;
}
}
AppNotification {
id: imageNotification
}
-
- Image {
- id: singleImage
- width: parent.width - Theme.paddingSmall
- height: parent.height - Theme.paddingSmall
- anchors.centerIn: parent
-
- fillMode: Image.PreserveAspectCrop
- autoTransform: true
- asynchronous: true
- visible: status === Image.Ready
- opacity: status === Image.Ready ? 1 : 0
- Behavior on opacity { NumberAnimation {} }
-
- layer.enabled: imagePreviewItem.highlighted
- layer.effect: PressEffect { source: singleImage }
+ TDLibImage {
+ id: image
+ anchors.fill: parent
+ cache: false
+ highlighted: contentItem.highlighted
Item {
anchors.centerIn: parent
width: markerImage.width
height: markerImage.height * 1.75 // 0.875 (vertical pin point) * 2
- Image {
+ Icon {
id: markerImage
source: 'image://theme/icon-m-location'
}
@@ -105,7 +84,10 @@ MessageContentBase {
}
BackgroundImage {
- visible: singleImage.status !== Image.Ready
+ visible: image.status !== Image.Ready
}
+ Component.onCompleted: {
+ updatePicture();
+ }
}
diff --git a/qml/components/messageContent/MessagePhoto.qml b/qml/components/messageContent/MessagePhoto.qml
index e4e9c95..beb2381 100644
--- a/qml/components/messageContent/MessagePhoto.qml
+++ b/qml/components/messageContent/MessagePhoto.qml
@@ -18,68 +18,40 @@
*/
import QtQuick 2.6
import Sailfish.Silica 1.0
-import WerkWolf.Fernschreiber 1.0
import "../"
MessageContentBase {
- id: imagePreviewItem
- readonly property int defaultHeight: Math.round(width * 2 / 3)
+ function calculateBiggest() {
+ var candidateBiggest = rawMessage.content.photo.sizes[rawMessage.content.photo.sizes.length - 1];
+ if (candidateBiggest.width === 0 && rawMessage.content.photo.sizes.length > 1) {
+ for (var i = (rawMessage.content.photo.sizes.length - 2); i >= 0; i--) {
+ candidateBiggest = rawMessage.content.photo.sizes[i];
+ if (candidateBiggest.width > 0) {
+ break;
+ }
+ }
+ }
+ return candidateBiggest;
+ }
- height: singleImage.visible ? Math.min(defaultHeight, singleImage.bestHeight + Theme.paddingSmall) : defaultHeight
+ height: Math.max(Theme.itemSizeExtraSmall, Math.min(defaultHeight, width / (biggest.width/biggest.height)))
+ readonly property int defaultHeight: Math.round(width * 0.66666666)
+ readonly property var biggest: calculateBiggest();
onClicked: {
pageStack.push(Qt.resolvedUrl("../../pages/ImagePage.qml"), {
- "photoData" : imagePreviewItem.rawMessage.content.photo
+ "photoData" : photo.photo,
+// "pictureFileInformation" : photo.fileInformation
})
}
-
- Component.onCompleted: updateImage()
-
- onRawMessageChanged: updateImage()
-
- function updateImage() {
- if (rawMessage.content.photo) {
- // Check first which size fits best...
- var photo
- var photoData = rawMessage.content.photo
- for (var i = 0; i < photoData.sizes.length; i++) {
- photo = photoData.sizes[i].photo
- if (photoData.sizes[i].width >= imagePreviewItem.width) {
- break
- }
- }
- if (photo) {
- imageFile.fileInformation = photo
- }
- }
+ TDLibPhoto {
+ id: photo
+ anchors.fill: parent
+ photo: rawMessage.content.photo
+ highlighted: parent.highlighted
}
-
- TDLibFile {
- id: imageFile
- tdlib: tdLibWrapper
- autoLoad: true
- }
-
- Image {
- id: singleImage
- width: parent.width - Theme.paddingSmall
- height: parent.height - Theme.paddingSmall
- readonly property int bestHeight: (status === Image.Ready) ? Math.round(implicitHeight * width / implicitWidth) : 0
- anchors.centerIn: parent
-
- fillMode: Image.PreserveAspectCrop
- autoTransform: true
- asynchronous: true
- source: imageFile.isDownloadingCompleted ? imageFile.path : ""
- visible: status === Image.Ready
- opacity: visible ? 1 : 0
- Behavior on opacity { FadeAnimation {} }
- layer.enabled: imagePreviewItem.highlighted
- layer.effect: PressEffect { source: singleImage }
- }
-
BackgroundImage {
- visible: singleImage.status !== Image.Ready
+ visible: !rawMessage.content.photo.minithumbnail && photo.image.status !== Image.Ready
}
}
diff --git a/qml/components/messageContent/MessagePoll.qml b/qml/components/messageContent/MessagePoll.qml
index d41e9ae..392e09e 100644
--- a/qml/components/messageContent/MessagePoll.qml
+++ b/qml/components/messageContent/MessagePoll.qml
@@ -230,6 +230,24 @@ MessageContentBase {
width: 1
height: Theme.paddingSmall
}
+ Label {
+ width: parent.width
+ wrapMode: Text.Wrap
+ visible: isQuiz && text.length > 0
+ text: Emoji.emojify(Functions.enhanceMessageText(pollData.type.explanation) || "", font.pixelSize)
+ textFormat: Text.StyledText
+ color: pollMessageComponent.isOwnMessage || pollMessageComponent.highlighted ? Theme.highlightColor : Theme.primaryColor
+ font.pixelSize: Theme.fontSizeExtraSmall
+ leftPadding: Theme.iconSizeSmall
+ bottomPadding: Theme.paddingSmall
+ Icon {
+ source: "image://theme/icon-s-high-importance"
+ asynchronous: true
+ width: Theme.iconSizeExtraSmall
+ height: Theme.iconSizeExtraSmall
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
Item {
x: -Theme.horizontalPageMargin/2
@@ -259,7 +277,7 @@ MessageContentBase {
visible: !pollMessageComponent.canAnswer && !pollData.is_anonymous && pollData.total_voter_count > 0
icon.source: "image://theme/icon-m-media-artists"
onClicked: {
- pageStack.push(Qt.resolvedUrl("../../pages/PollResultsPage.qml"), { chatId:chatId, message:pollMessageComponent.message});
+ pageStack.push(Qt.resolvedUrl("../../pages/PollResultsPage.qml"), { chatId:chatId, message:pollMessageComponent.rawMessage});
}
Icon {
opacity: 0.8
diff --git a/qml/components/messageContent/MessageVenue.qml b/qml/components/messageContent/MessageVenue.qml
index 9c04ae9..bd833d6 100644
--- a/qml/components/messageContent/MessageVenue.qml
+++ b/qml/components/messageContent/MessageVenue.qml
@@ -16,6 +16,9 @@
You should have received a copy of the GNU General Public License
along with Fernschreiber. If not, see .
*/
+
import QtQuick 2.6
-MessageLocation {}
+MessageLocation {
+ locationData: rawMessage.content.venue.location
+}
diff --git a/qml/pages/ChatPage.qml b/qml/pages/ChatPage.qml
index b297805..69735f7 100644
--- a/qml/pages/ChatPage.qml
+++ b/qml/pages/ChatPage.qml
@@ -1059,7 +1059,7 @@ Page {
function getContentComponentHeight(contentType, content, parentWidth) {
switch(contentType) {
case "messageAnimation":
- return Functions.getVideoHeight(parentWidth, content.video);
+ return Functions.getVideoHeight(parentWidth, content.animation);
case "messageAudio":
case "messageVoiceNote":
case "messageDocument":
@@ -1067,9 +1067,12 @@ Page {
case "messageGame":
return parentWidth * 0.66666666 + Theme.itemSizeLarge; // 2 / 3;
case "messageLocation":
- case "messagePhoto":
case "messageVenue":
return parentWidth * 0.66666666; // 2 / 3;
+ case "messagePhoto":
+ var biggest = content.photo.sizes[content.photo.sizes.length - 1];
+ var aspectRatio = biggest.width/biggest.height;
+ return Math.max(Theme.itemSizeExtraSmall, Math.min(parentWidth * 0.66666666, parentWidth / aspectRatio));
case "messagePoll":
return Theme.itemSizeSmall * (4 + content.poll.options);
case "messageSticker":
diff --git a/qml/pages/ImagePage.qml b/qml/pages/ImagePage.qml
index 9b057b5..6b48252 100644
--- a/qml/pages/ImagePage.qml
+++ b/qml/pages/ImagePage.qml
@@ -47,28 +47,20 @@ Page {
Component.onCompleted: {
if (photoData) {
- // Check first which size fits best...
- var photo
+ var biggestIndex = -1
for (var i = 0; i < photoData.sizes.length; i++) {
- imagePage.imageWidth = photoData.sizes[i].width;
- imagePage.imageHeight = photoData.sizes[i].height;
- photo = photoData.sizes[i].photo
- if (photoData.sizes[i].width >= imagePage.width) {
- break;
+ if (biggestIndex === -1 || photoData.sizes[i].width > photoData.sizes[biggestIndex].width) {
+ biggestIndex = i;
}
}
- if (photo) {
- imageFile.fileInformation = photo
+ if (biggestIndex > -1) {
+ imagePage.imageWidth = photoData.sizes[biggestIndex].width;
+ imagePage.imageHeight = photoData.sizes[biggestIndex].height;
+ singleImage.fileInformation = photoData.sizes[biggestIndex].photo
}
}
}
- TDLibFile {
- id: imageFile
- tdlib: tdLibWrapper
- autoLoad: true
- }
-
Connections {
target: tdLibWrapper
onCopyToDownloadsSuccessful: {
@@ -86,11 +78,11 @@ Page {
interactive: !imageOnly
PullDownMenu {
- visible: !imageOnly && imageFile.isDownloadingCompleted && imageFile.path
+ visible: !imageOnly && singleImage.file.isDownloadingCompleted
MenuItem {
text: qsTr("Download Picture")
onClicked: {
- tdLibWrapper.copyFileToDownloads(imageFile.path);
+ tdLibWrapper.copyFileToDownloads(singleImage.file.path);
}
}
}
@@ -122,9 +114,8 @@ Page {
imageFlickable.returnToBounds()
}
- Image {
+ TDLibImage {
id: singleImage
- source: imageFile.isDownloadingCompleted ? imageFile.path : ""
width: imagePage.imageWidth * imagePage.sizingFactor
height: imagePage.imageHeight * imagePage.sizingFactor
anchors.centerIn: parent
diff --git a/qml/pages/PollCreationPage.qml b/qml/pages/PollCreationPage.qml
index 029ef34..9fb8f89 100644
--- a/qml/pages/PollCreationPage.qml
+++ b/qml/pages/PollCreationPage.qml
@@ -39,6 +39,7 @@ Dialog {
property alias quiz: quizSwitch.checked
property alias multiple: multipleSwitch.checked
property string replyToMessageId: "0"
+ property alias quizExplanation: quizExplanationTextArea.text
// poll request data end
canAccept: validationErrors.length === 0
@@ -81,6 +82,9 @@ Dialog {
if(quiz && (correctOption < 0 || correctOption > options.count - 1)) {
errors.push(qsTr("To send a quiz, you have to specify the right answer."));
}
+ if(quiz && quizExplanationTextArea.hasError) {
+ errors.push(qsTr("An explanation can be up to 200 characters long."));
+ }
if(errors.length === 0) {
validationErrorsVisible = false;
}
@@ -333,6 +337,25 @@ Dialog {
}
description: qsTr("Quizzes have one correct answer. Participants can't revoke their responses.")
}
+ TextArea {
+ id: quizExplanationTextArea
+ width: parent.width
+ opacity: pollCreationPage.quiz ? 1.0 : 0.0
+ Behavior on opacity { FadeAnimation {} }
+ height: pollCreationPage.quiz ? implicitHeight : 0
+ Behavior on height { NumberAnimation { duration: quizExplanationTextArea.focus ? 0 : 200 } }
+ visible: opacity > 0
+
+ placeholderText: qsTr("Enter an optional explanation")
+ property int charactersLeft: 200 - text.length
+ property bool hasError: charactersLeft < 0
+ color: hasError ? Theme.errorColor : Theme.highlightColor
+ label: qsTr("Shown when the user selects a wrong answer.")
+ wrapMode: TextEdit.Wrap
+ onFocusChanged: {
+ validate();
+ }
+ }
}
}
@@ -342,7 +365,7 @@ Dialog {
optionsArr.push(options.get(i).text);
}
- tdLibWrapper.sendPollMessage(chatId, pollQuestion, optionsArr, anonymous, quiz ? correctOption : -1, multiple, "0");
+ tdLibWrapper.sendPollMessage(chatId, pollQuestion, optionsArr, anonymous, quiz ? correctOption : -1, multiple, quizExplanation, "0");
}
diff --git a/src/fernschreiberutils.cpp b/src/fernschreiberutils.cpp
index 57a07e7..b7d9af9 100644
--- a/src/fernschreiberutils.cpp
+++ b/src/fernschreiberutils.cpp
@@ -93,6 +93,9 @@ QString FernschreiberUtils::getMessageShortText(TDLibWrapper *tdLibWrapper, cons
if (contentType == "messageVideo") {
return myself ? tr("sent a video", "myself") : tr("sent a video");
}
+ if (contentType == "messageVideoNote") {
+ return myself ? tr("sent a video note", "myself") : tr("sent a video note");
+ }
if (contentType == "messageAnimation") {
return myself ? tr("sent an animation", "myself") : tr("sent an animation");
}
diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp
index 3de2e99..ec03779 100644
--- a/src/tdlibwrapper.cpp
+++ b/src/tdlibwrapper.cpp
@@ -569,7 +569,7 @@ void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &file
this->sendRequest(requestObject);
}
-void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &replyToMessageId)
+void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, const QString &replyToMessageId)
{
LOG("Sending poll message" << chatId << question << replyToMessageId);
QVariantMap requestObject;
@@ -585,6 +585,11 @@ void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &questio
if(correctOption > -1) {
pollType.insert(_TYPE, "pollTypeQuiz");
pollType.insert("correct_option_id", correctOption);
+ if(!explanation.isEmpty()) {
+ QVariantMap formattedExplanation;
+ formattedExplanation.insert("text", explanation);
+ pollType.insert("explanation", formattedExplanation);
+ }
} else {
pollType.insert(_TYPE, "pollTypeRegular");
pollType.insert("allow_multiple_answers", multiple);
diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h
index e4b8791..4ba3f5e 100644
--- a/src/tdlibwrapper.h
+++ b/src/tdlibwrapper.h
@@ -163,7 +163,7 @@ public:
Q_INVOKABLE void sendVoiceNoteMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
Q_INVOKABLE void sendLocationMessage(const QString &chatId, double latitude, double longitude, double horizontalAccuracy, const QString &replyToMessageId = "0");
Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId = "0");
- Q_INVOKABLE void sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &replyToMessageId = "0");
+ Q_INVOKABLE void sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, const QString &replyToMessageId = "0");
Q_INVOKABLE void forwardMessages(const QString &chatId, const QString &fromChatId, const QVariantList &messageIds, bool sendCopy, bool removeCaption);
Q_INVOKABLE void getMessage(qlonglong chatId, qlonglong messageId);
Q_INVOKABLE void getCallbackQueryAnswer(const QString &chatId, const QString &messageId, const QVariantMap &payload);
diff --git a/translations/harbour-fernschreiber-de.ts b/translations/harbour-fernschreiber-de.ts
index 64d3fb2..a5abc89 100644
--- a/translations/harbour-fernschreiber-de.ts
+++ b/translations/harbour-fernschreiber-de.ts
@@ -840,6 +840,15 @@
hat ein Spiel gesendet
+
+
+ myself
+ haben eine Videonachricht geschickt
+
+
+
+ hat eine Videonachricht geschickt
+
ImagePage
@@ -1064,7 +1073,7 @@
MessageVoiceNote
-
+ Sprachnotiz
@@ -1298,6 +1307,18 @@
Quizze haben eine korrekte Antwort. Teilnehmer können ihre Antwort nicht zurückziehen.
+
+
+ Geben Sie eine optionale Erklärung ein
+
+
+
+ Wird bei Auswahl einer falschen Antwort gezeigt.
+
+
+
+ Eine Erklärung kann bis zu 200 Zeichen lang sein.
+
PollResultsPage
@@ -1966,7 +1987,7 @@
myself
- haben eine Videonachricht geschicht
+ haben eine Videonachricht geschickt
diff --git a/translations/harbour-fernschreiber-en.ts b/translations/harbour-fernschreiber-en.ts
index bde4a28..d0b27a4 100644
--- a/translations/harbour-fernschreiber-en.ts
+++ b/translations/harbour-fernschreiber-en.ts
@@ -840,6 +840,15 @@
sent a game
+
+
+ myself
+ sent a video note
+
+
+
+ sent a video note
+
ImagePage
@@ -1064,7 +1073,7 @@
MessageVoiceNote
-
+ Voice Note
@@ -1298,6 +1307,18 @@
Quizzes have one correct answer. Participants can't revoke their responses.
+
+
+ Enter an optional explanation
+
+
+
+ Shown when the user selects a wrong answer.
+
+
+
+ An explanation can be up to 200 characters long.
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts
index 1f535e3..c585c0e 100644
--- a/translations/harbour-fernschreiber-es.ts
+++ b/translations/harbour-fernschreiber-es.ts
@@ -840,6 +840,15 @@
+
+
+ myself
+ envió una nota de video
+
+
+
+ envió una nota de video
+
ImagePage
@@ -1298,6 +1307,18 @@
Los interrogatorios tienen una respuesta correcta. Los participantes no pueden revocar sus respuestas.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts
index 86246b6..673ed6d 100644
--- a/translations/harbour-fernschreiber-fi.ts
+++ b/translations/harbour-fernschreiber-fi.ts
@@ -841,6 +841,15 @@
+
+
+ myself
+
+
+
+
+
+
ImagePage
@@ -1299,6 +1308,18 @@
Visoilla on yksi oikea vastaus. Osallistujat eivät voi kumota vastaustaan.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts
index 9a22ce9..ac46773 100644
--- a/translations/harbour-fernschreiber-hu.ts
+++ b/translations/harbour-fernschreiber-hu.ts
@@ -828,6 +828,15 @@
+
+
+ myself
+
+
+
+
+
+
ImagePage
@@ -1279,6 +1288,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-it.ts b/translations/harbour-fernschreiber-it.ts
index 37de8d1..6af6462 100644
--- a/translations/harbour-fernschreiber-it.ts
+++ b/translations/harbour-fernschreiber-it.ts
@@ -840,6 +840,15 @@
+
+
+ myself
+
+
+
+
+
+
ImagePage
@@ -1298,6 +1307,18 @@
I quiz hanno una sola risposta corretta. I partecipanti non possono revocare le risposte.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts
index 7fcc53b..dae786c 100644
--- a/translations/harbour-fernschreiber-pl.ts
+++ b/translations/harbour-fernschreiber-pl.ts
@@ -852,6 +852,15 @@
+
+
+ myself
+
+
+
+
+
+
ImagePage
@@ -1317,6 +1326,18 @@
Quizy mają jedną poprawną odpowiedź. Uczestnicy nie mogą odwołać swoich odpowiedzi.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts
index d5838fc..0a3bb18 100644
--- a/translations/harbour-fernschreiber-ru.ts
+++ b/translations/harbour-fernschreiber-ru.ts
@@ -852,6 +852,15 @@
+
+
+ myself
+ отправлена видео заметка
+
+
+
+ отправлена видео заметка
+
ImagePage
@@ -1317,6 +1326,18 @@
Тесты имеют один правильный ответ. Участники не могут отозвать свои ответы.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-sv.ts b/translations/harbour-fernschreiber-sv.ts
index bbe7ff7..d5ee25e 100644
--- a/translations/harbour-fernschreiber-sv.ts
+++ b/translations/harbour-fernschreiber-sv.ts
@@ -840,6 +840,15 @@
+
+
+ myself
+ skickade ett videomeddelande
+
+
+
+ skickade ett videomeddelande
+
ImagePage
@@ -1298,6 +1307,18 @@
Frågor har ett (1) korrekt svar. Deltagarna kan inte återkalla sina svar.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts
index 4bf6589..994ad8a 100644
--- a/translations/harbour-fernschreiber-zh_CN.ts
+++ b/translations/harbour-fernschreiber-zh_CN.ts
@@ -828,6 +828,15 @@
发送游戏
+
+
+ myself
+ 发送视频消息
+
+
+
+ 发送视频消息
+
ImagePage
@@ -1279,6 +1288,18 @@
Quiz 拥有一个正确选项,参与者无法撤销回答。
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage
diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts
index ab8b218..cff9e86 100644
--- a/translations/harbour-fernschreiber.ts
+++ b/translations/harbour-fernschreiber.ts
@@ -840,6 +840,15 @@
+
+
+ myself
+ sent a video note
+
+
+
+ sent a video note
+
ImagePage
@@ -1298,6 +1307,18 @@
Quizzes have one correct answer. Participants can't revoke their responses.
+
+
+
+
+
+
+
+
+
+
+
+
PollResultsPage