mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
DesktopWidgets: fix the apocalypse
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1417,6 +1417,10 @@
|
||||
"label": "ミニマルモード"
|
||||
},
|
||||
"preview": "プレビュー",
|
||||
"rounded-corners": {
|
||||
"description": "ウィジェットの背景を角丸にしてください。",
|
||||
"label": "角を丸くする"
|
||||
},
|
||||
"show-background": {
|
||||
"description": "時計ウィジェットの背景コンテナを表示します。",
|
||||
"label": "背景を表示"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1417,6 +1417,10 @@
|
||||
"label": "Минимальный режим"
|
||||
},
|
||||
"preview": "Предварительный просмотр",
|
||||
"rounded-corners": {
|
||||
"description": "Использовать скруглённые углы для фона виджета.",
|
||||
"label": "Скруглённые углы"
|
||||
},
|
||||
"show-background": {
|
||||
"description": "Показать фоновый контейнер для виджета часов.",
|
||||
"label": "Показать фон"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1417,6 +1417,10 @@
|
||||
"label": "Мінімальний режим"
|
||||
},
|
||||
"preview": "Попередній перегляд",
|
||||
"rounded-corners": {
|
||||
"description": "Використовуйте заокруглені кути для фону віджета.",
|
||||
"label": "Заокруглені кути"
|
||||
},
|
||||
"show-background": {
|
||||
"description": "Показати фоновий контейнер для віджета годинника.",
|
||||
"label": "Показати фон"
|
||||
|
||||
@@ -1417,6 +1417,10 @@
|
||||
"label": "简约模式"
|
||||
},
|
||||
"preview": "预览",
|
||||
"rounded-corners": {
|
||||
"description": "使用圆角作为小部件背景。",
|
||||
"label": "圆角"
|
||||
},
|
||||
"show-background": {
|
||||
"description": "显示时钟小部件的背景容器。",
|
||||
"label": "显示背景"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user