text: // Copyright (c) 2011-2013 The Bitcoin developers
  // Copyright (c) 2016-2018 The VELES developers
  // Distributed under the MIT/X11 software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #include "walletframe.h"
  
  #include "bitcoingui.h"
  #include "walletview.h"
  
  #include <cstdio>
  
  #include <QHBoxLayout>
  #include <QLabel>
  
  WalletFrame::WalletFrame(BitcoinGUI* _gui) : QFrame(_gui),
                                               gui(_gui)
  {
      // Leave HBox hook for adding a list view later
      QHBoxLayout* walletFrameLayout = new QHBoxLayout(this);
      setContentsMargins(0, 0, 0, 0);
      walletStack = new QStackedWidget(this);
      walletFrameLayout->setContentsMargins(0, 0, 0, 0);
      walletFrameLayout->addWidget(walletStack);
  
      QLabel* noWallet = new QLabel(tr("No wallet has been loaded."));
      noWallet->setAlignment(Qt::AlignCenter);
      walletStack->addWidget(noWallet);
  }
  
  WalletFrame::~WalletFrame()
  {
  }
  
  void WalletFrame::setClientModel(ClientModel* clientModel)
  {
      this->clientModel = clientModel;
  }
  
  bool WalletFrame::addWallet(const QString& name, WalletModel* walletModel)
  {
      if (!gui || !clientModel || !walletModel || mapWalletViews.count(name) > 0)
          return false;
  
      WalletView* walletView = new WalletView(this);
      walletView->setBitcoinGUI(gui);
      walletView->setClientModel(clientModel);
      walletView->setWalletModel(walletModel);
      walletView->showOutOfSyncWarning(bOutOfSync);
  
      /* TODO we should goto the currently selected page once dynamically adding wallets is supported */
      walletView->gotoOverviewPage();
      walletStack->addWidget(walletView);
      mapWalletViews[name] = walletView;
  
      // Ensure a walletView is able to show the main window
      connect(walletView, SIGNAL(showNormalIfMinimized()), gui, SLOT(showNormalIfMinimized()));
  
      return true;
  }
  
  bool WalletFrame::setCurrentWallet(const QString& name)
  {
      if (mapWalletViews.count(name) == 0)
          return false;
  
      WalletView* walletView = mapWalletViews.value(name);
      walletStack->setCurrentWidget(walletView);
      walletView->updateEncryptionStatus();
      return true;
  }
  
  bool WalletFrame::removeWallet(const QString& name)
  {
      if (mapWalletViews.count(name) == 0)
          return false;
  
      WalletView* walletView = mapWalletViews.take(name);
      walletStack->removeWidget(walletView);
      return true;
  }
  
  void WalletFrame::removeAllWallets()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          walletStack->removeWidget(i.value());
      mapWalletViews.clear();
  }
  
  bool WalletFrame::handlePaymentRequest(const SendCoinsRecipient& recipient)
  {
      WalletView* walletView = currentWalletView();
      if (!walletView)
          return false;
  
      return walletView->handlePaymentRequest(recipient);
  }
  
  void WalletFrame::showOutOfSyncWarning(bool fShow)
  {
      bOutOfSync = fShow;
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->showOutOfSyncWarning(fShow);
  }
  
  void WalletFrame::gotoOverviewPage()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoOverviewPage();
  }
  
  void WalletFrame::gotoHistoryPage()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoHistoryPage();
  }
  
  void WalletFrame::gotoMasternodePage() // Masternode list
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoMasternodePage();
  }
  
  void WalletFrame::gotoBlockExplorerPage()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoBlockExplorerPage();
  }
  
  void WalletFrame::gotoReceiveCoinsPage()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoReceiveCoinsPage();
  }
  
  void WalletFrame::gotoPrivacyPage()
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoPrivacyPage();
  }
  
  void WalletFrame::gotoSendCoinsPage(QString addr)
  {
      QMap<QString, WalletView*>::const_iterator i;
      for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
          i.value()->gotoSendCoinsPage(addr);
  }
  
  void WalletFrame::gotoSignMessageTab(QString addr)
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->gotoSignMessageTab(addr);
  }
  
  void WalletFrame::gotoVerifyMessageTab(QString addr)
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->gotoVerifyMessageTab(addr);
  }
  
  void WalletFrame::gotoBip38Tool()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->gotoBip38Tool();
  }
  
  void WalletFrame::gotoMultiSendDialog()
  {
      WalletView* walletView = currentWalletView();
  
      if (walletView)
          walletView->gotoMultiSendDialog();
  }
  
  void WalletFrame::gotoMultisigDialog(int index)
  {
      WalletView* walletView = currentWalletView();
      if(walletView){
          walletView->gotoMultisigDialog(index);
      }
  }
  
  void WalletFrame::encryptWallet(bool status)
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->encryptWallet(status);
  }
  
  void WalletFrame::backupWallet()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->backupWallet();
  }
  
  void WalletFrame::changePassphrase()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->changePassphrase();
  }
  
  void WalletFrame::unlockWallet(bool setContext)
  {
      if (setContext) {
          unlockWallet(AskPassphraseDialog::Context::Unlock_Full);
      }
      else {
          unlockWallet(AskPassphraseDialog::Context::Unlock_Menu);
      }
  }
  
  void WalletFrame::unlockWallet(AskPassphraseDialog::Context context)
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->unlockWallet(context);
  }
  
  void WalletFrame::lockWallet()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->lockWallet();
  }
  
  void WalletFrame::toggleLockWallet()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->toggleLockWallet();
  }
  
  void WalletFrame::usedSendingAddresses()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->usedSendingAddresses();
  }
  
  void WalletFrame::usedReceivingAddresses()
  {
      WalletView* walletView = currentWalletView();
      if (walletView)
          walletView->usedReceivingAddresses();
  }
  
  WalletView* WalletFrame::currentWalletView()
  {
      return qobject_cast<WalletView*>(walletStack->currentWidget());
  }
  