From 6d726bb10386b3d7f5481d41b735ec06cb2163ad Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 9 Jan 2018 09:35:59 +0100 Subject: Install composer/converations/people as separate views and load them dynamically. --- framework/qml/LoginAccount.qml | 4 ++- framework/src/extensionmodel.cpp | 63 +++++++++++++++++++++++++++++++++++----- framework/src/extensionmodel.h | 14 +++++++-- 3 files changed, 70 insertions(+), 11 deletions(-) (limited to 'framework') diff --git a/framework/qml/LoginAccount.qml b/framework/qml/LoginAccount.qml index f02050ae..261746d5 100644 --- a/framework/qml/LoginAccount.qml +++ b/framework/qml/LoginAccount.qml @@ -26,10 +26,12 @@ Item { property string accountId property bool canRemove: true + signal done() + function login() { loader.item.login() Kube.Fabric.postMessage(Kube.Messages.synchronize, {"accountId": loader.item.accountIdentifier}); - Kube.Fabric.postMessage(Kube.Messages.componentDone, {}) + root.done() } Kube.AccountFactory { diff --git a/framework/src/extensionmodel.cpp b/framework/src/extensionmodel.cpp index f64a0e17..e3fab7d8 100644 --- a/framework/src/extensionmodel.cpp +++ b/framework/src/extensionmodel.cpp @@ -22,12 +22,17 @@ #include #include #include +#include +#include using namespace Kube; ExtensionModel::ExtensionModel(QObject *parent) : QSortFilterProxyModel(parent) { + setDynamicSortFilter(true); + sort(0, Qt::DescendingOrder); + setFilterCaseSensitivity(Qt::CaseInsensitive); QTimer::singleShot(0, this, &ExtensionModel::load); } @@ -36,8 +41,7 @@ QHash ExtensionModel::roleNames() const return { {Name, "name"}, {Tooltip, "tooltip"}, - {Icon, "icon"}, - {Source, "source"} + {Icon, "icon"} }; } @@ -48,21 +52,55 @@ void ExtensionModel::load() auto engine = qmlEngine(this); Q_ASSERT(engine); for (const auto &path : engine->importPathList()) { - QDir dir{path + "/org/kube/viewextensions"}; + QDir dir{path + "/org/kube/views"}; for (const auto &pluginName : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { - auto viewPath = dir.path() + pluginName + "/View.qml"; - qWarning() << "Plugin path: " << dir.path() + pluginName + "/View.qml"; + const auto pluginPath = dir.path() + "/" + pluginName; + mPaths.insert(pluginName, pluginPath); auto item = new QStandardItem; - item->setData(viewPath, Source); item->setData(pluginName, Name); item->setData(pluginName, Tooltip); - item->setData("document-decrypt", Icon); + item->setData("kdocumentinfo-inverted", Icon); + + if (QFileInfo::exists(pluginPath + "/metadata.json")) { + QFile file{pluginPath + "/metadata.json"}; + file.open(QIODevice::ReadOnly); + auto json = QJsonDocument::fromJson(file.readAll()); + auto map = json.object().toVariantMap(); + item->setData(map.value("icon").toString(), Icon); + item->setData(map.value("tooltip").toString(), Tooltip); + if (map.value("hidden", false).toBool()) { + delete item; + continue; + } + } + model->appendRow(item); } } setSourceModel(model); } +QString ExtensionModel::findSource(const QString &extensionName, const QString &sourceName) +{ + if (mPaths.isEmpty()) { + load(); + } + return mPaths.value(extensionName) + "/" + sourceName; +} + +void ExtensionModel::setSortOrder(const QVariantList &order) +{ + mSortOrder.clear(); + for (const auto &e : order) { + mSortOrder << e.toString(); + } +} + +QVariantList ExtensionModel::sortOrder() const +{ + return {}; +} + QVariant ExtensionModel::data(const QModelIndex &idx, int role) const { return QSortFilterProxyModel::data(idx, role); @@ -70,5 +108,14 @@ QVariant ExtensionModel::data(const QModelIndex &idx, int role) const bool ExtensionModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { - return QSortFilterProxyModel::lessThan(left, right); + auto leftIndex = mSortOrder.indexOf(left.data(Name).toString()); + auto rightIndex = mSortOrder.indexOf(right.data(Name).toString()); + if (leftIndex >= 0 && rightIndex >= 0) { + //Higher index is less than + return leftIndex > rightIndex; + } + if (leftIndex < 0 && rightIndex < 0) { + return QSortFilterProxyModel::lessThan(left, right); + } + return leftIndex < rightIndex; } diff --git a/framework/src/extensionmodel.h b/framework/src/extensionmodel.h index 6e984005..8e5580f7 100644 --- a/framework/src/extensionmodel.h +++ b/framework/src/extensionmodel.h @@ -27,6 +27,8 @@ namespace Kube { class ExtensionModel : public QSortFilterProxyModel { Q_OBJECT + + Q_PROPERTY(QVariantList sortOrder WRITE setSortOrder READ sortOrder CONSTANT) public: ExtensionModel(QObject *parent = Q_NULLPTR); @@ -39,14 +41,22 @@ public: enum Roles { Name = Qt::UserRole + 1, Tooltip, - Icon, - Source + Icon }; QHash roleNames() const Q_DECL_OVERRIDE; + void setSortOrder(const QVariantList &order); + QVariantList sortOrder() const; + + Q_INVOKABLE QString findSource(const QString &extensionName, const QString &sourceName); + private slots: void load(); + +private: + QStringList mSortOrder; + QHash mPaths; }; } -- cgit v1.2.3