新增文件夹界面后端

This commit is contained in:
hewenfei 2023-03-28 17:25:12 +08:00
parent 634688f433
commit c9ab90589d
7 changed files with 227 additions and 16 deletions

View File

@ -85,6 +85,7 @@ set(SOURCE_FILES
src/model/label-model.cpp src/model/label-model.h src/model/label-model.cpp src/model/label-model.h
src/model/app-group-model.cpp src/model/app-group-model.h src/model/app-group-model.cpp src/model/app-group-model.h
src/model/model-manager.cpp src/model/model-manager.h src/model/model-manager.cpp src/model/model-manager.h
src/model/folder-model.cpp src/model/folder-model.h
src/settings/settings.cpp src/settings/settings.h src/settings/settings.cpp src/settings/settings.h
src/uiconfig/color-helper.cpp src/uiconfig/color-helper.h src/uiconfig/color-helper.cpp src/uiconfig/color-helper.h
src/uiconfig/theme-palette.cpp src/uiconfig/theme-palette.h src/uiconfig/theme-palette.cpp src/uiconfig/theme-palette.h
@ -115,6 +116,7 @@ set(QRC_FILES qml/qml.qrc res/res.qrc)
# desktop file # desktop file
set(DESKTOP_FILE data/ukui-menu.desktop) set(DESKTOP_FILE data/ukui-menu.desktop)
set(GSETTING_FILE data/org.ukui.menu.settings.gschema.xml) set(GSETTING_FILE data/org.ukui.menu.settings.gschema.xml)
set(GLOBAL_CONFIG_FILE data/ukui-menu-global-config.conf)
# data files # data files
#set(DATA_FILES data/xxx) #set(DATA_FILES data/xxx)
# extension # extension
@ -157,4 +159,5 @@ install(FILES ${QM_FILES} DESTINATION "${UKUI_MENU_TRANSLATION_DIR}")
# desktop # desktop
install(FILES ${DESKTOP_FILE} DESTINATION "/etc/xdg/autostart") install(FILES ${DESKTOP_FILE} DESTINATION "/etc/xdg/autostart")
install(FILES ${GSETTING_FILE} DESTINATION "/usr/share/glib-2.0/schemas") install(FILES ${GSETTING_FILE} DESTINATION "/usr/share/glib-2.0/schemas")
install(FILES ${GLOBAL_CONFIG_FILE} DESTINATION "${UKUI_MENU_DATA_DIR}")
#install(FILES ${EXTENSION_IFACE_QML_FILES} DESTINATION "${UKUI_MENU_EXTENSION_IFACE_QML_DIR}") #install(FILES ${EXTENSION_IFACE_QML_FILES} DESTINATION "${UKUI_MENU_EXTENSION_IFACE_QML_DIR}")

View File

@ -18,6 +18,7 @@
#include "app-folder-helper.h" #include "app-folder-helper.h"
#include "menu-manager.h" #include "menu-manager.h"
#include "app-data-manager.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonArray> #include <QJsonArray>
@ -96,7 +97,7 @@ void FolderMenuProvider::folderMenuForNormal(QObject *parent, const QString &app
QList<Folder> folders = AppFolderHelper::instance()->folderData(); QList<Folder> folders = AppFolderHelper::instance()->folderData();
for (const Folder &folder : folders) { for (const Folder &folder : folders) {
QString name = QObject::tr("Add to %1").arg(folder.getName()); QString name = QObject::tr("Add to \"%1\"").arg(folder.getName());
QAction* act = new QAction(name, subMenu); QAction* act = new QAction(name, subMenu);
QObject::connect(act, &QAction::triggered, parent, [appId, folder] { QObject::connect(act, &QAction::triggered, parent, [appId, folder] {
AppFolderHelper::instance()->addAppToFolder(appId, folder.getId()); AppFolderHelper::instance()->addAppToFolder(appId, folder.getId());
@ -183,8 +184,7 @@ void AppFolderHelper::addAppToFolder(const QString &appId, const int &folderId)
} }
forceSync(); forceSync();
Q_EMIT folderDataChanged(folderId);
Q_EMIT folderDataChanged();
} }
void AppFolderHelper::addAppToNewFolder(const QString &appId, const QString &folderName) void AppFolderHelper::addAppToNewFolder(const QString &appId, const QString &folderName)
@ -206,7 +206,7 @@ void AppFolderHelper::addAppToNewFolder(const QString &appId, const QString &fol
folder.apps.append(appId); folder.apps.append(appId);
insertFolder(folder); insertFolder(folder);
Q_EMIT folderDataChanged(); Q_EMIT folderAdded(folder.id);
} }
void AppFolderHelper::removeAppFromFolder(const QString &appId, const int &folderId) void AppFolderHelper::removeAppFromFolder(const QString &appId, const int &folderId)
@ -231,22 +231,24 @@ void AppFolderHelper::removeAppFromFolder(const QString &appId, const int &folde
deleteFolder(folderId); deleteFolder(folderId);
} }
Q_EMIT folderDataChanged(); Q_EMIT folderDataChanged(folderId);
} }
bool AppFolderHelper::deleteFolder(const int& folderId) bool AppFolderHelper::deleteFolder(const int& folderId)
{
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (!m_folders.contains(folderId)) { if (!m_folders.contains(folderId)) {
return false; return false;
} }
if (m_folders.remove(folderId)) { if (!m_folders.remove(folderId)) {
Q_EMIT folderDataChanged(); return false;
return true; }
} }
return false; Q_EMIT folderDeleted(folderId);
return true;
} }
void AppFolderHelper::renameFolder(const int &folderId, const QString &folderName) void AppFolderHelper::renameFolder(const int &folderId, const QString &folderName)
@ -259,7 +261,7 @@ void AppFolderHelper::renameFolder(const int &folderId, const QString &folderNam
m_folders[folderId].name = folderName; m_folders[folderId].name = folderName;
} }
Q_EMIT folderDataChanged(); Q_EMIT folderDataChanged(folderId);
} }
QList<Folder> AppFolderHelper::folderData() QList<Folder> AppFolderHelper::folderData()
@ -298,6 +300,20 @@ bool AppFolderHelper::searchFolderByAppName(const QString &appId, Folder &folder
return false; return false;
} }
bool AppFolderHelper::containFolder(int folderId)
{
QMutexLocker locker(&m_mutex);
return m_folders.contains(folderId);
}
bool AppFolderHelper::containApp(const QString &appId)
{
QMutexLocker locker(&m_mutex);
return std::any_of(m_folders.constBegin(), m_folders.constEnd(), [appId] (const Folder &folder) {
return folder.apps.contains(appId);
});
}
void AppFolderHelper::forceSync() void AppFolderHelper::forceSync()
{ {
saveData(); saveData();
@ -384,4 +400,20 @@ void AppFolderHelper::saveData()
file.close(); file.close();
} }
QStringList AppFolderHelper::folderIcon(const Folder &folder)
{
// TODO: 使用绘图API生成图片
QStringList icons;
DataEntity app;
int count = qMin(folder.apps.count(), FOLDER_MAX_ICON_NUM);
for (int i = 0; i < count; ++i) {
if (AppDataManager::instance()->getApp(folder.apps.at(i), app)) {
icons.append(app.icon());
}
}
return icons;
}
} // UkuiMenu } // UkuiMenu

