From 1eeaf07a87f8d0e99c680015069051597a1c7bc5 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Mon, 18 May 2026 19:25:32 -0600 Subject: [PATCH] feat(slint): queue and lyrics buttons in the header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Queue and Lyrics icon buttons to the left of the hamburger. Visual for now — they will toggle the right-side sidebar once it lands. cc --- crates/qbz-slint/ui/assets/icons/captions.svg | 7 +++ .../qbz-slint/ui/assets/icons/list-music.svg | 7 +++ crates/qbz-slint/ui/shell/HeaderBar.slint | 57 +++++++++++++------ 3 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 crates/qbz-slint/ui/assets/icons/captions.svg create mode 100644 crates/qbz-slint/ui/assets/icons/list-music.svg diff --git a/crates/qbz-slint/ui/assets/icons/captions.svg b/crates/qbz-slint/ui/assets/icons/captions.svg new file mode 100644 index 000000000..1d4189d18 --- /dev/null +++ b/crates/qbz-slint/ui/assets/icons/captions.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/crates/qbz-slint/ui/assets/icons/list-music.svg b/crates/qbz-slint/ui/assets/icons/list-music.svg new file mode 100644 index 000000000..46a299bd4 --- /dev/null +++ b/crates/qbz-slint/ui/assets/icons/list-music.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/crates/qbz-slint/ui/shell/HeaderBar.slint b/crates/qbz-slint/ui/shell/HeaderBar.slint index 69e4f39a6..2a71996a1 100644 --- a/crates/qbz-slint/ui/shell/HeaderBar.slint +++ b/crates/qbz-slint/ui/shell/HeaderBar.slint @@ -97,6 +97,33 @@ component MenuItem inherits Rectangle { } } +// Square icon button for the header's right-side controls. +component HeaderIconButton inherits Rectangle { + in property icon; + callback clicked(); + + width: 36px; + height: 36px; + border-radius: Radius.sm; + background: ta.has-hover ? Theme.surface-hover : transparent; + + QbzIcon { + source: root.icon; + width: 19px; + height: 19px; + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + tint: ta.has-hover ? Theme.text-primary : Theme.text-secondary; + } + + ta := TouchArea { + mouse-cursor: pointer; + clicked => { + root.clicked(); + } + } +} + export component HeaderBar inherits Rectangle { callback logout(); callback close-app(); @@ -170,29 +197,23 @@ export component HeaderBar inherits Rectangle { } } - // --- Hamburger (anchored right) ---------------------------------------- - user-area := TouchArea { + // --- Right controls: queue, lyrics, hamburger (anchored right) --------- + right-controls := HorizontalLayout { x: root.width - self.width - Spacing.md; y: (root.height - self.height) / 2; - width: 36px; height: 36px; - mouse-cursor: pointer; - clicked => { - menu.show(); + spacing: 2px; + HeaderIconButton { + icon: @image-url("../assets/icons/list-music.svg"); } - Rectangle { - width: 100%; - height: 100%; - border-radius: Radius.sm; - background: user-area.has-hover ? Theme.surface-hover : transparent; + HeaderIconButton { + icon: @image-url("../assets/icons/captions.svg"); } - QbzIcon { - source: @image-url("../assets/icons/menu.svg"); - width: 20px; - height: 20px; - x: (parent.width - self.width) / 2; - y: (parent.height - self.height) / 2; - tint: user-area.has-hover ? Theme.text-primary : Theme.text-secondary; + HeaderIconButton { + icon: @image-url("../assets/icons/menu.svg"); + clicked => { + menu.show(); + } } }