refactor: unified BarModule base component, click-to-open panels, remove pinning
This commit is contained in:
parent
034f0b6d85
commit
26476dc930
33 changed files with 273 additions and 517 deletions
84
shell/modules/BarModule.qml
Normal file
84
shell/modules/BarModule.qml
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
import QtQuick
|
||||
import Quickshell
|
||||
import "." as M
|
||||
import "../services" as S
|
||||
|
||||
// Unified base component for all bar modules.
|
||||
// Provides: tooltip on hover, panel state management, OSD flash support.
|
||||
//
|
||||
// On tap: toggles _panelOpen and emits tapped(). Modules that want custom tap
|
||||
// behavior connect onTapped to their action (the toggle still happens).
|
||||
//
|
||||
// Modules with a HoverPanel bind:
|
||||
// M.HoverPanel { showPanel: root._showPanel; onDismissed: root.dismissPanel() }
|
||||
//
|
||||
// Modules without a panel need nothing - the toggle is a harmless no-op.
|
||||
Row {
|
||||
id: root
|
||||
property string tooltip: ""
|
||||
property bool _hovered: false
|
||||
property color accentColor: parent?.accentColor ?? S.Theme.base05
|
||||
property int cursorShape: Qt.PointingHandCursor
|
||||
|
||||
// Panel state
|
||||
property bool _panelOpen: false
|
||||
property bool _osdActive: false
|
||||
readonly property bool _showPanel: _panelOpen || _osdActive
|
||||
|
||||
signal tapped
|
||||
|
||||
function flashPanel() {
|
||||
_osdActive = true;
|
||||
_osdTimer.restart();
|
||||
}
|
||||
|
||||
function dismissPanel() {
|
||||
_panelOpen = false;
|
||||
_osdActive = false;
|
||||
_osdTimer.stop();
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: _osdTimer
|
||||
interval: 1500
|
||||
onTriggered: if (!root._panelOpen)
|
||||
root._osdActive = false
|
||||
}
|
||||
|
||||
on_PanelOpenChanged: {
|
||||
if (_panelOpen)
|
||||
M.TooltipState.visible = false;
|
||||
}
|
||||
|
||||
HoverHandler {
|
||||
cursorShape: root.cursorShape
|
||||
onHoveredChanged: {
|
||||
root._hovered = hovered;
|
||||
if (hovered && root.tooltip !== "" && !root._panelOpen) {
|
||||
M.TooltipState.text = root.tooltip;
|
||||
M.TooltipState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
|
||||
M.TooltipState.screen = QsWindow.window?.screen ?? null;
|
||||
M.TooltipState.accentColor = root.accentColor;
|
||||
M.TooltipState.visible = true;
|
||||
} else if (!hovered && root.tooltip !== "") {
|
||||
M.TooltipState.visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TapHandler {
|
||||
onTapped: {
|
||||
root._panelOpen = !root._panelOpen;
|
||||
root.tapped();
|
||||
}
|
||||
}
|
||||
|
||||
onTooltipChanged: if (_hovered && tooltip !== "" && !_panelOpen)
|
||||
M.TooltipState.text = tooltip
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation {
|
||||
duration: 150
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue