diff --git a/README.rst b/README.rst index bb14be60e..9856370bc 100644 --- a/README.rst +++ b/README.rst @@ -22,7 +22,9 @@ This has been implemented: - Options dialog -- Sending coins +- Sending coins (including ask for fee when needed) + +- Show messages from core This has to be done: @@ -34,6 +36,4 @@ This has to be done: - Show details dialog for transactions (on double click) -- Display error messages/alerts from core - - More thorough testing of the view with all the kinds of transactions (sendmany, generation) diff --git a/gui/include/bitcoingui.h b/gui/include/bitcoingui.h index c2c786b28..ab7b4bbdb 100644 --- a/gui/include/bitcoingui.h +++ b/gui/include/bitcoingui.h @@ -66,6 +66,7 @@ public slots: void setNumBlocks(int count); void setNumTransactions(int count); void error(const QString &title, const QString &message); + void askFee(qint64 nFeeRequired, bool *payFee); private slots: void sendcoinsClicked(); diff --git a/gui/src/bitcoin.cpp b/gui/src/bitcoin.cpp index a1b74d879..6dbcb6c29 100644 --- a/gui/src/bitcoin.cpp +++ b/gui/src/bitcoin.cpp @@ -5,10 +5,12 @@ #include "clientmodel.h" #include "util.h" #include "init.h" +#include "main.h" #include "externui.h" #include #include +#include // Need a global reference for the notifications to find the GUI BitcoinGUI *guiref; @@ -16,7 +18,6 @@ BitcoinGUI *guiref; int MyMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y) { // Message from main thread - printf("MyMessageBox\n"); if(guiref) { guiref->error(QString::fromStdString(caption), @@ -50,9 +51,26 @@ int ThreadSafeMessageBox(const std::string& message, const std::string& caption, bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent) { - // Query from network thread - // TODO - return true; + if(!guiref) + return false; + if(nFeeRequired < MIN_TX_FEE || nFeeRequired <= nTransactionFee || fDaemon) + return true; + bool payFee = false; + + /* Call slot on GUI thread. + If called from another thread, use a blocking QueuedConnection. + */ + Qt::ConnectionType connectionType = Qt::DirectConnection; + if(QThread::currentThread() != QCoreApplication::instance()->thread()) + { + connectionType = Qt::BlockingQueuedConnection; + } + + QMetaObject::invokeMethod(guiref, "askFee", connectionType, + Q_ARG(qint64, nFeeRequired), + Q_ARG(bool*, &payFee)); + + return payFee; } void CalledSetStatusBar(const std::string& strText, int nField) @@ -73,13 +91,13 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setQuitOnLastWindowClosed(false); - BitcoinGUI window; - guiref = &window; try { if(AppInit2(argc, argv)) { + BitcoinGUI window; ClientModel model; + guiref = &window; window.setModel(&model); window.show(); diff --git a/gui/src/bitcoingui.cpp b/gui/src/bitcoingui.cpp index b68720462..70da0b239 100644 --- a/gui/src/bitcoingui.cpp +++ b/gui/src/bitcoingui.cpp @@ -380,3 +380,15 @@ void BitcoinGUI::closeEvent(QCloseEvent *event) } QMainWindow::closeEvent(event); } + +void BitcoinGUI::askFee(qint64 nFeeRequired, bool *payFee) +{ + QString strMessage = + tr("This transaction is over the size limit. You can still send it for a fee of %1, " + "which goes to the nodes that process your transaction and helps to support the network. " + "Do you want to pay the fee?").arg(QString::fromStdString(FormatMoney(nFeeRequired))); + QMessageBox::StandardButton retval = QMessageBox::question( + this, tr("Sending..."), strMessage, + QMessageBox::Yes|QMessageBox::Cancel, QMessageBox::Yes); + *payFee = (retval == QMessageBox::Yes); +}