|
|
@ -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<long, ChatItem> 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"; |
|
|
|
|
|
|
|
// 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 ""; |
|
|
|
} |