diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -54,6 +54,7 @@ #include #include #include +#include const std::string BitcoinGUI::DEFAULT_UIPLATFORM = #if defined(Q_OS_MAC) @@ -374,12 +375,12 @@ usedSendingAddressesAction = new QAction(platformStyle->TextColorIcon(":/icons/address-book"), - tr("&Sending addresses..."), this); + tr("&Sending addresses"), this); usedSendingAddressesAction->setStatusTip( tr("Show the list of used sending addresses and labels")); usedReceivingAddressesAction = new QAction(platformStyle->TextColorIcon(":/icons/address-book"), - tr("&Receiving addresses..."), this); + tr("&Receiving addresses"), this); usedReceivingAddressesAction->setStatusTip( tr("Show the list of used receiving addresses and labels")); @@ -525,9 +526,6 @@ file->addAction(signMessageAction); file->addAction(verifyMessageAction); file->addSeparator(); - file->addAction(usedSendingAddressesAction); - file->addAction(usedReceivingAddressesAction); - file->addSeparator(); } file->addAction(quitAction); @@ -539,10 +537,64 @@ } settings->addAction(optionsAction); - QMenu *help = appMenuBar->addMenu(tr("&Help")); + QMenu *window_menu = appMenuBar->addMenu(tr("&Window")); + + QAction *minimize_action = window_menu->addAction( + tr("Minimize"), [] { qApp->focusWindow()->showMinimized(); }, + QKeySequence(Qt::CTRL + Qt::Key_M)); + + connect(qApp, &QApplication::focusWindowChanged, + [minimize_action](QWindow *window) { + minimize_action->setEnabled( + window != nullptr && + (window->flags() & Qt::Dialog) != Qt::Dialog && + window->windowState() != Qt::WindowMinimized); + }); + +#ifdef Q_OS_MAC + QAction *zoom_action = window_menu->addAction(tr("Zoom"), [] { + QWindow *window = qApp->focusWindow(); + if (window->windowState() != Qt::WindowMaximized) { + window->showMaximized(); + } else { + window->showNormal(); + } + }); + + connect(qApp, &QApplication::focusWindowChanged, + [zoom_action](QWindow *window) { + zoom_action->setEnabled(window != nullptr); + }); +#else + QAction *restore_action = window_menu->addAction( + tr("Restore"), [] { qApp->focusWindow()->showNormal(); }); + + connect(qApp, &QApplication::focusWindowChanged, + [restore_action](QWindow *window) { + restore_action->setEnabled(window != nullptr); + }); +#endif + if (walletFrame) { - help->addAction(openRPCConsoleAction); + window_menu->addSeparator(); + window_menu->addAction(tr("Main Window"), + [this] { GUIUtil::bringToFront(this); }); + + window_menu->addSeparator(); + window_menu->addAction(usedSendingAddressesAction); + window_menu->addAction(usedReceivingAddressesAction); } + + window_menu->addSeparator(); + for (RPCConsole::TabTypes tab_type : rpcConsole->tabs()) { + window_menu->addAction(rpcConsole->tabTitle(tab_type), + [this, tab_type] { + rpcConsole->setTabFocus(tab_type); + showDebugWindow(); + }); + } + + QMenu *help = appMenuBar->addMenu(tr("&Help")); help->addAction(showHelpMessageAction); help->addSeparator(); help->addAction(aboutAction); diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -68,6 +68,12 @@ TAB_PEERS = 3 }; + std::vector tabs() const { + return {TAB_INFO, TAB_CONSOLE, TAB_GRAPH, TAB_PEERS}; + } + + QString tabTitle(TabTypes tab_type) const; + protected: virtual bool eventFilter(QObject *obj, QEvent *event) override; void keyPressEvent(QKeyEvent *) override; diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -1449,3 +1449,7 @@ void RPCConsole::setTabFocus(enum TabTypes tabType) { ui->tabWidget->setCurrentIndex(tabType); } + +QString RPCConsole::tabTitle(TabTypes tab_type) const { + return ui->tabWidget->tabText(tab_type); +}