From 9a4246e2756073b62234abe67743fa95a58274a5 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sun, 18 Oct 2020 01:16:15 +0300 Subject: [PATCH 01/14] Tweaked InitializationPage UI 1. Only load app icon once 2. Removed come unused ids and attributes 3. EnterKey magic 4. Use FadeAnimation --- qml/pages/InitializationPage.qml | 661 ++++++++++++++----------------- 1 file changed, 300 insertions(+), 361 deletions(-) diff --git a/qml/pages/InitializationPage.qml b/qml/pages/InitializationPage.qml index 02f59d9..46ec314 100644 --- a/qml/pages/InitializationPage.qml +++ b/qml/pages/InitializationPage.qml @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with Fernschreiber. If not, see . */ -import QtQuick 2.6 +import QtQuick 2.0 import Sailfish.Silica 1.0 import WerkWolf.Fernschreiber 1.0 @@ -29,11 +29,6 @@ Page { property int authorizationState: TelegramAPI.Closed property var authorizationStateData: null - BusyLabel { - text: qsTr("Loading...") - running: initializationPage.loading - } - Component.onCompleted: { initializationPage.authorizationState = tdLibWrapper.getAuthorizationState(); initializationPage.authorizationStateData = tdLibWrapper.getAuthorizationStateData(); @@ -44,6 +39,7 @@ Page { initializationPage.loading = false; welcomeColumn.visible = false; enterPinColumn.visible = true; + enterPinField.focus = true enterPasswordColumn.visible = false; waitRegistrationColumn.visible = false; break; @@ -60,6 +56,7 @@ Page { enterPinColumn.visible = false; enterPasswordColumn.visible = false; waitRegistrationColumn.visible = true; + pageHeader.title = qsTr("User Registration") break; default: // Nothing ;) @@ -73,6 +70,7 @@ Page { case TelegramAPI.WaitCode: initializationPage.loading = false; enterPinColumn.visible = true; + enterPinField.focus = true enterPasswordColumn.visible = false; waitRegistrationColumn.visible = false; break; @@ -103,21 +101,21 @@ Page { SilicaFlickable { id: welcomeFlickable - contentHeight: contentItem.childrenRect.height + contentHeight: content.height Behavior on contentHeight { NumberAnimation {} } anchors.fill: parent Column { - id: welcomeColumn + id: content width: parent.width - spacing: Theme.paddingSmall + spacing: Theme.paddingLarge PageHeader { + id: pageHeader title: qsTr("Welcome to Fernschreiber!") } Image { - id: fernschreiberImage source: "../../images/fernschreiber.png" anchors { horizontalCenter: parent.horizontalCenter @@ -125,374 +123,315 @@ Page { fillMode: Image.PreserveAspectFit asynchronous: true - width: 1/2 * parent.width + width: Math.min(2 * Theme.itemSizeHuge, Math.min(Screen.width, Screen.height) / 2) } - Label { - id: enterPhoneNumberLabel - wrapMode: Text.Wrap - x: Theme.horizontalPageMargin - width: parent.width - ( 2 * Theme.horizontalPageMargin ) - horizontalAlignment: Text.AlignHCenter - text: qsTr("Please enter your phone number to continue.") - font.pixelSize: Theme.fontSizeMedium - anchors { - horizontalCenter: parent.horizontalCenter - } + BusyLabel { + text: qsTr("Loading...") + running: initializationPage.loading + Behavior on opacity { FadeAnimation {} } + visible: opacity > 0 } - TextField { - id: phoneNumberTextField - placeholderText: "Use the international format, e.g. +4912342424242" - inputMethodHints: Qt.ImhDialableCharactersOnly - labelVisible: false + Column { + id: welcomeColumn width: parent.width - } + spacing: Theme.paddingLarge - Button { - id: continueWithPhoneNumberButton - text: qsTr("Continue") - anchors { - horizontalCenter: parent.horizontalCenter - } - enabled: phoneNumberTextField.text.match(/\+[1-9][0-9]{4,}/g) - onClicked: { - initializationPage.loading = true; - welcomeColumn.visible = false; - tdLibWrapper.setAuthenticationPhoneNumber(phoneNumberTextField.text); - } - } + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1 : 0 - } - - Column { - id: pinErrorColumn -// y: ( parent.height - ( errorInfoLabel.height + fernschreiberErrorImage.height + errorOkButton.height + ( 3 * Theme.paddingSmall ) ) ) / 2 - width: parent.width - spacing: Theme.paddingSmall - - Behavior on opacity { NumberAnimation {} } - opacity: visible ? 1 : 0 - visible: false - - Image { - id: fernschreiberErrorImage - source: "../../images/fernschreiber.png" - anchors { - horizontalCenter: parent.horizontalCenter + InfoLabel { + text: qsTr("Please enter your phone number to continue.") } - fillMode: Image.PreserveAspectFit - asynchronous: true - width: 1/2 * parent.width - } - - InfoLabel { - id: errorInfoLabel - font.pixelSize: Theme.fontSizeLarge - text: "" - } - - Button { - id: errorOkButton - text: qsTr("OK") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - pinErrorColumn.visible = false; - welcomeColumn.visible = true; - } - } - } - - Column { - id: enterPasswordColumn -// y: ( parent.height - ( fernschreiberPasswordImage.height + enterPasswordLabel.height + enterPasswordField.height + enterPasswordButton.height + ( 3 * Theme.paddingSmall ) ) ) / 2 - width: parent.width - spacing: Theme.paddingSmall - - Behavior on opacity { NumberAnimation {} } - opacity: visible ? 1.0 : 0.0 - visible: false - - Image { - id: fernschreiberPasswordImage - source: "../../images/fernschreiber.png" - anchors { - horizontalCenter: parent.horizontalCenter - } - - fillMode: Image.PreserveAspectFit - asynchronous: true - width: 1/2 * parent.width - } - - InfoLabel { - id: enterPasswordLabel - font.pixelSize: Theme.fontSizeLarge - text: qsTr("Please enter your password:") - } - - PasswordField { - id: enterPasswordField - anchors { - horizontalCenter: parent.horizontalCenter - } - font.pixelSize: Theme.fontSizeLarge - width: parent.width - 2 * Theme.horizontalPageMargin - horizontalAlignment: TextInput.AlignHCenter - } - - Button { - id: enterPasswordButton - text: qsTr("OK") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - initializationPage.loading = true; - enterPasswordColumn.visible = false; - tdLibWrapper.setAuthenticationPassword(enterPasswordField.text); - } - } - } - - Column { - id: enterPinColumn - topPadding: Theme.paddingLarge - bottomPadding: Theme.paddingLarge - width: parent.width - spacing: Theme.paddingSmall - - Behavior on opacity { NumberAnimation {} } - opacity: visible ? 1.0 : 0.0 - visible: false - - - Image { - id: fernschreiberPinImage - source: "../../images/fernschreiber.png" - anchors { - horizontalCenter: parent.horizontalCenter - } - - fillMode: Image.PreserveAspectFit - asynchronous: true - width: 1/2 * parent.width - } - - InfoLabel { - id: enterPinLabel - font.pixelSize: Theme.fontSizeLarge - text: qsTr("Please enter the code that you received:") - } - - TextField { - id: enterPinField - anchors { - horizontalCenter: parent.horizontalCenter - } - inputMethodHints: Qt.ImhDigitsOnly - font.pixelSize: Theme.fontSizeExtraLarge - width: parent.width - 4 * Theme.paddingLarge - horizontalAlignment: TextInput.AlignHCenter - } - - Button { - id: enterPinButton - text: qsTr("OK") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - initializationPage.loading = true; - enterPinColumn.visible = false; - tdLibWrapper.setAuthenticationCode(enterPinField.text); - } - } - } - - Column { - id: linkingErrorColumn - topPadding: Theme.paddingLarge - bottomPadding: Theme.paddingLarge - width: parent.width - spacing: Theme.paddingSmall - - Behavior on opacity { NumberAnimation {} } - opacity: visible ? 1.0 : 0.0 - visible: false - - Image { - id: fernschreiberLinkingErrorImage - source: "../../images/fernschreiber.png" - anchors { - horizontalCenter: parent.horizontalCenter - } - - fillMode: Image.PreserveAspectFit - asynchronous: true - width: 1/2 * parent.width - } - - InfoLabel { - id: linkingErrorInfoLabel - font.pixelSize: Theme.fontSizeLarge - text: qsTr("Unable to authenticate you with the entered code.") - } - - Button { - id: enterPinAgainButton - text: qsTr("Enter code again") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - linkingErrorColumn.visible = false; - enterPinColumn.visible = true; - } - } - - Button { - id: restartAuthenticationButton - text: qsTr("Restart authentication") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - linkingErrorColumn.visible = false; - welcomeColumn.visible = true; - } - } - } - - Column { - id: waitRegistrationColumn - topPadding: Theme.paddingLarge - bottomPadding: Theme.paddingLarge - width: parent.width - spacing: Theme.paddingLarge - - Behavior on opacity { NumberAnimation {} } - opacity: visible ? 1.0 : 0.0 - visible: false - - PageHeader { - title: qsTr("User Registration") - } - Image { - id: waitRegistrationImage - source: "../../images/fernschreiber.png" - anchors { - horizontalCenter: parent.horizontalCenter - } - - fillMode: Image.PreserveAspectFit - asynchronous: true - width: 1/2 * Screen.width - } - - InfoLabel { - id: waitRegistrationInfoLabel - property bool acknowledged - font.pixelSize: Theme.fontSizeExtraSmall - textFormat: Text.StyledText - horizontalAlignment: Text.AlignLeft - linkColor: Theme.primaryColor - property var stateText: initializationPage.authorizationStateData.authorization_state && initializationPage.authorizationStateData.authorization_state.terms_of_service ? - initializationPage.authorizationStateData.authorization_state.terms_of_service.text : - null - visible: !!stateText && !acknowledged - text: { - if(!stateText) { - return ''; + TextField { + id: phoneNumberTextField + placeholderText: "Use the international format, e.g. +4912342424242" + inputMethodHints: Qt.ImhDialableCharactersOnly + labelVisible: false + width: parent.width + readonly property bool validInput: text.match(/\+[1-9][0-9]{4,}/g) + EnterKey.iconSource: "image://theme/icon-m-enter-next" + EnterKey.enabled: validInput + EnterKey.onClicked: { + validator = filledValidator + if(acceptableInput) { + continueWithPhoneNumberButton.focus = true + continueWithPhoneNumberButton.enter() + } } - var entities = stateText.entities; - if(entities && entities.length > 0 && entities[0]["type"]["@type"] === "textEntityTypeTextUrl") { //we just use the first entity for now. - var offset = entities[0].offset; - var length = entities[0].length; - return (stateText.text.slice(0,entities[0].offset) - + "" - + stateText.text.slice(entities[0].offset, entities[0].offset + entities[0].length) - + '' - + stateText.text.slice(entities[0].offset + entities[0].length)).replace(/\n/gm, "
"); + } + + Button { + id: continueWithPhoneNumberButton + text: qsTr("Continue") + anchors { + horizontalCenter: parent.horizontalCenter + } + enabled: phoneNumberTextField.validInput + onClicked: enter() + function enter() { + initializationPage.loading = true; + welcomeColumn.visible = false; + tdLibWrapper.setAuthenticationPhoneNumber(phoneNumberTextField.text); } - return stateText.text.replace(/\n/gm, "
"); - - - } - //JSON.stringify(initializationPage.authorizationStateData, null, 2)//qsTr("Unable to authenticate you with the entered code.") - } - - Button { - id: acknowledgeTOCButton - visible: waitRegistrationInfoLabel.visible - text: qsTr("OK") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - waitRegistrationInfoLabel.acknowledged = true; - userFirstNameTextField.focus = true } } - RegExpValidator { - id: filledValidator - regExp: /.+/ - } - TextField { - id: userFirstNameTextField - visible: !waitRegistrationInfoLabel.visible - opacity: visible ? 1.0 : 0.0 - Behavior on opacity { NumberAnimation {} } - placeholderText: qsTr("Enter your First Name") - labelVisible: false + + Column { + id: pinErrorColumn width: parent.width - EnterKey.iconSource: !!text ? "image://theme/icon-m-enter-next" : "image://theme/icon-m-text-input" - EnterKey.onClicked: { - validator = filledValidator - if(acceptableInput) userLastNameTextField.focus = true; - } - } - TextField { - id: userLastNameTextField - visible: !waitRegistrationInfoLabel.visible - opacity: visible ? 1.0 : 0.0 - Behavior on opacity { NumberAnimation {} } - placeholderText: qsTr("Enter your Last Name") - labelVisible: false - width: parent.width - EnterKey.iconSource: !!text ? "image://theme/icon-m-enter-accept" : "image://theme/icon-m-text-input" - EnterKey.onClicked: { - validator = filledValidator - if(acceptableInput) registerUserButton.onClicked(null); - } - } - Button { - id: registerUserButton - visible: !waitRegistrationInfoLabel.visible - opacity: visible ? 1.0 : 0.0 - Behavior on opacity { NumberAnimation {} } - text: qsTr("Register User") - anchors { - horizontalCenter: parent.horizontalCenter - } - onClicked: { - userFirstNameTextField.validator = filledValidator - userLastNameTextField.validator = filledValidator - if(userFirstNameTextField.acceptableInput && userLastNameTextField.acceptableInput) { - tdLibWrapper.registerUser(userFirstNameTextField.text, userLastNameTextField.text); - } else if(!userFirstNameTextField.acceptableInput) { - userFirstNameTextField.focus = true; - } else { - userLastNameTextField.focus = true; - } + spacing: Theme.paddingLarge + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1 : 0 + visible: false + + InfoLabel { + id: errorInfoLabel + font.pixelSize: Theme.fontSizeLarge + text: "" } + + Button { + text: qsTr("OK") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + pinErrorColumn.visible = false; + welcomeColumn.visible = true; + } + } + } + + Column { + id: enterPasswordColumn + width: parent.width + spacing: Theme.paddingLarge + + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1.0 : 0.0 + visible: false + + InfoLabel { + font.pixelSize: Theme.fontSizeLarge + text: qsTr("Please enter your password:") + } + + PasswordField { + id: enterPasswordField + anchors { + horizontalCenter: parent.horizontalCenter + } + font.pixelSize: Theme.fontSizeLarge + width: parent.width - 2 * Theme.horizontalPageMargin + horizontalAlignment: TextInput.AlignHCenter + } + + Button { + text: qsTr("OK") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + initializationPage.loading = true; + enterPasswordColumn.visible = false; + tdLibWrapper.setAuthenticationPassword(enterPasswordField.text); + } + } + } + + Column { + id: enterPinColumn + width: parent.width + spacing: Theme.paddingLarge + + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1.0 : 0.0 + visible: false + + InfoLabel { + font.pixelSize: Theme.fontSizeLarge + text: qsTr("Please enter the code that you received:") + } + + TextField { + id: enterPinField + anchors { + horizontalCenter: parent.horizontalCenter + } + inputMethodHints: Qt.ImhDigitsOnly + font.pixelSize: Theme.fontSizeExtraLarge + width: parent.width - 4 * Theme.paddingLarge + horizontalAlignment: TextInput.AlignHCenter + EnterKey.iconSource: "image://theme/icon-m-enter-next" + EnterKey.enabled: text.length > 0 + EnterKey.onClicked: enterPinButton.enter() + } + + Button { + id: enterPinButton + text: qsTr("OK") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: enter() + function enter() { + initializationPage.loading = true; + enterPinColumn.visible = false; + tdLibWrapper.setAuthenticationCode(enterPinField.text); + } + } + } + + Column { + id: linkingErrorColumn + width: parent.width + spacing: Theme.paddingLarge + + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1.0 : 0.0 + visible: false + + InfoLabel { + font.pixelSize: Theme.fontSizeLarge + text: qsTr("Unable to authenticate you with the entered code.") + } + + Button { + text: qsTr("Enter code again") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + linkingErrorColumn.visible = false; + enterPinColumn.visible = true; + } + } + + Button { + text: qsTr("Restart authentication") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + linkingErrorColumn.visible = false; + welcomeColumn.visible = true; + } + } + } + + Column { + id: waitRegistrationColumn + width: parent.width + spacing: Theme.paddingLarge + + Behavior on opacity { FadeAnimation {} } + opacity: visible ? 1.0 : 0.0 + visible: false + + InfoLabel { + id: waitRegistrationInfoLabel + property bool acknowledged + font.pixelSize: Theme.fontSizeExtraSmall + textFormat: Text.StyledText + horizontalAlignment: Text.AlignLeft + linkColor: Theme.primaryColor + property var stateText: initializationPage.authorizationStateData.authorization_state && initializationPage.authorizationStateData.authorization_state.terms_of_service ? + initializationPage.authorizationStateData.authorization_state.terms_of_service.text : + null + visible: !!stateText && !acknowledged + text: { + if(!stateText) { + return ''; + } + var entities = stateText.entities; + if(entities && entities.length > 0 && entities[0]["type"]["@type"] === "textEntityTypeTextUrl") { //we just use the first entity for now. + var offset = entities[0].offset; + var length = entities[0].length; + return (stateText.text.slice(0,entities[0].offset) + + "" + + stateText.text.slice(entities[0].offset, entities[0].offset + entities[0].length) + + '' + + stateText.text.slice(entities[0].offset + entities[0].length)).replace(/\n/gm, "
"); + } + return stateText.text.replace(/\n/gm, "
"); + } + } + + Button { + visible: waitRegistrationInfoLabel.visible + text: qsTr("OK") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + waitRegistrationInfoLabel.acknowledged = true; + userFirstNameTextField.focus = true + } + } + RegExpValidator { + id: filledValidator + regExp: /.+/ + } + TextField { + id: userFirstNameTextField + visible: !waitRegistrationInfoLabel.visible + opacity: visible ? 1.0 : 0.0 + Behavior on opacity { FadeAnimation {} } + placeholderText: qsTr("Enter your First Name") + labelVisible: false + width: parent.width + EnterKey.iconSource: !!text ? "image://theme/icon-m-enter-next" : "image://theme/icon-m-text-input" + EnterKey.onClicked: { + validator = filledValidator + if(acceptableInput) userLastNameTextField.focus = true; + } + } + TextField { + id: userLastNameTextField + visible: !waitRegistrationInfoLabel.visible + opacity: visible ? 1.0 : 0.0 + Behavior on opacity { FadeAnimation {} } + placeholderText: qsTr("Enter your Last Name") + labelVisible: false + width: parent.width + EnterKey.iconSource: !!text ? "image://theme/icon-m-enter-accept" : "image://theme/icon-m-text-input" + EnterKey.onClicked: { + validator = filledValidator + if(acceptableInput) registerUserButton.onClicked(null); + } + } + Button { + id: registerUserButton + visible: !waitRegistrationInfoLabel.visible + opacity: visible ? 1.0 : 0.0 + Behavior on opacity { FadeAnimation {} } + text: qsTr("Register User") + anchors { + horizontalCenter: parent.horizontalCenter + } + onClicked: { + userFirstNameTextField.validator = filledValidator + userLastNameTextField.validator = filledValidator + if(userFirstNameTextField.acceptableInput && userLastNameTextField.acceptableInput) { + tdLibWrapper.registerUser(userFirstNameTextField.text, userLastNameTextField.text); + } else if(!userFirstNameTextField.acceptableInput) { + userFirstNameTextField.focus = true; + } else { + userLastNameTextField.focus = true; + } + + } + } + } + + Item { + width: 1 + height: Theme.paddingLarge } } } - } - From 93e54b8ab4f7f16ed2dfdcf84adcbd835de37485 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sun, 18 Oct 2020 01:56:11 +0300 Subject: [PATCH 02/14] Adjusted app icon size on the about page It was still too large on a 4:3 tablet screen in landscape. --- qml/pages/AboutPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qml/pages/AboutPage.qml b/qml/pages/AboutPage.qml index 561e40a..1dd253e 100644 --- a/qml/pages/AboutPage.qml +++ b/qml/pages/AboutPage.qml @@ -51,7 +51,7 @@ Page { fillMode: Image.PreserveAspectFit asynchronous: true - width: (aboutPage.isPortrait ? aboutPage.width : aboutPage.height) / 2 + width: Math.min(2 * Theme.itemSizeHuge, Math.min(aboutPage.width, aboutPage.height) / 2) } Label { From e578c6bef3f7c2ae196c193cdbb45239c5ecfa25 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 16:29:34 +0200 Subject: [PATCH 03/14] Use GridView for sticker picker --- qml/components/StickerPicker.qml | 156 +++++++++++++++---------------- src/tdlibwrapper.cpp | 1 + 2 files changed, 78 insertions(+), 79 deletions(-) diff --git a/qml/components/StickerPicker.qml b/qml/components/StickerPicker.qml index 1e6e2a8..3ff4704 100644 --- a/qml/components/StickerPicker.qml +++ b/qml/components/StickerPicker.qml @@ -74,53 +74,50 @@ Item { elide: Text.ElideRight text: qsTr("Recently used") } - Flickable { + + SilicaGridView { + id: recentStickersGridView width: parent.width - height: recentStickersRow.height + Theme.paddingSmall - anchors.horizontalCenter: parent.horizontalCenter - contentWidth: recentStickersRow.width + height: Theme.itemSizeExtraLarge + cellWidth: Theme.itemSizeExtraLarge; + cellHeight: Theme.itemSizeExtraLarge; + visible: count > 0 clip: true + flow: GridView.FlowTopToBottom - Row { - id: recentStickersRow - spacing: Theme.paddingMedium - Repeater { - model: stickerPickerOverlayItem.recentStickers + model: stickerPickerOverlayItem.recentStickers - Item { - height: singleRecentStickerRow.height - width: singleRecentStickerRow.width + delegate: Item { + width: recentStickersGridView.cellWidth + height: recentStickersGridView.cellHeight - Row { - id: singleRecentStickerRow - spacing: Theme.paddingSmall - Image { - 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.remote.id); - stickerPickerOverlayItem.visible = false; - attachmentOptionsRow.visible = false; - stickerPickerLoader.active = false; - } + Image { + source: modelData.thumbnail.photo.local.path + anchors.fill: parent + asynchronous: true + onStatusChanged: { + if (status === Image.Ready) { + stickerPickerLoadedTimer.restart(); } } - } + + MouseArea { + anchors.fill: parent + onClicked: { + tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.remote.id); + stickerPickerOverlayItem.visible = false; + attachmentOptionsRow.visible = false; + stickerPickerLoader.active = false; + } + } + } + + HorizontalScrollDecorator {} + } + Repeater { model: stickerPickerOverlayItem.installedStickerSets width: stickerPickerFlickable.width @@ -136,57 +133,58 @@ Item { elide: Text.ElideRight text: modelData.title } - Flickable { + + SilicaGridView { + id: installedStickerSetGridView width: parent.width - height: installedStickerSetRow.height + Theme.paddingSmall - anchors.horizontalCenter: parent.horizontalCenter - contentWidth: installedStickerSetRow.width + height: Theme.itemSizeExtraLarge + cellWidth: Theme.itemSizeExtraLarge; + cellHeight: Theme.itemSizeExtraLarge; + visible: count > 0 clip: true - Row { - id: installedStickerSetRow - spacing: Theme.paddingMedium + flow: GridView.FlowTopToBottom - Repeater { - model: modelData.stickers + model: modelData.stickers + delegate: Item { + width: installedStickerSetGridView.cellWidth + height: installedStickerSetGridView.cellHeight - Item { - 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(); - } - } - } - Text { - font.pixelSize: Theme.fontSizeHuge - color: Theme.primaryColor - anchors.fill: parent - maximumLineCount: 1 - elide: Text.ElideRight - text: Emoji.emojify(modelData.emoji, font.pixelSize) - visible: !modelData.thumbnail.photo.local.is_downloading_completed - } - - MouseArea { - anchors.fill: parent - onClicked: { - tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.remote.id); - stickerPickerOverlayItem.visible = false; - attachmentOptionsRow.visible = false; - stickerPickerLoader.active = false; - } + 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(); } } } + Text { + font.pixelSize: Theme.fontSizeHuge + color: Theme.primaryColor + anchors.fill: parent + maximumLineCount: 1 + elide: Text.ElideRight + text: Emoji.emojify(modelData.emoji, font.pixelSize) + visible: !modelData.thumbnail.photo.local.is_downloading_completed + } + + MouseArea { + anchors.fill: parent + onClicked: { + tdLibWrapper.sendStickerMessage(chatInformation.id, modelData.sticker.remote.id); + stickerPickerOverlayItem.visible = false; + attachmentOptionsRow.visible = false; + stickerPickerLoader.active = false; + } + } } + + HorizontalScrollDecorator {} } + } } } diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index cf85771..447e1b6 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -846,6 +846,7 @@ void TDLibWrapper::setInitialParameters() initialParameters.insert("device_model", hardwareSettings.value("NAME", "Unknown Mobile Device").toString()); initialParameters.insert("system_version", QSysInfo::prettyProductName()); initialParameters.insert("application_version", "0.3"); + // initialParameters.insert("use_test_dc", true); requestObject.insert("parameters", initialParameters); this->sendRequest(requestObject); } From 65738a4ddf47f56282d8fd00875e94c164a15da0 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sat, 10 Oct 2020 16:48:12 +0300 Subject: [PATCH 04/14] Shortened log statements in NotificationManager Copy/paste is evil --- src/notificationmanager.cpp | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/notificationmanager.cpp b/src/notificationmanager.cpp index f6ca9f3..eb69e23 100644 --- a/src/notificationmanager.cpp +++ b/src/notificationmanager.cpp @@ -28,9 +28,11 @@ #include #include +#define LOG(x) qDebug() << "[NotificationManager]" << x + NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper, QObject *parent) : QObject(parent) { - qDebug() << "[NotificationManager] Initializing..."; + LOG("Initializing..."); this->tdLibWrapper = tdLibWrapper; this->ngfClient = new Ngf::Client(this); @@ -44,29 +46,28 @@ NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper, QObject *pa connect(this->ngfClient, SIGNAL(eventPlaying(quint32)), this, SLOT(handleNgfEventPlaying(quint32))); if (this->ngfClient->connect()) { - qDebug() << "[NotificationManager] NGF Client successfully initialized..."; + LOG("NGF Client successfully initialized..."); } else { - qDebug() << "[NotificationManager] Failed to initialize NGF Client..."; + LOG("Failed to initialize NGF Client..."); } this->controlLedNotification(false); - } NotificationManager::~NotificationManager() { - qDebug() << "[NotificationManager] Destroying myself..."; + LOG("Destroying myself..."); } void NotificationManager::handleUpdateActiveNotifications(const QVariantList notificationGroups) { - qDebug() << "[NotificationManager] Received active notifications, number of groups:" << notificationGroups.size(); + LOG("Received active notifications, number of groups:" << notificationGroups.size()); } void NotificationManager::handleUpdateNotificationGroup(const QVariantMap notificationGroupUpdate) { QString notificationGroupId = notificationGroupUpdate.value("notification_group_id").toString(); - qDebug() << "[NotificationManager] Received notification group update, group ID:" << notificationGroupId; + LOG("Received notification group update, group ID:" << notificationGroupId); QVariantMap notificationGroup = this->notificationGroups.value(notificationGroupId).toMap(); QString chatId = notificationGroupUpdate.value("chat_id").toString(); @@ -92,7 +93,7 @@ void NotificationManager::handleUpdateNotificationGroup(const QVariantMap notifi // If we have deleted notifications, we need to update possibly existing ones if (!removedNotificationIds.isEmpty() && !activeNotifications.isEmpty()) { - qDebug() << "[NotificationManager] Some removals happend, but we have " << activeNotifications.size() << "existing notifications."; + LOG("Some removals happend, but we have" << activeNotifications.size() << "existing notifications."); QVariantMap firstActiveNotification = activeNotifications.first().toMap(); activeNotifications.remove(firstActiveNotification.value("id").toString()); QVariantMap newFirstActiveNotification = this->sendNotification(chatId, firstActiveNotification, activeNotifications); @@ -125,45 +126,45 @@ void NotificationManager::handleUpdateNotificationGroup(const QVariantMap notifi void NotificationManager::handleUpdateNotification(const QVariantMap updatedNotification) { - qDebug() << "[NotificationManager] Received notification update, group ID:" << updatedNotification.value("notification_group_id").toInt(); + LOG("Received notification update, group ID:" << updatedNotification.value("notification_group_id").toInt()); } void NotificationManager::handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation) { this->chatListMutex.lock(); - qDebug() << "[NotificationManager] Adding chat to internal map " << chatId; + LOG("Adding chat to internal map" << chatId); this->chatMap.insert(chatId, chatInformation); this->chatListMutex.unlock(); } void NotificationManager::handleNgfConnectionStatus(const bool &connected) { - qDebug() << "[NotificationManager] NGF Daemon connection status changed " << connected; + LOG("NGF Daemon connection status changed" << connected); } void NotificationManager::handleNgfEventFailed(const quint32 &eventId) { - qDebug() << "[NotificationManager] NGF event failed, id: " << eventId; + LOG("NGF event failed, id:" << eventId); } void NotificationManager::handleNgfEventCompleted(const quint32 &eventId) { - qDebug() << "[NotificationManager] NGF event completed, id: " << eventId; + LOG("NGF event completed, id:" << eventId); } void NotificationManager::handleNgfEventPlaying(const quint32 &eventId) { - qDebug() << "[NotificationManager] NGF event playing, id: " << eventId; + LOG("NGF event playing, id:" << eventId); } void NotificationManager::handleNgfEventPaused(const quint32 &eventId) { - qDebug() << "[NotificationManager] NGF event paused, id: " << eventId; + LOG("NGF event paused, id:" << eventId); } QVariantMap NotificationManager::sendNotification(const QString &chatId, const QVariantMap ¬ificationInformation, const QVariantMap &activeNotifications) { - qDebug() << "[NotificationManager] Sending notification" << notificationInformation.value("id").toString(); + LOG("Sending notification" << notificationInformation.value("id").toString()); QVariantMap chatInformation = this->chatMap.value(chatId).toMap(); QString chatType = chatInformation.value("type").toMap().value("@type").toString(); @@ -210,7 +211,7 @@ QVariantMap NotificationManager::sendNotification(const QString &chatId, const Q void NotificationManager::removeNotification(const QVariantMap ¬ificationInformation) { - qDebug() << "[NotificationManager] Removing notification" << notificationInformation.value("id").toString(); + LOG("Removing notification" << notificationInformation.value("id").toString()); Notification nemoNotification; nemoNotification.setReplacesId(notificationInformation.value("replaces_id").toUInt()); nemoNotification.close(); @@ -218,14 +219,14 @@ void NotificationManager::removeNotification(const QVariantMap ¬ificationInfo QString NotificationManager::getNotificationText(const QVariantMap ¬ificationContent) { - qDebug() << "[NotificationManager] Getting notification text from content" << notificationContent; + LOG("Getting notification text from content" << notificationContent); return FernschreiberUtils::getMessageShortText(notificationContent, false); } void NotificationManager::controlLedNotification(const bool &enabled) { - qDebug() << "[NotificationManager] Controlling notification LED" << enabled; + LOG("Controlling notification LED" << enabled; QDBusConnection dbusConnection = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "system"); QDBusInterface dbusInterface("com.nokia.mce", "/com/nokia/mce/request", "com.nokia.mce.request", dbusConnection); @@ -234,5 +235,4 @@ void NotificationManager::controlLedNotification(const bool &enabled) } else { dbusInterface.call("req_led_pattern_deactivate", "PatternCommunicationIM"); } - } From 6e1e100a873cbb515626eb17455dc41c8cbadd47 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sat, 10 Oct 2020 16:55:46 +0300 Subject: [PATCH 05/14] Don't initialize MCE QDBusInterface on every D-Bus call It's enough to initialize it once at startup. Also avoided a few per-call ASCII => QString conversions and dropped unnecessary mutex. --- src/notificationmanager.cpp | 19 +++++++------------ src/notificationmanager.h | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/notificationmanager.cpp b/src/notificationmanager.cpp index eb69e23..1f7be53 100644 --- a/src/notificationmanager.cpp +++ b/src/notificationmanager.cpp @@ -26,11 +26,11 @@ #include #include #include -#include #define LOG(x) qDebug() << "[NotificationManager]" << x -NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper, QObject *parent) : QObject(parent) +NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper) : + mceInterface("com.nokia.mce", "/com/nokia/mce/request", "com.nokia.mce.request", QDBusConnection::systemBus()) { LOG("Initializing..."); this->tdLibWrapper = tdLibWrapper; @@ -131,10 +131,8 @@ void NotificationManager::handleUpdateNotification(const QVariantMap updatedNoti void NotificationManager::handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation) { - this->chatListMutex.lock(); LOG("Adding chat to internal map" << chatId); this->chatMap.insert(chatId, chatInformation); - this->chatListMutex.unlock(); } void NotificationManager::handleNgfConnectionStatus(const bool &connected) @@ -226,13 +224,10 @@ QString NotificationManager::getNotificationText(const QVariantMap ¬ification void NotificationManager::controlLedNotification(const bool &enabled) { - LOG("Controlling notification LED" << enabled; - QDBusConnection dbusConnection = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "system"); - QDBusInterface dbusInterface("com.nokia.mce", "/com/nokia/mce/request", "com.nokia.mce.request", dbusConnection); + static const QString PATTERN("PatternCommunicationIM"); + static const QString ACTIVATE("req_led_pattern_activate"); + static const QString DEACTIVATE("req_led_pattern_deactivate"); - if (enabled) { - dbusInterface.call("req_led_pattern_activate", "PatternCommunicationIM"); - } else { - dbusInterface.call("req_led_pattern_deactivate", "PatternCommunicationIM"); - } + LOG("Controlling notification LED" << enabled); + mceInterface.call(enabled ? ACTIVATE : DEACTIVATE, PATTERN); } diff --git a/src/notificationmanager.h b/src/notificationmanager.h index 52c57b4..41419a9 100644 --- a/src/notificationmanager.h +++ b/src/notificationmanager.h @@ -21,7 +21,7 @@ #define NOTIFICATIONMANAGER_H #include -#include +#include #include #include "tdlibwrapper.h" @@ -29,7 +29,7 @@ class NotificationManager : public QObject { Q_OBJECT public: - explicit NotificationManager(TDLibWrapper *tdLibWrapper, QObject *parent = nullptr); + NotificationManager(TDLibWrapper *tdLibWrapper); ~NotificationManager() override; signals: @@ -48,17 +48,19 @@ public slots: private: - TDLibWrapper *tdLibWrapper; - Ngf::Client *ngfClient; - QVariantMap chatMap; - QVariantMap notificationGroups; - QMutex chatListMutex; - QVariantMap sendNotification(const QString &chatId, const QVariantMap ¬ificationInformation, const QVariantMap &activeNotifications); void removeNotification(const QVariantMap ¬ificationInformation); QString getNotificationText(const QVariantMap ¬ificationContent); void controlLedNotification(const bool &enabled); +private: + + TDLibWrapper *tdLibWrapper; + Ngf::Client *ngfClient; + QVariantMap chatMap; + QVariantMap notificationGroups; + QDBusInterface mceInterface; + }; #endif // NOTIFICATIONMANAGER_H From f75e5a3f4b0efe33e9c38c3d9c55e0afe96db741 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sat, 10 Oct 2020 18:46:08 +0300 Subject: [PATCH 06/14] Added "Notification feedback" combo box --- qml/pages/SettingsPage.qml | 53 ++++++++++++++++++++++++++++++++++- src/appsettings.cpp | 15 ++++++++++ src/appsettings.h | 13 +++++++++ src/harbour-fernschreiber.cpp | 5 ++-- src/notificationmanager.cpp | 16 +++++++++-- src/notificationmanager.h | 4 ++- 6 files changed, 99 insertions(+), 7 deletions(-) diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml index 32cda43..f1b27b9 100644 --- a/qml/pages/SettingsPage.qml +++ b/qml/pages/SettingsPage.qml @@ -18,9 +18,9 @@ */ import QtQuick 2.0 import Sailfish.Silica 1.0 +import WerkWolf.Fernschreiber 1.0 import "../js/functions.js" as Functions - Page { id: settingsPage allowedOrientations: Orientation.All @@ -52,6 +52,57 @@ Page { } } + ComboBox { + id: feedbackComboBox + label: qsTr("Notification feedback") + description: qsTr("Non-graphical feedback adds vibration to visual notifications.") + menu: ContextMenu { + id: feedbackMenu + + MenuItem { + readonly property int value: AppSettings.NotificationFeedbackAll + text: qsTr("All events") + onClicked: { + appSettings.notificationFeedback = value + } + } + MenuItem { + readonly property int value: AppSettings.NotificationFeedbackNew + text: qsTr("Only new events") + onClicked: { + appSettings.notificationFeedback = value + } + } + MenuItem { + readonly property int value: AppSettings.NotificationFeedbackNone + text: qsTr("None") + onClicked: { + appSettings.notificationFeedback = value + } + } + } + + Component.onCompleted: updateFeedbackSelection() + + function updateFeedbackSelection() { + var menuItems = feedbackMenu.children + var n = menuItems.length + for (var i=0; isetContextProperty("appSettings", appSettings); + qmlRegisterUncreatableType("WerkWolf.Fernschreiber", 1, 0, "AppSettings", QString()); TDLibWrapper *tdLibWrapper = new TDLibWrapper(view.data()); context->setContextProperty("tdLibWrapper", tdLibWrapper); - qmlRegisterType("WerkWolf.Fernschreiber", 1, 0, "TelegramAPI"); + qmlRegisterUncreatableType("WerkWolf.Fernschreiber", 1, 0, "TelegramAPI", QString()); DBusAdaptor *dBusAdaptor = tdLibWrapper->getDBusAdaptor(); context->setContextProperty("dBusAdaptor", dBusAdaptor); @@ -61,7 +62,7 @@ int main(int argc, char *argv[]) ChatModel chatModel(tdLibWrapper); context->setContextProperty("chatModel", &chatModel); - NotificationManager notificationManager(tdLibWrapper); + NotificationManager notificationManager(tdLibWrapper, appSettings); context->setContextProperty("notificationManager", ¬ificationManager); ProcessLauncher processLauncher; diff --git a/src/notificationmanager.cpp b/src/notificationmanager.cpp index 1f7be53..1300c88 100644 --- a/src/notificationmanager.cpp +++ b/src/notificationmanager.cpp @@ -29,11 +29,12 @@ #define LOG(x) qDebug() << "[NotificationManager]" << x -NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper) : +NotificationManager::NotificationManager(TDLibWrapper *tdLibWrapper, AppSettings *appSettings) : mceInterface("com.nokia.mce", "/com/nokia/mce/request", "com.nokia.mce.request", QDBusConnection::systemBus()) { LOG("Initializing..."); this->tdLibWrapper = tdLibWrapper; + this->appSettings = appSettings; this->ngfClient = new Ngf::Client(this); connect(this->tdLibWrapper, SIGNAL(activeNotificationsUpdated(QVariantList)), this, SLOT(handleUpdateActiveNotifications(QVariantList))); @@ -178,12 +179,15 @@ QVariantMap NotificationManager::sendNotification(const QString &chatId, const Q nemoNotification.setAppName("Fernschreiber"); nemoNotification.setAppIcon(appIconUrl.toLocalFile()); nemoNotification.setSummary(chatInformation.value("title").toString()); - nemoNotification.setCategory("x-nemo.messaging.im"); nemoNotification.setTimestamp(QDateTime::fromMSecsSinceEpoch(messageMap.value("date").toLongLong() * 1000)); QVariantList remoteActionArguments; remoteActionArguments.append(chatId); remoteActionArguments.append(messageMap.value("id").toString()); nemoNotification.setRemoteAction(Notification::remoteAction("default", "openMessage", "de.ygriega.fernschreiber", "/de/ygriega/fernschreiber", "de.ygriega.fernschreiber", "openMessage", remoteActionArguments)); + + bool needFeedback; + const AppSettings::NotificationFeedback feedbackStyle = appSettings->notificationFeedback(); + if (activeNotifications.isEmpty()) { QString notificationBody; if (addAuthor) { @@ -195,13 +199,19 @@ QVariantMap NotificationManager::sendNotification(const QString &chatId, const Q } notificationBody = notificationBody + this->getNotificationText(messageMap.value("content").toMap()); nemoNotification.setBody(notificationBody); + needFeedback = (feedbackStyle != AppSettings::NotificationFeedbackNone); } else { nemoNotification.setReplacesId(activeNotifications.first().toMap().value("replaces_id").toUInt()); nemoNotification.setBody(tr("%1 unread messages").arg(activeNotifications.size() + 1)); + needFeedback = (feedbackStyle == AppSettings::NotificationFeedbackAll); + } + + if (needFeedback) { + nemoNotification.setCategory("x-nemo.messaging.im"); + ngfClient->play("chat"); } nemoNotification.publish(); - this->ngfClient->play("chat"); this->controlLedNotification(true); updatedNotificationInformation.insert("replaces_id", nemoNotification.replacesId()); return updatedNotificationInformation; diff --git a/src/notificationmanager.h b/src/notificationmanager.h index 41419a9..7e1c123 100644 --- a/src/notificationmanager.h +++ b/src/notificationmanager.h @@ -24,12 +24,13 @@ #include #include #include "tdlibwrapper.h" +#include "appsettings.h" class NotificationManager : public QObject { Q_OBJECT public: - NotificationManager(TDLibWrapper *tdLibWrapper); + NotificationManager(TDLibWrapper *tdLibWrapper, AppSettings *appSettings); ~NotificationManager() override; signals: @@ -56,6 +57,7 @@ private: private: TDLibWrapper *tdLibWrapper; + AppSettings *appSettings; Ngf::Client *ngfClient; QVariantMap chatMap; QVariantMap notificationGroups; From 3410903afb8bd30e513a8484092d7e5ec5b03552 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 17:46:08 +0200 Subject: [PATCH 07/14] Adjust text for notification settings & German translation --- qml/pages/SettingsPage.qml | 2 +- translations/harbour-fernschreiber-de.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-es.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-fi.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-hu.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-it.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-pl.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-ru.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber-zh_CN.ts | 20 ++++++++++++++++++++ translations/harbour-fernschreiber.ts | 20 ++++++++++++++++++++ 10 files changed, 181 insertions(+), 1 deletion(-) diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml index f1b27b9..f044f9c 100644 --- a/qml/pages/SettingsPage.qml +++ b/qml/pages/SettingsPage.qml @@ -55,7 +55,7 @@ Page { ComboBox { id: feedbackComboBox label: qsTr("Notification feedback") - description: qsTr("Non-graphical feedback adds vibration to visual notifications.") + description: qsTr("Use non-graphical feedback (sound, vibration) for notifications") menu: ContextMenu { id: feedbackMenu diff --git a/translations/harbour-fernschreiber-de.ts b/translations/harbour-fernschreiber-de.ts index 2af5735..90804d6 100644 --- a/translations/harbour-fernschreiber-de.ts +++ b/translations/harbour-fernschreiber-de.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images Hintergrund für Sticker anzeigen und sie wie Bilder mittig platzieren. + + Notification feedback + Rückmeldung bei Hinweisen + + + All events + Alle Ereignisse + + + Only new events + Nur neue Ereignisse + + + None + Keine + + + Use non-graphical feedback (sound, vibration) for notifications + Nicht-grafische Rückmeldungen (Klänge, Vibration) bei Hinweisen nutzen + StickerPicker diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts index 7dd6900..c0d688b 100644 --- a/translations/harbour-fernschreiber-es.ts +++ b/translations/harbour-fernschreiber-es.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images Mostrar fondo para pegatinas y alinearlas centralmente como imágenes + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts index 4eba8f6..b03cc86 100644 --- a/translations/harbour-fernschreiber-fi.ts +++ b/translations/harbour-fernschreiber-fi.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts index c83c998..37d8ddf 100644 --- a/translations/harbour-fernschreiber-hu.ts +++ b/translations/harbour-fernschreiber-hu.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-it.ts b/translations/harbour-fernschreiber-it.ts index 6b9d7d9..f738048 100644 --- a/translations/harbour-fernschreiber-it.ts +++ b/translations/harbour-fernschreiber-it.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images Mostra sfondo per gli sticker e centrali come le immagini. + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts index 4ec32e7..2bd2d43 100644 --- a/translations/harbour-fernschreiber-pl.ts +++ b/translations/harbour-fernschreiber-pl.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts index a5f8c8e..5fea4ee 100644 --- a/translations/harbour-fernschreiber-ru.ts +++ b/translations/harbour-fernschreiber-ru.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images То есть рисовать под ними фон и позиционировать по центру. + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts index 59ecb00..25b5912 100644 --- a/translations/harbour-fernschreiber-zh_CN.ts +++ b/translations/harbour-fernschreiber-zh_CN.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts index acce341..9ba73fe 100644 --- a/translations/harbour-fernschreiber.ts +++ b/translations/harbour-fernschreiber.ts @@ -522,6 +522,26 @@ Show background for stickers and align them centrally like images + + Notification feedback + + + + All events + + + + Only new events + + + + None + + + + Use non-graphical feedback (sound, vibration) for notifications + + StickerPicker From 70007001e94d9d48ffa327481de43cf2dfa30bfd Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sun, 18 Oct 2020 19:44:27 +0300 Subject: [PATCH 08/14] Translated new strings to Russian --- translations/harbour-fernschreiber-ru.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts index 5fea4ee..7b1f303 100644 --- a/translations/harbour-fernschreiber-ru.ts +++ b/translations/harbour-fernschreiber-ru.ts @@ -524,34 +524,34 @@ Notification feedback - + Звуки и вибрация All events - + На каждое событие Only new events - + Только на новые события None - + Никогда Use non-graphical feedback (sound, vibration) for notifications - + Сопровождать уведомления звуками и вибрацией. StickerPicker Recently used - + Недавно использованные Loading stickers... - + Загрузка стикеров... From a78f60f974740b294ac6d77b56bbee2b855a6a63 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 18:57:01 +0200 Subject: [PATCH 09/14] Search for emojis with : --- db/emojis.db | Bin 0 -> 479232 bytes harbour-fernschreiber.pro | 9 ++- qml/pages/ChatPage.qml | 115 +++++++++++++++++++++++++++++++++ rpm/harbour-fernschreiber.spec | 1 + rpm/harbour-fernschreiber.yaml | 1 + src/emojisearchworker.cpp | 69 ++++++++++++++++++++ src/emojisearchworker.h | 52 +++++++++++++++ src/tdlibwrapper.cpp | 18 ++++++ src/tdlibwrapper.h | 8 +++ 9 files changed, 271 insertions(+), 2 deletions(-) create mode 100644 db/emojis.db create mode 100644 src/emojisearchworker.cpp create mode 100644 src/emojisearchworker.h diff --git a/db/emojis.db b/db/emojis.db new file mode 100644 index 0000000000000000000000000000000000000000..397eae85018eaffd56563ceee046bfadaf2eb5d2 GIT binary patch literal 479232 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

HWtAq>AV6g2cZRu2F=oE0jeRVai( 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

e!#h?~o+pgS<1BzR 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 FzW~-D+-U#+ literal 0 HcmV?d00001 diff --git a/harbour-fernschreiber.pro b/harbour-fernschreiber.pro index 359923b..75db4e6 100644 --- a/harbour-fernschreiber.pro +++ b/harbour-fernschreiber.pro @@ -16,7 +16,7 @@ CONFIG += sailfishapp sailfishapp_i18n PKGCONFIG += nemonotifications-qt5 ngf-qt5 -QT += core dbus +QT += core dbus sql SOURCES += src/harbour-fernschreiber.cpp \ src/appsettings.cpp \ @@ -24,6 +24,7 @@ SOURCES += src/harbour-fernschreiber.cpp \ src/chatmodel.cpp \ src/dbusadaptor.cpp \ src/dbusinterface.cpp \ + src/emojisearchworker.cpp \ src/fernschreiberutils.cpp \ src/notificationmanager.cpp \ src/processlauncher.cpp \ @@ -102,8 +103,11 @@ ICONPATH = /usr/share/icons/hicolor fernschreiber.desktop.path = /usr/share/applications/ fernschreiber.desktop.files = harbour-fernschreiber.desktop +database.files = db +database.path = /usr/share/$${TARGET} + INSTALLS += telegram 86.png 108.png 128.png 172.png 256.png \ - fernschreiber.desktop gui images + fernschreiber.desktop gui images database HEADERS += \ src/appsettings.h \ @@ -111,6 +115,7 @@ HEADERS += \ src/chatmodel.h \ src/dbusadaptor.h \ src/dbusinterface.h \ + src/emojisearchworker.h \ src/fernschreiberutils.h \ src/notificationmanager.h \ src/processlauncher.h \ diff --git a/qml/pages/ChatPage.qml b/qml/pages/ChatPage.qml index fa8d37a..0e51efc 100644 --- a/qml/pages/ChatPage.qml +++ b/qml/pages/ChatPage.qml @@ -43,6 +43,7 @@ Page { property variant chatPartnerInformation; property variant chatGroupInformation; property int chatOnlineMemberCount: 0; + property variant emojiProposals; function updateChatPartnerStatusText() { if (chatPartnerInformation.status['@type'] === "userStatusEmpty" ) { @@ -176,6 +177,44 @@ Page { controlSendButton(); } + function getWordBoundaries(text, cursorPosition) { + var wordBoundaries = { beginIndex : 0, endIndex : text.length}; + var currentIndex = 0; + for (currentIndex = (cursorPosition - 1); currentIndex > 0; currentIndex--) { + if (text.charAt(currentIndex) === ' ') { + wordBoundaries.beginIndex = currentIndex + 1; + break; + } + } + for (currentIndex = cursorPosition; currentIndex < text.length; currentIndex++) { + if (text.charAt(currentIndex) === ' ') { + wordBoundaries.endIndex = currentIndex; + break; + } + } + return wordBoundaries; + } + + function handleMessageTextReplacement(text, cursorPosition) { + var wordBoundaries = getWordBoundaries(text, cursorPosition); + + var currentWord = text.substring(wordBoundaries.beginIndex, wordBoundaries.endIndex); + if (currentWord.length > 1 && currentWord.charAt(0) === ':') { + tdLibWrapper.searchEmoji(currentWord.substring(1)); + } else { + chatPage.emojiProposals = null; + } + } + + function replaceMessageText(text, cursorPosition, newText) { + var wordBoundaries = getWordBoundaries(text, cursorPosition); + var newCompleteText = text.substring(0, wordBoundaries.beginIndex) + newText + " " + text.substring(wordBoundaries.endIndex); + var newIndex = wordBoundaries.beginIndex + newText.length + 1; + newMessageTextField.text = newCompleteText; + newMessageTextField.cursorPosition = newIndex; + lostFocusTimer.start(); + } + Component.onCompleted: { initializePage(); } @@ -227,6 +266,9 @@ Page { uploadingProgressBar.maximumValue = fileInformation.size; uploadingProgressBar.value = fileInformation.remote.uploaded_size; } + onEmojiSearchSuccessful: { + chatPage.emojiProposals = result; + } } Connections { @@ -269,6 +311,26 @@ Page { } } + Timer { + id: lostFocusTimer + interval: 200 + running: false + repeat: false + onTriggered: { + newMessageTextField.forceActiveFocus(); + } + } + + Timer { + id: textReplacementTimer + interval: 600 + running: false + repeat: false + onTriggered: { + handleMessageTextReplacement(newMessageTextField.text, newMessageTextField.cursorPosition); + } + } + Timer { id: chatContactTimeUpdater interval: 60000 @@ -1151,6 +1213,58 @@ Page { } + Column { + id: emojiColumn + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + visible: emojiProposals ? ( emojiProposals.length > 0 ? true : false ) : false + opacity: emojiProposals ? ( emojiProposals.length > 0 ? 1 : 0 ) : 0 + Behavior on opacity { NumberAnimation {} } + spacing: Theme.paddingMedium + + Flickable { + width: parent.width + height: emojiResultRow.height + Theme.paddingSmall + anchors.horizontalCenter: parent.horizontalCenter + contentWidth: emojiResultRow.width + clip: true + Row { + id: emojiResultRow + spacing: Theme.paddingMedium + Repeater { + model: emojiProposals + + Item { + height: singleEmojiRow.height + width: singleEmojiRow.width + + Row { + id: singleEmojiRow + spacing: Theme.paddingSmall + + Image { + id: emojiPicture + source: "../js/emoji/" + modelData.file_name + width: Theme.fontSizeLarge + height: Theme.fontSizeLarge + } + + } + + MouseArea { + anchors.fill: parent + onClicked: { + replaceMessageText(newMessageTextField.text, newMessageTextField.cursorPosition, modelData.emoji); + emojiProposals = null; + } + } + } + + } + } + } + } + Text { width: parent.width @@ -1199,6 +1313,7 @@ Page { onTextChanged: { controlSendButton(); + textReplacementTimer.restart(); } } diff --git a/rpm/harbour-fernschreiber.spec b/rpm/harbour-fernschreiber.spec index fa78aed..2054851 100644 --- a/rpm/harbour-fernschreiber.spec +++ b/rpm/harbour-fernschreiber.spec @@ -24,6 +24,7 @@ BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Qml) BuildRequires: pkgconfig(Qt5Quick) BuildRequires: pkgconfig(Qt5DBus) +BuildRequires: pkgconfig(Qt5Sql) BuildRequires: pkgconfig(nemonotifications-qt5) BuildRequires: pkgconfig(ngf-qt5) BuildRequires: desktop-file-utils diff --git a/rpm/harbour-fernschreiber.yaml b/rpm/harbour-fernschreiber.yaml index 0524663..21c163a 100644 --- a/rpm/harbour-fernschreiber.yaml +++ b/rpm/harbour-fernschreiber.yaml @@ -24,6 +24,7 @@ PkgConfigBR: - Qt5Qml - Qt5Quick - Qt5DBus + - Qt5Sql - nemonotifications-qt5 - ngf-qt5 diff --git a/src/emojisearchworker.cpp b/src/emojisearchworker.cpp new file mode 100644 index 0000000..5e97d0b --- /dev/null +++ b/src/emojisearchworker.cpp @@ -0,0 +1,69 @@ +/* + Copyright (C) 2020 Sebastian J. Wolf + + 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 . +*/ +#include "emojisearchworker.h" + +#define LOG(x) qDebug() << "[EmojiSearchWorker]" << x + +EmojiSearchWorker::~EmojiSearchWorker() +{ + LOG("Destroying myself..."); + database.close(); +} + +EmojiSearchWorker::EmojiSearchWorker(QObject *parent) : QThread(parent) +{ + LOG("Initializing Emoji database"); + QSqlDatabase::removeDatabase("emojis"); + database = QSqlDatabase::addDatabase("QSQLITE", "emojis"); + database.setDatabaseName("/usr/share/harbour-fernschreiber/db/emojis.db"); +} + +void EmojiSearchWorker::setParameters(const QString &queryString) +{ + this->queryString = queryString; +} + +void EmojiSearchWorker::performSearch() +{ + LOG("Performing emoji search" << this->queryString); + QVariantList resultList; + + if (database.open()) { + QSqlQuery query(database); + query.prepare("select * from emojis where description match (:queryString) limit 25"); + query.bindValue(":queryString", queryString + "*"); + query.exec(); + while (query.next()) { + if (isInterruptionRequested()) { + break; + } + QVariantMap foundEmoji; + foundEmoji.insert("file_name", query.value(0).toString()); + foundEmoji.insert("emoji", query.value(1).toString()); + foundEmoji.insert("emoji_version", query.value(2).toString()); + foundEmoji.insert("description", query.value(3).toString()); + resultList.append(foundEmoji); + } + database.close(); + } else { + LOG("Unable to perform a query on database" << database.lastError().databaseText()); + } + + emit searchCompleted(queryString, resultList); +} diff --git a/src/emojisearchworker.h b/src/emojisearchworker.h new file mode 100644 index 0000000..c728b07 --- /dev/null +++ b/src/emojisearchworker.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2020 Sebastian J. Wolf + + 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 . +*/ +#ifndef EMOJISEARCHWORKER_H +#define EMOJISEARCHWORKER_H + +#include +#include +#include +#include +#include +#include + +class EmojiSearchWorker : public QThread +{ + Q_OBJECT + void run() Q_DECL_OVERRIDE { + performSearch(); + } +public: + ~EmojiSearchWorker() override; + explicit EmojiSearchWorker(QObject *parent = nullptr); + void setParameters(const QString &queryString); + +signals: + void searchCompleted(const QString &queryString, const QVariantList &resultList); + +public slots: + +private: + QSqlDatabase database; + QString queryString; + + void performSearch(); +}; + +#endif // EMOJISEARCHWORKER_H diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index 447e1b6..d5b534b 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -93,6 +93,8 @@ TDLibWrapper::TDLibWrapper(QObject *parent) : QObject(parent) connect(this->tdLibReceiver, SIGNAL(stickerSets(QVariantList)), this, SLOT(handleStickerSets(QVariantList))); connect(this->tdLibReceiver, SIGNAL(stickerSet(QVariantMap)), this, SLOT(handleStickerSet(QVariantMap))); + connect(&emojiSearchWorker, SIGNAL(searchCompleted(QString, QVariantList)), this, SLOT(handleEmojiSearchCompleted(QString, QVariantList))); + this->tdLibReceiver->start(); this->setLogVerbosityLevel(); @@ -467,6 +469,16 @@ void TDLibWrapper::getStickerSet(const QString &setId) this->sendRequest(requestObject); } +void TDLibWrapper::searchEmoji(const QString &queryString) +{ + LOG("Searching emoji" << queryString); + while (this->emojiSearchWorker.isRunning()) { + this->emojiSearchWorker.requestInterruption(); + } + this->emojiSearchWorker.setParameters(queryString); + this->emojiSearchWorker.start(); +} + QVariantMap TDLibWrapper::getUserInformation() { return this->userInformation; @@ -828,6 +840,12 @@ void TDLibWrapper::handleStickerSet(const QVariantMap &stickerSet) emit stickerSetReceived(stickerSet); } +void TDLibWrapper::handleEmojiSearchCompleted(const QString &queryString, const QVariantList &resultList) +{ + LOG("Emoji search completed" << queryString); + emit emojiSearchSuccessful(resultList); +} + void TDLibWrapper::setInitialParameters() { LOG("Sending initial parameters to TD Lib"); diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h index a583505..6723470 100644 --- a/src/tdlibwrapper.h +++ b/src/tdlibwrapper.h @@ -24,6 +24,7 @@ #include "tdlibreceiver.h" #include "dbusadaptor.h" #include "dbusinterface.h" +#include "emojisearchworker.h" class TDLibWrapper : public QObject { @@ -129,6 +130,9 @@ public: Q_INVOKABLE void getInstalledStickerSets(); Q_INVOKABLE void getStickerSet(const QString &setId); + // Others (candidates for extraction ;)) + Q_INVOKABLE void searchEmoji(const QString &queryString); + public: const Group* getGroup(qlonglong groupId) const; static ChatMemberStatus chatMemberStatusFromString(const QString &status); @@ -169,6 +173,7 @@ signals: void installedStickerSetsUpdated(const QVariantList &stickerSetIds); void stickerSetsReceived(const QVariantList &stickerSets); void stickerSetReceived(const QVariantMap &stickerSet); + void emojiSearchSuccessful(const QVariantList &result); public slots: void handleVersionDetected(const QString &version); @@ -204,6 +209,7 @@ public slots: void handleInstalledStickerSetsUpdated(const QVariantList &stickerSetIds); void handleStickerSets(const QVariantList &stickerSets); void handleStickerSet(const QVariantMap &stickerSet); + void handleEmojiSearchCompleted(const QString &queryString, const QVariantList &resultList); private: void setInitialParameters(); @@ -228,6 +234,8 @@ private: QVariantMap unreadChatInformation; QHash basicGroups; QHash superGroups; + EmojiSearchWorker emojiSearchWorker; + }; #endif // TDLIBWRAPPER_H From 4e61e2e6aebd824b4dc9ee9af9b104c7ccf463e0 Mon Sep 17 00:00:00 2001 From: carlosgonz <45316884+GNUuser@users.noreply.github.com> Date: Sun, 18 Oct 2020 13:36:42 -0400 Subject: [PATCH 10/14] Update harbour-fernschreiber-es.ts --- translations/harbour-fernschreiber-es.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts index c0d688b..0398fdc 100644 --- a/translations/harbour-fernschreiber-es.ts +++ b/translations/harbour-fernschreiber-es.ts @@ -524,23 +524,23 @@ Notification feedback - + Comentarios de notificación All events - + Todos los eventos Only new events - + Sólo nuevos eventos None - + Ninguno Use non-graphical feedback (sound, vibration) for notifications - + Usa comentarios no gráficos (sonido, vibración) para las notificaciones From f86e60b4a2c3f7bf65ea5ec70abae06065c5bb71 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Sun, 18 Oct 2020 19:10:26 +0300 Subject: [PATCH 11/14] Let context menu to appear when sticker is long-pressed And don't load placeholder image too quickly. --- qml/components/StickerPreview.qml | 76 ++++++++++++++----------------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/qml/components/StickerPreview.qml b/qml/components/StickerPreview.qml index 23df934..1a3a991 100644 --- a/qml/components/StickerPreview.qml +++ b/qml/components/StickerPreview.qml @@ -17,37 +17,29 @@ along with Fernschreiber. If not, see . */ import QtQuick 2.5 -import QtGraphicalEffects 1.0 import Sailfish.Silica 1.0 Item { - - id: stickerPreviewItem - property variant stickerData; property int usedFileId; - width: stickerData.width + Theme.paddingSmall - height: stickerData.height + Theme.paddingSmall + width: stickerData.width + height: stickerData.height Component.onCompleted: { - updateSticker(); - } - - function updateSticker() { if (stickerData) { if (stickerData.is_animated) { // Use thumbnail until we can decode TGS files usedFileId = stickerData.thumbnail.photo.id; if (stickerData.thumbnail.photo.local.is_downloading_completed) { - singleImage.source = stickerData.thumbnail.photo.local.path; + stickerImage.source = stickerData.thumbnail.photo.local.path; } else { tdLibWrapper.downloadFile(usedFileId); } } else { usedFileId = stickerData.sticker.id; if (stickerData.sticker.local.is_downloading_completed) { - singleImage.source = stickerData.sticker.local.path; + stickerImage.source = stickerData.sticker.local.path; } else { tdLibWrapper.downloadFile(usedFileId); } @@ -65,45 +57,43 @@ Item { } else { stickerData.sticker = fileInformation; } - singleImage.source = fileInformation.local.path; + stickerImage.source = fileInformation.local.path; } } } } Image { - id: singleImage - width: ( ( parent.width - Theme.paddingSmall ) >= stickerData.width ) ? stickerData.width : ( parent.width - Theme.paddingSmall ) - height: ( ( parent.height - Theme.paddingSmall ) >= stickerData.height ) ? stickerData.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 {} } - MouseArea { - anchors.fill: parent - onClicked: { - //pageStack.push(Qt.resolvedUrl("../pages/ImagePage.qml"), { "photoData" : imagePreviewItem.photoData, "pictureFileInformation" : imagePreviewItem.pictureFileInformation }); - } - } - } - - Image { - id: imageLoadingBackgroundImage - source: "../../images/background-" + ( Theme.colorScheme ? "black" : "white" ) + "-small.png" - anchors { - centerIn: parent - } - width: ( ( parent.width - Theme.paddingSmall ) >= stickerData.width ) ? stickerData.width : ( parent.width - Theme.paddingSmall ) - height: ( ( parent.height - Theme.paddingSmall ) >= stickerData.height ) ? stickerData.height : ( parent.height - Theme.paddingSmall ) - visible: singleImage.status !== Image.Ready - asynchronous: true + id: stickerImage + anchors.fill: parent fillMode: Image.PreserveAspectFit - opacity: 0.15 + autoTransform: true + asynchronous: true + visible: opacity > 0 + opacity: status === Image.Ready ? 1 : 0 + Behavior on opacity { FadeAnimation {} } } + Loader { + anchors.fill: parent + sourceComponent: Component { + Image { + source: "../../images/background-" + ( Theme.colorScheme ? "black" : "white" ) + "-small.png" + asynchronous: true + + fillMode: Image.PreserveAspectFit + } + } + + active: opacity > 0 + opacity: !stickerImage.visible && !placeHolderDelayTimer.running ? 0.15 : 0 + Behavior on opacity { FadeAnimation {} } + } + + Timer { + id: placeHolderDelayTimer + interval: 1000 + running: true + } } From dba973b5227120334317951de9ec2b36d9b31623 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 21:54:15 +0200 Subject: [PATCH 12/14] Introduce explicit clear button for in-reply-to and edit message, fixes #69 --- qml/components/InReplyToRow.qml | 69 ++++++++++++++++++++------------- qml/pages/ChatPage.qml | 47 ++++++++++++++-------- 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/qml/components/InReplyToRow.qml b/qml/components/InReplyToRow.qml index 90762b8..20f27d5 100644 --- a/qml/components/InReplyToRow.qml +++ b/qml/components/InReplyToRow.qml @@ -31,6 +31,9 @@ Row { property string myUserId; property variant inReplyToMessage; + property bool editable: false; + + signal clearRequested() onInReplyToMessageChanged: { if (inReplyToMessage) { @@ -47,37 +50,51 @@ Row { border.width: 0 } - Column { - id: inReplyToMessageColumn - spacing: Theme.paddingSmall + Row { width: parent.width - Theme.paddingSmall - inReplyToMessageRectangle.width + spacing: Theme.paddingSmall - Text { - id: inReplyToUserText + Column { + id: inReplyToMessageColumn + spacing: Theme.paddingSmall + width: parent.width - ( inReplyToRow.editable ? ( Theme.paddingSmall + removeInReplyToIconButton.width ) : 0 ) - width: parent.width - font.pixelSize: Theme.fontSizeExtraSmall - font.weight: Font.ExtraBold - color: Theme.primaryColor - maximumLineCount: 1 - elide: Text.ElideRight - textFormat: Text.StyledText - horizontalAlignment: Text.AlignLeft + Text { + id: inReplyToUserText + + width: parent.width + font.pixelSize: Theme.fontSizeExtraSmall + font.weight: Font.ExtraBold + color: Theme.primaryColor + maximumLineCount: 1 + elide: Text.ElideRight + textFormat: Text.StyledText + horizontalAlignment: Text.AlignLeft + } + + Text { + id: inReplyToMessageText + font.pixelSize: Theme.fontSizeExtraSmall + color: Theme.primaryColor + width: parent.width + elide: Text.ElideRight + textFormat: Text.StyledText + onTruncatedChanged: { + // There is obviously a bug in QML in truncating text with images. + // We simply remove Emojis then... + if (truncated) { + text = text.replace(/\]+\/\>/g, ""); + } + } + } } - Text { - id: inReplyToMessageText - font.pixelSize: Theme.fontSizeExtraSmall - color: Theme.primaryColor - width: parent.width - elide: Text.ElideRight - textFormat: Text.StyledText - onTruncatedChanged: { - // There is obviously a bug in QML in truncating text with images. - // We simply remove Emojis then... - if (truncated) { - text = text.replace(/\]+\/\>/g, ""); - } + IconButton { + id: removeInReplyToIconButton + icon.source: "image://theme/icon-m-clear" + visible: inReplyToRow.editable + onClicked: { + inReplyToRow.clearRequested(); } } } diff --git a/qml/pages/ChatPage.qml b/qml/pages/ChatPage.qml index 0e51efc..c108784 100644 --- a/qml/pages/ChatPage.qml +++ b/qml/pages/ChatPage.qml @@ -175,6 +175,8 @@ Page { } } controlSendButton(); + newMessageInReplyToRow.inReplyToMessage = null; + newMessageColumn.editMessageId = "0"; } function getWordBoundaries(text, cursorPosition) { @@ -1088,6 +1090,12 @@ Page { } } + editable: true + + onClearRequested: { + newMessageInReplyToRow.inReplyToMessage = null; + } + id: newMessageInReplyToRow myUserId: chatPage.myUserId anchors.horizontalCenter: parent.horizontalCenter @@ -1265,15 +1273,31 @@ Page { } } - Text { + Row { width: parent.width - - id: editMessageText - font.pixelSize: Theme.fontSizeSmall - font.bold: true - text: qsTr("Edit Message") - color: Theme.secondaryColor + spacing: Theme.paddingSmall visible: newMessageColumn.editMessageId !== "0" + + Text { + width: parent.width - Theme.paddingSmall - removeEditMessageIconButton.width + + anchors.verticalCenter: parent.verticalCenter + + id: editMessageText + font.pixelSize: Theme.fontSizeSmall + font.bold: true + text: qsTr("Edit Message") + color: Theme.secondaryColor + } + + IconButton { + id: removeEditMessageIconButton + icon.source: "image://theme/icon-m-clear" + onClicked: { + newMessageColumn.editMessageId = "0"; + newMessageTextField.text = ""; + } + } } Row { @@ -1291,15 +1315,6 @@ Page { labelVisible: false textLeftMargin: 0 textTopMargin: 0 - onFocusChanged: { - if (!focus) { - newMessageInReplyToRow.inReplyToMessage = null; - if (newMessageColumn.editMessageId !== "0") { - newMessageColumn.editMessageId = "0"; - newMessageTextField.text = ""; - } - } - } EnterKey.onClicked: { if (appSettings.sendByEnter) { sendMessage(); From a95dcc4efcce7e1f1a59bee96551952e9b4f8452 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 22:14:48 +0200 Subject: [PATCH 13/14] Ignore already existing file when download is requested, fixes #67 --- src/tdlibwrapper.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index d5b534b..d694ad4 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -536,10 +536,14 @@ void TDLibWrapper::copyFileToDownloads(const QString &filePath) QFileInfo fileInfo(filePath); if (fileInfo.exists()) { QString downloadFilePath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/" + fileInfo.fileName(); - if (QFile::copy(filePath, downloadFilePath)) { + if (QFile::exists(downloadFilePath)) { emit copyToDownloadsSuccessful(fileInfo.fileName(), downloadFilePath); } else { - emit copyToDownloadsError(fileInfo.fileName(), downloadFilePath); + if (QFile::copy(filePath, downloadFilePath)) { + emit copyToDownloadsSuccessful(fileInfo.fileName(), downloadFilePath); + } else { + emit copyToDownloadsError(fileInfo.fileName(), downloadFilePath); + } } } else { emit copyToDownloadsError(fileInfo.fileName(), filePath); From 84460e1402c3aebdf15feaf3a3452099f7332c35 Mon Sep 17 00:00:00 2001 From: "Sebastian J. Wolf" Date: Sun, 18 Oct 2020 23:05:43 +0200 Subject: [PATCH 14/14] Add changelog for 0.3 --- rpm/harbour-fernschreiber.changes.in | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/rpm/harbour-fernschreiber.changes.in b/rpm/harbour-fernschreiber.changes.in index fdd42cf..87c4526 100644 --- a/rpm/harbour-fernschreiber.changes.in +++ b/rpm/harbour-fernschreiber.changes.in @@ -25,3 +25,19 @@ - Differentiate text between other people and current user ("You have..." vs. "Somebody has...") - Support for the Jolla Tablet - New translations (Chinese, Hungarian, Polish, Spanish) - thanks to dashinfantry, edp17, atlochowski, GNUuser + +* Sun Oct 18 2020 Sebastian J. Wolf 0.2 +- Support for sending stickers +- Search for emojis from message input field, use : to start searching +- New icon/logo - thanks to iamnomeutente +- Option to customize non-graphical notification feedback - thanks to monich +- Add user registration - thanks to jgibbon +- Don't show irrelevant groups - thanks to monich +- Display information about forwarded messages +- Option to avoid displaying stickers like images - thanks to monich +- Fix: Don't reset edit/in-reply-to mode after focus change +- Fix: Display caption for documents +- Fix: Reserve some space for lazy loaded elements +- Fix: Don't display error message in case of repeated download of the same file +- New translations (Finnish, Italian, Russian), thanks to jorm1s, iamnomeutente, arustg and monich +- That was quite a lot - I hope I didn't forget anything. If I did, big sorry and please let me know!