DesktopWidgets: fix the apocalypse

This commit is contained in:
Lemmy
2025-12-28 17:11:12 -05:00
parent 5eee04f427
commit 39b412b0bf
18 changed files with 101 additions and 85 deletions
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Minimaler Modus"
},
"preview": "Vorschau",
"rounded-corners": {
"description": "Verwende abgerundete Ecken für den Widget-Hintergrund.",
"label": "Abgerundete Ecken"
},
"show-background": {
"description": "Zeige den Hintergrundcontainer für das Uhr-Widget an.",
"label": "Hintergrund anzeigen"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Minimal mode"
},
"preview": "Preview",
"rounded-corners": {
"description": "Use rounded corners for the widget background.",
"label": "Rounded corners"
},
"show-background": {
"description": "Show the background container for the clock widget.",
"label": "Show background"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Modo minimalista"
},
"preview": "Vista previa",
"rounded-corners": {
"description": "Usa esquinas redondeadas para el fondo del widget.",
"label": "Esquinas redondeadas"
},
"show-background": {
"description": "Mostrar el contenedor de fondo para el widget de reloj.",
"label": "Mostrar fondo"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Mode minimaliste"
},
"preview": "Aperçu",
"rounded-corners": {
"description": "Utiliser des coins arrondis pour l'arrière-plan du widget.",
"label": "Coins arrondis."
},
"show-background": {
"description": "Afficher le conteneur d'arrière-plan pour le widget d'horloge.",
"label": "Afficher l'arrière-plan"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Minimális mód"
},
"preview": "Előnézet",
"rounded-corners": {
"description": "A widget háttere legyen lekerekített sarkú.",
"label": "Lekerekített sarkok"
},
"show-background": {
"description": "Jelenítse meg az óra widget háttérkonténerét.",
"label": "Háttér megjelenítése"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "ミニマルモード"
},
"preview": "プレビュー",
"rounded-corners": {
"description": "ウィジェットの背景を角丸にしてください。",
"label": "角を丸くする"
},
"show-background": {
"description": "時計ウィジェットの背景コンテナを表示します。",
"label": "背景を表示"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Minimale modus"
},
"preview": "Voorbeeld",
"rounded-corners": {
"description": "Gebruik afgeronde hoeken voor de widgetachtergrond.",
"label": "Afgeronde hoeken"
},
"show-background": {
"description": "Toon de achtergrondcontainer voor de klokwidget.",
"label": "Achtergrond weergeven"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Tryb minimalistyczny"
},
"preview": "Podgląd",
"rounded-corners": {
"description": "Użyj zaokrąglonych rogów dla tła widżetu.",
"label": "Zaokrąglone rogi"
},
"show-background": {
"description": "Pokaż tło dla widżetu zegara.",
"label": "Pokaż tło"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Modo minimalista"
},
"preview": "Pré-visualização",
"rounded-corners": {
"description": "Use cantos arredondados para o fundo do widget.",
"label": "Cantos arredondados"
},
"show-background": {
"description": "Mostrar o contêiner de fundo para o widget de relógio.",
"label": "Mostrar plano de fundo"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Минимальный режим"
},
"preview": "Предварительный просмотр",
"rounded-corners": {
"description": "Использовать скруглённые углы для фона виджета.",
"label": "Скруглённые углы"
},
"show-background": {
"description": "Показать фоновый контейнер для виджета часов.",
"label": "Показать фон"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Minimal mod"
},
"preview": "Önizleme",
"rounded-corners": {
"description": "Widget arka planı için yuvarlatılmış köşeler kullanın.",
"label": "Yuvarlatılmış köşeler"
},
"show-background": {
"description": "Saat widget'ı için arka plan kabını göster.",
"label": "Arka planı göster"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "Мінімальний режим"
},
"preview": "Попередній перегляд",
"rounded-corners": {
"description": "Використовуйте заокруглені кути для фону віджета.",
"label": "Заокруглені кути"
},
"show-background": {
"description": "Показати фоновий контейнер для віджета годинника.",
"label": "Показати фон"
+4
View File
@@ -1417,6 +1417,10 @@
"label": "简约模式"
},
"preview": "预览",
"rounded-corners": {
"description": "使用圆角作为小部件背景。",
"label": "圆角"
},
"show-background": {
"description": "显示时钟小部件的背景容器。",
"label": "显示背景"
+15 -48
View File
@@ -34,53 +34,23 @@ Variants {
id: screenLoader
required property ShellScreen modelData
property ListModel screenWidgetsModel: ListModel {}
property var settingsWatcher: Settings.data.desktopWidgets.monitorWidgets
onSettingsWatcherChanged: Qt.callLater(updateModel)
Component.onCompleted: Qt.callLater(updateModel)
function updateModel() {
// Reactive property for widgets on this specific screen
// Returns a fresh array whenever Settings changes
property var screenWidgets: {
if (!modelData || !modelData.name) {
screenWidgetsModel.clear();
return;
return [];
}
var monitorWidgets = Settings.data.desktopWidgets.monitorWidgets || [];
var newWidgets = [];
for (var i = 0; i < monitorWidgets.length; i++) {
if (monitorWidgets[i].name === modelData.name) {
newWidgets = monitorWidgets[i].widgets || [];
break;
return monitorWidgets[i].widgets || [];
}
}
// Update in-place to preserve delegates
for (var j = 0; j < Math.min(newWidgets.length, screenWidgetsModel.count); j++) {
var item = screenWidgetsModel.get(j);
var newData = newWidgets[j];
// Update each property individually
for (var key in newData) {
if (item[key] !== newData[key]) {
item[key] = newData[key];
}
}
}
// Remove excess
while (screenWidgetsModel.count > newWidgets.length) {
screenWidgetsModel.remove(screenWidgetsModel.count - 1);
}
// Append new
for (var k = screenWidgetsModel.count; k < newWidgets.length; k++) {
screenWidgetsModel.append(newWidgets[k]);
}
return [];
}
// Only create PanelWindow if enabled AND screen has widgets
active: modelData && Settings.data.desktopWidgets.enabled && screenWidgetsModel.count > 0 && !PowerProfileService.noctaliaPerformanceMode
active: modelData && Settings.data.desktopWidgets.enabled && screenWidgets.length > 0 && !PowerProfileService.noctaliaPerformanceMode
sourceComponent: PanelWindow {
id: window
@@ -295,36 +265,33 @@ Variants {
// Load widgets dynamically from per-monitor array
Repeater {
model: screenLoader.screenWidgetsModel
model: screenLoader.screenWidgets
delegate: Loader {
id: widgetLoader
// Bind to registeredWidgets and pluginReloadCounter to re-evaluate when plugins register/unregister
active: (model.id in root.registeredWidgets) && (root.pluginReloadCounter >= 0)
active: (modelData.id in root.registeredWidgets) && (root.pluginReloadCounter >= 0)
required property var model
required property var modelData
required property int index
property int widgetIndex: index
sourceComponent: {
// Access registeredWidgets and pluginReloadCounter to create reactive binding
var _ = root.pluginReloadCounter;
var widgets = root.registeredWidgets;
return widgets[model.id] || null;
return widgets[modelData.id] || null;
}
onLoaded: {
if (item) {
item.screen = window.screen;
item.parent = widgetsContainer;
item.widgetData = Qt.binding(function () {
return widgetLoader.model;
});
item.widgetIndex = widgetIndex;
item.widgetData = modelData;
item.widgetIndex = index;
// Inject plugin API for plugin widgets
if (DesktopWidgetRegistry.isPluginWidget(model.id)) {
var pluginId = model.id.replace("plugin:", "");
if (DesktopWidgetRegistry.isPluginWidget(modelData.id)) {
var pluginId = modelData.id.replace("plugin:", "");
var api = PluginService.getPluginAPI(pluginId);
if (api && item.hasOwnProperty("pluginApi")) {
item.pluginApi = api;
@@ -10,25 +10,7 @@ DraggableDesktopWidget {
id: root
readonly property var now: Time.now
// Direct access to settings like bar widgets do - this ensures reactivity
property var widgetSettings: {
if (screen && screen.name && widgetIndex >= 0) {
var monitorWidgets = Settings.data.desktopWidgets.monitorWidgets || [];
for (var i = 0; i < monitorWidgets.length; i++) {
if (monitorWidgets[i].name === screen.name) {
var widgets = monitorWidgets[i].widgets || [];
if (widgetIndex < widgets.length) {
return widgets[widgetIndex];
}
break;
}
}
}
return {};
}
property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["Clock"]
readonly property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["Clock"]
readonly property color clockTextColor: {
if (usePrimaryColor) {
@@ -41,14 +23,12 @@ DraggableDesktopWidget {
var size = widgetData && widgetData.fontSize ? widgetData.fontSize : 0;
return (size && size > 0) ? size : Style.fontSizeXXXL * 2.5;
}
readonly property real widgetOpacity: (widgetSettings.opacity !== undefined) ? widgetSettings.opacity : 1.0
readonly property bool showSeconds: (widgetSettings.showSeconds !== undefined) ? widgetSettings.showSeconds : true
readonly property bool showDate: (widgetSettings.showDate !== undefined) ? widgetSettings.showDate : true
readonly property string clockStyle: (widgetSettings.clockStyle !== undefined) ? widgetSettings.clockStyle : (widgetMetadata.clockStyle !== undefined ? widgetMetadata.clockStyle : "digital")
readonly property bool usePrimaryColor: (widgetSettings.usePrimaryColor !== undefined) ? widgetSettings.usePrimaryColor : (widgetMetadata.usePrimaryColor !== undefined ? widgetMetadata.usePrimaryColor : false)
readonly property bool useCustomFont: (widgetSettings.useCustomFont !== undefined) ? widgetSettings.useCustomFont : (widgetMetadata.useCustomFont !== undefined ? widgetMetadata.useCustomFont : false)
readonly property string customFont: (widgetSettings.customFont !== undefined) ? widgetSettings.customFont : ""
readonly property string format: (widgetSettings.format !== undefined) ? widgetSettings.format : (widgetMetadata.format !== undefined ? widgetMetadata.format : "HH:mm\\nd MMMM yyyy")
readonly property real widgetOpacity: (widgetData && widgetData.opacity !== undefined) ? widgetData.opacity : 1.0
readonly property string clockStyle: (widgetData && widgetData.clockStyle !== undefined) ? widgetData.clockStyle : (widgetMetadata.clockStyle !== undefined ? widgetMetadata.clockStyle : "digital")
readonly property bool usePrimaryColor: (widgetData && widgetData.usePrimaryColor !== undefined) ? widgetData.usePrimaryColor : (widgetMetadata.usePrimaryColor !== undefined ? widgetMetadata.usePrimaryColor : false)
readonly property bool useCustomFont: (widgetData && widgetData.useCustomFont !== undefined) ? widgetData.useCustomFont : (widgetMetadata.useCustomFont !== undefined ? widgetMetadata.useCustomFont : false)
readonly property string customFont: (widgetData && widgetData.customFont !== undefined) ? widgetData.customFont : ""
readonly property string format: (widgetData && widgetData.format !== undefined) ? widgetData.format : (widgetMetadata.format !== undefined ? widgetMetadata.format : "HH:mm\\nd MMMM yyyy")
readonly property real contentPadding: clockStyle === "minimal" ? Style.marginL : Style.marginXL
implicitWidth: contentLoader.item ? (contentLoader.item.implicitWidth || contentLoader.item.width || 0) + contentPadding * 2 : 0
@@ -14,13 +14,13 @@ DraggableDesktopWidget {
defaultY: 200
// Widget settings
readonly property string hideMode: (widgetData.hideMode !== undefined) ? widgetData.hideMode : "visible"
readonly property bool showButtons: (widgetData.showButtons !== undefined) ? widgetData.showButtons : true
readonly property bool showAlbumArt: (widgetData.showAlbumArt !== undefined) ? widgetData.showAlbumArt : true
readonly property bool showVisualizer: (widgetData.showVisualizer !== undefined) ? widgetData.showVisualizer : true
readonly property string visualizerType: (widgetData.visualizerType && widgetData.visualizerType !== "") ? widgetData.visualizerType : "linear"
readonly property bool roundedCorners: (widgetData.roundedCorners !== undefined) ? widgetData.roundedCorners : true
// Widget settings - check widgetData exists before accessing properties
readonly property string hideMode: (widgetData && widgetData.hideMode !== undefined) ? widgetData.hideMode : "visible"
readonly property bool showButtons: (widgetData && widgetData.showButtons !== undefined) ? widgetData.showButtons : true
readonly property bool showAlbumArt: (widgetData && widgetData.showAlbumArt !== undefined) ? widgetData.showAlbumArt : true
readonly property bool showVisualizer: (widgetData && widgetData.showVisualizer !== undefined) ? widgetData.showVisualizer : true
readonly property string visualizerType: (widgetData && widgetData.visualizerType && widgetData.visualizerType !== "") ? widgetData.visualizerType : "linear"
readonly property bool roundedCorners: (widgetData && widgetData.roundedCorners !== undefined) ? widgetData.roundedCorners : true
readonly property bool hasPlayer: MediaService.currentPlayer !== null
readonly property bool isPlaying: MediaService.isPlaying
readonly property bool hasActiveTrack: hasPlayer && (MediaService.trackTitle || MediaService.trackArtist)
@@ -199,9 +199,15 @@ Popup {
const source = DesktopWidgetRegistry.widgetSettingsMap[widgetId];
if (source) {
var currentWidgetData = widgetData;
var widgets = Settings.data.desktopWidgets.widgets;
if (widgets && widgetIndex >= 0 && widgetIndex < widgets.length) {
currentWidgetData = widgets[widgetIndex];
var monitorWidgets = Settings.data.desktopWidgets.monitorWidgets || [];
for (var i = 0; i < monitorWidgets.length; i++) {
if (monitorWidgets[i].name === sectionId) {
var widgets = monitorWidgets[i].widgets || [];
if (widgetIndex >= 0 && widgetIndex < widgets.length) {
currentWidgetData = widgets[widgetIndex];
}
break;
}
}
var fullPath = Qt.resolvedUrl(Quickshell.shellDir + "/Modules/Panels/Settings/DesktopWidgets/" + source);
settingsLoader.setSource(fullPath, {
@@ -14,6 +14,7 @@ ColumnLayout {
property var widgetMetadata: null
property bool valueShowBackground: widgetData.showBackground !== undefined ? widgetData.showBackground : widgetMetadata.showBackground
property bool valueRoundedCorners: widgetData.roundedCorners !== undefined ? widgetData.roundedCorners : true
property string valueClockStyle: widgetData.clockStyle !== undefined ? widgetData.clockStyle : widgetMetadata.clockStyle
property bool valueUsePrimaryColor: widgetData.usePrimaryColor !== undefined ? widgetData.usePrimaryColor : widgetMetadata.usePrimaryColor
property bool valueUseCustomFont: widgetData.useCustomFont !== undefined ? widgetData.useCustomFont : widgetMetadata.useCustomFont
@@ -29,6 +30,7 @@ ColumnLayout {
function saveSettings() {
var settings = Object.assign({}, widgetData || {});
settings.showBackground = valueShowBackground;
settings.roundedCorners = valueRoundedCorners;
settings.clockStyle = valueClockStyle;
settings.usePrimaryColor = valueUsePrimaryColor;
settings.useCustomFont = valueUseCustomFont;
@@ -250,4 +252,13 @@ ColumnLayout {
checked: valueShowBackground
onToggled: checked => valueShowBackground = checked
}
NToggle {
Layout.fillWidth: true
visible: valueShowBackground
label: I18n.tr("settings.desktop-widgets.clock.rounded-corners.label")
description: I18n.tr("settings.desktop-widgets.clock.rounded-corners.description")
checked: valueRoundedCorners
onToggled: checked => valueRoundedCorners = checked
}
}