rename Flyout/FlyoutState to Tooltip/TooltipState, improve qmllint check script

This commit is contained in:
Damocles 2026-04-24 22:33:26 +02:00
parent 0c955f93f8
commit e5e15f82fb
12 changed files with 82 additions and 57 deletions

View file

@ -148,24 +148,49 @@
-I shell/modules -I shell/services -I shell/applets -I shell/lock \ -I shell/modules -I shell/services -I shell/applets -I shell/lock \
shell/shell.qml shell/modules/*.qml shell/services/*.qml \ shell/shell.qml shell/modules/*.qml shell/services/*.qml \
shell/applets/*.qml shell/lock/*.qml \ shell/applets/*.qml shell/lock/*.qml \
> $TMPDIR/output.txt 2>&1 || true > $TMPDIR/raw.txt 2>&1 || true
# Extract unique warning messages (file:message, without line numbers) # Extract unique warning messages (file:message, without line numbers)
grep -E "^Warning:" $TMPDIR/output.txt \ grep -E "^Warning:" $TMPDIR/raw.txt \
| sed 's/^Warning: //' \ | sed 's/^Warning: //' \
| sed 's/\([^:]*\):[0-9]*:[0-9]*: /\1: /' \ | sed 's/\([^:]*\):[0-9]*:[0-9]*: /\1: /' \
| sort -u > $TMPDIR/current.txt | sort -u > $TMPDIR/current.txt
# Diff against known baseline - new warnings = failure # Compare against baseline
if ! diff -u test/qmllint-baseline.txt $TMPDIR/current.txt > $TMPDIR/diff.txt 2>&1; then touch $TMPDIR/new-warnings.txt $TMPDIR/stale-warnings.txt
new=$(grep '^+[^+]' $TMPDIR/diff.txt || true) while IFS= read -r line; do
if [ -n "$new" ]; then if ! grep -qFx "$line" test/qmllint-baseline.txt 2>/dev/null; then
echo "qmllint found new warnings not in baseline:" echo "$line" >> $TMPDIR/new-warnings.txt
echo "$new"
exit 1
fi fi
done < $TMPDIR/current.txt
while IFS= read -r line; do
if ! grep -qFx "$line" $TMPDIR/current.txt; then
echo "$line" >> $TMPDIR/stale-warnings.txt
fi fi
cp $TMPDIR/output.txt $out done < 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 $TMPDIR/new-warnings.txt $out/new-warnings.txt
cp $TMPDIR/stale-warnings.txt $out/stale-warnings.txt
failed=0
if [ -s $TMPDIR/new-warnings.txt ]; then
echo "new warnings:"
sed 's/^/ /' $TMPDIR/new-warnings.txt
failed=1
fi
if [ -s $TMPDIR/stale-warnings.txt ]; then
echo "stale warnings:"
sed 's/^/ /' $TMPDIR/stale-warnings.txt
failed=1
fi
[ "$failed" -eq 0 ] || exit 1
''; '';
nova-stats-clippy = (pkgs.callPackage ./nix/stats-daemon.nix { }).overrideAttrs (old: { nova-stats-clippy = (pkgs.callPackage ./nix/stats-daemon.nix { }).overrideAttrs (old: {
pname = "nova-stats-clippy"; pname = "nova-stats-clippy";

View file

@ -60,17 +60,17 @@ Text {
onHoveredChanged: { onHoveredChanged: {
root._hovered = hovered; root._hovered = hovered;
if (hovered && root.tooltip !== "") { if (hovered && root.tooltip !== "") {
M.FlyoutState.text = root.tooltip; M.TooltipState.text = root.tooltip;
M.FlyoutState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0); M.TooltipState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
M.FlyoutState.screen = QsWindow.window?.screen ?? null; M.TooltipState.screen = QsWindow.window?.screen ?? null;
M.FlyoutState.accentColor = root.accentColor; M.TooltipState.accentColor = root.accentColor;
M.FlyoutState.visible = true; M.TooltipState.visible = true;
} else if (!hovered && root.tooltip !== "") { } else if (!hovered && root.tooltip !== "") {
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }
} }
onTooltipChanged: if (_hovered && tooltip !== "") onTooltipChanged: if (_hovered && tooltip !== "")
M.FlyoutState.text = tooltip M.TooltipState.text = tooltip
} }

View file

@ -31,17 +31,17 @@ Text {
onHoveredChanged: { onHoveredChanged: {
root._hovered = hovered; root._hovered = hovered;
if (hovered && root.tooltip !== "") { if (hovered && root.tooltip !== "") {
M.FlyoutState.text = root.tooltip; M.TooltipState.text = root.tooltip;
M.FlyoutState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0); M.TooltipState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
M.FlyoutState.screen = QsWindow.window?.screen ?? null; M.TooltipState.screen = QsWindow.window?.screen ?? null;
M.FlyoutState.accentColor = root.accentColor; M.TooltipState.accentColor = root.accentColor;
M.FlyoutState.visible = true; M.TooltipState.visible = true;
} else if (!hovered && root.tooltip !== "") { } else if (!hovered && root.tooltip !== "") {
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }
} }
onTooltipChanged: if (_hovered && tooltip !== "") onTooltipChanged: if (_hovered && tooltip !== "")
M.FlyoutState.text = tooltip M.TooltipState.text = tooltip
} }

View file

@ -20,17 +20,17 @@ Row {
onHoveredChanged: { onHoveredChanged: {
root._hovered = hovered; root._hovered = hovered;
if (hovered && root.tooltip !== "") { if (hovered && root.tooltip !== "") {
M.FlyoutState.text = root.tooltip; M.TooltipState.text = root.tooltip;
M.FlyoutState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0); M.TooltipState.itemX = root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
M.FlyoutState.screen = QsWindow.window?.screen ?? null; M.TooltipState.screen = QsWindow.window?.screen ?? null;
M.FlyoutState.accentColor = root.accentColor; M.TooltipState.accentColor = root.accentColor;
M.FlyoutState.visible = true; M.TooltipState.visible = true;
} else if (!hovered && root.tooltip !== "") { } else if (!hovered && root.tooltip !== "") {
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }
} }
onTooltipChanged: if (_hovered && tooltip !== "") onTooltipChanged: if (_hovered && tooltip !== "")
M.FlyoutState.text = tooltip M.TooltipState.text = tooltip
} }

View file

@ -20,7 +20,7 @@ M.BarIcon {
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
menuLoader.active = !menuLoader.active; menuLoader.active = !menuLoader.active;
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }

View file

@ -13,7 +13,7 @@ PanelWindow {
color: "transparent" color: "transparent"
property bool _winVisible: false property bool _winVisible: false
property bool _shown: M.FlyoutState.visible && M.FlyoutState.screen === root.screen property bool _shown: M.TooltipState.visible && M.TooltipState.screen === root.screen
on_ShownChanged: { on_ShownChanged: {
if (_shown) { if (_shown) {
@ -34,7 +34,7 @@ PanelWindow {
anchors.left: true anchors.left: true
margins.top: 0 margins.top: 0
margins.left: Math.max(0, Math.min(Math.round(M.FlyoutState.itemX - implicitWidth / 2), screen.width - implicitWidth)) margins.left: Math.max(0, Math.min(Math.round(M.TooltipState.itemX - implicitWidth / 2), screen.width - implicitWidth))
implicitWidth: label.implicitWidth + S.Theme.barPadding * 2 implicitWidth: label.implicitWidth + S.Theme.barPadding * 2
implicitHeight: label.implicitHeight + S.Theme.barPadding * 2 implicitHeight: label.implicitHeight + S.Theme.barPadding * 2
@ -86,13 +86,13 @@ PanelWindow {
M.PopupBackground { M.PopupBackground {
anchors.fill: parent anchors.fill: parent
accentColor: M.FlyoutState.accentColor accentColor: M.TooltipState.accentColor
} }
Text { Text {
id: label id: label
anchors.centerIn: parent anchors.centerIn: parent
text: M.FlyoutState.text.replace(/\n/g, "<br>") text: M.TooltipState.text.replace(/\n/g, "<br>")
textFormat: Text.RichText textFormat: Text.RichText
color: S.Theme.base05 color: S.Theme.base05
font.pixelSize: S.Theme.fontSize font.pixelSize: S.Theme.fontSize

View file

@ -59,13 +59,13 @@ RowLayout {
iconItem._hovered = hovered; iconItem._hovered = hovered;
const tip = [iconItem.modelData.tooltipTitle, iconItem.modelData.tooltipDescription].filter(s => s).join("\n") || iconItem.modelData.title; const tip = [iconItem.modelData.tooltipTitle, iconItem.modelData.tooltipDescription].filter(s => s).join("\n") || iconItem.modelData.title;
if (hovered && tip) { if (hovered && tip) {
M.FlyoutState.text = tip; M.TooltipState.text = tip;
M.FlyoutState.itemX = iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0); M.TooltipState.itemX = iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
M.FlyoutState.screen = QsWindow.window?.screen ?? null; M.TooltipState.screen = QsWindow.window?.screen ?? null;
M.FlyoutState.accentColor = root.parent?.accentColor ?? S.Theme.base05; M.TooltipState.accentColor = root.parent?.accentColor ?? S.Theme.base05;
M.FlyoutState.visible = true; M.TooltipState.visible = true;
} else if (!hovered) { } else if (!hovered) {
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }
} }
@ -81,7 +81,7 @@ RowLayout {
if (root._activeMenu && root._activeMenu !== menuLoader) if (root._activeMenu && root._activeMenu !== menuLoader)
root._activeMenu.active = false; root._activeMenu.active = false;
menuLoader.active = true; menuLoader.active = true;
M.FlyoutState.visible = false; M.TooltipState.visible = false;
root._activeMenu = menuLoader; root._activeMenu = menuLoader;
} else { } else {
iconItem.modelData.secondaryActivate(); iconItem.modelData.secondaryActivate();

View file

@ -68,13 +68,13 @@ Row {
pill._hovered = hovered; pill._hovered = hovered;
const name = pill.modelData.name || ("Workspace " + pill.modelData.idx); const name = pill.modelData.name || ("Workspace " + pill.modelData.idx);
if (hovered) { if (hovered) {
M.FlyoutState.text = name; M.TooltipState.text = name;
M.FlyoutState.itemX = pill.mapToGlobal(pill.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0); M.TooltipState.itemX = pill.mapToGlobal(pill.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
M.FlyoutState.screen = QsWindow.window?.screen ?? null; M.TooltipState.screen = QsWindow.window?.screen ?? null;
M.FlyoutState.accentColor = root.parent?.accentColor ?? S.Theme.base05; M.TooltipState.accentColor = root.parent?.accentColor ?? S.Theme.base05;
M.FlyoutState.visible = true; M.TooltipState.visible = true;
} else { } else {
M.FlyoutState.visible = false; M.TooltipState.visible = false;
} }
} }
} }

View file

@ -12,7 +12,6 @@ BluetoothModule 1.0 BluetoothModule.qml
ClockModule 1.0 ClockModule.qml ClockModule 1.0 ClockModule.qml
CpuModule 1.0 CpuModule.qml CpuModule 1.0 CpuModule.qml
DiskModule 1.0 DiskModule.qml DiskModule 1.0 DiskModule.qml
Flyout 1.0 Flyout.qml
GpuModule 1.0 GpuModule.qml GpuModule 1.0 GpuModule.qml
HoverPanel 1.0 HoverPanel.qml HoverPanel 1.0 HoverPanel.qml
IdleInhibitorModule 1.0 IdleInhibitorModule.qml IdleInhibitorModule 1.0 IdleInhibitorModule.qml
@ -36,11 +35,12 @@ ScreenCapture 1.0 ScreenCapture.qml
ScreenCorners 1.0 ScreenCorners.qml ScreenCorners 1.0 ScreenCorners.qml
TemperatureModule 1.0 TemperatureModule.qml TemperatureModule 1.0 TemperatureModule.qml
ThemedIcon 1.0 ThemedIcon.qml ThemedIcon 1.0 ThemedIcon.qml
Tooltip 1.0 Tooltip.qml
TrayMenu 1.0 TrayMenu.qml TrayMenu 1.0 TrayMenu.qml
TrayModule 1.0 TrayModule.qml TrayModule 1.0 TrayModule.qml
VolumeModule 1.0 VolumeModule.qml VolumeModule 1.0 VolumeModule.qml
WeatherModule 1.0 WeatherModule.qml WeatherModule 1.0 WeatherModule.qml
WindowTitleModule 1.0 WindowTitleModule.qml WindowTitleModule 1.0 WindowTitleModule.qml
WorkspacesModule 1.0 WorkspacesModule.qml WorkspacesModule 1.0 WorkspacesModule.qml
singleton FlyoutState 1.0 FlyoutState.qml singleton TooltipState 1.0 TooltipState.qml
# keep-sorted end # keep-sorted end

View file

@ -19,7 +19,7 @@ ShellRoot {
screen: scope.modelData screen: scope.modelData
} }
Flyout { Tooltip {
screen: scope.modelData screen: scope.modelData
} }

View file

@ -37,11 +37,6 @@ shell/modules/BluetoothModule.qml: Unqualified access [unqualified]
shell/modules/ClockModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/ClockModule.qml: Member "screen" not found on type "QObject" [missing-property]
shell/modules/CpuModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/CpuModule.qml: Member "screen" not found on type "QObject" [missing-property]
shell/modules/DiskModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/DiskModule.qml: Member "screen" not found on type "QObject" [missing-property]
shell/modules/Flyout.qml: Could not find property "left". [missing-property]
shell/modules/Flyout.qml: Could not find property "top". [missing-property]
shell/modules/Flyout.qml: Type PanelWindow is not creatable. [uncreatable-type]
shell/modules/Flyout.qml: Type margins is used but it is not resolved [unresolved-type]
shell/modules/Flyout.qml: unknown grouped property scope margins. [unqualified]
shell/modules/GpuModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/GpuModule.qml: Member "screen" not found on type "QObject" [missing-property]
shell/modules/HoverPanel.qml: Could not find property "top". [missing-property] 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 PanelWindow is not creatable. [uncreatable-type]
@ -69,6 +64,11 @@ shell/modules/ScreenCorners.qml: Type PanelWindow is not creatable. [uncreatable
shell/modules/ScreenCorners.qml: Unqualified access [unqualified] shell/modules/ScreenCorners.qml: Unqualified access [unqualified]
shell/modules/TemperatureModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/TemperatureModule.qml: Member "screen" not found on type "QObject" [missing-property]
shell/modules/ThemedIcon.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: unknown grouped property scope margins. [unqualified]
shell/modules/TrayMenu.qml: Unqualified access [unqualified] shell/modules/TrayMenu.qml: Unqualified access [unqualified]
shell/modules/TrayModule.qml: Member "length" not found on type "UntypedObjectModel" [missing-property] shell/modules/TrayModule.qml: Member "length" not found on type "UntypedObjectModel" [missing-property]
shell/modules/TrayModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/TrayModule.qml: Member "screen" not found on type "QObject" [missing-property]