diff options
Diffstat (limited to 'src/core/model/GpgKeyTableModel.h')
-rw-r--r-- | src/core/model/GpgKeyTableModel.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/src/core/model/GpgKeyTableModel.h b/src/core/model/GpgKeyTableModel.h new file mode 100644 index 00000000..50640a9f --- /dev/null +++ b/src/core/model/GpgKeyTableModel.h @@ -0,0 +1,216 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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 <https://www.gnu.org/licenses/>. + * + * 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 <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +/** + * @brief + * + */ +#include "core/model/GpgKey.h" +#include "core/typedef/GpgTypedef.h" + +namespace GpgFrontend { + +enum class GpgKeyTableColumn : unsigned int { + kNONE = 0, + kTYPE = 1 << 0, + kNAME = 1 << 1, + kEMAIL_ADDRESS = 1 << 2, + kUSAGE = 1 << 3, + kKEY_ID = 1 << 4, + kOWNER_TRUST = 1 << 5, + kCREATE_DATE = 1 << 6, + kALGO = 1 << 7, + kSUBKEYS_NUMBER = 1 << 8, + kCOMMENT = 1 << 9, + kALL = ~0U +}; + +inline auto operator|(GpgKeyTableColumn lhs, + GpgKeyTableColumn rhs) -> GpgKeyTableColumn { + using T = std::underlying_type_t<GpgKeyTableColumn>; + return static_cast<GpgKeyTableColumn>(static_cast<T>(lhs) | + static_cast<T>(rhs)); +} + +inline auto operator|=(GpgKeyTableColumn &lhs, + GpgKeyTableColumn rhs) -> GpgKeyTableColumn & { + lhs = lhs | rhs; + return lhs; +} + +inline auto operator&(GpgKeyTableColumn lhs, + GpgKeyTableColumn rhs) -> GpgKeyTableColumn { + using T = std::underlying_type_t<GpgKeyTableColumn>; + return static_cast<GpgKeyTableColumn>(static_cast<T>(lhs) & + static_cast<T>(rhs)); +} + +inline auto operator&=(GpgKeyTableColumn &lhs, + GpgKeyTableColumn rhs) -> GpgKeyTableColumn & { + lhs = lhs & rhs; + return lhs; +} + +inline auto operator~(GpgKeyTableColumn hs) -> GpgKeyTableColumn { + using T = std::underlying_type_t<GpgKeyTableColumn>; + return static_cast<GpgKeyTableColumn>(~static_cast<T>(hs)); +} + +enum class GpgKeyTableDisplayMode : unsigned int { + kNONE = 0, + kPUBLIC_KEY = 1 << 0, + kPRIVATE_KEY = 1 << 1, + kFAVORITES = 1 << 2, + kALL = ~0U +}; + +inline auto operator|(GpgKeyTableDisplayMode lhs, + GpgKeyTableDisplayMode rhs) -> GpgKeyTableDisplayMode { + using T = std::underlying_type_t<GpgKeyTableDisplayMode>; + return static_cast<GpgKeyTableDisplayMode>(static_cast<T>(lhs) | + static_cast<T>(rhs)); +} + +inline auto operator|=(GpgKeyTableDisplayMode &lhs, + GpgKeyTableDisplayMode rhs) -> GpgKeyTableDisplayMode & { + lhs = lhs | rhs; + return lhs; +} + +inline auto operator&(GpgKeyTableDisplayMode lhs, + GpgKeyTableDisplayMode rhs) -> bool { + using T = std::underlying_type_t<GpgKeyTableDisplayMode>; + return (static_cast<T>(lhs) & static_cast<T>(rhs)) != 0; +} + +class GPGFRONTEND_CORE_EXPORT GpgKeyTableModel : public QAbstractTableModel { + Q_OBJECT + public: + /** + * @brief Construct a new Gpg Key Table Model object + * + * @param keys + * @param parent + */ + explicit GpgKeyTableModel(GpgKeyList keys, QObject *parent = nullptr); + + /** + * @brief + * + * @param parent + * @return int + */ + [[nodiscard]] auto rowCount(const QModelIndex &parent) const -> int override; + + /** + * @brief + * + * @param parent + * @return int + */ + [[nodiscard]] auto columnCount(const QModelIndex &parent) const + -> int override; + + /** + * @brief + * + * @param index + * @param role + * @return QVariant + */ + [[nodiscard]] auto data(const QModelIndex &index, + int role) const -> QVariant override; + + /** + * @brief + * + * @param section + * @param orientation + * @param role + * @return QVariant + */ + [[nodiscard]] auto headerData(int section, Qt::Orientation orientation, + int role) const -> QVariant override; + + /** + * @brief Set the Data object + * + * @param index + * @param value + * @param role + * @return true + * @return false + */ + auto setData(const QModelIndex &index, const QVariant &value, + int role) -> bool override; + + /** + * @brief + * + * @param index + * @return Qt::ItemFlags + */ + [[nodiscard]] auto flags(const QModelIndex &index) const + -> Qt::ItemFlags override; + + /** + * @brief Get the All Key Ids object + * + * @return auto + */ + auto GetAllKeyIds() -> GpgKeyIDList; + + /** + * @brief Get the Key ID By Row object + * + * @return QString + */ + [[nodiscard]] auto GetKeyIDByRow(int row) const -> QString; + + /** + * @brief + * + * @param row + * @return true + * @return false + */ + [[nodiscard]] auto IsPrivateKeyByRow(int row) const -> bool; + + private: + GpgKeyList buffered_keys_; + QStringList column_headers_; +#ifdef QT5_BUILD + QVector<bool> key_check_state_; +#else + QList<bool> key_check_state_; +#endif +}; + +} // namespace GpgFrontend
\ No newline at end of file |