From 53c59c86299834ebe0c268018305556d3f515cba Mon Sep 17 00:00:00 2001 From: ivan tkachenko Date: Thu, 27 Jan 2022 22:05:20 +0300 Subject: [PATCH 1/3] applets/notes: Bump and sort QML imports Be careful with Dialogs: they do not follow "Qt's minor version" policy for whatever reason. GIT_SILENT --- applets/notes/package/contents/config/config.qml | 2 +- applets/notes/package/contents/ui/ShortcutMenuItem.qml | 6 +++--- applets/notes/package/contents/ui/configAppearance.qml | 7 +++---- applets/notes/package/contents/ui/main.qml | 7 ++++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/applets/notes/package/contents/config/config.qml b/applets/notes/package/contents/config/config.qml index 121431e7c..85905c546 100644 --- a/applets/notes/package/contents/config/config.qml +++ b/applets/notes/package/contents/config/config.qml @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQuick 2.0 +import QtQuick 2.15 import org.kde.plasma.configuration 2.0 diff --git a/applets/notes/package/contents/ui/ShortcutMenuItem.qml b/applets/notes/package/contents/ui/ShortcutMenuItem.qml index d56109dfb..48c4813e4 100644 --- a/applets/notes/package/contents/ui/ShortcutMenuItem.qml +++ b/applets/notes/package/contents/ui/ShortcutMenuItem.qml @@ -4,9 +4,9 @@ * SPDX-License-Identifier: LGPL-2.0-or-later */ -import QtQuick 2.6 -import QtQuick.Window 2.2 -import QtQuick.Controls 2.12 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Window 2.15 MenuItem { property alias _sequence: shortcutElement.sequence diff --git a/applets/notes/package/contents/ui/configAppearance.qml b/applets/notes/package/contents/ui/configAppearance.qml index 3a1469d59..fdedd0ab3 100644 --- a/applets/notes/package/contents/ui/configAppearance.qml +++ b/applets/notes/package/contents/ui/configAppearance.qml @@ -4,10 +4,9 @@ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQuick 2.5 - -import QtQuick.Layouts 1.2 -import QtQuick.Controls 2.5 as QQC2 +import QtQuick 2.15 +import QtQuick.Controls 2.15 as QQC2 +import QtQuick.Layouts 1.15 import org.kde.kcm 1.1 as KCM import org.kde.plasma.core 2.0 as PlasmaCore diff --git a/applets/notes/package/contents/ui/main.qml b/applets/notes/package/contents/ui/main.qml index 9e421c9e2..c719345ae 100644 --- a/applets/notes/package/contents/ui/main.qml +++ b/applets/notes/package/contents/ui/main.qml @@ -6,9 +6,10 @@ */ import QtQuick 2.15 -import QtQuick.Controls 2.5 as QQC2 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.12 +import QtQuick.Controls 2.15 as QQC2 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 +// Dialogs are stuck at 1.3 for some reason. Don't bump. import QtQuick.Dialogs 1.3 // Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. import QtQml 2.15 -- GitLab From b6c318c043808223b09ef21bb0dfaaa88b1c11c5 Mon Sep 17 00:00:00 2001 From: ivan tkachenko Date: Tue, 28 Jun 2022 02:50:49 +0300 Subject: [PATCH 2/3] applets/notes: Port away from plasmoid context property to Plasmoid attached object --- applets/notes/package/contents/ui/main.qml | 68 +++++++++++----------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/applets/notes/package/contents/ui/main.qml b/applets/notes/package/contents/ui/main.qml index c719345ae..03b7dc316 100644 --- a/applets/notes/package/contents/ui/main.qml +++ b/applets/notes/package/contents/ui/main.qml @@ -32,7 +32,7 @@ PlasmaCore.SvgItem { svg: PlasmaCore.Svg { imagePath: "widgets/notes" } - elementId: plasmoid.configuration.color + "-notes" + elementId: Plasmoid.configuration.color + "-notes" width: PlasmaCore.Units.gridUnit * 15 height: PlasmaCore.Units.gridUnit * 15 @@ -48,13 +48,13 @@ PlasmaCore.SvgItem { readonly property real verticalMargins: height * 0.07 // note is of type Note - property QtObject note: noteManager.loadNote(plasmoid.configuration.noteId); + property QtObject note: noteManager.loadNote(Plasmoid.configuration.noteId); // define colors used for icons in ToolButtons and for text in TextArea. // this is deliberately _NOT_ the theme color as we are over a known bright background! // an unknown colour over a known colour is a bad move as you end up with white on yellow. readonly property color textIconColor: { - if (plasmoid.configuration.color === "black" || plasmoid.configuration.color === "translucent-light") { + if (Plasmoid.configuration.color === "black" || Plasmoid.configuration.color === "translucent-light") { return "#dfdfdf"; } return "#202020"; @@ -67,10 +67,10 @@ PlasmaCore.SvgItem { } Connections { - target: plasmoid + target: Plasmoid.self function onExpandedChanged(expanded) { // don't autofocus when we're on the desktop - if (expanded && (plasmoid.formFactor === PlasmaCore.Types.Vertical || plasmoid.formFactor === PlasmaCore.Types.Horizontal)) { + if (expanded && (Plasmoid.formFactor === PlasmaCore.Types.Vertical || Plasmoid.formFactor === PlasmaCore.Types.Horizontal)) { mainTextArea.forceActiveFocus() } } @@ -102,13 +102,13 @@ PlasmaCore.SvgItem { Timer { id: activationTimer interval: 250 // matches taskmanager delay - onTriggered: plasmoid.expanded = true + onTriggered: Plasmoid.expanded = true } MouseArea { anchors.fill: parent hoverEnabled: true - onClicked: plasmoid.expanded = !plasmoid.expanded + onClicked: Plasmoid.expanded = !Plasmoid.expanded PlasmaCore.IconItem { anchors.fill: parent @@ -152,7 +152,7 @@ PlasmaCore.SvgItem { PlasmaComponents3.TextArea { id: mainTextArea - property real cfgFontPointSize: plasmoid.configuration.fontSize + property real cfgFontPointSize: Plasmoid.configuration.fontSize textFormat: TextEdit.RichText onLinkActivated: Qt.openUrlExternally(link) @@ -165,7 +165,7 @@ PlasmaCore.SvgItem { Keys.onPressed: { if (event.key === Qt.Key_Escape) { - plasmoid.expanded = false; + Plasmoid.expanded = false; event.accepted = true; } else if (event.modifiers === Qt.ControlModifier) { if (event.key === Qt.Key_B) { @@ -214,9 +214,9 @@ PlasmaCore.SvgItem { onActiveFocusChanged: { if (activeFocus && root.Window && (root.Window.window.flags & Qt.WindowDoesNotAcceptFocus)) { - plasmoid.status = PlasmaCore.Types.AcceptingInputStatus + Plasmoid.status = PlasmaCore.Types.AcceptingInputStatus } else { - plasmoid.status = PlasmaCore.Types.ActiveStatus + Plasmoid.status = PlasmaCore.Types.ActiveStatus note.save(mainTextArea.text); } } @@ -230,9 +230,9 @@ PlasmaCore.SvgItem { } Component.onCompleted: { - if (!plasmoid.configuration.fontSize) { + if (!Plasmoid.configuration.fontSize) { // Set fontSize to default if it is not set - plasmoid.configuration.fontSize = mainTextArea.font.pointSize + Plasmoid.configuration.fontSize = mainTextArea.font.pointSize } } @@ -443,11 +443,11 @@ PlasmaCore.SvgItem { focusPolicy: Qt.TabFocus icon.name: "configure" icon.color: textIconColor - onClicked: plasmoid.action("configure").trigger() + onClicked: Plasmoid.action("configure").trigger() Accessible.name: settingsTooltip.text QQC2.ToolTip { id: settingsTooltip - text: plasmoid.action("configure").text + text: Plasmoid.action("configure").text } } @@ -472,7 +472,7 @@ PlasmaCore.SvgItem { // is done in the same way every time. documentHandler.stripAndSimplify(mainTextArea.text) == documentHandler.strippedClipboardText() ) { - plasmoid.action("remove").trigger(); + Plasmoid.action("remove").trigger(); } else { discardConfirmationDialogLoader.open(); } @@ -480,7 +480,7 @@ PlasmaCore.SvgItem { Accessible.name: removeTooltip.text QQC2.ToolTip { id: removeTooltip - text: plasmoid.action("remove").text + text: Plasmoid.action("remove").text } } } @@ -509,29 +509,29 @@ PlasmaCore.SvgItem { standardButtons: StandardButton.Discard | StandardButton.Cancel onDiscard: { - plasmoid.action("remove").trigger() + Plasmoid.action("remove").trigger() visible = false; } } } Component.onCompleted: { - plasmoid.setAction("change_note_color_white", i18nc("@item:inmenu", "White")); - plasmoid.setAction("change_note_color_black", i18nc("@item:inmenu", "Black")); - plasmoid.setAction("change_note_color_red", i18nc("@item:inmenu", "Red")); - plasmoid.setAction("change_note_color_orange", i18nc("@item:inmenu", "Orange")); - plasmoid.setAction("change_note_color_yellow", i18nc("@item:inmenu", "Yellow")); - plasmoid.setAction("change_note_color_green", i18nc("@item:inmenu", "Green")); - plasmoid.setAction("change_note_color_blue", i18nc("@item:inmenu", "Blue")); - plasmoid.setAction("change_note_color_pink", i18nc("@item:inmenu", "Pink")); - plasmoid.setAction("change_note_color_translucent", i18nc("@item:inmenu", "Translucent")); - plasmoid.setAction("change_note_color_translucent-light", i18nc("@item:inmenu", "Translucent Light")); - plasmoid.setActionSeparator("separator0"); - - // plasmoid configuration doesn't check before emitting change signal + Plasmoid.setAction("change_note_color_white", i18nc("@item:inmenu", "White")); + Plasmoid.setAction("change_note_color_black", i18nc("@item:inmenu", "Black")); + Plasmoid.setAction("change_note_color_red", i18nc("@item:inmenu", "Red")); + Plasmoid.setAction("change_note_color_orange", i18nc("@item:inmenu", "Orange")); + Plasmoid.setAction("change_note_color_yellow", i18nc("@item:inmenu", "Yellow")); + Plasmoid.setAction("change_note_color_green", i18nc("@item:inmenu", "Green")); + Plasmoid.setAction("change_note_color_blue", i18nc("@item:inmenu", "Blue")); + Plasmoid.setAction("change_note_color_pink", i18nc("@item:inmenu", "Pink")); + Plasmoid.setAction("change_note_color_translucent", i18nc("@item:inmenu", "Translucent")); + Plasmoid.setAction("change_note_color_translucent-light", i18nc("@item:inmenu", "Translucent Light")); + Plasmoid.setActionSeparator("separator0"); + + // Plasmoid configuration doesn't check before emitting change signal // explicit check is needed (at time of writing) - if (note.id != plasmoid.configuration.noteId) { - plasmoid.configuration.noteId = note.id; + if (note.id != Plasmoid.configuration.noteId) { + Plasmoid.configuration.noteId = note.id; } } @@ -541,7 +541,7 @@ PlasmaCore.SvgItem { function actionTriggered(actionName) { if (actionName.indexOf("change_note_color_") == 0){ - plasmoid.configuration.color = actionName.replace("change_note_color_", ""); + Plasmoid.configuration.color = actionName.replace("change_note_color_", ""); } } } -- GitLab From 0852fff37d034b18d70803dc8dd294a426565888 Mon Sep 17 00:00:00 2001 From: ivan tkachenko Date: Tue, 28 Jun 2022 02:51:14 +0300 Subject: [PATCH 3/3] applets/notes: Save/restore scrolling and cursor position Makes scrolling position persistent, and takes some care to 1. delay restoring until the text is laid out, 2. throttle storage a little, so that we don't use too much I/O. Component.onDestruction correctly saves the position on exit. It can be tested via D-Bus by calling method quit() at: - Session bus: org.kde.plasmashell - Object path: /MainApplication - Interface: org.qtproject.Qt.QCoreApplication Cursor position restoration can be tested by assigning a global shortcut to an applet, so that it can become focused without actually clicking on it with a mouse and messing with cursor position. Text selection is not handled, and I don't think we should even bother with it. BUG: 449150 --- .../notes/package/contents/config/main.xml | 13 ++++++ applets/notes/package/contents/ui/main.qml | 45 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/applets/notes/package/contents/config/main.xml b/applets/notes/package/contents/config/main.xml index e7387cd12..521cd1476 100644 --- a/applets/notes/package/contents/config/main.xml +++ b/applets/notes/package/contents/config/main.xml @@ -17,5 +17,18 @@ + + + 0 + + + + 0 + + + + 0 + + diff --git a/applets/notes/package/contents/ui/main.qml b/applets/notes/package/contents/ui/main.qml index 03b7dc316..05be15ed7 100644 --- a/applets/notes/package/contents/ui/main.qml +++ b/applets/notes/package/contents/ui/main.qml @@ -320,6 +320,51 @@ PlasmaCore.SvgItem { } } } + + // Save scrolling position when it changes, but throttle to avoid + // killing a storage disk. + Connections { + target: scrollview.contentItem + function onContentXChanged() { + throttedScrollSaver.restart(); + } + function onContentYChanged() { + throttedScrollSaver.restart(); + } + } + Connections { + target: mainTextArea + function onCursorPositionChanged() { + throttedScrollSaver.restart(); + } + } + + Timer { + id: throttedScrollSaver + interval: PlasmaCore.Units.humanMoment + repeat: false + running: false + onTriggered: scrollview.saveScroll() + } + + function saveScroll() { + const flickable = scrollview.contentItem; + Plasmoid.configuration.scrollX = flickable.contentX; + Plasmoid.configuration.scrollY = flickable.contentY; + Plasmoid.configuration.cursorPosition = mainTextArea.cursorPosition; + } + + function restoreScroll() { + const flickable = scrollview.contentItem; + flickable.contentX = Plasmoid.configuration.scrollX; + flickable.contentY = Plasmoid.configuration.scrollY; + mainTextArea.cursorPosition = Plasmoid.configuration.cursorPosition; + } + + // Give it some time to lay out the text, because at this + // point in time content size is not reliable yet. + Component.onCompleted: Qt.callLater(restoreScroll) + Component.onDestruction: saveScroll() } DragDrop.DropArea { -- GitLab