1 //=============================================================================
2 //
3 //   File : KvsObject_wizard.cpp
4 //   Creation date : Fri Mar 18 14:30:48 CEST 2005
5 //   by Tonino Imbesi(Grifisx) and Alessandro Carbone(Noldor)
6 //
7 //   This file is part of the KVIrc IRC client distribution
8 //   Copyright (C) 2005-2008 Alessandro Carbone (elfonol at gmail dot com)
9 //
10 //   This program is FREE software. You can redistribute it and/or
11 //   modify it under the terms of the GNU General Public License
12 //   as published by the Free Software Foundation; either version 2
13 //   of the License, or (at your option) any later version.
14 //
15 //   This program is distributed in the HOPE that it will be USEFUL,
16 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 //   See the GNU General Public License for more details.
19 //
20 //   You should have received a copy of the GNU General Public License
21 //   along with this program. If not, write to the Free Software Foundation,
22 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 //
24 //=============================================================================
25 
26 #include <KviTalWizard.h>
27 
28 #include "KvsObject_wizard.h"
29 #include "KviError.h"
30 #include "kvi_debug.h"
31 
32 #include "KviLocale.h"
33 
34 #include <QPushButton>
35 
36 /*
37 	@doc:	wizard
38 	@keyterms:
39 		wizard object class,
40 	@title:
41 		wizard class
42 	@type:
43 		class
44 	@short:
45 		The wizard class provides a framework for wizard dialogs.
46 	@inherits:
47 		[class]object[/class]
48 		[class]widget[/class]
49 	@description:
50 		A wizard is an input dialog that consists of a sequence of dialog pages. It walks the user through a process step by step.[br]
51 	@functions:
52 	!fn: $addPage(<page_widget:object>,<title:string>)
53 	Add a page with title.<page_widget> must be a widget's object.
54 	!fn: $insertPage(<page_widget>,<title:string>,<index:integer>)
55 	Inserts a page at the position <index>. If index is -1, page will appended to the end of the wizard's page sequence.
56 	!fn: $setTitle(<page>,<title:string>)
57 	Sets the title for page page to title text.
58 	!fn: $setBackEnabled(<page_widget>,<bEnabled:boolean>)
59 	If enable is set to 1, page page has a [i]back[/i] button; otherwise page has no [i]back[/i] button.[br]
60 	By default all pages have this button.
61 	!fn: $setNextEnabled(<page_widget>,<bEnabled:boolean>)
62 	If enable is set to 1, page page has a [i]next[/i] button; otherwise the [i]next[/i] button on page is disabled.[br]
63 	By default all pages have this button.
64 	!fn: $setFinishEnabled(<page_widget>,<bEnabled:boolean>)
65 	If enable is set to 1, page page has a [i]finish[/i] button; otherwise the [i]finish[/i] button on page is disabled.[br]
66 	By default NO pages have this button.
67 	!fn: $setHelpEnabled(<page_widget>,<bEnabled:boolean>)
68 	If enable is set to 1, page page has a Help button; otherwise the [i]help[/i] button on page is disabled.[br]
69 	By default all pages have this button.
70 	!fn: $setNextBtnText(<text:string>)
71 	Set the text for button [i]next[/i].
72 	!fn: $setBackBtnText(<text:string>)
73 	Set the text for button [i]back[/i].
74 	!fn: $setFinishBtnText(<text:string>)
75 	Set the text for button [i]finish[/i].
76 	!fn: $setHelpBtnText(<text:string>)
77 	Set the text for button Help.
78 	!fn: $acceptEvent()
79 	This function is called when the user clicks on the [i]finish[/i] button.
80 	!fn: $rejectEvent()
81 	This function is called when the user clicks on the [i]reject[/i] button.
82 	!fn: $nextClickedEvent()
83 	This function is called when the user clicks on the [i]next[/i] button.
84 	!fn: $backClickedEvent()
85 	This function is called when the user clicks on the [i]back[/i] button.
86 	@signals:
87 	!sg: $nextClicked()
88 	This signal is emitted by the default implementation of [classfnc]$nextClickedEvent[/classfnc]().
89 	!sg: $backClicked()
90 	This signal is emitted by the default implementation of [classfnc]$backClickedEvent[/classfnc]().
91 
92 */
93 
94 KVSO_BEGIN_REGISTERCLASS(KvsObject_wizard, "wizard", "widget")
95 
96 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, addPage)
97 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, insertPage)
98 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setTitle)
99 
100 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setBackEnabled);
101 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setNextEnabled);
102 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setFinishEnabled);
103 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setHelpEnabled);
104 
105 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setBackBtnText);
106 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setNextBtnText);
107 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setFinishBtnText);
108 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, setHelpBtnText);
109 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, nextClickedEvent);
110 KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_wizard, backClickedEvent);
111 
112 KVSO_REGISTER_STANDARD_NOTHINGRETURN_HANDLER(KvsObject_wizard, "acceptEvent")
113 KVSO_REGISTER_STANDARD_NOTHINGRETURN_HANDLER(KvsObject_wizard, "rejectEvent")
114 
KVSO_END_REGISTERCLASS(KvsObject_wizard)115 KVSO_END_REGISTERCLASS(KvsObject_wizard)
116 
117 KVSO_BEGIN_CONSTRUCTOR(KvsObject_wizard, KvsObject_widget)
118 
119 KVSO_END_CONSTRUCTOR(KvsObject_wizard)
120 
121 KVSO_BEGIN_DESTRUCTOR(KvsObject_wizard)
122 
123 KVSO_END_CONSTRUCTOR(KvsObject_wizard)
124 
125 bool KvsObject_wizard::init(KviKvsRunTimeContext *, KviKvsVariantList *)
126 {
127 	setObject(new KviKvsMdmWizard(parentScriptWidget(), getName().toUtf8().data(), this), true);
128 
129 	return true;
130 }
KVSO_CLASS_FUNCTION(wizard,addPage)131 KVSO_CLASS_FUNCTION(wizard, addPage)
132 {
133 	CHECK_INTERNAL_POINTER(widget())
134 	KviKvsObject * ob;
135 	QString szLabel;
136 	kvs_hobject_t hObject;
137 	KVSO_PARAMETERS_BEGIN(c)
138 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
139 	KVSO_PARAMETER("label", KVS_PT_STRING, 0, szLabel)
140 	KVSO_PARAMETERS_END(c)
141 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
142 	if(!ob->object()->isWidgetType())
143 	{
144 		c->warning(__tr2qs_ctx("Can't add a non-widget object", "objects"));
145 		return true;
146 	}
147 	((KviTalWizard *)widget())->addPage(((QWidget *)(ob->object())), szLabel);
148 	return true;
149 }
KVSO_CLASS_FUNCTION(wizard,insertPage)150 KVSO_CLASS_FUNCTION(wizard, insertPage)
151 {
152 	CHECK_INTERNAL_POINTER(widget())
153 
154 	KviKvsObject * ob;
155 	QString szLabel;
156 	kvs_uint_t uIndex;
157 	kvs_hobject_t hObject;
158 	KVSO_PARAMETERS_BEGIN(c)
159 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
160 	KVSO_PARAMETER("label", KVS_PT_STRING, 0, szLabel)
161 	KVSO_PARAMETER("index", KVS_PT_UNSIGNEDINTEGER, 0, uIndex)
162 	KVSO_PARAMETERS_END(c)
163 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
164 	if(!ob->object()->isWidgetType())
165 	{
166 		c->warning(__tr2qs_ctx("Can't add a non-widget object", "objects"));
167 		return true;
168 	}
169 	((KviTalWizard *)widget())->insertPage(((QWidget *)(ob->object())), szLabel, uIndex);
170 	return true;
171 }
172 
KVSO_CLASS_FUNCTION(wizard,setTitle)173 KVSO_CLASS_FUNCTION(wizard, setTitle)
174 {
175 	CHECK_INTERNAL_POINTER(widget())
176 	KviKvsObject * ob;
177 	QString szTitle;
178 	kvs_hobject_t hObject;
179 	KVSO_PARAMETERS_BEGIN(c)
180 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
181 	KVSO_PARAMETER("title", KVS_PT_STRING, 0, szTitle)
182 	KVSO_PARAMETERS_END(c)
183 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
184 	if(!ob->object()->isWidgetType())
185 	{
186 		c->warning(__tr2qs_ctx("Widget object required", "objects"));
187 		return true;
188 	}
189 	((KviTalWizard *)widget())->setPageTitle(((QWidget *)(ob->object())), szTitle);
190 	return true;
191 }
KVSO_CLASS_FUNCTION(wizard,setBackEnabled)192 KVSO_CLASS_FUNCTION(wizard, setBackEnabled)
193 {
194 	CHECK_INTERNAL_POINTER(widget())
195 	bool bEnabled;
196 	KviKvsObject * ob;
197 	kvs_hobject_t hObject;
198 	KVSO_PARAMETERS_BEGIN(c)
199 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
200 	KVSO_PARAMETER("bEnabled", KVS_PT_BOOL, 0, bEnabled)
201 	KVSO_PARAMETERS_END(c)
202 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
203 	if(!ob->object()->isWidgetType())
204 	{
205 		c->warning(__tr2qs_ctx("Widget object required", "objects"));
206 		return true;
207 	}
208 	((KviTalWizard *)widget())->setBackEnabled(((QWidget *)(ob->object())), bEnabled);
209 	return true;
210 }
211 
KVSO_CLASS_FUNCTION(wizard,setNextEnabled)212 KVSO_CLASS_FUNCTION(wizard, setNextEnabled)
213 {
214 	CHECK_INTERNAL_POINTER(widget())
215 
216 	bool bEnabled;
217 	KviKvsObject * ob;
218 	kvs_hobject_t hObject;
219 	KVSO_PARAMETERS_BEGIN(c)
220 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
221 	KVSO_PARAMETER("bEnabled", KVS_PT_BOOL, 0, bEnabled)
222 	KVSO_PARAMETERS_END(c)
223 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
224 	if(!ob->object()->isWidgetType())
225 	{
226 		c->warning(__tr2qs_ctx("Widget object required", "objects"));
227 		return true;
228 	}
229 	((KviTalWizard *)widget())->setNextEnabled(((QWidget *)(ob->object())), bEnabled);
230 	return true;
231 }
KVSO_CLASS_FUNCTION(wizard,setFinishEnabled)232 KVSO_CLASS_FUNCTION(wizard, setFinishEnabled)
233 {
234 	CHECK_INTERNAL_POINTER(widget())
235 
236 	bool bEnabled;
237 	KviKvsObject * ob;
238 	kvs_hobject_t hObject;
239 	KVSO_PARAMETERS_BEGIN(c)
240 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
241 	KVSO_PARAMETER("bEnabled", KVS_PT_BOOL, 0, bEnabled)
242 	KVSO_PARAMETERS_END(c)
243 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
244 	if(!ob->object()->isWidgetType())
245 	{
246 		c->warning(__tr2qs_ctx("Widget object required", "objects"));
247 		return true;
248 	}
249 	((KviTalWizard *)widget())->setFinishEnabled(((QWidget *)(ob->object())), bEnabled);
250 	return true;
251 }
KVSO_CLASS_FUNCTION(wizard,setHelpEnabled)252 KVSO_CLASS_FUNCTION(wizard, setHelpEnabled)
253 {
254 	CHECK_INTERNAL_POINTER(widget())
255 
256 	bool bEnabled;
257 	KviKvsObject * ob;
258 	kvs_hobject_t hObject;
259 	KVSO_PARAMETERS_BEGIN(c)
260 	KVSO_PARAMETER("page_widget", KVS_PT_HOBJECT, 0, hObject)
261 	KVSO_PARAMETER("bEnabled", KVS_PT_BOOL, 0, bEnabled)
262 	KVSO_PARAMETERS_END(c)
263 	ob = KviKvsKernel::instance()->objectController()->lookupObject(hObject);
264 	if(!ob->object()->isWidgetType())
265 	{
266 		c->warning(__tr2qs_ctx("Widget object required", "objects"));
267 		return true;
268 	}
269 	((KviTalWizard *)widget())->setHelpEnabled(((QWidget *)(ob->object())), bEnabled);
270 	return true;
271 }
KVSO_CLASS_FUNCTION(wizard,setBackBtnText)272 KVSO_CLASS_FUNCTION(wizard, setBackBtnText)
273 {
274 	CHECK_INTERNAL_POINTER(widget())
275 
276 	QString szText;
277 	KVSO_PARAMETERS_BEGIN(c)
278 	KVSO_PARAMETER("text", KVS_PT_STRING, 0, szText)
279 	KVSO_PARAMETERS_END(c)
280 	((KviTalWizard *)widget())->KviTalWizard::backButton()->setText(szText);
281 	return true;
282 }
KVSO_CLASS_FUNCTION(wizard,setNextBtnText)283 KVSO_CLASS_FUNCTION(wizard, setNextBtnText)
284 {
285 	CHECK_INTERNAL_POINTER(widget())
286 
287 	QString szText;
288 	KVSO_PARAMETERS_BEGIN(c)
289 	KVSO_PARAMETER("text", KVS_PT_STRING, 0, szText)
290 	KVSO_PARAMETERS_END(c)
291 	((KviTalWizard *)widget())->KviTalWizard::nextButton()->setText(szText);
292 	return true;
293 }
KVSO_CLASS_FUNCTION(wizard,setHelpBtnText)294 KVSO_CLASS_FUNCTION(wizard, setHelpBtnText)
295 {
296 	CHECK_INTERNAL_POINTER(widget())
297 
298 	QString szText;
299 	KVSO_PARAMETERS_BEGIN(c)
300 	KVSO_PARAMETER("text", KVS_PT_STRING, 0, szText)
301 	KVSO_PARAMETERS_END(c)
302 	((KviTalWizard *)widget())->KviTalWizard::helpButton()->setText(szText);
303 	return true;
304 }
KVSO_CLASS_FUNCTION(wizard,setFinishBtnText)305 KVSO_CLASS_FUNCTION(wizard, setFinishBtnText)
306 {
307 	CHECK_INTERNAL_POINTER(widget())
308 
309 	QString szText;
310 	KVSO_PARAMETERS_BEGIN(c)
311 	KVSO_PARAMETER("text", KVS_PT_STRING, 0, szText)
312 	KVSO_PARAMETERS_END(c)
313 	((KviTalWizard *)widget())->KviTalWizard::finishButton()->setText(szText);
314 	return true;
315 }
accept()316 bool KvsObject_wizard::accept()
317 {
318 	KviKvsVariantList * pParams = nullptr;
319 	callFunction(this, "acceptEvent", nullptr, pParams);
320 	return true;
321 }
reject()322 bool KvsObject_wizard::reject()
323 {
324 	KviKvsVariantList * pParams = nullptr;
325 	callFunction(this, "rejectEvent", nullptr, pParams);
326 	return true;
327 }
KVSO_CLASS_FUNCTION(wizard,nextClickedEvent)328 KVSO_CLASS_FUNCTION(wizard, nextClickedEvent)
329 {
330 	emitSignal("nextClicked", c);
331 	return true;
332 }
333 
nextClicked()334 void KvsObject_wizard::nextClicked()
335 {
336 	KviKvsVariantList * params = nullptr;
337 	callFunction(this, "nextClickedEvent", params);
338 }
KVSO_CLASS_FUNCTION(wizard,backClickedEvent)339 KVSO_CLASS_FUNCTION(wizard, backClickedEvent)
340 {
341 	emitSignal("backClicked", c);
342 	return true;
343 }
344 
backClicked()345 void KvsObject_wizard::backClicked()
346 {
347 	KviKvsVariantList * params = nullptr;
348 	callFunction(this, "backClickedEvent", params);
349 }
KviKvsMdmWizard(QWidget * par,const char * name,KvsObject_wizard * parent)350 KviKvsMdmWizard::KviKvsMdmWizard(QWidget * par, const char * name, KvsObject_wizard * parent)
351     : KviTalWizard(par)
352 {
353 	m_pParentScript = parent;
354 	setObjectName(name);
355 	connect(this->backButton(), SIGNAL(clicked()), this, SLOT(slotBackClicked()));
356 	connect(this->nextButton(), SIGNAL(clicked()), this, SLOT(slotNextClicked()));
357 }
accept()358 void KviKvsMdmWizard::accept()
359 {
360 	if(m_pParentScript->accept())
361 		KviTalWizard::accept();
362 }
reject()363 void KviKvsMdmWizard::reject()
364 {
365 	if(m_pParentScript->reject())
366 		KviTalWizard::reject();
367 }
slotNextClicked()368 void KviKvsMdmWizard::slotNextClicked()
369 {
370 	m_pParentScript->nextClicked();
371 }
slotBackClicked()372 void KviKvsMdmWizard::slotBackClicked()
373 {
374 	m_pParentScript->backClicked();
375 }
376 KviKvsMdmWizard::~KviKvsMdmWizard()
377     = default;
378