aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/widgets/KeyList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/widgets/KeyList.cpp')
-rw-r--r--src/ui/widgets/KeyList.cpp249
1 files changed, 134 insertions, 115 deletions
diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp
index fb26295f..429a5bd1 100644
--- a/src/ui/widgets/KeyList.cpp
+++ b/src/ui/widgets/KeyList.cpp
@@ -31,34 +31,50 @@
#include <cstddef>
#include "core/function/GlobalSettingStation.h"
+#include "core/function/gpg/GpgAbstractKeyGetter.h"
#include "core/function/gpg/GpgKeyGetter.h"
#include "core/utils/GpgUtils.h"
#include "ui/UISignalStation.h"
#include "ui/UserInterfaceUtils.h"
+#include "ui/dialog/KeyGroupCreationDialog.h"
#include "ui/dialog/import_export/KeyImportDetailDialog.h"
+
+//
#include "ui_KeyList.h"
namespace GpgFrontend::UI {
+KeyList::KeyList(QWidget* parent)
+ : QWidget(parent),
+ ui_(GpgFrontend::SecureCreateSharedObject<Ui_KeyList>()),
+ model_(GpgAbstractKeyGetter::GetInstance(kGpgFrontendDefaultChannel)
+ .GetGpgKeyTableModel()),
+ global_column_filter_(static_cast<GpgKeyTableColumn>(
+ GetSettings()
+ .value("keys/global_columns_filter",
+ static_cast<unsigned int>(GpgKeyTableColumn::kALL))
+ .toUInt())) {
+ ui_->setupUi(this);
+}
+
KeyList::KeyList(int channel, KeyMenuAbility menu_ability,
GpgKeyTableColumn fixed_columns_filter, QWidget* parent)
: QWidget(parent),
ui_(GpgFrontend::SecureCreateSharedObject<Ui_KeyList>()),
current_gpg_context_channel_(channel),
menu_ability_(menu_ability),
- model_(GpgKeyGetter::GetInstance(channel).GetGpgKeyTableModel()),
+ model_(GpgAbstractKeyGetter::GetInstance(channel).GetGpgKeyTableModel()),
fixed_columns_filter_(fixed_columns_filter),
global_column_filter_(static_cast<GpgKeyTableColumn>(
GetSettings()
.value("keys/global_columns_filter",
static_cast<unsigned int>(GpgKeyTableColumn::kALL))
.toUInt())) {
+ ui_->setupUi(this);
init();
}
void KeyList::init() {
- ui_->setupUi(this);
-
ui_->menuWidget->setHidden(menu_ability_ == KeyMenuAbility::kNONE);
ui_->refreshKeyListButton->setHidden(~menu_ability_ &
KeyMenuAbility::kREFRESH);
@@ -70,6 +86,7 @@ void KeyList::init() {
ui_->searchBarEdit->setHidden(~menu_ability_ & KeyMenuAbility::kSEARCH_BAR);
ui_->switchContextButton->setHidden(~menu_ability_ &
KeyMenuAbility::kKEY_DATABASE);
+ ui_->keyGroupButton->setHidden(~menu_ability_ & KeyMenuAbility::kKEY_GROUP);
auto* gpg_context_menu = new QMenu(this);
auto* gpg_context_groups = new QActionGroup(this);
@@ -243,6 +260,16 @@ void KeyList::init() {
GetSettings().setValue("keys/global_columns_filter",
static_cast<unsigned int>(global_column_filter_));
});
+ connect(ui_->keyGroupButton, &QPushButton::clicked, this,
+ &KeyList::slot_new_key_group);
+ connect(this, &KeyList::SignalKeyChecked, this, [=]() {
+ auto keys = GetCheckedKeys();
+
+ ui_->keyGroupButton->setDisabled(keys.empty());
+ for (const auto& key : keys) {
+ if (!key->IsHasEncrCap()) ui_->keyGroupButton->setDisabled(true);
+ }
+ });
setAcceptDrops(true);
@@ -261,10 +288,10 @@ void KeyList::init() {
ui_->searchBarEdit->setPlaceholderText(tr("Search for keys..."));
}
-void KeyList::AddListGroupTab(const QString& name, const QString& id,
- GpgKeyTableDisplayMode display_mode,
- GpgKeyTableProxyModel::KeyFilter search_filter,
- GpgKeyTableColumn custom_columns_filter) {
+auto KeyList::AddListGroupTab(
+ const QString& name, const QString& id, GpgKeyTableDisplayMode display_mode,
+ GpgKeyTableProxyModel::KeyFilter search_filter,
+ GpgKeyTableColumn custom_columns_filter) -> KeyTable* {
auto* key_table =
new KeyTable(this, model_, display_mode, custom_columns_filter,
std::move(search_filter));
@@ -274,8 +301,13 @@ void KeyList::AddListGroupTab(const QString& name, const QString& id,
connect(this, &KeyList::SignalColumnTypeChange, key_table,
&KeyTable::SignalColumnTypeChange);
+ connect(key_table, &KeyTable::SignalKeyChecked, this, [=]() {
+ if (sender() != ui_->keyGroupTab->currentWidget()) return;
+ emit SignalKeyChecked();
+ });
UpdateKeyTableColumnType(global_column_filter_);
+ return key_table;
}
void KeyList::SlotRefresh() {
@@ -284,7 +316,7 @@ void KeyList::SlotRefresh() {
LOG_D() << "request new key table module, current gpg context channel: "
<< current_gpg_context_channel_;
- model_ = GpgKeyGetter::GetInstance(current_gpg_context_channel_)
+ model_ = GpgAbstractKeyGetter::GetInstance(current_gpg_context_channel_)
.GetGpgKeyTableModel();
for (int i = 0; i < ui_->keyGroupTab->count(); i++) {
@@ -300,112 +332,54 @@ void KeyList::SlotRefreshUI() {
emit SignalRefreshStatusBar(tr("Key List Refreshed."), 1000);
ui_->refreshKeyListButton->setDisabled(false);
ui_->syncButton->setDisabled(false);
+ emit SignalKeyChecked();
}
-auto KeyList::GetChecked(const KeyTable& key_table) -> KeyIdArgsList {
- auto ret = KeyIdArgsList{};
- for (int i = 0; i < key_table.GetRowCount(); i++) {
- if (key_table.IsRowChecked(i)) {
- ret.push_back(key_table.GetKeyIdByRow(i));
- }
- }
- return ret;
-}
-
-auto KeyList::GetChecked() -> KeyIdArgsList {
+auto KeyList::GetCheckedKeys() -> GpgAbstractKeyPtrList {
auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
- auto ret = KeyIdArgsList{};
- for (int i = 0; i < key_table->GetRowCount(); i++) {
- if (key_table->IsRowChecked(i)) {
- ret.push_back(key_table->GetKeyIdByRow(i));
- }
- }
- return ret;
-}
-auto KeyList::GetCheckedKeys() -> QStringList {
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
- QStringList key_id_list;
- for (int i = 0; i < key_table->GetRowCount(); i++) {
- if (key_table->IsRowChecked(i)) {
- key_id_list.append(key_table->GetKeyIdByRow(i));
- }
- }
- return key_id_list;
-}
+ assert(key_table != nullptr);
+ if (key_table == nullptr) return {};
-auto KeyList::GetAllPrivateKeys() -> KeyIdArgsList {
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
- auto ret = KeyIdArgsList{};
- for (int i = 0; i < key_table->GetRowCount(); i++) {
- if (key_table->IsPrivateKeyByRow(i)) {
- ret.push_back(key_table->GetKeyIdByRow(i));
- }
- }
- return ret;
+ return key_table->GetCheckedKeys();
}
-auto KeyList::GetCheckedPrivateKey() -> KeyIdArgsList {
- auto ret = KeyIdArgsList{};
- if (ui_->keyGroupTab->size().isEmpty()) return ret;
-
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+auto KeyList::GetCheckedPrivateKey() -> GpgAbstractKeyPtrList {
+ auto ret = GpgAbstractKeyPtrList{};
- for (int i = 0; i < key_table->GetRowCount(); i++) {
- if (key_table->IsRowChecked(i) && key_table->IsPrivateKeyByRow(i)) {
- ret.push_back(key_table->GetKeyIdByRow(i));
- }
+ auto keys = GetCheckedKeys();
+ for (const auto& key : keys) {
+ if (key->IsPrivateKey()) ret.push_back(key);
}
+
return ret;
}
-auto KeyList::GetCheckedPublicKey() -> KeyIdArgsList {
- auto ret = KeyIdArgsList{};
- if (ui_->keyGroupTab->size().isEmpty()) return ret;
+auto KeyList::GetCheckedPublicKey() -> GpgAbstractKeyPtrList {
+ auto ret = GpgAbstractKeyPtrList{};
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
-
- for (int i = 0; i < key_table->GetRowCount(); i++) {
- if (key_table->IsRowChecked(i) && key_table->IsPublicKeyByRow(i)) {
- ret.push_back(key_table->GetKeyIdByRow(i));
- }
+ auto keys = GetCheckedKeys();
+ for (const auto& key : keys) {
+ if (!key->IsPrivateKey()) ret.push_back(key);
}
+
return ret;
}
-void KeyList::SetChecked(const KeyIdArgsList& keyIds,
+void KeyList::SetChecked(const KeyIdArgsList& key_ids,
const KeyTable& key_table) {
- if (!keyIds.empty()) {
+ if (!key_ids.empty()) {
for (int i = 0; i < key_table.GetRowCount(); i++) {
- if (std::find(keyIds.begin(), keyIds.end(), key_table.GetKeyIdByRow(i)) !=
- keyIds.end()) {
+ if (std::find(
+ key_ids.begin(), key_ids.end(),
+ key_table.GetKeyByIndex(key_table.model()->index(i, 0))->ID()) !=
+ key_ids.end()) {
key_table.SetRowChecked(i);
}
}
}
}
-auto KeyList::GetSelected() -> KeyIdArgsList {
- auto ret = KeyIdArgsList{};
- if (ui_->keyGroupTab->size().isEmpty()) return ret;
-
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
- if (key_table == nullptr) {
- FLOG_W("fail to get current key table, nullptr");
- return ret;
- }
-
- QItemSelectionModel* select = key_table->selectionModel();
- for (auto index : select->selectedRows()) {
- ret.push_back(key_table->GetKeyIdByRow(index.row()));
- }
-
- if (ret.empty()) {
- FLOG_W("nothing is selected at key list");
- }
- return ret;
-}
-
[[maybe_unused]] auto KeyList::ContainsPrivateKeys() -> bool {
if (ui_->keyGroupTab->size().isEmpty()) return false;
auto* key_table =
@@ -532,24 +506,29 @@ void KeyList::import_keys(const QByteArray& in_buffer) {
(new KeyImportDetailDialog(current_gpg_context_channel_, result, this));
}
-auto KeyList::GetSelectedKey() -> QString {
- if (ui_->keyGroupTab->size().isEmpty()) return {};
-
- auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
-
- QItemSelectionModel* select = key_table->selectionModel();
+auto KeyList::GetSelectedKey() -> GpgAbstractKeyPtr {
+ return GetSelectedKeys().front();
+}
- auto selected_rows = select->selectedRows();
- if (selected_rows.empty()) return {};
+auto KeyList::GetSelectedGpgKey() -> GpgKeyPtr {
+ return GetSelectedGpgKeys().front();
+}
- return key_table->GetKeyIdByRow(selected_rows.first().row());
+auto KeyList::GetSelectedGpgKeys() -> GpgKeyPtrList {
+ auto keys = GetSelectedKeys();
+ auto g_keys = GpgKeyPtrList{};
+ for (const auto& key : keys) {
+ if (key->KeyType() != GpgAbstractKeyType::kGPG_KEY) continue;
+ g_keys.push_back(qSharedPointerDynamicCast<GpgKey>(key));
+ }
+ return g_keys;
}
void KeyList::slot_sync_with_key_server() {
- auto checked_public_keys = GetCheckedPublicKey();
+ auto target_keys = GetCheckedPublicKey();
KeyIdArgsList key_ids;
- if (checked_public_keys.empty()) {
+ if (target_keys.empty()) {
QMessageBox::StandardButton const reply = QMessageBox::question(
this, QCoreApplication::tr("Sync All Public Key"),
QCoreApplication::tr("You have not checked any public keys that you "
@@ -559,13 +538,12 @@ void KeyList::slot_sync_with_key_server() {
if (reply == QMessageBox::No) return;
- auto all_key_ids = model_->GetAllKeyIds();
- for (auto& key_id : all_key_ids) {
- key_ids.push_back(key_id);
- }
+ target_keys = model_->GetAllKeys();
+ }
- } else {
- key_ids = checked_public_keys;
+ for (auto& key : target_keys) {
+ if (key->KeyType() != GpgAbstractKeyType::kGPG_KEY) continue;
+ key_ids.push_back(key->ID());
}
if (key_ids.empty()) return;
@@ -633,18 +611,59 @@ auto KeyList::GetCurrentGpgContextChannel() const -> int {
return current_gpg_context_channel_;
}
-auto KeyList::GetSelectedGpgKey() -> std::tuple<bool, GpgKey> {
- auto key_ids = GetSelected();
- if (key_ids.empty()) return {false, GpgKey()};
+auto KeyList::GetSelectedKeys() -> GpgAbstractKeyPtrList {
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+
+ assert(key_table != nullptr);
+ if (key_table == nullptr) return {};
+
+ return key_table->GetSelectedKeys();
+}
+
+void KeyList::slot_new_key_group() {
+ auto keys = GetCheckedKeys();
+
+ QStringList proper_key_ids;
+ for (const auto& key : keys) {
+ if (!key->IsHasEncrCap()) continue;
+ proper_key_ids.append(key->ID());
+ }
+
+ if (proper_key_ids.isEmpty()) return;
+
+ auto* dialog =
+ new KeyGroupCreationDialog(current_gpg_context_channel_, proper_key_ids);
+ dialog->exec();
+}
+
+void KeyList::UpdateKeyTableFilter(
+ int index, const GpgKeyTableProxyModel::KeyFilter& filter) {
+ if (ui_->keyGroupTab->size().isEmpty() ||
+ ui_->keyGroupTab->widget(index) == nullptr) {
+ return;
+ }
- auto key = GpgKeyGetter::GetInstance(GetCurrentGpgContextChannel())
- .GetKey(key_ids.front());
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->widget(index));
+ key_table->SetFilter(filter);
+}
- if (!key.IsGood()) {
- QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
- return {false, GpgKey()};
+void KeyList::RefreshKeyTable(int index) {
+ if (ui_->keyGroupTab->size().isEmpty() ||
+ ui_->keyGroupTab->widget(index) == nullptr) {
+ return;
}
- return {true, key};
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->widget(index));
+ key_table->RefreshProxyModel();
+}
+
+void KeyList::Init(int channel, KeyMenuAbility menu_ability,
+ GpgKeyTableColumn fixed_column_filter) {
+ current_gpg_context_channel_ = channel;
+ menu_ability_ = menu_ability;
+ fixed_columns_filter_ = fixed_column_filter;
+ model_ = GpgAbstractKeyGetter::GetInstance(channel).GetGpgKeyTableModel();
+
+ init();
}
} // namespace GpgFrontend::UI