14#include <QApplication>
15#include <QGuiApplication>
16#include <QDialogButtonBox>
30#include <klocalizedstring.h>
32#include <kseparator.h>
33#include <kstandardguiitem.h>
36#include <kwindowconfig.h>
42 QMetaObject::invokeMethod(q,
"queuedLayoutUpdate", Qt::QueuedConnection);
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";
96 focusWidget->setFocus();
104 QDialogButtonBox::ButtonRole role = QDialogButtonBox::InvalidRole;
108 role = QDialogButtonBox::HelpRole;
112 role = QDialogButtonBox::ResetRole;
115 role = QDialogButtonBox::AcceptRole;
118 role = QDialogButtonBox::ApplyRole;
122 role = QDialogButtonBox::YesRole;
126 role = QDialogButtonBox::RejectRole;
129 role = QDialogButtonBox::NoRole;
134 role = QDialogButtonBox::ActionRole;
137 role = QDialogButtonBox::InvalidRole;
141 if (role == QDialogButtonBox::InvalidRole) {
145 QPushButton *
button =
new QPushButton;
146 KGuiItem::assign(
button, item);
151 QObject::connect(
button, &QPushButton::clicked, q, [=] { q->slotButtonClicked(key); });
177 : QDialog(parent ? parent : qApp->activeWindow(), flags)
184 : QDialog(parent ? parent : qApp->activeWindow(), flags)
199 d->mButtonList.clear();
201 delete d->mButtonBox;
205 if (buttonMask &
Cancel) {
206 buttonMask &= ~Close;
209 if (buttonMask &
Apply) {
214 buttonMask &= ~Default;
217 if (buttonMask ==
None) {
223 d->mButtonBox =
new QDialogButtonBox(
this);
225 if (buttonMask &
Help) {
226 d->appendButton(
Help, KStandardGuiItem::help());
229 d->appendButton(
Default, KStandardGuiItem::defaults());
231 if (buttonMask &
Reset) {
232 d->appendButton(
Reset, KStandardGuiItem::reset());
234 if (buttonMask &
User3) {
235 d->appendButton(
User3, KGuiItem());
237 if (buttonMask &
User2) {
238 d->appendButton(
User2, KGuiItem());
240 if (buttonMask &
User1) {
241 d->appendButton(
User1, KGuiItem());
243 if (buttonMask &
Ok) {
244 d->appendButton(
Ok, KStandardGuiItem::ok());
246 if (buttonMask &
Apply) {
247 d->appendButton(
Apply, KStandardGuiItem::apply());
249 if (buttonMask &
Try) {
250 d->appendButton(
Try, KGuiItem(i18n(
"&Try")));
252 if (buttonMask &
Cancel) {
253 d->appendButton(
Cancel, KStandardGuiItem::cancel());
255 if (buttonMask &
Close) {
256 d->appendButton(
Close, KStandardGuiItem::close());
258 if (buttonMask &
Yes) {
259 d->appendButton(
Yes, KStandardGuiItem::apply());
261 if (buttonMask &
No) {
262 d->appendButton(
No, KStandardGuiItem::cancel());
265 d->appendButton(
Details, KGuiItem(QString(),
"help-about"));
275 if (d->mButtonOrientation != orientation) {
276 d->mButtonOrientation = orientation;
278 if (d->mActionSeparator) {
279 d->mActionSeparator->setOrientation(d->mButtonOrientation);
282 if (d->mButtonOrientation == Qt::Vertical) {
290 d_func()->mEscapeButton = id;
297 if (newDefaultButton ==
None) {
303 bool oldDefaultHadFocus =
false;
306 QPushButton *old =
button(oldDefault);
308 oldDefaultHadFocus = (focusWidget() == old);
309 old->setDefault(
false);
314 QPushButton *b =
button(newDefaultButton);
317 if (focusWidget() == 0 || oldDefaultHadFocus) {
327 d->mDefaultButton = newDefaultButton;
334 QHashIterator<int, QPushButton *> it(d->mButtonList);
335 while (it.hasNext()) {
337 if (it.value()->isDefault()) {
342 return d->mDefaultButton;
348 if (d->mMainWidget == widget) {
351 d->mMainWidget = widget;
352 if (d->mMainWidget && d->mMainWidget->layout()) {
354 d->mMainWidget->layout()->setContentsMargins(0, 0, 0, 0);
362 if (!d->mMainWidget) {
365 return d->mMainWidget;
372 if (!d->mMinSize.isEmpty()) {
378 return QDialog::sizeHint() + d->mIncSize;
389 return QDialog::minimumSizeHint() + d->mIncSize;
398 if (event->modifiers() == 0) {
399 if (event->key() == Qt::Key_F1) {
409 if (event->key() == Qt::Key_Escape) {
419 }
else if (event->key() == Qt::Key_F1 && event->modifiers() == Qt::ShiftModifier) {
420 QWhatsThis::enterWhatsThisMode();
423 }
else if (event->modifiers() == Qt::ControlModifier &&
424 (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)) {
435 QDialog::keyPressEvent(event);
440 QDialog::showEvent(e);
441 QTimer::singleShot(5, Qt::CoarseTimer, [&]() {
442 adjustPosition(parentWidget());
448 return QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
453 return QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
458 return QFontMetricsF(QApplication::font()).lineSpacing();
466 QString caption = qApp->applicationDisplayName();
467 QString captionString = userCaption.isEmpty() ? caption : userCaption;
471 captionString += QString::fromUtf8(
" [") + i18n(
"modified") + QString::fromUtf8(
"]");
474 if (!userCaption.isEmpty()) {
478 !caption.isEmpty() &&
479 !userCaption.endsWith(caption)) {
482 captionString += i18nc(
"Document/application separator in titlebar",
" – ") + caption;
486 return captionString;
509 if (QWidget *win = window()) {
510 win->setWindowTitle(caption);
516 if (widget->layout()) {
520 if (widget->children().count() > 0) {
522 foreach (QObject *
object, list) {
523 if (object->isWidgetType()) {
535 while ((child = layout->itemAt(pos))) {
536 if (child->layout()) {
543 if (layout->layout()) {
544 layout->layout()->setContentsMargins(margin, margin, margin, margin);
545 layout->layout()->setSpacing(spacing);
552 if ((d->mActionSeparator != 0) == state) {
556 if (d->mActionSeparator) {
560 d->mActionSeparator =
new KSeparator(
this);
561 d->mActionSeparator->setOrientation(d->mButtonOrientation);
563 delete d->mActionSeparator;
564 d->mActionSeparator = 0;
572 d_func()->mMinSize = size;
578 d_func()->mIncSize = size;
585 return d->mButtonList.value(
id, 0);
592 button->setEnabled(state);
600 return button->isEnabled();
636 KGuiItem::assign(
button, item);
642 if (!d->mSettingDetails && (
id ==
Details)) {
643 d->mDetailsButtonText = text;
686 if (text.isEmpty()) {
687 button->setToolTip(QString());
708 if (text.isEmpty()) {
709 button->setWhatsThis(QString());
711 button->setWhatsThis(text);
720 return button->whatsThis();
737 if (d->mDetailsWidget == detailsWidget) {
740 delete d->mDetailsWidget;
741 d->mDetailsWidget = detailsWidget;
743 if (d->mDetailsWidget->parentWidget() !=
this) {
744 d->mDetailsWidget->setParent(
this);
747 d->mDetailsWidget->hide();
750 if (!d->mSettingDetails) {
757 return d_func()->mDetailsVisible;
763 if (d->mDetailsButtonText.isEmpty()) {
764 d->mDetailsButtonText = i18n(
"&Details");
767 d->mSettingDetails =
true;
768 d->mDetailsVisible = visible;
769 if (d->mDetailsVisible) {
772 if (d->mDetailsWidget) {
774 layout()->setEnabled(
false);
777 d->mDetailsWidget->show();
782 layout()->activate();
783 layout()->setEnabled(
true);
788 if (d->mDetailsWidget) {
789 d->mDetailsWidget->hide();
793 layout()->activate();
799 d->mSettingDetails =
false;
854 if (!d->mAnchor.isEmpty() || !d->mHelpApp.isEmpty()) {
870 if (d->mDeferredDelete) {
871 d->mDeferredDelete =
false;
879 if ((d->mUrlHelp != 0) == state) {
887 d->mUrlHelp =
new KUrlLabel(
this);
889 d->mUrlHelp->setFloatEnabled(
true);
890 d->mUrlHelp->setUnderline(
true);
891 d->mUrlHelp->setMinimumHeight(fontMetrics().height() +
marginHint());
892 connect(d->mUrlHelp, SIGNAL(leftClickedUrl()), SLOT(helpLinkClicked()));
907 d->mHelpApp = appname;
913 d->mHelpLinkText = text;
922 return (d->mHelpLinkText.isEmpty() ? i18n(
"Get help...") : d->mHelpLinkText);
929 if (!event->spontaneous()) {
938 if (
button && !isHidden()) {
941 if (testAttribute(Qt::WA_DeleteOnClose)) {
943 d->mDeferredDelete =
true;
944 setAttribute(Qt::WA_DeleteOnClose,
false);
947 QDialog::closeEvent(event);
951#include "moc_KoDialog.cpp"
KSeparator * mActionSeparator
KoDialog::ButtonCode mDefaultButton
QHash< int, QPushButton * > mButtonList
QPointer< QWidget > mMainWidget
void appendButton(KoDialog::ButtonCode code, const KGuiItem &item)
Qt::Orientation mButtonOrientation
QDialogButtonBox * mButtonBox
void queuedLayoutUpdate()
A dialog base class with standard buttons and predefined layouts.
void enableButtonCancel(bool state)
static int groupSpacingHint()
void setButtonGuiItem(ButtonCode id, const KGuiItem &item)
void enableButton(ButtonCode id, bool state)
void setButtonFocus(ButtonCode id)
void setButtonsOrientation(Qt::Orientation orientation)
void setHelp(const QString &anchor, const QString &appname=QString())
virtual void slotButtonClicked(int button)
static QString makeStandardCaption(const QString &userCaption, QWidget *window=0, CaptionFlags flags=HIGCompliantCaption)
QIcon buttonIcon(ButtonCode id) const
void showButton(ButtonCode id, bool state)
QPushButton * button(ButtonCode id) const
void enableLinkedHelp(bool state)
void enableButtonOk(bool state)
ButtonCode defaultButton() const
static void resizeLayout(QWidget *widget, int margin, int spacing)
void aboutToShowDetails()
void incrementInitialSize(const QSize &size)
void setButtonToolTip(ButtonCode id, const QString &text)
void closeEvent(QCloseEvent *e) override
void setEscapeButton(ButtonCode id)
QString helpLinkText() const
void setMainWidget(QWidget *widget)
void setButtonText(ButtonCode id, const QString &text)
void setButtonWhatsThis(ButtonCode id, const QString &text)
QString buttonWhatsThis(ButtonCode id) const
void setDetailsWidgetVisible(bool visible)
QSize sizeHint() const override
bool isDetailsWidgetVisible() const
virtual void setCaption(const QString &caption)
void buttonClicked(KoDialog::ButtonCode button)
void setButtons(ButtonCodes buttonMask)
void hideEvent(QHideEvent *) override
bool isButtonEnabled(ButtonCode id) const
void setButtonIcon(ButtonCode id, const QIcon &icon)
void setInitialSize(const QSize &size)
QString buttonText(ButtonCode id) const
void showButtonSeparator(bool state)
void setDetailsWidget(QWidget *detailsWidget)
void enableButtonApply(bool state)
virtual void setPlainCaption(const QString &caption)
QString buttonToolTip(ButtonCode id) const
void setDefaultButton(ButtonCode id)
QSize minimumSizeHint() const override
KoDialogPrivate *const d_ptr
@ User2
Show User defined button 2.
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
@ No
Show No button. (this button closes the dialog and sets the result to KoDialog::No)
@ Reset
Show Reset button.
@ Apply
Show Apply button.
@ User3
Show User defined button 3.
@ Yes
Show Yes button. (this button closes the dialog and sets the result to KoDialog::Yes)
@ Default
Show Default button.
@ NoDefault
Used when specifying a default button; indicates that no button should be marked by default.
@ User1
Show User defined button 1.
@ Details
Show Details button. (this button will show the detail widget set with setDetailsWidget)
@ Cancel
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected)
@ Help
Show Help button. (this button will run the help set with setHelp)
@ Close
Show Close-button. (this button closes the dialog)
KoDialog(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
void keyPressEvent(QKeyEvent *) override
void setHelpLinkText(const QString &text)
void showEvent(QShowEvent *e) override
QString button(const QWheelEvent &ev)
KRITAWIDGETUTILS_EXPORT void invokeHelp(const QString &anchor=QString(), const QString &appname=QString())