From 56a7bfa7fe23b25d4e7f3fc620ec307a385fe055 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 12 Aug 2015 11:53:31 +0200 Subject: [PATCH] Fixes and better reactivity for the Account Naming infrastructure. --- alethzero/MainFace.cpp | 12 ++++++++++++ alethzero/MainFace.h | 17 +++++++++++++++-- alethzero/MainWin.cpp | 19 ++++++++++++++++--- alethzero/MainWin.h | 3 ++- alethzero/OtherAccounts.cpp | 3 ++- alethzero/OurAccounts.cpp | 1 + alethzero/Transact.cpp | 6 +++--- libp2p/Capability.cpp | 2 +- 8 files changed, 52 insertions(+), 11 deletions(-) diff --git a/alethzero/MainFace.cpp b/alethzero/MainFace.cpp index 4b2236e76..5c9651f73 100644 --- a/alethzero/MainFace.cpp +++ b/alethzero/MainFace.cpp @@ -25,6 +25,18 @@ using namespace std; using namespace dev; using namespace az; +void AccountNamer::noteKnownChanged() +{ + if (m_main) + m_main->noteKnownAddressesChanged(this); +} + +void AccountNamer::noteNamesChanged() +{ + if (m_main) + m_main->noteAddressNamesChanged(this); +} + void MainFace::notePlugin(std::function const& _new) { if (!s_linkedPlugins) diff --git a/alethzero/MainFace.h b/alethzero/MainFace.h index 21dbd80b0..525cc312d 100644 --- a/alethzero/MainFace.h +++ b/alethzero/MainFace.h @@ -47,15 +47,26 @@ namespace az static bool s_notePlugin = [](){ MainFace::notePlugin([](MainFace* m){ return new ClassName(m); }); return true; }() class Plugin; +class MainFace; +class Main; using WatchHandler = std::function; class AccountNamer { + friend class Main; + public: virtual std::string toName(Address const&) const { return std::string(); } virtual Address toAddress(std::string const&) const { return Address(); } virtual Addresses knownAddresses() const { return Addresses(); } + +protected: + void noteKnownChanged(); + void noteNamesChanged(); + +private: + MainFace* m_main = nullptr; }; class MainFace: public QMainWindow, public Context @@ -86,7 +97,8 @@ public: // Account naming API virtual void install(AccountNamer* _adopt) = 0; virtual void uninstall(AccountNamer* _kill) = 0; - virtual void noteAddressesChanged() = 0; + virtual void noteKnownAddressesChanged(AccountNamer*) = 0; + virtual void noteAddressNamesChanged(AccountNamer*) = 0; virtual Address toAddress(std::string const&) const = 0; virtual std::string toName(Address const&) const = 0; virtual Addresses allKnownAddresses() const = 0; @@ -100,7 +112,8 @@ protected: static std::vector>* s_linkedPlugins; signals: - void allKnownAddressesChanged(); + void knownAddressesChanged(); + void addressNamesChanged(); void keyManagerChanged(); private: diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 6dfbf12a7..8bedee064 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -309,6 +309,7 @@ string Main::fromRaw(h256 const& _n, unsigned* _inc) void Main::install(AccountNamer* _adopt) { m_namers.insert(_adopt); + _adopt->m_main = this; refreshAll(); } @@ -319,9 +320,15 @@ void Main::uninstall(AccountNamer* _kill) refreshAll(); } -void Main::noteAddressesChanged() +void Main::noteKnownAddressesChanged(AccountNamer*) { - emit allKnownAddressesChanged(); + emit knownAddressesChanged(); + refreshAll(); +} + +void Main::noteAddressNamesChanged(AccountNamer*) +{ + emit addressNamesChanged(); refreshAll(); } @@ -1233,7 +1240,13 @@ void Main::refreshBalances() for (auto const& address: m_keyManager.accounts()) { u256 b = ethereum()->balanceAt(address); - QListWidgetItem* li = new QListWidgetItem(QString("<%5> %4 %2: %1 [%3]").arg(formatBalance(b).c_str()).arg(QString::fromStdString(render(address))).arg((unsigned)ethereum()->countAt(address)).arg(QString::fromStdString(m_keyManager.accountName(address))).arg(m_keyManager.haveKey(address) ? "KEY" : "BRAIN"), ui->ourAccounts); + QListWidgetItem* li = new QListWidgetItem( + QString("<%1> %2: %3 [%4]") + .arg(m_keyManager.haveKey(address) ? "KEY" : "BRAIN") + .arg(QString::fromStdString(render(address))) + .arg(formatBalance(b).c_str()) + .arg((unsigned)ethereum()->countAt(address)) + , ui->ourAccounts); li->setData(Qt::UserRole, QByteArray((char const*)address.data(), Address::size)); li->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); li->setCheckState(m_beneficiary == address ? Qt::Checked : Qt::Unchecked); diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index 86b15e78a..b23a33697 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -109,7 +109,8 @@ public: // Account naming API. void install(AccountNamer* _adopt) override; void uninstall(AccountNamer* _kill) override; - void noteAddressesChanged() override; + void noteKnownAddressesChanged(AccountNamer*) override; + void noteAddressNamesChanged(AccountNamer*) override; Address toAddress(std::string const&) const override; std::string toName(Address const&) const override; Addresses allKnownAddresses() const override; diff --git a/alethzero/OtherAccounts.cpp b/alethzero/OtherAccounts.cpp index 1ad7fd109..fc2d518bc 100644 --- a/alethzero/OtherAccounts.cpp +++ b/alethzero/OtherAccounts.cpp @@ -54,7 +54,7 @@ void OtherAccounts::import() m_toAddress[name] = addr; } main()->noteSettingsChanged(); - main()->noteAddressesChanged(); + noteKnownChanged(); } } @@ -71,6 +71,7 @@ void OtherAccounts::readSettings(QSettings const& _s) m_toAddress[l[1].toStdString()] = Address(l[0].toStdString()); } } + noteKnownChanged(); } void OtherAccounts::writeSettings(QSettings& _s) diff --git a/alethzero/OurAccounts.cpp b/alethzero/OurAccounts.cpp index 0e8b8820c..7f868af05 100644 --- a/alethzero/OurAccounts.cpp +++ b/alethzero/OurAccounts.cpp @@ -63,4 +63,5 @@ void OurAccounts::updateNames() m_names.clear(); for (Address const& i: main()->keyManager().accounts()) m_names[main()->keyManager().accountName(i)] = i; + noteKnownChanged(); } diff --git a/alethzero/Transact.cpp b/alethzero/Transact.cpp index 61175496e..7e239bc1c 100644 --- a/alethzero/Transact.cpp +++ b/alethzero/Transact.cpp @@ -139,7 +139,7 @@ void Transact::updateDestination() for (Address const& a: m_main->allKnownAddresses()) { cdebug << "Adding" << a << m_main->toName(a) << " -> " << (m_main->toName(a) + " (" + ICAP(a).encoded() + ")"); - ui->destination->addItem(QString::fromStdString(m_main->toName(a) + " (" + ICAP(a).encoded() + ")"), QVariant(QByteArray((char const*)a.data(), a.size))); + ui->destination->addItem(QString::fromStdString(m_main->toName(a) + " (" + ICAP(a).encoded() + ")"), QString::fromStdString(a.hex())); } } @@ -167,8 +167,8 @@ void Transact::on_destination_currentTextChanged(QString) if (ui->destination->currentText().size() && ui->destination->currentText() != "(Create Contract)") { pair p; - if (!ui->destination->currentData().isNull()) - p.first = Address(bytesConstRef((uint8_t const*)ui->destination->currentData().toByteArray().data_ptr(), 20)); + if (!ui->destination->currentData().isNull() && ui->destination->currentText() == ui->destination->itemText(ui->destination->currentIndex())) + p.first = Address(ui->destination->currentData().toString().toStdString()); else p = m_main->fromString(ui->destination->currentText().toStdString()); diff --git a/libp2p/Capability.cpp b/libp2p/Capability.cpp index 2b8e6be63..21cd09686 100644 --- a/libp2p/Capability.cpp +++ b/libp2p/Capability.cpp @@ -35,7 +35,7 @@ Capability::Capability(std::shared_ptr _s, HostCapabilityFace* _h, unsi void Capability::disable(std::string const& _problem) { - clog(NetNote) << "DISABLE: Disabling capability '" << m_hostCap->name() << "'. Reason:" << _problem; + clog(NetTriviaSummary) << "DISABLE: Disabling capability '" << m_hostCap->name() << "'. Reason:" << _problem; m_enabled = false; }