summaryrefslogtreecommitdiffabout
path: root/qtcompat/qinputdialog.cpp
authorzautrix <zautrix>2004-06-26 19:01:18 (UTC)
committer zautrix <zautrix>2004-06-26 19:01:18 (UTC)
commitb9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (unidiff)
tree2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /qtcompat/qinputdialog.cpp
downloadkdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2
Initial revision
Diffstat (limited to 'qtcompat/qinputdialog.cpp') (more/less context) (show whitespace changes)
-rw-r--r--qtcompat/qinputdialog.cpp495
1 files changed, 495 insertions, 0 deletions
diff --git a/qtcompat/qinputdialog.cpp b/qtcompat/qinputdialog.cpp
new file mode 100644
index 0000000..770b281
--- a/dev/null
+++ b/qtcompat/qinputdialog.cpp
@@ -0,0 +1,495 @@
1/****************************************************************************
2** $Id$
3**
4** Implementation of QInputDialog class
5**
6** Created : 991212
7**
8** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
9**
10** This file is part of the dialogs module of the Qt GUI Toolkit.
11**
12** This file may be distributed under the terms of the Q Public License
13** as defined by Trolltech AS of Norway and appearing in the file
14** LICENSE.QPL included in the packaging of this file.
15**
16** This file may be distributed and/or modified under the terms of the
17** GNU General Public License version 2 as published by the Free Software
18** Foundation and appearing in the file LICENSE.GPL included in the
19** packaging of this file.
20**
21** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22** licenses may use this file in accordance with the Qt Commercial License
23** Agreement provided with the Software.
24**
25** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27**
28** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29** information about Qt Commercial License Agreements.
30** See http://www.trolltech.com/qpl/ for QPL licensing information.
31** See http://www.trolltech.com/gpl/ for GPL licensing information.
32**
33** Contact info@trolltech.com if any conditions of this licensing are
34** not clear to you.
35**
36**********************************************************************/
37
38#include "qinputdialog.h"
39
40#include <qlayout.h>
41#include <qlabel.h>
42#include <qlineedit.h>
43#include <qpushbutton.h>
44#include <qspinbox.h>
45#include <qcombobox.h>
46#include <qwidgetstack.h>
47#include <qvalidator.h>
48#include <qapplication.h>
49
50class QInputDialogPrivate
51{
52public:
53 friend class QInputDialog;
54 QLineEdit *lineEdit;
55 QSpinBox *spinBox;
56 QComboBox *comboBox, *editComboBox;
57 QPushButton *ok;
58 QWidgetStack *stack;
59 QInputDialog::Type type;
60};
61
62/*!
63 \class QInputDialog qinputdialog.h
64 \brief A convenience dialog to get a simple input from the user
65 \ingroup dialogs
66
67 The QInputDialog is a simple dialog which can be used if you
68 need a simple input from the user. This can be text, a number or
69 an item from a list. Also a label has to be set to tell the user
70 what he/she should input.
71
72 In this Qt version only the 4 static convenience functions
73 getText(), getInteger(), getDouble() and getItem() of QInputDialog
74 are available.
75
76 Use it like this:
77
78 \code
79 bool ok = FALSE;
80 QString text = QInputDialog::getText( tr( "Make an input" ), tr( "Please enter your name" ), QString::null, &ok, this );
81 if ( ok && !text.isEmpty() )
82 ;// user entered something and pressed ok
83 else
84 ;// user entered nothing or pressed cancel
85 \endcode
86
87 There are more static convenience methods!
88
89 \sa getText(), getInteger(), getDouble(), getItem()
90*/
91
92/*!
93 \enum QInputDialog::Type
94
95 This enum type specifies the type of the dialog
96 (which kind of input can be done):
97
98 <ul>
99 <li>\c LineEdit - A QLineEdit is used for taking the input, so a textual or
100 (e.g. using a QValidator) a numerical input can be done. Using lineEdit()
101 the QLineEdit can be accessed.
102 <li>\c SpinBox - A QSpinBox is used for taking the input, so a decimal
103 input can be done. Using spinBox() the QSpinBox can be accessed.
104 <li>\c ComboBox - A read-only QComboBox is used for taking the input,
105 so one item of a list can be chosen. Using comboBox() the QComboBox
106 can be accessed.
107 <li>\c EditableComboBox - An editable QComboBox is used for taking the input,
108 so either one item of a list can be chosen or a text can be entered. Using
109 editableComboBox() the QComboBox can be accessed.
110 </ul>
111*/
112
113/*!
114 Constructs the dialog. \a label is the text which is shown to the user (it should mention
115 to the user what he/she should input), \a parent the parent widget of the dialog, \a name
116 the name of it and if you set \a modal to TRUE, the dialog pops up modally, else it pops
117 up modeless. With \a type you specify the type of the dialog.
118
119 \sa getText(), getInteger(), getDouble(), getItem()
120*/
121
122QInputDialog::QInputDialog( const QString &label, QWidget* parent, const char* name,
123 bool modal, Type type)
124 : QDialog( parent, name, modal )
125{
126 if ( parent && parent->icon() &&!parent->icon()->isNull() )
127 setIcon( *parent->icon() );
128 else if ( qApp->mainWidget() && qApp->mainWidget()->icon() && !qApp->mainWidget()->icon()->isNull() )
129 QDialog::setIcon( *qApp->mainWidget()->icon() );
130
131 d = new QInputDialogPrivate;
132 d->lineEdit = 0;
133 d->spinBox = 0;
134 d->comboBox = 0;
135
136 QVBoxLayout *vbox = new QVBoxLayout( this, 6, 6 );
137
138 QLabel* l = new QLabel( label, this );
139 vbox->addWidget( l );
140
141 d->stack = new QWidgetStack( this );
142 vbox->addWidget( d->stack );
143 d->lineEdit = new QLineEdit( d->stack );
144 d->spinBox = new QSpinBox( d->stack );
145 d->comboBox = new QComboBox( FALSE, d->stack );
146 d->editComboBox = new QComboBox( TRUE, d->stack );
147
148 QHBoxLayout *hbox = new QHBoxLayout( 6 );
149 vbox->addLayout( hbox, AlignRight );
150
151 d->ok = new QPushButton( tr( "&OK" ), this );
152 d->ok->setDefault( TRUE );
153 QPushButton *cancel = new QPushButton( tr( "&Cancel" ), this );
154
155 QSize bs( d->ok->sizeHint() );
156 if ( cancel->sizeHint().width() > bs.width() )
157 bs.setWidth( cancel->sizeHint().width() );
158
159 d->ok->setFixedSize( bs );
160 cancel->setFixedSize( bs );
161
162 hbox->addWidget( new QWidget( this ) );
163 hbox->addWidget( d->ok );
164 hbox->addWidget( cancel );
165
166 connect( d->lineEdit, SIGNAL( returnPressed() ),
167 this, SLOT( tryAccept() ) );
168 connect( d->lineEdit, SIGNAL( textChanged( const QString & ) ),
169 this, SLOT( textChanged( const QString & ) ) );
170
171 connect( d->ok, SIGNAL( clicked() ), this, SLOT( accept() ) );
172 connect( cancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
173
174//US ToDo make size dependent of targetplatform
175//US resize( QMAX( sizeHint().width(), 400 ), sizeHint().height() );
176 resize( sizeHint().width(), sizeHint().height() );
177
178 setType( type );
179}
180
181/*!
182 Returns the line edit, which is used in the LineEdit mode
183*/
184
185QLineEdit *QInputDialog::lineEdit() const
186{
187 return d->lineEdit;
188}
189
190/*!
191 Returns the spinbox, which is used in the SpinBox mode
192*/
193
194QSpinBox *QInputDialog::spinBox() const
195{
196 return d->spinBox;
197}
198
199/*!
200 Returns the combobox, which is used in the ComboBox mode
201*/
202
203QComboBox *QInputDialog::comboBox() const
204{
205 return d->comboBox;
206}
207
208/*!
209 Returns the combobox, which is used in the EditableComboBox mode
210*/
211
212QComboBox *QInputDialog::editableComboBox() const
213{
214 return d->editComboBox;
215}
216
217/*!
218 Sets the input type of the dialog to \a t.
219*/
220
221void QInputDialog::setType( Type t )
222{
223 switch ( t ) {
224 case LineEdit:
225 d->stack->raiseWidget( d->lineEdit );
226 d->lineEdit->setFocus();
227 break;
228 case SpinBox:
229 d->stack->raiseWidget( d->spinBox );
230 d->spinBox->setFocus();
231 break;
232 case ComboBox:
233 d->stack->raiseWidget( d->comboBox );
234 d->comboBox->setFocus();
235 break;
236 case EditableComboBox:
237 d->stack->raiseWidget( d->editComboBox );
238 d->editComboBox->setFocus();
239 break;
240 }
241
242 d->type = t;
243}
244
245/*!
246 Returns the input type of the dialog.
247
248 \sa setType()
249*/
250
251QInputDialog::Type QInputDialog::type() const
252{
253 return d->type;
254}
255
256/*!
257 Destructor.
258*/
259
260QInputDialog::~QInputDialog()
261{
262 delete d;
263}
264
265/*!
266 Static convenience function to get a textual input from the user. \a caption is the text
267 which is displayed in the title bar of the dialog. \a label is the text which
268 is shown to the user (it should mention to the user what he/she should input), \a text
269 the default text which will be initially set to the line edit, \a ok a pointer to
270 a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the
271 user pressed cancel, \a parent the parent widget of the dialog and \a name
272 the name of it. The dialogs pops up modally!
273
274 This method returns the text which has been entered in the line edit.
275
276 You will use this static method like this:
277
278 \code
279 bool ok = FALSE;
280 QString text = QInputDialog::getText( tr( "Please enter your name" ), QString::null, &ok, this );
281 if ( ok && !text.isEmpty() )
282 ;// user entered something and pressed ok
283 else
284 ;// user entered nothing or pressed cancel
285 \endcode
286*/
287
288QString QInputDialog::getText( const QString &caption, const QString &label, const QString &text,
289 bool *ok, QWidget *parent, const char *name )
290{
291 return getText( caption, label, QLineEdit::Normal, text, ok, parent, name );
292}
293
294/*!
295 Like above, but accepts an a \a mode which the line edit will use to display text.
296
297 \sa getText()
298*/
299
300QString QInputDialog::getText( const QString &caption, const QString &label, QLineEdit::EchoMode mode,
301 const QString &text, bool *ok, QWidget *parent, const char *name )
302{
303 QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, LineEdit );
304 dlg->setCaption( caption );
305 dlg->lineEdit()->setText( text );
306 dlg->lineEdit()->setEchoMode( mode );
307 if ( !text.isEmpty() )
308 dlg->lineEdit()->selectAll();
309
310 bool ok_ = FALSE;
311 QString result;
312 ok_ = dlg->exec() == QDialog::Accepted;
313 if ( ok )
314 *ok = ok_;
315 if ( ok_ )
316 result = dlg->lineEdit()->text();
317
318 delete dlg;
319 return result;
320}
321
322/*!
323 Static convenience function to get an integral input from the user. \a caption is the text
324 which is displayed in the title bar of the dialog. \a label is the text which
325 is shown to the user (it should mention to the user what he/she should input), \a num
326 the default number which will be initially set to the spinbox, \a from and \a to the
327 range in which the entered number has to be, \a step the step in which the number can
328 be increased/decreased by the spinbox, \a ok a pointer to
329 a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the
330 user pressed cancel, \a parent the parent widget of the dialog and \a name
331 the name of it. The dialogs pops up modally!
332
333 This method returns the number which has been entered by the user.
334
335 You will use this static method like this:
336
337 \code
338 bool ok = FALSE;
339 int res = QInputDialog::getInteger( tr( "Please enter a number" ), 22, 0, 1000, 2, &ok, this );
340 if ( ok )
341 ;// user entered something and pressed ok
342 else
343 ;// user pressed cancel
344 \endcode
345*/
346
347int QInputDialog::getInteger( const QString &caption, const QString &label, int num, int from, int to, int step,
348 bool *ok, QWidget *parent, const char *name )
349{
350 QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, SpinBox );
351 dlg->setCaption( caption );
352 dlg->spinBox()->setRange( from, to );
353 dlg->spinBox()->setSteps( step, 0 );
354 dlg->spinBox()->setValue( num );
355
356 bool ok_ = FALSE;
357 int result;
358 ok_ = dlg->exec() == QDialog::Accepted;
359 if ( ok )
360 *ok = ok_;
361 result = dlg->spinBox()->value();
362
363 delete dlg;
364 return result;
365}
366
367/*!
368 Static convenience function to get a decimal input from the user. \a caption is the text
369 which is displayed in the title bar of the dialog. \a label is the text which
370 is shown to the user (it should mention to the user what he/she should input), \a num
371 the default decimal number which will be initially set to the line edit, \a from and \a to the
372 range in which the entered number has to be, \a decimals the number of decimal which
373 the number may have, \a ok a pointer to
374 a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the
375 user pressed cancel, \a parent the parent widget of the dialog and \a name
376 the name of it. The dialogs pops up modally!
377
378 This method returns the number which has been entered by the user.
379
380 You will use this static method like this:
381
382 \code
383 bool ok = FALSE;
384 double res = QInputDialog::getDouble( tr( "Please enter a decimal number" ), 33.7, 0, 1000, 2, &ok, this );
385 if ( ok )
386 ;// user entered something and pressed ok
387 else
388 ;// user pressed cancel
389 \endcode
390*/
391
392double QInputDialog::getDouble( const QString &caption, const QString &label, double num,
393 double from, double to, int decimals,
394 bool *ok, QWidget *parent, const char *name )
395{
396 QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, LineEdit );
397 dlg->setCaption( caption );
398 dlg->lineEdit()->setValidator( new QDoubleValidator( from, to, decimals, dlg->lineEdit() ) );
399 dlg->lineEdit()->setText( QString::number( num, 'f', decimals ) );
400 dlg->lineEdit()->selectAll();
401
402 bool accepted = ( dlg->exec() == QDialog::Accepted );
403 if ( ok )
404 *ok = accepted;
405
406 double result = dlg->lineEdit()->text().toDouble();
407
408 delete dlg;
409 return result;
410}
411
412/*!
413 Static convenience function to let the user select an item from a string list. \a caption is the text
414 which is displayed in the title bar of the dialog. \a label is the text which
415 is shown to the user (it should mention to the user what he/she should input), \a list the
416 string list which is inserted into the combobox, \a current the number of the item which should
417 be initially the current item, \a editable specifies if the combobox should be editable (if it is TRUE)
418 or read-only (if \a editable is FALSE), \a ok a pointer to
419 a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the
420 user pressed cancel, \a parent the parent widget of the dialog and \a name
421 the name of it. The dialogs pops up modally!
422
423 This method returns the text of the current item, or if \a editable was TRUE, the current
424 text of the combobox.
425
426 You will use this static method like this:
427
428 \code
429 QStringList lst;
430 lst << "First" << "Second" << "Third" << "Fourth" << "Fifth";
431 bool ok = FALSE;
432 QString res = QInputDialog::getItem( tr( "Please select an item" ), lst, 1, TRUE, &ok, this );
433 if ( ok )
434 ;// user selected an item and pressed ok
435 else
436 ;// user pressed cancel
437 \endcode
438*/
439
440QString QInputDialog::getItem( const QString &caption, const QString &label, const QStringList &list,
441 int current, bool editable,
442 bool *ok, QWidget *parent, const char *name )
443{
444 QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, editable ? EditableComboBox : ComboBox );
445 dlg->setCaption( caption );
446 if ( editable ) {
447 dlg->editableComboBox()->insertStringList( list );
448 dlg->editableComboBox()->setCurrentItem( current );
449 } else {
450 dlg->comboBox()->insertStringList( list );
451 dlg->comboBox()->setCurrentItem( current );
452 }
453
454 bool ok_ = FALSE;
455 QString result;
456 ok_ = dlg->exec() == QDialog::Accepted;
457 if ( ok )
458 *ok = ok_;
459 if ( editable )
460 result = dlg->editableComboBox()->currentText();
461 else
462 result = dlg->comboBox()->currentText();
463
464 delete dlg;
465 return result;
466}
467
468/*!
469 \internal
470*/
471
472void QInputDialog::textChanged( const QString &s )
473{
474 bool on;
475 if ( d->lineEdit->validator() ) {
476 QString str = d->lineEdit->text();
477 int index = d->lineEdit->cursorPosition();
478 on = ( d->lineEdit->validator()->validate(str, index) ==
479 QValidator::Acceptable );
480 } else {
481 on = !s.isEmpty();
482 }
483 d->ok->setEnabled( on );
484}
485
486/*!
487 \internal
488*/
489
490void QInputDialog::tryAccept()
491{
492 if ( !d->lineEdit->text().isEmpty() )
493 accept();
494}
495