From e7694f9a0729cb88064eda6623c99070f5a46dc0 Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 2 Jun 2024 22:03:59 +0200 Subject: feat: rewrite key list structure and logic --- src/core/model/GpgKeyTableProxyModel.cpp | 142 +++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 src/core/model/GpgKeyTableProxyModel.cpp (limited to 'src/core/model/GpgKeyTableProxyModel.cpp') diff --git a/src/core/model/GpgKeyTableProxyModel.cpp b/src/core/model/GpgKeyTableProxyModel.cpp new file mode 100644 index 00000000..7fdedff5 --- /dev/null +++ b/src/core/model/GpgKeyTableProxyModel.cpp @@ -0,0 +1,142 @@ +/** + * Copyright (C) 2021 Saturneric + * + * 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 . + * + * 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 starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GpgKeyTableProxyModel.h" + +#include + +#include "core/function/gpg/GpgKeyGetter.h" +#include "core/model/CacheObject.h" +#include "core/model/GpgKey.h" + +namespace GpgFrontend { + +GpgKeyTableProxyModel::GpgKeyTableProxyModel( + QSharedPointer model, GpgKeyTableDisplayMode display_mode, + GpgKeyTableColumn columns, KeyFilter filter, QObject *parent) + : QSortFilterProxyModel(parent), + model_(std::move(model)), + display_mode_(display_mode), + filter_columns_(columns), + custom_filter_(std::move(filter)) { + setSourceModel(model_.get()); + + connect(this, &GpgKeyTableProxyModel::SignalFavoritesChanged, this, + &GpgKeyTableProxyModel::slot_update_favorites); + + emit SignalFavoritesChanged(); +} + +auto GpgKeyTableProxyModel::filterAcceptsRow( + int source_row, const QModelIndex &sourceParent) const -> bool { + auto index = sourceModel()->index(source_row, 6, sourceParent); + auto key_id = sourceModel()->data(index).toString(); + auto key = GpgKeyGetter::GetInstance().GetKey(key_id); + + if (!(display_mode_ & GpgKeyTableDisplayMode::kPrivateKey) && + key.IsPrivateKey()) { + return false; + } + + if (!(display_mode_ & GpgKeyTableDisplayMode::kPublicKey) && + !key.IsPrivateKey()) { + return false; + } + + if (!custom_filter_(key)) return false; + + if (display_mode_ & GpgKeyTableDisplayMode::kFavorites && + !favorite_fingerprints_.contains(key.GetFingerprint())) { + return false; + } + + if (filter_keywords_.isEmpty()) return true; + + QStringList infos; + for (int column = 0; column < sourceModel()->columnCount(); ++column) { + auto index = sourceModel()->index(source_row, column, sourceParent); + infos << sourceModel()->data(index).toString(); + } + + for (const QString &info : infos) { + if (info.contains(filter_keywords_, Qt::CaseInsensitive)) return true; + } + + return false; +} + +auto GpgKeyTableProxyModel::filterAcceptsColumn( + int sourceColumn, const QModelIndex &sourceParent) const -> bool { + switch (sourceColumn) { + case 0: { + return true; + } + case 1: { + return filter_columns_ & GpgKeyTableColumn::kType; + } + case 2: { + return filter_columns_ & GpgKeyTableColumn::kName; + } + case 3: { + return filter_columns_ & GpgKeyTableColumn::kEmailAddress; + } + case 4: { + return filter_columns_ & GpgKeyTableColumn::kUsage; + } + case 5: { + return filter_columns_ & GpgKeyTableColumn::kOwnerTrust; + } + case 6: { + return filter_columns_ & GpgKeyTableColumn::kKeyId; + } + case 7: { + return filter_columns_ & GpgKeyTableColumn::kFingerPrint; + } + default: + return false; + } +} + +void GpgKeyTableProxyModel::SetSearchKeywords(const QString &keywords) { + this->filter_keywords_ = keywords; + invalidateFilter(); +} + +void GpgKeyTableProxyModel::slot_update_favorites() { + // load cache + auto json_data = CacheObject("favourite_key_pair"); + if (!json_data.isArray()) return; + + auto key_fprs = json_data.array(); + for (const auto &key_fpr : key_fprs) { + if (key_fpr.isString()) favorite_fingerprints_.append(key_fpr.toString()); + } + + invalidateFilter(); +} +} // namespace GpgFrontend \ No newline at end of file -- cgit v1.2.3 From d0333031c1f593998a501eff866f091ff2f036be Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 28 Jun 2024 23:05:25 +0200 Subject: feat: user can select shown columns at key table --- src/core/model/GpgKeyTableProxyModel.cpp | 44 ++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'src/core/model/GpgKeyTableProxyModel.cpp') diff --git a/src/core/model/GpgKeyTableProxyModel.cpp b/src/core/model/GpgKeyTableProxyModel.cpp index 7fdedff5..0ecd000f 100644 --- a/src/core/model/GpgKeyTableProxyModel.cpp +++ b/src/core/model/GpgKeyTableProxyModel.cpp @@ -48,6 +48,8 @@ GpgKeyTableProxyModel::GpgKeyTableProxyModel( connect(this, &GpgKeyTableProxyModel::SignalFavoritesChanged, this, &GpgKeyTableProxyModel::slot_update_favorites); + connect(this, &GpgKeyTableProxyModel::SignalColumnTypeChange, this, + &GpgKeyTableProxyModel::slot_update_column_type); emit SignalFavoritesChanged(); } @@ -58,19 +60,19 @@ auto GpgKeyTableProxyModel::filterAcceptsRow( auto key_id = sourceModel()->data(index).toString(); auto key = GpgKeyGetter::GetInstance().GetKey(key_id); - if (!(display_mode_ & GpgKeyTableDisplayMode::kPrivateKey) && + if (!(display_mode_ & GpgKeyTableDisplayMode::kPRIVATE_KEY) && key.IsPrivateKey()) { return false; } - if (!(display_mode_ & GpgKeyTableDisplayMode::kPublicKey) && + if (!(display_mode_ & GpgKeyTableDisplayMode::kPUBLIC_KEY) && !key.IsPrivateKey()) { return false; } if (!custom_filter_(key)) return false; - if (display_mode_ & GpgKeyTableDisplayMode::kFavorites && + if (display_mode_ & GpgKeyTableDisplayMode::kFAVORITES && !favorite_fingerprints_.contains(key.GetFingerprint())) { return false; } @@ -97,25 +99,40 @@ auto GpgKeyTableProxyModel::filterAcceptsColumn( return true; } case 1: { - return filter_columns_ & GpgKeyTableColumn::kType; + return (filter_columns_ & GpgKeyTableColumn::kTYPE) != + GpgKeyTableColumn::kNONE; } case 2: { - return filter_columns_ & GpgKeyTableColumn::kName; + return (filter_columns_ & GpgKeyTableColumn::kNAME) != + GpgKeyTableColumn::kNONE; } case 3: { - return filter_columns_ & GpgKeyTableColumn::kEmailAddress; + return (filter_columns_ & GpgKeyTableColumn::kEMAIL_ADDRESS) != + GpgKeyTableColumn::kNONE; } case 4: { - return filter_columns_ & GpgKeyTableColumn::kUsage; + return (filter_columns_ & GpgKeyTableColumn::kUSAGE) != + GpgKeyTableColumn::kNONE; } case 5: { - return filter_columns_ & GpgKeyTableColumn::kOwnerTrust; + return (filter_columns_ & GpgKeyTableColumn::kOWNER_TRUST) != + GpgKeyTableColumn::kNONE; } case 6: { - return filter_columns_ & GpgKeyTableColumn::kKeyId; + return (filter_columns_ & GpgKeyTableColumn::kKEY_ID) != + GpgKeyTableColumn::kNONE; } case 7: { - return filter_columns_ & GpgKeyTableColumn::kFingerPrint; + return (filter_columns_ & GpgKeyTableColumn::kCREATE_DATE) != + GpgKeyTableColumn::kNONE; + } + case 8: { + return (filter_columns_ & GpgKeyTableColumn::kALGO) != + GpgKeyTableColumn::kNONE; + } + case 9: { + return (filter_columns_ & GpgKeyTableColumn::kSUBKEYS_NUMBER) != + GpgKeyTableColumn::kNONE; } default: return false; @@ -139,4 +156,11 @@ void GpgKeyTableProxyModel::slot_update_favorites() { invalidateFilter(); } + +void GpgKeyTableProxyModel::slot_update_column_type( + GpgKeyTableColumn filter_columns) { + filter_columns_ = filter_columns; + invalidateColumnsFilter(); +} + } // namespace GpgFrontend \ No newline at end of file -- cgit v1.2.3 From 2c42d6cb727001422c68a86f1cb4221a32892a59 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 28 Jun 2024 23:31:45 +0200 Subject: feat: enable sorting and add column "comment" at key table --- src/core/model/GpgKeyTableProxyModel.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/core/model/GpgKeyTableProxyModel.cpp') diff --git a/src/core/model/GpgKeyTableProxyModel.cpp b/src/core/model/GpgKeyTableProxyModel.cpp index 0ecd000f..5ed9ade3 100644 --- a/src/core/model/GpgKeyTableProxyModel.cpp +++ b/src/core/model/GpgKeyTableProxyModel.cpp @@ -134,6 +134,10 @@ auto GpgKeyTableProxyModel::filterAcceptsColumn( return (filter_columns_ & GpgKeyTableColumn::kSUBKEYS_NUMBER) != GpgKeyTableColumn::kNONE; } + case 10: { + return (filter_columns_ & GpgKeyTableColumn::kCOMMENT) != + GpgKeyTableColumn::kNONE; + } default: return false; } -- cgit v1.2.3 From 28546a83da7eb4ace931fe2f26124fe935d4b0c5 Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 28 Jul 2024 17:32:25 +0200 Subject: feat: search for keywords in all uids --- src/core/model/GpgKeyTableProxyModel.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/core/model/GpgKeyTableProxyModel.cpp') diff --git a/src/core/model/GpgKeyTableProxyModel.cpp b/src/core/model/GpgKeyTableProxyModel.cpp index 5ed9ade3..aa5cc4b1 100644 --- a/src/core/model/GpgKeyTableProxyModel.cpp +++ b/src/core/model/GpgKeyTableProxyModel.cpp @@ -83,12 +83,17 @@ auto GpgKeyTableProxyModel::filterAcceptsRow( for (int column = 0; column < sourceModel()->columnCount(); ++column) { auto index = sourceModel()->index(source_row, column, sourceParent); infos << sourceModel()->data(index).toString(); - } - for (const QString &info : infos) { - if (info.contains(filter_keywords_, Qt::CaseInsensitive)) return true; + const auto uids = key.GetUIDs(); + for (const auto &uid : *uids) { + infos << uid.GetUID(); + } } + return std::any_of(infos.cbegin(), infos.cend(), [&](const QString &info) { + return info.contains(filter_keywords_, Qt::CaseInsensitive); + }); + return false; } -- cgit v1.2.3 From 3dccd8cff1c3b063110e00112b0878de887daca3 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 29 Jul 2024 03:48:21 +0200 Subject: fix: solve qt5 problems --- src/core/model/GpgKeyTableProxyModel.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/core/model/GpgKeyTableProxyModel.cpp') diff --git a/src/core/model/GpgKeyTableProxyModel.cpp b/src/core/model/GpgKeyTableProxyModel.cpp index aa5cc4b1..aebe06ef 100644 --- a/src/core/model/GpgKeyTableProxyModel.cpp +++ b/src/core/model/GpgKeyTableProxyModel.cpp @@ -169,7 +169,11 @@ void GpgKeyTableProxyModel::slot_update_favorites() { void GpgKeyTableProxyModel::slot_update_column_type( GpgKeyTableColumn filter_columns) { filter_columns_ = filter_columns; +#ifdef QT5_BUILD + invalidateFilter(); +#else invalidateColumnsFilter(); +#endif } } // namespace GpgFrontend \ No newline at end of file -- cgit v1.2.3