File indexing completed on 2024-04-14 14:30:01

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2000 Reginald Stadlbauer <reggie@kde.org>
0004     SPDX-FileCopyrightText: 1997 Stephan Kulow <coolo@kde.org>
0005     SPDX-FileCopyrightText: 1997-2000 Sven Radej <radej@kde.org>
0006     SPDX-FileCopyrightText: 1997-2000 Matthias Ettrich <ettrich@kde.org>
0007     SPDX-FileCopyrightText: 1999 Chris Schlaeger <cs@kde.org>
0008     SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
0009     SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
0010     SPDX-FileCopyrightText: 2000-2008 David Faure <faure@kde.org>
0011 
0012     SPDX-License-Identifier: LGPL-2.0-only
0013 */
0014 
0015 #ifndef KMAINWINDOW_H
0016 #define KMAINWINDOW_H
0017 
0018 #include <kxmlgui_export.h>
0019 
0020 #include <QMainWindow>
0021 #include <memory>
0022 
0023 class QMenu;
0024 class KConfig;
0025 class KConfigGroup;
0026 class KMWSessionManager;
0027 class KMainWindowPrivate;
0028 class KToolBar;
0029 
0030 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 65)
0031 /**
0032  * @relates KMainWindow
0033  * @deprecated Since 5.65, use Qt::WindowFlags()
0034  */
0035 #define KDE_DEFAULT_WINDOWFLAGS 0
0036 #else
0037 #define KDE_DEFAULT_WINDOWFLAGS KDE_DEFAULT_WINDOWFLAGS_is_deprecated_use_Qt_WindowFlags()
0038 #endif
0039 
0040 /**
0041  * @class KMainWindow kmainwindow.h KMainWindow
0042  *
0043  * @brief KMainWindow represents a top-level main window.
0044  *
0045  * It extends QMainWindow with session management capabilities. For ready-made window functionality and simpler UI management, use KXmlGuiWindow instead.
0046  *
0047  * Define the minimum/maximum height/width of your central widget and KMainWindow will take this into account.
0048  * For fixed size windows set your main widget to a fixed size. Fixed aspect ratios (QWidget::heightForWidth()) and fixed width widgets are not supported.
0049  *
0050  * Use toolBar() to generate a main toolbar "mainToolBar" or refer to a specific toolbar.
0051  * For a simpler way to manage your toolbars, use KXmlGuiWindow::setupGUI() instead.
0052  *
0053  * Use setAutoSaveSettings() to automatically save and restore the window geometry and toolbar/menubar/statusbar state when the application is restarted.
0054  *
0055  * Use kRestoreMainWindows() in your main function to restore your windows when the session is restored.
0056  *
0057  * The window state is saved when the application is exited.
0058  * Reimplement queryClose() to warn the user of unsaved data upon close or exit.
0059  *
0060  * Reimplement saveProperties() / readProperties() or saveGlobalProperties() / readGlobalProperties()
0061  * to save/restore application-specific state during session management.
0062  *
0063  * Note that session saving is automatically called, session restoring is not,
0064  * and so it needs to be implemented in your main() function.
0065  *
0066  * See https://develop.kde.org/docs/use/session-managment for more information on session management.
0067  */
0068 
0069 class KXMLGUI_EXPORT KMainWindow : public QMainWindow
0070 {
0071     friend class KMWSessionManager;
0072     friend class DockResizeListener;
0073     Q_OBJECT
0074     Q_PROPERTY(bool hasMenuBar READ hasMenuBar)
0075     Q_PROPERTY(bool autoSaveSettings READ autoSaveSettings)
0076     Q_PROPERTY(QString autoSaveGroup READ autoSaveGroup)
0077 
0078 public:
0079     /**
0080      * @brief Constructs a main window.
0081      *
0082      * @param parent The parent widget. This is usually @c nullptr, but it may also be
0083      * the window group leader. In that case,
0084      * the KMainWindow becomes a secondary window.
0085      *
0086      * @param flags Specify the window flags. The default is none.
0087      *
0088      * Note that by default a KMainWindow is created with the
0089      * Qt::WA_DeleteOnClose attribute set, i.e. it is automatically destroyed
0090      * when the window is closed. If you do not want this behavior, call
0091      * \code
0092      * window->setAttribute(Qt::WA_DeleteOnClose, false);
0093      * \endcode
0094      *
0095      * KMainWindows must be created on the heap with 'new', like:
0096      * \code
0097      * KMainWindow *kmw = new KMainWindow(...);
0098      * kmw->setObjectName(...);
0099      * \endcode
0100      *
0101      * Since KDE Frameworks 5.16, KMainWindow will enter information regarding
0102      * the application's translators by default, using KAboutData::setTranslator(). This only occurs
0103      * if no translators are already assigned in KAboutData (see KAboutData::setTranslator() for
0104      * details -- the auto-assignment here uses the same translated strings as specified for that
0105      * function).
0106      *
0107      * IMPORTANT: For session management and window management to work
0108      * properly, all main windows in the application should have a
0109      * different name. Otherwise, KMainWindow will create
0110      * a unique name, but it's recommended to explicitly pass a window name that will
0111      * also describe the type of the window. If there can be several windows of the same
0112      * type, append '#' (hash) to the name, and KMainWindow will replace it with numbers to make
0113      * the names unique. For example, for a mail client which has one main window showing
0114      * the mails and folders, and which can also have one or more windows for composing
0115      * mails, the name for the folders window should be e.g. "mainwindow" and
0116      * for the composer windows "composer#".
0117      *
0118      * @see KAboutData
0119      */
0120     explicit KMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
0121 
0122     /**
0123      * @brief Destructor.
0124      *
0125      * Will also destroy the toolbars and menubar if
0126      * needed.
0127      */
0128     ~KMainWindow() override;
0129 
0130 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0131     /**
0132      * Retrieve the standard help menu.
0133      *
0134      * It contains entries for the
0135      * help system (activated by F1), an optional "What's This?" entry
0136      * (activated by Shift F1), an application specific dialog box,
0137      * and an "About KDE" dialog box.
0138      *
0139      * Example (adding a standard help menu to your application):
0140      * \code
0141      * QMenu *help = helpMenu( <myTextString> );
0142      * menuBar()->addMenu( help );
0143      * \endcode
0144      *
0145      * @param aboutAppText The string that is used in the application
0146      *        specific dialog box. If you leave this string empty the
0147      *        information in the global KAboutData of the
0148      *        application will be used to make a standard dialog box.
0149      *
0150      * @param showWhatsThis Set this to false if you do not want to include
0151      *        the "What's This" menu entry.
0152      *
0153      * @return A standard help menu.
0154      * @deprecated Since 5.0, use KHelpMenu directly
0155      */
0156     KXMLGUI_DEPRECATED_VERSION(5, 0, "Use KHelpMenu directly")
0157     QMenu *helpMenu(const QString &aboutAppText = QString(), bool showWhatsThis = true);
0158 #endif
0159 
0160 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0161     /**
0162      * @returns The help menu. Creates a standard help menu if none exists yet.
0163      *
0164      * It contains entries for the
0165      * help system (activated by F1), an optional "What's This?" entry
0166      * (activated by Shift F1), an application specific dialog box,
0167      * and an "About KDE" dialog box. You must create the application
0168      * specific dialog box yourself. When the "About application"
0169      * menu entry is activated, a signal will trigger the
0170      * showAboutApplication slot. See showAboutApplication for more
0171      * information.
0172      *
0173      * Example (adding a help menu to your application):
0174      * \code
0175      * menuBar()->addMenu( customHelpMenu() );
0176      * \endcode
0177      *
0178      * @param showWhatsThis Whether to show the "What's This" menu entry. @c true by default.
0179      *
0180      * @return A standard help menu.
0181      * @deprecated Since 5.0, use XMLGUI instead, or KHelpMenu directly
0182      */
0183     KXMLGUI_DEPRECATED_VERSION(5, 0, "Use XMLGUI or KHelpMenu")
0184     QMenu *customHelpMenu(bool showWhatsThis = true);
0185 #endif
0186 
0187     /**
0188      * @param numberOfInstances The number of KMainWindow instances in the application.
0189      * @returns @c true if the number of KMainWindow instances of the previous session did contain the requested @p numberOfInstances, @c false otherwise.
0190      * @see restore()
0191      **/
0192     static bool canBeRestored(int numberOfInstances);
0193 
0194     /**
0195      * @brief Useful if your application uses
0196      * different kinds of top-level windows.
0197      *
0198      * @returns The class name of the top-level window to be restored
0199      * that corresponds to @p instanceNumber.
0200      *
0201      * @param instanceNumber
0202      * @see restore()
0203      */
0204     static const QString classNameOfToplevel(int instanceNumber);
0205 
0206     /**
0207      * @brief Attempt to restore the top-level widget as defined by @p numberOfInstances (1..X).
0208      *
0209      * You should call canBeRestored() first.
0210      *
0211      * If the session did not contain so high a number, the configuration
0212      * is not changed and @c false is returned.
0213      *
0214      * That means clients could simply do the following:
0215      * \code
0216      * if (qApp->isSessionRestored()){
0217      *   int n = 1;
0218      *   while (KMainWindow::canBeRestored(n)){
0219      *     (new childMW)->restore(n);
0220      *     n++;
0221      *   }
0222      * } else {
0223      *   // create default application as usual
0224      * }
0225      * \endcode
0226      * Note that if @p show is @c true (default), QWidget::show() is called
0227      * implicitly in restore.
0228      *
0229      * With this you can easily restore all top-level windows of your
0230      * application.
0231      *
0232      * If your application uses different kinds of top-level
0233      * windows, then you can use KMainWindow::classNameOfToplevel(n)
0234      * to determine the exact type before calling the childMW
0235      * constructor in the example from above.
0236      *
0237      * @note You don't need to deal with this function. Use the
0238      * kRestoreMainWindows() convenience template function instead!
0239      *
0240      * @param numberOfInstances The number of KMainWindow instances from the last session.
0241      * @param show Whether the KMainWindow instances will be visible by default.
0242      *
0243      * @returns @c true if the session contained
0244      * the same number of instances as the requested number,
0245      * @c false if the session contained less instances than the requested number,
0246      * in which case no configuration is changed.
0247      *
0248      * @see kRestoreMainWindows()
0249      * @see readProperties()
0250      * @see canBeRestored()
0251      */
0252     bool restore(int numberOfInstances, bool show = true);
0253 
0254     /**
0255      * @returns @c true if there is a menubar, @c false otherwise.
0256      */
0257     bool hasMenuBar();
0258 
0259     /**
0260      * @returns The list of members of the KMainWindow class.
0261      */
0262     static QList<KMainWindow *> memberList();
0263 
0264     /**
0265      * @brief This is useful to both call specific toolbars that have been created
0266      * or to generate a default one upon call.
0267      *
0268      * This refers to toolbars created dynamically from the XML UI
0269      * framework via KConfig or appnameui.rc.
0270      *
0271      * If the toolbar does not exist, one will be created.
0272      *
0273      * @param name The internal name of the toolbar. If no name is
0274      *             specified, "mainToolBar" is assumed.
0275      *
0276      * @return A pointer to the toolbar with the specified name.
0277      * @see toolBars()
0278      **/
0279     KToolBar *toolBar(const QString &name = QString());
0280 
0281     /**
0282      * @return A list of all toolbars for this window
0283      */
0284     QList<KToolBar *> toolBars() const;
0285 
0286     /**
0287      * @brief This enables autosave of toolbar/menubar/statusbar settings
0288      * (and optionally window size).
0289      * @param groupName A name that identifies the type of window.
0290      * You can have several types of window in the same application.
0291      * If no @p groupName is specified, the value defaults to "MainWindow".
0292      *
0293      * @param saveWindowSize Whether to include the window size
0294      * when saving. @c true by default.
0295      *
0296      * If the *bars were modified when the window is closed,
0297      * saveMainWindowSettings( KConfigGroup(KSharedConfig::openConfig(), groupName) ) will be called.
0298      *
0299      * Typically, you will call setAutoSaveSettings() in your
0300      * KMainWindow-inherited class constructor, and it will take care
0301      * of restoring and saving automatically.
0302      *
0303      * By default, this generates an
0304      * appnamerc ini file as if using default KConfig constructor or KConfig::SimpleConfig.
0305      *
0306      * Make sure you call this @em after all your *bars have been created.
0307      *
0308      * To make sure that KMainWindow properly obtains the default
0309      * size of the window you should do the following:
0310      * - Remove hardcoded resize() calls in the constructor or main
0311      *   to let the automatic resizing determine the default window size.
0312      *   Hardcoded window sizes will be wrong for users that have big fonts,
0313      *   use different styles, long/small translations, large toolbars, and other factors.
0314      * - Put the setAutoSaveSettings() call after all widgets
0315      *   have been created and placed inside the main window
0316      *   (for most apps this means QMainWindow::setCentralWidget())
0317      * - QWidget-based objects should overload "virtual QSize sizeHint() const;"
0318      *   to specify a default size.
0319      * @see KConfig
0320      * @see KSharedConfig
0321      * @see saveMainWindowSettings()
0322      * @see toolBar()
0323      * @see KXmlGuiWindow::setupGUI()
0324      */
0325     void setAutoSaveSettings(const QString &groupName = QStringLiteral("MainWindow"), bool saveWindowSize = true);
0326 
0327     /**
0328      * This is an overloaded function.
0329      * This allows the settings to be saved into a different file
0330      * that does not correspond to that used for KSharedConfig::openConfig().
0331      * @see setAutoSaveSettings(const QString &groupName, bool saveWindowSize)
0332      * @see KConfig
0333      * @see KSharedConfig
0334      * @since 4.1
0335      */
0336     void setAutoSaveSettings(const KConfigGroup &group, bool saveWindowSize = true);
0337 
0338     /**
0339      * @brief Disables the autosave settings feature.
0340      * You don't normally need to call this, ever.
0341      * @see setAutoSaveSettings()
0342      * @see autoSaveSettings()
0343      */
0344     void resetAutoSaveSettings();
0345 
0346     /**
0347      * @return @c true if setAutoSaveSettings() was called,
0348      * @c false by default or if resetAutoSaveSettings() was called.
0349      * @see setAutoSaveSettings()
0350      * @see resetAutoSaveSettings()
0351      */
0352     bool autoSaveSettings() const;
0353 
0354     /**
0355      * @return The group used for autosaving settings.
0356      *
0357      * Do not mistake this with autoSaveConfigGroup.
0358      *
0359      * Only meaningful if setAutoSaveSettings(const QString&, bool) was called.
0360      *
0361      * Do not use this method if setAutoSaveSettings(const KConfigGroup&, bool) was called.
0362      *
0363      * This can be useful for forcing a save or an apply, e.g. before and after
0364      * using KEditToolBar.
0365      *
0366      * @note Prefer saveAutoSaveSettings() for saving or autoSaveConfigGroup() for loading.
0367      *
0368      * @see autoSaveSettings()
0369      * @see setAutoSaveSettings()
0370      * @see saveAutoSaveSettings()
0371      * @see resetAutoSaveSettings()
0372      * @see autoSaveConfigGroup()
0373      */
0374     QString autoSaveGroup() const;
0375 
0376     /**
0377      * @return The group used for autosaving settings.
0378      *
0379      * Only meaningful if setAutoSaveSettings(const QString&, bool) was called.
0380      *
0381      * Do not use this method if setAutoSaveSettings(const KConfigGroup&, bool) was called.
0382      *
0383      * This can be useful for forcing an apply, e.g. after using KEditToolBar.
0384      *
0385      * @see setAutoSaveSettings()
0386      * @see autoSaveGroup()
0387      * @since 4.1
0388      */
0389     KConfigGroup autoSaveConfigGroup() const;
0390 
0391     /**
0392      * @brief Assigns the config group name for the KConfigGroup returned by stateConfigGroup.
0393      * @param configGroup The config group to be assigned.
0394      * Window size and state are stored in the resulting KConfigGroup when this function is called.
0395      * @note If this is used in combination with setAutoSaveSettings, you should call this method first.
0396      *
0397      * @see KConfigGroup()
0398      * @see KSharedConfig::openStateConfig()
0399      * @see stateConfigGroup()
0400      *
0401      * @since 5.88
0402      */
0403     void setStateConfigGroup(const QString &configGroup);
0404 
0405     /**
0406      * @returns The KConfigGroup used to store state data like window sizes or window state.
0407      *
0408      * The resulting group is invalid if setStateConfig is not called explicitly.
0409      *
0410      * @see KConfigGroup
0411      * @since 5.88
0412      */
0413     KConfigGroup stateConfigGroup() const;
0414 
0415     /**
0416      * @brief Read settings for statusbar, menubar and toolbar from their respective
0417      * groups in the config file and apply them.
0418      *
0419      * @param config Config group to read the settings from.
0420      */
0421     virtual void applyMainWindowSettings(const KConfigGroup &config);
0422 
0423     /**
0424      * @brief Manually save the settings for statusbar, menubar and toolbar to their respective
0425      * groups in the KConfigGroup @p config.
0426      *
0427      * Example:
0428      * \code
0429      * KConfigGroup group(KSharedConfig::openConfig(), "MainWindow");
0430      * saveMainWindowSettings(group);
0431      * \endcode
0432      *
0433      * @param config Config group to save the settings to.
0434      * @see setAutoSaveSettings()
0435      * @see KConfig
0436      * @see KSharedConfig
0437      * @see KConfigGroup
0438      */
0439     void saveMainWindowSettings(KConfigGroup &config);
0440 
0441     /**
0442      * @returns The path for the exported window's D-Bus object.
0443      * @since 4.0.1
0444      */
0445     QString dbusName() const;
0446 
0447 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0448     /**
0449      * @returns Always @c false
0450      * @deprecated since 5.0, the functionality got removed
0451      **/
0452     KXMLGUI_DEPRECATED_VERSION(5, 0, "Remove usage, is a no-op now")
0453     bool initialGeometrySet() const
0454     {
0455         return false;
0456     }
0457 #endif
0458 
0459 public Q_SLOTS:
0460     /**
0461      * @brief Assigns a KDE compliant caption (window title).
0462      *
0463      * @param caption The string that will be
0464      * displayed in the window title, before the application name.
0465      *
0466      * @note This function does the same as setPlainCaption().
0467      *
0468      * @note Do not include the application name
0469      * in this string. It will be added automatically according to the KDE
0470      * standard.
0471      *
0472      * @see setPlainCaption()
0473      */
0474     virtual void setCaption(const QString &caption);
0475     /**
0476      * @brief Makes a KDE compliant caption.
0477      * @param caption Your caption.
0478      * @param modified Whether the document is modified. This displays
0479      * an additional sign in the title bar, usually "**".
0480      *
0481      * This is an overloaded function.
0482      *
0483      * @note Do not include the application name
0484      * in this string. It will be added automatically according to the KDE
0485      * standard.
0486      */
0487     virtual void setCaption(const QString &caption, bool modified);
0488 
0489     /**
0490      * @brief Make a plain caption without any modifications.
0491      *
0492      * @param caption The string that will be
0493      * displayed in the window title, before the application name.
0494      *
0495      * @note This function does the same as setCaption().
0496      *
0497      * @note Do not include the application name
0498      * in this string. It will be added automatically according to the KDE
0499      * standard.
0500      *
0501      * @see setCaption()
0502      */
0503     virtual void setPlainCaption(const QString &caption);
0504 
0505     /**
0506      * @brief Opens the help page for the application.
0507      *
0508      * The application name is
0509      * used as a key to determine what to display and the system will attempt
0510      * to open \<appName\>/index.html.
0511      *
0512      * This method is intended for use by a help button in the toolbar or
0513      * components outside the regular help menu.
0514      *
0515      * Use helpMenu() when you
0516      * want to provide access to the help system from the help menu.
0517      *
0518      * Example (adding a help button to the first toolbar):
0519      *
0520      * \code
0521      * toolBar()->addAction(QIcon::fromTheme("help-contents"), i18n("Help"),
0522      *                       this, &KMainWindow::appHelpActivated);
0523      * \endcode
0524      *
0525      * @see helpMenu()
0526      * @see toolBar()
0527      */
0528     void appHelpActivated();
0529 
0530     /**
0531      * @brief Tell the main window that it should save its settings when being closed.
0532      *
0533      * This is part of the autosave settings feature.
0534      *
0535      * For everything related to toolbars this happens automatically,
0536      * but you have to call setSettingsDirty() in the slot that toggles
0537      * the visibility of the statusbar.
0538      *
0539      * @see saveAutoSaveSettings()
0540      */
0541     void setSettingsDirty();
0542 
0543 protected:
0544     /**
0545      * Reimplemented to catch QEvent::Polish in order to adjust the object name
0546      * if needed, once all constructor code for the main window has run.
0547      * Also reimplemented to catch when a QDockWidget is added or removed.
0548      */
0549     bool event(QEvent *event) override;
0550 
0551     /**
0552      * Reimplemented to autosave settings and call queryClose().
0553      *
0554      * We recommend that you reimplement queryClose() rather than closeEvent().
0555      * If you do it anyway, ensure to call the base implementation to keep
0556      * the feature of autosaving window settings working.
0557      */
0558     void closeEvent(QCloseEvent *) override;
0559 
0560     /**
0561      * @brief This function is called before the window is closed,
0562      * either by the user or indirectly by the session manager.
0563      *
0564      * This can be used to prompt the user to save unsaved data before the window is closed.
0565      *
0566      * Example:
0567      * \code
0568      * switch ( KMessageBox::warningTwoActionsCancel( this,
0569      *          i18n("Save changes to document foo?"), QString(),
0570      *          KStandardGuiItem::save(), KStandardGuiItem::discard())) ) {
0571      *   case KMessageBox::PrimaryAction :
0572      *     // save document here. If saving fails, return false;
0573      *     return true;
0574      *   case KMessageBox::SecondaryAction :
0575      *     return true;
0576      *   default: // cancel
0577      *     return false;
0578      * \endcode
0579      *
0580      * @note Do @em not close the document from within this method,
0581      * as it may be called by the session manager before the
0582      * session is saved. If the document is closed before the session save occurs,
0583      * its location might not be properly saved. In addition, the session shutdown
0584      * may be canceled, in which case the document should remain open.
0585      *
0586      * @return @c true by default, @c false according to the reimplementation.
0587      * Returning @c false will cancel the closing operation,
0588      * and if KApplication::sessionSaving() is true, it cancels logout.
0589      *
0590      * @see KApplication::sessionSaving()
0591      */
0592     virtual bool queryClose();
0593 
0594     /**
0595      * @brief Saves your instance-specific properties.
0596      *
0597      * The function is
0598      * invoked when the session manager requests your application
0599      * to save its state.
0600      *
0601      * Reimplement this function in child classes.
0602      *
0603      * \code
0604      * void MainWindow::saveProperties(KConfigGroup &config) {
0605      *   config.writeEntry("myKey", "newValue");
0606      *   ...
0607      * }
0608      * \endcode
0609      *
0610      * @note No user interaction is allowed
0611      * in this function!
0612      *
0613      */
0614     virtual void saveProperties(KConfigGroup &)
0615     {
0616     }
0617 
0618     /**
0619      * @brief Reads your instance-specific properties.
0620      *
0621      * This function is called indirectly by restore().
0622      *
0623      * \code
0624      * void MainWindow::readProperties(KConfigGroup &config) {
0625      *   if (config.hasKey("myKey")) {
0626      *     config.readEntry("myKey", "DefaultValue");
0627      *   }
0628      *   ...
0629      * }
0630      * \endcode
0631      *
0632      * @see readGlobalProperties()
0633      */
0634     virtual void readProperties(const KConfigGroup &)
0635     {
0636     }
0637 
0638     /**
0639      * @brief Saves your application-wide properties.
0640      *
0641      * @param sessionConfig A pointer to the KConfig instance
0642      * used to save the session data.
0643      *
0644      * This function is invoked when the session manager
0645      * requests your application to save its state.
0646      * It is similar to saveProperties(), but it is only called for
0647      * the first main window. This is useful to save global state of your application
0648      * that isn't bound to a particular window.
0649      *
0650      * The default implementation does nothing.
0651      *
0652      * @see readGlobalProperties()
0653      * @see saveProperties()
0654      */
0655     virtual void saveGlobalProperties(KConfig *sessionConfig);
0656 
0657     /**
0658      * @brief Reads your application-wide properties.
0659      *
0660      * @param sessionConfig A pointer to the KConfig instance
0661      * used to load the session data.
0662      *
0663      * @see saveGlobalProperties()
0664      * @see readProperties()
0665      *
0666      */
0667     virtual void readGlobalProperties(KConfig *sessionConfig);
0668     void savePropertiesInternal(KConfig *, int);
0669     bool readPropertiesInternal(KConfig *, int);
0670 
0671     /**
0672      * For inherited classes
0673      */
0674     bool settingsDirty() const;
0675 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0676     /**
0677      * For inherited classes
0678      * @deprecated Since 5.0, use KWindowConfig::saveWindowSize
0679      */
0680     KXMLGUI_DEPRECATED_VERSION(5, 0, "Use KWindowConfig::saveWindowSize(...)")
0681     void saveWindowSize(KConfigGroup &config) const;
0682 #endif
0683 
0684 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0685     /**
0686      * For inherited classes
0687      * @deprecated Since 5.0, use KWindowConfig::restoreWindowSize
0688      */
0689     KXMLGUI_DEPRECATED_VERSION(5, 0, "Use KWindowConfig::restoreWindowSize(...)")
0690     void restoreWindowSize(const KConfigGroup &config);
0691 #endif
0692 
0693 protected Q_SLOTS:
0694 #if KXMLGUI_BUILD_DEPRECATED_SINCE(5, 0)
0695     /**
0696      * This slot does nothing.
0697      *
0698      * It must be reimplemented if you want
0699      * to use a custom About Application dialog box. This slot is
0700      * connected to the About Application entry in the menu returned
0701      * by customHelpMenu.
0702      *
0703      * Example:
0704      * \code
0705      *
0706      * void MyMainLevel::setupInterface()
0707      * {
0708      *   ..
0709      *   menuBar()->addMenu( customHelpMenu() );
0710      *   ..
0711      * }
0712      *
0713      * void MyMainLevel::showAboutApplication()
0714      * {
0715      *   <activate your custom dialog>
0716      * }
0717      * \endcode
0718      * @deprecated Since 5.0, use KHelpMenu
0719      */
0720     KXMLGUI_DEPRECATED_VERSION(5, 0, "Use KHelpMenu")
0721     virtual void showAboutApplication()
0722     {
0723     }
0724 #endif
0725 
0726     /**
0727      * This slot should only be called in case you reimplement closeEvent() and
0728      * if you are using the autosave feature. In all other cases,
0729      * setSettingsDirty() should be called instead to benefit from the delayed
0730      * saving.
0731      *
0732      * Example:
0733      * \code
0734      *
0735      * void MyMainWindow::closeEvent( QCloseEvent *e )
0736      * {
0737      *   // Save settings if autosave is enabled, and settings have changed
0738      *   if ( settingsDirty() && autoSaveSettings() )
0739      *     saveAutoSaveSettings();
0740      *   ..
0741      * }
0742      * \endcode
0743      *
0744      * @see setAutoSaveSettings()
0745      * @see setSettingsDirty()
0746      */
0747     void saveAutoSaveSettings();
0748 
0749 protected:
0750     KXMLGUI_NO_EXPORT KMainWindow(KMainWindowPrivate &dd, QWidget *parent, Qt::WindowFlags f);
0751 
0752     std::unique_ptr<KMainWindowPrivate> const k_ptr;
0753     // KF6 TODO: change k_ptr to d_ptr, use normal Q_DECLARE_PRIVATE
0754 
0755 private:
0756     Q_DECLARE_PRIVATE_D(k_ptr, KMainWindow)
0757 
0758     Q_PRIVATE_SLOT(d_func(), void _k_slotSettingsChanged(int))
0759     Q_PRIVATE_SLOT(d_func(), void _k_slotSaveAutoSaveSize())
0760     Q_PRIVATE_SLOT(d_func(), void _k_slotSaveAutoSavePosition())
0761 };
0762 
0763 /**
0764  * @defgroup KXMLGUI_Session KXMLGUI Session Macros and Functions
0765  *
0766  * @{
0767  */
0768 
0769 #if KXMLGUI_ENABLE_DEPRECATED_SINCE(5, 0)
0770 /**
0771  * @def RESTORE
0772  * Restores the last session.
0773  *
0774  * @deprecated since 5.0, use kRestoreMainWindows() instead
0775  **/
0776 #define RESTORE(type)                                                                                                                                          \
0777     {                                                                                                                                                          \
0778         int n = 1;                                                                                                                                             \
0779         while (KMainWindow::canBeRestored(n)) {                                                                                                                \
0780             (new type)->restore(n);                                                                                                                            \
0781             n++;                                                                                                                                               \
0782         }                                                                                                                                                      \
0783     }
0784 #endif
0785 
0786 /**
0787  * @def KDE_RESTORE_MAIN_WINDOWS_NUM_TEMPLATE_ARGS
0788  * Returns the maximal number of arguments that are actually
0789  * supported by kRestoreMainWindows().
0790  **/
0791 #define KDE_RESTORE_MAIN_WINDOWS_NUM_TEMPLATE_ARGS 3
0792 
0793 /**
0794  * @brief Restores the last session. (To be used in your main function).
0795  *
0796  * These functions work also if you have more than one kind of top-level
0797  * widget (each derived from KMainWindow, of course).
0798  *
0799  * Imagine you have three kinds of top-level widgets: the classes @c childMW1,
0800  * @c childMW2 and @c childMW3. Then you can just do:
0801  *
0802  * \code
0803  * int main(int argc, char *argv[])
0804  * {
0805  *     // [...]
0806  *     if (qApp->isSessionRestored())
0807  *         kRestoreMainWindows<childMW1, childMW2, childMW3>();
0808  *     else {
0809  *       // create default application as usual
0810  *     }
0811  *     // [...]
0812  * }
0813  * \endcode
0814  *
0815  * kRestoreMainWindows<>() will create (on the heap) as many instances
0816  * of your main windows as have existed in the last session and
0817  * call KMainWindow::restore() with the correct arguments. Note that
0818  * also QWidget::show() is called implicitly.
0819  *
0820  * Currently, these functions are provided for up to three
0821  * template arguments. If you need more, tell us. To help you in
0822  * deciding whether or not you can use kRestoreMainWindows, a
0823  * define #KDE_RESTORE_MAIN_WINDOWS_NUM_TEMPLATE_ARGS is provided.
0824  *
0825  * @note Prefer this function over directly calling KMainWindow::restore().
0826  *
0827  * @tparam T Top-level widget class
0828  *
0829  * @see KMainWindow::restore()
0830  * @see KMainWindow::classNameOfToplevel()
0831  **/
0832 template<typename T>
0833 inline void kRestoreMainWindows()
0834 {
0835     for (int n = 1; KMainWindow::canBeRestored(n); ++n) {
0836         const QString className = KMainWindow::classNameOfToplevel(n);
0837         if (className == QLatin1String(T::staticMetaObject.className())) {
0838             (new T)->restore(n);
0839         }
0840     }
0841 }
0842 
0843 /**
0844  * @brief Restores the last session.
0845  * This is an overloaded function.
0846  *
0847  * Use this with multiple different top-level widget classes.
0848  *
0849  * @tparam T0 One top-level widget class
0850  * @tparam T1 Explicit other top-level widget class for disambiguation from base template
0851  * @tparam Tn Parameter pack to take 0..n further KMainWindows
0852  * @see kRestoreMainWindows()
0853  */
0854 template<typename T0, typename T1, typename... Tn>
0855 inline void kRestoreMainWindows()
0856 {
0857     kRestoreMainWindows<T0>();
0858     kRestoreMainWindows<T1, Tn...>();
0859 }
0860 /** @}  */
0861 
0862 #endif