diff --git a/qml/components/StickerPicker.qml b/qml/components/StickerPicker.qml index 3d95806..1e6e2a8 100644 --- a/qml/components/StickerPicker.qml +++ b/qml/components/StickerPicker.qml @@ -29,6 +29,17 @@ Item { property variant recentStickers: stickerManager.getRecentStickers() property variant installedStickerSets: stickerManager.getInstalledStickerSets() + property bool pickerLoaded: false + + Timer { + id: stickerPickerLoadedTimer + interval: 100 + running: true + repeat: false + onTriggered: { + stickerPickerOverlayItem.pickerLoaded = true; + } + } Rectangle { id: stickerPickerOverlayBackground @@ -37,10 +48,16 @@ Item { color: Theme.overlayBackgroundColor opacity: 0.7 } + Flickable { id: stickerPickerFlickable anchors.fill: parent anchors.margins: Theme.paddingMedium + + opacity: stickerPickerOverlayItem.pickerLoaded ? 1 : 0 + Behavior on opacity { NumberAnimation {} } + visible: stickerPickerOverlayItem.pickerLoaded + contentHeight: stickerPickerColumn.height clip: true @@ -78,18 +95,25 @@ Item { id: singleRecentStickerRow spacing: Theme.paddingSmall Image { - source: modelData.sticker.local.path - width: Theme.itemSizeMedium - height: Theme.itemSizeMedium + source: modelData.thumbnail.photo.local.path + width: Theme.itemSizeExtraLarge + height: Theme.itemSizeExtraLarge + asynchronous: true + onStatusChanged: { + if (status === Image.Ready) { + stickerPickerLoadedTimer.restart(); + } + } } } MouseArea { anchors.fill: parent onClicked: { - tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.local.path); + tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.remote.id); stickerPickerOverlayItem.visible = false; attachmentOptionsRow.visible = false; + stickerPickerLoader.active = false; } } } @@ -126,61 +150,69 @@ Item { model: modelData.stickers Item { - width: Theme.itemSizeMedium - height: Theme.itemSizeMedium - - Component.onCompleted: { - if (!modelData.sticker.local.is_downloading_completed) { - tdLibWrapper.downloadFile(modelData.sticker.id); - } - } - - Connections { - target: tdLibWrapper - onFileUpdated : { - if (fileInformation.local.is_downloading_completed) { - if (fileId === modelData.sticker.id) { - singleStickerImage.source = fileInformation.local.path; - } + width: Theme.itemSizeExtraLarge + height: Theme.itemSizeExtraLarge + Image { + id: singleStickerImage + source: modelData.thumbnail.photo.local.is_downloading_completed ? modelData.thumbnail.photo.local.path : "" + anchors.fill: parent + visible: modelData.thumbnail.photo.local.is_downloading_completed + asynchronous: true + onStatusChanged: { + if (status === Image.Ready) { + stickerPickerLoadedTimer.restart(); } } } - - Image { - id: singleStickerImage - source: modelData.sticker.local.is_downloading_completed ? modelData.sticker.local.path : "" - anchors.fill: parent - visible: modelData.sticker.local.is_downloading_completed - } Text { - font.pixelSize: Theme.fontSizeLarge + font.pixelSize: Theme.fontSizeHuge color: Theme.primaryColor anchors.fill: parent maximumLineCount: 1 elide: Text.ElideRight text: Emoji.emojify(modelData.emoji, font.pixelSize) - visible: !modelData.sticker.local.is_downloading_completed + visible: !modelData.thumbnail.photo.local.is_downloading_completed } MouseArea { anchors.fill: parent onClicked: { - tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.local.path); + tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.remote.id); stickerPickerOverlayItem.visible = false; attachmentOptionsRow.visible = false; + stickerPickerLoader.active = false; } } } - } } } - - } } - } } + + Column { + anchors.centerIn: parent + width: parent.width + spacing: Theme.paddingMedium + + opacity: stickerPickerOverlayItem.pickerLoaded ? 0 : 1 + Behavior on opacity { NumberAnimation {} } + visible: !stickerPickerOverlayItem.pickerLoaded + + InfoLabel { + id: loadingLabel + text: qsTr("Loading stickers...") + } + + BusyIndicator { + id: loadingBusyIndicator + anchors.horizontalCenter: parent.horizontalCenter + running: !stickerPickerOverlayItem.pickerLoaded + size: BusyIndicatorSize.Large + } + } + } diff --git a/qml/pages/ChatPage.qml b/qml/pages/ChatPage.qml index 68264d7..0d1327d 100644 --- a/qml/pages/ChatPage.qml +++ b/qml/pages/ChatPage.qml @@ -30,6 +30,7 @@ import "../js/functions.js" as Functions Page { id: chatPage allowedOrientations: Orientation.All + backNavigation: !stickerPickerLoader.active property bool loading: true; property bool isInitialized: false; @@ -279,7 +280,7 @@ Page { anchors.fill: parent PullDownMenu { - visible: chatInformation.id !== chatPage.myUserId + visible: chatInformation.id !== chatPage.myUserId && !stickerPickerLoader.active MenuItem { id: muteChatMenuItem onClicked: { @@ -945,10 +946,14 @@ Page { } } -// StickerPicker { -// id: stickerPicker -// visible: false -// } + Loader { + id: stickerPickerLoader + active: false + asynchronous: true + anchors.fill: parent + source: "../components/StickerPicker.qml" + } + } Column { @@ -1050,17 +1055,15 @@ Page { } HighlightImage { source: "../../images/icon-m-sticker.png" - width: documentAttachmentButton.width - height: documentAttachmentButton.height + width: Theme.itemSizeSmall + height: Theme.itemSizeSmall color: Theme.primaryColor highlightColor: Theme.highlightColor - highlighted: stickerPicker.visible + highlighted: stickerPickerLoader.active MouseArea { anchors.fill: parent onClicked: { - //console.log("RECENT STICKERS: " + JSON.stringify(stickerManager.getRecentStickers())); - //console.log("INSTALLED SETS: " + JSON.stringify(stickerManager.getInstalledStickerSets())); - stickerPicker.visible = !stickerPicker.visible; + stickerPickerLoader.active = !stickerPickerLoader.active; } } } @@ -1198,10 +1201,11 @@ Page { anchors.bottom: parent.bottom anchors.bottomMargin: Theme.paddingSmall - enabled: !(attachmentPreviewRow.visible || stickerPicker.visible) + enabled: !attachmentPreviewRow.visible onClicked: { if (attachmentOptionsRow.visible) { attachmentOptionsRow.visible = false; + stickerPickerLoader.active = false; } else { attachmentOptionsRow.visible = true; } diff --git a/src/stickermanager.cpp b/src/stickermanager.cpp index eb0aecd..ebdf9c4 100644 --- a/src/stickermanager.cpp +++ b/src/stickermanager.cpp @@ -107,4 +107,14 @@ void StickerManager::handleStickerSetReceived(const QVariantMap &stickerSet) this->stickerSets.insert(stickerSetId, stickerSet); int setIndex = this->stickerSetMap.value(stickerSetId).toInt(); this->installedStickerSets.replace(setIndex, stickerSet); + QVariantList stickerList = stickerSet.value("stickers").toList(); + QListIterator stickerIterator(stickerList); + while (stickerIterator.hasNext()) { + QVariantMap singleSticker = stickerIterator.next().toMap(); + QVariantMap thumbnailFile = singleSticker.value("thumbnail").toMap().value("photo").toMap(); + QVariantMap thumbnailLocalFile = thumbnailFile.value("local").toMap(); + if (!thumbnailLocalFile.value("is_downloading_completed").toBool()) { + tdLibWrapper->downloadFile(thumbnailFile.value("id").toString()); + } + } } diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index 94994ca..cf85771 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -337,9 +337,9 @@ void TDLibWrapper::sendDocumentMessage(const QString &chatId, const QString &fil this->sendRequest(requestObject); } -void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &filePath, const QString &replyToMessageId) +void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId) { - LOG("Sending sticker message" << chatId << filePath << replyToMessageId); + LOG("Sending sticker message" << chatId << fileId << replyToMessageId); QVariantMap requestObject; requestObject.insert(_TYPE, "sendMessage"); requestObject.insert("chat_id", chatId); @@ -350,8 +350,8 @@ void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &file inputMessageContent.insert(_TYPE, "inputMessageSticker"); QVariantMap stickerInputFile; - stickerInputFile.insert(_TYPE, "inputFileLocal"); - stickerInputFile.insert("path", filePath); + stickerInputFile.insert(_TYPE, "inputFileRemote"); + stickerInputFile.insert("id", fileId); inputMessageContent.insert("sticker", stickerInputFile); diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h index 40b4ba6..a583505 100644 --- a/src/tdlibwrapper.h +++ b/src/tdlibwrapper.h @@ -118,7 +118,7 @@ public: Q_INVOKABLE void sendPhotoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0"); Q_INVOKABLE void sendVideoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0"); Q_INVOKABLE void sendDocumentMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0"); - Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &filePath, const QString &replyToMessageId = "0"); + Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId = "0"); Q_INVOKABLE void getMessage(const QString &chatId, const QString &messageId); Q_INVOKABLE void setOptionInteger(const QString &optionName, const int &optionValue); Q_INVOKABLE void setChatNotificationSettings(const QString &chatId, const QVariantMap ¬ificationSettings); diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts index a9e5343..fb36275 100644 --- a/translations/harbour-fernschreiber-es.ts +++ b/translations/harbour-fernschreiber-es.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts index ea21750..4eba8f6 100644 --- a/translations/harbour-fernschreiber-fi.ts +++ b/translations/harbour-fernschreiber-fi.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts index 02c873b..c83c998 100644 --- a/translations/harbour-fernschreiber-hu.ts +++ b/translations/harbour-fernschreiber-hu.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts index 19c7fe0..4ec32e7 100644 --- a/translations/harbour-fernschreiber-pl.ts +++ b/translations/harbour-fernschreiber-pl.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts index b025095..a5f8c8e 100644 --- a/translations/harbour-fernschreiber-ru.ts +++ b/translations/harbour-fernschreiber-ru.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts index d6a7995..59ecb00 100644 --- a/translations/harbour-fernschreiber-zh_CN.ts +++ b/translations/harbour-fernschreiber-zh_CN.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts index 5e7f494..acce341 100644 --- a/translations/harbour-fernschreiber.ts +++ b/translations/harbour-fernschreiber.ts @@ -529,6 +529,10 @@ Recently used + + Loading stickers... + + VideoPage