PIVX Core  5.6.99
P2P Digital Currency
exportcsv.cpp
Go to the documentation of this file.
1 // Copyright (c) 2019-2021 The PIVX Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
6 #include "qt/settings/forms/ui_exportcsv.h"
7 
8 #include "csvmodelwriter.h"
9 #include "guiinterface.h"
10 #include "guiutil.h"
11 #include "optionsmodel.h"
12 #include "qtutils.h"
13 
14 #include <QFile>
15 
16 SettingsExportCSV::SettingsExportCSV(PIVXGUI* _window, QWidget *parent) :
17  PWidget(_window, parent),
18  ui(new Ui::SettingsExportCSV)
19 {
20  ui->setupUi(this);
21 
22  this->setStyleSheet(parent->styleSheet());
23 
24  /* Containers */
25  ui->left->setProperty("cssClass", "container");
26  ui->left->setContentsMargins(10,10,10,10);
27 
28  // Title
29  ui->labelTitle->setProperty("cssClass", "text-title-screen");
30  ui->labelSubtitle1->setProperty("cssClass", "text-subtitle");
31 
32  // Location
33  ui->labelSubtitleLocation->setProperty("cssClass", "text-title");
34  ui->labelSubtitleLocationAddress->setProperty("cssClass", "text-title");
35 
36  setCssProperty({ui->pushButtonDocuments, ui->pushButtonAddressDocuments}, "btn-edit-primary-folder");
37  setShadow(ui->pushButtonDocuments);
38 
39  setShadow(ui->pushButtonAddressDocuments);
40  ui->labelDivider->setProperty("cssClass", "container-divider");
41 
42  SortEdit* lineEdit = new SortEdit(ui->comboBoxSort);
43  connect(lineEdit, &SortEdit::Mouse_Pressed, [this](){ui->comboBoxSort->showPopup();});
44  setSortTx(ui->comboBoxSort, lineEdit);
45 
46  SortEdit* lineEditType = new SortEdit(ui->comboBoxSortType);
47  connect(lineEditType, &SortEdit::Mouse_Pressed, [this](){ui->comboBoxSortType->showPopup();});
48  setSortTxTypeFilter(ui->comboBoxSortType, lineEditType);
49  ui->comboBoxSortType->setCurrentIndex(0);
50 
51  SortEdit* lineEditAddressBook = new SortEdit(ui->comboBoxSortAddressType);
52  connect(lineEditAddressBook, &SortEdit::Mouse_Pressed, [this](){ui->comboBoxSortAddressType->showPopup();});
53  setFilterAddressBook(ui->comboBoxSortAddressType, lineEditAddressBook);
54  ui->comboBoxSortAddressType->setCurrentIndex(0);
55 
56  connect(ui->pushButtonDocuments, &QPushButton::clicked, [this](){selectFileOutput(true);});
57  connect(ui->pushButtonAddressDocuments, &QPushButton::clicked, [this](){selectFileOutput(false);});
58 }
59 
60 void SettingsExportCSV::selectFileOutput(const bool isTxExport)
61 {
62  QString filename = GUIUtil::getSaveFileName(this,
63  isTxExport ? tr("Export Transaction History") : tr("Export Address Book"), QString(),
64  tr("Comma separated file (*.csv)"), nullptr);
65 
66  if (isTxExport) {
67  if (!filename.isEmpty()) {
68  ui->pushButtonDocuments->setText(filename);
69  exportTxes(filename);
70  } else {
71  ui->pushButtonDocuments->setText(tr("Select folder..."));
72  }
73  } else {
74  if (!filename.isEmpty()) {
75  ui->pushButtonAddressDocuments->setText(filename);
76  exportAddrs(filename);
77  } else {
78  ui->pushButtonAddressDocuments->setText(tr("Select folder..."));
79  }
80  }
81 }
82 
83 void SettingsExportCSV::exportTxes(const QString& filename)
84 {
85  if (filename.isNull()) {
86  inform(tr("Please select a folder to export the csv file first."));
87  return;
88  }
89 
90  CSVModelWriter writer(filename);
91  bool fExport = false;
92 
93  if (walletModel) {
94 
95  if (!txFilter) {
96  // Set up transaction list
98  txFilter->setDynamicSortFilter(true);
99  txFilter->setSortCaseSensitivity(Qt::CaseInsensitive);
100  txFilter->setFilterCaseSensitivity(Qt::CaseInsensitive);
101  txFilter->setSortRole(Qt::EditRole);
102  txFilter->setSourceModel(walletModel->getTransactionTableModel());
103  }
104 
105  // First type filter
106  txFilter->setTypeFilter(ui->comboBoxSortType->itemData(ui->comboBoxSortType->currentIndex()).toInt());
107 
108  // Second tx filter.
109  int columnIndex = TransactionTableModel::Date;
110  Qt::SortOrder order = Qt::DescendingOrder;
111  switch (ui->comboBoxSort->itemData(ui->comboBoxSort->currentIndex()).toInt()) {
112  case SortTx::DATE_ASC:{
113  columnIndex = TransactionTableModel::Date;
114  order = Qt::AscendingOrder;
115  break;
116  }
117  case SortTx::DATE_DESC:{
118  columnIndex = TransactionTableModel::Date;
119  break;
120  }
121  case SortTx::AMOUNT_ASC:{
122  columnIndex = TransactionTableModel::Amount;
123  order = Qt::AscendingOrder;
124  break;
125  }
126  case SortTx::AMOUNT_DESC:{
127  columnIndex = TransactionTableModel::Amount;
128  break;
129  }
130 
131  }
132  txFilter->sort(columnIndex, order);
133 
134  // name, column, role
135  writer.setModel(txFilter);
136  writer.addColumn(tr("Confirmed"), 0, TransactionTableModel::ConfirmedRole);
137  if (walletModel->haveWatchOnly())
138  writer.addColumn(tr("Watch-only"), TransactionTableModel::Watchonly);
139  writer.addColumn(tr("Date"), 0, TransactionTableModel::DateRole);
140  writer.addColumn(tr("Type"), TransactionTableModel::Type, Qt::EditRole);
141  writer.addColumn(tr("Label"), 0, TransactionTableModel::LabelRole);
142  writer.addColumn(tr("Address"), 0, TransactionTableModel::AddressRole);
144  writer.addColumn(tr("ID"), 0, TransactionTableModel::TxHashRole);
145  fExport = writer.write();
146  }
147 
148  if (fExport) {
149  inform(tr("Exporting Successful\nThe transaction history was successfully saved to %1.").arg(filename));
150  } else {
151  inform(tr("Exporting Failed\nThere was an error trying to save the transaction history to %1.").arg(filename));
152  }
153 }
154 
155 void SettingsExportCSV::exportAddrs(const QString& filename)
156 {
157  if (filename.isNull()) {
158  inform(tr("Please select a folder to export the csv file first."));
159  return;
160  }
161 
162  bool fExport = false;
163  if (walletModel) {
164 
165  if (!addressFilter) {
166  addressFilter = new QSortFilterProxyModel(this);
167  addressFilter->setSourceModel(walletModel->getAddressTableModel());
168  addressFilter->setDynamicSortFilter(true);
170  }
171 
172  // Filter by type
173  QString filterBy = ui->comboBoxSortAddressType->itemData(ui->comboBoxSortAddressType->currentIndex()).toString();
174  addressFilter->setFilterFixedString(filterBy);
175 
176  if (addressFilter->rowCount() == 0) {
177  inform(tr("No available addresses to export under the selected filter"));
178  return;
179  }
180 
181  CSVModelWriter writer(filename);
182  // name, column, role
183  writer.setModel(addressFilter);
184  writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
185  writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
186  writer.addColumn("Type", AddressTableModel::Type, Qt::DisplayRole);
187  fExport = writer.write();
188  }
189 
190  if (fExport) {
191  inform(tr("Exporting Successful\nThe address book was successfully saved to %1.").arg(filename));
192  } else {
193  inform(tr("Exporting Failed\nThere was an error trying to save the address list to %1. Please try again.").arg(filename));
194  }
195 }
196 
198 {
199  delete ui;
200 }
@ TypeRole
Type of address (Send, Receive, ColdStaking, ColdStakingSend, Delegator, Delegable)
@ Address
Bitcoin address.
@ Label
User specified label.
@ Type
Address Type.
static QString getAmountColumnTitle(int unit)
Gets title for amount column including current display unit if optionsModel reference available *‍/.
Export a Qt table model to a CSV file.
bool write()
Perform export of the model to CSV.
void setModel(const QAbstractItemModel *model)
void addColumn(const QString &title, int column, int role=Qt::EditRole)
int getDisplayUnit()
Definition: optionsmodel.h:74
PIVX GUI main class.
Definition: pivxgui.h:46
void inform(const QString &message)
Definition: pwidget.cpp:45
WalletModel * walletModel
Definition: pwidget.h:61
QSortFilterProxyModel * addressFilter
Definition: exportcsv.h:33
void exportTxes(const QString &filename)
Definition: exportcsv.cpp:83
void selectFileOutput(const bool isTxExport)
Definition: exportcsv.cpp:60
void exportAddrs(const QString &filename)
Definition: exportcsv.cpp:155
SettingsExportCSV(PIVXGUI *_window, QWidget *parent=nullptr)
Definition: exportcsv.cpp:16
Ui::SettingsExportCSV * ui
Definition: exportcsv.h:31
TransactionFilterProxy * txFilter
Definition: exportcsv.h:32
void Mouse_Pressed()
Filter the transaction list according to pre-specified rules.
void setTypeFilter(quint32 modes)
@ LabelRole
Label of address related to transaction.
@ DateRole
Date and time this transaction was created.
@ TxHashRole
Transaction hash.
@ AddressRole
Address of transaction.
@ ConfirmedRole
Is transaction confirmed?
@ FormattedAmountRole
Formatted amount, without brackets when unconfirmed.
AddressTableModel * getAddressTableModel()
OptionsModel * getOptionsModel()
bool haveWatchOnly() const
TransactionTableModel * getTransactionTableModel()
@ AMOUNT_ASC
@ DATE_DESC
@ DATE_ASC
@ AMOUNT_DESC
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
Definition: guiutil.cpp:291
void setFilterAddressBook(QComboBox *filter, SortEdit *lineEdit)
Definition: qtutils.cpp:131
void setSortTxTypeFilter(QComboBox *filter, SortEdit *lineEditType)
Definition: qtutils.cpp:155
void setShadow(QWidget *edit)
Definition: qtutils.cpp:292
void setCssProperty(std::initializer_list< QWidget * > args, const QString &value)
Definition: qtutils.cpp:334
void setSortTx(QComboBox *filter, SortEdit *lineEdit)
Definition: qtutils.cpp:145