[games/chessament] src/settings: Rework import rating list dialog

Manuel Alcaraz Zambrano <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 8d3eb6d81c8ebf1041610033b9f92190983b6c5e by Manuel Alcaraz Zambrano.
Committed on 02/08/2026 at 21:27.
Pushed by manuelal into branch 'master'.

Rework import rating list dialog

A  +126  -0    src/settings/AddRatingListDialog.qml     [License: GPL(v3.0+)]
M  +1    -0    src/settings/CMakeLists.txt
M  +33   -99   src/settings/RatingListsPage.qml

https://invent.kde.org/games/chessament/-/commit/8d3eb6d81c8ebf1041610033b9f92190983b6c5e

diff --git a/src/settings/AddRatingListDialog.qml b/src/settings/AddRatingListDialog.qml
new file mode 100644
index 0000000..009ee5f
--- /dev/null
+++ b/src/settings/AddRatingListDialog.qml
@@ -0,0 +1,126 @@
+// SPDX-FileCopyrightText: 2026 Manuel Alcaraz Zambrano <[email protected]>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+pragma ComponentBehavior: Bound
+
+import QtCore
+import QtQml
+import QtQuick
+import QtQuick.Controls as Controls
+import QtQuick.Dialogs as Dialogs
+import QtQuick.Layouts
+
+import org.kde.ki18n
+import org.kde.kirigami as Kirigami
+import org.kde.kirigamiaddons.formcard as FormCard
+
+import org.kde.chessament
+
+FormCard.FormCardDialog {
+    id: dialog
+
+    required property RatingListModel model
+
+    property string error
+    property bool finished: false
+    property bool importing: false
+    property bool waiting: !(importing || finished)
+
+    title: {
+        if (error) {
+            return KI18n.i18nc("@title", "Error");
+        }
+        if (importing) {
+            return KI18n.i18nc("@title:window", "Importing Rating List");
+        }
+        if (finished) {
+            return KI18n.i18nc("@title:window", "Rating List Imported");
+        }
+        return KI18n.i18nc("@title:window", "Add Rating List");
+    }
+
+    parent: Controls.Overlay.overlay
+    closePolicy: dialog.waiting || dialog.finished ? Controls.Dialog.CloseOnEscape | Controls.Dialog.CloseOnPressOutside : Controls.Dialog.NoAutoClose
+    implicitWidth: Kirigami.Units.gridUnit * 20
+
+    function importList(): void {
+        dialog.error = "";
+        dialog.importing = true;
+
+        dialog.model.importRatingList(nameField.text, urlField.editText).then(error => {
+            if (error) {
+                dialog.error = error;
+            }
+            dialog.importing = false;
+            dialog.finished = true;
+        });
+    }
+
+    Dialogs.FileDialog {
+        id: fileDialog
+        nameFilters: [KI18n.i18nc("@label:listbox", "All Supported Files (*.zip *.xls)")]
+        currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
+        onAccepted: urlField.editText = selectedFile.toString().replace("file://", "")
+    }
+
+    FormCard.FormTextFieldDelegate {
+        id: nameField
+        label: KI18n.i18nc("@info:label", "Name")
+        visible: dialog.waiting
+    }
+
+    FormCard.FormComboBoxDelegate {
+        id: urlField
+        text: KI18n.i18nc("@info:label", "Rating list file or URL")
+        visible: dialog.waiting
+        editable: true
+        model: ["https://ratings.fide.com/download/players_list.zip"]
+        trailing: Controls.Button {
+            icon.name: "document-open-data-symbolic"
+            text: KI18n.i18nc("@action:button", "Select file")
+            display: Controls.AbstractButton.IconOnly
+            onPressed: fileDialog.open()
+            Controls.ToolTip.text: text
+            Controls.ToolTip.visible: hovered
+            Controls.ToolTip.delay: Kirigami.Units.toolTipDelay
+        }
+    }
+
+    FormCard.AbstractFormDelegate {
+        visible: dialog.importing
+        background: null
+
+        contentItem: Controls.BusyIndicator {
+            Layout.fillWidth: true
+            Layout.alignment: Qt.AlignHCenter
+        }
+    }
+
+    FormCard.FormTextDelegate {
+        text: dialog.error.length > 0 ? dialog.error : dialog.model.status
+        visible: !dialog.waiting
+        textItem.horizontalAlignment: dialog.importing ? Text.AlignHCenter : Text.AlignLeft
+    }
+
+    footer: Controls.DialogButtonBox {
+        visible: !dialog.importing
+        horizontalPadding: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
+        bottomPadding: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
+        topPadding: Kirigami.Units.smallSpacing
+        spacing: Kirigami.Units.mediumSpacing
+
+        standardButtons: if (dialog.waiting) {
+            return Controls.Dialog.Cancel;
+        } else {
+            return Controls.Dialog.Close;
+        }
+
+        Controls.Button {
+            text: KI18n.i18nc("@action:button", "Import")
+            icon.name: "document-import-symbolic"
+            visible: dialog.waiting && nameField.text.trim().length > 0 && dialog.model.isValidUrl(urlField.editText)
+            onClicked: dialog.importList()
+            Controls.DialogButtonBox.buttonRole: Controls.DialogButtonBox.ActionRole
+        }
+    }
+}
diff --git a/src/settings/CMakeLists.txt b/src/settings/CMakeLists.txt
index 00e06ff..986bc95 100644
--- a/src/settings/CMakeLists.txt
+++ b/src/settings/CMakeLists.txt
@@ -9,6 +9,7 @@ ecm_add_qml_module(chessament_settings
     QML_FILES
         AccountsPage.qml
         AddAccountDialog.qml
+        AddRatingListDialog.qml
         ChessamentConfigurationView.qml
         GeneralPage.qml
         RatingListsPage.qml
diff --git a/src/settings/RatingListsPage.qml b/src/settings/RatingListsPage.qml
index d968ffc..a914902 100644
--- a/src/settings/RatingListsPage.qml
+++ b/src/settings/RatingListsPage.qml
@@ -3,11 +3,9 @@
 
 pragma ComponentBehavior: Bound
 
-import QtCore
 import QtQml
 import QtQuick
 import QtQuick.Controls as Controls
-import QtQuick.Dialogs as Dialogs
 import QtQuick.Layouts as Layouts
 
 import org.kde.ki18n
@@ -23,126 +21,55 @@ FormCard.FormCardPage {
 
     title: KI18n.i18nc("@title", "Rating Lists")
 
-    FormCard.FormCardDialog {
-        id: addListDialog
-        parent: Controls.Overlay.overlay
-        title: KI18n.i18nc("@title:window", "Add Rating List")
-        footer: Controls.DialogButtonBox {
-            standardButtons: Controls.Dialog.Cancel
-
-            Controls.Button {
-                text: KI18n.i18nc("@action:button", "Import")
-                icon.name: "document-import-symbolic"
-                enabled: nameField.text.trim().length > 0 && listsModel.isValidUrl(urlField.editText)
-                Controls.DialogButtonBox.buttonRole: Controls.DialogButtonBox.AcceptRole
-            }
-        }
-
-        onAccepted: {
-            importingDialog.error = "";
-            importingDialog.finished = false;
-            importingDialog.open();
-
-            listsModel.importRatingList(nameField.text, urlField.editText).then(error => {
-                if (error) {
-                    importingDialog.error = error;
-                }
-                importingDialog.finished = true;
-            });
-        }
-
-        Dialogs.FileDialog {
-            id: fileDialog
-            nameFilters: [KI18n.i18nc("@label:listbox", "All Supported Files (*.zip *.xls)")]
-            currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
-            onAccepted: urlField.editText = selectedFile.toString().replace("file://", "")
-        }
-
-        FormCard.FormTextFieldDelegate {
-            id: nameField
-            label: KI18n.i18nc("@info:label", "Name")
-        }
-
-        FormCard.FormComboBoxDelegate {
-            id: urlField
-            text: KI18n.i18nc("@info:label", "Rating list file or URL")
-            editable: true
-            model: ["https://ratings.fide.com/download/players_list.zip"]
-            trailing: Controls.Button {
-                icon.name: "document-open-data-symbolic"
-                text: KI18n.i18nc("@action:button", "Select file")
-                display: Controls.AbstractButton.IconOnly
-                onPressed: fileDialog.open()
-                Controls.ToolTip.text: text
-                Controls.ToolTip.visible: hovered
-                Controls.ToolTip.delay: Kirigami.Units.toolTipDelay
-            }
-        }
-    }
-
     Kirigami.Dialog {
-        id: importingDialog
+        id: deleteListDialog
 
-        property string error
+        property int row
+        property string name
+        property bool waiting: false
         property bool finished: false
 
         parent: Controls.Overlay.overlay
-        title: {
-            if (error) {
-                return KI18n.i18nc("@title", "Error");
-            }
-            if (finished) {
-                return KI18n.i18nc("@title:window", "Rating List Imported");
-            }
-            return KI18n.i18nc("@title:window", "Importing Rating List");
-        }
+        title: KI18n.i18nc("@title", "Delete Rating List")
         closePolicy: Controls.Dialog.NoAutoClose
         showCloseButton: false
         padding: Kirigami.Units.largeSpacing
-        standardButtons: {
-            if (importingDialog.finished) {
-                return Controls.Dialog.Close;
-            }
-
-            return Controls.Dialog.NoButton;
-        }
 
         Layouts.ColumnLayout {
             Controls.BusyIndicator {
                 Layouts.Layout.fillWidth: true
                 Layouts.Layout.alignment: Qt.AlignHCenter
 
-                visible: !importingDialog.finished
+                visible: deleteListDialog.waiting
             }
-
             Controls.Label {
-                Layouts.Layout.fillWidth: true
-
-                text: importingDialog.error.length > 0 ? importingDialog.error : listsModel.status
-                horizontalAlignment: Text.AlignHCenter
+                text: KI18n.i18nc("@label", "Permanently delete rating list \"%1\"?", deleteListDialog.name)
+                visible: !(deleteListDialog.finished || deleteListDialog.waiting)
             }
         }
-    }
-
-    Kirigami.PromptDialog {
-        id: deleteListDialog
-
-        property int row
-        property string name
-
-        parent: Controls.Overlay.overlay
-        title: KI18n.i18nc("@title", "Delete Rating List")
-        subtitle: KI18n.i18nc("@label", "Permanently delete rating list \"%1\"?", deleteListDialog.name)
-
-        onAccepted: listsModel.removeList(deleteListDialog.row)
 
         footer: Controls.DialogButtonBox {
-            standardButtons: Controls.Dialog.Cancel
+            visible: !(deleteListDialog.finished || deleteListDialog.waiting)
+
+            standardButtons: if (deleteListDialog.finished && !deleteListDialog.waiting) {
+                return Controls.Dialog.Close;
+            } else if (!deleteListDialog.waiting) {
+                return Controls.Dialog.Cancel;
+            } else {
+                return Controls.Dialog.NoButton;
+            }
 
             Controls.Button {
                 text: KI18n.i18nc("@action:button Delete Rating List", "Delete")
                 icon.name: "delete-symbolic"
-                Controls.DialogButtonBox.buttonRole: Controls.DialogButtonBox.AcceptRole
+                visible: !(deleteListDialog.finished || deleteListDialog.waiting)
+                onClicked: function (): void {
+                    deleteListDialog.waiting = true;
+
+                    listsModel.removeList(deleteListDialog.row).then(() => {
+                        deleteListDialog.close();
+                    });
+                }
             }
         }
     }
@@ -180,6 +107,8 @@ FormCard.FormCardPage {
                     onPressed: {
                         deleteListDialog.row = listDelegate.row;
                         deleteListDialog.name = listDelegate.name;
+                        deleteListDialog.waiting = false;
+                        deleteListDialog.finished = false;
                         deleteListDialog.open();
                     }
                     Controls.ToolTip.text: KI18n.i18nc("@action:button", "Delete rating list")
@@ -193,7 +122,12 @@ FormCard.FormCardPage {
 
         FormCard.FormButtonDelegate {
             text: KI18n.i18nc("@action:button", "Add rating list")
-            onClicked: addListDialog.open()
+            onClicked: {
+                const dialog = Qt.createComponent("org.kde.chessament.settings", "AddRatingListDialog").createObject(root, {
+                    "model": listsModel
+                }) as AddRatingListDialog;
+                dialog.open();
+            }
         }
     }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.