Ladybird/Qt: Introduce a hamburger menu and use by default

There is an option to show the menubar, if desired (similar to KDE
software).
This commit is contained in:
Jamie Mansfield 2024-05-05 16:11:51 +01:00 committed by Tim Flynn
parent d9f8203021
commit 5da9af435e
8 changed files with 89 additions and 16 deletions

Binary file not shown.

View file

@ -72,33 +72,43 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
});
}
auto* menu = menuBar()->addMenu("&File");
m_hamburger_menu = new QMenu(this);
if (!Settings::the()->show_menubar())
menuBar()->hide();
QObject::connect(Settings::the(), &Settings::show_menubar_changed, this, [this](bool show_menubar) {
menuBar()->setVisible(show_menubar);
});
auto* file_menu = menuBar()->addMenu("&File");
m_new_tab_action = new QAction("New &Tab", this);
m_new_tab_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::AddTab));
menu->addAction(m_new_tab_action);
m_hamburger_menu->addAction(m_new_tab_action);
file_menu->addAction(m_new_tab_action);
m_new_window_action = new QAction("New &Window", this);
m_new_window_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::New));
menu->addAction(m_new_window_action);
m_hamburger_menu->addAction(m_new_window_action);
file_menu->addAction(m_new_window_action);
auto* close_current_tab_action = new QAction("&Close Current Tab", this);
close_current_tab_action->setIcon(load_icon_from_uri("resource://icons/16x16/close-tab.png"sv));
close_current_tab_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Close));
menu->addAction(close_current_tab_action);
m_hamburger_menu->addAction(close_current_tab_action);
file_menu->addAction(close_current_tab_action);
auto* open_file_action = new QAction("&Open File...", this);
open_file_action->setIcon(load_icon_from_uri("resource://icons/16x16/filetype-folder-open.png"sv));
open_file_action->setShortcut(QKeySequence(QKeySequence::StandardKey::Open));
menu->addAction(open_file_action);
m_hamburger_menu->addAction(open_file_action);
file_menu->addAction(open_file_action);
menu->addSeparator();
m_hamburger_menu->addSeparator();
auto* quit_action = new QAction("&Quit", this);
quit_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Quit));
menu->addAction(quit_action);
auto* edit_menu = menuBar()->addMenu("&Edit");
auto* edit_menu = m_hamburger_menu->addMenu("&Edit");
menuBar()->addMenu(edit_menu);
m_copy_selection_action = new QAction("&Copy", this);
m_copy_selection_action->setIcon(load_icon_from_uri("resource://icons/16x16/edit-copy.png"sv));
@ -125,7 +135,8 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
settings_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Preferences));
edit_menu->addAction(settings_action);
auto* view_menu = menuBar()->addMenu("&View");
auto* view_menu = m_hamburger_menu->addMenu("&View");
menuBar()->addMenu(view_menu);
auto* open_next_tab_action = new QAction("Open &Next Tab", this);
open_next_tab_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_PageDown));
@ -187,7 +198,16 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
auto_color_scheme->setChecked(true);
auto* inspect_menu = menuBar()->addMenu("&Inspect");
auto* show_menubar = new QAction("Show &Menubar", this);
show_menubar->setCheckable(true);
show_menubar->setChecked(Settings::the()->show_menubar());
view_menu->addAction(show_menubar);
QObject::connect(show_menubar, &QAction::triggered, this, [](bool checked) {
Settings::the()->set_show_menubar(checked);
});
auto* inspect_menu = m_hamburger_menu->addMenu("&Inspect");
menuBar()->addMenu(inspect_menu);
m_view_source_action = new QAction("View &Source", this);
m_view_source_action->setIcon(load_icon_from_uri("resource://icons/16x16/filetype-html.png"sv));
@ -217,7 +237,7 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
static_cast<Ladybird::Application*>(QApplication::instance())->show_task_manager_window();
});
auto* debug_menu = menuBar()->addMenu("&Debug");
auto* debug_menu = m_hamburger_menu->addMenu("&Debug");
auto* dump_session_history_tree_action = new QAction("Dump Session History Tree", this);
dump_session_history_tree_action->setIcon(load_icon_from_uri("resource://icons/16x16/history.png"sv));
@ -385,7 +405,8 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
debug_request("same-origin-policy", state ? "on" : "off");
});
auto* help_menu = menuBar()->addMenu("&Help");
auto* help_menu = m_hamburger_menu->addMenu("&Help");
menuBar()->addMenu(help_menu);
auto* about_action = new QAction("&About Ladybird", this);
help_menu->addAction(about_action);
@ -393,6 +414,15 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
new_tab_from_url("about:version"sv, Web::HTML::ActivateTab::Yes);
});
m_hamburger_menu->addSeparator();
file_menu->addSeparator();
auto* quit_action = new QAction("&Quit", this);
quit_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Quit));
m_hamburger_menu->addAction(quit_action);
file_menu->addAction(quit_action);
QObject::connect(quit_action, &QAction::triggered, this, &QMainWindow::close);
QObject::connect(m_new_tab_action, &QAction::triggered, this, [this] {
new_tab_from_url(ak_url_from_qstring(Settings::the()->new_tab_page()), Web::HTML::ActivateTab::Yes);
});
@ -409,7 +439,6 @@ BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::Cook
m_settings_dialog->show();
m_settings_dialog->setFocus();
});
QObject::connect(quit_action, &QAction::triggered, this, &QMainWindow::close);
QObject::connect(m_tabs_container, &QTabWidget::currentChanged, [this](int index) {
auto* tab = verify_cast<Tab>(m_tabs_container->widget(index));
if (tab)

View file

@ -38,6 +38,11 @@ public:
int tab_index(Tab*);
Tab& create_new_tab(Web::HTML::ActivateTab activate_tab);
QMenu& hamburger_menu()
{
return *m_hamburger_menu;
}
QAction& go_back_action()
{
return *m_go_back_action;
@ -155,6 +160,8 @@ private:
Tab* m_current_tab { nullptr };
QMenu* m_zoom_menu { nullptr };
QMenu* m_hamburger_menu { nullptr };
QAction* m_go_back_action { nullptr };
QAction* m_go_forward_action { nullptr };
QAction* m_reload_action { nullptr };

View file

@ -111,4 +111,15 @@ void Settings::set_enable_search(bool enable)
m_qsettings->setValue("enable_search", enable);
}
bool Settings::show_menubar()
{
return m_qsettings->value("show_menubar", false).toBool();
}
void Settings::set_show_menubar(bool show_menubar)
{
m_qsettings->setValue("show_menubar", show_menubar);
emit show_menubar_changed(show_menubar);
}
}

View file

@ -17,6 +17,8 @@
namespace Ladybird {
class Settings : public QObject {
Q_OBJECT
public:
Settings(Settings const&) = delete;
Settings& operator=(Settings const&) = delete;
@ -56,6 +58,12 @@ public:
bool enable_search();
void set_enable_search(bool enable);
bool show_menubar();
void set_show_menubar(bool show_menubar);
signals:
void show_menubar_changed(bool show_menubar);
protected:
Settings();

View file

@ -71,6 +71,13 @@ Tab::Tab(BrowserWindow* window, WebContentOptions const& web_content_options, St
m_layout->addWidget(m_toolbar);
m_layout->addWidget(m_view);
m_hamburger_button = new QToolButton(m_toolbar);
m_hamburger_button->setText("Show &Menu");
m_hamburger_button->setToolTip("Show Menu");
m_hamburger_button->setIcon(create_tvg_icon_with_theme_colors("hamburger", palette()));
m_hamburger_button->setPopupMode(QToolButton::InstantPopup);
m_hamburger_button->setMenu(&m_window->hamburger_menu());
recreate_toolbar_icons();
m_favicon = default_favicon();
@ -80,11 +87,18 @@ Tab::Tab(BrowserWindow* window, WebContentOptions const& web_content_options, St
m_toolbar->addAction(&m_window->reload_action());
m_toolbar->addWidget(m_location_edit);
m_toolbar->addAction(&m_window->new_tab_action());
m_hamburger_button_action = m_toolbar->addWidget(m_hamburger_button);
m_toolbar->setIconSize({ 16, 16 });
// This is a little awkward, but without this Qt shrinks the button to the size of the icon.
// Note: toolButtonStyle="0" -> ToolButtonIconOnly.
m_toolbar->setStyleSheet("QToolButton[toolButtonStyle=\"0\"]{width:24px;height:24px}");
m_hamburger_button_action->setVisible(!Settings::the()->show_menubar());
QObject::connect(Settings::the(), &Settings::show_menubar_changed, this, [this](bool show_menubar) {
m_hamburger_button_action->setVisible(!show_menubar);
});
m_reset_zoom_button = new QToolButton(m_toolbar);
m_reset_zoom_button->setToolButtonStyle(Qt::ToolButtonTextOnly);
m_reset_zoom_button->setToolTip("Reset zoom level");
@ -898,6 +912,7 @@ void Tab::recreate_toolbar_icons()
m_window->go_forward_action().setIcon(create_tvg_icon_with_theme_colors("forward", palette()));
m_window->reload_action().setIcon(create_tvg_icon_with_theme_colors("reload", palette()));
m_window->new_tab_action().setIcon(create_tvg_icon_with_theme_colors("new_tab", palette()));
m_hamburger_button->setIcon(create_tvg_icon_with_theme_colors("hamburger", palette()));
}
void Tab::show_inspector_window(InspectorTarget inspector_target)

View file

@ -84,6 +84,8 @@ private:
QBoxLayout* m_layout { nullptr };
QToolBar* m_toolbar { nullptr };
QToolButton* m_hamburger_button { nullptr };
QAction* m_hamburger_button_action { nullptr };
QToolButton* m_reset_zoom_button { nullptr };
QAction* m_reset_zoom_button_action { nullptr };
LocationEdit* m_location_edit { nullptr };

View file

@ -4,6 +4,7 @@
<file>../Icons/back.tvg</file>
<file>../Icons/close.tvg</file>
<file>../Icons/forward.tvg</file>
<file>../Icons/hamburger.tvg</file>
<file>../Icons/new_tab.tvg</file>
<file>../Icons/reload.tvg</file>
</qresource>