diff --git a/containments/homescreens/halcyon/application.h b/containments/homescreens/halcyon/application.h index fb92bb4b..2292bb5d 100644 --- a/containments/homescreens/halcyon/application.h +++ b/containments/homescreens/halcyon/application.h @@ -15,6 +15,9 @@ #include #include +/** + * @short Object that represents an application. + */ class Application : public QObject { Q_OBJECT diff --git a/containments/homescreens/halcyon/applicationfolder.cpp b/containments/homescreens/halcyon/applicationfolder.cpp index 1dddcca6..cfe6517e 100644 --- a/containments/homescreens/halcyon/applicationfolder.cpp +++ b/containments/homescreens/halcyon/applicationfolder.cpp @@ -5,7 +5,9 @@ #include -ApplicationFolder::ApplicationFolder(QObject *parent) +ApplicationFolder::ApplicationFolder(QObject *parent, QString name) + : QObject{parent} + , m_name{name} { } @@ -19,8 +21,7 @@ ApplicationFolder *ApplicationFolder::fromJson(QJsonObject &obj, QObject *parent } } - ApplicationFolder *folder = new ApplicationFolder(parent); - folder->setName(name); + ApplicationFolder *folder = new ApplicationFolder(parent, name); folder->setApplications(apps); return folder; } @@ -50,6 +51,7 @@ void ApplicationFolder::setName(QString &name) { m_name = name; Q_EMIT nameChanged(); + Q_EMIT saveRequested(); } QList ApplicationFolder::applications() @@ -61,4 +63,31 @@ void ApplicationFolder::setApplications(QList applications) { m_applications = applications; Q_EMIT applicationsChanged(); + Q_EMIT saveRequested(); +} + +void ApplicationFolder::addApp(const QString &storageId, int row) +{ + if (row < 0 || row > m_applications.size()) { + return; + } + + if (KService::Ptr service = KService::serviceByStorageId(storageId)) { + Application *app = new Application(this, service); + m_applications.insert(row, app); + Q_EMIT applicationsChanged(); + Q_EMIT saveRequested(); + } +} + +void ApplicationFolder::removeApp(int row) +{ + if (row < 0 || row >= m_applications.size()) { + return; + } + + m_applications[row]->deleteLater(); + m_applications.removeAt(row); + Q_EMIT applicationsChanged(); + Q_EMIT saveRequested(); } diff --git a/containments/homescreens/halcyon/applicationfolder.h b/containments/homescreens/halcyon/applicationfolder.h index 732ed232..b817c343 100644 --- a/containments/homescreens/halcyon/applicationfolder.h +++ b/containments/homescreens/halcyon/applicationfolder.h @@ -15,6 +15,9 @@ #include #include +/** + * @short Object that represents an application folder on the main page. + */ class ApplicationFolder : public QObject { Q_OBJECT @@ -22,7 +25,7 @@ class ApplicationFolder : public QObject Q_PROPERTY(QList applications READ applications NOTIFY applicationsChanged) public: - ApplicationFolder(QObject *parent = nullptr); + ApplicationFolder(QObject *parent = nullptr, QString name = QString{}); static ApplicationFolder *fromJson(QJsonObject &obj, QObject *parent); QJsonObject toJson(); @@ -33,9 +36,13 @@ public: QList applications(); void setApplications(QList applications); + Q_INVOKABLE void addApp(const QString &storageId, int row); + Q_INVOKABLE void removeApp(int row); + Q_SIGNALS: void nameChanged(); void applicationsChanged(); + void saveRequested(); private: QString m_name; diff --git a/containments/homescreens/halcyon/applicationlistmodel.h b/containments/homescreens/halcyon/applicationlistmodel.h index 8d967384..13f95e2b 100644 --- a/containments/homescreens/halcyon/applicationlistmodel.h +++ b/containments/homescreens/halcyon/applicationlistmodel.h @@ -13,7 +13,7 @@ #include /** - * @short The base application list, used directly by the app drawer. + * @short The base application list, used directly by the full app list page. */ class ApplicationListModel : public QAbstractListModel { diff --git a/containments/homescreens/halcyon/pinnedmodel.cpp b/containments/homescreens/halcyon/pinnedmodel.cpp index 785c4955..046bc1cd 100644 --- a/containments/homescreens/halcyon/pinnedmodel.cpp +++ b/containments/homescreens/halcyon/pinnedmodel.cpp @@ -44,7 +44,7 @@ QHash PinnedModel::roleNames() const void PinnedModel::addApp(const QString &storageId, int row) { - if (row < 0 && row > m_applications.size()) { + if (row < 0 || row > m_applications.size()) { return; } @@ -53,7 +53,7 @@ void PinnedModel::addApp(const QString &storageId, int row) beginInsertRows(QModelIndex(), row, row); m_applications.insert(row, app); - m_folders.insert(0, nullptr); // maintain indicies + m_folders.insert(row, nullptr); // maintain indicies endInsertRows(); save(); @@ -62,7 +62,7 @@ void PinnedModel::addApp(const QString &storageId, int row) void PinnedModel::removeApp(int row) { - if (row < 0 && row >= m_applications.size()) { + if (row < 0 || row >= m_applications.size()) { return; } @@ -75,6 +75,37 @@ void PinnedModel::removeApp(int row) save(); } +void PinnedModel::addFolder(QString name, int row) +{ + if (row < 0 || row > m_applications.size()) { + return; + } + + ApplicationFolder *folder = new ApplicationFolder(this, name); + connect(folder, &ApplicationFolder::saveRequested, this, &PinnedModel::save); + + beginInsertRows(QModelIndex(), row, row); + m_applications.insert(row, nullptr); + m_folders.insert(row, folder); + endInsertRows(); + + save(); +} + +void PinnedModel::removeFolder(int row) +{ + if (row < 0 || row >= m_applications.size()) { + return; + } + + beginRemoveRows(QModelIndex(), row, row); + m_applications.removeAt(row); + m_folders.removeAt(row); + endRemoveRows(); + + save(); +} + void PinnedModel::load() { if (!m_applet) { @@ -99,6 +130,8 @@ void PinnedModel::load() } else if (obj[QStringLiteral("type")].toString() == "folder") { // read folder ApplicationFolder *folder = ApplicationFolder::fromJson(obj, this); + connect(folder, &ApplicationFolder::saveRequested, this, &PinnedModel::save); + if (folder) { m_applications.append(nullptr); m_folders.append(folder); diff --git a/containments/homescreens/halcyon/pinnedmodel.h b/containments/homescreens/halcyon/pinnedmodel.h index 4dd6af83..0ccf9216 100644 --- a/containments/homescreens/halcyon/pinnedmodel.h +++ b/containments/homescreens/halcyon/pinnedmodel.h @@ -19,6 +19,9 @@ #include #include +/** + * @short The applications and folders model on the main page. + */ class PinnedModel : public QAbstractListModel { Q_OBJECT @@ -35,6 +38,8 @@ public: Q_INVOKABLE void addApp(const QString &storageId, int row); Q_INVOKABLE void removeApp(int row); + Q_INVOKABLE void addFolder(QString name, int row); + Q_INVOKABLE void removeFolder(int row); Q_INVOKABLE void load(); void save();