Commit 8438027d authored by Devin Lin's avatar Devin Lin 🎨
Browse files

homescreens/halcyon: Add folder backend

parent ef455461
Pipeline #192625 passed with stage
in 1 minute and 3 seconds
......@@ -15,6 +15,9 @@
#include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
/**
* @short Object that represents an application.
*/
class Application : public QObject
{
Q_OBJECT
......
......@@ -5,7 +5,9 @@
#include <QJsonArray>
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<Application *> ApplicationFolder::applications()
......@@ -61,4 +63,31 @@ void ApplicationFolder::setApplications(QList<Application *> 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();
}
......@@ -15,6 +15,9 @@
#include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
/**
* @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<Application *> 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<Application *> applications();
void setApplications(QList<Application *> 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;
......
......@@ -13,7 +13,7 @@
#include <QSet>
/**
* @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
{
......
......@@ -44,7 +44,7 @@ QHash<int, QByteArray> 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);
......
......@@ -19,6 +19,9 @@
#include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
/**
* @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();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment