aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/controller
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/dialog/controller')
-rw-r--r--src/ui/dialog/controller/GnuPGControllerDialog.cpp400
-rw-r--r--src/ui/dialog/controller/GnuPGControllerDialog.h126
-rw-r--r--src/ui/dialog/controller/ModuleControllerDialog.cpp111
-rw-r--r--src/ui/dialog/controller/ModuleControllerDialog.h61
4 files changed, 698 insertions, 0 deletions
diff --git a/src/ui/dialog/controller/GnuPGControllerDialog.cpp b/src/ui/dialog/controller/GnuPGControllerDialog.cpp
new file mode 100644
index 00000000..f1fa87e2
--- /dev/null
+++ b/src/ui/dialog/controller/GnuPGControllerDialog.cpp
@@ -0,0 +1,400 @@
+/**
+ * Copyright (C) 2021 Saturneric <[email protected]>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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 <[email protected]> starting on May 12, 2021.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#include "GnuPGControllerDialog.h"
+
+#include "core/GpgModel.h"
+#include "core/function/GlobalSettingStation.h"
+#include "core/module/ModuleManager.h"
+#include "ui/UISignalStation.h"
+#include "ui/dialog/GeneralDialog.h"
+#include "ui_GnuPGControllerDialog.h"
+
+namespace GpgFrontend::UI {
+
+GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent)
+ : GeneralDialog("GnuPGControllerDialog", parent),
+ ui_(GpgFrontend::SecureCreateSharedObject<Ui_GnuPGControllerDialog>()) {
+ ui_->setupUi(this);
+
+ ui_->generalBox->setTitle(tr("General"));
+ ui_->keyDatabaseGroupBox->setTitle(tr("Key Database"));
+ ui_->advanceGroupBox->setTitle(tr("Advanced"));
+
+ ui_->asciiModeCheckBox->setText(tr("Use Binary Mode for File Operations"));
+ ui_->usePinentryAsPasswordInputDialogCheckBox->setText(
+ tr("Use Pinentry as Password Input Dialog"));
+ ui_->gpgmeDebugLogCheckBox->setText(tr("Enable GpgME Debug Log"));
+ ui_->useCustomGnuPGInstallPathCheckBox->setText(tr("Use Custom GnuPG"));
+ ui_->useCustomGnuPGInstallPathButton->setText(tr("Select GnuPG Path"));
+ ui_->keyDatabseUseCustomCheckBox->setText(
+ tr("Use Custom GnuPG Key Database Path"));
+ ui_->customKeyDatabasePathSelectButton->setText(
+ tr("Select Key Database Path"));
+ ui_->restartGpgAgentOnStartCheckBox->setText(
+ tr("Restart Gpg Agent on start"));
+
+ // tips
+ ui_->customGnuPGPathTipsLabel->setText(
+ tr("Tips: please select a directroy where \"gpgconf\" is located in."));
+ ui_->restartTipsLabel->setText(
+ tr("Tips: notice that modify any of these settings will cause an "
+ "Application restart."));
+
+ // announce main window
+ connect(this, &GnuPGControllerDialog::SignalRestartNeeded,
+ UISignalStation::GetInstance(),
+ &UISignalStation::SignalRestartApplication);
+
+ connect(ui_->keyDatabseUseCustomCheckBox, &QCheckBox::stateChanged, this,
+ [=](int state) {
+ ui_->customKeyDatabasePathSelectButton->setDisabled(
+ state != Qt::CheckState::Checked);
+ });
+
+ connect(ui_->useCustomGnuPGInstallPathCheckBox, &QCheckBox::stateChanged,
+ this, [=](int state) {
+ ui_->useCustomGnuPGInstallPathButton->setDisabled(
+ state != Qt::CheckState::Checked);
+ });
+
+ connect(ui_->keyDatabseUseCustomCheckBox, &QCheckBox::stateChanged, this,
+ &GnuPGControllerDialog::slot_update_custom_key_database_path_label);
+
+ connect(ui_->useCustomGnuPGInstallPathCheckBox, &QCheckBox::stateChanged,
+ this,
+ &GnuPGControllerDialog::slot_update_custom_gnupg_install_path_label);
+
+ connect(
+ ui_->customKeyDatabasePathSelectButton, &QPushButton::clicked, this,
+ [=]() {
+ QString selected_custom_key_database_path =
+ QFileDialog::getExistingDirectory(
+ this, tr("Open Directory"), {},
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+
+ GF_UI_LOG_DEBUG("key databse path selected: {}",
+ selected_custom_key_database_path);
+
+ custom_key_database_path_ = selected_custom_key_database_path;
+
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+
+ // update ui
+ this->slot_update_custom_key_database_path_label(
+ this->ui_->keyDatabseUseCustomCheckBox->checkState());
+ });
+
+ connect(
+ ui_->useCustomGnuPGInstallPathButton, &QPushButton::clicked, this, [=]() {
+ QString selected_custom_gnupg_install_path =
+ QFileDialog::getExistingDirectory(
+ this, tr("Open Directory"), {},
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+
+ GF_UI_LOG_DEBUG("gnupg install path selected: {}",
+ selected_custom_gnupg_install_path);
+
+ custom_gnupg_path_ = selected_custom_gnupg_install_path;
+
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+
+ // update ui
+ this->slot_update_custom_gnupg_install_path_label(
+ this->ui_->useCustomGnuPGInstallPathCheckBox->checkState());
+ });
+
+ connect(ui_->usePinentryAsPasswordInputDialogCheckBox,
+ &QCheckBox::stateChanged, this, [=](int) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+ });
+
+ connect(ui_->gpgmeDebugLogCheckBox, &QCheckBox::stateChanged, this, [=](int) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+ });
+
+ connect(ui_->asciiModeCheckBox, &QCheckBox::stateChanged, this, [=](int) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+ });
+
+ connect(ui_->restartGpgAgentOnStartCheckBox, &QCheckBox::stateChanged, this,
+ [=](int) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+ });
+
+#ifndef MACOS
+ connect(ui_->buttonBox, &QDialogButtonBox::accepted, this,
+ &GnuPGControllerDialog::SlotAccept);
+ connect(ui_->buttonBox, &QDialogButtonBox::rejected, this,
+ &GnuPGControllerDialog::reject);
+#else
+
+ // macOS style settings
+ ui_->buttonBox->setDisabled(true);
+ ui_->buttonBox->setHidden(true);
+
+ connect(this, &QDialog::finished, this, &GnuPGControllerDialog::SlotAccept);
+ connect(this, &QDialog::finished, this, &GnuPGControllerDialog::deleteLater);
+#endif
+
+ setWindowTitle(tr("GnuPG Controller"));
+ set_settings();
+}
+
+void GnuPGControllerDialog::SlotAccept() {
+ apply_settings();
+
+ GF_UI_LOG_DEBUG("gnupg controller apply done");
+ GF_UI_LOG_DEBUG("restart needed: {}", get_restart_needed());
+ if (get_restart_needed() != 0) {
+ emit SignalRestartNeeded(get_restart_needed());
+ }
+ close();
+}
+
+void GnuPGControllerDialog::slot_update_custom_key_database_path_label(
+ int state) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+
+ // hide label (not necessary to show the default path)
+ this->ui_->currentKeyDatabasePathLabel->setHidden(state !=
+ Qt::CheckState::Checked);
+ if (state == Qt::CheckState::Checked) {
+ if (custom_key_database_path_.isEmpty()) {
+ // read from settings file
+ QString custom_key_database_path =
+ GlobalSettingStation::GetInstance()
+ .GetSettings()
+ .value("gnupg/custom_key_database_path")
+ .toString();
+ GF_UI_LOG_DEBUG("selected_custom_key_database_path from settings: {}",
+ custom_key_database_path);
+ custom_key_database_path_ = custom_key_database_path;
+ }
+
+ // notify the user
+ if (!check_custom_gnupg_key_database_path(custom_key_database_path_)) {
+ return;
+ };
+
+ // set label value
+ if (!custom_key_database_path_.isEmpty()) {
+ ui_->currentKeyDatabasePathLabel->setText(custom_key_database_path_);
+ }
+ }
+
+ if (ui_->currentKeyDatabasePathLabel->text().isEmpty()) {
+ const auto database_path = Module::RetrieveRTValueTypedOrDefault<>(
+ "core", "gpgme.ctx.database_path", QString{});
+ GF_UI_LOG_DEBUG("got gpgme.ctx.database_path from rt: {}", database_path);
+ ui_->currentKeyDatabasePathLabel->setText(database_path);
+ }
+}
+
+void GnuPGControllerDialog::slot_update_custom_gnupg_install_path_label(
+ int state) {
+ // announce the restart
+ this->slot_set_restart_needed(kDeepRestartCode);
+
+ // hide label (not necessary to show the default path)
+ this->ui_->currentCustomGnuPGInstallPathLabel->setHidden(
+ state != Qt::CheckState::Checked);
+ do {
+ if (state == Qt::CheckState::Checked) {
+ if (custom_gnupg_path_.isEmpty()) {
+ // read from settings file
+ QString custom_gnupg_install_path =
+ GlobalSettingStation::GetInstance()
+ .GetSettings()
+ .value("gnupg/custom_gnupg_install_path")
+ .toString();
+ GF_UI_LOG_DEBUG("custom_gnupg_install_path from settings: {}",
+ custom_gnupg_install_path);
+ custom_gnupg_path_ = custom_gnupg_install_path;
+ }
+
+ // notify the user
+ if (!check_custom_gnupg_path(custom_gnupg_path_)) {
+ break;
+ }
+
+ // set label value
+ if (!custom_gnupg_path_.isEmpty()) {
+ ui_->currentCustomGnuPGInstallPathLabel->setText(custom_gnupg_path_);
+ }
+ }
+ } while (false);
+
+ if (ui_->currentCustomGnuPGInstallPathLabel->text().isEmpty()) {
+ const auto gnupg_path = Module::RetrieveRTValueTypedOrDefault<>(
+ "core", "gpgme.ctx.app_path", QString{});
+ GF_UI_LOG_DEBUG("got gnupg home path from rt: {}", gnupg_path);
+ auto dir = QFileInfo(gnupg_path).path();
+ ui_->currentCustomGnuPGInstallPathLabel->setText(dir);
+ }
+}
+
+void GnuPGControllerDialog::set_settings() {
+ auto settings = GlobalSettingStation::GetInstance().GetSettings();
+
+ bool non_ascii_at_file_operation =
+ settings.value("gnupg/non_ascii_at_file_operation", true).toBool();
+ if (non_ascii_at_file_operation)
+ ui_->asciiModeCheckBox->setCheckState(Qt::Checked);
+
+ bool const use_custom_key_database_path =
+ settings.value("gnupg/use_custom_key_database_path", false).toBool();
+ if (use_custom_key_database_path) {
+ ui_->keyDatabseUseCustomCheckBox->setCheckState(Qt::Checked);
+ }
+
+ bool const enable_gpgme_debug_log =
+ settings.value("gnupg/enable_gpgme_debug_log", false).toBool();
+ if (enable_gpgme_debug_log) {
+ ui_->gpgmeDebugLogCheckBox->setCheckState(Qt::Checked);
+ }
+
+ this->slot_update_custom_key_database_path_label(
+ ui_->keyDatabseUseCustomCheckBox->checkState());
+
+ bool const use_custom_gnupg_install_path =
+ settings.value("gnupg/use_custom_gnupg_install_path", false).toBool();
+ if (use_custom_gnupg_install_path) {
+ ui_->useCustomGnuPGInstallPathCheckBox->setCheckState(Qt::Checked);
+ }
+
+ bool const use_pinentry_as_password_input_dialog =
+ settings
+ .value("gnupg/use_pinentry_as_password_input_dialog",
+ QString::fromLocal8Bit(qgetenv("container")) != "flatpak")
+ .toBool();
+ if (use_pinentry_as_password_input_dialog) {
+ ui_->usePinentryAsPasswordInputDialogCheckBox->setCheckState(Qt::Checked);
+ }
+
+ bool const restart_gpg_agent_on_start =
+ settings.value("gnupg/restart_gpg_agent_on_start", false).toBool();
+ if (restart_gpg_agent_on_start) {
+ ui_->restartGpgAgentOnStartCheckBox->setCheckState(Qt::Checked);
+ }
+
+ this->slot_set_restart_needed(false);
+
+ this->slot_update_custom_key_database_path_label(
+ use_custom_key_database_path ? Qt::Checked : Qt::Unchecked);
+
+ this->slot_update_custom_gnupg_install_path_label(
+ use_custom_gnupg_install_path ? Qt::Checked : Qt::Unchecked);
+}
+
+void GnuPGControllerDialog::apply_settings() {
+ auto settings =
+ GpgFrontend::GlobalSettingStation::GetInstance().GetSettings();
+
+ settings.setValue("gnupg/non_ascii_at_file_operation",
+ ui_->asciiModeCheckBox->isChecked());
+ settings.setValue("gnupg/use_custom_key_database_path",
+ ui_->keyDatabseUseCustomCheckBox->isChecked());
+ settings.setValue("gnupg/use_custom_gnupg_install_path",
+ ui_->useCustomGnuPGInstallPathCheckBox->isChecked());
+ settings.setValue("gnupg/use_pinentry_as_password_input_dialog",
+ ui_->usePinentryAsPasswordInputDialogCheckBox->isChecked());
+ settings.setValue("gnupg/enable_gpgme_debug_log",
+ ui_->gpgmeDebugLogCheckBox->isChecked());
+ settings.setValue("gnupg/custom_key_database_path",
+ ui_->currentKeyDatabasePathLabel->text());
+ settings.setValue("gnupg/custom_gnupg_install_path",
+ ui_->currentCustomGnuPGInstallPathLabel->text());
+ settings.setValue("gnupg/restart_gpg_agent_on_start",
+ ui_->restartGpgAgentOnStartCheckBox->isChecked());
+}
+
+int GnuPGControllerDialog::get_restart_needed() const {
+ return this->restart_needed_;
+}
+
+void GnuPGControllerDialog::slot_set_restart_needed(int mode) {
+ this->restart_needed_ = mode;
+}
+
+auto GnuPGControllerDialog::check_custom_gnupg_path(QString path) -> bool {
+ if (path.isEmpty()) return false;
+
+ QFileInfo dir_info(path);
+ if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) {
+ QMessageBox::critical(
+ this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path is not an exists readable directory."));
+ return false;
+ }
+
+ QDir dir(path);
+ if (!dir.isAbsolute()) {
+ QMessageBox::critical(this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path is not an absolute path."));
+ }
+#ifdef WINDOWS
+ QFileInfo gpgconf_info(path + "/gpgconf.exe");
+#else
+ QFileInfo gpgconf_info(path + "/gpgconf");
+#endif
+
+ if (!gpgconf_info.exists() || !gpgconf_info.isFile() ||
+ !gpgconf_info.isExecutable()) {
+ QMessageBox::critical(
+ this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path contains no \"gpgconf\" executable."));
+ return false;
+ }
+
+ return true;
+}
+
+auto GnuPGControllerDialog::check_custom_gnupg_key_database_path(QString path)
+ -> bool {
+ if (path.isEmpty()) return false;
+
+ QFileInfo dir_info(path);
+ if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) {
+ QMessageBox::critical(this, tr("Illegal GnuPG Key Database Path"),
+ tr("Target GnuPG Key Database Path is not an "
+ "exists readable directory."));
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace GpgFrontend::UI
diff --git a/src/ui/dialog/controller/GnuPGControllerDialog.h b/src/ui/dialog/controller/GnuPGControllerDialog.h
new file mode 100644
index 00000000..6e8ef797
--- /dev/null
+++ b/src/ui/dialog/controller/GnuPGControllerDialog.h
@@ -0,0 +1,126 @@
+/**
+ * Copyright (C) 2021 Saturneric <[email protected]>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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 <[email protected]> starting on May 12, 2021.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#pragma once
+
+#include "ui/dialog/GeneralDialog.h"
+
+class Ui_GnuPGControllerDialog;
+
+namespace GpgFrontend::UI {
+class GnuPGControllerDialog : public GeneralDialog {
+ Q_OBJECT
+ public:
+ /**
+ * @brief Construct a new General Tab object
+ *
+ * @param parent
+ */
+ explicit GnuPGControllerDialog(QWidget* parent = nullptr);
+
+ public slots:
+
+ /**
+ * @brief
+ *
+ */
+ void SlotAccept();
+
+ signals:
+
+ /**
+ * @brief
+ *
+ * @param needed
+ */
+ void SignalRestartNeeded(int);
+
+ private slots:
+
+ /**
+ * @brief
+ *
+ * @param needed
+ */
+ void slot_set_restart_needed(int);
+
+ /**
+ * @brief
+ *
+ */
+ void slot_update_custom_key_database_path_label(int state);
+
+ /**
+ * @brief
+ *
+ */
+ void slot_update_custom_gnupg_install_path_label(int state);
+
+ private:
+ std::shared_ptr<Ui_GnuPGControllerDialog> ui_; ///<
+ int restart_needed_{0}; ///<
+ QString custom_key_database_path_;
+ QString custom_gnupg_path_;
+
+ /**
+ * @brief Get the Restart Needed object
+ *
+ * @return true
+ * @return false
+ */
+ [[nodiscard]] auto get_restart_needed() const -> int;
+
+ /**
+ * @brief Set the settings object
+ *
+ */
+ void set_settings();
+
+ /**
+ * @brief
+ *
+ */
+ void apply_settings();
+
+ /**
+ * @brief
+ *
+ * @return true
+ * @return false
+ */
+ auto check_custom_gnupg_path(QString) -> bool;
+
+ /**
+ * @brief
+ *
+ * @return true
+ * @return false
+ */
+ auto check_custom_gnupg_key_database_path(QString) -> bool;
+};
+} // namespace GpgFrontend::UI
diff --git a/src/ui/dialog/controller/ModuleControllerDialog.cpp b/src/ui/dialog/controller/ModuleControllerDialog.cpp
new file mode 100644
index 00000000..db177155
--- /dev/null
+++ b/src/ui/dialog/controller/ModuleControllerDialog.cpp
@@ -0,0 +1,111 @@
+/**
+ * Copyright (C) 2021 Saturneric <[email protected]>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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 <[email protected]> starting on May 12, 2021.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#include "ModuleControllerDialog.h"
+
+#include "ui_ModuleControllerDialog.h"
+
+//
+#include "core/module/ModuleManager.h"
+#include "ui/widgets/ModuleListView.h"
+
+namespace GpgFrontend::UI {
+
+ModuleControllerDialog::ModuleControllerDialog(QWidget* parent)
+ : QDialog(parent),
+ ui_(std::make_shared<Ui_ModuleControllerDialog>()),
+ model_list_view_(new ModuleListView(this)) {
+ ui_->setupUi(this);
+
+ model_list_view_->setMinimumWidth(250);
+ model_list_view_->setViewMode(QListView::ListMode);
+ model_list_view_->setMovement(QListView::Static);
+
+ ui_->moduleListViewLayout->addWidget(model_list_view_);
+ connect(model_list_view_, &ModuleListView::SignalSelectModule, this,
+ &ModuleControllerDialog::slot_load_module_details);
+
+ connect(ui_->activateButton, &QPushButton::clicked, this, [=]() {
+ auto module_id = model_list_view_->GetCurrentModuleID();
+ if (module_id.isEmpty()) return;
+
+ Module::ModuleManager::GetInstance().ActiveModule(module_id);
+ QTimer::singleShot(1000, [=]() { slot_load_module_details(module_id); });
+ });
+
+ connect(ui_->triggerEventButton, &QPushButton::clicked, this, [=]() {
+ auto event_id =
+ QInputDialog::getText(this, "Please provide an Event ID", "Event ID");
+ Module::TriggerEvent(event_id);
+ });
+}
+
+void ModuleControllerDialog::slot_load_module_details(
+ Module::ModuleIdentifier module_id) {
+ GF_UI_LOG_DEBUG("loading module detailes, module id: {}", module_id);
+
+ auto module = Module::ModuleManager::GetInstance().SearchModule(module_id);
+
+ ui_->moduleIDLabel->setText(module->GetModuleIdentifier());
+
+ QString buffer;
+ QTextStream info(&buffer);
+
+ info << "# BASIC INFO" << Qt::endl << Qt::endl;
+
+ info << tr("Version") << ": " << module->GetModuleVersion() << Qt::endl;
+ info << tr("Hash") << ": " << module->GetModuleHash() << Qt::endl;
+ info << tr("Path") << ": " << module->GetModulePath() << Qt::endl;
+
+ info << tr("Active") << ": "
+ << (Module::ModuleManager::GetInstance().IsModuleActivated(module_id)
+ ? tr("True")
+ : tr("False"))
+ << Qt::endl;
+
+ info << Qt::endl;
+
+ info << "# METADATA" << Qt::endl << Qt::endl;
+
+ for (const auto& metadata : module->GetModuleMetaData()) {
+ info << metadata.first << ": " << metadata.second << "\n";
+ }
+
+ info << Qt::endl;
+
+ info << "# Listening Event" << Qt::endl << Qt::endl;
+
+ auto listening_event_ids =
+ Module::ModuleManager::GetInstance().GetModuleListening(module_id);
+ for (const auto& event_id : listening_event_ids) {
+ info << " - " << event_id << "\n";
+ }
+
+ ui_->moduleInfoTextBrowser->setText(buffer);
+}
+} // namespace GpgFrontend::UI
diff --git a/src/ui/dialog/controller/ModuleControllerDialog.h b/src/ui/dialog/controller/ModuleControllerDialog.h
new file mode 100644
index 00000000..59b6cc6b
--- /dev/null
+++ b/src/ui/dialog/controller/ModuleControllerDialog.h
@@ -0,0 +1,61 @@
+/**
+ * Copyright (C) 2021 Saturneric <[email protected]>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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 <[email protected]> starting on May 12, 2021.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#pragma once
+
+#include "core/module/Module.h"
+
+class Ui_ModuleControllerDialog;
+
+namespace GpgFrontend::UI {
+
+class ModuleListView;
+
+class ModuleControllerDialog : public QDialog {
+ Q_OBJECT
+ public:
+ /**
+ * @brief Construct a new Module Controller Dialog object
+ *
+ * @param parent
+ */
+ explicit ModuleControllerDialog(QWidget* parent);
+
+ private slots:
+ /**
+ * @brief
+ *
+ */
+ void slot_load_module_details(Module::ModuleIdentifier);
+
+ private:
+ std::shared_ptr<Ui_ModuleControllerDialog> ui_; ///<
+ ModuleListView* model_list_view_;
+};
+
+} // namespace GpgFrontend::UI