Warning, /education/kwordquiz/src/qml/WelcomePage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
0002 // SPDX-License-Identifier: LGPL-2.0-or-later
0003 
0004 import QtQuick 2.15
0005 import QtQuick.Layouts 1.15
0006 import QtQuick.Controls 2.15 as QQC2
0007 import Qt.labs.platform 1.1
0008 import org.kde.kirigami 2.20 as Kirigami
0009 import org.kde.kirigamiaddons.formcard 1.0 as FormCard
0010 import org.kde.kwordquiz 1.0
0011 import org.kde.newstuff 1.91 as NewStuff
0012 import QtQml 2.15
0013 
0014 FormCard.FormCardPage {
0015     id: root
0016 
0017     function openFile(file, mode) {
0018         const row = documentModel.add(file);
0019         switch (mode) {
0020         case Prefs.MultipleChoice:
0021             multipleChoiceRadio.checked = true;
0022             break;
0023         case Prefs.QA:
0024             qaRadio.checked = true;
0025             break;
0026         case Prefs.Flashcard:
0027         default:
0028             flashcardRadio.checked = true;
0029             break;
0030         }
0031         applicationWindow().pageStack.layers.clear();
0032         documentRepeater.itemAt(row).open();
0033     }
0034 
0035     title: i18nc("@title:window", "Welcome")
0036 
0037     data: FileDialog {
0038         id: fileDialog
0039 
0040         title: i18n("Please choose a KWordQuiz document")
0041         folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)
0042         nameFilters: [i18n("KEduDocument (*.kvtml)"), i18n("Wql documents (*.wql)"), i18n("CSV documents (*.csv)"), i18n("XDXF documents (*.xdxf)")]
0043 
0044         onAccepted: {
0045             documentModel.add(file);
0046             documentRepeater.itemAt(documentRepeater.count - 1).open();
0047         }
0048     }
0049 
0050     Kirigami.Icon {
0051         source: "org.kde.kwordquiz"
0052         Layout.alignment: Qt.AlignHCenter
0053         implicitWidth: Math.round(Kirigami.Units.iconSizes.huge * 1.5)
0054         implicitHeight: Math.round(Kirigami.Units.iconSizes.huge * 1.5)
0055     }
0056 
0057     Kirigami.Heading {
0058         text: i18n("Welcome to KWordQuiz")
0059 
0060         Layout.alignment: Qt.AlignHCenter
0061         Layout.topMargin: Kirigami.Units.largeSpacing
0062     }
0063 
0064     FormCard.FormGridContainer {
0065         Layout.fillWidth: true
0066         Layout.topMargin: Kirigami.Units.largeSpacing
0067 
0068         infoCards: [
0069             FormCard.FormGridContainer.InfoCard {
0070                 title: i18n("Open Existing Document")
0071                 action: Kirigami.Action {
0072                     onTriggered: fileDialog.open();
0073                 }
0074             },
0075             FormCard.FormGridContainer.InfoCard {
0076                 title: i18n("Create Deck")
0077                 action: Kirigami.Action {
0078                     onTriggered: applicationWindow().pageStack.layers.push("qrc:/qml/DeckEditorPage.qml", {
0079                         documentModel: documentModel,
0080                     })
0081                 }
0082             },
0083             FormCard.FormGridContainer.InfoCard {
0084                 title: i18n("Download Deck")
0085                 action: NewStuff.Action {
0086                     id: newStuffButton
0087                     configFile: "kwordquiz.knsrc"
0088                     viewMode: NewStuff.Page.ViewMode.Preview
0089                     onEntryEvent: function(entry, event) {
0090                         if (event === NewStuff.Entry.StatusChangedEvent) {
0091                             documentModel.entryChanged(entry);
0092                         }
0093                     }
0094                 }
0095             }
0096         ]
0097     }
0098 
0099     FormCard.FormHeader {
0100         title: i18nc("@title:group", "Mode")
0101     }
0102 
0103     FormCard.FormCard {
0104         data: QQC2.ButtonGroup {
0105             id: modeGroup
0106 
0107             checkedButton: switch (Prefs.startSession) {
0108             case Prefs.MultipleChoice:
0109                 return multipleChoiceRadio;
0110             case Prefs.QA:
0111                 return qaRadio;
0112             case Prefs.Flashcard:
0113             default:
0114                 return flashcardRadio;
0115             }
0116 
0117             onCheckedButtonChanged: {
0118                 switch (checkedButton) {
0119                 case qaRadio:
0120                     Prefs.startSession = Prefs.QA;
0121                     break;
0122                 case multipleChoiceRadio:
0123                     Prefs.startSession = Prefs.MultipleChoice;
0124                     break;
0125                 case flashcardRadio:
0126                     Prefs.startSession = Prefs.Flashcard;
0127                     break;
0128                 }
0129 
0130                 Prefs.save();
0131             }
0132         }
0133 
0134         FormCard.FormRadioDelegate {
0135             id: flashcardRadio
0136 
0137             text: i18nc("@option:check Mode selector", "Flashcard")
0138             QQC2.ButtonGroup.group: modeGroup
0139         }
0140 
0141         FormCard.FormRadioDelegate {
0142             id: multipleChoiceRadio
0143 
0144             text: i18nc("@option:check Mode selector", "Multiple choice")
0145             QQC2.ButtonGroup.group: modeGroup
0146         }
0147 
0148         FormCard.FormRadioDelegate {
0149             id: qaRadio
0150 
0151             text: i18nc("@option:check Mode selector", "Question-Answer")
0152             QQC2.ButtonGroup.group: modeGroup
0153         }
0154     }
0155 
0156     FormCard.FormHeader {
0157         title: i18n("Decks")
0158     }
0159 
0160     FormCard.FormCard {
0161         visible: documentRepeater.count > 0
0162 
0163         Repeater {
0164             id: documentRepeater
0165 
0166             model: DocumentModel {
0167                 id: documentModel
0168             }
0169 
0170             delegate: ColumnLayout {
0171                 id: documentDelegate
0172 
0173                 required property int index
0174                 required property string title
0175                 required property var document
0176                 readonly property alias documentButton: documentButton
0177 
0178                 spacing: 0
0179 
0180                 function open() {
0181                     documentButton.clicked();
0182                 }
0183 
0184                 FormCard.AbstractFormDelegate {
0185                     id: documentButton
0186 
0187                     text: documentDelegate.title
0188 
0189                     contentItem: RowLayout {
0190                         spacing: 0
0191 
0192                         QQC2.Label {
0193                             Layout.fillWidth: true
0194                             text: documentDelegate.title
0195                             elide: Text.ElideRight
0196                             wrapMode: Text.Wrap
0197                             maximumLineCount: 2
0198                             color: root.enabled ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0199                             Accessible.ignored: true
0200                         }
0201 
0202                         QQC2.ToolButton {
0203                             text: i18nc("@action:button", "Remove")
0204                             icon.name: "delete"
0205                             display: QQC2.ToolButton.IconOnly
0206 
0207                             onClicked: documentModel.remove(documentDelegate.index)
0208 
0209                             Layout.rightMargin: Kirigami.Units.smallSpacing
0210 
0211                             QQC2.ToolTip.visible: hovered
0212                             QQC2.ToolTip.text: text
0213                             QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0214                         }
0215 
0216                         QQC2.ToolButton {
0217                             text: i18nc("@action:button", "Edit")
0218                             icon.name: "document-edit"
0219                             display: QQC2.ToolButton.IconOnly
0220 
0221                             onClicked: {
0222                                 const editor = applicationWindow().pageStack.layers.push('qrc:/qml/DeckEditorPage.qml', {
0223                                     documentModel: documentModel,
0224                                     mode: DeckEditorPage.EditMode,
0225                                 });
0226                                 editor.editorModel.document = documentDelegate.document;
0227                             }
0228 
0229                             Layout.rightMargin: Kirigami.Units.smallSpacing
0230 
0231                             QQC2.ToolTip.visible: hovered
0232                             QQC2.ToolTip.text: text
0233                             QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0234                         }
0235 
0236                         FormCard.FormArrow {
0237                             Layout.leftMargin: Kirigami.Units.smallSpacing
0238                             Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
0239                             direction: Qt.RightArrow
0240                         }
0241                     }
0242 
0243                     onClicked: if (Prefs.startSession === Prefs.Flashcard){
0244                         applicationWindow().pageStack.layers.push("qrc:/qml/FlashCardPage.qml", {
0245                             document: documentDelegate.document,
0246                             documentModel: documentModel,
0247                         });
0248                     } else if (Prefs.startSession === Prefs.QA) {
0249                         applicationWindow().pageStack.layers.push("qrc:/qml/QuestionAnswerPage.qml", {
0250                             document: documentDelegate.document,
0251                             documentModel: documentModel,
0252                         });
0253                     } else  {
0254                         applicationWindow().pageStack.layers.push("qrc:/qml/MultipleChoicePage.qml", {
0255                             document: documentDelegate.document,
0256                             documentModel: documentModel,
0257                         });
0258                     }
0259 
0260                     Layout.fillWidth: true
0261                 }
0262 
0263                 FormCard.FormDelegateSeparator {
0264                     below: documentButton
0265                     above: if (index === documentRepeater.count - 1) {
0266                         null
0267                     } else {
0268                         documentRepeater.itemAt(index + 1).children[0]
0269                     }
0270                     visible: index !== documentRepeater.count - 1
0271                 }
0272             }
0273         }
0274     }
0275 }