/** * Copyright (C) 2021-2024 Saturneric * * This file is part of GpgFrontend. * * GpgFrontend 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. * * GpgFrontend 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 GpgFrontend. If not, see . * * The initial version of the source code is inherited from * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by * Saturneric starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later * */ #include "UIModuleManager.h" #include #include "core/module/ModuleManager.h" #include "core/utils/CommonUtils.h" namespace GpgFrontend::UI { UIModuleManager::UIModuleManager(int channel) : SingletonFunctionObject(channel) {} UIModuleManager::~UIModuleManager() = default; auto UIModuleManager::DeclareMountPoint( const QString& id, const QString& entry_type, QMap meta_data_desc) -> bool { if (id.isEmpty() || mount_points_.contains(id)) return false; UIMountPoint point; point.id = id; point.entry_type = entry_type; point.meta_data_desc = std::move(meta_data_desc); mount_points_[id] = point; auto grt_key = QString("mount_points.%1").arg(id); GpgFrontend::Module::UpsertRTValue( "ui", grt_key, QString(QJsonDocument(point.ToJson()).toJson())); return true; } auto UIModuleManager::MountEntry(const QString& id, QMap meta_data, EntryFactory factory) -> bool { if (id.isEmpty() || !mount_points_.contains(id)) return false; if (factory == nullptr) return false; MountedUIEntry m_entry; m_entry.id_ = id; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) for (const auto& meta : meta_data.asKeyValueRange()) { meta_data[meta.first] = QApplication::translate("GTrC", meta.second.toUtf8()); } #else for (auto it = meta_data.keyValueBegin(); it != meta_data.keyValueEnd(); ++it) { meta_data[it->first] = QApplication::translate("GTrC", it->second.toUtf8()); } #endif m_entry.meta_data_ = std::move(meta_data); m_entry.factory_ = factory; mounted_entries_[id].append(m_entry); return true; } auto UIModuleManager::QueryMountedEntries(QString id) -> QList { if (id.isEmpty() || !mount_points_.contains(id)) return {}; return mounted_entries_[id]; } auto MountedUIEntry::GetWidget() const -> QWidget* { return qobject_cast(static_cast(factory_(id_.toUtf8()))); } auto MountedUIEntry::GetMetaDataByDefault( const QString& key, QString default_value) const -> QString { if (!meta_data_.contains(key)) return default_value; return meta_data_[key]; } auto UIModuleManager::RegisterTranslatorDataReader( Module::ModuleIdentifier id, GFTranslatorDataReader reader) -> bool { if (reader != nullptr && !id.isEmpty() && Module::IsModuleExists(id)) { LOG_D() << "module " << id << "registering translator reader..."; translator_data_readers_[id] = ModuleTranslatorInfo{reader}; return true; } return false; } void UIModuleManager::RegisterAllModuleTranslators() { registered_translators_.clear(); read_translator_data_list_.clear(); const auto locale_name = QLocale().name(); #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) for (const auto& reader : translator_data_readers_.asKeyValueRange()) { char* data = nullptr; auto data_size = reader.second.reader_(GFStrDup(locale_name), &data); LOG_D() << "module " << reader.first << "reader, read locale " << locale_name << ", data size: " << data_size; #else for (auto it = translator_data_readers_.keyValueBegin(); it != translator_data_readers_.keyValueEnd(); ++it) { char* data = nullptr; auto data_size = it->second.reader_(GFStrDup(locale_name), &data); LOG_D() << "module " << it->first << "reader, read locale " << locale_name << ", data size: " << data_size; #endif if (data == nullptr) continue; if (data_size <= 0) { SecureFree(data); continue; } QByteArray b(data, data_size); SecureFree(data); auto* translator = new QTranslator(QCoreApplication::instance()); auto load = translator->load( reinterpret_cast(const_cast(b.data())), b.size()); if (load && QCoreApplication::installTranslator(translator)) { registered_translators_.append(translator); read_translator_data_list_.append(b); } else { translator->deleteLater(); } } } void UIModuleManager::TranslateAllModulesParams() { #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) for (auto entry : mounted_entries_.asKeyValueRange()) { for (auto& m_entry : entry.second) { for (auto param : m_entry.meta_data_.asKeyValueRange()) { m_entry.meta_data_[param.first] = QApplication::translate("GTrC", param.second.toUtf8()); } } } #else for (auto it = mounted_entries_.keyValueBegin(); it != mounted_entries_.keyValueEnd(); ++it) { for (auto& m_entry : it->second) { for (auto it_p = m_entry.meta_data_.keyValueBegin(); it_p != m_entry.meta_data_.keyValueEnd(); ++it_p) { m_entry.meta_data_[it_p->first] = QApplication::translate("GTrC", it_p->second.toUtf8()); } } } #endif } } // namespace GpgFrontend::UI