diff options
Diffstat (limited to 'src/core/model')
-rw-r--r-- | src/core/model/GpgAbstractKey.h | 1 | ||||
-rw-r--r-- | src/core/model/GpgKey.h | 2 | ||||
-rw-r--r-- | src/core/model/GpgKeyTableModel.cpp | 59 | ||||
-rw-r--r-- | src/core/model/GpgKeyTableModel.h | 44 | ||||
-rw-r--r-- | src/core/model/GpgKeyTreeModel.cpp | 23 | ||||
-rw-r--r-- | src/core/model/GpgKeyTreeModel.h | 37 | ||||
-rw-r--r-- | src/core/model/GpgSubKey.h | 2 |
7 files changed, 132 insertions, 36 deletions
diff --git a/src/core/model/GpgAbstractKey.h b/src/core/model/GpgAbstractKey.h index 97171daa..854297bc 100644 --- a/src/core/model/GpgAbstractKey.h +++ b/src/core/model/GpgAbstractKey.h @@ -36,6 +36,7 @@ class GpgAbstractKey { [[nodiscard]] virtual auto Fingerprint() const -> QString = 0; [[nodiscard]] virtual auto IsSubKey() const -> bool = 0; + [[nodiscard]] virtual auto IsPrivateKey() const -> bool = 0; [[nodiscard]] virtual auto IsHasEncrCap() const -> bool = 0; [[nodiscard]] virtual auto IsHasSignCap() const -> bool = 0; [[nodiscard]] virtual auto IsHasCertCap() const -> bool = 0; diff --git a/src/core/model/GpgKey.h b/src/core/model/GpgKey.h index 3457b105..da92de8d 100644 --- a/src/core/model/GpgKey.h +++ b/src/core/model/GpgKey.h @@ -276,7 +276,7 @@ class GPGFRONTEND_CORE_EXPORT GpgKey : public GpgAbstractKey { * @return true * @return false */ - [[nodiscard]] auto IsPrivateKey() const -> bool; + [[nodiscard]] auto IsPrivateKey() const -> bool override; /** * @brief diff --git a/src/core/model/GpgKeyTableModel.cpp b/src/core/model/GpgKeyTableModel.cpp index 1e38cb47..2d01aee8 100644 --- a/src/core/model/GpgKeyTableModel.cpp +++ b/src/core/model/GpgKeyTableModel.cpp @@ -28,7 +28,6 @@ #include "GpgKeyTableModel.h" -#include "core/function/gpg/GpgKeyGetter.h" #include "core/model/GpgKey.h" #include "core/utils/GpgUtils.h" @@ -37,19 +36,24 @@ namespace GpgFrontend { GpgKeyTableModel::GpgKeyTableModel(int channel, GpgKeyList keys, QObject *parent) : QAbstractTableModel(parent), - buffered_keys_(std::move(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)"), tr("Comment")}), - gpg_context_channel_(channel), - key_check_state_(buffered_keys_.size()) { - LOG_D() << "init gpg key table module at channel: " << gpg_context_channel_ - << "key list size: " << buffered_keys_.size(); + gpg_context_channel_(channel) { + for (const auto &key : keys) { + cached_items_.push_back(GpgKeyTableItem(key)); + } +} + +auto GpgKeyTableModel::index(int row, int column, + const QModelIndex &parent) const -> QModelIndex { + if (!hasIndex(row, column, parent) || parent.isValid()) return {}; + return createIndex(row, column, &cached_items_[row]); } auto GpgKeyTableModel::rowCount(const QModelIndex & /*parent*/) const -> int { - return static_cast<int>(buffered_keys_.size()); + return static_cast<int>(cached_items_.size()); } auto GpgKeyTableModel::columnCount(const QModelIndex & /*parent*/) const @@ -59,16 +63,21 @@ auto GpgKeyTableModel::columnCount(const QModelIndex & /*parent*/) const auto GpgKeyTableModel::data(const QModelIndex &index, int role) const -> QVariant { - if (!index.isValid() || buffered_keys_.empty()) return {}; + if (!index.isValid() || cached_items_.empty()) return {}; + + auto *i = index.isValid() + ? static_cast<GpgKeyTableItem *>(index.internalPointer()) + : nullptr; + if (i == nullptr) return {}; if (role == Qt::CheckStateRole) { if (index.column() == 0) { - return key_check_state_[index.row()] ? Qt::Checked : Qt::Unchecked; + return i->Checked() ? Qt::Checked : Qt::Unchecked; } } if (role == Qt::DisplayRole) { - const auto &key = buffered_keys_.at(index.row()); + const auto key = i->Key(); switch (index.column()) { case 0: { @@ -155,8 +164,13 @@ auto GpgKeyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) -> bool { if (!index.isValid()) return false; + auto *i = index.isValid() + ? static_cast<GpgKeyTableItem *>(index.internalPointer()) + : nullptr; + if (i == nullptr) return false; + if (index.column() == 0 && role == Qt::CheckStateRole) { - key_check_state_[index.row()] = (value == Qt::Checked); + i->SetChecked(value == Qt::Checked); emit dataChanged(index, index); return true; } @@ -166,24 +180,35 @@ auto GpgKeyTableModel::setData(const QModelIndex &index, const QVariant &value, auto GpgKeyTableModel::GetAllKeyIds() -> KeyIdArgsList { KeyIdArgsList keys; - for (auto &key : buffered_keys_) { - keys.push_back(key.ID()); + for (auto &i : cached_items_) { + keys.push_back(i.Key().ID()); } return keys; } auto GpgKeyTableModel::GetKeyIDByRow(int row) const -> QString { - if (buffered_keys_.size() <= row) return {}; + if (cached_items_.size() <= row) return {}; - return buffered_keys_[row].ID(); + return cached_items_[row].Key().ID(); } auto GpgKeyTableModel::IsPrivateKeyByRow(int row) const -> bool { - if (buffered_keys_.size() <= row) return false; - return buffered_keys_[row].IsPrivateKey(); + if (cached_items_.size() <= row) return false; + return cached_items_[row].Key().IsPrivateKey(); } auto GpgKeyTableModel::GetGpgContextChannel() const -> int { return gpg_context_channel_; } + +GpgKeyTableItem::GpgKeyTableItem(const GpgKey &key) : key_(key) {} + +GpgKeyTableItem::GpgKeyTableItem(const GpgKeyTableItem &) = default; + +auto GpgKeyTableItem::Key() const -> GpgKey { return key_; } + +void GpgKeyTableItem::SetChecked(bool checked) { checked_ = checked; } + +auto GpgKeyTableItem::Checked() const -> bool { return checked_; } + } // namespace GpgFrontend diff --git a/src/core/model/GpgKeyTableModel.h b/src/core/model/GpgKeyTableModel.h index 0529bf7b..69118f56 100644 --- a/src/core/model/GpgKeyTableModel.h +++ b/src/core/model/GpgKeyTableModel.h @@ -110,6 +110,36 @@ inline auto operator&(GpgKeyTableDisplayMode lhs, return (static_cast<T>(lhs) & static_cast<T>(rhs)) != 0; } +class GPGFRONTEND_CORE_EXPORT GpgKeyTableItem { + public: + GpgKeyTableItem() = default; + + explicit GpgKeyTableItem(const GpgKey &key); + + GpgKeyTableItem(const GpgKeyTableItem &); + + [[nodiscard]] auto Key() const -> GpgKey; + + /** + * @brief + * + * @return bool + */ + [[nodiscard]] auto Checked() const -> bool; + + /** + * @brief Set the Checked object + * + * @return true + * @return false + */ + void SetChecked(bool); + + private: + GpgKey key_; + bool checked_; +}; + class GPGFRONTEND_CORE_EXPORT GpgKeyTableModel : public QAbstractTableModel { Q_OBJECT public: @@ -125,6 +155,17 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyTableModel : public QAbstractTableModel { /** * @brief * + * @param row + * @param column + * @param parent + * @return QModelIndex + */ + [[nodiscard]] auto index(int row, int column, const QModelIndex &parent) const + -> QModelIndex override; + + /** + * @brief + * * @param parent * @return int */ @@ -212,11 +253,10 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyTableModel : public QAbstractTableModel { [[nodiscard]] auto GetGpgContextChannel() const -> int; private: - GpgKeyList buffered_keys_; QStringList column_headers_; int gpg_context_channel_; - QContainer<bool> key_check_state_; + QContainer<GpgKeyTableItem> cached_items_; }; } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/model/GpgKeyTreeModel.cpp b/src/core/model/GpgKeyTreeModel.cpp index 3925444c..cb3ee4ba 100644 --- a/src/core/model/GpgKeyTreeModel.cpp +++ b/src/core/model/GpgKeyTreeModel.cpp @@ -36,21 +36,19 @@ namespace GpgFrontend { GpgKeyTreeModel::GpgKeyTreeModel(int channel, const GpgKeyList &keys, - Detector checkable_detector, - Detector enable_detector, QObject *parent) + Detector checkable_detector, QObject *parent) : QAbstractItemModel(parent), gpg_context_channel_(channel), column_headers_({ tr("Select"), + tr("Type"), tr("Identity"), tr("Key ID"), - tr("Type"), tr("Usage"), tr("Algorithm"), tr("Create Date"), }), - checkable_detector_(std::move(checkable_detector)), - enable_detector_(std::move(enable_detector)) { + checkable_detector_(std::move(checkable_detector)) { setup_model_data(keys); } @@ -203,9 +201,16 @@ auto GpgKeyTreeModel::create_gpg_key_tree_items(const GpgKey &key) -> QSharedPointer<GpgKeyTreeItem> { QVariantList columns; columns << "/"; + + QString type; + type += key.IsPrivateKey() ? "pub/sec" : "pub"; + if (key.IsPrivateKey() && !key.IsHasMasterKey()) type += "#"; + if (key.IsHasCardKey()) type += "^"; + columns << type; + columns << key.UIDs().front().GetUID(); columns << key.ID(); - columns << "C"; + columns << GetUsagesByKey(key); columns << key.PublicKeyAlgo(); columns << key.Algo(); @@ -213,16 +218,16 @@ auto GpgKeyTreeModel::create_gpg_key_tree_items(const GpgKey &key) auto i_key = QSharedPointer<GpgKeyTreeItem>::create( QSharedPointer<GpgKey>::create(key), columns); - i_key->SetEnable(enable_detector_(i_key->Key())); + i_key->SetEnable(true); i_key->SetCheckable(checkable_detector_(i_key->Key())); cached_items_.push_back(i_key); for (const auto &s_key : key.SubKeys()) { QVariantList columns; columns << "/"; + columns << (s_key.IsHasCertCap() ? "primary" : "sub"); columns << key.UIDs().front().GetUID(); columns << s_key.ID(); - columns << (s_key.IsHasCertCap() ? "P" : "S"); columns << GetUsagesBySubkey(s_key); columns << s_key.PublicKeyAlgo(); columns << s_key.Algo(); @@ -230,7 +235,7 @@ auto GpgKeyTreeModel::create_gpg_key_tree_items(const GpgKey &key) auto i_s_key = QSharedPointer<GpgKeyTreeItem>::create( QSharedPointer<GpgSubKey>::create(s_key), columns); - i_s_key->SetEnable(enable_detector_(i_s_key->Key())); + i_s_key->SetEnable(true); i_s_key->SetCheckable(checkable_detector_(i_s_key->Key())); i_key->AppendChild(i_s_key); cached_items_.push_back(i_s_key); diff --git a/src/core/model/GpgKeyTreeModel.h b/src/core/model/GpgKeyTreeModel.h index 42b29055..f56591ea 100644 --- a/src/core/model/GpgKeyTreeModel.h +++ b/src/core/model/GpgKeyTreeModel.h @@ -42,9 +42,9 @@ namespace GpgFrontend { enum class GpgKeyTreeColumn : unsigned int { kNONE = 0, - kIDENTITY = 1 << 1, - kKEY_ID = 1 << 2, - kTYPE = 1 << 3, + kTYPE = 1 << 1, + kIDENTITY = 1 << 2, + kKEY_ID = 1 << 3, kUSAGE = 1 << 4, kALGO = 1 << 5, kCREATE_DATE = 1 << 6, @@ -82,6 +82,33 @@ inline auto operator~(GpgKeyTreeColumn hs) -> GpgKeyTreeColumn { return static_cast<GpgKeyTreeColumn>(~static_cast<T>(hs)); } +enum class GpgKeyTreeDisplayMode : unsigned int { + kNONE = 0, + kPUBLIC_KEY = 1 << 0, + kPRIVATE_KEY = 1 << 1, + kFAVORITES = 1 << 2, + kALL = ~0U +}; + +inline auto operator|(GpgKeyTreeDisplayMode lhs, + GpgKeyTreeDisplayMode rhs) -> GpgKeyTreeDisplayMode { + using T = std::underlying_type_t<GpgKeyTreeDisplayMode>; + return static_cast<GpgKeyTreeDisplayMode>(static_cast<T>(lhs) | + static_cast<T>(rhs)); +} + +inline auto operator|=(GpgKeyTreeDisplayMode &lhs, + GpgKeyTreeDisplayMode rhs) -> GpgKeyTreeDisplayMode & { + lhs = lhs | rhs; + return lhs; +} + +inline auto operator&(GpgKeyTreeDisplayMode lhs, + GpgKeyTreeDisplayMode rhs) -> bool { + using T = std::underlying_type_t<GpgKeyTreeDisplayMode>; + return (static_cast<T>(lhs) & static_cast<T>(rhs)) != 0; +} + class GPGFRONTEND_CORE_EXPORT GpgKeyTreeItem { public: GpgKeyTreeItem() = default; @@ -217,8 +244,7 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyTreeModel : public QAbstractItemModel { * @param parent */ explicit GpgKeyTreeModel(int channel, const GpgKeyList &keys, - Detector checkable, Detector enable, - QObject *parent = nullptr); + Detector checkable, QObject *parent = nullptr); /** * @brief @@ -324,7 +350,6 @@ class GPGFRONTEND_CORE_EXPORT GpgKeyTreeModel : public QAbstractItemModel { int gpg_context_channel_; QVariantList column_headers_; Detector checkable_detector_; - Detector enable_detector_; QSharedPointer<GpgKeyTreeItem> root_; QContainer<QSharedPointer<GpgKeyTreeItem>> cached_items_; diff --git a/src/core/model/GpgSubKey.h b/src/core/model/GpgSubKey.h index dc92ae1f..fe925f8e 100644 --- a/src/core/model/GpgSubKey.h +++ b/src/core/model/GpgSubKey.h @@ -163,7 +163,7 @@ class GPGFRONTEND_CORE_EXPORT GpgSubKey : public GpgAbstractKey { * @return true * @return false */ - [[nodiscard]] auto IsPrivateKey() const -> bool; + [[nodiscard]] auto IsPrivateKey() const -> bool override; /** * @brief |