From 38a1d6966aab880e2e21370423218149b96db005 Mon Sep 17 00:00:00 2001 From: DenioD <41270280+DenioD@users.noreply.github.com> Date: Mon, 27 Apr 2020 23:10:42 +0200 Subject: [PATCH 1/2] add sending ability for HushChat tab --- src/chatmodel.cpp | 205 ++++++++++++++++++++++++++++++++++++++++++++- src/chatmodel.h | 18 ++++ src/mainwindow.cpp | 1 + src/mainwindow.h | 7 +- src/mainwindow.ui | 42 ++++++---- 5 files changed, 253 insertions(+), 20 deletions(-) diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index e1962c9..25e012d 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -1,4 +1,13 @@ #include "chatmodel.h" +#include "settings.h" +#include "ui_confirm.h" +#include "controller.h" +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "addressbook.h" +#include "ui_memodialog.h" + + ChatModel::ChatModel(std::map chatItems) { @@ -77,9 +86,203 @@ void ChatModel::renderChatBox(QListWidget *view) myDateTime.setTime_t(c.second.getTimestamp()); qDebug() << "[" << myDateTime.toString("dd.MM.yyyy hh:mm:ss ") << "] " << "<" << c.second.getAddress() << "> :" << c.second.getMemo(); line += QString("[") + myDateTime.toString("dd.MM.yyyy hh:mm:ss ") + QString("] "); - line += QString("<") + QString(c.second.getAddress()) + QString("> :"); + line += QString("<") + QString(c.second.getAddress()) + QString("> :\n"); line += QString(c.second.getMemo()); view->addItem(line); line =""; } +} + +void MainWindow::setupchatTab() { + +// Send button + QObject::connect(ui->sendChatButton, &QPushButton::clicked, this, &MainWindow::sendChatButton); + + } + +ChatMemoEdit::ChatMemoEdit(QWidget* parent) : QPlainTextEdit(parent) { + QObject::connect(this, &QPlainTextEdit::textChanged, this, &ChatMemoEdit::updateDisplay); +} + +void ChatMemoEdit::updateDisplay() { + QString txt = this->toPlainText(); + if (lenDisplayLabel) + lenDisplayLabel->setText(QString::number(txt.toUtf8().size()) + "/" + QString::number(maxlen)); + + if (txt.toUtf8().size() <= maxlen) { + // Everything is fine + if (sendChatButton) + sendChatButton->setEnabled(true); + + if (lenDisplayLabel) + lenDisplayLabel->setStyleSheet(""); + } + else { + // Overweight + if (sendChatButton) + sendChatButton->setEnabled(false); + + if (lenDisplayLabel) + lenDisplayLabel->setStyleSheet("color: red;"); + } +} + +void ChatMemoEdit::setMaxLen(int len) { + this->maxlen = len; + updateDisplay(); +} + +void ChatMemoEdit::setLenDisplayLabel(QLabel* label) { + this->lenDisplayLabel = label; +} + +void ChatMemoEdit::setSendChatButton(QPushButton* button) { + this->sendChatButton = button; +} + +// Create a Tx from the current state of the Chat page. +Tx MainWindow::createTxFromChatPage() { + Tx tx; + CAmount totalAmt; + // For each addr/amt in the Chat tab + { + QString addr = ""; // We need to set the reply Address for our Contact here + // Remove label if it exists + addr = AddressBook::addressFromAddressLabel(addr); + + QString amtStr = "0.00001"; + + // bool ok; + CAmount amt; + + + amt = CAmount::fromDecimalString("0.00001"); + totalAmt = totalAmt + amt; + + + QString memo = ui->memoTxtChat->toPlainText().trimmed(); + //ui->chatmemoSize->setLenDisplayLabel() + + + tx.toAddrs.push_back(ToFields{addr, amt, memo,}) ; + + qDebug() << "pushback chattx"; + } + + tx.fee = Settings::getMinerFee(); + + return tx; + + qDebug() << "ChatTx created"; +} + +void MainWindow::sendChatButton() { + // Create a Tx from the values on the send tab. Note that this Tx object + // might not be valid yet. + + // Memos can only be used with zAddrs. So check that first + //auto addr = "zs1fllv4hgrjddnz2yz5dng9kchcg3wkhs0j2v5v3nc89w3r3kntkgq2sefcz2a9k2ycc8f6t0gm2q"; + // if (! Settings::isZAddress(AddressBook::addressFromAddressLabel(addr->text()))) { + // QMessageBox msg(QMessageBox::Critical, tr("Memos can only be used with z-addresses"), + // tr("The memo field can only be used with a z-address.\n") + addr->text() + tr("\ndoesn't look like a z-address"), + // QMessageBox::Ok, this); + + // msg.exec(); + //return; + //} + + Tx tx = createTxFromChatPage(); + + QString error = doSendChatTxValidations(tx); + + if (!error.isEmpty()) { + // Something went wrong, so show an error and exit + QMessageBox msg(QMessageBox::Critical, tr("Message Error"), error, + QMessageBox::Ok, this); + + msg.exec(); + + // abort the Tx + return; + qDebug() << "Tx aborted"; + } + + // Create a new Dialog to show that we are computing/sending the Tx + auto d = new QDialog(this); + auto connD = new Ui_ConnectionDialog(); + connD->setupUi(d); + QPixmap logo(":/img/res/logobig.gif"); + connD->topIcon->setBasePixmap(logo.scaled(256, 256, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + + connD->status->setText(tr("Please wait...")); + connD->statusDetail->setText(tr("Your Message will be send")); + + d->show(); + + // And send the Tx + rpc->executeTransaction(tx, + [=] (QString txid) { + ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + + connD->status->setText(tr("Done!")); + connD->statusDetail->setText(txid); + + QTimer::singleShot(1000, [=]() { + d->accept(); + d->close(); + delete connD; + delete d; + + }); + + // Force a UI update so we get the unconfirmed Tx + rpc->refresh(true); + + }, + // Errored out + [=] (QString opid, QString errStr) { + ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + + d->accept(); + d->close(); + delete connD; + delete d; + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; + + QMessageBox::critical(this, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + } + ); + } + + +QString MainWindow::doSendChatTxValidations(Tx tx) { + // Check to see if we have enough verified funds to send the Tx. + + CAmount total; + for (auto toAddr : tx.toAddrs) { + if (!Settings::isValidAddress(toAddr.addr)) { + QString addr = (toAddr.addr.length() > 100 ? toAddr.addr.left(100) + "..." : toAddr.addr); + return QString(tr("Recipient Address ")) % addr % tr(" is Invalid"); + } + + // This technically shouldn't be possible, but issue #62 seems to have discovered a bug + // somewhere, so just add a check to make sure. + if (toAddr.amount.toqint64() < 0) { + return QString(tr("Amount for address '%1' is invalid!").arg(toAddr.addr)); + } + + total = total + toAddr.amount; + } + total = total + tx.fee; + + auto available = rpc->getModel()->getAvailableBalance(); + + if (available < total) { + return tr("Not enough available funds to send this transaction\n\nHave: %1\nNeed: %2\n\nNote: Funds need 5 confirmations before they can be spent") + .arg(available.toDecimalhushString(), total.toDecimalhushString()); + } + + return ""; } \ No newline at end of file diff --git a/src/chatmodel.h b/src/chatmodel.h index 56db136..e893acf 100644 --- a/src/chatmodel.h +++ b/src/chatmodel.h @@ -116,4 +116,22 @@ class ChatModel void addMessage(ChatItem item); void addMessage(long timestamp, ChatItem item); }; + +class ChatMemoEdit : public QPlainTextEdit +{ +public: + ChatMemoEdit(QWidget* parent); + + void setMaxLen(int len); + void setLenDisplayLabel(QLabel* label); + void setSendChatButton(QPushButton* button); + void includeReplyTo(QString replyToAddress); + void updateDisplay(); + +private: + int maxlen = 512; + QLabel* lenDisplayLabel = nullptr; + QPushButton* sendChatButton = nullptr; +}; + #endif \ No newline at end of file diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b268750..b17f086 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -152,6 +152,7 @@ MainWindow::MainWindow(QWidget *parent) : setupReceiveTab(); setupBalancesTab(); setuphushdTab(); + setupchatTab(); rpc = new Controller(this); diff --git a/src/mainwindow.h b/src/mainwindow.h index 85f3595..17194b4 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -47,6 +47,7 @@ public: QRegExpValidator* getAmountValidator() { return amtValidator; } QString doSendTxValidations(Tx tx); + QString doSendChatTxValidations(Tx tx); void replaceWormholeClient(WormholeClient* newClient); bool isWebsocketListening(); @@ -85,10 +86,11 @@ private: void setupSendTab(); void setupTransactionsTab(); - void updateChat(); void setupReceiveTab(); void setupBalancesTab(); void setuphushdTab(); + void setupchatTab(); + void updateChat(); void setupSettingsModal(); void setupStatusBar(); @@ -98,11 +100,14 @@ private: Tx createTxFromSendPage(); bool confirmTx(Tx tx, RecurringPaymentInfo* rpi); + Tx createTxFromChatPage(); + void encryptWallet(); void removeWalletEncryption(); void cancelButton(); void sendButton(); + void sendChatButton(); void addAddressSection(); void maxAmountChecked(int checked); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 6e8dcfe..6d493af 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1367,9 +1367,9 @@ - 357 + 347 483 - 891 + 901 128 @@ -1387,22 +1387,6 @@ Include Reply Address - - - - 692 - 618 - 189 - 25 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - @@ -1442,6 +1426,28 @@ + + + + 1130 + 620 + 114 + 25 + + + + + 100 + 0 + + + + Send + + + false + + From ec5057e4ce2e73138c5936bf0e2839f2a5134f77 Mon Sep 17 00:00:00 2001 From: DenioD <41270280+DenioD@users.noreply.github.com> Date: Mon, 27 Apr 2020 23:12:43 +0200 Subject: [PATCH 2/2] set amt to 0 for HushChat Memos --- src/chatmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index 25e012d..e3374f1 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -150,7 +150,7 @@ Tx MainWindow::createTxFromChatPage() { // Remove label if it exists addr = AddressBook::addressFromAddressLabel(addr); - QString amtStr = "0.00001"; + QString amtStr = "0"; // bool ok; CAmount amt;