addresstablemodel.h
1 // Copyright (c) 2011-present The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #ifndef BITCOIN_QT_ADDRESSTABLEMODEL_H 6 #define BITCOIN_QT_ADDRESSTABLEMODEL_H 7 8 #include <optional> 9 10 #include <QAbstractTableModel> 11 #include <QStringList> 12 13 enum class OutputType; 14 15 class AddressTablePriv; 16 class WalletModel; 17 18 namespace interfaces { 19 class Wallet; 20 } 21 namespace wallet { 22 enum class AddressPurpose; 23 } // namespace wallet 24 25 /** 26 Qt model of the address book in the core. This allows views to access and modify the address book. 27 */ 28 class AddressTableModel : public QAbstractTableModel 29 { 30 Q_OBJECT 31 32 public: 33 explicit AddressTableModel(WalletModel *parent = nullptr, bool pk_hash_only = false); 34 ~AddressTableModel(); 35 36 enum ColumnIndex { 37 Label = 0, /**< User specified label */ 38 Address = 1 /**< Bitcoin address */ 39 }; 40 41 enum RoleIndex { 42 TypeRole = Qt::UserRole /**< Type of address (#Send or #Receive) */ 43 }; 44 45 /** Return status of edit/insert operation */ 46 enum EditStatus { 47 OK, /**< Everything ok */ 48 NO_CHANGES, /**< No changes were made during edit operation */ 49 INVALID_ADDRESS, /**< Unparseable address */ 50 DUPLICATE_ADDRESS, /**< Address already in address book */ 51 WALLET_UNLOCK_FAILURE, /**< Wallet could not be unlocked to create new receiving address */ 52 KEY_GENERATION_FAILURE /**< Generating a new public key for a receiving address failed */ 53 }; 54 55 static const QString Send; /**< Specifies send address */ 56 static const QString Receive; /**< Specifies receive address */ 57 58 /** @name Methods overridden from QAbstractTableModel 59 @{*/ 60 int rowCount(const QModelIndex &parent) const override; 61 int columnCount(const QModelIndex &parent) const override; 62 QVariant data(const QModelIndex &index, int role) const override; 63 bool setData(const QModelIndex &index, const QVariant &value, int role) override; 64 QVariant headerData(int section, Qt::Orientation orientation, int role) const override; 65 QModelIndex index(int row, int column, const QModelIndex &parent) const override; 66 bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; 67 Qt::ItemFlags flags(const QModelIndex &index) const override; 68 /*@}*/ 69 70 /* Add an address to the model. 71 Returns the added address on success, and an empty string otherwise. 72 */ 73 QString addRow(const QString& type, const QString& label, const QString& address, OutputType address_type); 74 75 /** Look up label for address in address book, if not found return empty string. */ 76 QString labelForAddress(const QString &address) const; 77 78 /** Look up purpose for address in address book, if not found return empty string. */ 79 std::optional<wallet::AddressPurpose> purposeForAddress(const QString &address) const; 80 81 /* Look up row index of an address in the model. 82 Return -1 if not found. 83 */ 84 int lookupAddress(const QString &address) const; 85 86 EditStatus getEditStatus() const { return editStatus; } 87 88 OutputType GetDefaultAddressType() const; 89 90 QString GetWalletDisplayName() const; 91 92 private: 93 WalletModel* const walletModel; 94 AddressTablePriv *priv = nullptr; 95 QStringList columns; 96 EditStatus editStatus = OK; 97 98 /** Look up address book data given an address string. */ 99 bool getAddressData(const QString &address, std::string* name, wallet::AddressPurpose* purpose) const; 100 101 /** Notify listeners that data changed. */ 102 void emitDataChanged(int index); 103 104 public Q_SLOTS: 105 /* Update address list from core. 106 */ 107 void updateEntry(const QString &address, const QString &label, bool isMine, wallet::AddressPurpose purpose, int status); 108 109 friend class AddressTablePriv; 110 }; 111 112 #endif // BITCOIN_QT_ADDRESSTABLEMODEL_H