Krita Source Code Documentation
Loading...
Searching...
No Matches
kmainwindow.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 Copyright
3 (C) 2000 Reginald Stadlbauer (reggie@kde.org)
4 (C) 1997 Stephan Kulow (coolo@kde.org)
5 (C) 1997-2000 Sven Radej (radej@kde.org)
6 (C) 1997-2000 Matthias Ettrich (ettrich@kde.org)
7 (C) 1999 Chris Schlaeger (cs@kde.org)
8 (C) 2002 Joseph Wenninger (jowenn@kde.org)
9 (C) 2005-2006 Hamish Rodda (rodda@kde.org)
10 (C) 2000-2008 David Faure (faure@kde.org)
11
12 SPDX-License-Identifier: LGPL-2.0-only
13*/
14
15#include "kmainwindow.h"
16#include "config-xmlgui.h"
17#include "kmainwindow_p.h"
18#ifdef HAVE_DBUS
19#include "kmainwindowiface_p.h"
20#endif
21#include "ktoolbarhandler_p.h"
22#include "khelpmenu.h"
23#include "ktoolbar.h"
24
25#include <QApplication>
26#include <QList>
27#include <QObject>
28#include <QTimer>
29#include <QCloseEvent>
30#include <QScreen>
31#include <QDockWidget>
32#include <QLayout>
33#include <QMenuBar>
34#include <QSessionManager>
35#include <QStatusBar>
36#include <QStyle>
37#include <QWidget>
38#include <QWindow>
39#ifdef HAVE_DBUS
40#include <QDBusConnection>
41#endif
42#include <ktoggleaction.h>
43#include <kaboutdata.h>
44#include <kconfig.h>
45#include <ksharedconfig.h>
46#include <klocalizedstring.h>
47#include <kconfiggroup.h>
48#include <kwindowconfig.h>
49#include <kconfiggui.h>
50
51//#include <ctype.h>
52
53static const char WINDOW_PROPERTIES[]="WindowProperties";
54
55static QMenuBar *internalMenuBar(KisKMainWindow *mw)
56{
57 return mw->findChild<QMenuBar *>(QString(), Qt::FindDirectChildrenOnly);
58}
59
60static QStatusBar *internalStatusBar(KisKMainWindow *mw)
61{
62 return mw->findChild<QStatusBar *>(QString(), Qt::FindDirectChildrenOnly);
63}
64
73class DockResizeListener : public QObject
74{
75public:
77 ~DockResizeListener() override;
78 bool eventFilter(QObject *watched, QEvent *event) override;
79
80private:
82};
83
85 QObject(win),
86 m_win(win)
87{
88}
89
93
94bool DockResizeListener::eventFilter(QObject *watched, QEvent *event)
95{
96 switch (event->type()) {
97 case QEvent::Resize:
98 case QEvent::Move:
99 case QEvent::Hide:
101 break;
102
103 default:
104 break;
105 }
106
107 return QObject::eventFilter(watched, event);
108}
109
111{
112 connect(qApp, SIGNAL(saveStateRequest(QSessionManager&)),
113 this, SLOT(saveState(QSessionManager&)));
114}
115
119
120bool KMWSessionManager::saveState(QSessionManager &)
121{
122#if 0
123 KConfigGui::setSessionConfig(sm.sessionId(), sm.sessionKey());
124
125 KConfig *config = KConfigGui::sessionConfig();
126 if (KisKMainWindow::memberList().count()) {
127 // According to Jochen Wilhelmy <digisnap@cs.tu-berlin.de>, this
128 // hook is useful for better document orientation
129 KisKMainWindow::memberList().first()->saveGlobalProperties(config);
130 }
131
132 int n = 0;
134 n++;
135 mw->savePropertiesInternal(config, n);
136 }
137
138 KConfigGroup group(config, "Number");
139 group.writeEntry("NumberOfWindows", n);
140
141 // store new status to disk
142 config->sync();
143
144 // generate discard command for new file
145 QString localFilePath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + config->name();
146 if (QFile::exists(localFilePath)) {
147 QStringList discard;
148 discard << QLatin1String("rm");
149 discard << localFilePath;
150 sm.setDiscardCommand(discard);
151 }
152#endif
153 return true;
154}
155
158
159KisKMainWindow::KisKMainWindow(QWidget *parent, Qt::WindowFlags f)
160 : QMainWindow(parent, f), k_ptr(new KisKMainWindowPrivate)
161{
162 k_ptr->init(this);
163}
164
165KisKMainWindow::KisKMainWindow(KisKMainWindowPrivate &dd, QWidget *parent, Qt::WindowFlags f)
166 : QMainWindow(parent, f), k_ptr(&dd)
167{
168 k_ptr->init(this);
169}
170
172{
173 q = _q;
174
175 q->setAnimated(q->style()->styleHint(QStyle::SH_Widget_Animate, 0, q));
176
177 q->setAttribute(Qt::WA_DeleteOnClose);
178
179 helpMenu = 0;
180
181 //actionCollection()->setWidget( this );
182#ifdef HAVE_GLOBALACCEL
183 QObject::connect(KGlobalSettings::self(), SIGNAL(settingsChanged(int)),
184 q, SLOT(_k_slotSettingsChanged(int)));
185#endif
186
187 // force KMWSessionManager creation
188 ksm();
189
190 sMemberList()->append(q);
191
192 settingsDirty = false;
193 autoSaveSettings = false;
194 autoSaveWindowSize = true; // for compatibility
195 //d->kaccel = actionCollection()->kaccel();
196 settingsTimer = 0;
197 sizeTimer = 0;
198
200 letDirtySettings = true;
201
202 sizeApplied = false;
203}
204
205static bool endsWithHashNumber(const QString &s)
206{
207 for (int i = s.length() - 1;
208 i > 0;
209 --i) {
210 if (s[ i ] == QLatin1Char('#') && i != s.length() - 1) {
211 return true; // ok
212 }
213 if (!s[ i ].isDigit()) {
214 break;
215 }
216 }
217 return false;
218}
219#ifdef HAVE_DBUS
220static inline bool isValidDBusObjectPathCharacter(const QChar &c)
221{
222 ushort u = c.unicode();
223 return (u >= QLatin1Char('a') && u <= QLatin1Char('z'))
224 || (u >= QLatin1Char('A') && u <= QLatin1Char('Z'))
225 || (u >= QLatin1Char('0') && u <= QLatin1Char('9'))
226 || (u == QLatin1Char('_')) || (u == QLatin1Char('/'));
227}
228#endif
230{
231 // Set a unique object name. Required by session management, window management, and for the dbus interface.
232 QString objname;
233 QString s;
234 int unusedNumber = 1;
235 const QString name = q->objectName();
236 bool startNumberingImmediately = true;
237 bool tryReuse = false;
238 if (name.isEmpty()) {
239 // no name given
240 objname = QStringLiteral("MainWindow#");
241 } else if (name.endsWith(QLatin1Char('#'))) {
242 // trailing # - always add a number - KWin uses this for better grouping
243 objname = name;
244 } else if (endsWithHashNumber(name)) {
245 // trailing # with a number - like above, try to use the given number first
246 objname = name;
247 tryReuse = true;
248 startNumberingImmediately = false;
249 } else {
250 objname = name;
251 startNumberingImmediately = false;
252 }
253
254 s = objname;
255 if (startNumberingImmediately) {
256 s += QLatin1Char('1');
257 }
258
259 for (;;) {
260 const QList<QWidget *> list = qApp->topLevelWidgets();
261 bool found = false;
262 foreach (QWidget *w, list) {
263 if (w != q && w->objectName() == s) {
264 found = true;
265 break;
266 }
267 }
268 if (!found) {
269 break;
270 }
271 if (tryReuse) {
272 objname = name.left(name.length() - 1); // lose the hash
273 unusedNumber = 0; // start from 1 below
274 tryReuse = false;
275 }
276 s.setNum(++unusedNumber);
277 s = objname + s;
278 }
279 q->setObjectName(s);
280 q->winId(); // workaround for setWindowRole() crashing, and set also window role, just in case TT
281 q->setWindowRole(s); // will keep insisting that object name suddenly should not be used for window role
282
283#ifdef HAVE_DBUS
284 dbusName = QLatin1Char('/') + QCoreApplication::applicationName() + QLatin1Char('/');
285 dbusName += q->objectName().replace(QLatin1Char('/'), QLatin1Char('_'));
286 // Clean up for dbus usage: any non-alphanumeric char should be turned into '_'
287 const int len = dbusName.length();
288 for (int i = 0; i < len; ++i) {
289 if (!isValidDBusObjectPathCharacter(dbusName[i])) {
290 dbusName[i] = QLatin1Char('_');
291 }
292 }
293
294 QDBusConnection::sessionBus().registerObject(dbusName, q, QDBusConnection::ExportScriptableSlots |
295 QDBusConnection::ExportScriptableProperties |
296 QDBusConnection::ExportNonScriptableSlots |
297 QDBusConnection::ExportNonScriptableProperties |
298 QDBusConnection::ExportAdaptors);
299#endif
300}
301
303{
304 if (!letDirtySettings) {
305 return;
306 }
307
308 settingsDirty = true;
309 if (autoSaveSettings) {
310 if (callCompression == CompressCalls) {
311 if (!settingsTimer) {
312 settingsTimer = new QTimer(q);
313 settingsTimer->setInterval(500);
314 settingsTimer->setSingleShot(true);
315 QObject::connect(settingsTimer, SIGNAL(timeout()), q, SLOT(saveAutoSaveSettings()));
316 }
317 settingsTimer->start();
318 } else {
320 }
321 }
322}
323
325{
326 if (autoSaveWindowSize) {
327 if (!sizeTimer) {
328 sizeTimer = new QTimer(q);
329 sizeTimer->setInterval(500);
330 sizeTimer->setSingleShot(true);
331 QObject::connect(sizeTimer, SIGNAL(timeout()), q, SLOT(_k_slotSaveAutoSaveSize()));
332 }
333 sizeTimer->start();
334 }
335}
336
338{
339 sMemberList()->removeAll(this);
340 delete static_cast<QObject *>(k_ptr->dockResizeListener); //so we don't get anymore events after k_ptr is destroyed
341 delete k_ptr;
342}
343
345{
346 if (!qApp->isSessionRestored()) {
347 return false;
348 }
349 KConfig *config = KConfigGui::sessionConfig();
350 if (!config) {
351 return false;
352 }
353
354 KConfigGroup group(config, "Number");
355 const int n = group.readEntry("NumberOfWindows", 1);
356 return number >= 1 && number <= n;
357}
358
360{
361 return QString();
362#if 0
363 if (!qApp->isSessionRestored()) {
364 return QString();
365 }
366 KConfig *config = KConfigGui::sessionConfig();
367 if (!config) {
368 return QString();
369 }
370
371 KConfigGroup group(config, QByteArray(WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
372 if (!group.hasKey("ClassName")) {
373 return QString();
374 } else {
375 return group.readEntry("ClassName");
376 }
377#endif
378}
379
380bool KisKMainWindow::restore(int , bool )
381{
382#if 0
383 if (!canBeRestored(number)) {
384 return false;
385 }
386 KConfig *config = KConfigGui::sessionConfig();
387 if (readPropertiesInternal(config, number)) {
388 if (show) {
389 KisKMainWindow::show();
390 }
391 return false;
392 }
393#endif
394 return false;
395}
396
397
399{
401 if (!d->helpMenu) {
402 d->helpMenu = new KisKHelpMenu(this);
403 if (!d->helpMenu) {
404 return;
405 }
406 }
407 d->helpMenu->appHelpActivated();
408}
409
410void KisKMainWindow::closeEvent(QCloseEvent *e)
411{
413
414 // Save settings if auto-save is enabled, and settings have changed
415 if (d->settingsTimer && d->settingsTimer->isActive()) {
416 d->settingsTimer->stop();
418 }
419 if (d->sizeTimer && d->sizeTimer->isActive()) {
420 d->sizeTimer->stop();
421 d->_k_slotSaveAutoSaveSize();
422 }
423
424 if (queryClose()) {
425 // widgets will start destroying themselves at this point and we don't
426 // want to save state anymore after this as it might be incorrect
427 d->autoSaveSettings = false;
428 d->letDirtySettings = false;
429 e->accept();
430 } else {
431 e->ignore(); //if the window should not be closed, don't close it
432 }
433}
434
436{
437 return true;
438}
439
441{
442}
443
445{
446}
447
448void KisKMainWindow::savePropertiesInternal(KConfig *config, int number)
449{
451 const bool oldASWS = d->autoSaveWindowSize;
452 d->autoSaveWindowSize = true; // make saveMainWindowSettings save the window size
453
454 KConfigGroup cg(config, QByteArray(WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
455
456 // store objectName, className, Width and Height for later restoring
457 // (Only useful for session management)
458 cg.writeEntry("ObjectName", objectName());
459 cg.writeEntry("ClassName", metaObject()->className());
460
461 saveMainWindowSettings(cg); // Menubar, statusbar and Toolbar settings.
462
463 cg = KConfigGroup(config, QByteArray::number(number).constData());
464 saveProperties(cg);
465
466 d->autoSaveWindowSize = oldASWS;
467}
468
470{
471 if (!windowsLayoutSavingAllowed()) return;
472
474 //qDebug(200) << "KisKMainWindow::saveMainWindowSettings " << cg.name();
475
476 // Called by session management - or if we want to save the window size anyway
477 if (d->autoSaveWindowSize) {
478 KWindowConfig::saveWindowSize(windowHandle(), cg);
479 }
480
481 // One day will need to save the version number, but for now, assume 0
482 // Utilize the QMainWindow::saveState() functionality.
483 const QByteArray state = saveState();
484 cg.writeEntry("State", state.toBase64());
485
486 QStatusBar *sb = internalStatusBar(this);
487 if (sb) {
488 if (!cg.hasDefault("StatusBar") && !sb->isHidden()) {
489 cg.revertToDefault("StatusBar");
490 } else {
491 cg.writeEntry("StatusBar", sb->isHidden() ? "Disabled" : "Enabled");
492 }
493 }
494
495 QMenuBar *mb = internalMenuBar(this);
496 if (mb && !mb->isNativeMenuBar()) {
497 if (!cg.hasDefault("MenuBar") && !mb->isHidden()) {
498 cg.revertToDefault("MenuBar");
499 } else {
500 // with native Menu Bar we don't have an easy way of knowing if it
501 // is Enabled or not, so we assume it is to prevent any mishap if
502 // the flag is toggled
503 if (!QCoreApplication::testAttribute(Qt::AA_DontUseNativeMenuBar)) {
504 cg.writeEntry("MenuBar", "Enabled");
505 }
506 cg.writeEntry("MenuBar", mb->isHidden() ? "Disabled" : "Enabled");
507 }
508 }
509
510 {
511 if (!cg.hasDefault("ToolBarsMovable") && KisToolBar::toolBarsLocked()) {
512 cg.revertToDefault("ToolBarsMovable");
513 } else {
514 cg.writeEntry("ToolBarsMovable", KisToolBar::toolBarsLocked() ? "Disabled" : "Enabled");
515 }
516 }
517
518 int n = 1; // Toolbar counter. toolbars are counted from 1,
519 foreach (KisToolBar *toolbar, toolBars()) {
520 QByteArray groupName("Toolbar");
521 // Give a number to the toolbar, but prefer a name if there is one,
522 // because there's no real guarantee on the ordering of toolbars
523 groupName += (toolbar->objectName().isEmpty() ? QByteArray::number(n) : QByteArray(" ").append(toolbar->objectName().toUtf8()));
524
525 KConfigGroup toolbarGroup(&cg, groupName.constData());
526 toolbar->saveSettings(toolbarGroup);
527 n++;
528 }
529}
530
531bool KisKMainWindow::readPropertiesInternal(KConfig *config, int number)
532{
534
535 const bool oldLetDirtySettings = d->letDirtySettings;
536 d->letDirtySettings = false;
537
538 if (number == 1) {
539 readGlobalProperties(config);
540 }
541
542 // in order they are in toolbar list
543 KConfigGroup cg(config, QByteArray(WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
544
545 // restore the object name (window role)
546 if (cg.hasKey("ObjectName")) {
547 setObjectName(cg.readEntry("ObjectName"));
548 }
549
550 d->sizeApplied = false; // since we are changing config file, reload the size of the window
551 // if necessary. Do it before the call to applyMainWindowSettings.
552 applyMainWindowSettings(cg); // Menubar, statusbar and toolbar settings.
553
554 KConfigGroup grp(config, QByteArray::number(number).constData());
555 readProperties(grp);
556
557 d->letDirtySettings = oldLetDirtySettings;
558
559 return true;
560}
561
562void KisKMainWindow::applyMainWindowSettings(const KConfigGroup &cg)
563{
565 //qDebug(200) << "KisKMainWindow::applyMainWindowSettings " << cg.name();
566
567 QWidget *focusedWidget = QApplication::focusWidget();
568
569 const bool oldLetDirtySettings = d->letDirtySettings;
570 d->letDirtySettings = false;
571
572 if (!d->sizeApplied) {
573 winId(); // ensure there's a window created
574 KWindowConfig::restoreWindowSize(windowHandle(), cg);
575 // NOTICE: QWindow::setGeometry() does NOT impact the backing QWidget geometry even if the platform
576 // window was created -> QTBUG-40584. We therefore copy the size here.
577 // TODO: remove once this was resolved in QWidget QPA
578 resize(windowHandle()->size());
579 d->sizeApplied = true;
580 }
581
582 QStatusBar *sb = internalStatusBar(this);
583 if (sb) {
584 QString entry = cg.readEntry("StatusBar", "Enabled");
585 sb->setVisible( entry != QLatin1String("Disabled") );
586 }
587
588 QMenuBar *mb = internalMenuBar(this);
589 if (mb && !mb->isNativeMenuBar()) {
590 QString entry = cg.readEntry("MenuBar", "Enabled");
591#ifdef Q_OS_ANDROID
592 // HACK: Previously, since the native menubar was enabled, this made the
593 // value in Config = "Disabled". This makes the menubar not show up on
594 // devices.
595 entry = QLatin1String("Enabled");
596#endif
597 mb->setVisible( entry != QLatin1String("Disabled") );
598 }
599
600 {
601 QString entry = cg.readEntry("ToolBarsMovable", "Disabled");
602 KisToolBar::setToolBarsLocked(entry == QLatin1String("Disabled"));
603 }
604
605 int n = 1; // Toolbar counter. toolbars are counted from 1,
606 foreach (KisToolBar *toolbar, toolBars()) {
607 QByteArray groupName("Toolbar");
608 // Give a number to the toolbar, but prefer a name if there is one,
609 // because there's no real guarantee on the ordering of toolbars
610 groupName += (toolbar->objectName().isEmpty() ? QByteArray::number(n) : QByteArray(" ").append(toolbar->objectName().toUtf8()));
611
612 KConfigGroup toolbarGroup(&cg, groupName.constData());
613 toolbar->applySettings(toolbarGroup);
614 n++;
615 }
616
617 QByteArray state;
618 if (cg.hasKey("State")) {
619 state = cg.readEntry("State", state);
620 state = QByteArray::fromBase64(state);
621 // One day will need to load the version number, but for now, assume 0
622 restoreState(state);
623 }
624
625 if (focusedWidget) {
626 focusedWidget->setFocus();
627 }
628
629 d->settingsDirty = false;
630 d->letDirtySettings = oldLetDirtySettings;
631}
632
634{
636 d->setSettingsDirty();
637}
638
640{
641 K_D(const KisKMainWindow);
642 return d->settingsDirty;
643}
644
646{
647 return true;
648}
649
650void KisKMainWindow::setAutoSaveSettings(const QString &groupName, bool saveWindowSize)
651{
652 setAutoSaveSettings(KConfigGroup(KSharedConfig::openConfig(), groupName), saveWindowSize);
653}
654
655void KisKMainWindow::setAutoSaveSettings(const KConfigGroup &group,
656 bool saveWindowSize)
657{
659 d->autoSaveSettings = true;
660 d->autoSaveGroup = group;
661 d->autoSaveWindowSize = saveWindowSize;
662
663 if (!saveWindowSize && d->sizeTimer) {
664 d->sizeTimer->stop();
665 }
666
667 // Now read the previously saved settings
668 applyMainWindowSettings(d->autoSaveGroup);
669}
670
672{
674 d->autoSaveSettings = false;
675 if (d->settingsTimer) {
676 d->settingsTimer->stop();
677 }
678}
679
681{
682 K_D(const KisKMainWindow);
683 return d->autoSaveSettings;
684}
685
687{
688 K_D(const KisKMainWindow);
689 return d->autoSaveSettings ? d->autoSaveGroup.name() : QString();
690}
691
693{
694 K_D(const KisKMainWindow);
695 return d->autoSaveSettings ? d->autoSaveGroup : KConfigGroup();
696}
697
699{
701 Q_ASSERT(d->autoSaveSettings);
702 //qDebug(200) << "KisKMainWindow::saveAutoSaveSettings -> saving settings";
703 saveMainWindowSettings(d->autoSaveGroup);
704 d->autoSaveGroup.sync();
705 d->settingsDirty = false;
706}
707
708bool KisKMainWindow::event(QEvent *ev)
709{
711 switch (ev->type()) {
712#ifdef Q_OS_WIN
713 case QEvent::Move:
714#endif
715 case QEvent::Resize:
716 d->setSizeDirty();
717 break;
718 case QEvent::Polish:
719 d->polish(this);
720 break;
721 case QEvent::ChildPolished: {
722 QChildEvent *event = static_cast<QChildEvent *>(ev);
723 QDockWidget *dock = qobject_cast<QDockWidget *>(event->child());
724 KisToolBar *toolbar = qobject_cast<KisToolBar *>(event->child());
725 QMenuBar *menubar = qobject_cast<QMenuBar *>(event->child());
726 if (dock) {
727 connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
728 this, SLOT(setSettingsDirty()));
729 connect(dock, SIGNAL(visibilityChanged(bool)),
730 this, SLOT(setSettingsDirty()), Qt::QueuedConnection);
731 connect(dock, SIGNAL(topLevelChanged(bool)),
732 this, SLOT(setSettingsDirty()));
733
734 // there is no signal emitted if the size of the dock changes,
735 // hence install an event filter instead
736 dock->installEventFilter(k_ptr->dockResizeListener);
737 } else if (toolbar) {
738 // there is no signal emitted if the size of the toolbar changes,
739 // hence install an event filter instead
740 toolbar->installEventFilter(k_ptr->dockResizeListener);
741 } else if (menubar) {
742 // there is no signal emitted if the size of the menubar changes,
743 // hence install an event filter instead
744 menubar->installEventFilter(k_ptr->dockResizeListener);
745 }
746 }
747 break;
748 case QEvent::ChildRemoved: {
749 QChildEvent *event = static_cast<QChildEvent *>(ev);
750 QDockWidget *dock = qobject_cast<QDockWidget *>(event->child());
751 KisToolBar *toolbar = qobject_cast<KisToolBar *>(event->child());
752 QMenuBar *menubar = qobject_cast<QMenuBar *>(event->child());
753 if (dock) {
754 disconnect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
755 this, SLOT(setSettingsDirty()));
756 disconnect(dock, SIGNAL(visibilityChanged(bool)),
757 this, SLOT(setSettingsDirty()));
758 disconnect(dock, SIGNAL(topLevelChanged(bool)),
759 this, SLOT(setSettingsDirty()));
760 dock->removeEventFilter(k_ptr->dockResizeListener);
761 } else if (toolbar) {
762 toolbar->removeEventFilter(k_ptr->dockResizeListener);
763 } else if (menubar) {
764 menubar->removeEventFilter(k_ptr->dockResizeListener);
765 }
766 }
767 break;
768 default:
769 break;
770 }
771 return QMainWindow::event(ev);
772}
773
775{
776 return internalMenuBar(this);
777}
778
780{
781 Q_UNUSED(category);
782
783 // This slot will be called when the style KCM changes settings that need
784 // to be set on the already running applications.
785
786 // At this level (KisKMainWindow) the only thing we need to restore is the
787 // animations setting (whether the user wants builtin animations or not).
788
789 q->setAnimated(q->style()->styleHint(QStyle::SH_Widget_Animate, 0, q));
790}
791
793{
794 if (autoSaveGroup.isValid()) {
795 KWindowConfig::saveWindowSize(q->windowHandle(), autoSaveGroup);
796 }
797}
798
800{
801 QString childName = name;
802 if (childName.isEmpty()) {
803 childName = QStringLiteral("mainToolBar");
804 }
805
806 KisToolBar *tb = findChild<KisToolBar *>(childName);
807 if (tb) {
808 return tb;
809 }
810
811 KisToolBar *toolbar = new KisToolBar(childName, this); // non-XMLGUI toolbar
812 return toolbar;
813}
814
816{
818
819 foreach (QObject *child, children())
820 if (KisToolBar *toolBar = qobject_cast<KisToolBar *>(child)) {
821 ret.append(toolBar);
822 }
823
824 return ret;
825}
826
828{
829 return *sMemberList();
830}
831
833{
834 return k_func()->dbusName;
835}
836
837#include "moc_kmainwindow.cpp"
838
qreal u
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisKMainWindow * m_win
bool eventFilter(QObject *watched, QEvent *event) override
~DockResizeListener() override
DockResizeListener(KisKMainWindow *win)
~KMWSessionManager() override
bool saveState(QSessionManager &)
Standard KDE help menu with dialog boxes.
Definition khelpmenu.h:106
KisKHelpMenu * helpMenu
void polish(KisKMainWindow *q)
void init(KisKMainWindow *_q)
KisKMainWindow * q
void setSettingsDirty(CallCompression callCompression=CompressCalls)
QPointer< QObject > dockResizeListener
KConfigGroup autoSaveGroup
void _k_slotSettingsChanged(int category)
KDE top level main window
Definition kmainwindow.h:89
static const QString classNameOfToplevel(int number)
QString autoSaveGroup
Definition kmainwindow.h:96
~KisKMainWindow() override
Destructor.
QString dbusName() const
void setAutoSaveSettings(const QString &groupName=QLatin1String("MainWindow"), bool saveWindowSize=true)
KisKMainWindow(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
void resetAutoSaveSettings()
virtual void readGlobalProperties(KConfig *sessionConfig)
void saveAutoSaveSettings()
KConfigGroup autoSaveConfigGroup() const
static bool canBeRestored(int number)
KisKMainWindowPrivate *const k_ptr
virtual bool queryClose()
bool settingsDirty() const
void saveMainWindowSettings(KConfigGroup &config)
virtual void readProperties(const KConfigGroup &)
KisToolBar * toolBar(const QString &name=QString())
virtual bool windowsLayoutSavingAllowed() const
static QList< KisKMainWindow * > memberList()
void closeEvent(QCloseEvent *) override
void setSettingsDirty()
virtual void saveGlobalProperties(KConfig *sessionConfig)
bool readPropertiesInternal(KConfig *, int)
void appHelpActivated(void)
virtual void saveProperties(KConfigGroup &)
virtual void applyMainWindowSettings(const KConfigGroup &config)
bool autoSaveSettings
Definition kmainwindow.h:95
bool restore(int number, bool show=true)
bool event(QEvent *event) override
QList< KisToolBar * > toolBars() const
void savePropertiesInternal(KConfig *, int)
Floatable toolbar with auto resize.
Definition ktoolbar.h:47
void applySettings(const KConfigGroup &cg)
static bool toolBarsLocked()
static void setToolBarsLocked(bool locked)
void saveSettings(KConfigGroup &cg)
Definition ktoolbar.cpp:820
static QStatusBar * internalStatusBar(KisKMainWindow *mw)
static const char WINDOW_PROPERTIES[]
static bool endsWithHashNumber(const QString &s)
static QMenuBar * internalMenuBar(KisKMainWindow *mw)
#define K_D(Class)