aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/Page.qml
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/Page.qml')
-rw-r--r--desktop/Page.qml60
1 files changed, 60 insertions, 0 deletions
diff --git a/desktop/Page.qml b/desktop/Page.qml
index 8365c51..357c3a7 100644
--- a/desktop/Page.qml
+++ b/desktop/Page.qml
@@ -80,7 +80,47 @@ Item {
color: Qt.alpha(Theme.text, 0.12)
}
+ // Scrolls to the content row whose objectName is key and flashes it, for
+ // a settings search hit. Rows usually arrive after the page loads its
+ // data, so it looks for up to 3s before giving up.
+ function reveal(key) {
+ finder.key = key;
+ finder.tries = 0;
+ finder.restart();
+ }
+
+ function findNamed(item, key) {
+ if (item.objectName === key) return item;
+ for (let i = 0; i < item.children.length; i++) {
+ const f = page.findNamed(item.children[i], key);
+ if (f) return f;
+ }
+ return null;
+ }
+
+ Timer {
+ id: finder
+ property string key: ""
+ property int tries: 0
+ interval: 100
+ repeat: true
+ onTriggered: {
+ const it = page.findNamed(holder, key);
+ if (!it) { if (++tries > 30) stop(); return; }
+ stop();
+ const p = it.mapToItem(holder, 0, 0);
+ const flick = scroll.contentItem;
+ flick.contentY = Math.max(0, Math.min(p.y - 40, flick.contentHeight - flick.height));
+ flash.x = p.x - 4;
+ flash.y = p.y - 2;
+ flash.width = it.width + 8;
+ flash.height = it.height + 4;
+ flashAnim.restart();
+ }
+ }
+
ScrollView {
+ id: scroll
anchors { top: rule.bottom; left: parent.left; right: parent.right; bottom: parent.bottom }
anchors.topMargin: 12
clip: true
@@ -92,4 +132,24 @@ Item {
implicitHeight: childrenRect.height
}
}
+
+ // The reveal highlight, over the row and in holder's coordinates.
+ // Declared out here, not in the ScrollView, which sizes from a single
+ // child; parent puts it in holder all the same.
+ Rectangle {
+ id: flash
+ parent: holder
+ z: 10
+ radius: 8
+ opacity: 0
+ color: Qt.alpha(Theme.accent, 0.28)
+ border.width: 1
+ border.color: Theme.accent
+ SequentialAnimation {
+ id: flashAnim
+ NumberAnimation { target: flash; property: "opacity"; to: 1; duration: 120 }
+ PauseAnimation { duration: 1400 }
+ NumberAnimation { target: flash; property: "opacity"; to: 0; duration: 600 }
+ }
+ }
}