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:
parent
d9f8203021
commit
5da9af435e
Notes:
sideshowbarker
2024-07-16 19:42:24 +09:00
Author: https://github.com/jamierocks Commit: https://github.com/SerenityOS/serenity/commit/5da9af435e Pull-request: https://github.com/SerenityOS/serenity/pull/24224
8 changed files with 89 additions and 16 deletions
BIN
Ladybird/Icons/hamburger.tvg
Normal file
BIN
Ladybird/Icons/hamburger.tvg
Normal file
Binary file not shown.
|
@ -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)
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue