Browse Source

qtui.h/noui.h interface cleanup

- rename wxMessageBox, remove redundant arguments to noui/qtui calls
- also, add flag to force blocking, modal dialog box for disk space warning etc
- clarify function naming
- no more special MessageBox needed from AppInit2, as window object is created before calling AppInit2
0.8
Wladimir J. van der Laan 13 years ago
parent
commit
7cfbe1fee4
  1. 18
      src/init.cpp
  2. 2
      src/main.cpp
  3. 13
      src/noui.h
  4. 31
      src/qt/bitcoin.cpp
  5. 11
      src/qt/bitcoingui.cpp
  6. 2
      src/qt/bitcoingui.h
  7. 2
      src/qt/clientmodel.h
  8. 2
      src/qt/walletmodel.cpp
  9. 2
      src/qt/walletmodel.h
  10. 9
      src/qtui.h
  11. 2
      src/util.cpp
  12. 2
      src/wallet.cpp

18
src/init.cpp

@ -237,7 +237,7 @@ bool AppInit2(int argc, char* argv[])
strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end()); strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end());
#if defined(QT_GUI) && defined(WIN32) #if defined(QT_GUI) && defined(WIN32)
// On windows, show a message box, as there is no stderr // On windows, show a message box, as there is no stderr
wxMessageBox(strUsage, "Usage"); ThreadSafeMessageBox(strUsage, _("Usage"), wxOK | wxMODAL);
#else #else
fprintf(stderr, "%s", strUsage.c_str()); fprintf(stderr, "%s", strUsage.c_str());
#endif #endif
@ -326,7 +326,7 @@ bool AppInit2(int argc, char* argv[])
static boost::interprocess::file_lock lock(strLockFile.c_str()); static boost::interprocess::file_lock lock(strLockFile.c_str());
if (!lock.try_lock()) if (!lock.try_lock())
{ {
wxMessageBox(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin is probably already running."), GetDataDir().c_str()), "Bitcoin"); ThreadSafeMessageBox(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin is probably already running."), GetDataDir().c_str()), _("Bitcoin"), wxOK|wxMODAL);
return false; return false;
} }
@ -368,7 +368,7 @@ bool AppInit2(int argc, char* argv[])
{ {
strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n"; strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
printf("%s", strErrors.str().c_str()); printf("%s", strErrors.str().c_str());
wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR); ThreadSafeMessageBox(strErrors.str(), _("Bitcoin"), wxOK | wxICON_ERROR | wxMODAL);
return false; return false;
} }
else else
@ -440,7 +440,7 @@ bool AppInit2(int argc, char* argv[])
if (!strErrors.str().empty()) if (!strErrors.str().empty())
{ {
wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR); ThreadSafeMessageBox(strErrors.str(), _("Bitcoin"), wxOK | wxICON_ERROR | wxMODAL);
return false; return false;
} }
@ -496,7 +496,7 @@ bool AppInit2(int argc, char* argv[])
addrProxy = CService(mapArgs["-proxy"], 9050); addrProxy = CService(mapArgs["-proxy"], 9050);
if (!addrProxy.IsValid()) if (!addrProxy.IsValid())
{ {
wxMessageBox(_("Invalid -proxy address"), "Bitcoin"); ThreadSafeMessageBox(_("Invalid -proxy address"), _("Bitcoin"), wxOK | wxMODAL);
return false; return false;
} }
} }
@ -527,7 +527,7 @@ bool AppInit2(int argc, char* argv[])
std::string strError; std::string strError;
if (!BindListenPort(strError)) if (!BindListenPort(strError))
{ {
wxMessageBox(strError, "Bitcoin"); ThreadSafeMessageBox(strError, _("Bitcoin"), wxOK | wxMODAL);
return false; return false;
} }
} }
@ -547,11 +547,11 @@ bool AppInit2(int argc, char* argv[])
{ {
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee)) if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
{ {
wxMessageBox(_("Invalid amount for -paytxfee=<amount>"), "Bitcoin"); ThreadSafeMessageBox(_("Invalid amount for -paytxfee=<amount>"), _("Bitcoin"), wxOK | wxMODAL);
return false; return false;
} }
if (nTransactionFee > 0.25 * COIN) if (nTransactionFee > 0.25 * COIN)
wxMessageBox(_("Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction."), "Bitcoin", wxOK | wxICON_EXCLAMATION); ThreadSafeMessageBox(_("Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction."), _("Bitcoin"), wxOK | wxICON_EXCLAMATION | wxMODAL);
} }
// //
@ -563,7 +563,7 @@ bool AppInit2(int argc, char* argv[])
RandAddSeedPerfmon(); RandAddSeedPerfmon();
if (!CreateThread(StartNode, NULL)) if (!CreateThread(StartNode, NULL))
wxMessageBox(_("Error: CreateThread(StartNode) failed"), "Bitcoin"); ThreadSafeMessageBox(_("Error: CreateThread(StartNode) failed"), _("Bitcoin"), wxOK | wxMODAL);
if (fServer) if (fServer)
CreateThread(ThreadRPCServer, NULL); CreateThread(ThreadRPCServer, NULL);

