From c22eb51dcdf06255ffd1f79235ca3484bc3b7bdf Mon Sep 17 00:00:00 2001 From: Damocles Date: Sat, 25 Apr 2026 21:32:04 +0200 Subject: [PATCH] add slide-in applet dock with collapsible cards, edge trigger, and bar module toggle --- flake.nix | 4 +- nix/hm-module.nix | 40 ++++ nix/package.nix | 2 +- shell/dock/AppletDock.qml | 409 +++++++++++++++++++++++++++++++++ shell/dock/DockCard.qml | 100 ++++++++ shell/dock/DockEdgeTrigger.qml | 32 +++ shell/dock/DockState.qml | 29 +++ shell/dock/qmldir | 7 + shell/modules/Bar.qml | 5 +- shell/modules/DockModule.qml | 15 ++ shell/modules/qmldir | 1 + shell/services/Modules.qml | 23 +- shell/shell.qml | 15 ++ test/qmllint-baseline.txt | 21 +- 14 files changed, 689 insertions(+), 14 deletions(-) create mode 100644 shell/dock/AppletDock.qml create mode 100644 shell/dock/DockCard.qml create mode 100644 shell/dock/DockEdgeTrigger.qml create mode 100644 shell/dock/DockState.qml create mode 100644 shell/dock/qmldir create mode 100644 shell/modules/DockModule.qml diff --git a/flake.nix b/flake.nix index 4691532..39e1fb9 100644 --- a/flake.nix +++ b/flake.nix @@ -145,9 +145,9 @@ quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default }/lib/qt-6/qml" qmllint -E \ - -I shell/modules -I shell/services -I shell/applets -I shell/lock \ + -I shell/modules -I shell/services -I shell/applets -I shell/dock -I shell/lock \ shell/shell.qml shell/modules/*.qml shell/services/*.qml \ - shell/applets/*.qml shell/lock/*.qml \ + shell/applets/*.qml shell/dock/*.qml shell/lock/*.qml \ > $TMPDIR/raw.txt 2>&1 || true # Extract unique warning messages (file:message, without line numbers) diff --git a/nix/hm-module.nix b/nix/hm-module.nix index c39cc54..4a87bd0 100644 --- a/nix/hm-module.nix +++ b/nix/hm-module.nix @@ -234,6 +234,46 @@ in }; } ); + dock = moduleOpt "dock" { + width = lib.mkOption { + type = lib.types.int; + default = 300; + description = "Dock panel width in pixels."; + }; + applets = lib.mkOption { + default = { }; + description = "Per-applet enable flags for the dock (independent from bar modules)."; + type = lib.types.submodule { + options = + lib.genAttrs + [ + "clock" + "cpu" + "gpu" + "memory" + "temperature" + "disk" + "battery" + "network" + "bluetooth" + "volume" + "backlight" + "weather" + "mpris" + "notifications" + "power" + ] + ( + name: + lib.mkOption { + type = lib.types.bool; + default = true; + description = "Show ${name} applet in the dock."; + } + ); + }; + }; + }; statsDaemon = lib.mkOption { default = { }; description = "Configuration for the nova-stats daemon."; diff --git a/nix/package.nix b/nix/package.nix index d98a984..57314cc 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -25,7 +25,7 @@ let installPhase = '' runHook preInstall mkdir -p $out/share/nova-shell - cp -r shell/shell.qml shell/modules shell/services shell/applets shell/lock shell/assets $out/share/nova-shell/ + cp -r shell/shell.qml shell/modules shell/services shell/applets shell/dock shell/lock shell/assets $out/share/nova-shell/ runHook postInstall ''; }; diff --git a/shell/dock/AppletDock.qml b/shell/dock/AppletDock.qml new file mode 100644 index 0000000..48f0b3e --- /dev/null +++ b/shell/dock/AppletDock.qml @@ -0,0 +1,409 @@ +import QtQuick +import Quickshell +import Quickshell.Wayland +import Quickshell.Io +import Quickshell.Services.Mpris +import Quickshell.Services.Pipewire +import "." as D +import "../services" as S +import "../applets" as C +import "../modules" as M + +PanelWindow { + id: root + + required property var screen + + visible: D.DockState.open + color: "transparent" + + WlrLayershell.layer: D.DockState.mode === "pinned" ? WlrLayer.Top : WlrLayer.Overlay + WlrLayershell.exclusiveZone: D.DockState.mode === "pinned" ? _dockWidth : 0 + WlrLayershell.namespace: "nova-dock" + + anchors.top: true + anchors.right: true + anchors.bottom: true + + readonly property int _dockWidth: S.Modules.dock.width ?? 300 + readonly property var _applets: S.Modules.dock.applets ?? {} + readonly property color _accent: S.Theme.base0C + + implicitWidth: _dockWidth + + // Slide animation + property real _slideX: D.DockState.open ? 0 : _dockWidth + + Behavior on _slideX { + enabled: !S.Theme.reducedMotion + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + + // Overlay mode: close when cursor leaves + HoverHandler { + id: _dockHover + onHoveredChanged: { + if (!hovered && D.DockState.mode === "overlay") + _overlayCloseTimer.restart(); + else + _overlayCloseTimer.stop(); + } + } + + Timer { + id: _overlayCloseTimer + interval: 200 + onTriggered: if (D.DockState.mode === "overlay") + D.DockState.close() + } + + // Background + Rectangle { + id: _bg + anchors.fill: parent + color: S.Theme.base00 + opacity: Math.max(S.Theme.barOpacity, 0.85) + + transform: Translate { + x: root._slideX + } + } + + // Accent border on the left edge + Rectangle { + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + width: 1 + color: root._accent + opacity: _bg.opacity + + transform: Translate { + x: root._slideX + } + } + + // Content + Flickable { + id: _flickable + anchors.fill: parent + contentHeight: _column.height + clip: true + boundsBehavior: Flickable.StopAtBounds + + transform: Translate { + x: root._slideX + } + + Column { + id: _column + width: root._dockWidth + spacing: 8 + topPadding: 8 + bottomPadding: 8 + leftPadding: 8 + rightPadding: 8 + + // Clock + D.DockCard { + visible: root._applets.clock ?? true + icon: "\uF017" + title: "Clock" + accentColor: root._accent + width: parent.width - 16 + + C.ClockApplet { + width: parent.width + accentColor: root._accent + currentDate: _clock.date + } + } + + // CPU + D.DockCard { + id: _cpuCard + visible: root._applets.cpu ?? true + icon: "\uF2DB" + title: "CPU" + accentColor: root._accent + width: parent.width - 16 + + C.CpuApplet { + width: parent.width + cores: S.SystemStats.cpuCores + coreMaxFreq: S.SystemStats.cpuCoreMaxFreq + coreTypes: S.SystemStats.cpuCoreTypes + processes: _cpuProcs.processes + accentColor: root._accent + active: _cpuCard.expanded + } + } + + // GPU + D.DockCard { + visible: (root._applets.gpu ?? true) && S.SystemStats.gpuAvailable + icon: "\uEB4C" + title: "GPU" + accentColor: root._accent + width: parent.width - 16 + + C.GpuApplet { + width: parent.width + active: parent.expanded + accentColor: root._accent + } + } + + // Memory + D.DockCard { + id: _memCard + visible: root._applets.memory ?? true + icon: "\uEFC5" + title: "Memory" + accentColor: root._accent + width: parent.width - 16 + + C.MemoryApplet { + width: parent.width + percent: S.SystemStats.memPercent + usedGb: S.SystemStats.memUsedGb + totalGb: S.SystemStats.memTotalGb + availGb: S.SystemStats.memAvailGb + cachedGb: S.SystemStats.memCachedGb + buffersGb: S.SystemStats.memBuffersGb + processes: _memProcs.processes + accentColor: root._accent + active: _memCard.expanded + } + } + + // Temperature + D.DockCard { + visible: root._applets.temperature ?? true + icon: "\uF2C9" + title: "Temperature" + accentColor: root._accent + width: parent.width - 16 + + C.TemperatureApplet { + width: parent.width + temp: S.SystemStats.tempCelsius + warm: S.Modules.temperature.warm || 80 + hot: S.Modules.temperature.hot || 90 + history: S.SystemStats.tempHistory + devices: S.SystemStats.tempDevices + accentColor: root._accent + deviceFilter: S.Modules.temperature.device || "" + active: parent.parent.expanded + } + } + + // Disk + D.DockCard { + visible: root._applets.disk ?? true + icon: "\uF0C9" + title: "Disk" + accentColor: root._accent + width: parent.width - 16 + + C.DiskApplet { + width: parent.width + mounts: S.SystemStats.diskMounts + accentColor: root._accent + } + } + + // Battery + D.DockCard { + visible: (root._applets.battery ?? true) && S.BatteryService.available + icon: "\uDB80\uDC84" + title: "Battery" + accentColor: root._accent + width: parent.width - 16 + + C.BatteryApplet { + width: parent.width + active: parent.expanded + accentColor: root._accent + } + } + + // Network + D.DockCard { + visible: root._applets.network ?? true + icon: "\uF1EB" + title: "Network" + accentColor: root._accent + width: parent.width - 16 + + C.NetworkApplet { + width: parent.width + accentColor: root._accent + } + } + + // Bluetooth + D.DockCard { + visible: (root._applets.bluetooth ?? true) && S.BluetoothService.state !== "unavailable" + icon: "\uF294" + title: "Bluetooth" + accentColor: root._accent + width: parent.width - 16 + + C.BluetoothApplet { + width: parent.width + accentColor: root._accent + } + } + + // Volume + D.DockCard { + visible: root._applets.volume ?? true + icon: "\uF028" + title: "Sound" + accentColor: root._accent + width: parent.width - 16 + + C.VolumeApplet { + width: parent.width + sink: Pipewire.defaultAudioSink + sinkList: root._sinkList + streamList: root._streamList + accentColor: root._accent + } + } + + // Backlight + D.DockCard { + visible: (root._applets.backlight ?? true) && S.BacklightService.available + icon: "\uF185" + title: "Brightness" + accentColor: root._accent + width: parent.width - 16 + + C.BacklightApplet { + width: parent.width + percent: S.BacklightService.percent + accentColor: root._accent + onSetPercent: pct => S.BacklightService.setPercent(pct) + } + } + + // Weather + D.DockCard { + visible: (root._applets.weather ?? true) && S.WeatherService.available + icon: S.WeatherService.icon + title: "Weather" + accentColor: root._accent + width: parent.width - 16 + + C.WeatherApplet { + width: parent.width + accentColor: root._accent + } + } + + // Now Playing + D.DockCard { + visible: (root._applets.mpris ?? true) && S.MprisService.player !== null + icon: "\uF04B" + title: "Now Playing" + accentColor: root._accent + width: parent.width - 16 + + C.MprisApplet { + width: parent.width + player: S.MprisService.player + players: S.MprisService.players + playing: S.MprisService.playing + accentColor: root._accent + playerIdx: S.MprisService.playerIdx + onPlayerSwitched: idx => S.MprisService.switchPlayer(idx) + } + } + + // Notifications + D.DockCard { + visible: root._applets.notifications ?? true + icon: "\uDB80\uDC9C" + title: "Notifications" + accentColor: root._accent + width: parent.width - 16 + + C.NotifApplet { + width: parent.width + contentWidth: root._dockWidth - 16 + accentColor: root._accent + } + } + + // Power + D.DockCard { + visible: root._applets.power ?? true + icon: "\uF011" + title: "Power" + accentColor: root._accent + width: parent.width - 16 + + C.PowerApplet { + width: parent.width + accentColor: root._accent + onRunCommand: cmd => { + _runner.command = cmd; + _runner.running = true; + } + onDismiss: D.DockState.close() + } + } + } + } + + // Shared resources + SystemClock { + id: _clock + precision: SystemClock.Seconds + } + + M.ProcessList { + id: _cpuProcs + sortBy: "cpu" + active: _cpuCard.expanded && D.DockState.open + } + + M.ProcessList { + id: _memProcs + sortBy: "mem" + active: _memCard.expanded && D.DockState.open + } + + PwObjectTracker { + objects: [Pipewire.defaultAudioSink, ...root._streamList] + } + + readonly property var _sinkList: { + const sinks = []; + if (Pipewire.nodes) { + for (const node of Pipewire.nodes.values) + if (!node.isStream && node.isSink) + sinks.push(node); + } + return sinks; + } + + readonly property var _streamList: { + const streams = []; + if (Pipewire.nodes) { + for (const node of Pipewire.nodes.values) + if (node.isStream && node.audio) + streams.push(node); + } + return streams; + } + + Process { + id: _runner + } +} diff --git a/shell/dock/DockCard.qml b/shell/dock/DockCard.qml new file mode 100644 index 0000000..5a496b9 --- /dev/null +++ b/shell/dock/DockCard.qml @@ -0,0 +1,100 @@ +import QtQuick +import "../services" as S + +// Collapsible card for the applet dock. +// Set icon, title, and place applet content as children. +Rectangle { + id: root + + property string icon: "" + property string title: "" + property bool expanded: false + property color accentColor: S.Theme.base0C + + default property alias content: _contentColumn.children + + width: parent?.width ?? 300 + height: _header.height + (_contentColumn.visible ? _contentColumn.height : 0) + radius: S.Theme.radius + 2 + color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7) + border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3) + border.width: 1 + clip: true + + Behavior on height { + enabled: !S.Theme.reducedMotion + NumberAnimation { + duration: 150 + easing.type: Easing.OutCubic + } + } + + // Header + Item { + id: _header + width: parent.width + height: 28 + + Text { + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.verticalCenter: parent.verticalCenter + text: root.icon + color: root.accentColor + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + } + + Text { + anchors.left: parent.left + anchors.leftMargin: 30 + anchors.verticalCenter: parent.verticalCenter + text: root.title + color: S.Theme.base05 + font.pixelSize: S.Theme.fontSize - 1 + font.bold: true + font.family: S.Theme.fontFamily + } + + Text { + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.verticalCenter: parent.verticalCenter + text: root.expanded ? "\uF078" : "\uF054" + color: S.Theme.base04 + font.pixelSize: S.Theme.fontSize - 2 + font.family: S.Theme.iconFontFamily + + Behavior on text { + enabled: false + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: root.expanded = !root.expanded + } + + // Divider + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: S.Theme.base03 + opacity: root.expanded ? 0.5 : 0 + } + } + + // Content area + Column { + id: _contentColumn + anchors.top: _header.bottom + anchors.topMargin: 4 + width: parent.width + visible: root.expanded + } +} diff --git a/shell/dock/DockEdgeTrigger.qml b/shell/dock/DockEdgeTrigger.qml new file mode 100644 index 0000000..2e5172b --- /dev/null +++ b/shell/dock/DockEdgeTrigger.qml @@ -0,0 +1,32 @@ +import QtQuick +import Quickshell +import Quickshell.Wayland +import "." as D + +// Invisible 2px-wide PanelWindow at the right screen edge. +// When cursor enters, opens the dock in overlay mode. +PanelWindow { + id: root + + required property var screen + + visible: !D.DockState.open + color: "transparent" + + WlrLayershell.layer: WlrLayer.Overlay + WlrLayershell.exclusiveZone: 0 + WlrLayershell.namespace: "nova-dock-trigger" + + anchors.top: true + anchors.right: true + anchors.bottom: true + + implicitWidth: 2 + + HoverHandler { + onHoveredChanged: { + if (hovered && !D.DockState.open) + D.DockState.openOverlay(); + } + } +} diff --git a/shell/dock/DockState.qml b/shell/dock/DockState.qml new file mode 100644 index 0000000..917decc --- /dev/null +++ b/shell/dock/DockState.qml @@ -0,0 +1,29 @@ +pragma Singleton + +import QtQuick + +QtObject { + // "closed" | "pinned" | "overlay" + property string mode: "closed" + readonly property bool open: mode !== "closed" + + function openPinned() { + mode = "pinned"; + } + + function openOverlay() { + if (mode === "closed") + mode = "overlay"; + } + + function close() { + mode = "closed"; + } + + function toggle() { + if (mode === "pinned") + mode = "closed"; + else + mode = "pinned"; + } +} diff --git a/shell/dock/qmldir b/shell/dock/qmldir new file mode 100644 index 0000000..776b954 --- /dev/null +++ b/shell/dock/qmldir @@ -0,0 +1,7 @@ +module dock +# keep-sorted start +AppletDock 1.0 AppletDock.qml +DockCard 1.0 DockCard.qml +DockEdgeTrigger 1.0 DockEdgeTrigger.qml +singleton DockState 1.0 DockState.qml +# keep-sorted end diff --git a/shell/modules/Bar.qml b/shell/modules/Bar.qml index d7a2c9b..2ea685c 100644 --- a/shell/modules/Bar.qml +++ b/shell/modules/Bar.qml @@ -216,10 +216,13 @@ PanelWindow { } } - // Power + // Power + Dock M.BarGroup { rightEdge: true M.BatteryModule {} + M.DockModule { + visible: S.Modules.dock.enable + } M.PowerModule { visible: S.Modules.power.enable } diff --git a/shell/modules/DockModule.qml b/shell/modules/DockModule.qml new file mode 100644 index 0000000..75ee6bf --- /dev/null +++ b/shell/modules/DockModule.qml @@ -0,0 +1,15 @@ +import QtQuick +import "." as M +import "../services" as S +import "../dock" as D + +M.BarModule { + id: root + tooltip: D.DockState.open ? "Close dock" : "Open dock" + onTapped: D.DockState.toggle() + + M.BarIcon { + icon: D.DockState.open ? "\uDB80\uDD8B" : "\uDB80\uDD89" + anchors.verticalCenter: parent.verticalCenter + } +} diff --git a/shell/modules/qmldir b/shell/modules/qmldir index 33d7e9f..09884ca 100644 --- a/shell/modules/qmldir +++ b/shell/modules/qmldir @@ -12,6 +12,7 @@ BluetoothModule 1.0 BluetoothModule.qml ClockModule 1.0 ClockModule.qml CpuModule 1.0 CpuModule.qml DiskModule 1.0 DiskModule.qml +DockModule 1.0 DockModule.qml GpuModule 1.0 GpuModule.qml HoverPanel 1.0 HoverPanel.qml IdleInhibitorModule 1.0 IdleInhibitorModule.qml diff --git a/shell/services/Modules.qml b/shell/services/Modules.qml index 2f1bedc..114ae0c 100644 --- a/shell/services/Modules.qml +++ b/shell/services/Modules.qml @@ -104,13 +104,34 @@ QtObject { weather: true, threatEffect: true }) + property var dock: ({ + enable: true, + width: 300, + applets: { + clock: true, + cpu: true, + gpu: true, + memory: true, + temperature: true, + disk: true, + battery: true, + network: true, + bluetooth: true, + volume: true, + backlight: true, + weather: true, + mpris: true, + notifications: true, + power: true + } + }) property var statsDaemon: ({ interval: -1 }) // All module keys that have an enable flag — used to default-enable anything // not explicitly mentioned in modules.json - readonly property var _moduleKeys: ["workspaces", "tray", "windowTitle", "clock", "notifications", "mpris", "volume", "bluetooth", "backlight", "network", "powerProfile", "idleInhibitor", "weather", "temperature", "gpu", "cpu", "memory", "disk", "battery", "privacy", "screenCorners", "power", "backgroundOverlay", "overviewBackdrop", "lock"] + readonly property var _moduleKeys: ["workspaces", "tray", "windowTitle", "clock", "notifications", "mpris", "volume", "bluetooth", "backlight", "network", "powerProfile", "idleInhibitor", "weather", "temperature", "gpu", "cpu", "memory", "disk", "battery", "privacy", "screenCorners", "power", "backgroundOverlay", "overviewBackdrop", "lock", "dock"] // Fallback: if modules.json doesn't exist, enable everything Component.onCompleted: _apply("{}") diff --git a/shell/shell.qml b/shell/shell.qml index 032703f..5c6411a 100644 --- a/shell/shell.qml +++ b/shell/shell.qml @@ -2,6 +2,7 @@ import "modules" import "services" +import "dock" as Dock import "lock" as Lock import Quickshell @@ -57,6 +58,20 @@ ShellRoot { screen: scope.modelData } } + + LazyLoader { + active: Modules.dock.enable + Dock.AppletDock { + screen: scope.modelData + } + } + + LazyLoader { + active: Modules.dock.enable + Dock.DockEdgeTrigger { + screen: scope.modelData + } + } } } } diff --git a/test/qmllint-baseline.txt b/test/qmllint-baseline.txt index 5f0a711..94cace1 100644 --- a/test/qmllint-baseline.txt +++ b/test/qmllint-baseline.txt @@ -2,8 +2,8 @@ shell/applets/BluetoothApplet.qml: Unqualified access [unqualified] shell/applets/ClockApplet.qml: Unqualified access [unqualified] shell/applets/CpuApplet.qml: Member "_barColor" not found on type "QQuickItem" [missing-property] shell/applets/CpuApplet.qml: Member "_f" not found on type "QQuickItem" [missing-property] -shell/applets/CpuApplet.qml: Member "_throttled" not found on type "QQuickItem" [missing-property] shell/applets/CpuApplet.qml: Member "index" not found on type "QQuickItem" [missing-property] +shell/applets/CpuApplet.qml: Member "_throttled" not found on type "QQuickItem" [missing-property] shell/applets/CpuApplet.qml: Unqualified access [unqualified] shell/applets/DiskApplet.qml: Unqualified access [unqualified] shell/applets/MemoryApplet.qml: Unqualified access [unqualified] @@ -14,14 +14,17 @@ shell/applets/NetworkApplet.qml: Unqualified access [unqualified] shell/applets/NotifApplet.qml: Member "_notif" not found on type "QQuickItem" [missing-property] shell/applets/NotifApplet.qml: Member "_type" not found on type "QQuickItem" [missing-property] shell/applets/NotifApplet.qml: Unqualified access [unqualified] +shell/applets/PowerApplet.qml: Unqualified access [unqualified] shell/applets/TemperatureApplet.qml: Unqualified access [unqualified] shell/applets/VolumeApplet.qml: Unqualified access [unqualified] -shell/lock/Lock.qml: Unqualified access [unqualified] +shell/dock/AppletDock.qml: Member "expanded" not found on type "QQuickItem" [missing-property] +shell/dock/AppletDock.qml: Type PanelWindow is not creatable. [uncreatable-type] +shell/dock/DockEdgeTrigger.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/lock/LockAuth.qml: Unqualified access [unqualified] +shell/lock/Lock.qml: Unqualified access [unqualified] shell/lock/LockSurface.qml: Unqualified access [unqualified] shell/modules/BackgroundOverlay.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/BacklightModule.qml: Unqualified access [unqualified] -shell/modules/Bar.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/BarGroup.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/BarGroup.qml: Unqualified access [unqualified] shell/modules/BarIcon.qml: Member "accentColor" not found on type "QQuickItem" [missing-property] @@ -30,6 +33,7 @@ shell/modules/BarModule.qml: Member "accentColor" not found on type "QQuickItem" shell/modules/BarModule.qml: Member "keepOpen" not found on type "QObject" [missing-property] shell/modules/BarModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/BarModule.qml: Unqualified access [unqualified] +shell/modules/Bar.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/BatteryModule.qml: Unqualified access [unqualified] shell/modules/BluetoothModule.qml: Unqualified access [unqualified] shell/modules/ClockModule.qml: Unqualified access [unqualified] @@ -37,22 +41,21 @@ shell/modules/CpuModule.qml: Unqualified access [unqualified] shell/modules/DiskModule.qml: Unqualified access [unqualified] shell/modules/GpuModule.qml: Unqualified access [unqualified] shell/modules/HoverPanel.qml: Could not find property "top". [missing-property] -shell/modules/HoverPanel.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/HoverPanel.qml: Type margins is used but it is not resolved [unresolved-type] +shell/modules/HoverPanel.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/HoverPanel.qml: unknown grouped property scope margins. [unqualified] shell/modules/MemoryModule.qml: Unqualified access [unqualified] shell/modules/MprisModule.qml: Unqualified access [unqualified] shell/modules/NetworkModule.qml: Unqualified access [unqualified] shell/modules/NotifCard.qml: Unqualified access [unqualified] +shell/modules/NotificationsModule.qml: Unqualified access [unqualified] shell/modules/NotifPopup.qml: Could not find property "right". [missing-property] shell/modules/NotifPopup.qml: Could not find property "top". [missing-property] -shell/modules/NotifPopup.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/NotifPopup.qml: Type margins is used but it is not resolved [unresolved-type] -shell/modules/NotifPopup.qml: Unqualified access [unqualified] +shell/modules/NotifPopup.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/NotifPopup.qml: unknown grouped property scope margins. [unqualified] -shell/modules/NotificationsModule.qml: Unqualified access [unqualified] +shell/modules/NotifPopup.qml: Unqualified access [unqualified] shell/modules/OverviewBackdrop.qml: Type PanelWindow is not creatable. [uncreatable-type] -shell/applets/PowerApplet.qml: Unqualified access [unqualified] shell/modules/PowerModule.qml: Unqualified access [unqualified] shell/modules/ScreenCapture.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/ScreenCorners.qml: Type PanelWindow is not creatable. [uncreatable-type] @@ -61,8 +64,8 @@ shell/modules/TemperatureModule.qml: Unqualified access [unqualified] shell/modules/ThemedIcon.qml: Unqualified access [unqualified] shell/modules/Tooltip.qml: Could not find property "left". [missing-property] shell/modules/Tooltip.qml: Could not find property "top". [missing-property] -shell/modules/Tooltip.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/Tooltip.qml: Type margins is used but it is not resolved [unresolved-type] +shell/modules/Tooltip.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/Tooltip.qml: unknown grouped property scope margins. [unqualified] shell/modules/TrayMenu.qml: Unqualified access [unqualified] shell/modules/TrayModule.qml: Member "screen" not found on type "QObject" [missing-property]