merged master
This commit is contained in:
@@ -397,7 +397,9 @@ void MainWindow::setupTransactionsTab() {
|
|||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
|
|
||||||
auto txModel = dynamic_cast<TxTableModel *>(ui->transactionsTable->model());
|
auto txModel = dynamic_cast<TxTableModel *>(ui->transactionsTable->model());
|
||||||
|
|
||||||
QString txid = txModel->getTxId(index.row());
|
QString txid = txModel->getTxId(index.row());
|
||||||
|
QString memo = txModel->getMemo(index.row());
|
||||||
|
|
||||||
menu.addAction("Copy txid", [=] () {
|
menu.addAction("Copy txid", [=] () {
|
||||||
QGuiApplication::clipboard()->setText(txid);
|
QGuiApplication::clipboard()->setText(txid);
|
||||||
@@ -412,6 +414,11 @@ void MainWindow::setupTransactionsTab() {
|
|||||||
}
|
}
|
||||||
QDesktopServices::openUrl(QUrl(url));
|
QDesktopServices::openUrl(QUrl(url));
|
||||||
});
|
});
|
||||||
|
if (!memo.isEmpty()) {
|
||||||
|
menu.addAction("View Memo", [=] () {
|
||||||
|
QMessageBox::information(this, "Memo", memo, QMessageBox::Ok);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
menu.exec(ui->transactionsTable->viewport()->mapToGlobal(pos));
|
menu.exec(ui->transactionsTable->viewport()->mapToGlobal(pos));
|
||||||
});
|
});
|
||||||
|
|||||||
97
src/memodialog.ui
Normal file
97
src/memodialog.ui
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MemoDialog</class>
|
||||||
|
<widget class="QDialog" name="MemoDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>618</width>
|
||||||
|
<height>115</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QLineEdit" name="memoTxt"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Memo</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="memoSize">
|
||||||
|
<property name="text">
|
||||||
|
<string>6 / 512</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>MemoDialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>MemoDialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
||||||
24
src/rpc.cpp
24
src/rpc.cpp
@@ -347,11 +347,23 @@ void RPC::refreshReceivedZTrans(QList<QString> zaddrs) {
|
|||||||
// Process all txids, removing duplicates. This can happen if the same address
|
// Process all txids, removing duplicates. This can happen if the same address
|
||||||
// appears multiple times in a single tx's outputs.
|
// appears multiple times in a single tx's outputs.
|
||||||
QSet<QString> txids;
|
QSet<QString> txids;
|
||||||
|
QMap<QString, QString> memos;
|
||||||
for (auto it = zaddrTxids->constBegin(); it != zaddrTxids->constEnd(); it++) {
|
for (auto it = zaddrTxids->constBegin(); it != zaddrTxids->constEnd(); it++) {
|
||||||
for (auto& i : it.value().get<json::array_t>()) {
|
for (auto& i : it.value().get<json::array_t>()) {
|
||||||
// Filter out change txs
|
// Filter out change txs
|
||||||
if (! i["change"].get<json::boolean_t>())
|
if (! i["change"].get<json::boolean_t>()) {
|
||||||
txids.insert(QString::fromStdString(i["txid"].get<json::string_t>()));
|
auto txid = QString::fromStdString(i["txid"].get<json::string_t>());
|
||||||
|
txids.insert(txid);
|
||||||
|
|
||||||
|
// Check for Memos
|
||||||
|
QString memoBytes = QString::fromStdString(i["memo"].get<json::string_t>());
|
||||||
|
if (!memoBytes.startsWith("f600")) {
|
||||||
|
QString memo(QByteArray::fromHex(
|
||||||
|
QByteArray::fromStdString(i["memo"].get<json::string_t>())));
|
||||||
|
if (!memo.trimmed().isEmpty())
|
||||||
|
memos[txid] = memo;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,9 +403,10 @@ void RPC::refreshReceivedZTrans(QList<QString> zaddrs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto amount = i["amount"].get<json::number_float_t>();
|
auto amount = i["amount"].get<json::number_float_t>();
|
||||||
auto confirmations = txidInfo["confirmations"].get<json::number_unsigned_t>();
|
auto confirmations = txidInfo["confirmations"].get<json::number_unsigned_t>();
|
||||||
|
|
||||||
TransactionItem tx{ QString("receive"), timestamp, zaddr, txid, amount, confirmations, "" };
|
TransactionItem tx{ QString("receive"), timestamp, zaddr, txid, amount,
|
||||||
|
confirmations, "", memos.value(txid, "") };
|
||||||
txdata.push_front(tx);
|
txdata.push_front(tx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -584,8 +597,7 @@ void RPC::refreshTransactions() {
|
|||||||
QString::fromStdString(it["txid"]),
|
QString::fromStdString(it["txid"]),
|
||||||
it["amount"].get<json::number_float_t>() + fee,
|
it["amount"].get<json::number_float_t>() + fee,
|
||||||
it["confirmations"].get<json::number_unsigned_t>(),
|
it["confirmations"].get<json::number_unsigned_t>(),
|
||||||
""
|
"", "" };
|
||||||
};
|
|
||||||
|
|
||||||
txdata.push_back(tx);
|
txdata.push_back(tx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ struct TransactionItem {
|
|||||||
double amount;
|
double amount;
|
||||||
unsigned long confirmations;
|
unsigned long confirmations;
|
||||||
QString fromAddr;
|
QString fromAddr;
|
||||||
|
QString memo;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RPC
|
class RPC
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
#include "ui_confirm.h"
|
#include "ui_confirm.h"
|
||||||
|
#include "ui_memodialog.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "rpc.h"
|
#include "rpc.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@@ -236,13 +237,30 @@ void MainWindow::memoButtonClicked(int number) {
|
|||||||
QString currentMemo = memoTxt->text();
|
QString currentMemo = memoTxt->text();
|
||||||
|
|
||||||
// Ref to see if the button was clicked
|
// Ref to see if the button was clicked
|
||||||
bool ok;
|
// bool ok;
|
||||||
QString newMemo = QInputDialog::getText(this, "Memo",
|
// QString newMemo = QInputDialog::getText(this, "Memo",
|
||||||
"Please type a memo to include with the amount. The memo will be visible to the recepient",
|
// "Please type a memo to include with the amount. The memo will be visible to the recepient",
|
||||||
QLineEdit::Normal, currentMemo, &ok);
|
// QLineEdit::Normal, currentMemo, &ok);
|
||||||
if (ok) {
|
Ui_MemoDialog memoDialog;
|
||||||
memoTxt->setText(newMemo);
|
QDialog dialog(this);
|
||||||
|
memoDialog.setupUi(&dialog);
|
||||||
|
|
||||||
|
QObject::connect(memoDialog.memoTxt, &QLineEdit::textChanged, [=] (QString txt) {
|
||||||
|
memoDialog.memoSize->setText(QString::number(txt.toUtf8().size()) + "/512");
|
||||||
|
|
||||||
|
memoDialog.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(txt.toUtf8().size() <= 512);
|
||||||
|
if (txt.toUtf8().size() > 512) {
|
||||||
|
memoDialog.memoSize->setStyleSheet("color: red;");
|
||||||
|
} else {
|
||||||
|
memoDialog.memoSize->setStyleSheet("");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
memoDialog.memoTxt->setText(currentMemo);
|
||||||
|
|
||||||
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
|
memoTxt->setText(memoDialog.memoTxt->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::removeExtraAddresses() {
|
void MainWindow::removeExtraAddresses() {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ QList<TransactionItem> SentTxStore::readSentTxFile() {
|
|||||||
sentTx["address"].toString(),
|
sentTx["address"].toString(),
|
||||||
sentTx["txid"].toString(),
|
sentTx["txid"].toString(),
|
||||||
sentTx["amount"].toDouble() + sentTx["fee"].toDouble(),
|
sentTx["amount"].toDouble() + sentTx["fee"].toDouble(),
|
||||||
0, sentTx["from"].toString()};
|
0, sentTx["from"].toString(), ""};
|
||||||
items.push_back(t);
|
items.push_back(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ bool Settings::loadFromFile() {
|
|||||||
|
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
confLocation = QStandardPaths::locate(QStandardPaths::HomeLocation, ".zcash/zcash.conf");
|
confLocation = QStandardPaths::locate(QStandardPaths::HomeLocation, ".zcash/zcash.conf");
|
||||||
|
#elif defined(Q_OS_DARWIN)
|
||||||
|
confLocation = QStandardPaths::locate(QStandardPaths::HomeLocation, "/Library/Application Support/Zcash/zcash.conf");
|
||||||
#else
|
#else
|
||||||
confLocation = QStandardPaths::locate(QStandardPaths::AppDataLocation, "../../Zcash/zcash.conf");
|
confLocation = QStandardPaths::locate(QStandardPaths::AppDataLocation, "../../Zcash/zcash.conf");
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -131,4 +131,8 @@ void TxTableModel::updateAllData() {
|
|||||||
|
|
||||||
QString TxTableModel::getTxId(int row) {
|
QString TxTableModel::getTxId(int row) {
|
||||||
return modeldata->at(row).txid;
|
return modeldata->at(row).txid;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TxTableModel::getMemo(int row) {
|
||||||
|
return modeldata->at(row).memo;
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,7 @@ public:
|
|||||||
void addZRecvData(const QList<TransactionItem>& data);
|
void addZRecvData(const QList<TransactionItem>& data);
|
||||||
|
|
||||||
QString getTxId(int row);
|
QString getTxId(int row);
|
||||||
|
QString getMemo(int row);
|
||||||
|
|
||||||
int rowCount(const QModelIndex &parent) const;
|
int rowCount(const QModelIndex &parent) const;
|
||||||
int columnCount(const QModelIndex &parent) const;
|
int columnCount(const QModelIndex &parent) const;
|
||||||
|
|||||||
90
src/ui_memodialog.h
Normal file
90
src/ui_memodialog.h
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/********************************************************************************
|
||||||
|
** Form generated from reading UI file 'memodialog.ui'
|
||||||
|
**
|
||||||
|
** Created by: Qt User Interface Compiler version 5.11.2
|
||||||
|
**
|
||||||
|
** WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||||
|
********************************************************************************/
|
||||||
|
|
||||||
|
#ifndef UI_MEMODIALOG_H
|
||||||
|
#define UI_MEMODIALOG_H
|
||||||
|
|
||||||
|
#include <QtCore/QVariant>
|
||||||
|
#include <QtWidgets/QApplication>
|
||||||
|
#include <QtWidgets/QDialog>
|
||||||
|
#include <QtWidgets/QDialogButtonBox>
|
||||||
|
#include <QtWidgets/QGridLayout>
|
||||||
|
#include <QtWidgets/QLabel>
|
||||||
|
#include <QtWidgets/QLineEdit>
|
||||||
|
#include <QtWidgets/QSpacerItem>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class Ui_MemoDialog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QGridLayout *gridLayout;
|
||||||
|
QLineEdit *memoTxt;
|
||||||
|
QLabel *label;
|
||||||
|
QLabel *memoSize;
|
||||||
|
QDialogButtonBox *buttonBox;
|
||||||
|
QSpacerItem *verticalSpacer;
|
||||||
|
|
||||||
|
void setupUi(QDialog *MemoDialog)
|
||||||
|
{
|
||||||
|
if (MemoDialog->objectName().isEmpty())
|
||||||
|
MemoDialog->setObjectName(QStringLiteral("MemoDialog"));
|
||||||
|
MemoDialog->resize(618, 115);
|
||||||
|
gridLayout = new QGridLayout(MemoDialog);
|
||||||
|
gridLayout->setObjectName(QStringLiteral("gridLayout"));
|
||||||
|
memoTxt = new QLineEdit(MemoDialog);
|
||||||
|
memoTxt->setObjectName(QStringLiteral("memoTxt"));
|
||||||
|
|
||||||
|
gridLayout->addWidget(memoTxt, 1, 0, 1, 2);
|
||||||
|
|
||||||
|
label = new QLabel(MemoDialog);
|
||||||
|
label->setObjectName(QStringLiteral("label"));
|
||||||
|
|
||||||
|
gridLayout->addWidget(label, 0, 0, 1, 1);
|
||||||
|
|
||||||
|
memoSize = new QLabel(MemoDialog);
|
||||||
|
memoSize->setObjectName(QStringLiteral("memoSize"));
|
||||||
|
memoSize->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
|
||||||
|
|
||||||
|
gridLayout->addWidget(memoSize, 0, 1, 1, 1);
|
||||||
|
|
||||||
|
buttonBox = new QDialogButtonBox(MemoDialog);
|
||||||
|
buttonBox->setObjectName(QStringLiteral("buttonBox"));
|
||||||
|
buttonBox->setOrientation(Qt::Horizontal);
|
||||||
|
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
|
||||||
|
|
||||||
|
gridLayout->addWidget(buttonBox, 3, 0, 1, 2);
|
||||||
|
|
||||||
|
verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||||
|
|
||||||
|
gridLayout->addItem(verticalSpacer, 2, 0, 1, 2);
|
||||||
|
|
||||||
|
|
||||||
|
retranslateUi(MemoDialog);
|
||||||
|
QObject::connect(buttonBox, SIGNAL(accepted()), MemoDialog, SLOT(accept()));
|
||||||
|
QObject::connect(buttonBox, SIGNAL(rejected()), MemoDialog, SLOT(reject()));
|
||||||
|
|
||||||
|
QMetaObject::connectSlotsByName(MemoDialog);
|
||||||
|
} // setupUi
|
||||||
|
|
||||||
|
void retranslateUi(QDialog *MemoDialog)
|
||||||
|
{
|
||||||
|
MemoDialog->setWindowTitle(QApplication::translate("MemoDialog", "Dialog", nullptr));
|
||||||
|
label->setText(QApplication::translate("MemoDialog", "Memo", nullptr));
|
||||||
|
memoSize->setText(QApplication::translate("MemoDialog", "6 / 512", nullptr));
|
||||||
|
} // retranslateUi
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MemoDialog: public Ui_MemoDialog {};
|
||||||
|
} // namespace Ui
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // UI_MEMODIALOG_H
|
||||||
@@ -76,6 +76,7 @@ FORMS += \
|
|||||||
src/confirm.ui \
|
src/confirm.ui \
|
||||||
src/turnstile.ui \
|
src/turnstile.ui \
|
||||||
src/turnstileprogress.ui
|
src/turnstileprogress.ui
|
||||||
|
src/memodialog.ui
|
||||||
|
|
||||||
# Default rules for deployment.
|
# Default rules for deployment.
|
||||||
qnx: target.path = /tmp/$${TARGET}/bin
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
|
|||||||
Reference in New Issue
Block a user