mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-13 07:42:46 -04:00
274 lines
7.9 KiB
Markdown
274 lines
7.9 KiB
Markdown
# Settings Components Reference
|
|
|
|
All plugin settings use the `PluginSettings` wrapper. Setting components auto-save on change and auto-load on creation.
|
|
|
|
## PluginSettings Wrapper
|
|
|
|
```qml
|
|
import QtQuick
|
|
import qs.Common
|
|
import qs.Widgets
|
|
import qs.Modules.Plugins
|
|
|
|
PluginSettings {
|
|
pluginId: "yourPlugin" // Required: must match plugin.json id
|
|
|
|
// Setting components go here
|
|
}
|
|
```
|
|
|
|
**Important:** The plugin must declare `"permissions": ["settings_write"]` in plugin.json for the settings UI to render. Without it, users see an error.
|
|
|
|
**PluginSettings provides to children:**
|
|
- `saveValue(key, value)` - save a setting value
|
|
- `loadValue(key, defaultValue)` - load a setting value
|
|
- `saveState(key, value)` - save plugin state (separate file)
|
|
- `loadState(key, defaultValue)` - load plugin state
|
|
- `clearState()` - clear all plugin state
|
|
- Variant management functions (for variant plugins)
|
|
|
|
## StringSetting
|
|
|
|
Text input field.
|
|
|
|
```qml
|
|
StringSetting {
|
|
settingKey: "apiKey" // Required: storage key
|
|
label: "API Key" // Required: display label
|
|
description: "Your API key" // Optional: help text
|
|
placeholder: "sk-..." // Optional: input placeholder
|
|
defaultValue: "" // Optional: default (default: "")
|
|
}
|
|
```
|
|
|
|
**Layout:** Vertical stack - label, description, input field.
|
|
|
|
## ToggleSetting
|
|
|
|
Boolean toggle switch.
|
|
|
|
```qml
|
|
ToggleSetting {
|
|
settingKey: "notifications" // Required: storage key
|
|
label: "Enable Notifications" // Required: display label
|
|
description: "Show alerts" // Optional: help text
|
|
defaultValue: true // Optional: default (default: false)
|
|
}
|
|
```
|
|
|
|
**Layout:** Horizontal - label/description on left, toggle on right.
|
|
|
|
## SelectionSetting
|
|
|
|
Dropdown menu.
|
|
|
|
```qml
|
|
SelectionSetting {
|
|
settingKey: "theme" // Required: storage key
|
|
label: "Theme" // Required: display label
|
|
description: "Color scheme" // Optional: help text
|
|
options: [ // Required: array of options
|
|
{ label: "Dark", value: "dark" },
|
|
{ label: "Light", value: "light" },
|
|
{ label: "Auto", value: "auto" }
|
|
]
|
|
defaultValue: "dark" // Optional: default value
|
|
}
|
|
```
|
|
|
|
Options can be `{ label, value }` objects or simple strings. Stores the `value` field, displays the `label` field.
|
|
|
|
**Layout:** Horizontal - label/description on left, dropdown on right.
|
|
|
|
**Reacting to changes:**
|
|
```qml
|
|
SelectionSetting {
|
|
settingKey: "updateInterval"
|
|
label: "Update Interval"
|
|
options: [
|
|
{ label: "1 minute", value: "60" },
|
|
{ label: "5 minutes", value: "300" }
|
|
]
|
|
defaultValue: "300"
|
|
onValueChanged: (newValue) => {
|
|
console.log("Interval changed to:", newValue)
|
|
}
|
|
}
|
|
```
|
|
|
|
## SliderSetting
|
|
|
|
Numeric slider with min/max.
|
|
|
|
```qml
|
|
SliderSetting {
|
|
settingKey: "opacity" // Required: storage key
|
|
label: "Opacity" // Required: display label
|
|
description: "Background" // Optional: help text
|
|
defaultValue: 85 // Optional: default value
|
|
minimum: 0 // Required: min value
|
|
maximum: 100 // Required: max value
|
|
unit: "%" // Optional: unit label shown after value
|
|
leftIcon: "dark_mode" // Optional: Material icon on left
|
|
rightIcon: "light_mode" // Optional: Material icon on right
|
|
}
|
|
```
|
|
|
|
## ColorSetting
|
|
|
|
Color picker.
|
|
|
|
```qml
|
|
ColorSetting {
|
|
settingKey: "accentColor" // Required: storage key
|
|
label: "Accent Color" // Required: display label
|
|
description: "Custom accent" // Optional: help text
|
|
defaultValue: "#ff5722" // Optional: default hex color
|
|
}
|
|
```
|
|
|
|
Displays a color swatch that opens a color picker dialog.
|
|
|
|
## ListSetting
|
|
|
|
Manage a list of items with manual add/remove. Use when you need custom UI for adding items.
|
|
|
|
```qml
|
|
ListSetting {
|
|
id: itemList
|
|
settingKey: "items" // Required: storage key
|
|
label: "Saved Items" // Required: display label
|
|
description: "Your items" // Optional: help text
|
|
defaultValue: [] // Optional: default array
|
|
delegate: Component { // Optional: custom item display
|
|
StyledRect {
|
|
width: parent.width
|
|
height: 40
|
|
radius: Theme.cornerRadius
|
|
color: Theme.surfaceContainerHigh
|
|
|
|
StyledText {
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.spacingM
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
text: modelData.name
|
|
color: Theme.surfaceText
|
|
}
|
|
|
|
Rectangle {
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Theme.spacingM
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width: 60
|
|
height: 28
|
|
color: removeArea.containsMouse ? Theme.errorHover : Theme.error
|
|
radius: Theme.cornerRadius
|
|
|
|
StyledText {
|
|
anchors.centerIn: parent
|
|
text: "Remove"
|
|
color: Theme.errorText
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
font.weight: Font.Medium
|
|
}
|
|
|
|
MouseArea {
|
|
id: removeArea
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: itemList.removeItem(index)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Methods:**
|
|
- `addItem(item)` - add an item to the list
|
|
- `removeItem(index)` - remove item at index
|
|
|
|
## ListSettingWithInput
|
|
|
|
Complete list management with built-in form. Best for collecting structured data.
|
|
|
|
```qml
|
|
ListSettingWithInput {
|
|
settingKey: "locations" // Required: storage key
|
|
label: "Locations" // Required: display label
|
|
description: "Track zones" // Optional: help text
|
|
defaultValue: [] // Optional: default array
|
|
fields: [ // Required: field definitions
|
|
{
|
|
id: "name", // Required: key in saved object
|
|
label: "Name", // Required: column header
|
|
placeholder: "Home", // Optional: input placeholder
|
|
width: 150, // Optional: column width (default: 200)
|
|
required: true // Optional: must have value to add
|
|
},
|
|
{
|
|
id: "timezone",
|
|
label: "Timezone",
|
|
placeholder: "America/New_York",
|
|
width: 200,
|
|
required: true
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Automatically generates: column headers, input fields, add button with validation, list display, remove buttons.
|
|
|
|
## Mixing Custom UI with Settings
|
|
|
|
You can interleave regular QML elements with setting components:
|
|
|
|
```qml
|
|
PluginSettings {
|
|
pluginId: "myPlugin"
|
|
|
|
StyledText {
|
|
width: parent.width
|
|
text: "General Settings"
|
|
font.pixelSize: Theme.fontSizeLarge
|
|
font.weight: Font.Bold
|
|
color: Theme.surfaceText
|
|
}
|
|
|
|
StringSetting {
|
|
settingKey: "name"
|
|
label: "Display Name"
|
|
}
|
|
|
|
StyledText {
|
|
width: parent.width
|
|
text: "Advanced Settings"
|
|
font.pixelSize: Theme.fontSizeLarge
|
|
font.weight: Font.Bold
|
|
color: Theme.surfaceText
|
|
topPadding: Theme.spacingL
|
|
}
|
|
|
|
ToggleSetting {
|
|
settingKey: "debug"
|
|
label: "Debug Mode"
|
|
defaultValue: false
|
|
}
|
|
}
|
|
```
|
|
|
|
## Default Values
|
|
|
|
Define sensible defaults in every setting component. The default is used when no saved value exists:
|
|
|
|
```qml
|
|
StringSetting { settingKey: "text"; defaultValue: "Hello" }
|
|
ToggleSetting { settingKey: "enabled"; defaultValue: true }
|
|
SelectionSetting { settingKey: "mode"; defaultValue: "auto" }
|
|
SliderSetting { settingKey: "opacity"; defaultValue: 85 }
|
|
ColorSetting { settingKey: "color"; defaultValue: "#ff5722" }
|
|
ListSetting { settingKey: "items"; defaultValue: [] }
|
|
ListSettingWithInput { settingKey: "data"; defaultValue: [] }
|
|
```
|