2
src/main.cpp

@ -1811,7 +1811,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes)
string strMessage = _("Warning: Disk space is low "); string strMessage = _("Warning: Disk space is low ");
strMiscWarning = strMessage; strMiscWarning = strMessage;
printf("*** %s\n", strMessage.c_str()); printf("*** %s\n", strMessage.c_str());
ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION); ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION | wxMODAL);
QueueShutdown(); QueueShutdown();
return false; return false;
} }

13
src/noui.h

@ -9,7 +9,6 @@
#include "wallet.h" #include "wallet.h"
#include "init.h" #include "init.h"
typedef void wxWindow;
#define wxYES 0x00000002 #define wxYES 0x00000002
#define wxOK 0x00000004 #define wxOK 0x00000004
#define wxNO 0x00000008 #define wxNO 0x00000008
@ -36,21 +35,17 @@ typedef void wxWindow;
#define wxHELP 0x00008000 #define wxHELP 0x00008000
#define wxMORE 0x00010000 #define wxMORE 0x00010000
#define wxSETUP 0x00020000 #define wxSETUP 0x00020000
// Force blocking, modal message box dialog (not just notification)
#define wxMODAL 0x00040000
inline int MyMessageBox(const std::string& message, const std::string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1) inline int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK)
{ {
printf("%s: %s\n", caption.c_str(), message.c_str()); printf("%s: %s\n", caption.c_str(), message.c_str());
fprintf(stderr, "%s: %s\n", caption.c_str(), message.c_str()); fprintf(stderr, "%s: %s\n", caption.c_str(), message.c_str());
return 4; return 4;
} }
#define wxMessageBox MyMessageBox
inline int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1) inline bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption)
{
return MyMessageBox(message, caption, style, parent, x, y);
}
inline bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent)
{ {
return true; return true;
} }

31
src/qt/bitcoin.cpp

@ -38,23 +38,18 @@ static QSplashScreen *splashref;
static WalletModel *walletmodel; static WalletModel *walletmodel;
static ClientModel *clientmodel; static ClientModel *clientmodel;
int MyMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y) int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style)
{
// Message from AppInit2(), always in main thread before main window is constructed
QMessageBox::critical(0, QString::fromStdString(caption),
QString::fromStdString(message),
QMessageBox::Ok, QMessageBox::Ok);
return 4;
}
int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y)
{ {
// Message from network thread // Message from network thread
if(guiref) if(guiref)
{ {
QMetaObject::invokeMethod(guiref, "error", Qt::QueuedConnection, bool modal = (style & wxMODAL);
// in case of modal message, use blocking connection to wait for user to click OK
QMetaObject::invokeMethod(guiref, "error",
modal ? GUIUtil::blockingGUIThreadConnection() : Qt::QueuedConnection,
Q_ARG(QString, QString::fromStdString(caption)), Q_ARG(QString, QString::fromStdString(caption)),
Q_ARG(QString, QString::fromStdString(message))); Q_ARG(QString, QString::fromStdString(message)),
Q_ARG(bool, modal));
} }
else else
{ {
@ -64,7 +59,7 @@ int ThreadSafeMessageBox(const std::string& message, const std::string& caption,
return 4; return 4;
} }
bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent) bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption)
{ {
if(!guiref) if(!guiref)
return false; return false;
@ -222,15 +217,16 @@ int main(int argc, char *argv[])
try try
{ {
BitcoinGUI window;
guiref = &window;
if(AppInit2(argc, argv)) if(AppInit2(argc, argv))
{ {
{ {
// Put this in a block, so that BitcoinGUI is cleaned up properly before // Put this in a block, so that the Model objects are cleaned up before
// calling Shutdown() in case of exceptions. // calling Shutdown().
optionsModel.Upgrade(); // Must be done after AppInit2 optionsModel.Upgrade(); // Must be done after AppInit2
BitcoinGUI window;
if (splashref) if (splashref)
splash.finish(&window); splash.finish(&window);
@ -239,7 +235,6 @@ int main(int argc, char *argv[])
WalletModel walletModel(pwalletMain, &optionsModel); WalletModel walletModel(pwalletMain, &optionsModel);
walletmodel = &walletModel; walletmodel = &walletModel;
guiref = &window;
window.setClientModel(&clientModel); window.setClientModel(&clientModel);
window.setWalletModel(&walletModel); window.setWalletModel(&walletModel);
@ -276,6 +271,8 @@ int main(int argc, char *argv[])
#endif #endif
app.exec(); app.exec();
window.setClientModel(0);
window.setWalletModel(0);
guiref = 0; guiref = 0;
clientmodel = 0; clientmodel = 0;
walletmodel = 0; walletmodel = 0;

11
src/qt/bitcoingui.cpp

@ -336,7 +336,7 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int))); connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
// Report errors from network/worker thread // Report errors from network/worker thread
connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString))); connect(clientModel, SIGNAL(error(QString,QString, bool)), this, SLOT(error(QString,QString,bool)));
} }
} }
@ -346,7 +346,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel)
if(walletModel) if(walletModel)
{ {
// Report errors from wallet thread // Report errors from wallet thread
connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString))); connect(walletModel, SIGNAL(error(QString,QString,bool)), this, SLOT(error(QString,QString,bool)));
// Put transaction list in tabs // Put transaction list in tabs
transactionView->setModel(walletModel); transactionView->setModel(walletModel);
@ -538,10 +538,15 @@ void BitcoinGUI::setNumBlocks(int count)
progressBar->setToolTip(tooltip); progressBar->setToolTip(tooltip);
} }
void BitcoinGUI::error(const QString &title, const QString &message) void BitcoinGUI::error(const QString &title, const QString &message, bool modal)
{ {
// Report errors from network/worker thread // Report errors from network/worker thread
if(modal)
{
QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok);
} else {
notificator->notify(Notificator::Critical, title, message); notificator->notify(Notificator::Critical, title, message);
}
} }
void BitcoinGUI::changeEvent(QEvent *e) void BitcoinGUI::changeEvent(QEvent *e)

