Warning, /frameworks/knewstuff/src/qtquick/qml/QuestionAsker.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2019 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003 SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk>
0004
0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007
0008 /**
0009 * @brief A component used to forward questions from KNewStuff's engine to the UI
0010 *
0011 * This component is equivalent to the WidgetQuestionListener
0012 * @see KNewStuff::WidgetQuestionListener
0013 * @see KNewStuffCore::Question
0014 * @since 5.63
0015 */
0016
0017 import QtQuick
0018 import QtQuick.Controls as QQC2
0019 import QtQuick.Layouts
0020 import org.kde.kirigami 2 as Kirigami
0021 import org.kde.newstuff as NewStuff
0022 import org.kde.newstuff.core as NewStuffCore
0023
0024 QQC2.Dialog {
0025 id: dialog
0026
0027 property int questionType
0028
0029 anchors.centerIn: QQC2.Overlay.overlay
0030
0031 modal: true
0032 focus: true
0033
0034 margins: Kirigami.Units.largeSpacing
0035 padding: Kirigami.Units.largeSpacing
0036
0037 standardButtons: {
0038 switch (questionType) {
0039 case NewStuffCore.Question.SelectFromListQuestion:
0040 case NewStuffCore.Question.InputTextQuestion:
0041 case NewStuffCore.Question.PasswordQuestion:
0042 case NewStuffCore.Question.ContinueCancelQuestion:
0043 // QQC2 Dialog standardButtons does not have a Continue button...
0044 return QQC2.Dialog.Ok | QQC2.Dialog.Cancel;
0045 case NewStuffCore.Question.YesNoQuestion:
0046 return QQC2.Dialog.Yes | QQC2.Dialog.No;
0047 default:
0048 return QQC2.Dialog.NoButton;
0049 }
0050 }
0051
0052 Connections {
0053 target: NewStuff.QuickQuestionListener
0054
0055 function onAskListQuestion(title, question, list) {
0056 dialog.questionType = NewStuffCore.Question.SelectFromListQuestion;
0057 dialog.title = title;
0058 questionLabel.text = question;
0059 for (var i = 0; i < list.length; i++) {
0060 listView.model.append({ text: list[i] });
0061 }
0062 listView.currentIndex = 0;
0063 listView.visible = true;
0064 dialog.open();
0065 }
0066
0067 function onAskContinueCancelQuestion(title, question) {
0068 dialog.questionType = NewStuffCore.Question.ContinueCancelQuestion;
0069 dialog.title = title;
0070 questionLabel.text = question;
0071 dialog.open();
0072 }
0073
0074 function onAskTextInputQuestion(title, question) {
0075 dialog.questionType = NewStuffCore.Question.InputTextQuestion;
0076 dialog.title = title;
0077 questionLabel.text = question;
0078 textInput.visible = true;
0079 dialog.open();
0080 }
0081
0082 function onAskPasswordQuestion(title, question) {
0083 dialog.questionType = NewStuffCore.Question.PasswordQuestion;
0084 dialog.title = title;
0085 questionLabel.text = question;
0086 textInput.echoMode = QQC2.TextInput.PasswordEchoOnEdit;
0087 textInput.visible = true;
0088 dialog.open();
0089 }
0090
0091 function onAskYesNoQuestion(title, question) {
0092 dialog.questionType = NewStuffCore.Question.YesNoQuestion;
0093 dialog.title = title;
0094 questionLabel.text = question;
0095 dialog.open();
0096 }
0097 }
0098
0099 function passResponse(responseIsContinue) {
0100 let input = "";
0101 switch(dialog.questionType) {
0102 case NewStuffCore.Question.SelectFromListQuestion:
0103 input = listView.currentItem.text;
0104 listView.model.clear();
0105 listView.visible = false;
0106 break;
0107 case NewStuffCore.Question.InputTextQuestion:
0108 input = textInput.text;
0109 textInput.text = "";
0110 textInput.visible = false;
0111 break;
0112 case NewStuffCore.Question.PasswordQuestion:
0113 input = textInput.text;
0114 textInput.text = "";
0115 textInput.visible = false;
0116 textInput.echoMode = QQC2.TextInput.Normal;
0117 break;
0118 case NewStuffCore.Question.ContinueCancelQuestion:
0119 case NewStuffCore.Question.YesNoQuestion:
0120 default:
0121 // Nothing special to do for these types of question, we just pass along the positive or negative response
0122 break;
0123 }
0124 NewStuff.QuickQuestionListener.passResponse(responseIsContinue, input);
0125 }
0126
0127 ColumnLayout {
0128 id: layout
0129
0130 property int maxWidth: applicationWindow().width - (dialog.leftPadding + dialog.leftMargin + dialog.rightMargin + dialog.rightPadding)
0131
0132 anchors.fill: parent
0133 spacing: Kirigami.Units.smallSpacing
0134
0135 QQC2.Label {
0136 id: questionLabel
0137 Layout.maximumWidth: layout.maxWidth
0138 wrapMode: Text.Wrap
0139 }
0140
0141 ListView {
0142 id: listView
0143
0144 Layout.maximumWidth: layout.maxWidth
0145 Layout.fillWidth: true
0146 Layout.minimumHeight: Kirigami.Units.gridUnit * 6
0147
0148 visible: false
0149
0150 model: ListModel { }
0151
0152 delegate: QQC2.ItemDelegate {
0153 width: listView.width
0154 text: model.text
0155 }
0156 }
0157
0158 QQC2.TextField {
0159 id: textInput
0160
0161 Layout.maximumWidth: layout.maxWidth
0162 Layout.fillWidth: true
0163
0164 visible: false
0165 }
0166 }
0167
0168 onAccepted: {
0169 passResponse(true);
0170 }
0171
0172 onRejected: {
0173 passResponse(false);
0174 }
0175 }