diff options
author | saturneric <[email protected]> | 2024-11-22 22:49:09 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-11-22 22:49:09 +0000 |
commit | ac78b0fe2d8c285ef1f051d883ac046ce6557fe7 (patch) | |
tree | 116baa5ee75a40b84017bcad0266f283542743b8 | |
parent | feat: improve version option (diff) | |
download | GpgFrontend-ac78b0fe2d8c285ef1f051d883ac046ce6557fe7.tar.gz GpgFrontend-ac78b0fe2d8c285ef1f051d883ac046ce6557fe7.zip |
feat: default key db is not editable
-rw-r--r-- | src/core/struct/settings_object/KeyDatabaseItemSO.h | 6 | ||||
-rw-r--r-- | src/ui/dialog/KeyDatabaseEditDialog.cpp | 17 | ||||
-rw-r--r-- | src/ui/dialog/KeyDatabaseEditDialog.h | 7 | ||||
-rw-r--r-- | src/ui/dialog/controller/GnuPGControllerDialog.cpp | 69 | ||||
-rw-r--r-- | src/ui/dialog/controller/GnuPGControllerDialog.h | 3 |
5 files changed, 65 insertions, 37 deletions
diff --git a/src/core/struct/settings_object/KeyDatabaseItemSO.h b/src/core/struct/settings_object/KeyDatabaseItemSO.h index e15165ad..4f6020d7 100644 --- a/src/core/struct/settings_object/KeyDatabaseItemSO.h +++ b/src/core/struct/settings_object/KeyDatabaseItemSO.h @@ -28,6 +28,7 @@ #pragma once +#include "core/model/KeyDatabaseInfo.h" namespace GpgFrontend { struct KeyDatabaseItemSO { @@ -36,6 +37,11 @@ struct KeyDatabaseItemSO { KeyDatabaseItemSO() = default; + explicit KeyDatabaseItemSO(KeyDatabaseInfo i) { + name = i.name; + path = i.path; + } + explicit KeyDatabaseItemSO(const QJsonObject& j) { if (const auto v = j["name"]; v.isString()) { name = v.toString(); diff --git a/src/ui/dialog/KeyDatabaseEditDialog.cpp b/src/ui/dialog/KeyDatabaseEditDialog.cpp index bbc35292..cc6e2cf9 100644 --- a/src/ui/dialog/KeyDatabaseEditDialog.cpp +++ b/src/ui/dialog/KeyDatabaseEditDialog.cpp @@ -28,15 +28,18 @@ #include "KeyDatabaseEditDialog.h" -#include "core/utils/GpgUtils.h" +#include <utility> + +#include "core/struct/settings_object/KeyDatabaseItemSO.h" #include "core/utils/MemoryUtils.h" #include "ui_KeyDatabaseEditDialog.h" namespace GpgFrontend::UI { -KeyDatabaseEditDialog::KeyDatabaseEditDialog(QWidget* parent) +KeyDatabaseEditDialog::KeyDatabaseEditDialog( + QList<KeyDatabaseInfo> key_db_infos, QWidget* parent) : GeneralDialog("KeyDatabaseEditDialog", parent), ui_(GpgFrontend::SecureCreateSharedObject<Ui_KeyDatabaseEditDialog>()), - key_database_infos_(GetGpgKeyDatabaseInfos()) { + key_database_infos_(std::move(key_db_infos)) { ui_->setupUi(this); ui_->keyDBPathShowLabel->setHidden(true); @@ -57,8 +60,9 @@ KeyDatabaseEditDialog::KeyDatabaseEditDialog(QWidget* parent) "exists readable directory.")); } - if (!path.trimmed().isEmpty()) { + if (!path.trimmed().isEmpty() && path != path_) { path_ = QFileInfo(path).absoluteFilePath(); + ui_->keyDBPathShowLabel->setText(path_); ui_->keyDBPathShowLabel->setHidden(false); } @@ -84,7 +88,7 @@ void KeyDatabaseEditDialog::slot_button_box_accepted() { } for (const auto& info : key_database_infos_) { - if (info.name == name_) { + if (default_name_ != name_ && info.name == name_) { slot_show_err_msg(tr("A key database with the name '%1' already exists. " "Please choose a different name.") .arg(name_)); @@ -107,11 +111,14 @@ auto KeyDatabaseEditDialog::check_custom_gnupg_key_database_path( void KeyDatabaseEditDialog::SetDefaultName(QString name) { name_ = std::move(name); + default_name_ = name_; + ui_->keyDBNameLineEdit->setText(name_); } void KeyDatabaseEditDialog::SetDefaultPath(const QString& path) { path_ = QFileInfo(path).absoluteFilePath(); + default_path_ = path_; ui_->keyDBPathShowLabel->setText(path_); ui_->keyDBPathShowLabel->setHidden(path_.isEmpty()); diff --git a/src/ui/dialog/KeyDatabaseEditDialog.h b/src/ui/dialog/KeyDatabaseEditDialog.h index 0debc2c4..9c0e96b0 100644 --- a/src/ui/dialog/KeyDatabaseEditDialog.h +++ b/src/ui/dialog/KeyDatabaseEditDialog.h @@ -39,7 +39,8 @@ namespace GpgFrontend::UI { class KeyDatabaseEditDialog : public GeneralDialog { Q_OBJECT public: - explicit KeyDatabaseEditDialog(QWidget* parent); + explicit KeyDatabaseEditDialog(QList<KeyDatabaseInfo> key_db_infos, + QWidget* parent); void SetDefaultName(QString name); @@ -50,7 +51,9 @@ class KeyDatabaseEditDialog : public GeneralDialog { private: std::shared_ptr<Ui_KeyDatabaseEditDialog> ui_; ///< - bool default_; + + QString default_name_; + QString default_path_; QString name_; QString path_; QList<KeyDatabaseInfo> key_database_infos_; diff --git a/src/ui/dialog/controller/GnuPGControllerDialog.cpp b/src/ui/dialog/controller/GnuPGControllerDialog.cpp index 2e817ba9..fe334e45 100644 --- a/src/ui/dialog/controller/GnuPGControllerDialog.cpp +++ b/src/ui/dialog/controller/GnuPGControllerDialog.cpp @@ -33,6 +33,7 @@ #include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" #include "core/struct/settings_object/KeyDatabaseListSO.h" +#include "core/utils/GpgUtils.h" #include "ui/UISignalStation.h" #include "ui/dialog/GeneralDialog.h" #include "ui/dialog/KeyDatabaseEditDialog.h" @@ -269,9 +270,9 @@ void GnuPGControllerDialog::set_settings() { this->slot_set_restart_needed(kNonRestartCode); - auto key_database_list = - KeyDatabaseListSO(SettingsObject("key_database_list")); - buffered_key_db_so_ = key_database_list.key_databases; + buffered_key_db_so_ = GetGpgKeyDatabaseInfos(); + editable_key_db_so_ = buffered_key_db_so_; + editable_key_db_so_.pop_front(); this->slot_refresh_key_database_table(); } @@ -297,7 +298,10 @@ void GnuPGControllerDialog::apply_settings() { auto so = SettingsObject("key_database_list"); auto key_database_list = KeyDatabaseListSO(so); - key_database_list.key_databases = buffered_key_db_so_; + key_database_list.key_databases.clear(); + for (const auto& key_db_info : editable_key_db_so_) { + key_database_list.key_databases.append(KeyDatabaseItemSO(key_db_info)); + } so.Store(key_database_list.ToJson()); } @@ -343,9 +347,9 @@ auto GnuPGControllerDialog::check_custom_gnupg_path(QString path) -> bool { } void GnuPGControllerDialog::slot_add_new_key_database() { - auto* dialog = new KeyDatabaseEditDialog(this); + auto* dialog = new KeyDatabaseEditDialog(editable_key_db_so_, this); - if (buffered_key_db_so_.size() >= 8) { + if (editable_key_db_so_.size() >= 8) { QMessageBox::critical( this, tr("Maximum Key Database Limit Reached"), tr("Currently, GpgFrontend supports a maximum of 8 key databases. " @@ -369,11 +373,15 @@ void GnuPGControllerDialog::slot_add_new_key_database() { LOG_D() << "new key database path, name: " << name << "path: " << path; - KeyDatabaseItemSO key_database; + KeyDatabaseInfo key_database; key_database.name = name; key_database.path = path; + key_database.channel = buffered_key_db_so_.size(); key_databases.append(key_database); + editable_key_db_so_ = buffered_key_db_so_; + editable_key_db_so_.pop_front(); + // refresh ui slot_refresh_key_database_table(); @@ -384,7 +392,7 @@ void GnuPGControllerDialog::slot_add_new_key_database() { } void GnuPGControllerDialog::slot_refresh_key_database_table() { - auto key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; ui_->keyDatabaseTable->setRowCount(static_cast<int>(key_databases.size())); int index = 0; @@ -396,7 +404,7 @@ void GnuPGControllerDialog::slot_refresh_key_database_table() { i_name->setTextAlignment(Qt::AlignCenter); ui_->keyDatabaseTable->setVerticalHeaderItem( - index, new QTableWidgetItem(QString::number(index))); + index, new QTableWidgetItem(QString::number(index + 1))); ui_->keyDatabaseTable->setItem(index, 0, i_name); ui_->keyDatabaseTable->setItem(index, 1, @@ -417,7 +425,7 @@ void GnuPGControllerDialog::contextMenuEvent(QContextMenuEvent* event) { void GnuPGControllerDialog::slot_remove_existing_key_database() { const auto row_size = ui_->keyDatabaseTable->rowCount(); - auto& key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; for (int i = 0; i < row_size; i++) { auto* const item = ui_->keyDatabaseTable->item(i, 1); if (!item->isSelected()) continue; @@ -434,7 +442,7 @@ void GnuPGControllerDialog::slot_remove_existing_key_database() { void GnuPGControllerDialog::slot_open_key_database() { const auto row_size = ui_->keyDatabaseTable->rowCount(); - auto& key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; for (int i = 0; i < row_size; i++) { auto* const item = ui_->keyDatabaseTable->item(i, 1); if (!item->isSelected()) continue; @@ -449,7 +457,7 @@ void GnuPGControllerDialog::slot_move_up_key_database() { if (row_size <= 0) return; - auto& key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; for (int i = 0; i < row_size; i++) { auto* const item = ui_->keyDatabaseTable->item(i, 1); @@ -479,7 +487,7 @@ void GnuPGControllerDialog::slot_move_to_top_key_database() { if (row_size <= 0) return; - auto& key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; for (int i = 0; i < row_size; i++) { auto* const item = ui_->keyDatabaseTable->item(i, 1); @@ -512,7 +520,7 @@ void GnuPGControllerDialog::slot_move_down_key_database() { if (row_size <= 0) return; - auto& key_databases = buffered_key_db_so_; + auto& key_databases = editable_key_db_so_; for (int i = row_size - 1; i >= 0; i--) { auto* const item = ui_->keyDatabaseTable->item(i, 1); @@ -557,31 +565,34 @@ void GnuPGControllerDialog::slot_edit_key_database() { return; } - auto& key_databases = buffered_key_db_so_; - KeyDatabaseItemSO& selected_key_database = key_databases[selected_row]; - auto* dialog = new KeyDatabaseEditDialog(this); + auto& key_databases = editable_key_db_so_; + KeyDatabaseInfo& selected_key_database = key_databases[selected_row]; + auto* dialog = new KeyDatabaseEditDialog(editable_key_db_so_, this); dialog->SetDefaultName(selected_key_database.name); dialog->SetDefaultPath(selected_key_database.path); connect(dialog, &KeyDatabaseEditDialog::SignalKeyDatabaseInfoAccepted, this, - [this, selected_row](const QString& name, const QString& path) { - auto& key_databases = buffered_key_db_so_; - - for (int i = 0; i < key_databases.size(); i++) { - if (i != selected_row && - QFileInfo(key_databases[i].path) == QFileInfo(path)) { - QMessageBox::warning( - this, tr("Duplicate Key Database Paths"), - tr("The edited key database path duplicates a previously " - "existing one.")); - return; + [this, selected_row, selected_key_database](const QString& name, + const QString& path) { + auto& all_key_databases = buffered_key_db_so_; + + if (selected_key_database.path != path) { + for (int i = 0; i < all_key_databases.size(); i++) { + if (i != selected_row && + QFileInfo(all_key_databases[i].path) == QFileInfo(path)) { + QMessageBox::warning( + this, tr("Duplicate Key Database Paths"), + tr("The edited key database path duplicates a previously " + "existing one.")); + return; + } } } LOG_D() << "edit key database path, name: " << name << "path: " << path; - KeyDatabaseItemSO& key_database = key_databases[selected_row]; + KeyDatabaseInfo& key_database = editable_key_db_so_[selected_row]; key_database.name = name; key_database.path = path; diff --git a/src/ui/dialog/controller/GnuPGControllerDialog.h b/src/ui/dialog/controller/GnuPGControllerDialog.h index 8d53dca6..9c42180c 100644 --- a/src/ui/dialog/controller/GnuPGControllerDialog.h +++ b/src/ui/dialog/controller/GnuPGControllerDialog.h @@ -130,7 +130,8 @@ class GnuPGControllerDialog : public GeneralDialog { QString custom_key_database_path_; QString custom_gnupg_path_; QMenu* popup_menu_{}; - QList<KeyDatabaseItemSO> buffered_key_db_so_; + QList<KeyDatabaseInfo> buffered_key_db_so_; + QList<KeyDatabaseInfo> editable_key_db_so_; /** * @brief Get the Restart Needed object |