Avoid many errors, if a widget (plugin) does not exists on startup.

This commit is contained in:
Lemmy
2025-12-13 13:25:48 -05:00
parent 8c74e0befd
commit efef0db17f
4 changed files with 38 additions and 20 deletions
+16 -6
View File
@@ -17,6 +17,16 @@ Item {
// This property will be set by MainScreen
property ShellScreen screen: null
// Filter widgets to only include those that exist in the registry
// This prevents errors when plugins are missing or widgets are being cleaned up
function filterValidWidgets(widgets: list<var>): list<var> {
if (!widgets)
return [];
return widgets.filter(function (w) {
return w && w.id && BarWidgetRegistry.hasWidget(w.id);
});
}
// Expose bar region for click-through mask
readonly property var barRegion: barContentLoader.item?.children[0] || null
@@ -186,7 +196,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.left
model: root.filterValidWidgets(Settings.data.bar.widgets.left)
delegate: BarWidgetLoader {
required property var modelData
required property int index
@@ -212,7 +222,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.center
model: root.filterValidWidgets(Settings.data.bar.widgets.center)
delegate: BarWidgetLoader {
required property var modelData
required property int index
@@ -239,7 +249,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.right
model: root.filterValidWidgets(Settings.data.bar.widgets.right)
delegate: BarWidgetLoader {
required property var modelData
required property int index
@@ -277,7 +287,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.left
model: root.filterValidWidgets(Settings.data.bar.widgets.left)
delegate: BarWidgetLoader {
required property var modelData
required property int index
@@ -305,7 +315,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.center
model: root.filterValidWidgets(Settings.data.bar.widgets.center)
delegate: BarWidgetLoader {
required property var modelData
required property int index
@@ -334,7 +344,7 @@ Item {
spacing: Style.marginS
Repeater {
model: Settings.data.bar.widgets.right
model: root.filterValidWidgets(Settings.data.bar.widgets.right)
delegate: BarWidgetLoader {
required property var modelData
required property int index
+9 -3
View File
@@ -15,8 +15,8 @@ Item {
readonly property real scaling: barDensity === "mini" ? 0.8 : (barDensity === "compact" ? 0.9 : 1.0)
// Extract section info from widgetProps
readonly property string section: widgetProps.section || ""
readonly property int sectionIndex: widgetProps.sectionWidgetIndex || 0
readonly property string section: widgetProps ? (widgetProps.section || "") : ""
readonly property int sectionIndex: widgetProps ? (widgetProps.sectionWidgetIndex || 0) : 0
// Don't reserve space unless the loaded widget is really visible
implicitWidth: getImplicitSize(loader.item, "implicitWidth")
@@ -46,11 +46,17 @@ Item {
}
}
// Only load if widget exists in registry
function checkWidgetExists(): bool {
return root.widgetId !== "" && BarWidgetRegistry.hasWidget(root.widgetId);
}
Loader {
id: loader
anchors.fill: parent
asynchronous: false
sourceComponent: BarWidgetRegistry.getWidget(widgetId)
active: root.checkWidgetExists()
sourceComponent: root.checkWidgetExists() ? BarWidgetRegistry.getWidget(root.widgetId) : null
onLoaded: {
if (!item)
+7 -7
View File
@@ -22,11 +22,11 @@ Item {
property int sectionWidgetsCount: 0
property real scaling: 1.0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId] || {}
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.data.bar.widgets[section];
if (widgets && sectionWidgetIndex < widgets.length) {
if (widgets && sectionWidgetIndex < widgets.length && widgets[sectionWidgetIndex]) {
return widgets[sectionWidgetIndex];
}
}
@@ -34,13 +34,13 @@ Item {
}
// Widget settings - matching MediaMini pattern
readonly property bool showIcon: (widgetSettings.showIcon !== undefined) ? widgetSettings.showIcon : widgetMetadata.showIcon
readonly property string hideMode: (widgetSettings.hideMode !== undefined) ? widgetSettings.hideMode : widgetMetadata.hideMode
readonly property string scrollingMode: (widgetSettings.scrollingMode !== undefined) ? widgetSettings.scrollingMode : (widgetMetadata.scrollingMode !== undefined ? widgetMetadata.scrollingMode : "hover")
readonly property bool showIcon: (widgetSettings.showIcon !== undefined) ? widgetSettings.showIcon : (widgetMetadata.showIcon || false)
readonly property string hideMode: (widgetSettings.hideMode !== undefined) ? widgetSettings.hideMode : (widgetMetadata.hideMode || "hidden")
readonly property string scrollingMode: (widgetSettings.scrollingMode !== undefined) ? widgetSettings.scrollingMode : (widgetMetadata.scrollingMode || "hover")
// Maximum widget width with user settings support
readonly property real maxWidth: (widgetSettings.maxWidth !== undefined) ? widgetSettings.maxWidth : Math.max(widgetMetadata.maxWidth, screen ? screen.width * 0.06 : 0)
readonly property bool useFixedWidth: (widgetSettings.useFixedWidth !== undefined) ? widgetSettings.useFixedWidth : widgetMetadata.useFixedWidth
readonly property real maxWidth: (widgetSettings.maxWidth !== undefined) ? widgetSettings.maxWidth : Math.max(widgetMetadata.maxWidth || 0, screen ? screen.width * 0.06 : 0)
readonly property bool useFixedWidth: (widgetSettings.useFixedWidth !== undefined) ? widgetSettings.useFixedWidth : (widgetMetadata.useFixedWidth || false)
readonly property bool isVerticalBar: (Settings.data.bar.position === "left" || Settings.data.bar.position === "right")
readonly property bool hasFocusedWindow: CompositorService.getFocusedWindow() !== null
+6 -4
View File
@@ -22,8 +22,9 @@ SmartPanel {
// Check right section first (most common location for Battery widget)
var rightWidgets = Settings.data.bar.widgets.right || [];
for (var i = 0; i < rightWidgets.length; i++) {
if (rightWidgets[i].id === "Battery" && rightWidgets[i].deviceNativePath) {
return rightWidgets[i].deviceNativePath;
var widget = rightWidgets[i];
if (widget && widget.id === "Battery" && widget.deviceNativePath) {
return widget.deviceNativePath;
}
}
// Check other sections
@@ -31,8 +32,9 @@ SmartPanel {
for (var s = 0; s < sections.length; s++) {
var widgets = Settings.data.bar.widgets[sections[s]] || [];
for (var j = 0; j < widgets.length; j++) {
if (widgets[j].id === "Battery" && widgets[j].deviceNativePath) {
return widgets[j].deviceNativePath;
var widget = widgets[j];
if (widget && widget.id === "Battery" && widget.deviceNativePath) {
return widget.deviceNativePath;
}
}
}