Implement filter row instead of tabs, allows for more expressive filters
[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("This year"), ThisYear);
40     dateWidget->addItem(tr("Range..."), Range);
41     hlayout->addWidget(dateWidget);
42
43     typeWidget = new QComboBox(this);
44     typeWidget->setMaximumWidth(120);
45     typeWidget->setMinimumWidth(120);
46
47     typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES);
48     typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) |
49                                         TransactionFilterProxy::TYPE(TransactionRecord::RecvFromIP));
50     typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) |
51                                   TransactionFilterProxy::TYPE(TransactionRecord::SendToIP));
52     typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf));
53     typeWidget->addItem(tr("Generated"), TransactionFilterProxy::TYPE(TransactionRecord::Generated));
54     typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other));
55
56     hlayout->addWidget(typeWidget);
57
58     addressWidget = new QLineEdit(this);
59     addressWidget->setPlaceholderText("Enter address or label to search");
60     hlayout->addWidget(addressWidget);
61
62     amountWidget = new QLineEdit(this);
63     amountWidget->setPlaceholderText("Min amount");
64     amountWidget->setMaximumWidth(79);
65     amountWidget->setMinimumWidth(79);
66     amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this));
67     hlayout->addWidget(amountWidget);
68
69     QVBoxLayout *vlayout = new QVBoxLayout(this);
70
71     QTableView *view = new QTableView(this);
72     vlayout->addLayout(hlayout);
73     vlayout->addWidget(view);
74     vlayout->setSpacing(0);
75     int width = view->verticalScrollBar()->sizeHint().width();
76     // Cover scroll bar width with spacing
77     hlayout->addSpacing(width);
78     // Always show scroll bar
79     view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
80
81     transactionView = view;
82
83     connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
84     connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
85     connect(addressWidget, SIGNAL(textChanged(const QString&)), this, SLOT(changedPrefix(const QString&)));
86     connect(amountWidget, SIGNAL(textChanged(const QString&)), this, SLOT(changedAmount(const QString&)));
87 }
88
89 void TransactionView::setModel(TransactionTableModel *model)
90 {
91     this->model = model;
92
93     transactionProxyModel = new TransactionFilterProxy(this);
94     transactionProxyModel->setSourceModel(model);
95     transactionProxyModel->setDynamicSortFilter(true);
96
97     transactionProxyModel->setSortRole(Qt::EditRole);
98
99     transactionView->setModel(transactionProxyModel);
100     transactionView->setAlternatingRowColors(true);
101     transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
102     transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
103     transactionView->setSortingEnabled(true);
104     transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder);
105     transactionView->verticalHeader()->hide();
106
107     transactionView->horizontalHeader()->resizeSection(
108             TransactionTableModel::Status, 23);
109     transactionView->horizontalHeader()->resizeSection(
110             TransactionTableModel::Date, 120);
111     transactionView->horizontalHeader()->resizeSection(
112             TransactionTableModel::Type, 120);
113     transactionView->horizontalHeader()->setResizeMode(
114             TransactionTableModel::ToAddress, QHeaderView::Stretch);
115     transactionView->horizontalHeader()->resizeSection(
116             TransactionTableModel::Amount, 79);
117
118 }
119
120 void TransactionView::chooseDate(int idx)
121 {
122     QDate current = QDate::currentDate();
123     switch(dateWidget->itemData(idx).toInt())
124     {
125     case All:
126         transactionProxyModel->setDateRange(
127                 TransactionFilterProxy::MIN_DATE,
128                 TransactionFilterProxy::MAX_DATE);
129         break;
130     case Today:
131         transactionProxyModel->setDateRange(
132                 QDateTime(current),
133                 TransactionFilterProxy::MAX_DATE);
134         break;
135     case ThisWeek: {
136         // Find last monday
137         QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
138         transactionProxyModel->setDateRange(
139                 QDateTime(startOfWeek),
140                 TransactionFilterProxy::MAX_DATE);
141
142         } break;
143     case ThisMonth:
144         transactionProxyModel->setDateRange(
145                 QDateTime(QDate(current.year(), current.month(), 1)),
146                 TransactionFilterProxy::MAX_DATE);
147         break;
148     case ThisYear:
149         transactionProxyModel->setDateRange(
150                 QDateTime(QDate(current.year(), 1, 1)),
151                 TransactionFilterProxy::MAX_DATE);
152         break;
153     case Range:
154         // TODO ask specific range
155         break;
156     }
157
158 }
159
160 void TransactionView::chooseType(int idx)
161 {
162     transactionProxyModel->setTypeFilter(
163         typeWidget->itemData(idx).toInt());
164 }
165
166 void TransactionView::changedPrefix(const QString &prefix)
167 {
168     transactionProxyModel->setAddressPrefix(prefix);
169 }
170
171 void TransactionView::changedAmount(const QString &amount)
172 {
173     qint64 amount_parsed;
174     if(GUIUtil::parseMoney(amount, &amount_parsed))
175     {
176         transactionProxyModel->setMinAmount(amount_parsed);
177     }
178     else
179     {
180         transactionProxyModel->setMinAmount(0);
181     }
182 }