show last few transactions on overview page
[novacoin.git] / src / qt / overviewpage.cpp
1 #include "overviewpage.h"
2 #include "ui_overviewpage.h"
3
4 #include "walletmodel.h"
5 #include "bitcoinunits.h"
6 #include "optionsmodel.h"
7 #include "transactiontablemodel.h"
8 #include "transactionfilterproxy.h"
9 #include "guiutil.h"
10 #include "guiconstants.h"
11
12 #include <QDebug>
13 #include <QItemDelegate>
14 #include <QPainter>
15
16 #define DECORATION_SIZE 64
17 class TxViewDelegate : public QItemDelegate
18 {
19     //Q_OBJECT
20 public:
21     TxViewDelegate(): QItemDelegate(), unit(BitcoinUnits::BTC)
22     {
23
24     }
25
26     inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
27                       const QModelIndex &index ) const
28     {
29         //QItemDelegate::paint(painter, option, index);
30         painter->save();
31
32         QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
33         QRect mainRect = option.rect;
34         QRect decorationRect(mainRect.topLeft(), QSize(DECORATION_SIZE, DECORATION_SIZE));
35         int xspace = DECORATION_SIZE + 8;
36         int ypad = 6;
37         int halfheight = (mainRect.height() - 2*ypad)/2;
38         QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace, halfheight);
39         QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
40         icon.paint(painter, decorationRect);
41
42         QDateTime date = index.data(TransactionTableModel::DateRole).toDateTime();
43         QString address = index.data(Qt::DisplayRole).toString();
44         qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong();
45         bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool();
46         QVariant value = index.data(Qt::ForegroundRole);
47         QColor foreground = option.palette.color(QPalette::Text);
48         if(qVariantCanConvert<QColor>(value))
49         {
50             foreground = qvariant_cast<QColor>(value);
51         }
52
53         painter->setPen(foreground);
54         painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address);
55
56         if(amount < 0)
57         {
58             foreground = COLOR_NEGATIVE;
59         }
60         else
61         {
62             foreground = option.palette.color(QPalette::Text);
63         }
64         painter->setPen(foreground);
65         QString amountText = BitcoinUnits::formatWithUnit(unit, amount, true);
66         if(!confirmed)
67         {
68             amountText = QString("[") + amountText + QString("]");
69         }
70         painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
71
72         painter->setPen(option.palette.color(QPalette::Text));
73         painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::DateTimeStr(date));
74
75         painter->restore();
76     }
77
78     int unit;
79
80 };
81
82 OverviewPage::OverviewPage(QWidget *parent) :
83     QWidget(parent),
84     ui(new Ui::OverviewPage),
85     currentBalance(-1),
86     currentUnconfirmedBalance(-1),
87     txdelegate(new TxViewDelegate())
88 {
89     ui->setupUi(this);
90
91     // Balance: <balance>
92     ui->labelBalance->setFont(QFont("Monospace", -1, QFont::Bold));
93     ui->labelBalance->setToolTip(tr("Your current balance"));
94     ui->labelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard);
95
96     // Balance: <balance>
97     ui->labelUnconfirmed->setFont(QFont("Monospace", -1, QFont::Bold));
98     ui->labelUnconfirmed->setToolTip(tr("Balance of transactions that have yet to be confirmed"));
99     ui->labelUnconfirmed->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard);
100
101     ui->labelNumTransactions->setToolTip(tr("Total number of transactions in wallet"));
102
103     // Recent transactions
104     ui->listTransactions->setStyleSheet("background:transparent");
105     ui->listTransactions->setItemDelegate(txdelegate);
106     ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
107     ui->listTransactions->setSelectionMode(QAbstractItemView::NoSelection);
108 }
109
110 OverviewPage::~OverviewPage()
111 {
112     delete ui;
113 }
114
115 void OverviewPage::setBalance(qint64 balance, qint64 unconfirmedBalance)
116 {
117     int unit = model->getOptionsModel()->getDisplayUnit();
118     currentBalance = balance;
119     currentUnconfirmedBalance = unconfirmedBalance;
120     ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance));
121     ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, unconfirmedBalance));
122 }
123
124 void OverviewPage::setNumTransactions(int count)
125 {
126     ui->labelNumTransactions->setText(QLocale::system().toString(count));
127 }
128
129 void OverviewPage::setModel(WalletModel *model)
130 {
131     this->model = model;
132
133     // Set up transaction list
134
135     TransactionFilterProxy *filter = new TransactionFilterProxy();
136     filter->setSourceModel(model->getTransactionTableModel());
137     filter->setLimit(3);
138     filter->setDynamicSortFilter(true);
139     filter->setSortRole(Qt::EditRole);
140     filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
141
142     ui->listTransactions->setModel(filter);
143     ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
144
145     // Keep up to date with wallet
146     setBalance(model->getBalance(), model->getUnconfirmedBalance());
147     connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
148
149     setNumTransactions(model->getNumTransactions());
150     connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
151
152     connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(displayUnitChanged()));
153 }
154
155 void OverviewPage::displayUnitChanged()
156 {
157     if(currentBalance != -1)
158         setBalance(currentBalance, currentUnconfirmedBalance);
159
160     txdelegate->unit = model->getOptionsModel()->getDisplayUnit();
161     ui->listTransactions->update();
162 }