Files
noctalia-shell/Modules/Panels/Settings/ControlCenter/ControlCenterWidgetSettingsDialog.qml
T
2026-03-17 10:38:25 +01:00

160 lines
4.0 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Services.UI
import qs.Widgets
// Widget Settings Dialog Component
Popup {
id: root
property int widgetIndex: -1
property var widgetData: null
property string widgetId: ""
property string sectionId: ""
property var screen: null
property var settingsCache: ({})
signal updateWidgetSettings(string section, int index, var settings)
readonly property real maxHeight: (screen ? screen.height : (parent ? parent.height : 800)) * 0.8
readonly property real defaultContentWidth: Math.round(600 * Style.uiScaleRatio)
readonly property real settingsContentWidth: {
if (settingsLoader.item && settingsLoader.item.implicitWidth > 0) {
return settingsLoader.item.implicitWidth;
}
return defaultContentWidth;
}
readonly property real dialogPadding: Style.marginXL
width: Math.max(settingsContentWidth + dialogPadding * 2, 500)
height: Math.min(content.implicitHeight + dialogPadding * 2, maxHeight)
padding: 0
modal: true
anchors.centerIn: parent
onOpened: {
if (widgetData && widgetId) {
loadWidgetSettings();
}
}
background: Rectangle {
color: Color.mSurface
radius: Style.radiusL
border.color: Color.mPrimary
border.width: Style.borderM
}
contentItem: ColumnLayout {
id: content
anchors.fill: parent
anchors.margins: dialogPadding
spacing: Style.marginM
// Title
RowLayout {
id: titleRow
Layout.fillWidth: true
Layout.preferredHeight: implicitHeight
NText {
text: I18n.tr("system.widget-settings-title", {
"widget": root.widgetId
})
pointSize: Style.fontSizeL
font.weight: Style.fontWeightBold
color: Color.mPrimary
Layout.fillWidth: true
}
NIconButton {
icon: "close"
tooltipText: I18n.tr("common.close")
onClicked: saveAndClose()
}
}
// Separator
Rectangle {
id: separator
Layout.fillWidth: true
Layout.preferredHeight: 1
color: Color.mOutline
}
// Scrollable settings area
NScrollView {
id: scrollView
Layout.fillWidth: true
Layout.fillHeight: true
Layout.minimumHeight: 100
gradientColor: Color.mSurface
reserveScrollbarSpace: false
ColumnLayout {
width: scrollView.availableWidth
spacing: Style.marginM
Loader {
id: settingsLoader
Layout.fillWidth: true
onItemChanged: {
if (item) {
// Force width recalculation when content loads
Qt.callLater(() => {
root.width = Math.max(root.settingsContentWidth + root.dialogPadding * 2, 500);
});
}
}
}
}
}
}
Timer {
id: saveTimer
running: false
interval: 150
onTriggered: {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
}
}
Connections {
target: settingsLoader.item
ignoreUnknownSignals: true
function onSettingsChanged(newSettings) {
if (newSettings) {
root.settingsCache = newSettings;
saveTimer.start();
}
}
}
function saveAndClose() {
if (settingsLoader.item && typeof settingsLoader.item.saveSettings === 'function') {
var newSettings = settingsLoader.item.saveSettings();
if (newSettings) {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
}
}
root.close();
}
function loadWidgetSettings() {
const widgetSettingsMap = {
"CustomButton": "WidgetSettings/CustomButtonSettings.qml"
};
const source = widgetSettingsMap[widgetId];
if (source) {
settingsLoader.setSource(source, {
"widgetData": widgetData,
"widgetMetadata": ControlCenterWidgetRegistry.widgetMetadata[widgetId]
});
}
}
}