import QtQuick import qs.Common import qs.Services import qs.Modules.ControlCenter.Details Item { id: root property string expandedSection: "" property var expandedWidgetData: null property var bluetoothCodecSelector: null property string screenName: "" property string screenModel: "" property var pluginDetailInstance: null property var widgetModel: null property var collapseCallback: null function getDetailHeight(section) { const maxAvailable = parent ? parent.height - Theme.spacingS : 9999; switch (true) { case section === "wifi": case section === "bluetooth": case section === "builtin_vpn": return Math.min(350, maxAvailable); case section.startsWith("brightnessSlider_"): return Math.min(400, maxAvailable); default: return Math.min(250, maxAvailable); } } Loader { id: pluginDetailLoader width: parent.width height: parent.height - Theme.spacingS y: Theme.spacingS active: false sourceComponent: null } Loader { id: coreDetailLoader width: parent.width height: parent.height - Theme.spacingS y: Theme.spacingS active: false sourceComponent: null } Connections { target: coreDetailLoader.item enabled: root.expandedSection.startsWith("brightnessSlider_") ignoreUnknownSignals: true function onDeviceNameChanged(newDeviceName) { if (root.expandedWidgetData && root.expandedWidgetData.id === "brightnessSlider") { const widgets = SettingsData.controlCenterWidgets || []; const newWidgets = widgets.map(w => { if (w.id === "brightnessSlider" && w.instanceId === root.expandedWidgetData.instanceId) { const updatedWidget = Object.assign({}, w); updatedWidget.deviceName = newDeviceName; return updatedWidget; } return w; }); SettingsData.set("controlCenterWidgets", newWidgets); if (root.collapseCallback) { root.collapseCallback(); } } } } Connections { target: coreDetailLoader.item enabled: root.expandedSection.startsWith("diskUsage_") ignoreUnknownSignals: true function onMountPathChanged(newMountPath) { if (root.expandedWidgetData && root.expandedWidgetData.id === "diskUsage") { const widgets = SettingsData.controlCenterWidgets || []; const newWidgets = widgets.map(w => { if (w.id === "diskUsage" && w.instanceId === root.expandedWidgetData.instanceId) { const updatedWidget = Object.assign({}, w); updatedWidget.mountPath = newMountPath; return updatedWidget; } return w; }); SettingsData.set("controlCenterWidgets", newWidgets); if (root.collapseCallback) { root.collapseCallback(); } } } } onExpandedSectionChanged: { if (pluginDetailInstance) { pluginDetailInstance.destroy(); pluginDetailInstance = null; } pluginDetailLoader.active = false; coreDetailLoader.active = false; if (!root.expandedSection) { return; } if (root.expandedSection.startsWith("builtin_")) { const builtinId = root.expandedSection; let builtinInstance = null; if (builtinId === "builtin_vpn") { if (widgetModel?.vpnLoader) { widgetModel.vpnLoader.active = true; } builtinInstance = widgetModel.vpnBuiltinInstance; } if (builtinId === "builtin_cups") { if (widgetModel?.cupsLoader) { widgetModel.cupsLoader.active = true; } builtinInstance = widgetModel.cupsBuiltinInstance; } if (!builtinInstance || !builtinInstance.ccDetailContent) { return; } pluginDetailLoader.sourceComponent = builtinInstance.ccDetailContent; pluginDetailLoader.active = parent.height > 0; return; } if (root.expandedSection.startsWith("plugin_")) { const pluginId = root.expandedSection.replace("plugin_", ""); const pluginComponent = PluginService.pluginWidgetComponents[pluginId]; if (!pluginComponent) { return; } pluginDetailInstance = pluginComponent.createObject(null); if (!pluginDetailInstance || !pluginDetailInstance.ccDetailContent) { if (pluginDetailInstance) { pluginDetailInstance.destroy(); pluginDetailInstance = null; } return; } pluginDetailLoader.sourceComponent = pluginDetailInstance.ccDetailContent; pluginDetailLoader.active = parent.height > 0; return; } if (root.expandedSection.startsWith("diskUsage_")) { coreDetailLoader.sourceComponent = diskUsageDetailComponent; coreDetailLoader.active = parent.height > 0; return; } if (root.expandedSection.startsWith("brightnessSlider_")) { coreDetailLoader.sourceComponent = brightnessDetailComponent; coreDetailLoader.active = parent.height > 0; return; } switch (root.expandedSection) { case "network": case "wifi": coreDetailLoader.sourceComponent = networkDetailComponent; break; case "bluetooth": coreDetailLoader.sourceComponent = bluetoothDetailComponent; break; case "audioOutput": coreDetailLoader.sourceComponent = audioOutputDetailComponent; break; case "audioInput": coreDetailLoader.sourceComponent = audioInputDetailComponent; break; case "battery": coreDetailLoader.sourceComponent = batteryDetailComponent; break; default: return; } coreDetailLoader.active = parent.height > 0; } Component { id: networkDetailComponent NetworkDetail {} } Component { id: bluetoothDetailComponent BluetoothDetail { id: bluetoothDetail onShowCodecSelector: function (device) { if (root.bluetoothCodecSelector) { root.bluetoothCodecSelector.show(device); root.bluetoothCodecSelector.codecSelected.connect(function (deviceAddress, codecName) { bluetoothDetail.updateDeviceCodecDisplay(deviceAddress, codecName); }); } } } } Component { id: audioOutputDetailComponent AudioOutputDetail {} } Component { id: audioInputDetailComponent AudioInputDetail {} } Component { id: batteryDetailComponent BatteryDetail {} } Component { id: diskUsageDetailComponent DiskUsageDetail { currentMountPath: root.expandedWidgetData?.mountPath || "/" instanceId: root.expandedWidgetData?.instanceId || "" } } Component { id: brightnessDetailComponent BrightnessDetail { initialDeviceName: root.expandedWidgetData?.deviceName || "" instanceId: root.expandedWidgetData?.instanceId || "" screenName: root.screenName screenModel: root.screenModel } } }