1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 23:07:35 +00:00

Browser: Add a context menu for video elements

This includes actions such as controlling play state, downloading the
video, and opening the video in a new tab.
This commit is contained in:
Timothy Flynn 2023-05-15 10:00:07 -04:00 committed by Andreas Kling
parent c82f678fc6
commit 1df0a141af
4 changed files with 61 additions and 0 deletions

View file

@ -369,6 +369,55 @@ Tab::Tab(BrowserWindow& window)
m_image_context_menu->popup(screen_position);
};
m_video_context_menu_play_pause_action = GUI::Action::create("&Play", g_icon_bag.play, [this](auto&) {
view().toggle_video_play_state();
});
m_video_context_menu_controls_action = GUI::Action::create_checkable("Show &Controls", [this](auto&) {
view().toggle_video_controls_state();
});
m_video_context_menu_loop_action = GUI::Action::create_checkable("&Loop Video", [this](auto&) {
view().toggle_video_loop_state();
});
m_video_context_menu = GUI::Menu::construct();
m_video_context_menu->add_action(*m_video_context_menu_play_pause_action);
m_video_context_menu->add_action(*m_video_context_menu_controls_action);
m_video_context_menu->add_action(*m_video_context_menu_loop_action);
m_video_context_menu->add_separator();
m_video_context_menu->add_action(GUI::Action::create("&Open Video", g_icon_bag.filetype_video, [this](auto&) {
view().on_link_click(m_video_context_menu_url, "", 0);
}));
m_video_context_menu->add_action(GUI::Action::create("Open Video in New &Tab", g_icon_bag.new_tab, [this](auto&) {
view().on_link_click(m_video_context_menu_url, "_blank", 0);
}));
m_video_context_menu->add_separator();
m_video_context_menu->add_action(GUI::Action::create("Copy Video &URL", g_icon_bag.copy, [this](auto&) {
GUI::Clipboard::the().set_plain_text(m_video_context_menu_url.to_deprecated_string());
}));
m_video_context_menu->add_separator();
m_video_context_menu->add_action(GUI::Action::create("&Download", g_icon_bag.download, [this](auto&) {
start_download(m_video_context_menu_url);
}));
m_video_context_menu->add_separator();
m_video_context_menu->add_action(window.inspect_dom_node_action());
view().on_video_context_menu_request = [this](auto& video_url, auto screen_position, bool is_playing, bool has_user_agent_controls, bool is_looping) {
m_video_context_menu_url = video_url;
if (is_playing) {
m_video_context_menu_play_pause_action->set_icon(g_icon_bag.play);
m_video_context_menu_play_pause_action->set_text("&Play"sv);
} else {
m_video_context_menu_play_pause_action->set_icon(g_icon_bag.pause);
m_video_context_menu_play_pause_action->set_text("&Pause"sv);
}
m_video_context_menu_controls_action->set_checked(has_user_agent_controls);
m_video_context_menu_loop_action->set_checked(is_looping);
m_video_context_menu->popup(screen_position);
};
view().on_link_middle_click = [this](auto& href, auto&, auto) {
view().on_link_click(href, "_blank", 0);
};