File indexing completed on 2024-12-08 13:26:51

0001 /*
0002  *   SPDX-FileCopyrightText: 2009 Ben Cooksley <bcooksley@kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef BASEMODE_H
0008 #define BASEMODE_H
0009 
0010 #include <QObject>
0011 
0012 #include <KPluginMetaData>
0013 
0014 #include "systemsettingsview_export.h"
0015 
0016 class QAction;
0017 class MenuItem;
0018 class ModuleView;
0019 class KAboutData;
0020 class KConfigDialog;
0021 class KConfigGroup;
0022 class QAbstractItemView;
0023 template<typename T> class QList;
0024 
0025 /**
0026  * @brief Provides a interface for System Settings views
0027  *
0028  * BaseMode is a standard interface for all plugins to System Settings to allow them to provide
0029  * their own interface to KDE control modules.\n
0030  *
0031  * The developer need only ensure that they perform all initialization of their plugin in
0032  * initEvent() to ensure that the plugin is displayed, and initial actions are loaded.
0033  *
0034  * @author Ben Cooksley <bcooksley@kde.org>
0035  * @author Mathias Soeken <msoeken@informatik.uni-bremen.de>
0036  */
0037 class SYSTEMSETTINGSVIEW_EXPORT BaseMode : public QObject
0038 {
0039     Q_OBJECT
0040 
0041     Q_PROPERTY(ApplicationMode applicationMode READ applicationMode CONSTANT)
0042 
0043     /**
0044      * System Settings main application is allowed privileged access to handle tooltips
0045      */
0046     friend class SettingsBase;
0047 
0048 public:
0049     // Main mode of the app.
0050     // At the moment SystemSettings and InfoCenter are supported:
0051     // Changes mainly the set of module listed on the left menu
0052     enum ApplicationMode {
0053         SystemSettings = 0,
0054         InfoCenter,
0055     };
0056     Q_ENUM(ApplicationMode)
0057 
0058     virtual bool defaultsIndicatorsVisible() const;
0059     virtual void toggleDefaultsIndicatorsVisibility();
0060 
0061     /**
0062      * Constructs a BaseMode for use in System Settings.\n
0063      * Plugin developers should perform all initialisation in initEvent() not here.
0064      *
0065      * @param parent The parent of this BaseMode.
0066      */
0067     explicit BaseMode(QObject *parent, const QVariantList &args);
0068     /**
0069      * Normal destructor. Plugin developers only need destroy what they created
0070      * not what is provided by BaseMode itself.
0071      */
0072     ~BaseMode() override;
0073 
0074     /**
0075      * These flags are used to control the presence of the Search and Configure actions on the toolbar
0076      */
0077     enum ToolBarItemsFlags {
0078         NoItems = 0x1, /**< The Toolbar will not have any items added by System Settings */
0079         Search = 0x2, /**< The Toolbar will have the search bar added by System Settings */
0080         Configure = 0x4, /**< The Toolbar will have configure added by System Settings */
0081         Quit = 0x8, /**< The toolbar will have exit added by System Settings */
0082     };
0083     Q_DECLARE_FLAGS(ToolBarItems, ToolBarItemsFlags)
0084 
0085     /**
0086      * Performs internal setup.\n
0087      * Plugin developers should perform initialisation in initEvent() not here.
0088      *
0089      * @param modeService Plugins service object, used for providing extra information to System Settings.
0090      */
0091     void init(const KPluginMetaData &metaData);
0092 
0093     /**
0094      * Prepares the BaseMode for use.\n
0095      * Plugin developers should perform initialisation here, creating the Models. They should perform widget
0096      * initialisation the first time mainWidget() is called, not here.
0097      */
0098     virtual void initEvent();
0099 
0100     /**
0101      * Returns the widget to be displayed in the center of System Settings.\n
0102      * The widget should be created the first time this function is called.
0103      *
0104      * @warning This function is called multiple times, ensure the widget is only created once.
0105      * @returns The main widget of the plugin.
0106      */
0107     virtual QWidget *mainWidget();
0108 
0109     /**
0110      * Provides information about the plugin, which is used in the About dialog of System Settings.\n
0111      * This does not need to be implemented, and need only be implemented if the author
0112      * wants information about the view displayed in the About dialog.
0113      *
0114      * @returns The about data of the plugin.
0115      */
0116     virtual KAboutData *aboutData();
0117 
0118     /**
0119      * @returns the application mode of this systemsettings process: SystemSettings or InfoCenter
0120      */
0121     ApplicationMode applicationMode() const;
0122 
0123     /**
0124      * The state of the plugin ( position of the splitter for instance ) should be saved
0125      * to the configuration object when this is called.
0126      */
0127     virtual void saveState();
0128 
0129     /**
0130      * Causes the view to unload all modules in the module view, and return to their module selection state
0131      *
0132      * @warning Failure to reimplement will cause modules to not be unloaded when changing views.
0133      * This must be implemented.
0134      */
0135     virtual void leaveModuleView();
0136 
0137     /**
0138      * Used to give focus to the plugin. Plugin should call setFocus() on the appropriate widget
0139      *
0140      * @note Failure to reimplement will cause keyboard accessibility and widget focusing problems
0141      */
0142     virtual void giveFocus();
0143 
0144     /**
0145      * Provides access to the ModuleView the application uses to display control modules.\n
0146      *
0147      * @warning Failure to reimplement will cause modules not to be checked for configuration
0148      * changes, and for the module to not be displayed in the About dialog. It must be implemented.
0149      * @returns The ModuleView used by the plugin for handling modules.
0150      */
0151     virtual ModuleView *moduleView() const;
0152 
0153     /**
0154      * Provides the list of actions the plugin wants System Settings to display in the toolbar when
0155      * it is loaded. This function does not need to be implemented if adding actions to the toolbar
0156      * is not required.
0157      *
0158      * @returns The list of actions the plugin provides.
0159      */
0160     virtual QList<QAction *> &actionsList() const;
0161 
0162     const KPluginMetaData &metaData() const;
0163 
0164     void setStartupModule(const QString &startupModule);
0165     QString startupModule() const;
0166 
0167     void setStartupModuleArgs(const QStringList &startupModuleArgs);
0168     QStringList startupModuleArgs() const;
0169 
0170     virtual void reloadStartupModule() = 0;
0171 
0172 public Q_SLOTS:
0173     /**
0174      * Called when the text in the search box changes allowing the display to be filtered.
0175      *
0176      * @warning Search will not work in the view if this function is not implemented.
0177      */
0178     virtual void searchChanged(const QString &text);
0179 
0180     /**
0181      * Allows views to add custom configuration pages to the System Settings configure dialog
0182      *
0183      * @warning Deleting the config object will cause System Settings to crash
0184      */
0185     virtual void addConfiguration(KConfigDialog *config);
0186 
0187     /**
0188      * Allows views to load their configuration before the configuration dialog is shown
0189      * Views should revert any changes that have not been saved
0190      */
0191     virtual void loadConfiguration();
0192 
0193     /**
0194      * Should be implemented to ensure that views settings are saved when the user confirms their changes
0195      * Views should also apply the configuration at the same time
0196      */
0197     virtual void saveConfiguration();
0198 
0199 Q_SIGNALS:
0200     /**
0201      * Triggers a reload of the views actions by the host application.
0202      *
0203      * @warning Actions previously contained in the list must not be destroyed before this has been emitted.
0204      */
0205     void actionsChanged();
0206 
0207     /**
0208      * Should be emitted when the type ( list of modules / display of module )
0209      * of displayed view is changed.
0210      *
0211      * @param state Determines whether changes have been made in the view.
0212      * @warning Failure to Q_EMIT this will result in inconsistent application headers and change state.
0213      */
0214     void viewChanged(bool state);
0215 
0216     /**
0217      * Causes System Settings to hide / show the toolbar items specified.
0218      * This is used to control the display of the Configure and Search actions
0219      *
0220      * @param items The items that are wanted in the toolbar
0221      */
0222     void changeToolBarItems(BaseMode::ToolBarItems items);
0223 
0224 protected:
0225     /**
0226      * Returns the root item of the list of categorised modules.
0227      * This is usually passed to the constructor of MenuModel.
0228      *
0229      * @warning This is shared between all views, and should not be deleted manually.
0230      * @returns The root menu item as provided by System Settings.
0231      */
0232     MenuItem *rootItem() const;
0233 
0234     /**
0235      * Returns (if present) an item that corresponds to a KCM which should be used as startup page.
0236      *
0237      * @warning This is shared between all views, and should not be deleted manually.
0238      * @returns The item to load as startup page. It may be nullptr
0239      */
0240     MenuItem *homeItem() const;
0241 
0242     /**
0243      * Provides access to the configuration for the plugin.
0244      *
0245      * @returns The configuration group for the plugin.
0246      */
0247     KConfigGroup &config() const;
0248 
0249     /**
0250      * Provides access to item views used by the plugin.
0251      * This is currently used to show the enhanced tooltips.
0252      *
0253      * @returns A list of pointers to item views used by the mode.
0254      *          The list can be empty.
0255      */
0256     virtual QList<QAbstractItemView *> views() const;
0257 
0258 private:
0259     class Private;
0260     Private *const d;
0261 };
0262 
0263 Q_DECLARE_OPERATORS_FOR_FLAGS(BaseMode::ToolBarItems)
0264 
0265 #endif