Files
Dotfiles/noctalia/plugins/fancy-audiovisualizer/DesktopWidgetSettings.qml
T
2026-04-19 17:07:18 +02:00

245 lines
8.1 KiB
QML

import QtQuick
import QtQuick.Layouts
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
property var pluginApi: null
property var widgetSettings: null
property var screen: null
spacing: Style.marginM
// Local state for editing
property real valueSensitivity: widgetSettings?.data?.sensitivity ?? pluginApi?.pluginSettings?.sensitivity ?? 1.5
property real valueRotationSpeed: widgetSettings?.data?.rotationSpeed ?? pluginApi?.pluginSettings?.rotationSpeed ?? 0.5
property real valueBarWidth: widgetSettings?.data?.barWidth ?? pluginApi?.pluginSettings?.barWidth ?? 0.6
property real valueRingOpacity: widgetSettings?.data?.ringOpacity ?? pluginApi?.pluginSettings?.ringOpacity ?? 0.8
property real valueBloomIntensity: widgetSettings?.data?.bloomIntensity ?? pluginApi?.pluginSettings?.bloomIntensity ?? 0.5
property int valueVisualizationMode: widgetSettings?.data?.visualizationMode ?? pluginApi?.pluginSettings?.visualizationMode ?? 3
property real valueWaveThickness: widgetSettings?.data?.waveThickness ?? pluginApi?.pluginSettings?.waveThickness ?? 1.0
property real valueInnerDiameter: widgetSettings?.data?.innerDiameter ?? pluginApi?.pluginSettings?.innerDiameter ?? 0.7
property bool valueFadeWhenIdle: widgetSettings?.data?.fadeWhenIdle ?? pluginApi?.pluginSettings?.fadeWhenIdle ?? true
property bool valueUseCustomColors: widgetSettings?.data?.useCustomColors ?? pluginApi?.pluginSettings?.useCustomColors ?? false
property color valueCustomPrimaryColor: widgetSettings?.data?.customPrimaryColor ?? pluginApi?.pluginSettings?.customPrimaryColor ?? "#6750A4"
property color valueCustomSecondaryColor: widgetSettings?.data?.customSecondaryColor ?? pluginApi?.pluginSettings?.customSecondaryColor ?? "#625B71"
// Mode helpers
readonly property bool modeHasBars: valueVisualizationMode === 0 || valueVisualizationMode === 3 || valueVisualizationMode === 5
readonly property bool modeHasWave: valueVisualizationMode === 1 || valueVisualizationMode === 4 || valueVisualizationMode === 5
readonly property bool modeHasRings: valueVisualizationMode >= 2
NHeader {
label: pluginApi?.tr("settings.title") ?? "Visualizer Settings"
description: pluginApi?.tr("settings.description") ?? "Configure the audio visualizer appearance"
}
// Visualization mode selector
NComboBox {
Layout.fillWidth: true
label: pluginApi?.tr("settings.visualizationMode") ?? "Visualization Mode"
description: pluginApi?.tr("settings.visualizationMode-description") ?? "Choose visualization style"
model: [
{"key": "0", "name": pluginApi?.tr("settings.mode.bars") ?? "Bars"},
{"key": "1", "name": pluginApi?.tr("settings.mode.wave") ?? "Wave"},
{"key": "2", "name": pluginApi?.tr("settings.mode.rings") ?? "Rings"},
{"key": "3", "name": pluginApi?.tr("settings.mode.barsRings") ?? "Bars + Rings"},
{"key": "4", "name": pluginApi?.tr("settings.mode.waveRings") ?? "Wave + Rings"},
{"key": "5", "name": pluginApi?.tr("settings.mode.all") ?? "All"}
]
currentKey: String(root.valueVisualizationMode)
onSelected: key => {
root.valueVisualizationMode = parseInt(key);
root.saveSettings();
}
}
// Wave thickness slider (shown when mode includes wave)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasWave
label: pluginApi?.tr("settings.waveThickness") ?? "Wave Thickness"
value: root.valueWaveThickness
from: 0.3
to: 2.0
stepSize: 0.1
onMoved: value => {
root.valueWaveThickness = value;
root.saveSettings();
}
}
// Sensitivity slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.sensitivity") ?? "Sensitivity"
value: root.valueSensitivity
from: 0.5
to: 3.0
stepSize: 0.1
onMoved: value => {
root.valueSensitivity = value;
root.saveSettings();
}
}
// Rotation speed slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.rotationSpeed") ?? "Rotation Speed"
value: root.valueRotationSpeed
from: 0.0
to: 2.0
stepSize: 0.1
onMoved: value => {
root.valueRotationSpeed = value;
root.saveSettings();
}
}
// Bar width slider (shown when mode includes bars)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasBars
label: pluginApi?.tr("settings.barWidth") ?? "Bar Width"
value: root.valueBarWidth
from: 0.2
to: 1.0
stepSize: 0.1
onMoved: value => {
root.valueBarWidth = value;
root.saveSettings();
}
}
// Ring opacity slider (shown when mode includes rings)
NValueSlider {
Layout.fillWidth: true
visible: root.modeHasRings
label: pluginApi?.tr("settings.ringOpacity") ?? "Ring Opacity"
value: root.valueRingOpacity
from: 0.0
to: 1.0
stepSize: 0.1
onMoved: value => {
root.valueRingOpacity = value;
root.saveSettings();
}
}
// Base diameter slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.innerDiameter") ?? "Inner Diameter"
value: root.valueInnerDiameter
from: 0
to: 1
stepSize: 0.05
onMoved: value => {
root.valueInnerDiameter = value;
root.saveSettings();
}
}
// Bloom intensity slider
NValueSlider {
Layout.fillWidth: true
label: pluginApi?.tr("settings.bloomIntensity") ?? "Bloom Intensity"
value: root.valueBloomIntensity
from: 0.0
to: 1.0
stepSize: 0.05
onMoved: value => {
root.valueBloomIntensity = value;
root.saveSettings();
}
}
// Fade when idle toggle
NToggle {
label: pluginApi?.tr("settings.fadeWhenIdle") ?? "Fade When Idle"
description: pluginApi?.tr("settings.fadeWhenIdle-description") ?? "Fade out visualizer when no audio is playing"
checked: root.valueFadeWhenIdle
onToggled: checked => {
root.valueFadeWhenIdle = checked;
root.saveSettings();
}
}
// Use custom colors toggle
NToggle {
label: pluginApi?.tr("settings.useCustomColors") ?? "Use Custom Colors"
description: pluginApi?.tr("settings.useCustomColors-description") ?? "Override theme colors with custom colors"
checked: root.valueUseCustomColors
onToggled: checked => {
root.valueUseCustomColors = checked;
root.saveSettings();
}
}
// Custom primary color picker
RowLayout {
Layout.fillWidth: true
visible: root.valueUseCustomColors
spacing: Style.marginM
NText {
text: pluginApi?.tr("settings.customPrimaryColor") ?? "Primary Color"
Layout.fillWidth: true
}
NColorPicker {
screen: Screen
selectedColor: root.valueCustomPrimaryColor
onColorSelected: color => {
root.valueCustomPrimaryColor = color;
root.saveSettings();
}
}
}
// Custom secondary color picker
RowLayout {
Layout.fillWidth: true
visible: root.valueUseCustomColors
spacing: Style.marginM
NText {
text: pluginApi?.tr("settings.customSecondaryColor") ?? "Secondary Color"
Layout.fillWidth: true
}
NColorPicker {
screen: Screen
selectedColor: root.valueCustomSecondaryColor
onColorSelected: color => {
root.valueCustomSecondaryColor = color;
root.saveSettings();
}
}
}
// Called when user clicks Apply/Save
function saveSettings() {
if (!widgetSettings)
return;
widgetSettings.data.sensitivity = root.valueSensitivity;
widgetSettings.data.rotationSpeed = root.valueRotationSpeed;
widgetSettings.data.barWidth = root.valueBarWidth;
widgetSettings.data.ringOpacity = root.valueRingOpacity;
widgetSettings.data.bloomIntensity = root.valueBloomIntensity;
widgetSettings.data.visualizationMode = root.valueVisualizationMode;
widgetSettings.data.waveThickness = root.valueWaveThickness;
widgetSettings.data.innerDiameter = root.valueInnerDiameter;
widgetSettings.data.fadeWhenIdle = root.valueFadeWhenIdle;
widgetSettings.data.useCustomColors = root.valueUseCustomColors;
widgetSettings.data.customPrimaryColor = root.valueCustomPrimaryColor.toString();
widgetSettings.data.customSecondaryColor = root.valueCustomSecondaryColor.toString();
widgetSettings.save();
}
}