1 /*
2     This file is part of KNewStuffQuick.
3     SPDX-FileCopyrightText: 2016 Dan Leinir Turthra Jensen <admin@leinir.dk>
4 
5     SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7 
8 #include "quickquestionlistener.h"
9 
10 #include "core/question.h"
11 
12 #include <QCoreApplication>
13 
14 using namespace KNewStuffQuick;
15 
16 class QuickQuestionListenerHelper
17 {
18 public:
QuickQuestionListenerHelper()19     QuickQuestionListenerHelper()
20         : q(nullptr)
21     {
22     }
~QuickQuestionListenerHelper()23     ~QuickQuestionListenerHelper()
24     {
25     }
26     QuickQuestionListenerHelper(const QuickQuestionListenerHelper &) = delete;
27     QuickQuestionListenerHelper &operator=(const QuickQuestionListenerHelper &) = delete;
28     QuickQuestionListener *q;
29 };
30 Q_GLOBAL_STATIC(QuickQuestionListenerHelper, s_kns3_quickQuestionListener)
31 
32 class QuickQuestionListener::Private
33 {
34 public:
Private()35     Private()
36     {
37     }
38     KNSCore::Question *question = nullptr;
39 };
40 
instance()41 QuickQuestionListener *QuickQuestionListener::instance()
42 {
43     if (!s_kns3_quickQuestionListener()->q) {
44         new QuickQuestionListener;
45     }
46     return s_kns3_quickQuestionListener()->q;
47 }
48 
QuickQuestionListener()49 QuickQuestionListener::QuickQuestionListener()
50     : KNSCore::QuestionListener(nullptr)
51     , d(new Private)
52 {
53     setParent(qApp);
54     s_kns3_quickQuestionListener()->q = this;
55 }
56 
~QuickQuestionListener()57 QuickQuestionListener::~QuickQuestionListener()
58 {
59     if (d->question) {
60         d->question->setResponse(KNSCore::Question::CancelResponse);
61     }
62     delete d;
63 }
64 
askQuestion(KNSCore::Question * question)65 void QuickQuestionListener::askQuestion(KNSCore::Question *question)
66 {
67     d->question = question;
68     switch (question->questionType()) {
69     case KNSCore::Question::SelectFromListQuestion:
70         Q_EMIT askListQuestion(question->title(), question->question(), question->list());
71         break;
72     case KNSCore::Question::ContinueCancelQuestion:
73         Q_EMIT askContinueCancelQuestion(d->question->title(), d->question->question());
74         break;
75     case KNSCore::Question::InputTextQuestion:
76         Q_EMIT askTextInputQuestion(d->question->title(), d->question->question());
77         break;
78     case KNSCore::Question::PasswordQuestion:
79         Q_EMIT askPasswordQuestion(d->question->title(), d->question->question());
80         break;
81     case KNSCore::Question::YesNoQuestion:
82     default:
83         Q_EMIT askYesNoQuestion(d->question->title(), d->question->question());
84         break;
85     }
86 }
87 
passResponse(bool responseIsContinue,QString input)88 void KNewStuffQuick::QuickQuestionListener::passResponse(bool responseIsContinue, QString input)
89 {
90     if (d->question) {
91         if (responseIsContinue) {
92             d->question->setResponse(input);
93             switch (d->question->questionType()) {
94             case KNSCore::Question::ContinueCancelQuestion:
95                 d->question->setResponse(KNSCore::Question::ContinueResponse);
96                 break;
97             case KNSCore::Question::YesNoQuestion:
98                 d->question->setResponse(KNSCore::Question::YesResponse);
99                 break;
100             case KNSCore::Question::SelectFromListQuestion:
101             case KNSCore::Question::InputTextQuestion:
102             case KNSCore::Question::PasswordQuestion:
103             default:
104                 d->question->setResponse(KNSCore::Question::OKResponse);
105                 break;
106             }
107         } else {
108             switch (d->question->questionType()) {
109             case KNSCore::Question::YesNoQuestion:
110                 d->question->setResponse(KNSCore::Question::NoResponse);
111                 break;
112             case KNSCore::Question::SelectFromListQuestion:
113             case KNSCore::Question::InputTextQuestion:
114             case KNSCore::Question::PasswordQuestion:
115             case KNSCore::Question::ContinueCancelQuestion:
116             default:
117                 d->question->setResponse(KNSCore::Question::CancelResponse);
118                 break;
119             }
120         }
121         d->question = nullptr;
122     }
123 }
124