Placeholder text can only be used for Qt 4.7+
[novacoin.git] / src / qt / transactionview.cpp
1 #include "transactionview.h"
2
3 // Temp includes for filtering prototype
4 // Move to TransactionFilterRow class
5 #include "transactionfilterproxy.h"
6 #include "transactionrecord.h"
7 #include "transactiontablemodel.h"
8 #include "guiutil.h"
9
10 #include <QScrollBar>
11 #include <QComboBox>
12 #include <QDoubleValidator>
13 #include <QHBoxLayout>
14 #include <QVBoxLayout>
15 #include <QLineEdit>
16 #include <QTableView>
17 #include <QHeaderView>
18
19 #include <QDebug>
20
21 TransactionView::TransactionView(QWidget *parent) :
22     QWidget(parent), model(0), transactionProxyModel(0),
23     transactionView(0)
24 {
25     // Build filter row
26     QHBoxLayout *hlayout = new QHBoxLayout();
27     hlayout->setContentsMargins(QMargins(0,0,0,0));
28     hlayout->setSpacing(0);
29
30     hlayout->addSpacing(23);
31
32     dateWidget = new QComboBox(this);
33     dateWidget->setMaximumWidth(120);
34     dateWidget->setMinimumWidth(120);
35     dateWidget->addItem(tr("All"), All);
36     dateWidget->addItem(tr("Today"), Today);
37     dateWidget->addItem(tr("This week"), ThisWeek);
38     dateWidget->addItem(tr("This month"), ThisMonth);
39     dateWidget->addItem(tr("Last month"), LastMonth);
40     dateWidget->addItem(tr("This year"), ThisYear);
41     dateWidget->addItem(tr("Range..."), Range);
42     hlayout->addWidget(dateWidget);
43
44     typeWidget = new QComboBox(this);
45     typeWidget->setMaximumWidth(120);
46     typeWidget->setMinimumWidth(120);
47
48     typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES);
49     typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) |
50                                         TransactionFilterProxy::TYPE(TransactionRecord::RecvFromIP));
51     typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) |
52                                   TransactionFilterProxy::TYPE(TransactionRecord::SendToIP));
53     typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf));
54     typeWidget->addItem(tr("Generated"), TransactionFilterProxy::TYPE(TransactionRecord::Generated));
55     typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other));
56
57     hlayout->addWidget(typeWidget);
58
59     addressWidget = new QLineEdit(this);
60 #if QT_VERSION >= 0x040700
61     addressWidget->setPlaceholderText("Enter address or label to search");
62 #endif
63     hlayout->addWidget(addressWidget);
64
65     amountWidget = new QLineEdit(this);
66 #if QT_VERSION >= 0x040700
67     amountWidget->setPlaceholderText("Min amount");
68 #endif
69     amountWidget->setMaximumWidth(100);
70     amountWidget->setMinimumWidth(100);
71     amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this));
72     hlayout->addWidget(amountWidget);
73
74     QVBoxLayout *vlayout = new QVBoxLayout(this);
75
76     QTableView *view = new QTableView(this);
77     vlayout->addLayout(hlayout);
78     vlayout->addWidget(view);
79     vlayout->setSpacing(0);
80     int width = view->verticalScrollBar()->sizeHint().width();
81     // Cover scroll bar width with spacing
82     hlayout->addSpacing(width);
83     // Always show scroll bar
84     view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
85
86     transactionView = view;
87
88     connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
89     connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
90     connect(addressWidget, SIGNAL(textChanged(const QString&)), this, SLOT(changedPrefix(const QString&)));
91     connect(amountWidget, SIGNAL(textChanged(const QString&)), this, SLOT(changedAmount(const QString&)));
92
93     connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
94 }
95
96 void TransactionView::setModel(TransactionTableModel *model)
97 {
98     this->model = model;
99
100     transactionProxyModel = new TransactionFilterProxy(this);
101     transactionProxyModel->setSourceModel(model);
102     transactionProxyModel->setDynamicSortFilter(true);
103
104     transactionProxyModel->setSortRole(Qt::EditRole);
105
106     transactionView->setModel(transactionProxyModel);
107     transactionView->setAlternatingRowColors(true);
108     transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
109     transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
110     transactionView->setSortingEnabled(true);
111     transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
112     transactionView->verticalHeader()->hide();
113
114     transactionView->horizontalHeader()->resizeSection(
115             TransactionTableModel::Status, 23);
116     transactionView->horizontalHeader()->resizeSection(
117             TransactionTableModel::Date, 120);
118     transactionView->horizontalHeader()->resizeSection(
119             TransactionTableModel::Type, 120);
120     transactionView->horizontalHeader()->setResizeMode(
121             TransactionTableModel::ToAddress, QHeaderView::Stretch);
122     transactionView->horizontalHeader()->resizeSection(
123             TransactionTableModel::Amount, 100);
124
125 }
126
127 void TransactionView::chooseDate(int idx)
128 {
129     QDate current = QDate::currentDate();
130     switch(dateWidget->itemData(idx).toInt())
131     {
132     case All:
133         transactionProxyModel->setDateRange(
134                 TransactionFilterProxy::MIN_DATE,
135                 TransactionFilterProxy::MAX_DATE);
136         break;
137     case Today:
138         transactionProxyModel->setDateRange(
139                 QDateTime(current),
140                 TransactionFilterProxy::MAX_DATE);
141         break;
142     case ThisWeek: {
143         // Find last monday
144         QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
145         transactionProxyModel->setDateRange(
146                 QDateTime(startOfWeek),
147                 TransactionFilterProxy::MAX_DATE);
148
149         } break;
150     case ThisMonth:
151         transactionProxyModel->setDateRange(
152                 QDateTime(QDate(current.year(), current.month(), 1)),
153                 TransactionFilterProxy::MAX_DATE);
154         break;
155     case LastMonth:
156         transactionProxyModel->setDateRange(
157                 QDateTime(QDate(current.year(), current.month()-1, 1)),
158                 QDateTime(QDate(current.year(), current.month(), 1)));
159         break;
160     case ThisYear:
161         transactionProxyModel->setDateRange(
162                 QDateTime(QDate(current.year(), 1, 1)),
163                 TransactionFilterProxy::MAX_DATE);
164         break;
165     case Range:
166         // TODO ask specific range
167         break;
168     }
169
170 }
171
172 void TransactionView::chooseType(int idx)
173 {
174     transactionProxyModel->setTypeFilter(
175         typeWidget->itemData(idx).toInt());
176 }
177
178 void TransactionView::changedPrefix(const QString &prefix)
179 {
180     transactionProxyModel->setAddressPrefix(prefix);
181 }
182
183 void TransactionView::changedAmount(const QString &amount)
184 {
185     qint64 amount_parsed = 0;
186     if(GUIUtil::parseMoney(amount, &amount_parsed))
187     {
188         transactionProxyModel->setMinAmount(amount_parsed);
189     }
190     else
191     {
192         transactionProxyModel->setMinAmount(0);
193     }
194 }