summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml291
1 files changed, 291 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml b/raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml
new file mode 100644
index 0000000..b9c9b90
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Modals/Common/ConfirmModal.qml
@@ -0,0 +1,291 @@
+import QtQuick
+import qs.Common
+import qs.Modals.Common
+import qs.Widgets
+
+DankModal {
+ id: root
+
+ layerNamespace: "dms:confirm-modal"
+ keepPopoutsOpen: true
+
+ property string confirmTitle: ""
+ property string confirmMessage: ""
+ property string confirmButtonText: "Confirm"
+ property string cancelButtonText: "Cancel"
+ property color confirmButtonColor: Theme.primary
+ property var onConfirm: function () {}
+ property var onCancel: function () {}
+ property int selectedButton: -1
+ property bool keyboardNavigation: false
+
+ function show(title, message, onConfirmCallback, onCancelCallback) {
+ confirmTitle = title || "";
+ confirmMessage = message || "";
+ confirmButtonText = "Confirm";
+ cancelButtonText = "Cancel";
+ confirmButtonColor = Theme.primary;
+ onConfirm = onConfirmCallback || (() => {});
+ onCancel = onCancelCallback || (() => {});
+ selectedButton = -1;
+ keyboardNavigation = false;
+ open();
+ }
+
+ function showWithOptions(options) {
+ confirmTitle = options.title || "";
+ confirmMessage = options.message || "";
+ confirmButtonText = options.confirmText || "Confirm";
+ cancelButtonText = options.cancelText || "Cancel";
+ confirmButtonColor = options.confirmColor || Theme.primary;
+ onConfirm = options.onConfirm || (() => {});
+ onCancel = options.onCancel || (() => {});
+ selectedButton = -1;
+ keyboardNavigation = false;
+ open();
+ }
+
+ function selectButton() {
+ close();
+ if (selectedButton === 0) {
+ if (onCancel) {
+ onCancel();
+ }
+ } else {
+ if (onConfirm) {
+ onConfirm();
+ }
+ }
+ }
+
+ shouldBeVisible: false
+ allowStacking: true
+ modalWidth: 350
+ modalHeight: contentLoader.item ? contentLoader.item.implicitHeight + Theme.spacingM * 2 : 160
+ enableShadow: true
+ shouldHaveFocus: true
+ onBackgroundClicked: {
+ close();
+ if (onCancel) {
+ onCancel();
+ }
+ }
+ onOpened: {
+ Qt.callLater(function () {
+ modalFocusScope.forceActiveFocus();
+ modalFocusScope.focus = true;
+ shouldHaveFocus = true;
+ });
+ }
+ modalFocusScope.Keys.onPressed: function (event) {
+ switch (event.key) {
+ case Qt.Key_Escape:
+ close();
+ if (onCancel) {
+ onCancel();
+ }
+ event.accepted = true;
+ break;
+ case Qt.Key_Left:
+ case Qt.Key_Up:
+ keyboardNavigation = true;
+ selectedButton = 0;
+ event.accepted = true;
+ break;
+ case Qt.Key_Right:
+ case Qt.Key_Down:
+ keyboardNavigation = true;
+ selectedButton = 1;
+ event.accepted = true;
+ break;
+ case Qt.Key_N:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = (selectedButton + 1) % 2;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_P:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = selectedButton === -1 ? 1 : (selectedButton - 1 + 2) % 2;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_J:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = 1;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_K:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = 0;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_H:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = 0;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_L:
+ if (event.modifiers & Qt.ControlModifier) {
+ keyboardNavigation = true;
+ selectedButton = 1;
+ event.accepted = true;
+ }
+ break;
+ case Qt.Key_Tab:
+ keyboardNavigation = true;
+ selectedButton = selectedButton === -1 ? 0 : (selectedButton + 1) % 2;
+ event.accepted = true;
+ break;
+ case Qt.Key_Return:
+ case Qt.Key_Enter:
+ if (selectedButton !== -1) {
+ selectButton();
+ } else {
+ selectedButton = 1;
+ selectButton();
+ }
+ event.accepted = true;
+ break;
+ }
+ }
+
+ content: Component {
+ Item {
+ anchors.fill: parent
+ implicitHeight: mainColumn.implicitHeight
+
+ Column {
+ id: mainColumn
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.leftMargin: Theme.spacingL
+ anchors.rightMargin: Theme.spacingL
+ anchors.topMargin: Theme.spacingL
+ spacing: 0
+
+ StyledText {
+ text: confirmTitle
+ font.pixelSize: Theme.fontSizeLarge
+ color: Theme.surfaceText
+ font.weight: Font.Medium
+ width: parent.width
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ Item {
+ width: 1
+ height: Theme.spacingL
+ }
+
+ StyledText {
+ text: confirmMessage
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceText
+ width: parent.width
+ horizontalAlignment: Text.AlignHCenter
+ wrapMode: Text.WordWrap
+ }
+
+ Item {
+ width: 1
+ height: Theme.spacingL * 1.5
+ }
+
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: Theme.spacingM
+
+ Rectangle {
+ width: 120
+ height: 40
+ radius: Theme.cornerRadius
+ color: {
+ if (keyboardNavigation && selectedButton === 0) {
+ return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12);
+ } else if (cancelButton.containsMouse) {
+ return Theme.surfacePressed;
+ } else {
+ return Theme.surfaceVariantAlpha;
+ }
+ }
+ border.color: (keyboardNavigation && selectedButton === 0) ? Theme.primary : "transparent"
+ border.width: (keyboardNavigation && selectedButton === 0) ? 1 : 0
+
+ StyledText {
+ text: cancelButtonText
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceText
+ font.weight: Font.Medium
+ anchors.centerIn: parent
+ }
+
+ MouseArea {
+ id: cancelButton
+
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ selectedButton = 0;
+ selectButton();
+ }
+ }
+ }
+
+ Rectangle {
+ width: 120
+ height: 40
+ radius: Theme.cornerRadius
+ color: {
+ const baseColor = confirmButtonColor;
+ if (keyboardNavigation && selectedButton === 1) {
+ return Qt.rgba(baseColor.r, baseColor.g, baseColor.b, 1);
+ } else if (confirmButton.containsMouse) {
+ return Qt.rgba(baseColor.r, baseColor.g, baseColor.b, 0.9);
+ } else {
+ return baseColor;
+ }
+ }
+ border.color: (keyboardNavigation && selectedButton === 1) ? "white" : "transparent"
+ border.width: (keyboardNavigation && selectedButton === 1) ? 1 : 0
+
+ StyledText {
+ text: confirmButtonText
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.primaryText
+ font.weight: Font.Medium
+ anchors.centerIn: parent
+ }
+
+ MouseArea {
+ id: confirmButton
+
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ selectedButton = 1;
+ selectButton();
+ }
+ }
+ }
+ }
+
+ Item {
+ width: 1
+ height: Theme.spacingL
+ }
+ }
+ }
+ }
+}