2
src/qt/bitcoingui.h

@ -115,7 +115,7 @@ public slots:
void setEncryptionStatus(int status); void setEncryptionStatus(int status);
/** Notify the user of an error in the network or transaction handling code. */ /** Notify the user of an error in the network or transaction handling code. */
void error(const QString &title, const QString &message); void error(const QString &title, const QString &message, bool modal);
/** Asks the user whether to pay the transaction fee or to cancel the transaction. /** Asks the user whether to pay the transaction fee or to cancel the transaction.
It is currently not possible to pass a return value to another thread through It is currently not possible to pass a return value to another thread through
BlockingQueuedConnection, so an indirected pointer is used. BlockingQueuedConnection, so an indirected pointer is used.

2
src/qt/clientmodel.h

@ -52,7 +52,7 @@ signals:
void numBlocksChanged(int count); void numBlocksChanged(int count);
//! Asynchronous error notification //! Asynchronous error notification
void error(const QString &title, const QString &message); void error(const QString &title, const QString &message, bool modal);
public slots: public slots:

2
src/qt/walletmodel.cpp

@ -140,7 +140,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
} }
return TransactionCreationFailed; return TransactionCreationFailed;
} }
if(!ThreadSafeAskFee(nFeeRequired, tr("Sending...").toStdString(), NULL)) if(!ThreadSafeAskFee(nFeeRequired, tr("Sending...").toStdString()))
{ {
return Aborted; return Aborted;
} }

2
src/qt/walletmodel.h

@ -135,7 +135,7 @@ signals:
void requireUnlock(); void requireUnlock();
// Asynchronous error notification // Asynchronous error notification
void error(const QString &title, const QString &message); void error(const QString &title, const QString &message, bool modal);
public slots: public slots:
void update(); void update();

9
src/qtui.h

@ -7,7 +7,6 @@
#include <string> #include <string>
#include "wallet.h" #include "wallet.h"
typedef void wxWindow;
#define wxYES 0x00000002 #define wxYES 0x00000002
#define wxOK 0x00000004 #define wxOK 0x00000004
#define wxNO 0x00000008 #define wxNO 0x00000008
@ -34,11 +33,11 @@ typedef void wxWindow;
#define wxHELP 0x00008000 #define wxHELP 0x00008000
#define wxMORE 0x00010000 #define wxMORE 0x00010000
#define wxSETUP 0x00020000 #define wxSETUP 0x00020000
// Force blocking, modal message box dialog (not just notification)
#define wxMODAL 0x00040000
extern int MyMessageBox(const std::string& message, const std::string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1); extern int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK);
#define wxMessageBox MyMessageBox extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption);
extern int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1);
extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent);
extern void ThreadSafeHandleURL(const std::string& strURL); extern void ThreadSafeHandleURL(const std::string& strURL);
extern void MainFrameRepaint(); extern void MainFrameRepaint();
extern void AddressBookRepaint(); extern void AddressBookRepaint();

2
src/util.cpp

@ -1041,7 +1041,7 @@ void AddTimeData(const CNetAddr& ip, int64 nTime)
string strMessage = _("Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly."); string strMessage = _("Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly.");
strMiscWarning = strMessage; strMiscWarning = strMessage;
printf("*** %s\n", strMessage.c_str()); printf("*** %s\n", strMessage.c_str());
boost::thread(boost::bind(ThreadSafeMessageBox, strMessage+" ", string("Bitcoin"), wxOK | wxICON_EXCLAMATION, (wxWindow*)NULL, -1, -1)); ThreadSafeMessageBox(strMessage+" ", string("Bitcoin"), wxOK | wxICON_EXCLAMATION);
} }
} }
} }

2
src/wallet.cpp

@ -1219,7 +1219,7 @@ string CWallet::SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew,
return strError; return strError;
} }
if (fAskFee && !ThreadSafeAskFee(nFeeRequired, _("Sending..."), NULL)) if (fAskFee && !ThreadSafeAskFee(nFeeRequired, _("Sending...")))
return "ABORTED"; return "ABORTED";
if (!CommitTransaction(wtxNew, reservekey)) if (!CommitTransaction(wtxNew, reservekey))

Loading…
Cancel
Save