summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml310
1 files changed, 310 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml
new file mode 100644
index 0000000..7c36e4b
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml
@@ -0,0 +1,310 @@
+import QtQuick
+import qs.Common
+import qs.Widgets
+
+Column {
+ id: root
+
+ property string outputName: ""
+ property var outputData: null
+ property bool expanded: false
+
+ width: parent.width
+ spacing: 0
+
+ Rectangle {
+ width: parent.width
+ height: headerRow.implicitHeight + Theme.spacingS * 2
+ color: headerMouse.containsMouse ? Theme.withAlpha(Theme.primary, 0.1) : "transparent"
+ radius: Theme.cornerRadius / 2
+
+ Row {
+ id: headerRow
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.leftMargin: Theme.spacingS
+ anchors.rightMargin: Theme.spacingS
+ spacing: Theme.spacingS
+
+ DankIcon {
+ name: root.expanded ? "expand_more" : "chevron_right"
+ size: Theme.iconSize
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: I18n.tr("Compositor Settings")
+ font.pixelSize: Theme.fontSizeMedium
+ font.weight: Font.Medium
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ MouseArea {
+ id: headerMouse
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: root.expanded = !root.expanded
+ }
+ }
+
+ Column {
+ id: settingsColumn
+ width: parent.width
+ spacing: Theme.spacingS
+ visible: root.expanded
+ topPadding: Theme.spacingS
+
+ property int currentBitdepth: {
+ DisplayConfigState.pendingHyprlandChanges;
+ return DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "bitdepth", 8);
+ }
+ property bool is10Bit: currentBitdepth === 10
+
+ property string currentCm: {
+ DisplayConfigState.pendingHyprlandChanges;
+ return DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "colorManagement", "auto");
+ }
+ property bool isHdrMode: currentCm === "hdr" || currentCm === "hdredid"
+
+ DankToggle {
+ width: parent.width
+ text: I18n.tr("Disable Output")
+ checked: DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "disabled", false)
+ onToggled: checked => DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "disabled", checked)
+ }
+
+ DankDropdown {
+ width: parent.width
+ text: I18n.tr("Mirror Display")
+ addHorizontalPadding: true
+
+ property var otherOutputs: {
+ const list = [I18n.tr("None")];
+ for (const name in DisplayConfigState.outputs) {
+ if (name !== root.outputName)
+ list.push(name);
+ }
+ return list;
+ }
+ options: otherOutputs
+
+ currentValue: {
+ DisplayConfigState.pendingChanges;
+ const pending = DisplayConfigState.getPendingValue(root.outputName, "mirror");
+ const val = pending !== undefined ? pending : (root.outputData.mirror || "");
+ return val === "" ? I18n.tr("None") : val;
+ }
+
+ onValueChanged: value => {
+ const realVal = value === I18n.tr("None") ? "" : value;
+ DisplayConfigState.setPendingChange(root.outputName, "mirror", realVal);
+ }
+ }
+
+ DankToggle {
+ width: parent.width
+ text: I18n.tr("10-bit Color")
+ description: I18n.tr("Enable 10-bit color depth for wider color gamut and HDR support")
+ checked: settingsColumn.is10Bit
+ onToggled: checked => {
+ if (checked) {
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "bitdepth", 10);
+ } else {
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "bitdepth", null);
+ if (settingsColumn.isHdrMode)
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "colorManagement", "auto");
+ }
+ }
+ }
+
+ Column {
+ width: parent.width
+ spacing: Theme.spacingS
+ visible: settingsColumn.is10Bit
+
+ Rectangle {
+ width: parent.width
+ height: 1
+ color: Theme.withAlpha(Theme.outline, 0.15)
+ }
+
+ DankDropdown {
+ width: parent.width
+ text: I18n.tr("Color Gamut")
+ addHorizontalPadding: true
+ currentValue: {
+ DisplayConfigState.pendingHyprlandChanges;
+ const val = DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "colorManagement", "auto");
+ return cmLabelMap[val] || I18n.tr("Auto (Wide)");
+ }
+ options: [I18n.tr("Auto (Wide)"), I18n.tr("Wide (BT2020)"), "DCI-P3", "Apple P3", "Adobe RGB", "EDID", "HDR", I18n.tr("HDR (EDID)")]
+
+ property var cmValueMap: ({
+ [I18n.tr("Auto (Wide)")]: "auto",
+ [I18n.tr("Wide (BT2020)")]: "wide",
+ "DCI-P3": "dcip3",
+ "Apple P3": "dp3",
+ "Adobe RGB": "adobe",
+ "EDID": "edid",
+ "HDR": "hdr",
+ [I18n.tr("HDR (EDID)")]: "hdredid"
+ })
+
+ property var cmLabelMap: ({
+ "auto": I18n.tr("Auto (Wide)"),
+ "wide": I18n.tr("Wide (BT2020)"),
+ "dcip3": "DCI-P3",
+ "dp3": "Apple P3",
+ "adobe": "Adobe RGB",
+ "edid": "EDID",
+ "hdr": "HDR",
+ "hdredid": I18n.tr("HDR (EDID)")
+ })
+
+ onValueChanged: value => {
+ const cmValue = cmValueMap[value] || "auto";
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "colorManagement", cmValue);
+ }
+ }
+
+ Rectangle {
+ width: parent.width - Theme.spacingM * 2
+ anchors.horizontalCenter: parent.horizontalCenter
+ height: warningColumn.implicitHeight + Theme.spacingM * 2
+ radius: Theme.cornerRadius / 2
+ color: Theme.withAlpha(Theme.warning, 0.15)
+ border.color: Theme.withAlpha(Theme.warning, 0.3)
+ border.width: 1
+ visible: settingsColumn.isHdrMode
+
+ Column {
+ id: warningColumn
+ anchors.fill: parent
+ anchors.margins: Theme.spacingM
+ spacing: Theme.spacingXS
+
+ Row {
+ spacing: Theme.spacingS
+ DankIcon {
+ name: "warning"
+ size: Theme.iconSize - 4
+ color: Theme.warning
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ StyledText {
+ text: I18n.tr("Experimental Feature")
+ font.pixelSize: Theme.fontSizeSmall
+ font.weight: Font.Medium
+ color: Theme.warning
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+ StyledText {
+ text: I18n.tr("HDR mode is experimental. Verify your monitor supports HDR before enabling.")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ wrapMode: Text.WordWrap
+ width: parent.width
+ }
+ }
+ }
+
+ Column {
+ width: parent.width
+ spacing: Theme.spacingS
+ visible: settingsColumn.isHdrMode
+
+ Rectangle {
+ width: parent.width
+ height: 1
+ color: Theme.withAlpha(Theme.outline, 0.15)
+ }
+
+ StyledText {
+ text: I18n.tr("HDR Tone Mapping")
+ font.pixelSize: Theme.fontSizeSmall
+ font.weight: Font.Medium
+ color: Theme.surfaceVariantText
+ leftPadding: Theme.spacingM
+ }
+
+ Row {
+ width: parent.width - Theme.spacingM * 2
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: Theme.spacingM
+
+ Column {
+ width: (parent.width - Theme.spacingM) / 2
+ spacing: Theme.spacingXS
+
+ StyledText {
+ text: I18n.tr("SDR Brightness")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ }
+
+ DankTextField {
+ width: parent.width
+ height: 40
+ placeholderText: "1.0 - 2.0"
+ text: {
+ DisplayConfigState.pendingHyprlandChanges;
+ const val = DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "sdrBrightness", null);
+ return val !== null ? val.toString() : "";
+ }
+ onEditingFinished: {
+ const trimmed = text.trim();
+ if (!trimmed) {
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "sdrBrightness", null);
+ return;
+ }
+ const val = parseFloat(trimmed);
+ if (isNaN(val) || val < 0.1 || val > 5.0)
+ return;
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "sdrBrightness", parseFloat(val.toFixed(2)));
+ }
+ }
+ }
+
+ Column {
+ width: (parent.width - Theme.spacingM) / 2
+ spacing: Theme.spacingXS
+
+ StyledText {
+ text: I18n.tr("SDR Saturation")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ }
+
+ DankTextField {
+ width: parent.width
+ height: 40
+ placeholderText: "0.5 - 1.5"
+ text: {
+ DisplayConfigState.pendingHyprlandChanges;
+ const val = DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "sdrSaturation", null);
+ return val !== null ? val.toString() : "";
+ }
+ onEditingFinished: {
+ const trimmed = text.trim();
+ if (!trimmed) {
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "sdrSaturation", null);
+ return;
+ }
+ const val = parseFloat(trimmed);
+ if (isNaN(val) || val < 0.0 || val > 3.0)
+ return;
+ DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "sdrSaturation", parseFloat(val.toFixed(2)));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}