Feathercoin  0.5.0
P2P Digital Currency
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
overviewpage.cpp
Go to the documentation of this file.
1 #include "overviewpage.h"
2 #include "ui_overviewpage.h"
3 
4 #include "clientmodel.h"
5 #include "walletmodel.h"
6 #include "bitcoinunits.h"
7 #include "optionsmodel.h"
10 #include "guiutil.h"
11 #include "guiconstants.h"
12 
13 #include <QAbstractItemDelegate>
14 #include <QPainter>
15 
16 #define DECORATION_SIZE 64
17 #define NUM_ITEMS 3
18 
19 class TxViewDelegate : public QAbstractItemDelegate
20 {
21  Q_OBJECT
22 public:
23  TxViewDelegate(): QAbstractItemDelegate(), unit(BitcoinUnits::BTC)
24  {
25 
26  }
27 
28  inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
29  const QModelIndex &index ) const
30  {
31  painter->save();
32 
33  QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
34  QRect mainRect = option.rect;
35  QRect decorationRect(mainRect.topLeft(), QSize(DECORATION_SIZE, DECORATION_SIZE));
36  int xspace = DECORATION_SIZE + 8;
37  int ypad = 6;
38  int halfheight = (mainRect.height() - 2*ypad)/2;
39  QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace, halfheight);
40  QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
41  icon.paint(painter, decorationRect);
42 
43  QDateTime date = index.data(TransactionTableModel::DateRole).toDateTime();
44  QString address = index.data(Qt::DisplayRole).toString();
45  qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong();
46  bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool();
47  QVariant value = index.data(Qt::ForegroundRole);
48  QColor foreground = option.palette.color(QPalette::Text);
49  if(value.canConvert<QBrush>())
50  {
51  QBrush brush = qvariant_cast<QBrush>(value);
52  foreground = brush.color();
53  }
54 
55  painter->setPen(foreground);
56  painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address);
57 
58  if(amount < 0)
59  {
60  foreground = COLOR_NEGATIVE;
61  }
62  else if(!confirmed)
63  {
64  foreground = COLOR_UNCONFIRMED;
65  }
66  else
67  {
68  foreground = option.palette.color(QPalette::Text);
69  }
70  painter->setPen(foreground);
71  QString amountText = BitcoinUnits::formatWithUnit(unit, amount, true);
72  if(!confirmed)
73  {
74  amountText = QString("[") + amountText + QString("]");
75  }
76  painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
77 
78  painter->setPen(option.palette.color(QPalette::Text));
79  painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateTimeStr(date));
80 
81  painter->restore();
82  }
83 
84  inline QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
85  {
86  return QSize(DECORATION_SIZE, DECORATION_SIZE);
87  }
88 
89  int unit;
90 
91 };
92 #include "overviewpage.moc"
93 
94 OverviewPage::OverviewPage(QWidget *parent) :
95  QWidget(parent),
96  ui(new Ui::OverviewPage),
97  clientModel(0),
98  walletModel(0),
99  currentBalance(-1),
100  currentUnconfirmedBalance(-1),
101  currentImmatureBalance(-1),
102  txdelegate(new TxViewDelegate()),
103  filter(0)
104 {
105  ui->setupUi(this);
106 
107  // Recent transactions
108  ui->listTransactions->setItemDelegate(txdelegate);
109  ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
110  ui->listTransactions->setMinimumHeight(NUM_ITEMS * (DECORATION_SIZE + 2));
111  ui->listTransactions->setAttribute(Qt::WA_MacShowFocusRect, false);
112 
113  connect(ui->listTransactions, SIGNAL(clicked(QModelIndex)), this, SLOT(handleTransactionClicked(QModelIndex)));
114 
115  // init "out of sync" warning labels
116  ui->labelWalletStatus->setText("(" + tr("out of sync") + ")");
117  ui->labelTransactionsStatus->setText("(" + tr("out of sync") + ")");
118 
119  // start with displaying the "out of sync" warnings
120  showOutOfSyncWarning(true);
121 }
122 
123 void OverviewPage::handleTransactionClicked(const QModelIndex &index)
124 {
125  if(filter)
126  emit transactionClicked(filter->mapToSource(index));
127 }
128 
130 {
131  delete ui;
132 }
133 
134 void OverviewPage::setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance)
135 {
136  int unit = walletModel->getOptionsModel()->getDisplayUnit();
137  currentBalance = balance;
138  currentUnconfirmedBalance = unconfirmedBalance;
139  currentImmatureBalance = immatureBalance;
140  ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance));
141  ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, unconfirmedBalance));
142  ui->labelImmature->setText(BitcoinUnits::formatWithUnit(unit, immatureBalance));
143 
144  // only show immature (newly mined) balance if it's non-zero, so as not to complicate things
145  // for the non-mining users
146  bool showImmature = immatureBalance != 0;
147  ui->labelImmature->setVisible(showImmature);
148  ui->labelImmatureText->setVisible(showImmature);
149 }
150 
152 {
153  this->clientModel = model;
154  if(model)
155  {
156  // Show warning if this is a prerelease version
157  connect(model, SIGNAL(alertsChanged(QString)), this, SLOT(updateAlerts(QString)));
159  }
160 }
161 
163 {
164  this->walletModel = model;
165  if(model && model->getOptionsModel())
166  {
167  // Set up transaction list
169  filter->setSourceModel(model->getTransactionTableModel());
171  filter->setDynamicSortFilter(true);
172  filter->setSortRole(Qt::EditRole);
173  filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
174 
175  ui->listTransactions->setModel(filter);
176  ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
177 
178  // Keep up to date with wallet
179  setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance());
180  connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64)));
181 
182  connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
183  }
184 
185  // update the display unit, to not use the default ("BTC")
187 }
188 
190 {
192  {
193  if(currentBalance != -1)
195 
196  // Update txdelegate->unit with the current unit
198 
199  ui->listTransactions->update();
200  }
201 }
202 
203 void OverviewPage::updateAlerts(const QString &warnings)
204 {
205  this->ui->labelAlerts->setVisible(!warnings.isEmpty());
206  this->ui->labelAlerts->setText(warnings);
207 }
208 
210 {
211  ui->labelWalletStatus->setVisible(fShow);
212  ui->labelTransactionsStatus->setVisible(fShow);
213 }
void setWalletModel(WalletModel *walletModel)
Bitcoin unit definitions.
Definition: bitcoinunits.h:10
void updateAlerts(const QString &warnings)
std::string * value
Definition: version_set.cc:270
static QString formatWithUnit(int unit, qint64 amount, bool plussign=false)
Format as string (with unit)
qint64 getImmatureBalance() const
Definition: walletmodel.cpp:60
#define DECORATION_SIZE
void handleTransactionClicked(const QModelIndex &index)
Definition: aboutdialog.h:6
QString dateTimeStr(const QDateTime &date)
Definition: guiutil.cpp:51
TransactionFilterProxy * filter
Definition: overviewpage.h:46
qint64 currentUnconfirmedBalance
Definition: overviewpage.h:42
TxViewDelegate * txdelegate
Definition: overviewpage.h:45
WalletModel * walletModel
Definition: overviewpage.h:40
QString getStatusBarWarnings() const
Return warnings to be displayed in status bar.
qint64 currentBalance
Definition: overviewpage.h:41
#define NUM_ITEMS
qint64 getUnconfirmedBalance() const
Definition: walletmodel.cpp:55
qint64 currentImmatureBalance
Definition: overviewpage.h:43
Date and time this transaction was created.
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
TransactionTableModel * getTransactionTableModel()
int getDisplayUnit()
Definition: optionsmodel.h:50
#define COLOR_UNCONFIRMED
Definition: guiconstants.h:17
Model for Bitcoin network client.
Definition: clientmodel.h:24
ClientModel * clientModel
Definition: overviewpage.h:39
void transactionClicked(const QModelIndex &index)
void setLimit(int limit)
Set maximum number of rows returned, -1 if unlimited.
void showOutOfSyncWarning(bool fShow)
OverviewPage(QWidget *parent=0)
Filter the transaction list according to pre-specified rules.
void updateDisplayUnit()
Interface to Bitcoin wallet from Qt view code.
Definition: walletmodel.h:36
qint64 getBalance(const CCoinControl *coinControl=NULL) const
Definition: walletmodel.cpp:39
void setClientModel(ClientModel *clientModel)
void setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance)
Overview ("home") page widget.
Definition: overviewpage.h:19
Ui::OverviewPage * ui
Definition: overviewpage.h:38
#define COLOR_NEGATIVE
Definition: guiconstants.h:19
OptionsModel * getOptionsModel()
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const