From 278a48a2e41efaf3c5a34d6caac8eacc7c6fcc1e Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 10 Jul 2026 14:38:12 -0700 Subject: [PATCH] feat(transport): editable frame field + uniform spacing --- .../ISC/Tabs/components/ReadoutPanel.qml | 1 + .../ISC/Tabs/components/TransportBar.qml | 72 ++++++++++++++++--- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/pygui/ISC/Tabs/components/ReadoutPanel.qml b/src/pygui/ISC/Tabs/components/ReadoutPanel.qml index ba34f41..725fe8e 100644 --- a/src/pygui/ISC/Tabs/components/ReadoutPanel.qml +++ b/src/pygui/ISC/Tabs/components/ReadoutPanel.qml @@ -8,6 +8,7 @@ import ISC // Right-rail panel with three bordered sections: READOUT, DISPLAY, THRESHOLDS. // Cards match the left-rail SOURCE / CONNECTION FLOW style. ColumnLayout { + id: root spacing: 6 property var s: streamController.stats property alias showLabels: labelsToggle.checked diff --git a/src/pygui/ISC/Tabs/components/TransportBar.qml b/src/pygui/ISC/Tabs/components/TransportBar.qml index 102fa7e..12d6f6f 100644 --- a/src/pygui/ISC/Tabs/components/TransportBar.qml +++ b/src/pygui/ISC/Tabs/components/TransportBar.qml @@ -42,15 +42,69 @@ Item { spacing: 24 // Frame counter - Text { + Row { + spacing: 6 anchors.verticalCenter: parent.verticalCenter - text: "Frame " + (streamController.frameIndex + 1) - + " / " + streamController.frameTotal - color: Theme.sideMutedText - font.family: Theme.uiFontFamily - font.pixelSize: Theme.fontMd - font.weight: Font.Medium - leftPadding: 8 + + Label { + text: "Frame" + color: Theme.sideMutedText + font.family: Theme.uiFontFamily + font.pixelSize: Theme.fontMd + font.weight: Font.Medium + anchors.verticalCenter: parent.verticalCenter + } + + TextField { + id: frameInput + text: String(streamController.frameIndex + 1) + font.pixelSize: Theme.fontMd + font.weight: Font.Medium + font.family: Theme.codeFontFamily + color: Theme.headingColor + verticalAlignment: TextInput.AlignVCenter + horizontalAlignment: TextInput.AlignHCenter + selectByMouse: true + inputMethodHints: Qt.ImhDigitsOnly + padding: 0 + width: Math.max(44, contentWidth + 16) + height: 28 + anchors.verticalCenter: parent.verticalCenter + + background: Rectangle { + color: Theme.fieldBackground + radius: Theme.radiusXs + border.color: frameInput.activeFocus ? Theme.fieldBorderFocus : (frameInput.hovered ? Theme.fieldBorderFocus : Theme.sideBorder) + border.width: 1 + } + + onEditingFinished: { + var val = parseInt(text) + if (!isNaN(val)) { + var targetFrame = Math.max(1, Math.min(val, streamController.frameTotal)) + streamController.seek(targetFrame - 1) + } + text = String(streamController.frameIndex + 1) + } + + Connections { + target: streamController + function onFrameUpdated() { + if (!frameInput.activeFocus) { + frameInput.text = String(streamController.frameIndex + 1) + } + } + } + } + + Label { + text: "/ " + streamController.frameTotal + color: Theme.sideMutedText + font.family: Theme.uiFontFamily + font.pixelSize: Theme.fontMd + font.weight: Font.Medium + anchors.verticalCenter: parent.verticalCenter + } } // Separator 1 @@ -124,7 +178,7 @@ Item { Button { id: playPauseBtn anchors.verticalCenter: parent.verticalCenter - implicitWidth: 64 + implicitWidth: 56 implicitHeight: 56 hoverEnabled: true background: Rectangle {