forked from cryptonotefoundation/cryptonotewallet
/
AddressBookModel.cpp
154 lines (125 loc) · 4.05 KB
/
AddressBookModel.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright (c) 2011-2015 The Cryptonote developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include "WalletAdapter.h"
#include "AddressBookModel.h"
#include "Settings.h"
namespace WalletGui {
AddressBookModel& AddressBookModel::instance() {
static AddressBookModel inst;
return inst;
}
AddressBookModel::AddressBookModel() : QAbstractItemModel() {
connect(&WalletAdapter::instance(), &WalletAdapter::walletInitCompletedSignal, this, &AddressBookModel::walletInitCompleted, Qt::QueuedConnection);
connect(&WalletAdapter::instance(), &WalletAdapter::walletCloseCompletedSignal, this, &AddressBookModel::reset, Qt::QueuedConnection);
}
AddressBookModel::~AddressBookModel() {
}
int AddressBookModel::columnCount(const QModelIndex& _parent) const {
return 2;
}
QVariant AddressBookModel::data(const QModelIndex& _index, int _role) const {
if (!_index.isValid()) {
return QVariant();
}
QJsonObject address = m_addressBook.at(_index.row()).toObject();
switch (_role) {
case Qt::DisplayRole:
switch (_index.column()) {
case COLUMN_LABEL:
return _index.data(ROLE_LABEL);
case COLUMN_ADDRESS:
return _index.data(ROLE_ADDRESS);
default:
return QVariant();
}
case ROLE_LABEL:
return address.value("label");
case ROLE_ADDRESS:
return address.value("address");
default:
return QVariant();
}
return QVariant();
}
Qt::ItemFlags AddressBookModel::flags(const QModelIndex& _index) const {
return (Qt::ItemIsEnabled | Qt::ItemNeverHasChildren | Qt::ItemIsSelectable);
}
QVariant AddressBookModel::headerData(int _section, Qt::Orientation _orientation, int _role) const {
if (_orientation != Qt::Horizontal || _role != Qt::DisplayRole) {
return QVariant();
}
switch (_section) {
case COLUMN_LABEL:
return tr("Label");
case COLUMN_ADDRESS:
return tr("Address");
}
return QVariant();
}
QModelIndex AddressBookModel::index(int _row, int _column, const QModelIndex& _parent) const {
if (_parent.isValid()) {
return QModelIndex();
}
return createIndex(_row, _column, _row);
}
QModelIndex AddressBookModel::parent(const QModelIndex& _index) const {
return QModelIndex();
}
int AddressBookModel::rowCount(const QModelIndex& _parent) const {
return m_addressBook.size();
}
void AddressBookModel::addAddress(const QString& _label, const QString& _address) {
beginInsertRows(QModelIndex(), m_addressBook.size(), m_addressBook.size());
QJsonObject newAddress;
newAddress.insert("label", _label);
newAddress.insert("address", _address);
m_addressBook.append(newAddress);
endInsertRows();
saveAddressBook();
}
void AddressBookModel::removeAddress(quint32 _row) {
if (_row > m_addressBook.size() - 1) {
return;
}
beginRemoveRows(QModelIndex(), _row, _row);
m_addressBook.removeAt(_row);
endRemoveRows();
saveAddressBook();
}
void AddressBookModel::reset() {
beginResetModel();
while (!m_addressBook.empty()) {
m_addressBook.removeFirst();
}
endResetModel();
}
void AddressBookModel::saveAddressBook() {
QFile addressBookFile(Settings::instance().getAddressBookFile());
if (addressBookFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QByteArray file_content = QJsonDocument(m_addressBook).toJson(QJsonDocument::Compact);
addressBookFile.write(file_content);
addressBookFile.close();
}
}
void AddressBookModel::walletInitCompleted(int _error, const QString& _error_text) {
if (!_error) {
QFile addressBookFile(Settings::instance().getAddressBookFile());
if (addressBookFile.open(QIODevice::ReadOnly)) {
QByteArray file_content = addressBookFile.readAll();
QJsonDocument doc = QJsonDocument::fromJson(file_content);
if (!doc.isNull()) {
m_addressBook = doc.array();
}
addressBookFile.close();
if (!m_addressBook.isEmpty()) {
beginInsertRows(QModelIndex(), 0, m_addressBook.size() - 1);
endInsertRows();
}
}
}
}
}