Krita Source Code Documentation
Loading...
Searching...
No Matches
KoDialog.cpp
Go to the documentation of this file.
1/* This file is part of the KDE Libraries
2 * SPDX-FileCopyrightText: 1998 Thomas Tanghus (tanghus@earthling.net)
3 * SPDX-FileCopyrightText: 1999-2000 Espen Sand (espen@kde.org)
4 * SPDX-FileCopyrightText: 1999-2000 Holger Freyther <freyther@kde.org>
5 * SPDX-FileCopyrightText: 2005-2009 Olivier Goffart (ogoffart at kde.org)
6 *
7 * SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9
10#include "KoDialog.h"
11#include "KoDialog_p.h"
12
13#include <QWindow>
14#include <QApplication>
15#include <QGuiApplication>
16#include <QDialogButtonBox>
17#include <QHBoxLayout>
18#include <QHideEvent>
19#include <QPointer>
20#include <QStyle>
21#include <QTimer>
22#include <QVBoxLayout>
23#include <QWhatsThis>
24#include <QDebug>
25#include <QPushButton>
26#include <QScreen>
27#include <QTimer>
28
29#include <kconfig.h>
30#include <klocalizedstring.h>
31
32#include <kseparator.h>
33#include <kstandardguiitem.h>
34#include <khelpclient.h>
35#include <kurllabel.h>
36#include <kwindowconfig.h>
37
39{
40 Q_Q(KoDialog);
41 if (!dirty) {
42 QMetaObject::invokeMethod(q, "queuedLayoutUpdate", Qt::QueuedConnection);
43 dirty = true;
44 }
45}
46
48{
49 if (!dirty) {
50 return;
51 }
52
53 dirty = false;
54
55 Q_Q(KoDialog);
56
57 // Don't lose the focus widget when re-creating the layout.
58 // Testcase: KOrganizer's "Select Categories" dialog
59 QPointer<QWidget> focusWidget = mMainWidget ? mMainWidget->focusWidget() : 0;
60
61 if (q->layout() && q->layout() != mTopLayout) {
62 qWarning() << q->metaObject()->className() << "created with a layout; don't do that, KoDialog takes care of it, use mainWidget or setMainWidget instead";
63 delete q->layout();
64 }
65
66 delete mTopLayout;
67
68 if (mButtonOrientation == Qt::Horizontal) {
69 mTopLayout = new QVBoxLayout(q);
70 } else {
71 mTopLayout = new QHBoxLayout(q);
72 }
73
74 if (mUrlHelp) {
75 mTopLayout->addWidget(mUrlHelp, 0, Qt::AlignRight);
76 }
77
78 if (mMainWidget) {
79 mTopLayout->addWidget(mMainWidget, 10);
80 }
81
82 if (mDetailsWidget) {
83 mTopLayout->addWidget(mDetailsWidget);
84 }
85
86 if (mActionSeparator) {
87 mTopLayout->addWidget(mActionSeparator);
88 }
89
90 if (mButtonBox) {
91 mButtonBox->setOrientation(mButtonOrientation);
92 mTopLayout->addWidget(mButtonBox);
93 }
94
95 if (focusWidget) {
96 focusWidget->setFocus();
97 }
98}
99
101{
102 Q_Q(KoDialog);
103
104 QDialogButtonBox::ButtonRole role = QDialogButtonBox::InvalidRole;
105 switch (key) {
106 case KoDialog::Help:
108 role = QDialogButtonBox::HelpRole;
109 break;
111 case KoDialog::Reset:
112 role = QDialogButtonBox::ResetRole;
113 break;
114 case KoDialog::Ok:
115 role = QDialogButtonBox::AcceptRole;
116 break;
117 case KoDialog::Apply:
118 role = QDialogButtonBox::ApplyRole;
119 break;
120 case KoDialog::Try:
121 case KoDialog::Yes:
122 role = QDialogButtonBox::YesRole;
123 break;
124 case KoDialog::Close:
125 case KoDialog::Cancel:
126 role = QDialogButtonBox::RejectRole;
127 break;
128 case KoDialog::No:
129 role = QDialogButtonBox::NoRole;
130 break;
131 case KoDialog::User1:
132 case KoDialog::User2:
133 case KoDialog::User3:
134 role = QDialogButtonBox::ActionRole;
135 break;
136 default:
137 role = QDialogButtonBox::InvalidRole;
138 break;
139 }
140
141 if (role == QDialogButtonBox::InvalidRole) {
142 return;
143 }
144
145 QPushButton *button = new QPushButton;
146 KGuiItem::assign(button, item);
147 mButtonBox->addButton(button, role);
148
149 mButtonList.insert(key, button);
150
151 QObject::connect(button, &QPushButton::clicked, q, [=] { q->slotButtonClicked(key); });
152
153 if (key == mDefaultButton) {
154 // Now that it exists, set it as default
155 q->setDefaultButton(mDefaultButton);
156 }
157}
158
160{
161 q_ptr = q;
162
163 dirty = false;
164
167
168 q->setPlainCaption(qApp->applicationDisplayName()); // set appropriate initial window title for case it gets not set later
169}
170
175
176KoDialog::KoDialog(QWidget *parent, Qt::WindowFlags flags)
177 : QDialog(parent ? parent : qApp->activeWindow(), flags)
178 , d_ptr(new KoDialogPrivate)
179{
180 d_ptr->init(this);
181}
182
183KoDialog::KoDialog(KoDialogPrivate &dd, QWidget *parent, Qt::WindowFlags flags)
184 : QDialog(parent ? parent : qApp->activeWindow(), flags)
185 , d_ptr(&dd)
186{
187 d_ptr->init(this);
188}
189
191{
192 delete d_ptr;
193}
194
195void KoDialog::setButtons(ButtonCodes buttonMask)
196{
197 Q_D(KoDialog);
198 if (d->mButtonBox) {
199 d->mButtonList.clear();
200
201 delete d->mButtonBox;
202 d->mButtonBox = 0;
203 }
204
205 if (buttonMask & Cancel) {
206 buttonMask &= ~Close;
207 }
208
209 if (buttonMask & Apply) {
210 buttonMask &= ~Try;
211 }
212
213 if (buttonMask & Details) {
214 buttonMask &= ~Default;
215 }
216
217 if (buttonMask == None) {
218 d->setupLayout();
219 return; // When we want no button box
220 }
221
222 d->mEscapeButton = (buttonMask & Cancel) ? Cancel : Close;
223 d->mButtonBox = new QDialogButtonBox(this);
224
225 if (buttonMask & Help) {
226 d->appendButton(Help, KStandardGuiItem::help());
227 }
228 if (buttonMask & Default) {
229 d->appendButton(Default, KStandardGuiItem::defaults());
230 }
231 if (buttonMask & Reset) {
232 d->appendButton(Reset, KStandardGuiItem::reset());
233 }
234 if (buttonMask & User3) {
235 d->appendButton(User3, KGuiItem());
236 }
237 if (buttonMask & User2) {
238 d->appendButton(User2, KGuiItem());
239 }
240 if (buttonMask & User1) {
241 d->appendButton(User1, KGuiItem());
242 }
243 if (buttonMask & Ok) {
244 d->appendButton(Ok, KStandardGuiItem::ok());
245 }
246 if (buttonMask & Apply) {
247 d->appendButton(Apply, KStandardGuiItem::apply());
248 }
249 if (buttonMask & Try) {
250 d->appendButton(Try, KGuiItem(i18n("&Try")));
251 }
252 if (buttonMask & Cancel) {
253 d->appendButton(Cancel, KStandardGuiItem::cancel());
254 }
255 if (buttonMask & Close) {
256 d->appendButton(Close, KStandardGuiItem::close());
257 }
258 if (buttonMask & Yes) {
259#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
260 d->appendButton(Yes, KStandardGuiItem::yes());
261#else
262 d->appendButton(Yes, KStandardGuiItem::apply());
263#endif
264 }
265 if (buttonMask & No) {
266#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
267 d->appendButton(No, KStandardGuiItem::no());
268#else
269 d->appendButton(No, KStandardGuiItem::cancel());
270#endif
271
272 }
273 if (buttonMask & Details) {
274 d->appendButton(Details, KGuiItem(QString(), "help-about"));
276 }
277
278 d->setupLayout();
279}
280
281void KoDialog::setButtonsOrientation(Qt::Orientation orientation)
282{
283 Q_D(KoDialog);
284 if (d->mButtonOrientation != orientation) {
285 d->mButtonOrientation = orientation;
286
287 if (d->mActionSeparator) {
288 d->mActionSeparator->setOrientation(d->mButtonOrientation);
289 }
290
291 if (d->mButtonOrientation == Qt::Vertical) {
292 enableLinkedHelp(false); // 2000-06-18 Espen: No support for this yet.
293 }
294 }
295}
296
298{
299 d_func()->mEscapeButton = id;
300}
301
303{
304 Q_D(KoDialog);
305
306 if (newDefaultButton == None) {
307 newDefaultButton = NoDefault; // #148969
308 }
309
310 const KoDialog::ButtonCode oldDefault = defaultButton();
311
312 bool oldDefaultHadFocus = false;
313
314 if (oldDefault != NoDefault) {
315 QPushButton *old = button(oldDefault);
316 if (old) {
317 oldDefaultHadFocus = (focusWidget() == old);
318 old->setDefault(false);
319 }
320 }
321
322 if (newDefaultButton != NoDefault) {
323 QPushButton *b = button(newDefaultButton);
324 if (b) {
325 b->setDefault(true);
326 if (focusWidget() == 0 || oldDefaultHadFocus) {
327 // No widget had focus yet, or the old default button had
328 // -> ok to give focus to the new default button, so that it's
329 // really default (Enter triggers it).
330 // But we don't do this if the kdialog user gave focus to a
331 // specific widget in the dialog.
332 b->setFocus();
333 }
334 }
335 }
336 d->mDefaultButton = newDefaultButton;
337 Q_ASSERT(defaultButton() == newDefaultButton);
338}
339
341{
342 Q_D(const KoDialog);
343 QHashIterator<int, QPushButton *> it(d->mButtonList);
344 while (it.hasNext()) {
345 it.next();
346 if (it.value()->isDefault()) {
347 return (ButtonCode)it.key();
348 }
349 }
350
351 return d->mDefaultButton;
352}
353
354void KoDialog::setMainWidget(QWidget *widget)
355{
356 Q_D(KoDialog);
357 if (d->mMainWidget == widget) {
358 return;
359 }
360 d->mMainWidget = widget;
361 if (d->mMainWidget && d->mMainWidget->layout()) {
362 // Avoid double-margin problem
363 d->mMainWidget->layout()->setContentsMargins(0, 0, 0, 0);
364 }
365 d->setupLayout();
366}
367
369{
370 Q_D(KoDialog);
371 if (!d->mMainWidget) {
372 setMainWidget(new QWidget(this));
373 }
374 return d->mMainWidget;
375}
376
378{
379 Q_D(const KoDialog);
380
381 if (!d->mMinSize.isEmpty()) {
382 return d->mMinSize.expandedTo(minimumSizeHint()) + d->mIncSize;
383 } else {
384 if (d->dirty) {
385 const_cast<KoDialogPrivate *>(d)->queuedLayoutUpdate();
386 }
387 return QDialog::sizeHint() + d->mIncSize;
388 }
389}
390
392{
393 Q_D(const KoDialog);
394
395 if (d->dirty) {
396 const_cast<KoDialogPrivate *>(d)->queuedLayoutUpdate();
397 }
398 return QDialog::minimumSizeHint() + d->mIncSize;
399}
400
401//
402// Grab QDialogs keypresses if non-modal.
403//
404void KoDialog::keyPressEvent(QKeyEvent *event)
405{
406 Q_D(KoDialog);
407 if (event->modifiers() == 0) {
408 if (event->key() == Qt::Key_F1) {
409 QPushButton *button = this->button(Help);
410
411 if (button) {
412 button->animateClick();
413 event->accept();
414 return;
415 }
416 }
417
418 if (event->key() == Qt::Key_Escape) {
419 QPushButton *button = this->button(d->mEscapeButton);
420
421 if (button) {
422 button->animateClick();
423 event->accept();
424 return;
425 }
426
427 }
428 } else if (event->key() == Qt::Key_F1 && event->modifiers() == Qt::ShiftModifier) {
429 QWhatsThis::enterWhatsThisMode();
430 event->accept();
431 return;
432 } else if (event->modifiers() == Qt::ControlModifier &&
433 (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)) {
434 // accept the dialog when Ctrl-Return is pressed
435 QPushButton *button = this->button(Ok);
436
437 if (button) {
438 button->animateClick();
439 event->accept();
440 return;
441 }
442 }
443
444 QDialog::keyPressEvent(event);
445}
446
447void KoDialog::showEvent(QShowEvent *e)
448{
449 QDialog::showEvent(e);
450 QTimer::singleShot(5, Qt::CoarseTimer, [&]() {
451 adjustPosition(parentWidget());
452 });
453}
454
456{
457 return QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
458}
459
461{
462 return QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
463}
464
466{
467 return QApplication::fontMetrics().lineSpacing();
468}
469
470QString KoDialog::makeStandardCaption(const QString &userCaption,
471 QWidget *window,
472 CaptionFlags flags)
473{
474 Q_UNUSED(window);
475 QString caption = qApp->applicationDisplayName();
476 QString captionString = userCaption.isEmpty() ? caption : userCaption;
477
478 // If the document is modified, add '[modified]'.
479 if (flags & ModifiedCaption) {
480 captionString += QString::fromUtf8(" [") + i18n("modified") + QString::fromUtf8("]");
481 }
482
483 if (!userCaption.isEmpty()) {
484 // Add the application name if:
485 // User asked for it, it's not a duplication and the app name (caption()) is not empty
486 if (flags & AppNameCaption &&
487 !caption.isEmpty() &&
488 !userCaption.endsWith(caption)) {
489 // TODO: check to see if this is a transient/secondary window before trying to add the app name
490 // on platforms that need this
491 captionString += i18nc("Document/application separator in titlebar", " – ") + caption;
492 }
493 }
494
495 return captionString;
496}
497
498void KoDialog::setCaption(const QString &_caption)
499{
500 const QString caption = makeStandardCaption(_caption, this);
501 setPlainCaption(caption);
502}
503
504void KoDialog::setCaption(const QString &caption, bool modified)
505{
506 CaptionFlags flags = HIGCompliantCaption;
507
508 // ### Qt5 TODO: port to [*], see QWidget::setWindowFilePath
509 if (modified) {
510 flags |= ModifiedCaption;
511 }
512
513 setPlainCaption(makeStandardCaption(caption, this, flags));
514}
515
516void KoDialog::setPlainCaption(const QString &caption)
517{
518 if (QWidget *win = window()) {
519 win->setWindowTitle(caption);
520 }
521}
522
523void KoDialog::resizeLayout(QWidget *widget, int margin, int spacing) //static
524{
525 if (widget->layout()) {
526 resizeLayout(widget->layout(), margin, spacing);
527 }
528
529 if (widget->children().count() > 0) {
530 const QList<QObject *> list = widget->children();
531 foreach (QObject *object, list) {
532 if (object->isWidgetType()) {
533 resizeLayout((QWidget *)object, margin, spacing);
534 }
535 }
536 }
537}
538
539void KoDialog::resizeLayout(QLayout *layout, int margin, int spacing) //static
540{
541 QLayoutItem *child;
542 int pos = 0;
543
544 while ((child = layout->itemAt(pos))) {
545 if (child->layout()) {
546 resizeLayout(child->layout(), margin, spacing);
547 }
548
549 ++pos;
550 }
551
552 if (layout->layout()) {
553 layout->layout()->setContentsMargins(margin, margin, margin, margin);
554 layout->layout()->setSpacing(spacing);
555 }
556}
557
559{
560 Q_D(KoDialog);
561 if ((d->mActionSeparator != 0) == state) {
562 return;
563 }
564 if (state) {
565 if (d->mActionSeparator) {
566 return;
567 }
568
569 d->mActionSeparator = new KSeparator(this);
570 d->mActionSeparator->setOrientation(d->mButtonOrientation);
571 } else {
572 delete d->mActionSeparator;
573 d->mActionSeparator = 0;
574 }
575
576 d->setupLayout();
577}
578
579void KoDialog::setInitialSize(const QSize &size)
580{
581 d_func()->mMinSize = size;
582 adjustSize();
583}
584
585void KoDialog::incrementInitialSize(const QSize &size)
586{
587 d_func()->mIncSize = size;
588 adjustSize();
589}
590
591QPushButton *KoDialog::button(ButtonCode id) const
592{
593 Q_D(const KoDialog);
594 return d->mButtonList.value(id, 0);
595}
596
598{
599 QPushButton *button = this->button(id);
600 if (button) {
601 button->setEnabled(state);
602 }
603}
604
606{
607 QPushButton *button = this->button(id);
608 if (button) {
609 return button->isEnabled();
610 }
611
612 return false;
613}
614
616{
617 enableButton(Ok, state);
618}
619
621{
622 enableButton(Apply, state);
623}
624
626{
627 enableButton(Cancel, state);
628}
629
631{
632 QPushButton *button = this->button(id);
633 if (button) {
634 state ? button->show() : button->hide();
635 }
636}
637
638void KoDialog::setButtonGuiItem(ButtonCode id, const KGuiItem &item)
639{
640 QPushButton *button = this->button(id);
641 if (!button) {
642 return;
643 }
644
645 KGuiItem::assign(button, item);
646}
647
648void KoDialog::setButtonText(ButtonCode id, const QString &text)
649{
650 Q_D(KoDialog);
651 if (!d->mSettingDetails && (id == Details)) {
652 d->mDetailsButtonText = text;
653 setDetailsWidgetVisible(d->mDetailsVisible);
654 return;
655 }
656
657 QPushButton *button = this->button(id);
658 if (button) {
659 button->setText(text);
660 }
661}
662
664{
665 QPushButton *button = this->button(id);
666 if (button) {
667 return button->text();
668 } else {
669 return QString();
670 }
671}
672
673void KoDialog::setButtonIcon(ButtonCode id, const QIcon &icon)
674{
675 QPushButton *button = this->button(id);
676 if (button) {
677 button->setIcon(icon);
678 }
679}
680
682{
683 QPushButton *button = this->button(id);
684 if (button) {
685 return button->icon();
686 } else {
687 return QIcon();
688 }
689}
690
691void KoDialog::setButtonToolTip(ButtonCode id, const QString &text)
692{
693 QPushButton *button = this->button(id);
694 if (button) {
695 if (text.isEmpty()) {
696 button->setToolTip(QString());
697 } else {
698 button->setToolTip(text);
699 }
700 }
701}
702
704{
705 QPushButton *button = this->button(id);
706 if (button) {
707 return button->toolTip();
708 } else {
709 return QString();
710 }
711}
712
713void KoDialog::setButtonWhatsThis(ButtonCode id, const QString &text)
714{
715 QPushButton *button = this->button(id);
716 if (button) {
717 if (text.isEmpty()) {
718 button->setWhatsThis(QString());
719 } else {
720 button->setWhatsThis(text);
721 }
722 }
723}
724
726{
727 QPushButton *button = this->button(id);
728 if (button) {
729 return button->whatsThis();
730 } else {
731 return QString();
732 }
733}
734
736{
737 QPushButton *button = this->button(id);
738 if (button) {
739 button->setFocus();
740 }
741}
742
743void KoDialog::setDetailsWidget(QWidget *detailsWidget)
744{
745 Q_D(KoDialog);
746 if (d->mDetailsWidget == detailsWidget) {
747 return;
748 }
749 delete d->mDetailsWidget;
750 d->mDetailsWidget = detailsWidget;
751
752 if (d->mDetailsWidget->parentWidget() != this) {
753 d->mDetailsWidget->setParent(this);
754 }
755
756 d->mDetailsWidget->hide();
757 d->setupLayout();
758
759 if (!d->mSettingDetails) {
760 setDetailsWidgetVisible(d->mDetailsVisible);
761 }
762}
763
765{
766 return d_func()->mDetailsVisible;
767}
768
770{
771 Q_D(KoDialog);
772 if (d->mDetailsButtonText.isEmpty()) {
773 d->mDetailsButtonText = i18n("&Details");
774 }
775
776 d->mSettingDetails = true;
777 d->mDetailsVisible = visible;
778 if (d->mDetailsVisible) {
779 Q_EMIT aboutToShowDetails();
780 setButtonText(Details, d->mDetailsButtonText + " <<");
781 if (d->mDetailsWidget) {
782 if (layout()) {
783 layout()->setEnabled(false);
784 }
785
786 d->mDetailsWidget->show();
787
788 adjustSize();
789
790 if (layout()) {
791 layout()->activate();
792 layout()->setEnabled(true);
793 }
794 }
795 } else {
796 setButtonText(Details, d->mDetailsButtonText + " >>");
797 if (d->mDetailsWidget) {
798 d->mDetailsWidget->hide();
799 }
800
801 if (layout()) {
802 layout()->activate();
803 adjustSize();
804 }
805
806 }
807
808 d->mSettingDetails = false;
809}
810
812{
813 if (isVisible()) {
814 hide();
815 }
816
817 deleteLater();
818}
819
821{
822 Q_D(KoDialog);
823 Q_EMIT buttonClicked(static_cast<KoDialog::ButtonCode>(button));
824
825 switch (button) {
826 case Ok:
827 Q_EMIT okClicked();
828 accept();
829 break;
830 case Apply:
831 Q_EMIT applyClicked();
832 break;
833 case Try:
834 Q_EMIT tryClicked();
835 break;
836 case User3:
837 Q_EMIT user3Clicked();
838 break;
839 case User2:
840 Q_EMIT user2Clicked();
841 break;
842 case User1:
843 Q_EMIT user1Clicked();
844 break;
845 case Yes:
846 Q_EMIT yesClicked();
847 done(Yes);
848 break;
849 case No:
850 Q_EMIT noClicked();
851 done(No);
852 break;
853 case Cancel:
854 Q_EMIT cancelClicked();
855 reject();
856 break;
857 case Close:
858 Q_EMIT closeClicked();
859 done(Close); // KDE5: call reject() instead; more QDialog-like.
860 break;
861 case Help:
862 Q_EMIT helpClicked();
863 if (!d->mAnchor.isEmpty() || !d->mHelpApp.isEmpty()) {
864 KHelpClient::invokeHelp(d->mAnchor, d->mHelpApp);
865 }
866 break;
867 case Default:
868 Q_EMIT defaultClicked();
869 break;
870 case Reset:
871 Q_EMIT resetClicked();
872 break;
873 case Details:
874 setDetailsWidgetVisible(!d->mDetailsVisible);
875 break;
876 }
877
878 // If we're here from the closeEvent, and auto-delete is on, well, auto-delete now.
879 if (d->mDeferredDelete) {
880 d->mDeferredDelete = false;
882 }
883}
884
886{
887 Q_D(KoDialog);
888 if ((d->mUrlHelp != 0) == state) {
889 return;
890 }
891 if (state) {
892 if (d->mUrlHelp) {
893 return;
894 }
895
896 d->mUrlHelp = new KUrlLabel(this);
897 d->mUrlHelp->setText(helpLinkText());
898 d->mUrlHelp->setFloatEnabled(true);
899 d->mUrlHelp->setUnderline(true);
900 d->mUrlHelp->setMinimumHeight(fontMetrics().height() + marginHint());
901 connect(d->mUrlHelp, SIGNAL(leftClickedUrl()), SLOT(helpLinkClicked()));
902
903 d->mUrlHelp->show();
904 } else {
905 delete d->mUrlHelp;
906 d->mUrlHelp = 0;
907 }
908
909 d->setupLayout();
910}
911
912void KoDialog::setHelp(const QString &anchor, const QString &appname)
913{
914 Q_D(KoDialog);
915 d->mAnchor = anchor;
916 d->mHelpApp = appname;
917}
918
919void KoDialog::setHelpLinkText(const QString &text)
920{
921 Q_D(KoDialog);
922 d->mHelpLinkText = text;
923 if (d->mUrlHelp) {
924 d->mUrlHelp->setText(helpLinkText());
925 }
926}
927
929{
930 Q_D(const KoDialog);
931 return (d->mHelpLinkText.isEmpty() ? i18n("Get help...") : d->mHelpLinkText);
932}
933
934void KoDialog::hideEvent(QHideEvent *event)
935{
936 Q_EMIT hidden();
937
938 if (!event->spontaneous()) {
939 Q_EMIT finished();
940 }
941}
942
943void KoDialog::closeEvent(QCloseEvent *event)
944{
945 Q_D(KoDialog);
946 QPushButton *button = this->button(d->mEscapeButton);
947 if (button && !isHidden()) {
948 button->animateClick();
949
950 if (testAttribute(Qt::WA_DeleteOnClose)) {
951 // Don't let QWidget::close do a deferred delete just yet, wait for the click first
952 d->mDeferredDelete = true;
953 setAttribute(Qt::WA_DeleteOnClose, false);
954 }
955 } else {
956 QDialog::closeEvent(event);
957 }
958}
959
960#include "moc_KoDialog.cpp"
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KSeparator * mActionSeparator
Definition KoDialog_p.h:55
KoDialog::ButtonCode mDefaultButton
Definition KoDialog_p.h:62
KUrlLabel * mUrlHelp
Definition KoDialog_p.h:54
void init(KoDialog *)
Definition KoDialog.cpp:159
QHash< int, QPushButton * > mButtonList
Definition KoDialog_p.h:66
QWidget * mDetailsWidget
Definition KoDialog_p.h:47
QPointer< QWidget > mMainWidget
Definition KoDialog_p.h:53
void appendButton(KoDialog::ButtonCode code, const KGuiItem &item)
Definition KoDialog.cpp:100
Qt::Orientation mButtonOrientation
Definition KoDialog_p.h:61
void setupLayout()
Definition KoDialog.cpp:38
QDialogButtonBox * mButtonBox
Definition KoDialog_p.h:65
KoDialog * q_ptr
Definition KoDialog_p.h:39
void queuedLayoutUpdate()
Definition KoDialog.cpp:47
void helpLinkClicked()
Definition KoDialog.cpp:171
QBoxLayout * mTopLayout
Definition KoDialog_p.h:52
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void enableButtonCancel(bool state)
Definition KoDialog.cpp:625
void user1Clicked()
static int groupSpacingHint()
Definition KoDialog.cpp:465
void setButtonGuiItem(ButtonCode id, const KGuiItem &item)
Definition KoDialog.cpp:638
QWidget * mainWidget()
Definition KoDialog.cpp:368
void enableButton(ButtonCode id, bool state)
Definition KoDialog.cpp:597
void user3Clicked()
void finished()
void setButtonFocus(ButtonCode id)
Definition KoDialog.cpp:735
void applyClicked()
void setButtonsOrientation(Qt::Orientation orientation)
Definition KoDialog.cpp:281
static int marginHint()
Definition KoDialog.cpp:455
void setHelp(const QString &anchor, const QString &appname=QString())
Definition KoDialog.cpp:912
virtual void slotButtonClicked(int button)
Definition KoDialog.cpp:820
static QString makeStandardCaption(const QString &userCaption, QWidget *window=0, CaptionFlags flags=HIGCompliantCaption)
Definition KoDialog.cpp:470
QIcon buttonIcon(ButtonCode id) const
Definition KoDialog.cpp:681
void showButton(ButtonCode id, bool state)
Definition KoDialog.cpp:630
QPushButton * button(ButtonCode id) const
Definition KoDialog.cpp:591
void tryClicked()
void enableLinkedHelp(bool state)
Definition KoDialog.cpp:885
void enableButtonOk(bool state)
Definition KoDialog.cpp:615
ButtonCode defaultButton() const
Definition KoDialog.cpp:340
static void resizeLayout(QWidget *widget, int margin, int spacing)
Definition KoDialog.cpp:523
void aboutToShowDetails()
void resetClicked()
void delayedDestruct()
Definition KoDialog.cpp:811
@ ModifiedCaption
Definition KoDialog.h:401
@ AppNameCaption
Definition KoDialog.h:400
@ HIGCompliantCaption
Definition KoDialog.h:402
void incrementInitialSize(const QSize &size)
Definition KoDialog.cpp:585
void setButtonToolTip(ButtonCode id, const QString &text)
Definition KoDialog.cpp:691
void yesClicked()
void closeEvent(QCloseEvent *e) override
Definition KoDialog.cpp:943
void setEscapeButton(ButtonCode id)
Definition KoDialog.cpp:297
QString helpLinkText() const
Definition KoDialog.cpp:928
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
void setButtonText(ButtonCode id, const QString &text)
Definition KoDialog.cpp:648
void setButtonWhatsThis(ButtonCode id, const QString &text)
Definition KoDialog.cpp:713
QString buttonWhatsThis(ButtonCode id) const
Definition KoDialog.cpp:725
void defaultClicked()
void setDetailsWidgetVisible(bool visible)
Definition KoDialog.cpp:769
QSize sizeHint() const override
Definition KoDialog.cpp:377
static int spacingHint()
Definition KoDialog.cpp:460
bool isDetailsWidgetVisible() const
Definition KoDialog.cpp:764
void helpClicked()
virtual void setCaption(const QString &caption)
Definition KoDialog.cpp:498
void buttonClicked(KoDialog::ButtonCode button)
void user2Clicked()
void setButtons(ButtonCodes buttonMask)
Definition KoDialog.cpp:195
void hideEvent(QHideEvent *) override
Definition KoDialog.cpp:934
bool isButtonEnabled(ButtonCode id) const
Definition KoDialog.cpp:605
void setButtonIcon(ButtonCode id, const QIcon &icon)
Definition KoDialog.cpp:673
void setInitialSize(const QSize &size)
Definition KoDialog.cpp:579
QString buttonText(ButtonCode id) const
Definition KoDialog.cpp:663
void showButtonSeparator(bool state)
Definition KoDialog.cpp:558
void setDetailsWidget(QWidget *detailsWidget)
Definition KoDialog.cpp:743
void enableButtonApply(bool state)
Definition KoDialog.cpp:620
virtual void setPlainCaption(const QString &caption)
Definition KoDialog.cpp:516
void noClicked()
QString buttonToolTip(ButtonCode id) const
Definition KoDialog.cpp:703
void cancelClicked()
void setDefaultButton(ButtonCode id)
Definition KoDialog.cpp:302
void hidden()
~KoDialog() override
Definition KoDialog.cpp:190
QSize minimumSizeHint() const override
Definition KoDialog.cpp:391
KoDialogPrivate *const d_ptr
Definition KoDialog.h:787
@ User2
Show User defined button 2.
Definition KoDialog.h:137
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
Definition KoDialog.h:127
@ No
Show No button. (this button closes the dialog and sets the result to KoDialog::No)
Definition KoDialog.h:132
@ Reset
Show Reset button.
Definition KoDialog.h:134
@ Apply
Show Apply button.
Definition KoDialog.h:128
@ User3
Show User defined button 3.
Definition KoDialog.h:138
@ Yes
Show Yes button. (this button closes the dialog and sets the result to KoDialog::Yes)
Definition KoDialog.h:133
@ Default
Show Default button.
Definition KoDialog.h:126
@ NoDefault
Used when specifying a default button; indicates that no button should be marked by default.
Definition KoDialog.h:139
@ User1
Show User defined button 1.
Definition KoDialog.h:136
@ Details
Show Details button. (this button will show the detail widget set with setDetailsWidget)
Definition KoDialog.h:135
@ Cancel
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected)
Definition KoDialog.h:130
@ Help
Show Help button. (this button will run the help set with setHelp)
Definition KoDialog.h:125
@ Try
Show Try button.
Definition KoDialog.h:129
@ Close
Show Close-button. (this button closes the dialog)
Definition KoDialog.h:131
KoDialog(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
Definition KoDialog.cpp:176
void closeClicked()
void keyPressEvent(QKeyEvent *) override
Definition KoDialog.cpp:404
void setHelpLinkText(const QString &text)
Definition KoDialog.cpp:919
void okClicked()
void showEvent(QShowEvent *e) override
Definition KoDialog.cpp:447
QString button(const QWheelEvent &ev)
KRITAWIDGETUTILS_EXPORT void invokeHelp(const QString &anchor=QString(), const QString &appname=QString())