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/GpgKeyTableModel.cpp | 162 ++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/core/model/GpgKeyTableModel.cpp (limited to 'src/core/model/GpgKeyTableModel.cpp') diff --git a/src/core/model/GpgKeyTableModel.cpp b/src/core/model/GpgKeyTableModel.cpp new file mode 100644 index 00000000..cff619cd --- /dev/null +++ b/src/core/model/GpgKeyTableModel.cpp @@ -0,0 +1,162 @@ +/** + * 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 "GpgKeyTableModel.h" + +#include "core/function/gpg/GpgKeyGetter.h" +#include "core/model/GpgKey.h" + +namespace GpgFrontend { + +GpgKeyTableModel::GpgKeyTableModel(GpgKeyList keys, QObject *parent) + : QAbstractTableModel(parent), + buffered_keys_(keys), + column_headers_({tr("Select"), tr("Type"), tr("Name"), + tr("Email Address"), tr("Usage"), tr("Trust"), + tr("Key ID"), tr("Finger Print")}), + key_check_state_(buffered_keys_.size()) {} + +auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { + return static_cast(buffered_keys_.size()); +} + +auto GpgKeyTableModel::columnCount(const QModelIndex & /*parent*/) const + -> int { + return 8; +} + +auto GpgKeyTableModel::data(const QModelIndex &index, int role) const + -> QVariant { + if (!index.isValid() || buffered_keys_.empty()) return {}; + + if (role == Qt::TextAlignmentRole) { + return Qt::AlignCenter; + } + + if (role == Qt::CheckStateRole) { + if (index.column() == 0) { + return key_check_state_[index.row()] ? Qt::Checked : Qt::Unchecked; + } + return {}; + } + + const auto &key = buffered_keys_.at(index.row()); + + switch (index.column()) { + case 0: { + return index.row(); + } + case 1: { + QString type_sym; + type_sym += key.IsPrivateKey() ? "pub/sec" : "pub"; + if (key.IsPrivateKey() && !key.IsHasMasterKey()) type_sym += "#"; + if (key.IsHasCardKey()) type_sym += "^"; + return type_sym; + } + case 2: { + return key.GetName(); + } + case 3: { + return key.GetEmail(); + } + case 4: { + QString usage_sym; + if (key.IsHasActualCertificationCapability()) usage_sym += "C"; + if (key.IsHasActualEncryptionCapability()) usage_sym += "E"; + if (key.IsHasActualSigningCapability()) usage_sym += "S"; + if (key.IsHasActualAuthenticationCapability()) usage_sym += "A"; + return usage_sym; + } + case 5: { + return key.GetOwnerTrust(); + } + case 6: { + return key.GetId(); + } + case 7: { + return key.GetFingerprint(); + } + default: + return {}; + } +} + +auto GpgKeyTableModel::headerData(int section, Qt::Orientation orientation, + int role) const -> QVariant { + if (role != Qt::DisplayRole) return {}; + + if (orientation == Qt::Horizontal) { + return column_headers_[section]; + } + + return {}; +} + +auto GpgKeyTableModel::flags(const QModelIndex &index) const -> Qt::ItemFlags { + if (!index.isValid()) return Qt::NoItemFlags; + + if (index.column() == 0) { + return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled; + } + + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; +} + +auto GpgKeyTableModel::setData(const QModelIndex &index, const QVariant &value, + int role) -> bool { + if (!index.isValid()) return false; + + if (index.column() == 0 && role == Qt::CheckStateRole) { + key_check_state_[index.row()] = (value == Qt::Checked); + emit dataChanged(index, index); + return true; + } + + return false; +} + +auto GpgKeyTableModel::GetAllKeyIds() -> GpgKeyIDList { + GpgKeyIDList keys; + for (auto &key : buffered_keys_) { + keys.push_back(key.GetId()); + } + return keys; +} + +auto GpgKeyTableModel::GetKeyIDByRow(int row) const -> QString { + if (buffered_keys_.size() <= row) return {}; + + return buffered_keys_[row].GetId(); +} + +auto GpgKeyTableModel::IsPrivateKeyByRow(int row) const -> bool { + if (buffered_keys_.size() <= row) return false; + return buffered_keys_[row].IsPrivateKey(); +} + +} // namespace GpgFrontend -- 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/GpgKeyTableModel.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src/core/model/GpgKeyTableModel.cpp') diff --git a/src/core/model/GpgKeyTableModel.cpp b/src/core/model/GpgKeyTableModel.cpp index cff619cd..4d542c3f 100644 --- a/src/core/model/GpgKeyTableModel.cpp +++ b/src/core/model/GpgKeyTableModel.cpp @@ -36,9 +36,18 @@ namespace GpgFrontend { GpgKeyTableModel::GpgKeyTableModel(GpgKeyList keys, QObject *parent) : QAbstractTableModel(parent), buffered_keys_(keys), - column_headers_({tr("Select"), tr("Type"), tr("Name"), - tr("Email Address"), tr("Usage"), tr("Trust"), - tr("Key ID"), tr("Finger Print")}), + column_headers_({ + tr("Select"), + tr("Type"), + tr("Name"), + tr("Email Address"), + tr("Usage"), + tr("Trust"), + tr("Key ID"), + tr("Create Date"), + tr("Algorithm"), + tr("Subkey(s)"), + }), key_check_state_(buffered_keys_.size()) {} auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { @@ -47,7 +56,7 @@ auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { auto GpgKeyTableModel::columnCount(const QModelIndex & /*parent*/) const -> int { - return 8; + return 10; } auto GpgKeyTableModel::data(const QModelIndex &index, int role) const @@ -99,7 +108,13 @@ auto GpgKeyTableModel::data(const QModelIndex &index, int role) const return key.GetId(); } case 7: { - return key.GetFingerprint(); + return key.GetCreateTime(); + } + case 8: { + return key.GetKeyAlgo(); + } + case 9: { + return static_cast(key.GetSubKeys()->size()); } default: return {}; -- 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/GpgKeyTableModel.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'src/core/model/GpgKeyTableModel.cpp') diff --git a/src/core/model/GpgKeyTableModel.cpp b/src/core/model/GpgKeyTableModel.cpp index 4d542c3f..e2a4fe37 100644 --- a/src/core/model/GpgKeyTableModel.cpp +++ b/src/core/model/GpgKeyTableModel.cpp @@ -36,18 +36,10 @@ namespace GpgFrontend { GpgKeyTableModel::GpgKeyTableModel(GpgKeyList keys, QObject *parent) : QAbstractTableModel(parent), buffered_keys_(keys), - column_headers_({ - tr("Select"), - tr("Type"), - tr("Name"), - tr("Email Address"), - tr("Usage"), - tr("Trust"), - tr("Key ID"), - tr("Create Date"), - tr("Algorithm"), - tr("Subkey(s)"), - }), + column_headers_({tr("Select"), tr("Type"), tr("Name"), + tr("Email Address"), tr("Usage"), tr("Trust"), + tr("Key ID"), tr("Create Date"), tr("Algorithm"), + tr("Subkey(s)"), tr("Comment")}), key_check_state_(buffered_keys_.size()) {} auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { @@ -56,7 +48,7 @@ auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { auto GpgKeyTableModel::columnCount(const QModelIndex & /*parent*/) const -> int { - return 10; + return 11; } auto GpgKeyTableModel::data(const QModelIndex &index, int role) const @@ -116,6 +108,9 @@ auto GpgKeyTableModel::data(const QModelIndex &index, int role) const case 9: { return static_cast(key.GetSubKeys()->size()); } + case 10: { + return key.GetComment(); + } default: return {}; } -- cgit v1.2.3