16#include "config-xmlgui.h"
25#include <QApplication>
34#include <QSessionManager>
40#include <QDBusConnection>
42#include <ktoggleaction.h>
43#include <kaboutdata.h>
45#include <ksharedconfig.h>
46#include <klocalizedstring.h>
47#include <kconfiggroup.h>
48#include <kwindowconfig.h>
49#include <kconfiggui.h>
57 return mw->findChild<QMenuBar *>(QString(), Qt::FindDirectChildrenOnly);
62 return mw->findChild<QStatusBar *>(QString(), Qt::FindDirectChildrenOnly);
78 bool eventFilter(QObject *watched, QEvent *event)
override;
96 switch (event->type()) {
107 return QObject::eventFilter(watched, event);
112 connect(qApp, SIGNAL(saveStateRequest(QSessionManager&)),
113 this, SLOT(
saveState(QSessionManager&)));
123 KConfigGui::setSessionConfig(sm.sessionId(), sm.sessionKey());
125 KConfig *config = KConfigGui::sessionConfig();
138 KConfigGroup group(config,
"Number");
139 group.writeEntry(
"NumberOfWindows", n);
145 QString localFilePath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char(
'/') + config->name();
146 if (QFile::exists(localFilePath)) {
148 discard << QLatin1String(
"rm");
149 discard << localFilePath;
150 sm.setDiscardCommand(discard);
166 : QMainWindow(parent, f), k_ptr(&dd)
175 q->setAnimated(
q->style()->styleHint(QStyle::SH_Widget_Animate, 0,
q));
177 q->setAttribute(Qt::WA_DeleteOnClose);
182#ifdef HAVE_GLOBALACCEL
183 QObject::connect(KGlobalSettings::self(), SIGNAL(settingsChanged(
int)),
190 sMemberList()->append(
q);
207 for (
int i = s.length() - 1;
210 if (s[ i ] == QLatin1Char(
'#') && i != s.length() - 1) {
213 if (!s[ i ].isDigit()) {
220static inline bool isValidDBusObjectPathCharacter(
const QChar &c)
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(
'/'));
234 int unusedNumber = 1;
235 const QString name =
q->objectName();
236 bool startNumberingImmediately =
true;
237 bool tryReuse =
false;
238 if (name.isEmpty()) {
240 objname = QStringLiteral(
"MainWindow#");
241 }
else if (name.endsWith(QLatin1Char(
'#'))) {
248 startNumberingImmediately =
false;
251 startNumberingImmediately =
false;
255 if (startNumberingImmediately) {
256 s += QLatin1Char(
'1');
262 foreach (QWidget *w, list) {
263 if (w !=
q && w->objectName() == s) {
272 objname = name.left(name.length() - 1);
276 s.setNum(++unusedNumber);
284 dbusName = QLatin1Char(
'/') + QCoreApplication::applicationName() + QLatin1Char(
'/');
285 dbusName +=
q->objectName().replace(QLatin1Char(
'/'), QLatin1Char(
'_'));
288 for (
int i = 0; i < len; ++i) {
289 if (!isValidDBusObjectPathCharacter(
dbusName[i])) {
294 QDBusConnection::sessionBus().registerObject(
dbusName,
q, QDBusConnection::ExportScriptableSlots |
295 QDBusConnection::ExportScriptableProperties |
296 QDBusConnection::ExportNonScriptableSlots |
297 QDBusConnection::ExportNonScriptableProperties |
298 QDBusConnection::ExportAdaptors);
315 QObject::connect(
settingsTimer, SIGNAL(timeout()),
q, SLOT(saveAutoSaveSettings()));
339 sMemberList()->removeAll(
this);
346 if (!qApp->isSessionRestored()) {
349 KConfig *config = KConfigGui::sessionConfig();
354 KConfigGroup group(config,
"Number");
355 const int n = group.readEntry(
"NumberOfWindows", 1);
356 return number >= 1 && number <= n;
363 if (!qApp->isSessionRestored()) {
366 KConfig *config = KConfigGui::sessionConfig();
371 KConfigGroup group(config, QByteArray(
WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
372 if (!group.hasKey(
"ClassName")) {
375 return group.readEntry(
"ClassName");
386 KConfig *config = KConfigGui::sessionConfig();
389 KisKMainWindow::show();
407 d->helpMenu->appHelpActivated();
415 if (d->settingsTimer && d->settingsTimer->isActive()) {
416 d->settingsTimer->stop();
419 if (d->sizeTimer && d->sizeTimer->isActive()) {
420 d->sizeTimer->stop();
421 d->_k_slotSaveAutoSaveSize();
427 d->autoSaveSettings =
false;
428 d->letDirtySettings =
false;
451 const bool oldASWS = d->autoSaveWindowSize;
452 d->autoSaveWindowSize =
true;
454 KConfigGroup cg(config, QByteArray(
WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
458 cg.writeEntry(
"ObjectName", objectName());
459 cg.writeEntry(
"ClassName", metaObject()->className());
463 cg = KConfigGroup(config, QByteArray::number(number).constData());
466 d->autoSaveWindowSize = oldASWS;
477 if (d->autoSaveWindowSize) {
478 KWindowConfig::saveWindowSize(windowHandle(), cg);
483 const QByteArray state = saveState();
484 cg.writeEntry(
"State", state.toBase64());
488 if (!cg.hasDefault(
"StatusBar") && !sb->isHidden()) {
489 cg.revertToDefault(
"StatusBar");
491 cg.writeEntry(
"StatusBar", sb->isHidden() ?
"Disabled" :
"Enabled");
496 if (mb && !mb->isNativeMenuBar()) {
497 if (!cg.hasDefault(
"MenuBar") && !mb->isHidden()) {
498 cg.revertToDefault(
"MenuBar");
503 if (!QCoreApplication::testAttribute(Qt::AA_DontUseNativeMenuBar)) {
504 cg.writeEntry(
"MenuBar",
"Enabled");
506 cg.writeEntry(
"MenuBar", mb->isHidden() ?
"Disabled" :
"Enabled");
512 cg.revertToDefault(
"ToolBarsMovable");
520 QByteArray groupName(
"Toolbar");
523 groupName += (toolbar->objectName().isEmpty() ? QByteArray::number(n) : QByteArray(
" ").append(toolbar->objectName().toUtf8()));
525 KConfigGroup toolbarGroup(&cg, groupName.constData());
535 const bool oldLetDirtySettings = d->letDirtySettings;
536 d->letDirtySettings =
false;
543 KConfigGroup cg(config, QByteArray(
WINDOW_PROPERTIES).append(QByteArray::number(number)).constData());
546 if (cg.hasKey(
"ObjectName")) {
547 setObjectName(cg.readEntry(
"ObjectName"));
550 d->sizeApplied =
false;
554 KConfigGroup grp(config, QByteArray::number(number).constData());
557 d->letDirtySettings = oldLetDirtySettings;
567 QWidget *focusedWidget = QApplication::focusWidget();
569 const bool oldLetDirtySettings = d->letDirtySettings;
570 d->letDirtySettings =
false;
572 if (!d->sizeApplied) {
574 KWindowConfig::restoreWindowSize(windowHandle(), cg);
578 resize(windowHandle()->size());
579 d->sizeApplied =
true;
584 QString entry = cg.readEntry(
"StatusBar",
"Enabled");
585 sb->setVisible( entry != QLatin1String(
"Disabled") );
589 if (mb && !mb->isNativeMenuBar()) {
590 QString entry = cg.readEntry(
"MenuBar",
"Enabled");
595 entry = QLatin1String(
"Enabled");
597 mb->setVisible( entry != QLatin1String(
"Disabled") );
601 QString entry = cg.readEntry(
"ToolBarsMovable",
"Disabled");
607 QByteArray groupName(
"Toolbar");
610 groupName += (toolbar->objectName().isEmpty() ? QByteArray::number(n) : QByteArray(
" ").append(toolbar->objectName().toUtf8()));
612 KConfigGroup toolbarGroup(&cg, groupName.constData());
618 if (cg.hasKey(
"State")) {
619 state = cg.readEntry(
"State", state);
620 state = QByteArray::fromBase64(state);
626 focusedWidget->setFocus();
629 d->settingsDirty =
false;
630 d->letDirtySettings = oldLetDirtySettings;
636 d->setSettingsDirty();
642 return d->settingsDirty;
659 d->autoSaveSettings =
true;
660 d->autoSaveGroup = group;
661 d->autoSaveWindowSize = saveWindowSize;
663 if (!saveWindowSize && d->sizeTimer) {
664 d->sizeTimer->stop();
674 d->autoSaveSettings =
false;
675 if (d->settingsTimer) {
676 d->settingsTimer->stop();
683 return d->autoSaveSettings;
689 return d->autoSaveSettings ? d->autoSaveGroup.name() : QString();
695 return d->autoSaveSettings ? d->autoSaveGroup : KConfigGroup();
701 Q_ASSERT(d->autoSaveSettings);
704 d->autoSaveGroup.sync();
705 d->settingsDirty =
false;
711 switch (ev->type()) {
721 case QEvent::ChildPolished: {
722 QChildEvent *
event =
static_cast<QChildEvent *
>(ev);
723 QDockWidget *dock = qobject_cast<QDockWidget *>(
event->child());
725 QMenuBar *menubar = qobject_cast<QMenuBar *>(
event->child());
727 connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
729 connect(dock, SIGNAL(visibilityChanged(
bool)),
731 connect(dock, SIGNAL(topLevelChanged(
bool)),
737 }
else if (toolbar) {
741 }
else if (menubar) {
748 case QEvent::ChildRemoved: {
749 QChildEvent *
event =
static_cast<QChildEvent *
>(ev);
750 QDockWidget *dock = qobject_cast<QDockWidget *>(
event->child());
752 QMenuBar *menubar = qobject_cast<QMenuBar *>(
event->child());
754 disconnect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
756 disconnect(dock, SIGNAL(visibilityChanged(
bool)),
758 disconnect(dock, SIGNAL(topLevelChanged(
bool)),
761 }
else if (toolbar) {
763 }
else if (menubar) {
771 return QMainWindow::event(ev);
789 q->setAnimated(
q->style()->styleHint(QStyle::SH_Widget_Animate, 0,
q));
801 QString childName = name;
802 if (childName.isEmpty()) {
803 childName = QStringLiteral(
"mainToolBar");
806 KisToolBar *tb = findChild<KisToolBar *>(childName);
819 foreach (QObject *child, children())
829 return *sMemberList();
834 return k_func()->dbusName;
837#include "moc_kmainwindow.cpp"
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
bool eventFilter(QObject *watched, QEvent *event) override
~DockResizeListener() override
DockResizeListener(KisKMainWindow *win)
~KMWSessionManager() override
bool saveState(QSessionManager &)
void polish(KisKMainWindow *q)
void _k_slotSaveAutoSaveSize()
void init(KisKMainWindow *_q)
void setSettingsDirty(CallCompression callCompression=CompressCalls)
QPointer< QObject > dockResizeListener
KConfigGroup autoSaveGroup
void _k_slotSettingsChanged(int category)
KDE top level main window
static const QString classNameOfToplevel(int number)
~KisKMainWindow() override
Destructor.
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
virtual void saveGlobalProperties(KConfig *sessionConfig)
bool readPropertiesInternal(KConfig *, int)
void appHelpActivated(void)
virtual void saveProperties(KConfigGroup &)
virtual void applyMainWindowSettings(const KConfigGroup &config)
bool restore(int number, bool show=true)
bool event(QEvent *event) override
QList< KisToolBar * > toolBars() const
void savePropertiesInternal(KConfig *, int)
static QStatusBar * internalStatusBar(KisKMainWindow *mw)
static const char WINDOW_PROPERTIES[]
static bool endsWithHashNumber(const QString &s)
static QMenuBar * internalMenuBar(KisKMainWindow *mw)