diff --git a/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp b/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp index a1602c1e9e..ce136e942f 100644 --- a/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp +++ b/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp @@ -45,6 +45,12 @@ void VideoFrameWidget::mousedown_event(GUI::MouseEvent&) on_click(); } +void VideoFrameWidget::doubleclick_event(GUI::MouseEvent&) +{ + if (on_doubleclick) + on_doubleclick(); +} + void VideoFrameWidget::paint_event(GUI::PaintEvent& event) { Frame::paint_event(event); diff --git a/Userland/Applications/VideoPlayer/VideoFrameWidget.h b/Userland/Applications/VideoPlayer/VideoFrameWidget.h index 0a59e662a3..e1f66d0356 100644 --- a/Userland/Applications/VideoPlayer/VideoFrameWidget.h +++ b/Userland/Applications/VideoPlayer/VideoFrameWidget.h @@ -35,11 +35,13 @@ public: bool auto_resize() const { return m_auto_resize; } Function on_click; + Function on_doubleclick; protected: explicit VideoFrameWidget(); virtual void mousedown_event(GUI::MouseEvent&) override; + virtual void doubleclick_event(GUI::MouseEvent&) override; virtual void paint_event(GUI::PaintEvent&) override; private: diff --git a/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp b/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp index 57e7ffe51d..ec17ebd676 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp +++ b/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp @@ -35,6 +35,7 @@ ErrorOr VideoPlayerWidget::setup_interface() { m_video_display = find_descendant_of_type_named("video_frame"); m_video_display->on_click = [&]() { toggle_pause(); }; + m_video_display->on_doubleclick = [&]() { toggle_fullscreen(); }; m_seek_slider = find_descendant_of_type_named("seek_slider"); m_seek_slider->on_drag_start = [&]() { @@ -72,10 +73,15 @@ ErrorOr VideoPlayerWidget::setup_interface() cycle_sizing_modes(); }); + m_toggle_fullscreen_action = GUI::CommonActions::make_fullscreen_action([&](auto&) { + toggle_fullscreen(); + }); + m_timestamp_label = find_descendant_of_type_named("timestamp"); m_volume_slider = find_descendant_of_type_named("volume_slider"); find_descendant_of_type_named("playback")->set_action(*m_play_pause_action); find_descendant_of_type_named("sizing")->set_action(*m_cycle_sizing_modes_action); + find_descendant_of_type_named("fullscreen")->set_action(*m_toggle_fullscreen_action); return {}; } @@ -250,6 +256,16 @@ void VideoPlayerWidget::cycle_sizing_modes() m_video_display->update(); } +void VideoPlayerWidget::toggle_fullscreen() +{ + auto* parent_window = window(); + parent_window->set_fullscreen(!parent_window->is_fullscreen()); + auto* bottom_container = find_descendant_of_type_named("bottom_container"); + bottom_container->set_visible(!parent_window->is_fullscreen()); + auto* video_frame = find_descendant_of_type_named("video_frame"); + video_frame->set_frame_thickness(parent_window->is_fullscreen() ? 0 : 2); +} + void VideoPlayerWidget::update_title() { StringBuilder string_builder; @@ -298,6 +314,10 @@ ErrorOr VideoPlayerWidget::initialize_menubar(GUI::Window& window) TRY(playback_menu->try_add_action(*m_use_fast_seeking)); set_seek_mode(Video::PlaybackManager::DEFAULT_SEEK_MODE); + // View menu + auto view_menu = TRY(window.try_add_menu("&View")); + TRY(view_menu->try_add_action(*m_toggle_fullscreen_action)); + // Help menu auto help_menu = TRY(window.try_add_menu("&Help")); TRY(help_menu->try_add_action(GUI::CommonActions::make_about_action("Video Player", TRY(GUI::Icon::try_create_default_icon("app-video-player"sv)), &window))); diff --git a/Userland/Applications/VideoPlayer/VideoPlayerWidget.h b/Userland/Applications/VideoPlayer/VideoPlayerWidget.h index a72590d95e..9cd28be60c 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWidget.h +++ b/Userland/Applications/VideoPlayer/VideoPlayerWidget.h @@ -49,6 +49,8 @@ private: void cycle_sizing_modes(); + void toggle_fullscreen(); + void event(Core::Event&) override; DeprecatedString m_path; @@ -66,6 +68,8 @@ private: RefPtr m_use_fast_seeking; + RefPtr m_toggle_fullscreen_action; + OwnPtr m_playback_manager; bool m_was_playing_before_seek { false }; diff --git a/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml b/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml index cf38f5307c..0a8ec72f6e 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml +++ b/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml @@ -8,6 +8,7 @@ } @GUI::Widget { + name: "bottom_container" max_height: 50 layout: @GUI::VerticalBoxLayout {} @@ -53,6 +54,15 @@ max: 100 fixed_width: 100 } + + @GUI::VerticalSeparator {} + + @GUI::Button { + name: "fullscreen" + icon: "/res/icons/16x16/fullscreen.png" + fixed_width: 24 + button_style: "Coolbar" + } } } }