diff options
Diffstat (limited to 'desktop/Page.qml')
| -rw-r--r-- | desktop/Page.qml | 60 |
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 } + } + } } |
