diff --git a/modules/dashboard/Wrapper.qml b/modules/dashboard/Wrapper.qml index ce6330a4..3413f6e5 100644 --- a/modules/dashboard/Wrapper.qml +++ b/modules/dashboard/Wrapper.qml @@ -12,7 +12,7 @@ Item { id: root required property DrawerVisibilities visibilities - readonly property bool needsKeyboard: content.item?.needsKeyboard ?? false + readonly property bool needsKeyboard: (content.item as Content)?.needsKeyboard ?? false readonly property DashboardState dashState: DashboardState { reloadableId: "dashboardState" } @@ -28,7 +28,7 @@ Item { } } - readonly property real nonAnimHeight: state === "visible" ? (content.item?.nonAnimHeight ?? 0) : 0 + readonly property real nonAnimHeight: state === "visible" ? ((content.item as Content)?.nonAnimHeight ?? 0) : 0 visible: height > 0 implicitHeight: 0 diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index ffa4f8d2..8d99935b 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -10,6 +10,7 @@ import Quickshell import Quickshell.Wayland import Quickshell.Hyprland import QtQuick +import QtQuick.Controls import QtQuick.Effects Variants { @@ -35,7 +36,7 @@ Variants { return 0; const mon = Hypr.monitorFor(screen); - if (mon?.lastIpcObject?.specialWorkspace?.name || mon?.activeWorkspace?.lastIpcObject?.windows > 0) + if (mon?.lastIpcObject.specialWorkspace?.name || mon?.activeWorkspace?.lastIpcObject.windows > 0) return 0; const thresholds = []; @@ -90,7 +91,7 @@ Variants { HyprlandFocusGrab { id: focusGrab - active: (visibilities.launcher && Config.launcher.enabled) || (visibilities.session && Config.session.enabled) || (visibilities.sidebar && Config.sidebar.enabled) || (!Config.dashboard.showOnHover && visibilities.dashboard && Config.dashboard.enabled) || (panels.popouts.currentName.startsWith("traymenu") && panels.popouts.current?.depth > 1) + active: (visibilities.launcher && Config.launcher.enabled) || (visibilities.session && Config.session.enabled) || (visibilities.sidebar && Config.sidebar.enabled) || (!Config.dashboard.showOnHover && visibilities.dashboard && Config.dashboard.enabled) || (panels.popouts.currentName.startsWith("traymenu") && (panels.popouts.current as StackView)?.depth > 1) windows: [win] onCleared: { visibilities.launcher = false; diff --git a/modules/drawers/Exclusions.qml b/modules/drawers/Exclusions.qml index e4015c89..0ec1f8ef 100644 --- a/modules/drawers/Exclusions.qml +++ b/modules/drawers/Exclusions.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import qs.components.containers import qs.config +import qs.modules.bar as Bar import Quickshell import QtQuick @@ -9,7 +10,7 @@ Scope { id: root required property ShellScreen screen - required property Item bar + required property Bar.BarWrapper bar ExclusionZone { anchors.left: true diff --git a/modules/drawers/Interactions.qml b/modules/drawers/Interactions.qml index 29461e80..78099044 100644 --- a/modules/drawers/Interactions.qml +++ b/modules/drawers/Interactions.qml @@ -1,9 +1,11 @@ import qs.components import qs.components.controls import qs.config +import qs.modules.bar as Bar import qs.modules.bar.popouts as BarPopouts import Quickshell import QtQuick +import QtQuick.Controls CustomMouseArea { id: root @@ -12,7 +14,7 @@ CustomMouseArea { required property BarPopouts.Wrapper popouts required property DrawerVisibilities visibilities required property Panels panels - required property Item bar + required property Bar.BarWrapper bar property point dragStart property bool dashboardShortcutActive @@ -69,7 +71,7 @@ CustomMouseArea { if (!utilitiesShortcutActive) visibilities.utilities = false; - if (!popouts.currentName.startsWith("traymenu") || (popouts.current?.depth ?? 0) <= 1) { + if (!popouts.currentName.startsWith("traymenu") || ((popouts.current as StackView)?.depth ?? 0) <= 1) { popouts.hasCurrent = false; bar.closeTray(); } @@ -202,7 +204,7 @@ CustomMouseArea { // Show popouts on hover if (x < bar.implicitWidth) { bar.checkPopout(y); - } else if ((!popouts.currentName.startsWith("traymenu") || (popouts.current?.depth ?? 0) <= 1) && !inLeftPanel(panels.popouts, x, y)) { + } else if ((!popouts.currentName.startsWith("traymenu") || ((popouts.current as StackView)?.depth ?? 0) <= 1) && !inLeftPanel(panels.popouts, x, y)) { popouts.hasCurrent = false; bar.closeTray(); } diff --git a/modules/drawers/Panels.qml b/modules/drawers/Panels.qml index deb7af16..98313ae1 100644 --- a/modules/drawers/Panels.qml +++ b/modules/drawers/Panels.qml @@ -5,6 +5,7 @@ import qs.modules.notifications as Notifications import qs.modules.session as Session import qs.modules.launcher as Launcher import qs.modules.dashboard as Dashboard +import qs.modules.bar as Bar import qs.modules.bar.popouts as BarPopouts import qs.modules.utilities as Utilities import qs.modules.utilities.toasts as Toasts @@ -17,7 +18,7 @@ Item { required property ShellScreen screen required property DrawerVisibilities visibilities - required property Item bar + required property Bar.BarWrapper bar readonly property alias osd: osd readonly property alias notifications: notifications @@ -49,7 +50,9 @@ Item { id: notifications visibilities: root.visibilities - panels: root + sidebarPanel: sidebar + osdPanel: osd + sessionPanel: session anchors.top: parent.top anchors.right: parent.right diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index 46075a20..96f09b28 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -11,7 +11,8 @@ Item { id: root required property DrawerVisibilities visibilities - required property Item panels + required property Item osdPanel + required property Item sessionPanel readonly property int padding: Appearance.padding.large anchors.top: parent.top @@ -26,23 +27,21 @@ Item { let height = (count - 1) * Appearance.spacing.smaller; for (let i = 0; i < count; i++) - height += list.itemAtIndex(i)?.nonAnimHeight ?? 0; + height += (list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0; - if (visibilities && panels) { - if (visibilities.osd) { - const h = panels.osd.y - Config.border.rounding * 2 - padding * 2; - if (height > h) - height = h; - } - - if (visibilities.session) { - const h = panels.session.y - Config.border.rounding * 2 - padding * 2; - if (height > h) - height = h; - } + if (visibilities.osd) { + const h = osdPanel.y - Config.border.rounding * 2 - padding * 2; + if (height > h) + height = h; } - return Math.min((QsWindow.window?.screen?.height ?? 0) - Config.border.thickness * 2, height + padding * 2); + if (visibilities.session) { + const h = sessionPanel.y - Config.border.rounding * 2 - padding * 2; + if (height > h) + height = h; + } + + return Math.min(((QsWindow.window as QsWindow)?.screen?.height ?? 0) - Config.border.thickness * 2, height + padding * 2); } ClippingWrapperRectangle { @@ -63,79 +62,9 @@ Item { orientation: Qt.Vertical spacing: 0 - cacheBuffer: QsWindow.window?.screen.height ?? 0 + cacheBuffer: (QsWindow.window as QsWindow)?.screen.height ?? 0 - delegate: Item { - id: wrapper - - required property NotifData modelData - required property int index - readonly property alias nonAnimHeight: notif.nonAnimHeight - property int idx - - onIndexChanged: { - if (index !== -1) - idx = index; - } - - implicitWidth: notif.implicitWidth - implicitHeight: notif.implicitHeight + (idx === 0 ? 0 : Appearance.spacing.smaller) - - ListView.onRemove: removeAnim.start() - - SequentialAnimation { - id: removeAnim - - PropertyAction { - target: wrapper - property: "ListView.delayRemove" - value: true - } - PropertyAction { - target: wrapper - property: "enabled" - value: false - } - PropertyAction { - target: wrapper - property: "implicitHeight" - value: 0 - } - PropertyAction { - target: wrapper - property: "z" - value: 1 - } - Anim { - target: notif - property: "x" - to: (notif.x >= 0 ? Config.notifs.sizes.width : -Config.notifs.sizes.width) * 2 - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized - } - PropertyAction { - target: wrapper - property: "ListView.delayRemove" - value: false - } - } - - ClippingRectangle { - anchors.top: parent.top - anchors.topMargin: wrapper.idx === 0 ? 0 : Appearance.spacing.smaller - - color: "transparent" - radius: notif.radius - implicitWidth: notif.implicitWidth - implicitHeight: notif.implicitHeight - - Notification { - id: notif - - modelData: wrapper.modelData - } - } - } + delegate: NotifWrapper {} move: Transition { Anim { @@ -160,7 +89,7 @@ Item { let height = 0; for (let i = 0; i < count; i++) { - height += (list.itemAtIndex(i)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; if (height - Appearance.spacing.smaller >= scrollY) return i; @@ -181,7 +110,7 @@ Item { let height = 0; for (let i = count - 1; i >= 0; i--) { - height += (list.itemAtIndex(i)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; if (height - Appearance.spacing.smaller >= scrollY) return count - i - 1; @@ -197,6 +126,78 @@ Item { Anim {} } + component NotifWrapper: Item { + id: wrapper + + required property NotifData modelData + required property int index + readonly property alias nonAnimHeight: notif.nonAnimHeight + property int idx + + onIndexChanged: { + if (index !== -1) + idx = index; + } + + implicitWidth: notif.implicitWidth + implicitHeight: notif.implicitHeight + (idx === 0 ? 0 : Appearance.spacing.smaller) + + ListView.onRemove: removeAnim.start() + + SequentialAnimation { + id: removeAnim + + PropertyAction { + target: wrapper + property: "ListView.delayRemove" + value: true + } + PropertyAction { + target: wrapper + property: "enabled" + value: false + } + PropertyAction { + target: wrapper + property: "implicitHeight" + value: 0 + } + PropertyAction { + target: wrapper + property: "z" + value: 1 + } + Anim { + target: notif + property: "x" + to: (notif.x >= 0 ? Config.notifs.sizes.width : -Config.notifs.sizes.width) * 2 + duration: Appearance.anim.durations.normal + easing.bezierCurve: Appearance.anim.curves.emphasized + } + PropertyAction { + target: wrapper + property: "ListView.delayRemove" + value: false + } + } + + ClippingRectangle { + anchors.top: parent.top + anchors.topMargin: wrapper.idx === 0 ? 0 : Appearance.spacing.smaller + + color: "transparent" + radius: notif.radius + implicitWidth: notif.implicitWidth + implicitHeight: notif.implicitHeight + + Notification { + id: notif + + modelData: wrapper.modelData + } + } + } + component Anim: NumberAnimation { duration: Appearance.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline diff --git a/modules/notifications/Wrapper.qml b/modules/notifications/Wrapper.qml index 61acc56e..accc9d71 100644 --- a/modules/notifications/Wrapper.qml +++ b/modules/notifications/Wrapper.qml @@ -5,11 +5,13 @@ import QtQuick Item { id: root - required property var visibilities - required property Item panels + required property DrawerVisibilities visibilities + required property Item sidebarPanel + property alias osdPanel: content.osdPanel + property alias sessionPanel: content.sessionPanel visible: height > 0 - implicitWidth: Math.max(panels.sidebar.width, content.implicitWidth) + implicitWidth: Math.max(sidebarPanel.width, content.implicitWidth) implicitHeight: content.implicitHeight states: State { @@ -34,6 +36,5 @@ Item { id: content visibilities: root.visibilities - panels: root.panels } } diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index 53c50d7f..bcc89fdf 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -12,7 +12,7 @@ Item { id: root required property Brightness.Monitor monitor - required property var visibilities + required property DrawerVisibilities visibilities required property real volume required property bool muted diff --git a/modules/osd/Wrapper.qml b/modules/osd/Wrapper.qml index e674d638..5b192772 100644 --- a/modules/osd/Wrapper.qml +++ b/modules/osd/Wrapper.qml @@ -10,7 +10,7 @@ Item { id: root required property ShellScreen screen - required property var visibilities + required property DrawerVisibilities visibilities property bool hovered readonly property Brightness.Monitor monitor: Brightness.getMonitorForScreen(root.screen) readonly property bool shouldBeActive: visibilities.osd && Config.osd.enabled && !(visibilities.utilities && Config.utilities.enabled)