[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(); + } } } }