1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
/*
* SPDX-FileCopyrightText: 2009 Ben Cooksley <bcooksley@kde.org>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef SIDEBARMODE_H
#define SIDEBARMODE_H
#include <KSelectionProxyModel>
#include <QIcon>
#include <QWidget>
#include <qqmlregistration.h>
class ModuleView;
class KAboutData;
class QModelIndex;
class QAbstractItemView;
class QAbstractItemModel;
class QAction;
class SidebarMode;
class MenuItem;
class KActionCollection;
class FocusHackWidget : public QWidget
{
Q_OBJECT
public:
explicit FocusHackWidget(QWidget *parent = nullptr);
~FocusHackWidget() override;
public Q_SLOTS:
void focusNext();
void focusPrevious();
};
class SubcategoryModel : public KSelectionProxyModel
{
Q_OBJECT
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QIcon icon READ icon NOTIFY iconChanged)
Q_PROPERTY(bool categoryOwnedByKCM READ categoryOwnedByKCM NOTIFY categoryOwnedByKCMChanged)
public:
explicit SubcategoryModel(QAbstractItemModel *parentModel, SidebarMode *parent = nullptr);
QString title() const;
QIcon icon() const;
bool categoryOwnedByKCM() const;
void setParentIndex(const QModelIndex &activeModule);
Q_INVOKABLE void loadParentCategoryModule();
Q_SIGNALS:
void titleChanged();
void iconChanged();
void categoryOwnedByKCMChanged();
private:
QAbstractItemModel *m_parentModel;
SidebarMode *m_sidebarMode;
QPersistentModelIndex m_activeModuleIndex;
};
class SidebarMode : public QObject
{
Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("Not creatable, use the systemsettings attached property")
Q_PROPERTY(QAbstractItemModel *categoryModel READ categoryModel CONSTANT)
Q_PROPERTY(QAbstractItemModel *searchModel READ searchModel CONSTANT)
Q_PROPERTY(QAbstractItemModel *subCategoryModel READ subCategoryModel CONSTANT)
Q_PROPERTY(int activeCategoryRow READ activeCategoryRow NOTIFY activeCategoryRowChanged)
Q_PROPERTY(int activeSearchRow READ activeSearchRow NOTIFY activeSearchRowChanged)
Q_PROPERTY(int activeSubCategoryRow READ activeSubCategoryRow NOTIFY activeSubCategoryRowChanged)
Q_PROPERTY(int width READ width NOTIFY widthChanged)
Q_PROPERTY(bool actionMenuVisible READ actionMenuVisible NOTIFY actionMenuVisibleChanged)
Q_PROPERTY(bool defaultsIndicatorsVisible READ defaultsIndicatorsVisible NOTIFY defaultsIndicatorsVisibleChanged)
Q_PROPERTY(qreal headerHeight READ headerHeight WRITE setHeaderHeight NOTIFY headerHeightChanged)
// TODO Plasma 6.6 use new Kirigami api instead
Q_PROPERTY(qreal devicePixelRatio READ devicePixelRatio NOTIFY devicePixelRatioChanged)
public:
enum ApplicationMode {
SystemSettings = 0,
InfoCenter,
};
Q_ENUM(ApplicationMode)
SidebarMode(QObject *parent,
ApplicationMode mode,
const QString &startupModule,
const QStringList &startupModuleArgs,
KActionCollection *actions,
MenuItem *homeItem,
MenuItem *rootItem);
~SidebarMode() override;
QWidget *mainWidget();
void initEvent();
Q_INVOKABLE void giveFocus();
ModuleView *moduleView() const;
void reloadStartupModule();
QAbstractItemModel *categoryModel() const;
QAbstractItemModel *searchModel() const;
QAbstractItemModel *subCategoryModel() const;
int activeCategoryRow() const;
int activeSubCategoryRow() const;
int activeSearchRow() const;
int width() const;
bool actionMenuVisible() const;
qreal headerHeight() const;
void setHeaderHeight(qreal height);
qreal devicePixelRatio() const;
bool defaultsIndicatorsVisible() const;
void toggleDefaultsIndicatorsVisibility();
void toggleShowIrrelevantModules();
Q_INVOKABLE QAction *action(const QString &name) const;
// QML doesn't understand QIcon, otherwise we could get it from the QAction itself
Q_INVOKABLE QString actionIconName(const QString &name) const;
Q_INVOKABLE QString actionIconName(const QAction *action) const;
Q_INVOKABLE void showActionMenu(const QPoint &position);
Q_INVOKABLE void loadModule(const QModelIndex &activeModule, const QStringList &args = QStringList());
/**
* Helper function to move focus to the next/previous QQuickWidget
*/
Q_INVOKABLE void focusNext();
Q_INVOKABLE void focusPrevious();
void setStartupModule(const QString &startupModule);
QString startupModule() const;
void setStartupModuleArgs(const QStringList &startupModuleArgs);
QStringList startupModuleArgs() const;
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
private Q_SLOTS:
void moduleLoaded();
void updateDefaults();
void initWidget();
private:
void initPlaceHolderWidget();
void updateModelMenuItem(MenuItem *item);
void updateCategoryModel(const QModelIndex &categoryIdx);
void refreshDefaults();
void setActionMenuVisible(bool visible);
MenuItem *rootItem() const;
MenuItem *homeItem() const;
Q_SIGNALS:
void activeCategoryRowChanged();
void activeSubCategoryRowChanged();
void activeSearchRowChanged();
void widthChanged();
void actionMenuVisibleChanged();
void headerHeightChanged();
void devicePixelRatioChanged();
void defaultsIndicatorsVisibleChanged();
void viewChanged(bool state);
private:
class Private;
Private *const d;
};
#endif
|