source: vendor/trolltech/current/src/widgets/qdialogbuttons.cpp

Last change on this file was 2, checked in by dmik, 20 years ago

Imported xplatform parts of the official release 3.3.1 from Trolltech

  • Property svn:keywords set to Id
File size: 10.8 KB
Line 
1/****************************************************************************
2** $Id: qdialogbuttons.cpp 2 2005-11-16 15:49:26Z dmik $
3**
4** Implementation of QDialogButtons class
5**
6** Copyright (C) 2003 Trolltech AS. All rights reserved.
7**
8** This file is part of the widgets module of the Qt GUI Toolkit.
9**
10** This file may be distributed under the terms of the Q Public License
11** as defined by Trolltech AS of Norway and appearing in the file
12** LICENSE.QPL included in the packaging of this file.
13**
14** This file may be distributed and/or modified under the terms of the
15** GNU General Public License version 2 as published by the Free Software
16** Foundation and appearing in the file LICENSE.GPL included in the
17** packaging of this file.
18**
19** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
20** licenses may use this file in accordance with the Qt Commercial License
21** Agreement provided with the Software.
22**
23** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
24** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
25**
26** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
27** information about Qt Commercial License Agreements.
28** See http://www.trolltech.com/qpl/ for QPL licensing information.
29** See http://www.trolltech.com/gpl/ for GPL licensing information.
30**
31** Contact info@trolltech.com if any conditions of this licensing are
32** not clear to you.
33**
34**********************************************************************/
35
36#include "qdialogbuttons_p.h"
37#ifndef QT_NO_DIALOGBUTTONS
38
39#include <qapplication.h>
40#include <qpushbutton.h>
41#include <qguardedptr.h>
42#include <qmap.h>
43#include <qvariant.h>
44#ifndef QT_NO_DIALOG
45#include <qdialog.h>
46#endif // QT_NO_DIALOG
47#include <qlayout.h>
48#include <qstyle.h>
49#include <qmap.h>
50
51struct QDialogButtonsPrivate
52{
53 QMap<int, QString> text;
54 QMap<QDialogButtons::Button, QWidget *> buttons;
55 QGuardedPtr<QWidget> custom;
56 Q_UINT32 enabled, visible;
57 QDialogButtons::Button def;
58 Qt::Orientation orient;
59 bool questionMode;
60};
61
62#ifndef QT_NO_DIALOG
63QDialogButtons::QDialogButtons(QDialog *parent, bool autoConnect, Q_UINT32 buttons,
64 Orientation orient, const char *name ) : QWidget(parent, name)
65{
66 init(buttons, orient);
67 if(parent && autoConnect) {
68 QObject::connect(this, SIGNAL(acceptClicked()), parent, SLOT(accept()));
69 QObject::connect(this, SIGNAL(rejectClicked()), parent, SLOT(reject()));
70 }
71}
72#endif // QT_NO_DIALOG
73
74QDialogButtons::QDialogButtons(QWidget *parent, Q_UINT32 buttons,
75 Orientation orient, const char *name ) : QWidget(parent, name)
76{
77 init(buttons, orient);
78}
79
80void
81QDialogButtons::init(Q_UINT32 buttons, Orientation orient)
82{
83 if(buttons == All) {
84 qWarning("QDialogButtons: cannot specify All by itself!");
85 buttons = None;
86 }
87 d = new QDialogButtonsPrivate;
88 d->questionMode = FALSE;
89 d->orient = orient;
90 d->def = (Button)style().styleHint(QStyle::SH_DialogButtons_DefaultButton, this);
91 d->enabled = d->visible = buttons;
92}
93
94QDialogButtons::~QDialogButtons()
95{
96 delete (QWidget *)d->custom;
97 delete d;
98}
99
100void
101QDialogButtons::setQuestionMode(bool b)
102{
103 d->questionMode = b;
104}
105
106bool
107QDialogButtons::questionMode() const
108{
109 return d->questionMode;
110}
111
112void
113QDialogButtons::setButtonEnabled(Button button, bool enabled)
114{
115 if(enabled)
116 d->enabled |= button;
117 else
118 d->enabled ^= button;
119 if(d->buttons.contains(button))
120 d->buttons[button]->setEnabled(enabled);
121}
122
123bool
124QDialogButtons::isButtonEnabled(Button button) const
125{
126 return ((int)(d->enabled & button)) == button;
127}
128
129void
130QDialogButtons::setButtonVisible(Button button, bool visible)
131{
132 if(visible) {
133 if(d->buttons.contains(button))
134 d->buttons[button]->show();
135 d->visible |= button;
136 } else {
137 if(d->buttons.contains(button))
138 d->buttons[button]->hide();
139 d->visible ^= button;
140 }
141 layoutButtons();
142}
143
144bool
145QDialogButtons::isButtonVisible(Button button) const
146{
147 return ((int)(d->visible & button)) == button;
148}
149
150void
151QDialogButtons::addWidget(QWidget *w)
152{
153 QBoxLayout *lay = NULL;
154 if(!d->custom) {
155 d->custom = new QWidget(this, "dialog_custom_area");
156 if(orientation() == Horizontal)
157 lay = new QHBoxLayout(d->custom);
158 else
159 lay = new QVBoxLayout(d->custom);
160 layoutButtons();
161 } else {
162 lay = (QBoxLayout*)d->custom->layout();
163 }
164 if(w->parent() != d->custom)
165 w->reparent(d->custom, 0, QPoint(0, 0), TRUE);
166 lay->addWidget(w);
167}
168
169void
170QDialogButtons::setDefaultButton(Button button)
171{
172 if(!((int)(d->visible & button) == button)) {
173 qWarning("QDialogButtons: Button '%d' is not visible (so cannot be default)", button);
174 return;
175 }
176 if(d->def != button) {
177#ifndef QT_NO_PROPERTIES
178 if(d->buttons.contains(d->def))
179 d->buttons[d->def]->setProperty("default", QVariant(FALSE,0));
180#endif
181 d->def = button;
182#ifndef QT_NO_PROPERTIES
183 if(d->buttons.contains(d->def))
184 d->buttons[d->def]->setProperty("default", QVariant(FALSE,0));
185#endif
186 }
187}
188
189QDialogButtons::Button
190QDialogButtons::defaultButton() const
191{
192 return d->def;
193}
194
195void
196QDialogButtons::setButtonText(Button button, const QString &str)
197{
198 d->text[button] = str;
199#ifndef QT_NO_PROPERTIES
200 if(d->buttons.contains(button))
201 d->buttons[button]->setProperty("text", QVariant(str));
202#endif
203 layoutButtons();
204}
205
206QString
207QDialogButtons::buttonText(Button b) const
208{
209 if(d->text.contains(b))
210 return d->text[b];
211 return QString(); //null if it is default..
212}
213
214void
215QDialogButtons::setOrientation(Orientation orient)
216{
217 if(d->orient != orient) {
218 d->orient = orient;
219 if(d->custom && d->custom->layout())
220 ((QBoxLayout*)d->custom->layout())->setDirection(orient == Horizontal ? QBoxLayout::LeftToRight :
221 QBoxLayout::TopToBottom);
222 layoutButtons();
223 }
224}
225
226Qt::Orientation
227QDialogButtons::orientation() const
228{
229 return d->orient;
230}
231
232QWidget *
233QDialogButtons::createButton(Button b)
234{
235 QPushButton *ret = new QPushButton(this, "qdialog_button");
236 QObject::connect(ret, SIGNAL(clicked()), this, SLOT(handleClicked()));
237 if(d->text.contains(b)) {
238 ret->setText(d->text[b]);
239 } else {
240 switch(b) {
241 case All: {
242 QString txt = buttonText(defaultButton());
243 if(txt.isNull()) {
244 if(defaultButton() == Accept) {
245 if(questionMode())
246 txt = tr("Yes to All");
247 else
248 txt = tr("OK to All");
249 } else {
250 if(questionMode())
251 txt = tr("No to All");
252 else
253 txt = tr("Cancel All");
254 }
255 } else {
256 txt += tr(" to All"); //ick, I can't really do this!!
257 }
258 ret->setText(txt);
259 break; }
260 case Accept:
261 if(questionMode())
262 ret->setText(tr("Yes"));
263 else
264 ret->setText(tr("OK"));
265 break;
266 case Reject:
267 if(questionMode())
268 ret->setText(tr("No"));
269 else
270 ret->setText(tr("Cancel"));
271 break;
272 case Apply:
273 ret->setText(tr("Apply"));
274 break;
275 case Ignore:
276 ret->setText(tr("Ignore"));
277 break;
278 case Retry:
279 ret->setText(tr("Retry"));
280 break;
281 case Abort:
282 ret->setText(tr("Abort"));
283 break;
284 case Help:
285 ret->setText(tr("Help"));
286 break;
287 default:
288 break;
289 }
290 }
291 return ret;
292}
293
294void
295QDialogButtons::handleClicked()
296{
297 const QObject *s = sender();
298 if(!s)
299 return;
300
301 for(QMapIterator<QDialogButtons::Button, QWidget *> it = d->buttons.begin(); it != d->buttons.end(); ++it) {
302 if(it.data() == s) {
303 emit clicked((QDialogButtons::Button)it.key());
304 switch(it.key()) {
305 case Retry:
306 emit retryClicked();
307 break;
308 case Ignore:
309 emit ignoreClicked();
310 break;
311 case Abort:
312 emit abortClicked();
313 break;
314 case All:
315 emit allClicked();
316 break;
317 case Accept:
318 emit acceptClicked();
319 break;
320 case Reject:
321 emit rejectClicked();
322 break;
323 case Apply:
324 emit applyClicked();
325 break;
326 case Help:
327 emit helpClicked();
328 break;
329 default:
330 break;
331 }
332 return;
333 }
334 }
335}
336
337void
338QDialogButtons::resizeEvent(QResizeEvent *)
339{
340 layoutButtons();
341}
342
343void
344QDialogButtons::showEvent(QShowEvent *)
345{
346 layoutButtons();
347}
348
349void
350QDialogButtons::styleChanged(QStyle &old)
351{
352 layoutButtons();
353 QWidget::styleChange(old);
354}
355
356void
357QDialogButtons::layoutButtons()
358{
359 if(!isVisible()) //nah..
360 return;
361
362 QStyle::SubRect rects[] = {
363 QStyle::SR_DialogButtonAccept, QStyle::SR_DialogButtonReject,
364 QStyle::SR_DialogButtonApply, QStyle::SR_DialogButtonHelp,
365 QStyle::SR_DialogButtonCustom, QStyle::SR_DialogButtonAll,
366 QStyle::SR_DialogButtonRetry, QStyle::SR_DialogButtonIgnore,
367 QStyle::SR_DialogButtonAbort };
368 for(unsigned int i = 0; i < (sizeof(rects) / sizeof(rects[0])); i++) {
369 QWidget *w = NULL;
370 if(rects[i] == QStyle::SR_DialogButtonCustom) {
371 w = d->custom;
372 } else {
373 Button b = None;
374 if(rects[i] == QStyle::SR_DialogButtonApply)
375 b = Apply;
376 else if(rects[i] == QStyle::SR_DialogButtonAll)
377 b = All;
378 else if(rects[i] == QStyle::SR_DialogButtonAccept)
379 b = Accept;
380 else if(rects[i] == QStyle::SR_DialogButtonReject)
381 b = Reject;
382 else if(rects[i] == QStyle::SR_DialogButtonHelp)
383 b = Help;
384 else if(rects[i] == QStyle::SR_DialogButtonRetry)
385 b = Retry;
386 else if(rects[i] == QStyle::SR_DialogButtonAbort)
387 b = Abort;
388 else if(rects[i] == QStyle::SR_DialogButtonIgnore)
389 b = Ignore;
390 if(b != None) {
391 if(d->buttons.contains(b)) {
392 w = d->buttons[b];
393 if(!(d->visible & b)) {
394 w->hide();
395 continue;
396 }
397 } else if(d->visible & b) {
398 w = createButton(b);
399 d->buttons.insert(b, w);
400 } else {
401 continue;
402 }
403 if(w) {
404 if(b == d->def) {
405 w->setFocus();
406#ifndef QT_NO_PROPERTIES
407 w->setProperty("default", QVariant(TRUE,0));
408#endif
409 }
410 w->setEnabled(d->enabled & b);
411 }
412 }
413 }
414 if(w) {
415 w->show();
416 w->setGeometry(style().subRect(rects[i], this));
417 }
418 }
419}
420
421QSize
422QDialogButtons::sizeHint() const
423{
424 constPolish();
425 QSize s;
426 if(d->custom)
427 s = d->custom->sizeHint();
428 return (style().sizeFromContents(QStyle::CT_DialogButtons, this, s.
429 expandedTo(QApplication::globalStrut())));
430}
431
432QSize
433QDialogButtons::sizeHint(QDialogButtons::Button button) const
434{
435 QWidget *w = NULL;
436 if(d->visible & button) {
437 if(!d->buttons.contains(button)) {
438 QDialogButtons *that = (QDialogButtons*)this; //ick, constness..
439 w = that->createButton(button);
440 that->d->buttons.insert(button, w);
441 } else {
442 w = d->buttons[button];
443 }
444 }
445 return w->sizeHint();
446}
447
448QSize
449QDialogButtons::minimumSizeHint() const
450{
451 return sizeHint();
452}
453#endif
Note: See TracBrowser for help on using the repository browser.