ukui-sidebar/ukui-shortcut/short-cut-manager.cpp

137 lines
4.1 KiB
C++

/*
* Copyright (C) 2022, 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/>.
*
* Authors: iaom <zhangpengfei@kylinos.cn>
*
*/
#include "short-cut-manager.h"
#include <QDir>
#include <QJsonObject>
#include <QJsonValue>
#include <QPluginLoader>
#include <QTranslator>
#include <QCoreApplication>
#include <QDebug>
using namespace UkuiShortcut;
ShortcutManager *instance = nullptr;
class UkuiShortcut::ShortcutManagerPrivate
{
public:
void findShortcuts(QDir pluginsDir, QString translationsDir);
QList<Shortcut*> getShortcuts();
QList<Shortcut*> m_allShortcuts;
};
void ShortcutManagerPrivate::findShortcuts(QDir pluginsDir, QString translationsDir)
{
const QString pluginType(UKUI_SHORTCUT_PLUGIN_IFACE_TYPE);
for(const QString& fileName : pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QJsonObject metaData = pluginLoader.metaData().value("MetaData").toObject();
QString type = metaData.value("Type").toString();
QString version = metaData.value("Version").toString();
if (type != pluginType) {
continue;
}
if (version.left(3) != QString(UKUI_SHORTCUT_PLUGIN_IFACE_VERSION).left(3)) {
qWarning() << "UKUI_SHORT_CUT version check failed:" << fileName << "version:" << version
<< "iface version : " << UKUI_SHORTCUT_PLUGIN_IFACE_VERSION;
continue;
}
QObject *obj = pluginLoader.instance();
if (!obj) {
continue;
}
UkuiShortcutPlugin *plugin = qobject_cast<UkuiShortcutPlugin *>(obj);
if (!plugin) {
obj->deleteLater();
continue;
}
// 加载翻译
for (const auto &trName : plugin->translations()) {
auto translator = new QTranslator(QCoreApplication::instance());
if (translator->load(QLocale(), trName, QStringLiteral("_"), translationsDir)) {
// 加载翻译成功
QCoreApplication::installTranslator(translator);
} else {
delete translator;
}
}
Shortcut *shortcut = plugin->createShortcut();
if (shortcut) {
m_allShortcuts.append(shortcut);
}
plugin->deleteLater();
}
}
QList<Shortcut *> ShortcutManagerPrivate::getShortcuts()
{
return m_allShortcuts;
}
ShortcutManager *ShortcutManager::getInstance()
{
if (!instance) {
instance = new ShortcutManager;
}
return instance;
}
ShortcutManager::ShortcutManager() : d(new ShortcutManagerPrivate)
{
qRegisterMetaType<StatusInfo>("StatusInfo");
QDir usrDir(PLUGIN_INSTALL_DIRS);
QString usrTranslationsDir(SHORTCUT_TRANSLATION_FILE_DIR);
d->findShortcuts(usrDir, usrTranslationsDir);
QDir optDir("/opt/system/lib/ukui-shortcut-plugins");
QString optTranslationsDir("/opt/system/resource/ukui/ukui-sidebar/shortcuts/translations");
d->findShortcuts(optDir, optTranslationsDir);
}
QList<Shortcut *> ShortcutManager::getShortcuts()
{
return d->getShortcuts();
}
QPair<bool, QString> ShortcutManager::getWidgetInfo(const QString &widgetId)
{
QPair<bool, QString> widgetInfo = {false, {}};
for (const auto &shortcut : d->m_allShortcuts) {
if (shortcut->currentStatus().getWidgetId() == widgetId) {
widgetInfo.first = true;
widgetInfo.second = shortcut->currentStatus().getName();
return widgetInfo;
}
}
return widgetInfo;
}
ShortcutManager::~ShortcutManager() = default;