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#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
260 d->appendButton(
Yes, KStandardGuiItem::yes());
262 d->appendButton(
Yes, KStandardGuiItem::apply());
265 if (buttonMask &
No) {
266#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
267 d->appendButton(
No, KStandardGuiItem::no());
269 d->appendButton(
No, KStandardGuiItem::cancel());
274 d->appendButton(
Details, KGuiItem(QString(),
"help-about"));
284 if (d->mButtonOrientation != orientation) {
285 d->mButtonOrientation = orientation;
287 if (d->mActionSeparator) {
288 d->mActionSeparator->setOrientation(d->mButtonOrientation);
291 if (d->mButtonOrientation == Qt::Vertical) {
299 d_func()->mEscapeButton = id;
306 if (newDefaultButton ==
None) {
312 bool oldDefaultHadFocus =
false;
315 QPushButton *old =
button(oldDefault);
317 oldDefaultHadFocus = (focusWidget() == old);
318 old->setDefault(
false);
323 QPushButton *b =
button(newDefaultButton);
326 if (focusWidget() == 0 || oldDefaultHadFocus) {
336 d->mDefaultButton = newDefaultButton;
343 QHashIterator<int, QPushButton *> it(d->mButtonList);
344 while (it.hasNext()) {
346 if (it.value()->isDefault()) {
351 return d->mDefaultButton;
357 if (d->mMainWidget == widget) {
360 d->mMainWidget = widget;
361 if (d->mMainWidget && d->mMainWidget->layout()) {
363 d->mMainWidget->layout()->setContentsMargins(0, 0, 0, 0);
371 if (!d->mMainWidget) {
374 return d->mMainWidget;
381 if (!d->mMinSize.isEmpty()) {
387 return QDialog::sizeHint() + d->mIncSize;
398 return QDialog::minimumSizeHint() + d->mIncSize;
407 if (event->modifiers() == 0) {
408 if (event->key() == Qt::Key_F1) {
418 if (event->key() == Qt::Key_Escape) {
428 }
else if (event->key() == Qt::Key_F1 && event->modifiers() == Qt::ShiftModifier) {
429 QWhatsThis::enterWhatsThisMode();
432 }
else if (event->modifiers() == Qt::ControlModifier &&
433 (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)) {
444 QDialog::keyPressEvent(event);
449 QDialog::showEvent(e);
450 QTimer::singleShot(5, Qt::CoarseTimer, [&]() {
451 adjustPosition(parentWidget());
457 return QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
462 return QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
467 return QApplication::fontMetrics().lineSpacing();
475 QString caption = qApp->applicationDisplayName();
476 QString captionString = userCaption.isEmpty() ? caption : userCaption;
480 captionString += QString::fromUtf8(
" [") + i18n(
"modified") + QString::fromUtf8(
"]");
483 if (!userCaption.isEmpty()) {
487 !caption.isEmpty() &&
488 !userCaption.endsWith(caption)) {
491 captionString += i18nc(
"Document/application separator in titlebar",
" – ") + caption;
495 return captionString;
518 if (QWidget *win = window()) {
519 win->setWindowTitle(caption);
525 if (widget->layout()) {
529 if (widget->children().count() > 0) {
531 foreach (QObject *
object, list) {
532 if (object->isWidgetType()) {
544 while ((child = layout->itemAt(pos))) {
545 if (child->layout()) {
552 if (layout->layout()) {
553 layout->layout()->setContentsMargins(margin, margin, margin, margin);
554 layout->layout()->setSpacing(spacing);
561 if ((d->mActionSeparator != 0) == state) {
565 if (d->mActionSeparator) {
569 d->mActionSeparator =
new KSeparator(
this);
570 d->mActionSeparator->setOrientation(d->mButtonOrientation);
572 delete d->mActionSeparator;
573 d->mActionSeparator = 0;
581 d_func()->mMinSize = size;
587 d_func()->mIncSize = size;
594 return d->mButtonList.value(
id, 0);
601 button->setEnabled(state);
609 return button->isEnabled();
645 KGuiItem::assign(
button, item);
651 if (!d->mSettingDetails && (
id ==
Details)) {
652 d->mDetailsButtonText = text;
695 if (text.isEmpty()) {
696 button->setToolTip(QString());
717 if (text.isEmpty()) {
718 button->setWhatsThis(QString());
720 button->setWhatsThis(text);
729 return button->whatsThis();
746 if (d->mDetailsWidget == detailsWidget) {
749 delete d->mDetailsWidget;
750 d->mDetailsWidget = detailsWidget;
752 if (d->mDetailsWidget->parentWidget() !=
this) {
753 d->mDetailsWidget->setParent(
this);
756 d->mDetailsWidget->hide();
759 if (!d->mSettingDetails) {
766 return d_func()->mDetailsVisible;
772 if (d->mDetailsButtonText.isEmpty()) {
773 d->mDetailsButtonText = i18n(
"&Details");
776 d->mSettingDetails =
true;
777 d->mDetailsVisible = visible;
778 if (d->mDetailsVisible) {
781 if (d->mDetailsWidget) {
783 layout()->setEnabled(
false);
786 d->mDetailsWidget->show();
791 layout()->activate();
792 layout()->setEnabled(
true);
797 if (d->mDetailsWidget) {
798 d->mDetailsWidget->hide();
802 layout()->activate();
808 d->mSettingDetails =
false;
863 if (!d->mAnchor.isEmpty() || !d->mHelpApp.isEmpty()) {
879 if (d->mDeferredDelete) {
880 d->mDeferredDelete =
false;
888 if ((d->mUrlHelp != 0) == state) {
896 d->mUrlHelp =
new KUrlLabel(
this);
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()));
916 d->mHelpApp = appname;
922 d->mHelpLinkText = text;
931 return (d->mHelpLinkText.isEmpty() ? i18n(
"Get help...") : d->mHelpLinkText);
938 if (!event->spontaneous()) {
947 if (
button && !isHidden()) {
950 if (testAttribute(Qt::WA_DeleteOnClose)) {
952 d->mDeferredDelete =
true;
953 setAttribute(Qt::WA_DeleteOnClose,
false);
956 QDialog::closeEvent(event);
960#include "moc_KoDialog.cpp"
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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())