grids: hand committed layouts and display picks to callbacks, not var signals

fixes #3746
This commit is contained in:
bbedward
2026-10-10 18:00:39 -04:00
parent 3246138096
commit d8aca6ab48
13 changed files with 21 additions and 20 deletions
@@ -46,7 +46,7 @@ DEditableGrid {
packer: items => GridUtils.packCells(clamped(items), placementOrder, columns, null, CcMetrics.gridStep, true).cells
placeholderRadius: draggingSlot?.small ? Theme.fullRadius(draggingSlot.width, draggingSlot.height) : (draggingSlot?.tileItem?.bodyRadius ?? Theme.fullRadius(width, CcMetrics.tileHeight))
onLayoutCommitted: items => model.setLayout(withHidden(items))
commitHandler: items => model.setLayout(withHidden(items))
function clamped(items) {
return items.map(widget => Object.assign({}, widget, WidgetUtils.clampSize(widget, columns, maximumRows)));
+1 -1
View File
@@ -130,7 +130,7 @@ Item {
editMode: root.editMode
sourceItems: root.widgets
slotLayout: GridUtils.packCards(layoutItems, placementOrder, root.columns, width, DashMetrics.gridGap, DashMetrics.gridRowUnit, I18n.isRtl, id => root.specFor(id) !== null)
onLayoutCommitted: items => root.save(WidgetUtils.resolve(root.definitions, items))
commitHandler: items => root.save(WidgetUtils.resolve(root.definitions, items))
function requestFocus(backwards) {
const targets = root.focusTargets();
@@ -41,7 +41,7 @@ DEditableGrid {
minimumHeight: DashMetrics.tabMinHeight
placeholderRadius: DashMetrics.cardRadius
onLayoutCommitted: items => {
commitHandler: items => {
commitPanelPreview();
CardUtils.setLayout(items);
}
+2 -2
View File
@@ -222,7 +222,7 @@ Item {
allowEmpty: true
showLastDisplay: true
showOnLastDisplay: bar.selectedBarConfig?.showOnLastDisplay ?? true
onPreferencesChanged: prefs => dankBarTab.setBarScreenPreferences(bar.selectedBarId, prefs)
preferencesHandler: prefs => dankBarTab.setBarScreenPreferences(bar.selectedBarId, prefs)
onLastDisplayToggled: checked => dankBarTab.setBarShowOnLastDisplay(bar.selectedBarId, checked)
}
}
@@ -412,7 +412,7 @@ Item {
SettingsDisplayPicker {
displayPreferences: SettingsData.frameScreenPreferences
onPreferencesChanged: prefs => SettingsData.set("frameScreenPreferences", prefs)
preferencesHandler: prefs => SettingsData.set("frameScreenPreferences", prefs)
}
}
+1 -1
View File
@@ -165,7 +165,7 @@ Item {
allowEmpty: true
showLastDisplay: true
showOnLastDisplay: dot.config?.showOnLastDisplay ?? true
onPreferencesChanged: prefs => dot.apply("screenPreferences", prefs)
preferencesHandler: prefs => dot.apply("screenPreferences", prefs)
onLastDisplayToggled: checked => dot.apply("showOnLastDisplay", checked)
}
}
@@ -55,7 +55,7 @@ Column {
SettingsDisplayPicker {
displayPreferences: root.cfg.displayPreferences ?? ["all"]
onPreferencesChanged: prefs => root.updateConfig("displayPreferences", prefs)
preferencesHandler: prefs => root.updateConfig("displayPreferences", prefs)
}
SettingsRow {
@@ -154,7 +154,7 @@ Item {
allowEmpty: true
showLastDisplay: ["notifications", "osd", "toast", "notepad"].includes(componentCard.modelData.id) || componentCard.modelData.id.startsWith("bar:")
showOnLastDisplay: root.getShowOnLastDisplay(componentCard.modelData.id)
onPreferencesChanged: prefs => root.setScreenPreferences(componentCard.modelData.id, prefs)
preferencesHandler: prefs => root.setScreenPreferences(componentCard.modelData.id, prefs)
onLastDisplayToggled: checked => root.setShowOnLastDisplay(componentCard.modelData.id, checked)
}
@@ -24,7 +24,7 @@ Item {
SettingsDisplayPicker {
displayPreferences: dock.screenPreferences
emptyMeansAll: false
onPreferencesChanged: preferences => dock.setOption("screenPreferences", preferences)
preferencesHandler: preferences => dock.setOption("screenPreferences", preferences)
}
SettingsToggleRow {
@@ -667,7 +667,7 @@ Item {
SettingsDisplayPicker {
width: parent.width
displayPreferences: SettingsData.screenPreferences?.lockScreen || ["all"]
onPreferencesChanged: prefs => {
preferencesHandler: prefs => {
var p = SettingsData.screenPreferences || {};
var updated = Object.assign({}, p);
updated["lockScreen"] = prefs;
@@ -14,7 +14,8 @@ Column {
property bool showOnLastDisplay: false
readonly property bool localAllDisplays: !Array.isArray(displayPreferences) || displayPreferences.includes("all") || (emptyMeansAll && displayPreferences.length === 0)
signal preferencesChanged(var preferences)
// A callback, not a signal: Qt 6.12 hands signal array parameters over as a V4Sequence that fails Array.isArray.
property var preferencesHandler: null
signal lastDisplayToggled(bool checked)
width: parent?.width ?? 0
@@ -34,7 +35,7 @@ Column {
SettingsToggleRow {
text: I18n.tr("All displays")
checked: root.localAllDisplays
onToggled: checked => root.preferencesChanged(checked ? ["all"] : Quickshell.screens.map(screen => root.screenPref(screen)))
onToggled: checked => root.preferencesHandler?.(checked ? ["all"] : Quickshell.screens.map(screen => root.screenPref(screen)))
}
SettingsToggleRow {
@@ -61,7 +62,7 @@ Column {
prefs.push(root.screenPref(modelData));
if (!root.allowEmpty && prefs.length === 0)
return;
root.preferencesChanged(prefs);
root.preferencesHandler?.(prefs);
}
}
}
+1 -1
View File
@@ -107,7 +107,7 @@ Singleton {
valid = typeof value === "number" && Number.isFinite(value);
break;
case "a":
valid = Array.isArray(value) && value.every(v => typeof v === "string");
valid = value instanceof Array && value.every(v => typeof v === "string");
break;
case "r":
valid = value && ["x", "y", "width", "height"].every(k => Number.isSafeInteger(value[k]));
+2 -2
View File
@@ -363,7 +363,7 @@ Singleton {
}
function keepUnchanged(previous, next) {
if (!Array.isArray(previous) || !Array.isArray(next))
if (!(previous instanceof Array) || !(next instanceof Array))
return next;
const byContent = new Map();
for (const item of previous)
@@ -390,7 +390,7 @@ Singleton {
if (!state.wifiNetworks && !state.savedWifiNetworks)
return;
const hasSavedWifiState = DMSService.apiVersion >= savedWifiStateApiVersion && Array.isArray(state.savedWifiNetworks);
const hasSavedWifiState = DMSService.apiVersion >= savedWifiStateApiVersion && state.savedWifiNetworks instanceof Array;
const sourceSavedNetworks = hasSavedWifiState ? state.savedWifiNetworks : (state.wifiNetworks || []).filter(network => network.saved);
const normalized = sourceSavedNetworks.map(network => Object.assign({}, network, {
saved: true,
+4 -4
View File
@@ -32,6 +32,8 @@ Item {
property var dropHandler: null
// An item hovering from outside, placed first so the grid makes room for it.
property var externalItem: null
// A callback, not a signal: Qt 6.12 hands signal array parameters over as a V4Sequence that fails Array.isArray.
property var commitHandler: null
// The layout compacts upward, so a drop has to account for the hole the dragged item leaves.
property bool gravity: false
// Takes the items with the dragged one at its target and returns their packed cells, so a drop can tell
@@ -62,8 +64,6 @@ Item {
return gravity && dragCell && draggingSourceIndex >= 0 ? GridUtils.dropInto(changed, pinnedCells, draggingSourceIndex, dragCell, packer, rowStep) : changed;
}
signal layoutCommitted(var items)
implicitHeight: Math.max(minimumHeight, layoutHeight) + contentPadding * 2
height: implicitHeight
@@ -156,7 +156,7 @@ Item {
const moved = pinnedCells.some((cell, i) => cell && (cell.col !== items[i].col || cell.row !== items[i].row));
cancelInteraction();
if (moved)
layoutCommitted(items);
commitHandler?.(items);
}
function previewExternal(item, x, y) {
@@ -196,7 +196,7 @@ Item {
const changed = item && Object.keys(preview.changes).some(key => item[key] !== preview.changes[key]);
const items = committedItems();
if (changed)
layoutCommitted(items);
commitHandler?.(items);
cancelInteraction();
}