mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
Avoid many errors, if a widget (plugin) does not exists on startup.
This commit is contained in:
+16
-6
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user