diff --git a/src/qt/forms/mainwindow.ui b/src/qt/forms/mainwindow.ui index d794a15..17577f6 100644 --- a/src/qt/forms/mainwindow.ui +++ b/src/qt/forms/mainwindow.ui @@ -1383,7 +1383,7 @@ QLabel { color: #f26522; } - + 0 @@ -1406,7 +1406,44 @@ QLabel { - 70 + 10 + 20 + + + + + + + + + 8 + + + + IBeamCursor + + + This wallet's Tor .onion address + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 20 diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 10458b6..e38e950 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -1506,6 +1506,27 @@ QCheckBox::indicator:checked { + + + + Whether to show this wallet's .onion address in the status bar. + + + QCheckBox::indicator { + border:1px solid #f26522; + background-color: #000; + } + +QCheckBox::indicator:checked { + image:url(:/icons/checkbox); + padding: 1px; + } + + + Show .onion address in status &bar + + + diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui index 0871af7..c200368 100644 --- a/src/qt/forms/overviewpage.ui +++ b/src/qt/forms/overviewpage.ui @@ -678,43 +678,6 @@ QWidget#line { - - - - - 10 - - - - Wallet Onion: - - - - - - - - 75 - true - - - - IBeamCursor - - - This wallet's Tor .onion address. - - - Initializing Tor identity... - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 8b512df..2b9c491 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -206,6 +206,7 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->unit, OptionsModel::DisplayUnit); mapper->addMapping(ui->displayAddresses, OptionsModel::DisplayAddresses); mapper->addMapping(ui->coinControlFeatures, OptionsModel::CoinControlFeatures); + mapper->addMapping(ui->showOnionAddress, OptionsModel::ShowOnionAddress); } void OptionsDialog::enableApplyButton() diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index b102abd..0ed59b1 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -51,6 +51,7 @@ void OptionsModel::Init() fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool(); fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool(); fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool(); + fShowOnionAddress = settings.value("fShowOnionAddress", true).toBool(); nTransactionFee = settings.value("nTransactionFee").toLongLong(); nReserveBalance = settings.value("nReserveBalance").toLongLong(); language = settings.value("language", "").toString(); @@ -126,6 +127,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return settings.value("language", ""); case CoinControlFeatures: return QVariant(fCoinControlFeatures); + case ShowOnionAddress: + return QVariant(fShowOnionAddress); default: return QVariant(); } @@ -226,6 +229,12 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in emit coinControlFeaturesChanged(fCoinControlFeatures); } break; + case ShowOnionAddress: { + fShowOnionAddress = value.toBool(); + settings.setValue("fShowOnionAddress", fShowOnionAddress); + emit showOnionAddressChanged(fShowOnionAddress); + } + break; default: break; } @@ -269,3 +278,8 @@ bool OptionsModel::getDisplayAddresses() { return bDisplayAddresses; } + +bool OptionsModel::getShowOnionAddress() +{ + return fShowOnionAddress; +} diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 1f89c81..6d8662c 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -32,6 +32,7 @@ public: DetachDatabases, // bool Language, // QString CoinControlFeatures, // bool + ShowOnionAddress, // bool OptionIDRowCount, }; @@ -52,6 +53,7 @@ public: int getDisplayUnit(); bool getDisplayAddresses(); bool getCoinControlFeatures(); + bool getShowOnionAddress(); QString getLanguage() { return language; } private: @@ -60,6 +62,7 @@ private: bool fMinimizeToTray; bool fMinimizeOnClose; bool fCoinControlFeatures; + bool fShowOnionAddress; QString language; signals: @@ -67,6 +70,7 @@ signals: void transactionFeeChanged(qint64); void reserveBalanceChanged(qint64); void coinControlFeaturesChanged(bool); + void showOnionAddressChanged(bool); }; #endif // OPTIONSMODEL_H diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index 9431b38..8d42fa2 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -8,8 +8,6 @@ #include "transactionfilterproxy.h" #include "guiutil.h" #include "guiconstants.h" -#include "tor/tor_embedded.h" -#include "tor/onion_v3.h" #include #include @@ -117,10 +115,6 @@ OverviewPage::OverviewPage(QWidget *parent) : // start with displaying the "out of sync" warnings showOutOfSyncWarning(true); - QTimer *onionRefreshTimer = new QTimer(this); - connect(onionRefreshTimer, SIGNAL(timeout()), this, SLOT(updateOnionAddress())); - onionRefreshTimer->start(5000); - updateOnionAddress(); } void OverviewPage::handleTransactionClicked(const QModelIndex &index) @@ -137,7 +131,6 @@ OverviewPage::~OverviewPage() void OverviewPage::setClientModel(ClientModel *clientModel) { this->clientModel = clientModel; - updateOnionAddress(); } void OverviewPage::setBalance(qint64 balance, qint64 stake, qint64 unconfirmedBalance, qint64 immatureBalance) @@ -229,19 +222,3 @@ void OverviewPage::showOutOfSyncWarning(bool fShow) ui->labelTransactionsStatus->setVisible(fShow); } -void OverviewPage::updateOnionAddress() -{ - std::string onionAddress = CTorV3Manager::GetInstance()->GetWalletOnionAddress(); - if (onionAddress.empty()) { - onionAddress = CTorEmbedded::GetInstance()->GetOnionAddress(); - } - - if (onionAddress.empty()) { - ui->labelOnionAddress->setText(tr("Initializing Tor identity...")); - ui->labelOnionAddress->setToolTip(tr("The wallet's .onion address will appear here once Tor and the wallet identity are ready.")); - return; - } - - ui->labelOnionAddress->setText(QString::fromStdString(onionAddress)); - ui->labelOnionAddress->setToolTip(tr("This wallet's Tor .onion address.")); -} diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h index a6beade..0a6f038 100644 --- a/src/qt/overviewpage.h +++ b/src/qt/overviewpage.h @@ -31,7 +31,6 @@ public: public slots: void setBalance(qint64 balance, qint64 stake, qint64 unconfirmedBalance, qint64 immatureBalance); void setTransactionSyncState(bool syncing); - void updateOnionAddress(); signals: void transactionClicked(const QModelIndex &index); diff --git a/src/qt/trianglesgui.cpp b/src/qt/trianglesgui.cpp index f9405eb..1a63998 100644 --- a/src/qt/trianglesgui.cpp +++ b/src/qt/trianglesgui.cpp @@ -40,6 +40,8 @@ #include "util.h" //#include "message_box_dialog.h" #include "wallet.h" +#include "tor/tor_embedded.h" +#include "tor/onion_v3.h" #ifdef Q_OS_MAC #include "macdockiconhandler.h" @@ -336,6 +338,14 @@ TrianglesGUI::TrianglesGUI(bool fIsTestnet, QWidget *parent): updateStakingIcon(); } + // Onion address in status bar (hidden until populated) + labelOnionAddress = ui->label_onion; + labelOnionAddress->setVisible(false); + QTimer *timerOnion = new QTimer(this); + connect(timerOnion, SIGNAL(timeout()), this, SLOT(updateOnionAddress())); + timerOnion->start(5000); + updateOnionAddress(); + QTimer *timerShutdown = new QTimer(this); connect(timerShutdown, SIGNAL(timeout()), this, SLOT(detectShutdown())); timerShutdown->start(200); @@ -567,9 +577,11 @@ void TrianglesGUI::setClientModel(ClientModel *clientModel) if (rpcConsole) rpcConsole->setClientModel(clientModel); - overviewPage->setClientModel(clientModel); addressBookPage->setOptionsModel(clientModel->getOptionsModel()); receiveCoinsPage->setOptionsModel(clientModel->getOptionsModel()); + + connect(clientModel->getOptionsModel(), SIGNAL(showOnionAddressChanged(bool)), this, SLOT(updateOnionAddress())); + updateOnionAddress(); } } @@ -1716,6 +1728,29 @@ void TrianglesGUI::detectShutdown() QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); } +void TrianglesGUI::updateOnionAddress() +{ + // Check if user has opted out via Options > Display + if (clientModel && clientModel->getOptionsModel() && + !clientModel->getOptionsModel()->getShowOnionAddress()) { + labelOnionAddress->setVisible(false); + return; + } + + std::string onionAddress = CTorV3Manager::GetInstance()->GetWalletOnionAddress(); + if (onionAddress.empty()) + onionAddress = CTorEmbedded::GetInstance()->GetOnionAddress(); + + if (onionAddress.empty()) { + labelOnionAddress->setVisible(false); + return; + } + + labelOnionAddress->setText(QString::fromStdString(onionAddress)); + labelOnionAddress->setToolTip(tr("This wallet's Tor .onion address. Selectable — right-click to copy.")); + labelOnionAddress->setVisible(true); +} + void TrianglesGUI::on_bHelp_clicked() { diff --git a/src/qt/trianglesgui.h b/src/qt/trianglesgui.h index 3e674d7..5d25989 100644 --- a/src/qt/trianglesgui.h +++ b/src/qt/trianglesgui.h @@ -109,6 +109,7 @@ private: QLabel *labelStakingIcon; QLabel *labelConnectionsIcon; QLabel *labelBlocksIcon; + QLabel *labelOnionAddress; QLabel *progressBarLabel; QProgressBar *progressBar; @@ -174,6 +175,7 @@ public slots: void setEncryptionStatus(int status); void setWalletTransactionSyncState(bool syncing); void setWalletTransactionSyncProgress(bool syncing, int pendingNotifications); + void updateOnionAddress(); /** Notify the user of an error in the network or transaction handling code. */ void error(const QString &title, const QString &message, bool modal);