wbar: tray

This commit is contained in:
end-4
2025-11-16 12:05:09 +01:00
parent c71a2498d0
commit 5b69995945
12 changed files with 264 additions and 40 deletions
@@ -0,0 +1,59 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import Qt.labs.synchronizer
import Quickshell
import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.waffle.looks
import qs.modules.waffle.bar
RowLayout {
id: root
property bool overflowOpen: false
Layout.fillHeight: true
spacing: 0
BarIconButton {
id: overflowButton
visible: TrayService.unpinnedItems.length > 0
checked: root.overflowOpen
iconName: "chevron-down"
iconMonochrome: true
iconRotation: (Config.options.waffles.bar.bottom ? 180 : 0) + (root.overflowOpen ? 180 : 0)
Behavior on iconRotation {
animation: Looks.transition.rotate.createObject(this)
}
onClicked: {
root.overflowOpen = !root.overflowOpen;
}
TrayOverflowMenu {
id: trayOverflowLayout
Synchronizer on active {
property alias source: root.overflowOpen
}
}
BarToolTip {
extraVisibleCondition: overflowButton.shouldShowTooltip
text: qsTr("Show hidden icons")
}
}
Repeater {
model: ScriptModel {
values: TrayService.pinnedItems
}
delegate: TrayButton {
required property var modelData
item: modelData
}
}
}
@@ -0,0 +1,45 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.SystemTray
import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.waffle.looks
import qs.modules.waffle.bar
BarIconButton {
id: root
required property SystemTrayItem item
property alias menuOpen: menu.visible
readonly property bool barAtBottom: Config.options.waffles.bar.bottom
iconSource: item.icon
onClicked: {
item.activate();
}
altAction: () => {
if (item.hasMenu) menu.open()
}
// This is lazy, but it's not like tray menus on Windoes are consistent...
// TODO: Figure out how to do cascading menus then use a custom menu
QsMenuAnchor {
id: menu
menu: root.item.menu
anchor {
adjustment: PopupAdjustment.ResizeY | PopupAdjustment.SlideX
item: root
gravity: root.barAtBottom ? Edges.Top : Edges.Bottom
edges: root.barAtBottom ? Edges.Top : Edges.Bottom
}
}
BarToolTip {
extraVisibleCondition: root.shouldShowTooltip
text: TrayService.getTooltipForItem(root.item)
}
}
@@ -0,0 +1,59 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Hyprland
import qs.services
import qs.modules.common
import qs.modules.common.functions
import qs.modules.waffle.looks
import qs.modules.waffle.bar
BarPopup {
id: root
closeOnFocusLost: false
onFocusCleared: {
print("uwu")
print(contentItem.children)
const hasMenuOpen = contentItem.children.some(c => (c.menuOpen));
if (!hasMenuOpen) root.close();
else root.grabFocus();
}
contentItem: GridLayout {
id: contentItem
anchors.centerIn: parent
columns: Math.ceil(Math.sqrt(TrayService.unpinnedItems.length))
columnSpacing: 0
rowSpacing: 0
Repeater {
model: TrayService.unpinnedItems
delegate: TrayButton {
required property var modelData
item: modelData
topInset: 0
bottomInset: 0
implicitWidth: 40
implicitHeight: 40
colBackground: ColorUtils.transparentize(Looks.colors.bg2)
colBackgroundHover: Looks.colors.bg2Hover
colBackgroundActive: Looks.colors.bg2Active
onMenuOpenChanged: {
// The overflow menu should only be closed when the user clicks outside
// However the focus grab refuses to reactivate, so we can't have that
// But most of the time the user dismisses the menu by clicking outside anyway,
// so this is acceptable.
if (!menuOpen) {
root.close();
}
}
}
}
}
}