View File

@ -28,6 +28,8 @@
namespace UkuiMenu { namespace UkuiMenu {
#define FOLDER_MAX_ICON_NUM 16
class AppFolderHelper; class AppFolderHelper;
class Folder class Folder
@ -53,6 +55,7 @@ class AppFolderHelper : public QObject
Q_OBJECT Q_OBJECT
public: public:
static AppFolderHelper *instance(); static AppFolderHelper *instance();
static QStringList folderIcon(const Folder &folder);
~AppFolderHelper() override; ~AppFolderHelper() override;
AppFolderHelper(const AppFolderHelper& obj) = delete; AppFolderHelper(const AppFolderHelper& obj) = delete;
@ -64,6 +67,9 @@ public:
// xxxx // xxxx
bool searchFolder(const int& folderId, Folder &folder); bool searchFolder(const int& folderId, Folder &folder);
bool searchFolderByAppName(const QString& appId, Folder &folder); bool searchFolderByAppName(const QString& appId, Folder &folder);
bool containFolder(int folderId);
bool containApp(const QString& appId);
QList<Folder> folderData(); QList<Folder> folderData();
void addAppToFolder(const QString& appId, const int& folderId); void addAppToFolder(const QString& appId, const int& folderId);
@ -75,7 +81,9 @@ public:
void forceSync(); void forceSync();
Q_SIGNALS: Q_SIGNALS:
void folderDataChanged(); void folderAdded(int folderId);
void folderDeleted(int folderId);
void folderDataChanged(int folderId);
private: private:
AppFolderHelper(); AppFolderHelper();

108
src/model/folder-model.cpp Normal file
View File

@ -0,0 +1,108 @@
/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "folder-model.h"
#include "app-folder-helper.h"
#include "app-data-manager.h"
namespace UkuiMenu {
FolderModel::FolderModel(QObject *parent) : QAbstractListModel(parent)
{
connect(AppFolderHelper::instance(), &AppFolderHelper::folderDataChanged, this, &FolderModel::loadFolderData);
connect(AppFolderHelper::instance(), &AppFolderHelper::folderDeleted, this, [this] (int id) {
if (id == m_folderId) {
beginResetModel();
m_folderId = -1;
m_apps.clear();
endResetModel();
}
});
}
void FolderModel::setFolderId(const QString &folderId)
{
bool ok;
int id = folderId.toInt(&ok);
if (!ok) {
return;
}
loadFolderData(id);
}
void FolderModel::loadFolderData(int id)
{
Folder folder;
if (!AppFolderHelper::instance()->searchFolder(id, folder)) {
return;
}
beginResetModel();
m_folderId = id;
m_apps = folder.getApps();
endResetModel();
}
int FolderModel::rowCount(const QModelIndex &parent) const
{
return m_apps.count();
}
QVariant FolderModel::data(const QModelIndex &index, int role) const
{
int i = index.row();
if (i < 0 || i >= m_apps.size()) {
return {};
}
DataEntity app;
if (!AppDataManager::instance()->getApp(m_apps.at(i), app)) {
return {};
}
switch (role) {
case DataEntity::Type:
return app.type();
case DataEntity::Icon:
return app.icon();
case DataEntity::Name:
return app.name();
case DataEntity::Comment:
return app.comment();
case DataEntity::ExtraData:
return app.extraData();
default:
break;
}
return {};
}
QHash<int, QByteArray> FolderModel::roleNames() const
{
QHash<int, QByteArray> names;
names.insert(DataEntity::Type, "type");
names.insert(DataEntity::Icon, "icon");
names.insert(DataEntity::Name, "name");
names.insert(DataEntity::Comment, "comment");
names.insert(DataEntity::ExtraData, "extraData");
return names;
}
} // UkuiMenu

48
src/model/folder-model.h Normal file
View File

@ -0,0 +1,48 @@
/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef UKUI_MENU_FOLDER_MODEL_H
#define UKUI_MENU_FOLDER_MODEL_H
#include <QAbstractListModel>
#include "commons.h"
namespace UkuiMenu {
class FolderModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit FolderModel(QObject *parent = nullptr);
Q_INVOKABLE void setFolderId(const QString &folderId);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
private Q_SLOTS:
void loadFolderData(int id);
private:
int m_folderId;
QStringList m_apps;
};
} // UkuiMenu
#endif //UKUI_MENU_FOLDER_MODEL_H

View File

@ -20,6 +20,7 @@
#include "label-model.h" #include "label-model.h"
#include "app-model.h" #include "app-model.h"
#include "app-group-model.h" #include "app-group-model.h"
#include "folder-model.h"
#include <QQmlEngine> #include <QQmlEngine>
namespace UkuiMenu { namespace UkuiMenu {
@ -34,6 +35,7 @@ void ModelManager::registerMetaTypes()
{ {
qRegisterMetaType<AppModel*>("AppModel*"); qRegisterMetaType<AppModel*>("AppModel*");
qRegisterMetaType<LabelModel*>("LabelModel*"); qRegisterMetaType<LabelModel*>("LabelModel*");
qRegisterMetaType<FolderModel*>("FolderModel*");
qRegisterMetaType<AppGroupModel*>("AppGroupModel*"); qRegisterMetaType<AppGroupModel*>("AppGroupModel*");
} }
@ -43,10 +45,12 @@ ModelManager::ModelManager(QObject *parent) : QObject(parent)
appModel = new AppModel(this); appModel = new AppModel(this);
labelModel = new LabelModel(this); labelModel = new LabelModel(this);
folderModel = new FolderModel(this);
labelGroupModel = new AppGroupModel(appModel, this); labelGroupModel = new AppGroupModel(appModel, this);
QQmlEngine::setObjectOwnership(appModel, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(appModel, QQmlEngine::CppOwnership);
QQmlEngine::setObjectOwnership(labelModel, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(labelModel, QQmlEngine::CppOwnership);
QQmlEngine::setObjectOwnership(folderModel, QQmlEngine::CppOwnership);
QQmlEngine::setObjectOwnership(labelGroupModel, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(labelGroupModel, QQmlEngine::CppOwnership);
} }
@ -65,4 +69,9 @@ AppGroupModel *ModelManager::getLabelGroupModel()
return labelGroupModel; return labelGroupModel;
} }
FolderModel *ModelManager::getFolderModel()
{
return folderModel;
}
} // UkuiMenu } // UkuiMenu

View File

@ -26,6 +26,7 @@ namespace UkuiMenu {
class AppModel; class AppModel;
class LabelModel; class LabelModel;
class AppGroupModel; class AppGroupModel;
class FolderModel;
class ModelManager : public QObject class ModelManager : public QObject
{ {
@ -37,6 +38,7 @@ public:
Q_INVOKABLE AppModel *getAppModel(); Q_INVOKABLE AppModel *getAppModel();
Q_INVOKABLE LabelModel *getLabelModel(); Q_INVOKABLE LabelModel *getLabelModel();
Q_INVOKABLE FolderModel *getFolderModel();
Q_INVOKABLE AppGroupModel *getLabelGroupModel(); Q_INVOKABLE AppGroupModel *getLabelGroupModel();
private: private:
@ -45,6 +47,7 @@ private:
private: private:
AppModel *appModel{nullptr}; AppModel *appModel{nullptr};
LabelModel *labelModel{nullptr}; LabelModel *labelModel{nullptr};
FolderModel *folderModel{nullptr};
AppGroupModel *labelGroupModel{nullptr}; AppGroupModel *labelGroupModel{nullptr};
}; };