forked from ciphrex/mSIGNA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignaturemodel.cpp
133 lines (108 loc) · 3.76 KB
/
signaturemodel.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
///////////////////////////////////////////////////////////////////////////////
//
// mSIGNA
//
// signaturemodel.cpp
//
// Copyright (c) 2013-2014 Eric Lombrozo
//
// All Rights Reserved.
#include "signaturemodel.h"
#include <CoinDB/SynchedVault.h>
#include <QStandardItemModel>
using namespace CoinDB;
using namespace std;
SignatureModel::SignatureModel(CoinDB::SynchedVault& synchedVault, const bytes_t& txHash, QObject* parent)
: QStandardItemModel(parent), m_synchedVault(synchedVault), m_txHash(txHash)
{
initColumns();
}
void SignatureModel::initColumns()
{
QStringList columns;
columns << tr("Keychain Name") << tr("") << tr("") << tr("Keychain Hash") << "";
setHorizontalHeaderLabels(columns);
}
void SignatureModel::updateAll()
{
removeRows(0, rowCount());
if (!m_synchedVault.isVaultOpen()) return;
CoinDB::Vault* vault = m_synchedVault.getVault();
SignatureInfo signatureInfo = vault->getSignatureInfo(m_txHash);
m_sigsNeeded = signatureInfo.sigsNeeded();
for (auto& keychain: signatureInfo.signingKeychains())
{
QList<QStandardItem*> row;
// Keychain name
QString name = QString::fromStdString(keychain.name());
QStandardItem* nameItem = new QStandardItem(name);
row.append(nameItem);
// Keychain encryption
QStandardItem* encryptedItem = new QStandardItem();
if (vault->isKeychainEncrypted(keychain.name()))
{
encryptedItem->setIcon(QIcon(":/icons/encrypted.png"));
encryptedItem->setData(true, Qt::UserRole);
}
else
{
encryptedItem->setData(false, Qt::UserRole);
}
row.append(encryptedItem);
// Keychain state
QStandardItem* stateItem = new QStandardItem();
if (!vault->isKeychainPrivate(keychain.name()))
{
stateItem->setIcon(QIcon(":/icons/shared.png"));
stateItem->setData(PUBLIC, Qt::UserRole);
}
else if (vault->isKeychainLocked(keychain.name()))
{
stateItem->setIcon(QIcon(":/icons/locked.png"));
stateItem->setData(LOCKED, Qt::UserRole);
}
else
{
stateItem->setIcon(QIcon(":/icons/unlocked.png"));
stateItem->setData(UNLOCKED, Qt::UserRole);
}
row.append(stateItem);
// Keychain hash
QString hashStr = QString::fromStdString(uchar_vector(keychain.hash()).getHex());
row.append(new QStandardItem(hashStr));
// Has signed
bool hasSigned = keychain.hasSigned();
QString hasSignedStr = hasSigned ? tr("Signed") : tr("");
QStandardItem* hasSignedItem = new QStandardItem(hasSignedStr);
hasSignedItem->setData(hasSigned, Qt::UserRole);
row.append(hasSignedItem);
appendRow(row);
}
}
bool SignatureModel::isKeychainEncrypted(int row) const
{
if (row < 0 || row > rowCount()) throw std::runtime_error("Invalid row.");
return item(row, 1)->data(Qt::UserRole).toBool();
}
int SignatureModel::getKeychainState(int row) const
{
if (row < 0 || row > rowCount()) throw std::runtime_error("Invalid row.");
return item(row, 2)->data(Qt::UserRole).toInt();
}
bool SignatureModel::getKeychainHasSigned(int row) const
{
if (row < 0 || row > rowCount()) throw std::runtime_error("Invalid row.");
return item(row, 4)->data(Qt::UserRole).toBool();
}
Qt::ItemFlags SignatureModel::flags(const QModelIndex& /*index*/) const
{
return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
QVariant SignatureModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::BackgroundRole)
{
if (getKeychainHasSigned(index.row())) return QBrush(QColor(184, 207, 233)); // light blue
}
return QStandardItemModel::data(index, role);
}