aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-11-22 22:49:09 +0000
committersaturneric <[email protected]>2024-11-22 22:49:09 +0000
commitac78b0fe2d8c285ef1f051d883ac046ce6557fe7 (patch)
tree116baa5ee75a40b84017bcad0266f283542743b8
parentfeat: improve version option (diff)
downloadGpgFrontend-ac78b0fe2d8c285ef1f051d883ac046ce6557fe7.tar.gz
GpgFrontend-ac78b0fe2d8c285ef1f051d883ac046ce6557fe7.zip
feat: default key db is not editable
-rw-r--r--src/core/struct/settings_object/KeyDatabaseItemSO.h6
-rw-r--r--src/ui/dialog/KeyDatabaseEditDialog.cpp17
-rw-r--r--src/ui/dialog/KeyDatabaseEditDialog.h7
-rw-r--r--src/ui/dialog/controller/GnuPGControllerDialog.cpp69
-rw-r--r--src/ui/dialog/controller/GnuPGControllerDialog.h3
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