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.cpp536
1 files changed, 178 insertions, 358 deletions
diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp
index be79a6fd..4229a35f 100644
--- a/src/ui/widgets/KeyList.cpp
+++ b/src/ui/widgets/KeyList.cpp
@@ -30,6 +30,7 @@
#include <cstddef>
#include <mutex>
+#include <utility>
#include "core/function/GlobalSettingStation.h"
#include "core/function/gpg/GpgKeyGetter.h"
@@ -43,7 +44,8 @@ namespace GpgFrontend::UI {
KeyList::KeyList(KeyMenuAbility::AbilityType menu_ability, QWidget* parent)
: QWidget(parent),
ui_(GpgFrontend::SecureCreateSharedObject<Ui_KeyList>()),
- menu_ability_(menu_ability) {
+ menu_ability_(menu_ability),
+ model_(GpgKeyGetter::GetInstance().GetGpgKeyTableModel()) {
init();
}
@@ -60,7 +62,7 @@ void KeyList::init() {
ui_->keyGroupTab->clear();
popup_menu_ = new QMenu(this);
- bool forbid_all_gnupg_connection =
+ auto forbid_all_gnupg_connection =
GlobalSettingStation::GetInstance()
.GetSettings()
.value("network/forbid_all_gnupg_connection", false)
@@ -112,120 +114,66 @@ void KeyList::init() {
}
void KeyList::AddListGroupTab(const QString& name, const QString& id,
- KeyListRow::KeyType selectType,
- KeyListColumn::InfoType infoType,
- const KeyTable::KeyTableFilter filter) {
- GF_UI_LOG_DEBUG("add list group tab: {}", name);
-
- auto* key_list = new QTableWidget(this);
- if (m_key_list_ == nullptr) {
- m_key_list_ = key_list;
- }
- key_list->setObjectName(id);
- ui_->keyGroupTab->addTab(key_list, name);
- m_key_tables_.emplace_back(key_list, selectType, infoType, filter);
- m_key_tables_.back().SetMenuAbility(menu_ability_);
-
- key_list->setColumnCount(8);
- key_list->horizontalHeader()->setSectionResizeMode(
- QHeaderView::ResizeToContents);
- key_list->verticalHeader()->hide();
- key_list->setShowGrid(false);
- key_list->sortByColumn(2, Qt::AscendingOrder);
- key_list->setSelectionBehavior(QAbstractItemView::SelectRows);
- key_list->setSelectionMode(QAbstractItemView::SingleSelection);
-
- // table items not editable
- key_list->setEditTriggers(QAbstractItemView::NoEditTriggers);
- // no focus (rectangle around table items)
- // maybe it should focus on whole row
- key_list->setFocusPolicy(Qt::NoFocus);
-
- key_list->setAlternatingRowColors(true);
+ GpgKeyTableDisplayMode select_type,
+ GpgKeyTableColumn info_type,
+ GpgKeyTableProxyModel::KeyFilter filter) {
+ auto* key_table =
+ new KeyTable(this, model_, select_type, info_type, std::move(filter));
- // Hidden Column For Purpose
- if ((infoType & KeyListColumn::TYPE) == 0U) {
- key_list->setColumnHidden(1, true);
- }
- if ((infoType & KeyListColumn::NAME) == 0U) {
- key_list->setColumnHidden(2, true);
- }
- if ((infoType & KeyListColumn::EmailAddress) == 0U) {
- key_list->setColumnHidden(3, true);
- }
- if ((infoType & KeyListColumn::Usage) == 0U) {
- key_list->setColumnHidden(4, true);
- }
- if ((infoType & KeyListColumn::Validity) == 0U) {
- key_list->setColumnHidden(5, true);
- }
- if ((infoType & KeyListColumn::KeyID) == 0U) {
- key_list->setColumnHidden(6, true);
- }
- if ((infoType & KeyListColumn::FingerPrint) == 0U) {
- key_list->setColumnHidden(7, true);
- }
-
- QStringList labels;
- labels << tr("Select") << tr("Type") << tr("Name") << tr("Email Address")
- << tr("Usage") << tr("Trust") << tr("Key ID") << tr("Finger Print");
-
- key_list->setHorizontalHeaderLabels(labels);
- key_list->horizontalHeader()->setStretchLastSection(false);
-
- connect(key_list, &QTableWidget::doubleClicked, this,
- &KeyList::slot_double_clicked);
+ key_table->setObjectName(id);
+ ui_->keyGroupTab->addTab(key_table, name);
}
void KeyList::SlotRefresh() {
- GF_UI_LOG_DEBUG("refresh, address: {}", static_cast<void*>(this));
-
ui_->refreshKeyListButton->setDisabled(true);
ui_->syncButton->setDisabled(true);
+ model_ = GpgKeyGetter::GetInstance().GetGpgKeyTableModel();
+
+ for (int i = 0; i < ui_->keyGroupTab->count(); i++) {
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->widget(i));
+ key_table->RefreshModel(model_);
+ }
+
emit SignalRefreshStatusBar(tr("Refreshing Key List..."), 3000);
- this->buffered_keys_list_ = GpgKeyGetter::GetInstance().FetchKey();
- this->slot_refresh_ui();
+ this->model_ = GpgKeyGetter::GetInstance().GetGpgKeyTableModel();
+
+ this->SlotRefreshUI();
}
void KeyList::SlotRefreshUI() {
- GF_UI_LOG_DEBUG("refresh, address: {}", static_cast<void*>(this));
- this->slot_refresh_ui();
+ emit SignalRefreshStatusBar(tr("Key List Refreshed."), 1000);
+ ui_->refreshKeyListButton->setDisabled(false);
+ ui_->syncButton->setDisabled(false);
}
auto KeyList::GetChecked(const KeyTable& key_table) -> KeyIdArgsListPtr {
auto ret = std::make_unique<KeyIdArgsList>();
- for (int i = 0; i < key_table.key_list_->rowCount(); i++) {
- if (key_table.key_list_->item(i, 0)->checkState() == Qt::Checked) {
- ret->push_back(key_table.buffered_keys_[i].GetId());
+ 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() -> KeyIdArgsListPtr {
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
auto ret = std::make_unique<KeyIdArgsList>();
- for (int i = 0; i < key_list->rowCount(); i++) {
- if (key_list->item(i, 0)->checkState() == Qt::Checked) {
- ret->push_back(buffered_keys[i].GetId());
+ 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::GetAllPrivateKeys() -> KeyIdArgsListPtr {
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
auto ret = std::make_unique<KeyIdArgsList>();
- for (int i = 0; i < key_list->rowCount(); i++) {
- if ((key_list->item(i, 1) != nullptr) && buffered_keys[i].IsPrivateKey()) {
- ret->push_back(buffered_keys[i].GetId());
+ for (int i = 0; i < key_table->GetRowCount(); i++) {
+ if (key_table->IsPrivateKeyByRow(i)) {
+ ret->push_back(key_table->GetKeyIdByRow(i));
}
}
return ret;
@@ -235,16 +183,11 @@ auto KeyList::GetCheckedPrivateKey() -> KeyIdArgsListPtr {
auto ret = std::make_unique<KeyIdArgsList>();
if (ui_->keyGroupTab->size().isEmpty()) return ret;
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
-
- for (int i = 0; i < key_list->rowCount(); i++) {
- if ((key_list->item(i, 0)->checkState() == Qt::Checked) &&
- ((key_list->item(i, 1)) != nullptr) &&
- buffered_keys[i].IsPrivateKey()) {
- ret->push_back(buffered_keys[i].GetId());
+ 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->IsPrivateKeyByRow(i)) {
+ ret->push_back(key_table->GetKeyIdByRow(i));
}
}
return ret;
@@ -254,16 +197,11 @@ auto KeyList::GetCheckedPublicKey() -> KeyIdArgsListPtr {
auto ret = std::make_unique<KeyIdArgsList>();
if (ui_->keyGroupTab->size().isEmpty()) return ret;
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
-
- for (int i = 0; i < key_list->rowCount(); i++) {
- if ((key_list->item(i, 0)->checkState() == Qt::Checked) &&
- ((key_list->item(i, 1)) != nullptr) &&
- !buffered_keys[i].IsPrivateKey()) {
- ret->push_back(buffered_keys[i].GetId());
+ 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));
}
}
return ret;
@@ -272,52 +210,43 @@ auto KeyList::GetCheckedPublicKey() -> KeyIdArgsListPtr {
void KeyList::SetChecked(const KeyIdArgsListPtr& keyIds,
const KeyTable& key_table) {
if (!keyIds->empty()) {
- for (int i = 0; i < key_table.key_list_->rowCount(); i++) {
+ for (int i = 0; i < key_table.GetRowCount(); i++) {
if (std::find(keyIds->begin(), keyIds->end(),
- key_table.buffered_keys_[i].GetId()) != keyIds->end()) {
- key_table.key_list_->item(i, 0)->setCheckState(Qt::Checked);
- }
- }
- }
-}
-
-void KeyList::SetChecked(KeyIdArgsListPtr key_ids) {
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- if (key_list == nullptr) return;
- if (!m_key_tables_.empty()) {
- for (auto& key_table : m_key_tables_) {
- if (key_table.key_list_ == key_list) {
- key_table.SetChecked(std::move(key_ids));
- break;
+ key_table.GetKeyIdByRow(i)) != keyIds->end()) {
+ key_table.SetRowChecked(i);
}
}
}
}
-KeyIdArgsListPtr KeyList::GetSelected() {
+auto KeyList::GetSelected() -> KeyIdArgsListPtr {
auto ret = std::make_unique<KeyIdArgsList>();
if (ui_->keyGroupTab->size().isEmpty()) return ret;
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+ if (key_table == nullptr) {
+ GF_UI_LOG_ERROR("fail to get current key table, nullptr");
+ return ret;
+ }
- for (int i = 0; i < key_list->rowCount(); i++) {
- if (key_list->item(i, 0)->isSelected()) {
- ret->push_back(buffered_keys[i].GetId());
- }
+ QItemSelectionModel* select = key_table->selectionModel();
+ for (auto index : select->selectedRows()) {
+ ret->push_back(key_table->GetKeyIdByRow(index.row()));
+ }
+
+ if (ret->empty()) {
+ GF_UI_LOG_WARN("nothing is selected at key list");
}
return ret;
}
[[maybe_unused]] auto KeyList::ContainsPrivateKeys() -> bool {
if (ui_->keyGroupTab->size().isEmpty()) return false;
- m_key_list_ = qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
+ auto* key_table =
+ qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- for (int i = 0; i < m_key_list_->rowCount(); i++) {
- if (m_key_list_->item(i, 1) != nullptr) {
+ for (int i = 0; i < key_table->rowCount(); i++) {
+ if (key_table->item(i, 1) != nullptr) {
return true;
}
}
@@ -326,21 +255,26 @@ KeyIdArgsListPtr KeyList::GetSelected() {
void KeyList::SetColumnWidth(int row, int size) {
if (ui_->keyGroupTab->size().isEmpty()) return;
- m_key_list_ = qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
-
- m_key_list_->setColumnWidth(row, size);
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+ key_table->setColumnWidth(row, size);
}
void KeyList::contextMenuEvent(QContextMenuEvent* event) {
- if (ui_->keyGroupTab->size().isEmpty()) return;
- m_key_list_ = qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
+ if (ui_->keyGroupTab->count() == 0) return;
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+
+ if (key_table == nullptr) {
+ GF_UI_LOG_DEBUG("m_key_list_ is nullptr, key group tab number: {}",
+ ui_->keyGroupTab->count());
+ return;
+ }
QString current_tab_widget_obj_name =
ui_->keyGroupTab->widget(ui_->keyGroupTab->currentIndex())->objectName();
GF_UI_LOG_DEBUG("current tab widget object name: {}",
current_tab_widget_obj_name);
if (current_tab_widget_obj_name == "favourite") {
- QList<QAction*> actions = popup_menu_->actions();
+ auto actions = popup_menu_->actions();
for (QAction* action : actions) {
if (action->data().toString() == "remove_key_from_favourtie_action") {
action->setVisible(true);
@@ -349,7 +283,7 @@ void KeyList::contextMenuEvent(QContextMenuEvent* event) {
}
}
} else {
- QList<QAction*> actions = popup_menu_->actions();
+ auto actions = popup_menu_->actions();
for (QAction* action : actions) {
if (action->data().toString() == "remove_key_from_favourtie_action") {
action->setVisible(false);
@@ -359,7 +293,7 @@ void KeyList::contextMenuEvent(QContextMenuEvent* event) {
}
}
- if (m_key_list_->selectedItems().length() > 0) {
+ if (key_table->GetRowSelected() >= 0) {
popup_menu_->exec(event->globalPos());
}
}
@@ -379,7 +313,7 @@ void KeyList::dropEvent(QDropEvent* event) {
// "always import keys"-CheckBox
auto* check_box = new QCheckBox(tr("Always import without bothering."));
- bool confirm_import_keys = GlobalSettingStation::GetInstance()
+ auto confirm_import_keys = GlobalSettingStation::GetInstance()
.GetSettings()
.value("basic/confirm_import_keys", true)
.toBool();
@@ -435,11 +369,11 @@ void KeyList::import_keys(const QByteArray& in_buffer) {
void KeyList::slot_double_clicked(const QModelIndex& index) {
if (ui_->keyGroupTab->size().isEmpty()) return;
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
+
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
if (m_action_ != nullptr) {
- const auto key =
- GpgKeyGetter::GetInstance().GetKey(buffered_keys[index.row()].GetId());
+ const auto key = GpgKeyGetter::GetInstance().GetKey(
+ key_table->GetKeyIdByRow(index.row()));
m_action_(key, this);
}
}
@@ -451,30 +385,15 @@ void KeyList::SetDoubleClickedAction(
auto KeyList::GetSelectedKey() -> QString {
if (ui_->keyGroupTab->size().isEmpty()) return {};
- const auto& buffered_keys =
- m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_;
- for (int i = 0; i < m_key_list_->rowCount(); i++) {
- if (m_key_list_->item(i, 0)->isSelected()) {
- return buffered_keys[i].GetId();
- }
- }
- return {};
-}
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
-void KeyList::slot_refresh_ui() {
- GF_UI_LOG_DEBUG("refresh: {}", static_cast<void*>(buffered_keys_list_.get()));
- if (buffered_keys_list_ != nullptr) {
- std::lock_guard<std::mutex> guard(buffered_key_list_mutex_);
+ QItemSelectionModel* select = key_table->selectionModel();
- for (auto& key_table : m_key_tables_) {
- key_table.Refresh(
- GpgKeyGetter::GetInstance().GetKeysCopy(buffered_keys_list_));
- }
- }
- emit SignalRefreshStatusBar(tr("Key List Refreshed."), 1000);
- ui_->refreshKeyListButton->setDisabled(false);
- ui_->syncButton->setDisabled(false);
+ auto selected_rows = select->selectedRows();
+ if (selected_rows.empty()) return {};
+
+ return key_table->GetKeyIdByRow(selected_rows.first().row());
}
void KeyList::slot_sync_with_key_server() {
@@ -490,14 +409,12 @@ void KeyList::slot_sync_with_key_server() {
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::No) return;
- {
- std::lock_guard<std::mutex> guard(buffered_key_list_mutex_);
- for (const auto& key : *buffered_keys_list_) {
- if (!(key.IsPrivateKey() && key.IsHasMasterKey())) {
- key_ids.push_back(key.GetId());
- }
- }
+
+ auto all_key_ids = model_->GetAllKeyIds();
+ for (auto& key_id : all_key_ids) {
+ key_ids.push_back(key_id);
}
+
} else {
key_ids = *checked_public_keys;
}
@@ -536,225 +453,128 @@ void KeyList::filter_by_keyword() {
keyword = keyword.trimmed();
GF_UI_LOG_DEBUG("get new keyword of search bar: {}", keyword);
- for (auto& table : m_key_tables_) {
+
+ for (int i = 0; i < ui_->keyGroupTab->count(); i++) {
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->widget(i));
// refresh arguments
- table.SetFilterKeyword(keyword.toLower());
- table.SetMenuAbility(menu_ability_);
+ key_table->SetFilterKeyword(keyword.toLower());
+ key_table->SetMenuAbility(menu_ability_);
}
+
// refresh ui
SlotRefreshUI();
}
void KeyList::uncheck_all() {
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- if (key_list == nullptr) return;
- if (!m_key_tables_.empty()) {
- for (auto& key_table : m_key_tables_) {
- if (key_table.key_list_ == key_list) {
- key_table.UncheckALL();
- break;
- }
- }
- }
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+ if (key_table == nullptr) return;
+ key_table->UncheckAll();
}
void KeyList::check_all() {
- auto* key_list =
- qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget());
- if (key_list == nullptr) return;
- if (!m_key_tables_.empty()) {
- for (auto& key_table : m_key_tables_) {
- if (key_table.key_list_ == key_list) {
- key_table.CheckALL();
- break;
- }
- }
- }
+ auto* key_table = qobject_cast<KeyTable*>(ui_->keyGroupTab->currentWidget());
+ if (key_table == nullptr) return;
+ key_table->CheckAll();
}
-KeyIdArgsListPtr& KeyTable::GetChecked() {
- if (checked_key_ids_ == nullptr) {
- checked_key_ids_ = std::make_unique<KeyIdArgsList>();
- }
- auto& ret = checked_key_ids_;
- for (size_t i = 0; i < buffered_keys_.size(); i++) {
- auto key_id = buffered_keys_[i].GetId();
- if (key_list_->item(i, 0)->checkState() == Qt::Checked &&
- std::find(ret->begin(), ret->end(), key_id) == ret->end()) {
- ret->push_back(key_id);
- }
+auto KeyTable::GetChecked() -> KeyIdArgsListPtr {
+ auto ret = std::make_unique<KeyIdArgsList>();
+ for (size_t i = 0; i < GetRowCount(); i++) {
+ if (IsRowChecked(i)) ret->push_back(GetKeyIdByRow(i));
}
return ret;
}
-void KeyTable::SetChecked(KeyIdArgsListPtr key_ids) {
- checked_key_ids_ = std::move(key_ids);
-}
-
-void KeyTable::Refresh(KeyLinkListPtr m_keys) {
- auto& checked_key_list = GetChecked();
- // while filling the table, sort enabled causes errors
-
- key_list_->setSortingEnabled(false);
- key_list_->clearContents();
-
- // Optimization for copy
- KeyLinkListPtr keys = nullptr;
- if (m_keys == nullptr) {
- keys = GpgKeyGetter::GetInstance().FetchKey();
- } else {
- keys = std::move(m_keys);
- }
-
- auto it = keys->begin();
- int row_count = 0;
-
- while (it != keys->end()) {
- // filter by search bar's keyword
- if (ability_ & KeyMenuAbility::SEARCH_BAR && !keyword_.isEmpty()) {
- QStringList infos;
- infos << it->GetName().toLower() << it->GetEmail().toLower()
- << it->GetComment().toLower() << it->GetFingerprint().toLower();
-
- auto subkeys = it->GetSubKeys();
- for (const auto& subkey : *subkeys) {
- infos << subkey.GetFingerprint().toLower() << subkey.GetID().toLower();
- }
-
- if (infos.filter(keyword_.toLower()).isEmpty()) {
- it = keys->erase(it);
- continue;
- }
- }
-
- if (filter_ != nullptr) {
- if (!filter_(*it, *this)) {
- it = keys->erase(it);
- continue;
- }
- }
-
- if (select_type_ == KeyListRow::ONLY_SECRET_KEY && !it->IsPrivateKey()) {
- it = keys->erase(it);
- continue;
- }
- row_count++;
- it++;
- }
+KeyTable::KeyTable(QWidget* parent, QSharedPointer<GpgKeyTableModel> model,
+ GpgKeyTableDisplayMode select_type,
+ GpgKeyTableColumn info_type,
+ GpgKeyTableProxyModel::KeyFilter filter)
+ : QTableView(parent),
+ model_(std::move(model)),
+ proxy_model_(model_, select_type, info_type, std::move(filter), this) {
+ setModel(&proxy_model_);
- key_list_->setRowCount(row_count);
+ verticalHeader()->hide();
+ horizontalHeader()->setStretchLastSection(false);
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
- int row_index = 0;
- it = keys->begin();
+ setShowGrid(false);
+ sortByColumn(2, Qt::AscendingOrder);
+ setSelectionBehavior(QAbstractItemView::SelectRows);
+ setSelectionMode(QAbstractItemView::SingleSelection);
- buffered_keys_.clear();
-
- while (it != keys->end()) {
- auto* tmp0 = new QTableWidgetItem(QString::number(row_index));
- tmp0->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled |
- Qt::ItemIsSelectable);
- tmp0->setTextAlignment(Qt::AlignCenter);
- tmp0->setCheckState(Qt::Unchecked);
- key_list_->setItem(row_index, 0, tmp0);
-
- QString type_str;
- QTextStream type_steam(&type_str);
- if (it->IsPrivateKey()) {
- type_steam << "pub/sec";
- } else {
- type_steam << "pub";
- }
-
- if (it->IsPrivateKey() && !it->IsHasMasterKey()) {
- type_steam << "#";
- }
-
- if (it->IsHasCardKey()) {
- type_steam << "^";
- }
-
- auto* tmp1 = new QTableWidgetItem(type_str);
- key_list_->setItem(row_index, 1, tmp1);
-
- auto* tmp2 = new QTableWidgetItem(it->GetName());
- key_list_->setItem(row_index, 2, tmp2);
- auto* tmp3 = new QTableWidgetItem(it->GetEmail());
- key_list_->setItem(row_index, 3, tmp3);
-
- QString usage;
- QTextStream usage_steam(&usage);
+ // table items not editable
+ setEditTriggers(QAbstractItemView::NoEditTriggers);
- if (it->IsHasActualCertificationCapability()) usage_steam << "C";
- if (it->IsHasActualEncryptionCapability()) usage_steam << "E";
- if (it->IsHasActualSigningCapability()) usage_steam << "S";
- if (it->IsHasActualAuthenticationCapability()) usage_steam << "A";
+ setFocusPolicy(Qt::NoFocus);
+ setAlternatingRowColors(true);
- auto* temp_usage = new QTableWidgetItem(usage);
- temp_usage->setTextAlignment(Qt::AlignCenter);
- key_list_->setItem(row_index, 4, temp_usage);
+ connect(CommonUtils::GetInstance(), &CommonUtils::SignalFavoritesChanged,
+ &proxy_model_, &GpgKeyTableProxyModel::SignalFavoritesChanged);
+}
- auto* temp_validity = new QTableWidgetItem(it->GetOwnerTrust());
- temp_validity->setTextAlignment(Qt::AlignCenter);
- key_list_->setItem(row_index, 5, temp_validity);
+void KeyTable::SetMenuAbility(KeyMenuAbility::AbilityType ability) {
+ this->ability_ = ability;
+}
- auto* temp_id = new QTableWidgetItem(it->GetId());
- temp_id->setTextAlignment(Qt::AlignCenter);
- key_list_->setItem(row_index, 6, temp_id);
+void KeyTable::SetFilterKeyword(const QString& keyword) {
+ proxy_model_.SetSearchKeywords(keyword);
+}
- auto* temp_fpr = new QTableWidgetItem(it->GetFingerprint());
- temp_fpr->setTextAlignment(Qt::AlignCenter);
- key_list_->setItem(row_index, 7, temp_fpr);
+void KeyTable::RefreshModel(QSharedPointer<GpgKeyTableModel> model) {
+ model_ = std::move(model);
+ proxy_model_.setSourceModel(model_.get());
+}
- QFont font = tmp2->font();
+auto KeyTable::IsRowChecked(int row) const -> bool {
+ auto index = model()->index(row, 0);
+ return index.data(Qt::CheckStateRole).toInt() == Qt::Checked;
+}
- // strike out expired keys
- if (it->IsExpired() || it->IsRevoked()) font.setStrikeOut(true);
- if (it->IsPrivateKey()) font.setBold(true);
+auto KeyTable::GetRowCount() const -> int { return model()->rowCount(); }
- tmp0->setFont(font);
- temp_usage->setFont(font);
- temp_fpr->setFont(font);
- temp_validity->setFont(font);
- tmp1->setFont(font);
- tmp2->setFont(font);
- tmp3->setFont(font);
- temp_id->setFont(font);
+auto KeyTable::GetKeyIdByRow(int row) const -> QString {
+ if (row < 0 || row >= model()->rowCount()) return {};
+ auto origin_row = model()->index(row, 0).data().toInt();
+ return model_->GetKeyIDByRow(origin_row);
+}
- // move to buffered keys
- buffered_keys_.emplace_back(std::move(*it));
+auto KeyTable::IsPrivateKeyByRow(int row) const -> bool {
+ if (row < 0 || row >= model()->rowCount()) return false;
+ auto origin_row = model()->index(row, 0).data().toInt();
+ return model_->IsPrivateKeyByRow(origin_row);
+}
- it++;
- ++row_index;
- }
+auto KeyTable::IsPublicKeyByRow(int row) const -> bool {
+ if (row < 0 || row >= model()->rowCount()) return false;
+ auto origin_row = model()->index(row, 0).data().toInt();
+ return !model_->IsPrivateKeyByRow(origin_row);
+}
- if (!checked_key_list->empty()) {
- for (int i = 0; i < key_list_->rowCount(); i++) {
- if (std::find(checked_key_list->begin(), checked_key_list->end(),
- buffered_keys_[i].GetId()) != checked_key_list->end()) {
- key_list_->item(i, 0)->setCheckState(Qt::Checked);
- }
- }
- }
+void KeyTable::SetRowChecked(int row) const {
+ if (row < 0 || row >= model()->rowCount()) return;
+ model()->setData(model()->index(row, 0), Qt::Checked, Qt::CheckStateRole);
}
-void KeyTable::UncheckALL() const {
- for (int i = 0; i < key_list_->rowCount(); i++) {
- key_list_->item(i, 0)->setCheckState(Qt::Unchecked);
+void KeyTable::CheckAll() {
+ for (int row = 0; row < model()->rowCount(); ++row) {
+ auto index = model()->index(row, 0);
+ model()->setData(index, Qt::Checked, Qt::CheckStateRole);
}
}
-void KeyTable::CheckALL() const {
- for (int i = 0; i < key_list_->rowCount(); i++) {
- key_list_->item(i, 0)->setCheckState(Qt::Checked);
+void KeyTable::UncheckAll() {
+ for (int row = 0; row < model()->rowCount(); ++row) {
+ auto index = model()->index(row, 0);
+ model()->setData(index, Qt::Unchecked, Qt::CheckStateRole);
}
}
-void KeyTable::SetMenuAbility(KeyMenuAbility::AbilityType ability) {
- this->ability_ = ability;
-}
+[[nodiscard]] auto KeyTable::GetRowSelected() const -> int {
+ auto selected_indexes = selectedIndexes();
+ if (selected_indexes.empty()) return -1;
-void KeyTable::SetFilterKeyword(QString keyword) {
- this->keyword_ = std::move(keyword);
+ return selected_indexes.first().row();
}
+
} // namespace GpgFrontend::UI