38#include <QApplication>
40#include <QWebEnginePage>
42#include <QDesktopServices>
45extern void qt_mac_set_dock_menu(QMenu* menu);
67 menuBar->addMenu(m_menuFile);
68 menuBar->addMenu(m_menuEdit);
69 menuBar->addMenu(m_menuView);
70 menuBar->addMenu(m_menuHistory);
71 menuBar->addMenu(m_menuBookmarks);
72 menuBar->addMenu(m_menuTools);
73 menuBar->addMenu(m_menuHelp);
78 superMenu->addAction(m_actions[
QSL(
"File/NewTab")]);
79 superMenu->addAction(m_actions[
QSL(
"File/NewWindow")]);
80 superMenu->addAction(m_actions[
QSL(
"File/NewPrivateWindow")]);
81 superMenu->addAction(m_actions[
QSL(
"File/OpenFile")]);
82 if (
mApp->sessionManager()) {
83 superMenu->addSeparator();
84 auto* sessionsSubmenu =
new QMenu(tr(
"Sessions"));
85 connect(sessionsSubmenu, SIGNAL(aboutToShow()),
mApp->sessionManager(), SLOT(aboutToShowSessionsMenu()));
86 superMenu->addMenu(sessionsSubmenu);
87 superMenu->addAction(m_actions[
QSL(
"File/SessionManager")]);
89 superMenu->addSeparator();
90 superMenu->addAction(m_actions[
QSL(
"File/SendLink")]);
91 superMenu->addAction(m_actions[
QSL(
"File/Print")]);
92 superMenu->addSeparator();
93 superMenu->addAction(m_actions[
QSL(
"Edit/SelectAll")]);
94 superMenu->addAction(m_actions[
QSL(
"Edit/Find")]);
95 superMenu->addSeparator();
96 superMenu->addAction(m_menuHistory->actions().at(3));
97 superMenu->addAction(m_menuBookmarks->actions().at(2));
98 superMenu->addSeparator();
99 superMenu->addMenu(m_menuView);
100 superMenu->addMenu(m_menuHistory);
101 superMenu->addMenu(m_menuBookmarks);
102 superMenu->addMenu(m_menuTools);
103 superMenu->addMenu(m_menuHelp);
104 superMenu->addSeparator();
105 superMenu->addAction(m_actions[
QSL(
"Standard/Preferences")]);
106 superMenu->addAction(m_actions[
QSL(
"Standard/About")]);
107 superMenu->addSeparator();
108 superMenu->addAction(m_actions[
QSL(
"Standard/Quit")]);
110 connect(superMenu, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowSuperMenu);
115 Q_ASSERT(m_actions.value(name));
117 return m_actions.value(name);
120void MainMenu::showAboutDialog()
126void MainMenu::showPreferences()
131 m_preferences->show();
132 m_preferences->raise();
133 m_preferences->activateWindow();
136void MainMenu::quitApplication()
138 mApp->quitApplication();
141void MainMenu::newTab()
146void MainMenu::newWindow()
151void MainMenu::newPrivateWindow()
153 mApp->startPrivateBrowsing();
156void MainMenu::openLocation()
158 callSlot(
"openLocation");
161void MainMenu::openFile()
163 callSlot(
"openFile");
166void MainMenu::closeWindow()
168 callSlot(
"closeWindow");
171void MainMenu::savePageAs()
174 QMetaObject::invokeMethod(m_window->weView(),
"savePageAs");
178void MainMenu::sendLink()
180 const QUrl mailUrl = QUrl::fromEncoded(QByteArray(
182 QUrl::toPercentEncoding(
183 QString::fromUtf8(m_window->weView()->url().toEncoded())) +
184 "&subject=" + QUrl::toPercentEncoding(m_window->weView()->title())));
185 QDesktopServices::openUrl(mailUrl);
188void MainMenu::printPage()
190 callSlot(
"printPage");
193void MainMenu::editUndo()
196 m_window->weView()->editUndo();
200void MainMenu::editRedo()
203 m_window->weView()->editRedo();
207void MainMenu::editCut()
210 m_window->weView()->editCut();
214void MainMenu::editCopy()
217 m_window->weView()->editCopy();
221void MainMenu::editPaste()
224 m_window->weView()->editPaste();
228void MainMenu::editSelectAll()
231 m_window->weView()->editSelectAll();
235void MainMenu::editFind()
237 callSlot(
"searchOnPage");
240void MainMenu::showStatusBar()
243 m_window->toggleShowStatusBar();
250 m_window->weView()->stop();
254void MainMenu::reload()
257 m_window->weView()->reload();
261void MainMenu::zoomIn()
264 m_window->weView()->zoomIn();
268void MainMenu::zoomOut()
271 m_window->weView()->zoomOut();
275void MainMenu::zoomReset()
278 m_window->weView()->zoomReset();
282void MainMenu::showPageSource()
284 callSlot(
"showSource");
287void MainMenu::showFullScreen()
290 m_window->toggleFullScreen();
294void MainMenu::webSearch()
296 callSlot(
"webSearch");
299void MainMenu::showSiteInfo()
302 auto* info =
new SiteInfo(m_window->weView());
307void MainMenu::showDownloadManager()
314void MainMenu::showCookieManager()
321void MainMenu::toggleWebInspector()
323 callSlot(
"toggleWebInspector");
326void MainMenu::showClearRecentHistoryDialog()
332void MainMenu::aboutQt()
334 QApplication::aboutQt();
337void MainMenu::showInfoAboutApp()
344void MainMenu::showConfigInfo()
351void MainMenu::reportIssue()
358void MainMenu::restoreClosedTab()
361 m_window->tabWidget()->restoreClosedTab();
365void MainMenu::aboutToShowFileMenu()
368 m_actions[
QSL(
"File/CloseWindow")]->setEnabled(
mApp->windowCount() > 1);
372void MainMenu::aboutToShowViewMenu()
378 m_actions[
QSL(
"View/ShowStatusBar")]->setChecked(m_window->statusBar()->isVisible());
379 m_actions[
QSL(
"View/FullScreen")]->setChecked(m_window->isFullScreen());
382void MainMenu::aboutToShowEditMenu()
388 WebView* view = m_window->weView();
390 m_actions[
QSL(
"Edit/Undo")]->setEnabled(view->pageAction(QWebEnginePage::Undo)->isEnabled());
391 m_actions[
QSL(
"Edit/Redo")]->setEnabled(view->pageAction(QWebEnginePage::Redo)->isEnabled());
392 m_actions[
QSL(
"Edit/Cut")]->setEnabled(view->pageAction(QWebEnginePage::Cut)->isEnabled());
393 m_actions[
QSL(
"Edit/Copy")]->setEnabled(view->pageAction(QWebEnginePage::Copy)->isEnabled());
394 m_actions[
QSL(
"Edit/Paste")]->setEnabled(view->pageAction(QWebEnginePage::Paste)->isEnabled());
395 m_actions[
QSL(
"Edit/SelectAll")]->setEnabled(view->pageAction(QWebEnginePage::SelectAll)->isEnabled());
398void MainMenu::aboutToShowToolsMenu()
405 m_submenuExtensions->clear();
406 mApp->plugins()->populateExtensionsMenu(m_submenuExtensions);
408 m_submenuExtensions->menuAction()->setVisible(!m_submenuExtensions->actions().isEmpty());
411void MainMenu::aboutToShowSuperMenu()
417 WebView* view = m_window->weView();
419 m_actions[
QSL(
"Edit/Find")]->setEnabled(
true);
420 m_actions[
QSL(
"Edit/SelectAll")]->setEnabled(view->pageAction(QWebEnginePage::SelectAll)->isEnabled());
423void MainMenu::aboutToShowToolbarsMenu()
425 auto* menu = qobject_cast<QMenu*>(sender());
430 m_window->createToolbarsMenu(menu);
434void MainMenu::aboutToShowSidebarsMenu()
436 auto* menu = qobject_cast<QMenu*>(sender());
440 m_window->createSidebarsMenu(menu);
444void MainMenu::aboutToShowEncodingMenu()
446 auto* menu = qobject_cast<QMenu*>(sender());
451 m_window->createEncodingMenu(menu);
457#define ADD_ACTION(name, menu, icon, trName, slot, shortcut) \
458 action = menu->addAction(icon, trName); \
459 action->setShortcut(QKeySequence(QSL(shortcut))); \
460 connect(action, SIGNAL(triggered()), this, slot); \
461 m_actions[QSL(name)] = action
463#define ADD_CHECKABLE_ACTION(name, menu, icon, trName, slot, shortcut) \
464 action = menu->addAction(icon, trName); \
465 action->setShortcut(QKeySequence(QSL(shortcut))); \
466 action->setCheckable(true); \
467 connect(action, SIGNAL(triggered(bool)), this, slot); \
468 m_actions[QSL(name)] = action
471 auto*
action =
new QAction(QIcon::fromTheme(
QSL(
"help-about")), tr(
"&About Falkon"),
this);
472 action->setMenuRole(QAction::AboutRole);
473 connect(
action, &QAction::triggered,
this, &MainMenu::showAboutDialog);
474 m_actions[
QSL(
"Standard/About")] =
action;
477 action->setMenuRole(QAction::PreferencesRole);
478 action->setShortcut(QKeySequence(QKeySequence::Preferences));
479 connect(
action, &QAction::triggered,
this, &MainMenu::showPreferences);
480 m_actions[
QSL(
"Standard/Preferences")] =
action;
482 action =
new QAction(QIcon::fromTheme(
QSL(
"application-exit")), tr(
"Quit"),
this);
483 action->setMenuRole(QAction::QuitRole);
485 connect(
action, &QAction::triggered,
this, &MainMenu::quitApplication);
486 m_actions[
QSL(
"Standard/Quit")] =
action;
489 m_menuFile =
new QMenu(tr(
"&File"));
490 connect(m_menuFile, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowFileMenu);
495 ADD_ACTION(
"File/OpenLocation", m_menuFile, QIcon::fromTheme(
QSL(
"document-open-remote")), tr(
"Open Location"), SLOT(openLocation()),
"Ctrl+L");
496 ADD_ACTION(
"File/OpenFile", m_menuFile, QIcon::fromTheme(
QSL(
"document-open")), tr(
"Open &File..."), SLOT(openFile()),
"Ctrl+O");
497 ADD_ACTION(
"File/CloseWindow", m_menuFile, QIcon::fromTheme(
QSL(
"window-close")), tr(
"Close Window"), SLOT(closeWindow()),
"Ctrl+Shift+W");
498 m_menuFile->addSeparator();
500 if (
mApp->sessionManager()) {
501 auto* sessionsSubmenu =
new QMenu(tr(
"Sessions"));
502 connect(sessionsSubmenu, SIGNAL(aboutToShow()),
mApp->sessionManager(), SLOT(aboutToShowSessionsMenu()));
503 m_menuFile->addMenu(sessionsSubmenu);
504 action =
new QAction(tr(
"Session Manager"),
this);
506 m_actions[
QSL(
"File/SessionManager")] =
action;
507 m_menuFile->addAction(
action);
508 m_menuFile->addSeparator();
511 ADD_ACTION(
"File/SavePageAs", m_menuFile, QIcon::fromTheme(
QSL(
"document-save")), tr(
"&Save Page As..."), SLOT(savePageAs()),
"Ctrl+S");
512 ADD_ACTION(
"File/SendLink", m_menuFile, QIcon::fromTheme(
QSL(
"mail-message-new")), tr(
"Send Link..."), SLOT(sendLink()),
"");
513 ADD_ACTION(
"File/Print", m_menuFile, QIcon::fromTheme(
QSL(
"document-print")), tr(
"&Print..."), SLOT(printPage()),
"Ctrl+P");
514 m_menuFile->addSeparator();
515 m_menuFile->addAction(m_actions[
QSL(
"Standard/Quit")]);
518 m_menuEdit =
new QMenu(tr(
"&Edit"));
519 connect(m_menuEdit, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowEditMenu);
521 ADD_ACTION(
"Edit/Undo", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-undo")), tr(
"&Undo"), SLOT(editUndo()),
"Ctrl+Z");
522 action->setShortcutContext(Qt::WidgetShortcut);
523 ADD_ACTION(
"Edit/Redo", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-redo")), tr(
"&Redo"), SLOT(editRedo()),
"Ctrl+Shift+Z");
524 action->setShortcutContext(Qt::WidgetShortcut);
525 m_menuEdit->addSeparator();
526 ADD_ACTION(
"Edit/Cut", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-cut")), tr(
"&Cut"), SLOT(editCut()),
"Ctrl+X");
527 action->setShortcutContext(Qt::WidgetShortcut);
528 ADD_ACTION(
"Edit/Copy", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-copy")), tr(
"C&opy"), SLOT(editCopy()),
"Ctrl+C");
529 action->setShortcutContext(Qt::WidgetShortcut);
530 ADD_ACTION(
"Edit/Paste", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-paste")), tr(
"&Paste"), SLOT(editPaste()),
"Ctrl+V");
531 action->setShortcutContext(Qt::WidgetShortcut);
532 m_menuEdit->addSeparator();
533 ADD_ACTION(
"Edit/SelectAll", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-select-all")), tr(
"Select &All"), SLOT(editSelectAll()),
"Ctrl+A");
534 action->setShortcutContext(Qt::WidgetShortcut);
535 ADD_ACTION(
"Edit/Find", m_menuEdit, QIcon::fromTheme(
QSL(
"edit-find")), tr(
"&Find"), SLOT(editFind()),
"Ctrl+F");
536 action->setShortcutContext(Qt::WidgetShortcut);
537 m_menuEdit->addSeparator();
540 m_menuView =
new QMenu(tr(
"&View"));
541 connect(m_menuView, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowViewMenu);
543 auto* toolbarsMenu =
new QMenu(tr(
"Toolbars"));
544 connect(toolbarsMenu, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowToolbarsMenu);
545 auto* sidebarMenu =
new QMenu(tr(
"Sidebar"));
546 connect(sidebarMenu, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowSidebarsMenu);
547 auto* encodingMenu =
new QMenu(tr(
"Character &Encoding"));
548 connect(encodingMenu, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowEncodingMenu);
551 m_window->createToolbarsMenu(toolbarsMenu);
552 m_window->createSidebarsMenu(sidebarMenu);
554 m_menuView->addMenu(toolbarsMenu);
555 m_menuView->addMenu(sidebarMenu);
556 ADD_CHECKABLE_ACTION(
"View/ShowStatusBar", m_menuView, QIcon(), tr(
"Sta&tus Bar"), SLOT(showStatusBar()),
"");
557 m_menuView->addSeparator();
558 ADD_ACTION(
"View/Stop", m_menuView, QIcon::fromTheme(
QSL(
"process-stop")), tr(
"&Stop"), SLOT(stop()),
"Esc");
559 ADD_ACTION(
"View/Reload", m_menuView, QIcon::fromTheme(
QSL(
"view-refresh")), tr(
"&Reload"), SLOT(reload()),
"F5");
560 m_menuView->addSeparator();
561 ADD_ACTION(
"View/ZoomIn", m_menuView, QIcon::fromTheme(
QSL(
"zoom-in")), tr(
"Zoom &In"), SLOT(zoomIn()),
"Ctrl++");
562 ADD_ACTION(
"View/ZoomOut", m_menuView, QIcon::fromTheme(
QSL(
"zoom-out")), tr(
"Zoom &Out"), SLOT(zoomOut()),
"Ctrl+-");
563 ADD_ACTION(
"View/ZoomReset", m_menuView, QIcon::fromTheme(
QSL(
"zoom-original")), tr(
"Reset"), SLOT(zoomReset()),
"Ctrl+0");
564 m_menuView->addSeparator();
565 m_menuView->addMenu(encodingMenu);
566 m_menuView->addSeparator();
567 ADD_ACTION(
"View/PageSource", m_menuView, QIcon::fromTheme(
QSL(
"text-html")), tr(
"&Page Source"), SLOT(showPageSource()),
"Ctrl+U");
568 action->setShortcutContext(Qt::WidgetShortcut);
569 ADD_CHECKABLE_ACTION(
"View/FullScreen", m_menuView, QIcon::fromTheme(
QSL(
"view-fullscreen")), tr(
"&FullScreen"), SLOT(showFullScreen()),
"F11");
572 m_menuTools =
new QMenu(tr(
"&Tools"));
573 connect(m_menuTools, &QMenu::aboutToShow,
this, &MainMenu::aboutToShowToolsMenu);
575 ADD_ACTION(
"Tools/WebSearch", m_menuTools, QIcon::fromTheme(
QSL(
"edit-find")), tr(
"&Web Search"), SLOT(webSearch()),
"Ctrl+K");
576 ADD_ACTION(
"Tools/SiteInfo", m_menuTools, QIcon::fromTheme(
QSL(
"dialog-information")), tr(
"Site &Info"), SLOT(showSiteInfo()),
"Ctrl+I");
577 action->setShortcutContext(Qt::WidgetShortcut);
578 m_menuTools->addSeparator();
579 ADD_ACTION(
"Tools/DownloadManager", m_menuTools, QIcon::fromTheme(
QSL(
"download")), tr(
"&Download Manager"), SLOT(showDownloadManager()),
"Ctrl+Y");
580 ADD_ACTION(
"Tools/CookiesManager", m_menuTools, QIcon(), tr(
"&Cookies Manager"), SLOT(showCookieManager()),
"");
581 ADD_ACTION(
"Tools/WebInspector", m_menuTools, QIcon(), tr(
"Web In&spector"), SLOT(toggleWebInspector()),
"Ctrl+Shift+I");
582 ADD_ACTION(
"Tools/ClearRecentHistory", m_menuTools, QIcon::fromTheme(
QSL(
"edit-clear")), tr(
"Clear Recent &History"), SLOT(showClearRecentHistoryDialog()),
"Ctrl+Shift+Del");
585 m_actions.value(
QSL(
"Tools/WebInspector"))->setVisible(
false);
587 m_submenuExtensions =
new QMenu(tr(
"&Extensions"));
588 m_submenuExtensions->menuAction()->setVisible(
false);
589 m_menuTools->addMenu(m_submenuExtensions);
590 m_menuTools->addSeparator();
593 m_menuHelp =
new QMenu(tr(
"&Help"));
596 ADD_ACTION(
"Help/AboutQt", m_menuHelp, QIcon(), tr(
"About &Qt"), SLOT(aboutQt()),
"");
597 m_menuHelp->addAction(m_actions[
QSL(
"Standard/About")]);
598 m_menuHelp->addSeparator();
601 ADD_ACTION(
"Help/InfoAboutApp", m_menuHelp, QIcon::fromTheme(
QSL(
"help-contents")), tr(
"Information about application"), SLOT(showInfoAboutApp()),
"");
602 ADD_ACTION(
"Help/ConfigInfo", m_menuHelp, QIcon(), tr(
"Configuration Information"), SLOT(showConfigInfo()),
"");
603 ADD_ACTION(
"Help/ReportIssue", m_menuHelp, QIcon(), tr(
"Report &Issue"), SLOT(reportIssue()),
"");
605 m_actions[
QSL(
"Help/InfoAboutApp")]->setShortcut(QKeySequence(QKeySequence::HelpContents));
616 action =
new QAction(QIcon::fromTheme(
QSL(
"user-trash")), tr(
"Restore &Closed Tab"),
this);
617 action->setShortcut(QKeySequence(
QSL(
"Ctrl+Shift+T")));
618 connect(
action, &QAction::triggered,
this, &MainMenu::restoreClosedTab);
619 m_actions[
QSL(
"Other/RestoreClosedTab")] =
action;
622 m_actions[
QSL(
"View/FullScreen")]->setShortcut(QKeySequence(
QSL(
"Ctrl+Meta+F")));
625 m_menuFile->addAction(m_actions[
QSL(
"Standard/About")]);
626 m_menuFile->addAction(m_actions[
QSL(
"Standard/Preferences")]);
629 m_actions[
QSL(
"Help/ConfigInfo")]->setMenuRole(QAction::NoRole);
632 QMenu* dockMenu =
new QMenu(0);
633 dockMenu->addAction(m_actions[
QSL(
"File/NewTab")]);
634 dockMenu->addAction(m_actions[
QSL(
"File/NewWindow")]);
635 dockMenu->addAction(m_actions[
QSL(
"File/NewPrivateWindow")]);
636 qt_mac_set_dock_menu(dockMenu);
639#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
640 m_menuEdit->addAction(m_actions[
QSL(
"Standard/Preferences")]);
641#elif !defined(Q_OS_MACOS)
642 m_menuTools->addAction(m_actions[
QSL(
"Standard/Preferences")]);
645 addActionsToWindow();
648void MainMenu::addActionsToWindow()
652 QList<QAction*> actions;
653 actions << m_menuFile->actions();
654 actions << m_menuEdit->actions();
655 actions << m_menuView->actions();
656 actions << m_menuTools->actions();
657 actions << m_menuHelp->actions();
658 actions << m_menuHistory->actions();
659 actions << m_menuBookmarks->actions();
660 actions << m_actions[
QSL(
"Other/RestoreClosedTab")];
662 for (
int i = 0;
i < actions.size(); ++
i) {
663 QAction*
action = actions.at(
i);
665 actions +=
action->menu()->actions();
667 m_window->addAction(
action);
671void MainMenu::callSlot(
const char* slot)
674 QMetaObject::invokeMethod(m_window, slot);
static QIcon settingsIcon()
static QIcon privateBrowsingIcon()
static QIcon newWindowIcon()
static QIcon newTabIcon()
MainMenu(BrowserWindow *window, QWidget *parent=nullptr)
QAction * action(const QString &name) const
void initSuperMenu(QMenu *superMenu) const
void setWindow(BrowserWindow *window)
void initMenuBar(QMenuBar *menuBar) const
void openSessionManagerDialog()
static bool canShowSiteInfo(const QUrl &url)
#define ADD_ACTION(name, menu, icon, trName, slot, shortcut)
#define ADD_CHECKABLE_ACTION(name, menu, icon, trName, slot, shortcut)