diff --git a/flake.nix b/flake.nix index 955fbaf..6ca5807 100644 --- a/flake.nix +++ b/flake.nix @@ -87,6 +87,31 @@ --add-flags "-p ${nova-shell}/share/nova-shell/shell.qml" ''; docs = pkgs.callPackage ./nix/docs.nix { inherit self; }; + + # Raw qmllint warnings for baseline regeneration (never fails) + qmllint-warnings = + rawPkgs.runCommand "nova-shell-qmllint-warnings" + { + nativeBuildInputs = [ rawPkgs.qt6.qtdeclarative ]; + src = self; + } + '' + cd $src + export QML_IMPORT_PATH="${rawPkgs.qt6.qtdeclarative}/lib/qt-6/qml:${ + quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default + }/lib/qt-6/qml" + qmllint -E \ + -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/dock/*.qml shell/lock/*.qml \ + > $TMPDIR/raw.txt 2>&1 || true + + mkdir -p $out + grep -E "^Warning:" $TMPDIR/raw.txt \ + | sed 's/^Warning: //' \ + | sed 's/\([^:]*\):[0-9]*:[0-9]*: /\1: /' \ + | sort -u > $out/current.txt + ''; default = nova-shell; # nova-shell on unpatched Qt for A/B crash testing @@ -134,47 +159,32 @@ nova-stats = self.packages.${pkgs.stdenv.hostPlatform.system}.nova-stats; docs = self.packages.${pkgs.stdenv.hostPlatform.system}.docs; qmllint = + let + warnings = self.packages.${pkgs.stdenv.hostPlatform.system}.qmllint-warnings; + in rawPkgs.runCommand "nova-shell-qmllint" { - nativeBuildInputs = [ rawPkgs.qt6.qtdeclarative ]; src = self; } '' - cd $src - export QML_IMPORT_PATH="${rawPkgs.qt6.qtdeclarative}/lib/qt-6/qml:${ - quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default - }/lib/qt-6/qml" - qmllint -E \ - -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/dock/*.qml shell/lock/*.qml \ - > $TMPDIR/raw.txt 2>&1 || true - - # Extract unique warning messages (file:message, without line numbers) - grep -E "^Warning:" $TMPDIR/raw.txt \ - | sed 's/^Warning: //' \ - | sed 's/\([^:]*\):[0-9]*:[0-9]*: /\1: /' \ - | sort -u > $TMPDIR/current.txt - - # Compare against baseline + # Compare current warnings against baseline touch $TMPDIR/new-warnings.txt $TMPDIR/stale-warnings.txt while IFS= read -r line; do - if ! grep -qFx "$line" test/qmllint-baseline.txt 2>/dev/null; then + if ! grep -qFx "$line" $src/test/qmllint-baseline.txt 2>/dev/null; then echo "$line" >> $TMPDIR/new-warnings.txt fi - done < $TMPDIR/current.txt + done < ${warnings}/current.txt while IFS= read -r line; do - if ! grep -qFx "$line" $TMPDIR/current.txt; then + [ -z "$line" ] && continue + if ! grep -qFx "$line" ${warnings}/current.txt; then echo "$line" >> $TMPDIR/stale-warnings.txt fi - done < test/qmllint-baseline.txt + done < $src/test/qmllint-baseline.txt - # Output dir with individual files for inspection mkdir -p $out - cp $TMPDIR/raw.txt $out/raw.txt - cp $TMPDIR/current.txt $out/current.txt - cp test/qmllint-baseline.txt $out/baseline.txt + cp ${warnings}/current.txt $out/current.txt + cp $src/test/qmllint-baseline.txt $out/baseline.txt cp $TMPDIR/new-warnings.txt $out/new-warnings.txt cp $TMPDIR/stale-warnings.txt $out/stale-warnings.txt diff --git a/shell/applets/AppletActionBar.qml b/shell/applets/AppletActionBar.qml new file mode 100644 index 0000000..0852a51 --- /dev/null +++ b/shell/applets/AppletActionBar.qml @@ -0,0 +1,31 @@ +import QtQuick +import "../services" as S + +// Action bar for applet-level controls (power toggles, DND, clear-all, etc.) +// Place at the top of an applet Column. Children are right-aligned action buttons. +Item { + id: root + + default property alias actions: _row.children + required property color accentColor + + width: parent?.width ?? 0 + height: 24 + + Row { + id: _row + anchors.right: parent.right + anchors.rightMargin: 4 + anchors.verticalCenter: parent.verticalCenter + spacing: 8 + layoutDirection: Qt.RightToLeft + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 1 + color: S.Theme.base03 + } +} diff --git a/shell/applets/BluetoothApplet.qml b/shell/applets/BluetoothApplet.qml index bc6c4cc..4fb5c43 100644 --- a/shell/applets/BluetoothApplet.qml +++ b/shell/applets/BluetoothApplet.qml @@ -9,6 +9,37 @@ Column { onActiveChanged: if (active) S.BluetoothService.refresh() + AppletActionBar { + accentColor: root.accentColor + + Item { + width: 20 + height: 20 + + Text { + anchors.centerIn: parent + text: "\uF011" + color: S.BluetoothService.enabled ? root.accentColor : S.Theme.base04 + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + + Behavior on color { + ColorAnimation { + duration: 100 + } + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: S.BluetoothService.setPower(!S.BluetoothService.enabled) + } + } + } + Repeater { model: S.BluetoothService.devices diff --git a/shell/applets/NetworkApplet.qml b/shell/applets/NetworkApplet.qml index 749d950..3849f42 100644 --- a/shell/applets/NetworkApplet.qml +++ b/shell/applets/NetworkApplet.qml @@ -9,6 +9,37 @@ Column { onActiveChanged: if (active) S.NetworkService.refresh() + AppletActionBar { + accentColor: root.accentColor + + Item { + width: 20 + height: 20 + + Text { + anchors.centerIn: parent + text: "\uF011" + color: S.NetworkService.wifiEnabled ? root.accentColor : S.Theme.base04 + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + + Behavior on color { + ColorAnimation { + duration: 100 + } + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: S.NetworkService.setWifi(!S.NetworkService.wifiEnabled) + } + } + } + Repeater { model: S.NetworkService.networks diff --git a/shell/applets/NotifApplet.qml b/shell/applets/NotifApplet.qml index 7454b1f..4973434 100644 --- a/shell/applets/NotifApplet.qml +++ b/shell/applets/NotifApplet.qml @@ -13,6 +13,42 @@ Column { _cascadeDismiss(); } + AppletActionBar { + accentColor: root.accentColor + + // Clear all + Text { + text: "\uF1F8" + color: _clearHover.hovered ? S.Theme.base08 : S.Theme.base04 + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + visible: S.NotifService.count > 0 + + HoverHandler { + id: _clearHover + cursorShape: Qt.PointingHandCursor + } + TapHandler { + onTapped: root.cascadeDismiss() + } + } + + // DND toggle + Text { + text: S.NotifService.dnd ? "\uDB82\uDE93" : "\uDB80\uDC9C" + color: S.NotifService.dnd ? S.Theme.base09 : S.Theme.base04 + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + TapHandler { + onTapped: S.NotifService.toggleDnd() + } + } + } + // ── Cascade dismiss logic ─────────────────────────────────────────── property var _pendingDismissIds: [] property var _collapsedGroups: ({}) diff --git a/shell/applets/qmldir b/shell/applets/qmldir index a9935e7..35bd132 100644 --- a/shell/applets/qmldir +++ b/shell/applets/qmldir @@ -1,5 +1,6 @@ module applets # keep-sorted start +AppletActionBar 1.0 AppletActionBar.qml BacklightApplet 1.0 BacklightApplet.qml BatteryApplet 1.0 BatteryApplet.qml ClockApplet 1.0 ClockApplet.qml diff --git a/shell/modules/BacklightModule.qml b/shell/modules/BacklightModule.qml index ec14bd0..00d8c91 100644 --- a/shell/modules/BacklightModule.qml +++ b/shell/modules/BacklightModule.qml @@ -10,7 +10,6 @@ M.BarModule { active: S.Modules.backlight.enable && S.BacklightService.available tooltip: "Brightness: " + percent + "%" panelNamespace: "nova-backlight" - panelTitle: "Brightness" panelContentWidth: 200 panelComponent: Component { C.BacklightApplet { diff --git a/shell/modules/BarModule.qml b/shell/modules/BarModule.qml index d5e3a42..f8282a7 100644 --- a/shell/modules/BarModule.qml +++ b/shell/modules/BarModule.qml @@ -30,10 +30,8 @@ Row { // Panel configuration - set by modules that have applets property Component panelComponent: null - property string panelTitle: "" property string panelNamespace: "nova-panel" property real panelContentWidth: 220 - property Component titleActionsComponent: null signal tapped @@ -108,9 +106,7 @@ Row { anchorItem: root accentColor: root.accentColor panelNamespace: root.panelNamespace - panelTitle: root.panelTitle contentWidth: root.panelContentWidth - titleActionsComponent: root.titleActionsComponent onDismissed: root.dismissPanel() Loader { diff --git a/shell/modules/BatteryModule.qml b/shell/modules/BatteryModule.qml index 7311f83..d3b81c7 100644 --- a/shell/modules/BatteryModule.qml +++ b/shell/modules/BatteryModule.qml @@ -10,7 +10,6 @@ M.BarModule { active: S.Modules.battery.enable && S.BatteryService.available tooltip: "Battery: " + Math.round(S.BatteryService.percent) + "%" + (S.BatteryService.charging ? " (charging)" : "") panelNamespace: "nova-battery" - panelTitle: "Battery" panelContentWidth: 240 panelComponent: Component { C.BatteryApplet { diff --git a/shell/modules/BluetoothModule.qml b/shell/modules/BluetoothModule.qml index 222e023..4045296 100644 --- a/shell/modules/BluetoothModule.qml +++ b/shell/modules/BluetoothModule.qml @@ -16,36 +16,7 @@ M.BarModule { return "Bluetooth: on"; } panelNamespace: "nova-bluetooth" - panelTitle: "Bluetooth" panelContentWidth: 250 - titleActionsComponent: Component { - Item { - width: 20 - height: 20 - - Text { - anchors.centerIn: parent - text: "\uF011" - color: S.BluetoothService.enabled ? root.accentColor : S.Theme.base04 - font.pixelSize: S.Theme.fontSize - font.family: S.Theme.iconFontFamily - - Behavior on color { - ColorAnimation { - duration: 100 - } - } - } - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - onTapped: S.BluetoothService.setPower(!S.BluetoothService.enabled) - } - } - } panelComponent: Component { C.BluetoothApplet { width: parent.width diff --git a/shell/modules/ClockModule.qml b/shell/modules/ClockModule.qml index d8679a4..6250ae9 100644 --- a/shell/modules/ClockModule.qml +++ b/shell/modules/ClockModule.qml @@ -10,7 +10,6 @@ M.BarModule { spacing: S.Theme.moduleSpacing tooltip: Qt.formatDateTime(clock.date, "dddd, dd. MMMM yyyy") panelNamespace: "nova-clock" - panelTitle: Qt.formatTime(clock.date, "HH:mm:ss") panelContentWidth: 220 panelComponent: Component { C.ClockApplet { diff --git a/shell/modules/CpuModule.qml b/shell/modules/CpuModule.qml index 580862d..5290486 100644 --- a/shell/modules/CpuModule.qml +++ b/shell/modules/CpuModule.qml @@ -10,7 +10,6 @@ M.BarModule { spacing: Math.max(1, S.Theme.moduleSpacing - 2) tooltip: "CPU: " + S.SystemStats.cpuUsage + "% @ " + S.SystemStats.cpuFreqGhz.toFixed(2) + " GHz" panelNamespace: "nova-cpu" - panelTitle: "CPU" panelContentWidth: 260 panelComponent: Component { C.CpuApplet { diff --git a/shell/modules/DiskModule.qml b/shell/modules/DiskModule.qml index fb000e4..33a99db 100644 --- a/shell/modules/DiskModule.qml +++ b/shell/modules/DiskModule.qml @@ -10,7 +10,6 @@ M.BarModule { spacing: Math.max(1, S.Theme.moduleSpacing - 2) tooltip: "Disk: " + _rootPct + "% used" panelNamespace: "nova-disk" - panelTitle: "Disk" panelContentWidth: 260 panelComponent: Component { C.DiskApplet { diff --git a/shell/modules/GpuModule.qml b/shell/modules/GpuModule.qml index 65028e4..af90e1f 100644 --- a/shell/modules/GpuModule.qml +++ b/shell/modules/GpuModule.qml @@ -10,7 +10,6 @@ M.BarModule { active: S.Modules.gpu.enable && S.SystemStats.gpuAvailable tooltip: "GPU: " + S.SystemStats.gpuUsage + "%" panelNamespace: "nova-gpu" - panelTitle: "GPU" panelContentWidth: 240 panelComponent: Component { C.GpuApplet { diff --git a/shell/modules/HoverPanel.qml b/shell/modules/HoverPanel.qml index c6b6894..b8d2854 100644 --- a/shell/modules/HoverPanel.qml +++ b/shell/modules/HoverPanel.qml @@ -14,12 +14,9 @@ PanelWindow { property bool showPanel: false property Item anchorItem: null - property real anchorX: -1 signal dismissed required property color accentColor - property string panelTitle: "" - property Component titleActionsComponent: null property string panelNamespace: "nova-panel" property real contentWidth: 220 @@ -50,8 +47,6 @@ PanelWindow { if (root.anchorItem) { const pt = root.anchorItem.mapToGlobal(root.anchorItem.width / 2, 0); cx = pt.x - (scr?.x ?? 0); - } else if (root.anchorX >= 0) { - cx = root.anchorX; } else { cx = sw / 2; } @@ -206,42 +201,6 @@ PanelWindow { id: _panelColumn width: root.contentWidth - // Header row: title + action buttons - Item { - id: _headerItem - visible: root.panelTitle !== "" || root.titleActionsComponent !== null - width: parent.width - height: 24 - - Text { - visible: root.panelTitle !== "" - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root.panelTitle - color: root.accentColor - font.pixelSize: S.Theme.fontSize - 1 - font.bold: true - font.family: S.Theme.fontFamily - } - - Loader { - id: _titleActionsLoader - anchors.right: parent.right - anchors.rightMargin: 4 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: root.titleActionsComponent - } - - Rectangle { - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - height: 1 - color: S.Theme.base03 - } - } - Flickable { id: _flickable width: parent.width @@ -250,7 +209,7 @@ PanelWindow { clip: contentHeight > height boundsBehavior: Flickable.StopAtBounds - readonly property real _maxContentHeight: (root.screen?.height ?? 1080) * 0.6 - (_headerItem.visible ? _headerItem.height : 0) + readonly property real _maxContentHeight: (root.screen?.height ?? 1080) * 0.6 Column { id: panelContent diff --git a/shell/modules/MemoryModule.qml b/shell/modules/MemoryModule.qml index c3959f9..5eb3df8 100644 --- a/shell/modules/MemoryModule.qml +++ b/shell/modules/MemoryModule.qml @@ -10,7 +10,6 @@ M.BarModule { spacing: Math.max(1, S.Theme.moduleSpacing - 2) tooltip: "Memory: " + usedGb.toFixed(1) + " / " + totalGb.toFixed(1) + " GB" panelNamespace: "nova-memory" - panelTitle: "Memory" panelContentWidth: 240 panelComponent: Component { C.MemoryApplet { diff --git a/shell/modules/MprisModule.qml b/shell/modules/MprisModule.qml index 7a46d7c..beb11d8 100644 --- a/shell/modules/MprisModule.qml +++ b/shell/modules/MprisModule.qml @@ -12,7 +12,6 @@ M.BarModule { active: S.Modules.mpris.enable && S.MprisService.player !== null tooltip: S.MprisService.player ? (S.MprisService.player.trackTitle || S.MprisService.player.identity || "Media") + (S.MprisService.playing ? " (playing)" : " (paused)") : "Media" panelNamespace: "nova-mpris" - panelTitle: "Now Playing" panelContentWidth: 280 panelComponent: Component { C.MprisApplet { diff --git a/shell/modules/NetworkModule.qml b/shell/modules/NetworkModule.qml index b3b9d1c..2c8e4f5 100644 --- a/shell/modules/NetworkModule.qml +++ b/shell/modules/NetworkModule.qml @@ -18,36 +18,7 @@ M.BarModule { return "Network: disconnected"; } panelNamespace: "nova-network" - panelTitle: "Wi-Fi" panelContentWidth: 250 - titleActionsComponent: Component { - Item { - width: 20 - height: 20 - - Text { - anchors.centerIn: parent - text: "\uF011" - color: S.NetworkService.wifiEnabled ? root.accentColor : S.Theme.base04 - font.pixelSize: S.Theme.fontSize - font.family: S.Theme.iconFontFamily - - Behavior on color { - ColorAnimation { - duration: 100 - } - } - } - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - onTapped: S.NetworkService.setWifi(!S.NetworkService.wifiEnabled) - } - } - } panelComponent: Component { C.NetworkApplet { width: parent.width diff --git a/shell/modules/NotificationsModule.qml b/shell/modules/NotificationsModule.qml index c625c6b..16a097f 100644 --- a/shell/modules/NotificationsModule.qml +++ b/shell/modules/NotificationsModule.qml @@ -11,60 +11,15 @@ M.BarModule { spacing: S.Theme.moduleSpacing tooltip: S.NotifService.count > 0 ? "Notifications: " + S.NotifService.count + (S.NotifService.dnd ? " (DND)" : "") : (S.NotifService.dnd ? "Do not disturb" : "No notifications") panelNamespace: "nova-notifications" - panelTitle: "Notifications" panelContentWidth: 350 - titleActionsComponent: Component { - Row { - spacing: 8 - - // DND toggle - Text { - text: S.NotifService.dnd ? "\uDB82\uDE93" : "\uDB80\uDC9C" - color: S.NotifService.dnd ? S.Theme.base09 : S.Theme.base04 - font.pixelSize: S.Theme.fontSize - font.family: S.Theme.iconFontFamily - anchors.verticalCenter: parent.verticalCenter - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - TapHandler { - onTapped: S.NotifService.toggleDnd() - } - } - - // Clear all - Text { - text: "\uF1F8" - color: _clearHover.hovered ? S.Theme.base08 : S.Theme.base04 - font.pixelSize: S.Theme.fontSize - font.family: S.Theme.iconFontFamily - anchors.verticalCenter: parent.verticalCenter - visible: S.NotifService.count > 0 - - HoverHandler { - id: _clearHover - cursorShape: Qt.PointingHandCursor - } - TapHandler { - onTapped: if (root._notifApplet) - root._notifApplet.cascadeDismiss() - } - } - } - } panelComponent: Component { C.NotifApplet { width: parent.width contentWidth: root.panelContentWidth accentColor: root.accentColor - Component.onCompleted: root._notifApplet = this - Component.onDestruction: root._notifApplet = null } } - property var _notifApplet: null - readonly property bool hasUrgent: S.NotifService.list.some(n => n.urgency === NotificationUrgency.Critical && n.state !== "dismissed") M.BarIcon { diff --git a/shell/modules/PowerModule.qml b/shell/modules/PowerModule.qml index 11b0294..0030520 100644 --- a/shell/modules/PowerModule.qml +++ b/shell/modules/PowerModule.qml @@ -10,7 +10,6 @@ M.BarModule { active: S.Modules.power.enable tooltip: "Power menu" panelNamespace: "nova-power" - panelTitle: "Power" panelContentWidth: 180 panelComponent: Component { C.PowerApplet { diff --git a/shell/modules/TemperatureModule.qml b/shell/modules/TemperatureModule.qml index 657c64b..9c27429 100644 --- a/shell/modules/TemperatureModule.qml +++ b/shell/modules/TemperatureModule.qml @@ -10,7 +10,6 @@ M.BarModule { spacing: Math.max(1, S.Theme.moduleSpacing - 2) tooltip: "Temperature: " + _temp + "\u00B0C" panelNamespace: "nova-temperature" - panelTitle: "Temperature" panelContentWidth: 220 panelComponent: Component { C.TemperatureApplet { diff --git a/shell/modules/TrayModule.qml b/shell/modules/TrayModule.qml index 7d6e3fa..81c8af8 100644 --- a/shell/modules/TrayModule.qml +++ b/shell/modules/TrayModule.qml @@ -100,7 +100,7 @@ M.BarModule { accentColor: root.accentColor handle: iconItem.modelData.menu screen: QsWindow.window?.screen ?? null - anchorX: iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0) + anchorItem: iconItem onDismissed: { menuLoader.active = false; root._activeMenu = null; diff --git a/shell/modules/VolumeModule.qml b/shell/modules/VolumeModule.qml index 6a16e4f..de11e0a 100644 --- a/shell/modules/VolumeModule.qml +++ b/shell/modules/VolumeModule.qml @@ -11,7 +11,6 @@ M.BarModule { spacing: S.Theme.moduleSpacing tooltip: "Volume: " + Math.round(volume * 100) + "%" + (muted ? " (muted)" : "") panelNamespace: "nova-volume" - panelTitle: "Sound" panelContentWidth: 220 panelComponent: Component { C.VolumeApplet { diff --git a/shell/modules/WeatherModule.qml b/shell/modules/WeatherModule.qml index 94c0187..a682025 100644 --- a/shell/modules/WeatherModule.qml +++ b/shell/modules/WeatherModule.qml @@ -10,7 +10,6 @@ M.BarModule { active: S.Modules.weather.enable && S.WeatherService.available tooltip: "Weather" panelNamespace: "nova-weather" - panelTitle: "Weather" panelContentWidth: 280 panelComponent: Component { C.WeatherApplet { diff --git a/test/qmllint-baseline.txt b/test/qmllint-baseline.txt index fc7df71..ff9ca29 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 "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: Member "index" 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] @@ -18,15 +18,19 @@ shell/applets/PowerApplet.qml: Unqualified access [unqualified] shell/applets/TemperatureApplet.qml: Unqualified access [unqualified] shell/applets/VolumeApplet.qml: Unqualified access [unqualified] shell/dock/AppletDock.qml: Could not find property "top". [missing-property] -shell/dock/AppletDock.qml: Type margins is used but it is not resolved [unresolved-type] shell/dock/AppletDock.qml: Type PanelWindow is not creatable. [uncreatable-type] +shell/dock/AppletDock.qml: Type margins is used but it is not resolved [unresolved-type] shell/dock/AppletDock.qml: unknown grouped property scope margins. [unqualified] 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/LockAuth.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: Could not find property "right". [missing-property] +shell/modules/Bar.qml: Type PanelWindow is not creatable. [uncreatable-type] +shell/modules/Bar.qml: Type margins is used but it is not resolved [unresolved-type] +shell/modules/Bar.qml: unknown grouped property scope margins. [unqualified] 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] @@ -35,10 +39,6 @@ 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: Could not find property "right". [missing-property] -shell/modules/Bar.qml: Type margins is used but it is not resolved [unresolved-type] -shell/modules/Bar.qml: Type PanelWindow is not creatable. [uncreatable-type] -shell/modules/Bar.qml: unknown grouped property scope margins. [unqualified] shell/modules/BatteryModule.qml: Unqualified access [unqualified] shell/modules/BluetoothModule.qml: Unqualified access [unqualified] shell/modules/ClockModule.qml: Unqualified access [unqualified] @@ -46,34 +46,34 @@ 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 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: Type margins is used but it is not resolved [unresolved-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 margins is used but it is not resolved [unresolved-type] shell/modules/NotifPopup.qml: Type PanelWindow is not creatable. [uncreatable-type] -shell/modules/NotifPopup.qml: unknown grouped property scope margins. [unqualified] +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: unknown grouped property scope margins. [unqualified] +shell/modules/NotificationsModule.qml: Unqualified access [unqualified] shell/modules/OverviewBackdrop.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/PowerModule.qml: Unqualified access [unqualified] shell/modules/ScreenCapture.qml: Type PanelWindow is not creatable. [uncreatable-type] shell/modules/ScreenCorners.qml: Could not find property "right". [missing-property] -shell/modules/ScreenCorners.qml: Type margins is used but it is not resolved [unresolved-type] shell/modules/ScreenCorners.qml: Type PanelWindow is not creatable. [uncreatable-type] -shell/modules/ScreenCorners.qml: unknown grouped property scope margins. [unqualified] +shell/modules/ScreenCorners.qml: Type margins is used but it is not resolved [unresolved-type] shell/modules/ScreenCorners.qml: Unqualified access [unqualified] +shell/modules/ScreenCorners.qml: unknown grouped property scope margins. [unqualified] 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 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: Type margins is used but it is not resolved [unresolved-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] diff --git a/test/regen-qmllint-baseline.sh b/test/regen-qmllint-baseline.sh new file mode 100755 index 0000000..58cf919 --- /dev/null +++ b/test/regen-qmllint-baseline.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Regenerate qmllint baseline from current warnings. +set -euo pipefail +cd "$(git rev-parse --show-toplevel)" +git add -A +nix build .#qmllint-warnings -o /tmp/nova-qmllint-warnings +cp /tmp/nova-qmllint-warnings/current.txt test/qmllint-baseline.txt +rm /tmp/nova-qmllint-warnings +git add test/qmllint-baseline.txt +echo "Baseline regenerated ($(wc -l < test/qmllint-baseline.txt) entries)."