新增all-data-provider数据插件
This commit is contained in:
parent
920c9ad99e
commit
2efc02d651
|
@ -88,6 +88,7 @@ set(SOURCE_FILES
|
||||||
src/extension/menu-extension-iface.h
|
src/extension/menu-extension-iface.h
|
||||||
src/appdata/data-provider-plugin-iface.h
|
src/appdata/data-provider-plugin-iface.h
|
||||||
src/appdata/app-data-manager.cpp src/appdata/app-data-manager.h
|
src/appdata/app-data-manager.cpp src/appdata/app-data-manager.h
|
||||||
|
src/appdata/plugin/all-app-data-provider.cpp src/appdata/plugin/all-app-data-provider.h
|
||||||
src/extension/extensions/folder-extension.cpp src/extension/extensions/folder-extension.h
|
src/extension/extensions/folder-extension.cpp src/extension/extensions/folder-extension.h
|
||||||
src/extension/extensions/recent-file-extension.cpp src/extension/extensions/recent-file-extension.h
|
src/extension/extensions/recent-file-extension.cpp src/extension/extensions/recent-file-extension.h
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,182 @@
|
||||||
|
/*
|
||||||
|
* 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 "all-app-data-provider.h"
|
||||||
|
#include "app-data-manager.h"
|
||||||
|
#include "app-folder-helper.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
namespace UkuiMenu {
|
||||||
|
|
||||||
|
AllAppDataProvider::AllAppDataProvider() : DataProviderPluginIFace()
|
||||||
|
{
|
||||||
|
reloadFolderData();
|
||||||
|
reloadAppData();
|
||||||
|
|
||||||
|
connect(AppDataManager::instance(), &AppDataManager::appAdded, this, &AllAppDataProvider::onAppAdded);
|
||||||
|
connect(AppDataManager::instance(), &AppDataManager::appDeleted, this, &AllAppDataProvider::onAppDeleted);
|
||||||
|
connect(AppDataManager::instance(), &AppDataManager::appUpdated, this, &AllAppDataProvider::onAppUpdated);
|
||||||
|
connect(AppFolderHelper::instance(), &AppFolderHelper::folderDataChanged, this, &AllAppDataProvider::onAppFolderChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AllAppDataProvider::index()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AllAppDataProvider::name()
|
||||||
|
{
|
||||||
|
return tr("All");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AllAppDataProvider::icon()
|
||||||
|
{
|
||||||
|
return "text-plain";
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AllAppDataProvider::title()
|
||||||
|
{
|
||||||
|
return "Recently installed";
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginGroup::Group AllAppDataProvider::group()
|
||||||
|
{
|
||||||
|
return PluginGroup::SortMenuItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<DataEntity> AllAppDataProvider::data()
|
||||||
|
{
|
||||||
|
QVector<DataEntity> data;
|
||||||
|
mergeData(data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::forceUpdate()
|
||||||
|
{
|
||||||
|
reloadFolderData();
|
||||||
|
reloadAppData();
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::reloadAppData()
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
m_appData.clear();
|
||||||
|
|
||||||
|
// TODO 验证多线程间隐式共享数复制后导致迭代器实现问题
|
||||||
|
QList<DataEntity> apps = AppDataManager::instance()->normalApps();
|
||||||
|
if (apps.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &app : apps) {
|
||||||
|
if (!m_folderApps.contains(app.id())) {
|
||||||
|
m_appData.append(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(m_appData.begin(), m_appData.end(), [](const DataEntity &a, const DataEntity &b) {
|
||||||
|
return (a.top() > b.top()) || (a.launchTimes() > b.launchTimes());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::reloadFolderData()
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
|
||||||
|
m_folderApps.clear();
|
||||||
|
m_folderData.clear();
|
||||||
|
|
||||||
|
QVector<Folder> folders = AppFolderHelper::instance()->folderData();
|
||||||
|
if (folders.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(folders.begin(), folders.end(), [](const Folder &a, const Folder &b) {
|
||||||
|
return a.index < b.index;
|
||||||
|
});
|
||||||
|
|
||||||
|
DataEntity folderItem;
|
||||||
|
for (const auto &folder : folders) {
|
||||||
|
folderItem.setType(DataType::Folder);
|
||||||
|
folderItem.setIcon("image://appicon/text-plain");
|
||||||
|
folderItem.setName(folder.name);
|
||||||
|
|
||||||
|
m_folderApps.unite(folder.apps.toSet());
|
||||||
|
m_folderData.append(folderItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::mergeData(QVector<DataEntity> &data)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
data.append(m_folderData);
|
||||||
|
data.append(m_appData.toVector());
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::sendData()
|
||||||
|
{
|
||||||
|
QVector<DataEntity> data;
|
||||||
|
mergeData(data);
|
||||||
|
Q_EMIT dataChanged(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::onAppFolderChanged()
|
||||||
|
{
|
||||||
|
reloadFolderData();
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::onAppAdded(const QList<DataEntity>& apps)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
m_appData.append(apps);
|
||||||
|
}
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::onAppDeleted(QStringList idList)
|
||||||
|
{
|
||||||
|
removeApps(idList);
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::removeApps(QStringList &idList)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
|
||||||
|
QList<DataEntity>::iterator iterator = m_appData.begin();
|
||||||
|
while (iterator != m_appData.end() && !idList.isEmpty()) {
|
||||||
|
if (idList.removeOne((*iterator).id())) {
|
||||||
|
iterator = m_appData.erase(iterator);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
++iterator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllAppDataProvider::onAppUpdated(const QList<DataEntity>& apps)
|
||||||
|
{
|
||||||
|
Q_UNUSED(apps);
|
||||||
|
reloadAppData();
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // UkuiMenu
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* 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_ALL_APP_DATA_PROVIDER_H
|
||||||
|
#define UKUI_MENU_ALL_APP_DATA_PROVIDER_H
|
||||||
|
|
||||||
|
#include "data-provider-plugin-iface.h"
|
||||||
|
#include <QSet>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
namespace UkuiMenu {
|
||||||
|
|
||||||
|
class AllAppDataProvider : public DataProviderPluginIFace
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit AllAppDataProvider();
|
||||||
|
int index() override;
|
||||||
|
QString name() override;
|
||||||
|
QString icon() override;
|
||||||
|
QString title() override;
|
||||||
|
PluginGroup::Group group() override;
|
||||||
|
QVector<DataEntity> data() override;
|
||||||
|
void forceUpdate() override;
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void onAppAdded(const QList<DataEntity>& apps);
|
||||||
|
void onAppDeleted(QStringList idList);
|
||||||
|
void onAppUpdated(const QList<DataEntity>& apps);
|
||||||
|
// TODO 文件夹数据新增,删除信号处理
|
||||||
|
void onAppFolderChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline void sendData();
|
||||||
|
void removeApps(QStringList& idList);
|
||||||
|
void reloadAppData();
|
||||||
|
void reloadFolderData();
|
||||||
|
void mergeData(QVector<DataEntity> &data);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QMutex m_mutex;
|
||||||
|
QSet<QString> m_folderApps;
|
||||||
|
QList<DataEntity> m_appData;
|
||||||
|
QVector<DataEntity> m_folderData;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // UkuiMenu
|
||||||
|
|
||||||
|
#endif //UKUI_MENU_ALL_APP_DATA_PROVIDER_H
|
Loading…
Reference in New Issue