text: // Copyright (c) 2011-2014 The Bitcoin developers
  // Copyright (c) 2017-2018 The PIVX developers
  // Distributed under the MIT/X11 software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef BITCOIN_QT_BITCOINGUI_H
  #define BITCOIN_QT_BITCOINGUI_H
  
  #if defined(HAVE_CONFIG_H)
  #include "config/bds-config.h"
  #endif
  
  #include "amount.h"
  
  #include <QLabel>
  #include <QMainWindow>
  #include <QMap>
  #include <QMenu>
  #include <QPoint>
  #include <QPushButton>
  #include <QSystemTrayIcon>
  
  class ClientModel;
  class NetworkStyle;
  class Notificator;
  class OptionsModel;
  class BlockExplorer;
  class RPCConsole;
  class SendCoinsRecipient;
  class UnitDisplayStatusBarControl;
  class WalletFrame;
  class WalletModel;
  class MasternodeList;
  
  class CWallet;
  
  QT_BEGIN_NAMESPACE
  class QAction;
  class QProgressBar;
  class QProgressDialog;
  QT_END_NAMESPACE
  
  /**
    Bitcoin GUI main class. This class represents the main window of the Bitcoin UI. It communicates with both the client and
    wallet models to give the user an up-to-date view of the current core state.
  */
  class BitcoinGUI : public QMainWindow
  {
      Q_OBJECT
  
  public:
      static const QString DEFAULT_WALLET;
  
      explicit BitcoinGUI(const NetworkStyle* networkStyle, QWidget* parent = 0);
      ~BitcoinGUI();
  
      /** Set the client model.
          The client model represents the part of the core that communicates with the P2P network, and is wallet-agnostic.
      */
      void setClientModel(ClientModel* clientModel);
  
  #ifdef ENABLE_WALLET
      /** Set the wallet model.
          The wallet model represents a bitcoin wallet, and offers access to the list of transactions, address book and sending
          functionality.
      */
      bool addWallet(const QString& name, WalletModel* walletModel);
      bool setCurrentWallet(const QString& name);
      void removeAllWallets();
  #endif // ENABLE_WALLET
      bool enableWallet;
      bool fMultiSend = false;
  
  protected:
      void changeEvent(QEvent* e);
      void closeEvent(QCloseEvent* event);
      void dragEnterEvent(QDragEnterEvent* event);
      void dropEvent(QDropEvent* event);
      bool eventFilter(QObject* object, QEvent* event);
  
  private:
      ClientModel* clientModel;
      WalletFrame* walletFrame;
  
      UnitDisplayStatusBarControl* unitDisplayControl;
      QLabel* labelStakingIcon;
      QPushButton* labelAutoMintIcon;
      QPushButton* labelEncryptionIcon;
      QLabel* labelTorIcon;
      QPushButton* labelConnectionsIcon;
      QLabel* labelBlocksIcon;
      QLabel* progressBarLabel;
      QProgressBar* progressBar;
      QProgressDialog* progressDialog;
  
      QMenuBar* appMenuBar;
      QAction* overviewAction;
      QAction* historyAction;
      QAction* masternodeAction;
      QAction* quitAction;
      QAction* sendCoinsAction;
      QAction* usedSendingAddressesAction;
      QAction* usedReceivingAddressesAction;
      QAction* signMessageAction;
      QAction* verifyMessageAction;
      QAction* bip38ToolAction;
      QAction* multisigCreateAction;
      QAction* multisigSpendAction;
      QAction* multisigSignAction;
      QAction* aboutAction;
      QAction* receiveCoinsAction;
      QAction* governanceAction;
      QAction* privacyAction;
      QAction* optionsAction;
      QAction* toggleHideAction;
      QAction* encryptWalletAction;
      QAction* backupWalletAction;
      QAction* changePassphraseAction;
      QAction* unlockWalletAction;
      QAction* lockWalletAction;
      QAction* aboutQtAction;
      QAction* openInfoAction;
      QAction* openRPCConsoleAction;
      QAction* openNetworkAction;
      QAction* openPeersAction;
      QAction* openRepairAction;
      QAction* openConfEditorAction;
      QAction* openMNConfEditorAction;
      QAction* showBackupsAction;
      QAction* openAction;
      QAction* openBlockExplorerAction;
      QAction* showHelpMessageAction;
      QAction* multiSendAction;
  
      QSystemTrayIcon* trayIcon;
      QMenu* trayIconMenu;
      Notificator* notificator;
      RPCConsole* rpcConsole;
      BlockExplorer* explorerWindow;
  
      /** Keep track of previous number of blocks, to detect progress */
      int prevBlocks;
      int spinnerFrame;
  
      /** Create the main UI actions. */
      void createActions(const NetworkStyle* networkStyle);
      /** Create the menu bar and sub-menus. */
      void createMenuBar();
      /** Create the toolbars */
      void createToolBars();
      /** Create system tray icon and notification */
      void createTrayIcon(const NetworkStyle* networkStyle);
      /** Create system tray menu (or setup the dock menu) */
      void createTrayIconMenu();
  
      /** Enable or disable all wallet-related actions */
      void setWalletActionsEnabled(bool enabled);
  
      /** Connect core signals to GUI client */
      void subscribeToCoreSignals();
      /** Disconnect core signals from GUI client */
      void unsubscribeFromCoreSignals();
  
  signals:
      /** Signal raised when a URI was entered or dragged to the GUI */
      void receivedURI(const QString& uri);
      /** Restart handling */
      void requestedRestart(QStringList args);
  
  public slots:
      /** Set number of connections shown in the UI */
      void setNumConnections(int count);
      /** Set number of blocks shown in the UI */
      void setNumBlocks(int count);
      /** Get restart command-line parameters and request restart */
      void handleRestart(QStringList args);
  
      /** Notify the user of an event from the core network or transaction handling code.
         @param[in] title     the message box / notification title
         @param[in] message   the displayed text
         @param[in] style     modality and style definitions (icon and used buttons - buttons only for message boxes)
                              @see CClientUIInterface::MessageBoxFlags
         @param[in] ret       pointer to a bool that will be modified to whether Ok was clicked (modal only)
      */
      void message(const QString& title, const QString& message, unsigned int style, bool* ret = NULL);
  
  #ifdef ENABLE_WALLET
      void setStakingStatus();
      //void setAutoMintStatus();
  
      /** Set the encryption status as shown in the UI.
         @param[in] status            current encryption status
         @see WalletModel::EncryptionStatus
      */
      void setEncryptionStatus(int status);
  
      bool handlePaymentRequest(const SendCoinsRecipient& recipient);
  
      /** Show incoming transaction notification for new transactions. */
      void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address);
  #endif // ENABLE_WALLET
  
  private:
      /** Set the Tor-enabled icon as shown in the UI. */
      void updateTorIcon();
  
  private slots:
  #ifdef ENABLE_WALLET
      /** Switch to overview (home) page */
      void gotoOverviewPage();
      /** Switch to history (transactions) page */
      void gotoHistoryPage();
      /** Switch to Governance Page */
      //void gotoGovernancePage();
      /** Switch to Explorer Page */
      void gotoBlockExplorerPage();
      /** Switch to masternode page */
      void gotoMasternodePage();
      /** Switch to privacy page */
      void gotoReceiveCoinsPage();
      /** Switch to receive coins page */
      //void gotoPrivacyPage();
      /** Switch to send coins page */
      void gotoSendCoinsPage(QString addr = "");
  
      /** Show Sign/Verify Message dialog and switch to sign message tab */
      void gotoSignMessageTab(QString addr = "");
      /** Show Sign/Verify Message dialog and switch to verify message tab */
      void gotoVerifyMessageTab(QString addr = "");
      /** Show MultiSend Dialog */
      void gotoMultiSendDialog();
      /** Show MultiSig Dialog */
      void gotoMultisigCreate();
      void gotoMultisigSpend();
      void gotoMultisigSign();
      /** Show BIP 38 tool - default to Encryption tab */
      void gotoBip38Tool();
  
      /** Show open dialog */
      void openClicked();
  
  #endif // ENABLE_WALLET
      /** Show configuration dialog */
      void optionsClicked();
      /** Show about dialog */
      void aboutClicked();
      /** Show help message dialog */
      void showHelpMessageClicked();
  #ifndef Q_OS_MAC
      /** Handle tray icon clicked */
      void trayIconActivated(QSystemTrayIcon::ActivationReason reason);
  #endif
  
      /** Show window if hidden, unminimize when minimized, rise when obscured or show if hidden and fToggleHidden is true */
      void showNormalIfMinimized(bool fToggleHidden = false);
      /** Simply calls showNormalIfMinimized(true) for use in SLOT() macro */
      void toggleHidden();
  
      /** called by a timer to check if fRequestShutdown has been set **/
      void detectShutdown();
  
      /** Show progress dialog e.g. for verifychain */
      void showProgress(const QString& title, int nProgress);
  };
  
  class UnitDisplayStatusBarControl : public QLabel
  {
      Q_OBJECT
  
  public:
      explicit UnitDisplayStatusBarControl();
      /** Lets the control know about the Options Model (and its signals) */
      void setOptionsModel(OptionsModel* optionsModel);
  
  protected:
      /** So that it responds to left-button clicks */
      void mousePressEvent(QMouseEvent* event);
  
  private:
      OptionsModel* optionsModel;
      QMenu* menu;
  
      /** Shows context menu with Display Unit options by the mouse coordinates */
      void onDisplayUnitsClicked(const QPoint& point);
      /** Creates context menu, its actions, and wires up all the relevant signals for mouse events. */
      void createContextMenu();
  
  private slots:
      /** When Display Units are changed on OptionsModel it will refresh the display text of the control on the status bar */
      void updateDisplayUnit(int newUnits);
      /** Tells underlying optionsModel to update its current display unit. */
      void onMenuSelection(QAction* action);
  };
  
  #endif // BITCOIN_QT_BITCOINGUI_H
  