diff --git a/discover/DiscoverDeclarativePlugin.cpp b/discover/DiscoverDeclarativePlugin.cpp --- a/discover/DiscoverDeclarativePlugin.cpp +++ b/discover/DiscoverDeclarativePlugin.cpp @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -60,7 +60,7 @@ qmlRegisterType("org.kde.discover", 2, 0, "ReviewsModel"); qmlRegisterType("org.kde.discover", 2, 0, "ApplicationAddonsModel"); qmlRegisterType("org.kde.discover", 2, 0, "ScreenshotsModel"); - qmlRegisterType("org.kde.discover", 2, 0, "MessageActionsModel"); + qmlRegisterType("org.kde.discover", 2, 0, "ActionsModel"); qmlRegisterType("org.kde.discover", 2, 0, "UpdateModel"); qmlRegisterUncreatableType("org.kde.discover", 2, 0, "QAction", QStringLiteral("Use QQC Action")); @@ -73,4 +73,5 @@ qmlRegisterType(); qmlRegisterType(); qmlProtectModule("org.kde.discover", 2); + qRegisterMetaType>(); } diff --git a/discover/qml/SourcesPage.qml b/discover/qml/SourcesPage.qml --- a/discover/qml/SourcesPage.qml +++ b/discover/qml/SourcesPage.qml @@ -23,27 +23,6 @@ target: sourceBackend onPassiveMessage: window.showPassiveNotification(message) } - readonly property var b: AddSourceDialog { - id: addSourceDialog - source: sourceBackend - } - - readonly property var c: MenuItem { - id: menuItem - text: sourceBackend.name - onTriggered: { - try { - addSourceDialog.open() - addSourceDialog.visible = true - } catch (e) { - console.log("error loading dialog:", e) - } - } - } - - Component.onCompleted: { - sourcesMenu.insertItem(0, menuItem) - } } onObjectAdded: { everySourceModel.addSourceModel(object.sourcesModel) @@ -63,13 +42,84 @@ } currentIndex: -1 - Menu { id: sourcesMenu } - section { property: "statusTip" - delegate: Kirigami.Heading { - leftPadding: Kirigami.Units.largeSpacing - text: section + delegate: RowLayout { + anchors { + right: parent.right + left: parent.left + } + Kirigami.Heading { + Layout.fillWidth: true + leftPadding: Kirigami.Units.largeSpacing + text: settingsButton.isDefault ? i18n("%1 (Default)", section) : section + } + ToolButton { + id: settingsButton + iconName: "preferences-other" + readonly property QtObject backend: SourcesModel.backendForSection(section) + readonly property bool isDefault: ResourcesModel.currentApplicationBackend == settingsButton.backend.resourcesBackend + visible: backend + AddSourceDialog { + id: addSourceDialog + source: settingsButton.backend + } + + menu: Menu { + id: settingsMenu + MenuItem { + enabled: !settingsButton.isDefault + text: i18n("Make default") + onTriggered: ResourcesModel.currentApplicationBackend = settingsButton.backend.resourcesBackend + } + + MenuItem { + text: i18n("Add Source") + + onTriggered: addSourceDialog.open() + } + + MenuSeparator { + visible: messageActionsInst.count>0 + } + + Instantiator { + id: messageActionsInst + model: ActionsModel { + actions: settingsButton.backend ? settingsButton.backend.resourcesBackend.messageActions : null + } + delegate: MenuItem { + action: ActionBridge { action: model.action } + } + onObjectAdded: { + settingsMenu.insertItem(index, object) + } + onObjectRemoved: { + object.destroy() + } + } + + MenuSeparator { + visible: backendActionsInst.count>0 + } + + Instantiator { + id: backendActionsInst + model: ActionsModel { + actions: settingsButton.backend ? settingsButton.backend.actions : null + } + delegate: MenuItem { + action: ActionBridge { action: model.action } + } + onObjectAdded: { + settingsMenu.insertItem(index, object) + } + onObjectRemoved: { + object.destroy() + } + } + } + } } } @@ -90,43 +140,6 @@ Layout.fillWidth: true } - ToolButton { - text: i18n("Application Sources") - tooltip: i18n("Allows to choose the source that will be used for browsing applications") - menu: Menu { - id: backendsMenu - } - enabled: menu.items.length>0 - - ExclusiveGroup { - id: select - } - - Instantiator { - model: ResourcesModel.applicationBackends - delegate: MenuItem { - text: modelData.displayName - checkable: true - checked: ResourcesModel.currentApplicationBackend == modelData - onTriggered: ResourcesModel.currentApplicationBackend = modelData - exclusiveGroup: select - } - onObjectAdded: { - backendsMenu.insertItem(index, object) - } - onObjectRemoved: { - object.destroy() - } - } - } - - ToolButton { -// iconName: "list-add" - text: i18n("Add Source") - - tooltip: text - menu: sourcesMenu - } Repeater { model: SourcesModel.actions @@ -148,27 +161,6 @@ } } - ToolButton { - text: i18n("More...") - menu: Menu { - id: actionsMenu - } - enabled: menu.items.length>0 - - Instantiator { - model: MessageActionsModel {} - delegate: MenuItem { - action: ActionBridge { action: model.action } - } - onObjectAdded: { - actionsMenu.insertItem(index, object) - } - onObjectRemoved: { - object.destroy() - } - } - } - ToolButton { text: i18n("Help...") menu: Menu { diff --git a/libdiscover/MessageActionsModel.h b/libdiscover/ActionsModel.h rename from libdiscover/MessageActionsModel.h rename to libdiscover/ActionsModel.h --- a/libdiscover/MessageActionsModel.h +++ b/libdiscover/ActionsModel.h @@ -18,37 +18,41 @@ * along with this program. If not, see . * ***************************************************************************/ -#ifndef MESSAGEACTIONSMODEL_H -#define MESSAGEACTIONSMODEL_H +#ifndef ACTIONSMODEL_H +#define ACTIONSMODEL_H #include #include #include "discovercommon_export.h" class QAction; -class DISCOVERCOMMON_EXPORT MessageActionsModel : public QAbstractListModel, public QQmlParserStatus +class DISCOVERCOMMON_EXPORT ActionsModel : public QAbstractListModel { Q_OBJECT - Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QList actions READ actions WRITE setActions NOTIFY actionsChanged) Q_PROPERTY(int filterPriority READ filterPriority WRITE setFilterPriority) public: - explicit MessageActionsModel(QObject* parent = nullptr); + explicit ActionsModel(QObject* parent = nullptr); QHash roleNames() const override; QVariant data(const QModelIndex& index, int role) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; void setFilterPriority(int p); int filterPriority() const; - void classBegin() override {} - void componentComplete() override; + void setActions(const QList& actions); + QList actions() const { return m_actions; } + + Q_SIGNALS: + void actionsChanged(const QList& actions); private: void reload(); QList m_actions; + QList m_filteredActions; int m_priority; }; diff --git a/libdiscover/MessageActionsModel.cpp b/libdiscover/ActionsModel.cpp rename from libdiscover/MessageActionsModel.cpp rename to libdiscover/ActionsModel.cpp --- a/libdiscover/MessageActionsModel.cpp +++ b/libdiscover/ActionsModel.cpp @@ -18,63 +18,69 @@ * along with this program. If not, see . * ***************************************************************************/ -#include "MessageActionsModel.h" +#include "ActionsModel.h" #include "resources/ResourcesModel.h" #include "utils.h" #include -MessageActionsModel::MessageActionsModel(QObject* parent) +ActionsModel::ActionsModel(QObject* parent) : QAbstractListModel(parent) , m_priority(-1) { - connect(ResourcesModel::global(), &ResourcesModel::backendsChanged, this, &MessageActionsModel::reload); + connect(ResourcesModel::global(), &ResourcesModel::backendsChanged, this, &ActionsModel::reload); } -QHash< int, QByteArray > MessageActionsModel::roleNames() const +QHash< int, QByteArray > ActionsModel::roleNames() const { return { { Qt::UserRole, "action" }}; } -QVariant MessageActionsModel::data(const QModelIndex& index, int role) const +QVariant ActionsModel::data(const QModelIndex& index, int role) const { if(!index.isValid() || role!=Qt::UserRole) return QVariant(); return QVariant::fromValue(m_actions[index.row()]); } -int MessageActionsModel::rowCount(const QModelIndex& parent) const +int ActionsModel::rowCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : m_actions.count(); } -void MessageActionsModel::reload() +void ActionsModel::setActions(const QList& actions) { - auto actions = ResourcesModel::global()->messageActions(); + if (m_actions == actions) { + return; + } + + reload(); + Q_EMIT actionsChanged(m_actions); +} + +void ActionsModel::reload() +{ + auto actions = m_filteredActions; if (m_priority>=0) { actions = kFilter>(actions, [this](QAction* action){ return action->priority() == m_priority; }); } + actions = kFilter>(actions, [](QAction* action){ return action->isVisible(); }); if (actions == m_actions) return; beginResetModel(); m_actions = actions; endResetModel(); } -int MessageActionsModel::filterPriority() const +int ActionsModel::filterPriority() const { return m_priority; } -void MessageActionsModel::setFilterPriority(int p) +void ActionsModel::setFilterPriority(int p) { if (m_priority != p) { m_priority = p; reload(); } } - -void MessageActionsModel::componentComplete() -{ - reload(); -} diff --git a/libdiscover/CMakeLists.txt b/libdiscover/CMakeLists.txt --- a/libdiscover/CMakeLists.txt +++ b/libdiscover/CMakeLists.txt @@ -30,7 +30,7 @@ resources/AbstractSourcesBackend.cpp resources/StoredResultsStream.cpp CachedNetworkAccessManager.cpp - MessageActionsModel + ActionsModel.cpp DiscoverBackendsFactory.cpp ScreenshotsModel.cpp ApplicationAddonsModel.cpp diff --git a/libdiscover/backends/DummyBackend/DummySourcesBackend.h b/libdiscover/backends/DummyBackend/DummySourcesBackend.h --- a/libdiscover/backends/DummyBackend/DummySourcesBackend.h +++ b/libdiscover/backends/DummyBackend/DummySourcesBackend.h @@ -27,7 +27,7 @@ class DummySourcesBackend : public AbstractSourcesBackend { public: - explicit DummySourcesBackend(QObject* parent); + explicit DummySourcesBackend(AbstractResourcesBackend * parent); QAbstractItemModel* sources() override; bool addSource(const QString& id) override; diff --git a/libdiscover/backends/DummyBackend/DummySourcesBackend.cpp b/libdiscover/backends/DummyBackend/DummySourcesBackend.cpp --- a/libdiscover/backends/DummyBackend/DummySourcesBackend.cpp +++ b/libdiscover/backends/DummyBackend/DummySourcesBackend.cpp @@ -22,7 +22,7 @@ #include #include -DummySourcesBackend::DummySourcesBackend(QObject* parent) +DummySourcesBackend::DummySourcesBackend(AbstractResourcesBackend * parent) : AbstractSourcesBackend(parent) , m_sources(new QStandardItemModel(this)) , m_testAction(new QAction(QIcon::fromTheme(QStringLiteral("kalgebra")), QStringLiteral("DummyAction"), this)) diff --git a/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.h b/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.h --- a/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.h +++ b/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.h @@ -33,7 +33,7 @@ class FlatpakSourcesBackend : public AbstractSourcesBackend { public: - explicit FlatpakSourcesBackend(const QVector& installations, QObject *parent); + explicit FlatpakSourcesBackend(const QVector& installations, AbstractResourcesBackend *parent); QAbstractItemModel* sources() override; bool addSource(const QString &id) override; diff --git a/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.cpp b/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.cpp --- a/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.cpp +++ b/libdiscover/backends/FlatpakBackend/FlatpakSourcesBackend.cpp @@ -44,7 +44,7 @@ FlatpakInstallation *m_installation; }; -FlatpakSourcesBackend::FlatpakSourcesBackend(const QVector &installations, QObject* parent) +FlatpakSourcesBackend::FlatpakSourcesBackend(const QVector &installations, AbstractResourcesBackend * parent) : AbstractSourcesBackend(parent) , m_preferredInstallation(installations.constFirst()) , m_sources(new QStandardItemModel(this)) diff --git a/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.h b/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.h --- a/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.h +++ b/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.h @@ -31,7 +31,7 @@ { Q_OBJECT public: - PackageKitSourcesBackend(QObject* parent); + PackageKitSourcesBackend(AbstractResourcesBackend* parent); QString name() const override; QString idDescription() override; diff --git a/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.cpp b/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.cpp --- a/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.cpp +++ b/libdiscover/backends/PackageKitBackend/PackageKitSourcesBackend.cpp @@ -24,6 +24,7 @@ #include #include #include +#include class PKSourcesModel : public QStandardItemModel { @@ -67,7 +68,7 @@ PackageKitSourcesBackend* m_backend; }; -PackageKitSourcesBackend::PackageKitSourcesBackend(QObject* parent) +PackageKitSourcesBackend::PackageKitSourcesBackend(AbstractResourcesBackend* parent) : AbstractSourcesBackend(parent) , m_sources(new PKSourcesModel(this)) { @@ -77,7 +78,7 @@ QString PackageKitSourcesBackend::name() const { - return i18n("Software Management"); + return resourcesBackend()->displayName(); } QString PackageKitSourcesBackend::idDescription() diff --git a/libdiscover/resources/AbstractResourcesBackend.h b/libdiscover/resources/AbstractResourcesBackend.h --- a/libdiscover/resources/AbstractResourcesBackend.h +++ b/libdiscover/resources/AbstractResourcesBackend.h @@ -77,6 +77,7 @@ Q_PROPERTY(AbstractReviewsBackend* reviewsBackend READ reviewsBackend CONSTANT) Q_PROPERTY(int updatesCount READ updatesCount NOTIFY updatesCountChanged) Q_PROPERTY(bool isFetching READ isFetching NOTIFY fetchingChanged) + Q_PROPERTY(QList messageActions READ messageActions CONSTANT) public: /** * Constructs an AbstractResourcesBackend diff --git a/libdiscover/resources/AbstractSourcesBackend.h b/libdiscover/resources/AbstractSourcesBackend.h --- a/libdiscover/resources/AbstractSourcesBackend.h +++ b/libdiscover/resources/AbstractSourcesBackend.h @@ -26,14 +26,18 @@ class QAction; class QAbstractItemModel; +class AbstractResourcesBackend; + class DISCOVERCOMMON_EXPORT AbstractSourcesBackend : public QObject { Q_OBJECT + Q_PROPERTY(AbstractResourcesBackend* resourcesBackend READ resourcesBackend CONSTANT) Q_PROPERTY(QAbstractItemModel* sources READ sources CONSTANT) Q_PROPERTY(QString name READ name CONSTANT) Q_PROPERTY(QString idDescription READ idDescription CONSTANT) + Q_PROPERTY(QList actions READ actions CONSTANT) public: - explicit AbstractSourcesBackend(QObject* parent); + explicit AbstractSourcesBackend(AbstractResourcesBackend* parent); ~AbstractSourcesBackend() override; enum Roles { @@ -51,6 +55,8 @@ virtual QAbstractItemModel* sources() = 0; virtual QList actions() const = 0; + AbstractResourcesBackend* resourcesBackend() const; + Q_SIGNALS: void passiveMessage(const QString &message); }; diff --git a/libdiscover/resources/AbstractSourcesBackend.cpp b/libdiscover/resources/AbstractSourcesBackend.cpp --- a/libdiscover/resources/AbstractSourcesBackend.cpp +++ b/libdiscover/resources/AbstractSourcesBackend.cpp @@ -19,9 +19,16 @@ ***************************************************************************/ #include "AbstractSourcesBackend.h" +#include "AbstractResourcesBackend.h" -AbstractSourcesBackend::AbstractSourcesBackend(QObject* parent) +AbstractSourcesBackend::AbstractSourcesBackend(AbstractResourcesBackend* parent) : QObject(parent) {} AbstractSourcesBackend::~AbstractSourcesBackend() = default; + +AbstractResourcesBackend * AbstractSourcesBackend::resourcesBackend() const +{ + return dynamic_cast(parent()); +} + diff --git a/libdiscover/resources/SourcesModel.h b/libdiscover/resources/SourcesModel.h --- a/libdiscover/resources/SourcesModel.h +++ b/libdiscover/resources/SourcesModel.h @@ -32,7 +32,6 @@ { Q_OBJECT Q_PROPERTY(int count READ rowCount NOTIFY sourcesChanged) - Q_PROPERTY(QList actions READ actions NOTIFY sourcesChanged) public: enum Roles { SourceBackend = Qt::UserRole+1 @@ -47,7 +46,8 @@ void addSourcesBackend(AbstractSourcesBackend* sources); QHash roleNames() const override; - QList actions() const; + public Q_SLOTS: + QObject* backendForSection(const QString &status) const; Q_SIGNALS: void sourcesChanged(); diff --git a/libdiscover/resources/SourcesModel.cpp b/libdiscover/resources/SourcesModel.cpp --- a/libdiscover/resources/SourcesModel.cpp +++ b/libdiscover/resources/SourcesModel.cpp @@ -83,12 +83,14 @@ return parent.isValid() ? 0 : m_sources.count(); } -QList SourcesModel::actions() const +QObject * SourcesModel::backendForSection(const QString& status) const { - QList ret; + AbstractSourcesBackend* ret = nullptr; for(AbstractSourcesBackend* b: m_sources) { - foreach(QAction* action, b->actions()) - ret.append(action); + if (b->name() == status) { + ret = b; + break; + } } return ret; }