1
//=============================================================================
3
// File : KviTalWizard.cpp
4
// Creation date : Tue Feb 06 2007 14:35:08 by Szymon Stefanek
6
// This file is part of the KVIrc irc client distribution
7
// Copyright (C) 2007-2010 Szymon Stefanek (pragma at kvirc dot net)
9
// This program is FREE software. You can redistribute it and/or
10
// modify it under the terms of the GNU General Public License
11
// as published by the Free Software Foundation; either version 2
12
// of the License, or (at your opinion) any later version.
14
// This program is distributed in the HOPE that it will be USEFUL,
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
// See the GNU General Public License for more details.
19
// You should have received a copy of the GNU General Public License
20
// along with this program. If not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23
//=============================================================================
25
#include "KviTalWizard.h"
26
#include "KviTalHBox.h"
27
#include "KviPointerList.h"
28
#include "KviLocale.h"
32
#include <QPushButton>
33
#include <QGridLayout>
35
#include <QStackedWidget>
39
class KviTalWizardPageData
58
class KviTalWizardPrivate
61
KviPointerList<KviTalWizardPageData> * pPageList;
62
int iEnabledPageCount;
63
KviTalWizardPageData * pCurrentPage;
64
QGridLayout * pLayout;
67
QPushButton * pBackButton;
68
QPushButton * pCancelButton;
69
QPushButton * pHelpButton;
70
QPushButton * pNextButton;
71
QWidget * pNextSpacer;
72
QPushButton * pFinishButton;
73
QWidget * pFinishSpacer;
74
QStackedWidget * pWidgetStack;
76
KviTalWizardPageData * findPage(QWidget * pWidget)
78
for(KviTalWizardPageData * pData = pPageList->first();pData;pData = pPageList->next())
80
if(pData->pWidget == pWidget) return pData;
85
KviTalWizardPageData * findFirstEnabledPage()
87
KviTalWizardPageData * pData;
88
for(pData = pPageList->first();pData;pData = pPageList->next())
90
if(pData->bEnabled) return pData;
95
KviTalWizardPageData * findLastEnabledPage()
97
KviTalWizardPageData * pData;
98
for(pData = pPageList->last();pData;pData = pPageList->prev())
100
if(pData->bEnabled) return pData;
105
KviTalWizardPageData * findNextEnabledPage(QWidget * pReference)
107
if(!pReference) return findFirstEnabledPage();
108
KviTalWizardPageData * pData = findPage(pReference);
109
if(!pData) return NULL;
110
for(pData = pPageList->next();pData;pData = pPageList->next())
112
if(pData->bEnabled) return pData;
117
KviTalWizardPageData * findPrevEnabledPage(QWidget * pReference)
119
if(!pReference) return findLastEnabledPage();
120
KviTalWizardPageData * pData = findPage(pReference);
121
if(!pData) return NULL;
122
for(pData = pPageList->prev();pData;pData = pPageList->prev())
124
if(pData->bEnabled) return pData;
131
int iEnabledCount = 0;
132
for(KviTalWizardPageData * pData = pPageList->first();pData;pData = pPageList->next())
137
pData->iVisibleIndex = iEnabledCount;
140
return iEnabledCount;
145
KviTalWizard::KviTalWizard(QWidget * pParent)
148
m_p = new KviTalWizardPrivate;
149
m_p->pPageList = new KviPointerList<KviTalWizardPageData>;
150
m_p->pPageList->setAutoDelete(true);
151
m_p->pCurrentPage = NULL;
152
m_p->iEnabledPageCount = 0;
153
m_p->pLayout = new QGridLayout(this);
155
m_p->pTitleLabel = new QLabel(this);
156
m_p->pLayout->addWidget(m_p->pTitleLabel,0,0,1,3);
158
m_p->pStepsLabel = new QLabel(this);
159
m_p->pStepsLabel->setMinimumWidth(80);
160
m_p->pStepsLabel->setAlignment(Qt::AlignRight);
161
m_p->pLayout->addWidget(m_p->pStepsLabel,0,4,1,3);
163
QFrame * f1 = new QFrame(this);
164
f1->setFrameStyle(QFrame::Sunken | QFrame::HLine);
165
m_p->pLayout->addWidget(f1,1,0,1,7);
167
m_p->pWidgetStack = new QStackedWidget(this);
168
m_p->pLayout->addWidget(m_p->pWidgetStack,2,0,1,7);
170
QFrame * f2 = new QFrame(this);
171
f2->setFrameStyle(QFrame::Sunken | QFrame::HLine);
172
m_p->pLayout->addWidget(f2,3,0,1,7);
174
KviTalHBox * pButtonBox = new KviTalHBox(this);
175
m_p->pLayout->addWidget(pButtonBox,4,0,1,7);
177
pButtonBox->setMargin(0);
178
pButtonBox->setSpacing(0);
181
m_p->pCancelButton = new QPushButton(__tr("Cancel"),pButtonBox);
182
m_p->pCancelButton->setMinimumWidth(80);
187
SLOT(cancelButtonClicked())
190
QWidget * pSpacer = new QWidget(pButtonBox);
191
pSpacer->setFixedWidth(4);
193
m_p->pHelpButton = new QPushButton(__tr("Help"),pButtonBox);
194
m_p->pHelpButton->setMinimumWidth(80);
199
SLOT(helpButtonClicked())
202
QWidget * pLargeSpacer = new QWidget(pButtonBox);
203
pLargeSpacer->setMinimumWidth(50);
204
pButtonBox->setStretchFactor(pLargeSpacer,100);
206
QString szText = "< ";
207
szText += __tr("Back");
208
m_p->pBackButton = new QPushButton(szText,pButtonBox);
209
m_p->pBackButton->setMinimumWidth(80);
214
SLOT(backButtonClicked())
217
m_p->pNextSpacer = new QWidget(pButtonBox);
218
m_p->pNextSpacer->setFixedWidth(4);
220
szText = __tr("Next");
222
m_p->pNextButton = new QPushButton(szText,pButtonBox);
223
m_p->pNextButton->setMinimumWidth(80);
228
SLOT(nextButtonClicked())
231
m_p->pFinishSpacer = new QWidget(pButtonBox);
232
m_p->pFinishSpacer->setFixedWidth(4);
234
m_p->pFinishButton = new QPushButton(__tr("Finish"),pButtonBox);
235
m_p->pFinishButton->setMinimumWidth(80);
240
SLOT(finishButtonClicked())
243
m_p->pLayout->setMargin(8);
244
m_p->pLayout->setSpacing(4);
245
m_p->pLayout->setRowStretch(2,1);
246
m_p->pLayout->setColumnStretch(0,1);
249
KviTalWizard::~KviTalWizard()
251
delete m_p->pPageList;
255
void KviTalWizard::insertPage(QWidget * pWidget,const QString &szTitle,int iIndex)
257
KviTalWizardPageData * pPageData = m_p->findPage(pWidget);
260
pPageData = new KviTalWizardPageData;
261
pPageData->pWidget = pWidget;
262
pPageData->iEnableFlags = \
263
KviTalWizardPageData::EnableNext | \
264
KviTalWizardPageData::EnableCancel | \
265
KviTalWizardPageData::EnableBack;
268
m_p->pPageList->append(pPageData);
269
m_p->iEnabledPageCount++;
270
pPageData->iVisibleIndex = m_p->iEnabledPageCount;
272
m_p->pPageList->insert(iIndex,pPageData);
273
m_p->iEnabledPageCount = m_p->reindexPages();
275
m_p->pWidgetStack->addWidget(pWidget);
277
pPageData->szTitle = szTitle;
278
pPageData->bEnabled = true;
282
void KviTalWizard::addPage(QWidget * pWidget,const QString &szTitle)
284
insertPage(pWidget,szTitle,-1);
287
bool KviTalWizard::setPageEnabled(QWidget * pWidget,bool bEnabled)
289
KviTalWizardPageData * pData = m_p->findPage(pWidget);
292
pData->bEnabled = bEnabled;
293
m_p->iEnabledPageCount = m_p->reindexPages();
294
setCurrentPage(m_p->pCurrentPage);
298
bool KviTalWizard::setPageTitle(QWidget * pWidget,const QString &szTitle)
300
KviTalWizardPageData * pData = m_p->findPage(pWidget);
303
pData->szTitle = szTitle;
307
bool KviTalWizard::setCurrentPage(QWidget * pWidget)
309
KviTalWizardPageData * pData = m_p->findPage(pWidget);
312
setCurrentPage(pData);
316
QWidget * KviTalWizard::currentPage()
318
if(!m_p->pCurrentPage)
320
return m_p->pCurrentPage->pWidget;
323
void KviTalWizard::setCurrentPage(KviTalWizardPageData * pData)
325
m_p->pCurrentPage = pData;
327
bool bCancelEnabled = true;
328
bool bNextEnabled = false;
329
bool bBackEnabled = false;
330
bool bHelpEnabled = false;
331
bool bFinishEnabled = false;
338
bNextEnabled = (pData->iEnableFlags & KviTalWizardPageData::EnableNext) && m_p->findNextEnabledPage(pData->pWidget);
339
bBackEnabled = (pData->iEnableFlags & KviTalWizardPageData::EnableBack) && m_p->findPrevEnabledPage(pData->pWidget);
340
bCancelEnabled = (pData->iEnableFlags & KviTalWizardPageData::EnableCancel);
341
bFinishEnabled = (pData->iEnableFlags & KviTalWizardPageData::EnableFinish);
342
bHelpEnabled = (pData->iEnableFlags & KviTalWizardPageData::EnableHelp);
343
m_p->pWidgetStack->setCurrentWidget(pData->pWidget);
346
szTitle += pData->szTitle;
348
QPalette pal = m_p->pStepsLabel->palette();
349
QColor clrWin = pal.color(QPalette::Normal,QPalette::Window);
350
QColor clrTxt = pal.color(QPalette::Normal,QPalette::WindowText);
351
QColor clrMid = qRgb(
352
(clrWin.red() + clrTxt.red()) / 2,
353
(clrWin.green() + clrTxt.green()) / 2,
354
(clrWin.blue() + clrTxt.blue()) / 2
357
szSteps = "<nobr><font color=\"";
358
szSteps += clrMid.name();
359
szSteps += "\"><b>[";
360
szSteps += QString("Step %1 of %2").arg(pData->iVisibleIndex).arg(m_p->iEnabledPageCount);
361
szSteps += "]</b></font></nobr>";
364
m_p->pTitleLabel->setText(szTitle);
365
m_p->pStepsLabel->setText(szSteps);
367
m_p->pNextButton->setEnabled(bNextEnabled);
370
m_p->pNextButton->show();
371
m_p->pNextSpacer->show();
372
m_p->pNextButton->setDefault(true);
374
m_p->pNextButton->hide();
375
m_p->pNextSpacer->hide();
376
m_p->pNextButton->setDefault(false);
378
m_p->pBackButton->setEnabled(bBackEnabled);
379
m_p->pHelpButton->setEnabled(bHelpEnabled);
381
m_p->pHelpButton->show();
383
m_p->pHelpButton->hide();
384
m_p->pCancelButton->setEnabled(bCancelEnabled);
385
m_p->pFinishButton->setEnabled(bFinishEnabled);
388
m_p->pFinishButton->show();
389
m_p->pFinishSpacer->show();
390
m_p->pFinishButton->setDefault(true);
392
m_p->pFinishButton->hide();
393
m_p->pFinishSpacer->hide();
394
m_p->pFinishButton->setDefault(false);
398
void KviTalWizard::showEvent(QShowEvent * e)
400
if(!(m_p->pCurrentPage))
402
// display the first page
403
KviTalWizardPageData * pData = m_p->findFirstEnabledPage();
405
setCurrentPage(pData->pWidget);
407
QDialog::showEvent(e);
408
emit pageChanged(m_p->pCurrentPage->szTitle);
411
void KviTalWizard::closeEvent(QCloseEvent * e)
414
cancelButtonClicked();
417
void KviTalWizard::backButtonClicked()
419
if(!m_p->pCurrentPage)
421
setCurrentPage(m_p->findPrevEnabledPage(m_p->pCurrentPage->pWidget));
422
emit pageChanged(m_p->pCurrentPage->szTitle);
425
void KviTalWizard::nextButtonClicked()
427
setCurrentPage(m_p->findNextEnabledPage(m_p->pCurrentPage->pWidget));
428
emit pageChanged(m_p->pCurrentPage->szTitle);
431
void KviTalWizard::helpButtonClicked()
436
void KviTalWizard::cancelButtonClicked()
441
void KviTalWizard::finishButtonClicked()
446
void KviTalWizard::setHelpEnabled(QWidget * pWidget,bool bEnabled)
448
KviTalWizardPageData * pData = m_p->findPage(pWidget);
452
pData->iEnableFlags |= KviTalWizardPageData::EnableHelp;
454
pData->iEnableFlags &= ~KviTalWizardPageData::EnableHelp;
455
if(pData == m_p->pCurrentPage)
456
setCurrentPage(pData);
459
void KviTalWizard::setCancelEnabled(QWidget * pWidget,bool bEnabled)
461
KviTalWizardPageData * pData = m_p->findPage(pWidget);
465
pData->iEnableFlags |= KviTalWizardPageData::EnableCancel;
467
pData->iEnableFlags &= ~KviTalWizardPageData::EnableCancel;
468
if(pData == m_p->pCurrentPage)
469
setCurrentPage(pData);
472
void KviTalWizard::setFinishEnabled(QWidget * pWidget,bool bEnabled)
474
KviTalWizardPageData * pData = m_p->findPage(pWidget);
478
pData->iEnableFlags |= KviTalWizardPageData::EnableFinish;
480
pData->iEnableFlags &= ~KviTalWizardPageData::EnableFinish;
481
if(pData == m_p->pCurrentPage)
482
setCurrentPage(pData);
485
void KviTalWizard::setNextEnabled(QWidget * pWidget,bool bEnabled)
487
KviTalWizardPageData * pData = m_p->findPage(pWidget);
491
pData->iEnableFlags |= KviTalWizardPageData::EnableNext;
493
pData->iEnableFlags &= ~KviTalWizardPageData::EnableNext;
494
if(pData == m_p->pCurrentPage)
495
setCurrentPage(pData);
498
void KviTalWizard::setBackEnabled(QWidget * pWidget,bool bEnabled)
500
KviTalWizardPageData * pData = m_p->findPage(pWidget);
504
pData->iEnableFlags |= KviTalWizardPageData::EnableBack;
506
pData->iEnableFlags &= ~KviTalWizardPageData::EnableBack;
507
if(pData == m_p->pCurrentPage)
508
setCurrentPage(pData);
511
QPushButton * KviTalWizard::cancelButton()
513
return m_p->pCancelButton;
516
QPushButton * KviTalWizard::helpButton()
518
return m_p->pHelpButton;
521
QPushButton * KviTalWizard::finishButton()
523
return m_p->pFinishButton;
526
QPushButton * KviTalWizard::nextButton()
528
return m_p->pNextButton;
531
QPushButton * KviTalWizard::backButton()
533
return m_p->pBackButton;
536
#ifdef COMPILE_ON_WINDOWS
537
#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES
538
#include "KviTalWizard.moc"
539
#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES