Files
DankMaterialShell/quickshell/Modules/ControlCenter/Components/DetailHost.qml
T

283 lines
8.8 KiB
QML

import QtQuick
import qs.Common
import qs.Services
import qs.Modules.ControlCenter.Details
Item {
id: root
readonly property var log: Log.scoped("DetailHost")
property string expandedSection: ""
property var expandedWidgetData: null
property var bluetoothCodecSelector: null
property var audioPortSelector: null
property string screenName: ""
property string screenModel: ""
property var pluginDetailInstance: null
property var widgetModel: null
property var collapseCallback: null
Loader {
id: pluginDetailLoader
width: parent.width
height: Math.max(0, parent.height - Theme.spacingS)
y: Theme.spacingS
active: false
sourceComponent: null
}
Loader {
id: coreDetailLoader
width: parent.width
height: Math.max(0, 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") {
return;
}
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);
}
}
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();
}
}
}
}
function _createPluginDetail(pluginId) {
const pluginComponent = PluginService.pluginWidgetComponents[pluginId];
if (!pluginComponent) {
return;
}
try {
pluginDetailInstance = pluginComponent.createObject(null, {
"pluginId": pluginId,
"pluginService": PluginService
});
} catch (e) {
log.warn("stale plugin component for", pluginId, "- reloading");
PluginService.reloadPlugin(pluginId);
return;
}
if (!pluginDetailInstance || !pluginDetailInstance.ccDetailContent) {
if (pluginDetailInstance) {
pluginDetailInstance.destroy();
pluginDetailInstance = null;
}
return;
}
pluginDetailLoader.sourceComponent = pluginDetailInstance.ccDetailContent;
pluginDetailLoader.active = true;
}
Connections {
target: PluginService
function onPluginLoaded(pluginId) {
if (root.pluginDetailInstance || root.expandedSection !== "plugin_" + pluginId) {
return;
}
root._createPluginDetail(pluginId);
}
}
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 (builtinId === "builtin_tailscale") {
if (widgetModel?.tailscaleLoader) {
widgetModel.tailscaleLoader.active = true;
}
builtinInstance = widgetModel.tailscaleBuiltinInstance;
}
if (builtinId === "builtin_display_profiles") {
if (widgetModel?.displayProfilesLoader) {
widgetModel.displayProfilesLoader.active = true;
}
builtinInstance = widgetModel.displayProfilesBuiltinInstance;
}
if (!builtinInstance || !builtinInstance.ccDetailContent) {
return;
}
pluginDetailLoader.sourceComponent = builtinInstance.ccDetailContent;
pluginDetailLoader.active = true;
return;
}
if (root.expandedSection.startsWith("plugin_")) {
_createPluginDetail(root.expandedSection.replace("plugin_", ""));
return;
}
if (root.expandedSection.startsWith("diskUsage_")) {
coreDetailLoader.sourceComponent = diskUsageDetailComponent;
coreDetailLoader.active = true;
return;
}
if (root.expandedSection.startsWith("brightnessSlider_")) {
coreDetailLoader.sourceComponent = brightnessDetailComponent;
coreDetailLoader.active = true;
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;
case "doNotDisturb":
coreDetailLoader.sourceComponent = doNotDisturbDetailComponent;
break;
default:
return;
}
coreDetailLoader.active = true;
}
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 {
onShowPortSelector: node => {
if (root.audioPortSelector)
root.audioPortSelector.show(node);
}
}
}
Component {
id: audioInputDetailComponent
AudioInputDetail {}
}
Component {
id: batteryDetailComponent
BatteryDetail {}
}
Component {
id: doNotDisturbDetailComponent
DoNotDisturbDetail {}
}
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
}
}
}