From eef07a411b39f7ba9b1101dab3cc4c54497a96b5 Mon Sep 17 00:00:00 2001 From: timre13 Date: Fri, 3 Mar 2023 18:10:52 +0100 Subject: [PATCH] VideoPlayer: Create submenu to set sizing mode Also add icon to the sizing mode cycling button. --- .../VideoPlayer/VideoFrameWidget.cpp | 9 +++ .../VideoPlayer/VideoFrameWidget.h | 2 +- .../VideoPlayer/VideoPlayerWidget.cpp | 61 +++++++++++++++++-- .../VideoPlayer/VideoPlayerWidget.h | 6 ++ .../VideoPlayer/VideoPlayerWindow.gml | 2 +- 5 files changed, 74 insertions(+), 6 deletions(-) diff --git a/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp b/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp index ce136e942f..bbeca22bb2 100644 --- a/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp +++ b/Userland/Applications/VideoPlayer/VideoFrameWidget.cpp @@ -31,6 +31,15 @@ void VideoFrameWidget::set_bitmap(Gfx::Bitmap const* bitmap) update(); } +void VideoFrameWidget::set_sizing_mode(VideoSizingMode value) +{ + if (value == m_sizing_mode) + return; + m_sizing_mode = value; + + update(); +} + void VideoFrameWidget::set_auto_resize(bool value) { m_auto_resize = value; diff --git a/Userland/Applications/VideoPlayer/VideoFrameWidget.h b/Userland/Applications/VideoPlayer/VideoFrameWidget.h index e1f66d0356..a1280fb306 100644 --- a/Userland/Applications/VideoPlayer/VideoFrameWidget.h +++ b/Userland/Applications/VideoPlayer/VideoFrameWidget.h @@ -28,7 +28,7 @@ public: void set_bitmap(Gfx::Bitmap const*); Gfx::Bitmap const* bitmap() const { return m_bitmap.ptr(); } - void set_sizing_mode(VideoSizingMode value) { m_sizing_mode = value; } + void set_sizing_mode(VideoSizingMode value); VideoSizingMode sizing_mode() const { return m_sizing_mode; } void set_auto_resize(bool value); diff --git a/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp b/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp index ec17ebd676..f390397ad4 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp +++ b/Userland/Applications/VideoPlayer/VideoPlayerWidget.cpp @@ -69,9 +69,10 @@ ErrorOr VideoPlayerWidget::setup_interface() toggle_pause(); }); - m_cycle_sizing_modes_action = GUI::Action::create("Sizing", [&](auto&) { - cycle_sizing_modes(); - }); + m_cycle_sizing_modes_action = GUI::Action::create( + "Sizing", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/fit-image-to-view.png"sv)), [&](auto&) { + cycle_sizing_modes(); + }); m_toggle_fullscreen_action = GUI::CommonActions::make_fullscreen_action([&](auto&) { toggle_fullscreen(); @@ -83,6 +84,22 @@ ErrorOr VideoPlayerWidget::setup_interface() 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); + m_size_fit_action = GUI::Action::create_checkable("&Fit", [&](auto&) { + m_video_display->set_sizing_mode(VideoSizingMode::Fit); + }); + + m_size_fill_action = GUI::Action::create_checkable("Fi&ll", [&](auto&) { + m_video_display->set_sizing_mode(VideoSizingMode::Fill); + }); + + m_size_stretch_action = GUI::Action::create_checkable("&Stretch", [&](auto&) { + m_video_display->set_sizing_mode(VideoSizingMode::Stretch); + }); + + m_size_fullsize_action = GUI::Action::create_checkable("F&ull Size", [&](auto&) { + m_video_display->set_sizing_mode(VideoSizingMode::FullSize); + }); + return {}; } @@ -253,7 +270,27 @@ void VideoPlayerWidget::cycle_sizing_modes() auto sizing_mode = m_video_display->sizing_mode(); sizing_mode = static_cast((to_underlying(sizing_mode) + 1) % to_underlying(VideoSizingMode::Sentinel)); m_video_display->set_sizing_mode(sizing_mode); - m_video_display->update(); + + switch (sizing_mode) { + case VideoSizingMode::Fit: + m_size_fit_action->set_checked(true); + break; + + case VideoSizingMode::Fill: + m_size_fill_action->set_checked(true); + break; + + case VideoSizingMode::Stretch: + m_size_stretch_action->set_checked(true); + break; + + case VideoSizingMode::FullSize: + m_size_fullsize_action->set_checked(true); + break; + + case VideoSizingMode::Sentinel: + break; + } } void VideoPlayerWidget::toggle_fullscreen() @@ -318,6 +355,22 @@ ErrorOr VideoPlayerWidget::initialize_menubar(GUI::Window& window) auto view_menu = TRY(window.try_add_menu("&View")); TRY(view_menu->try_add_action(*m_toggle_fullscreen_action)); + auto sizing_mode_menu = TRY(view_menu->try_add_submenu("&Sizing mode")); + sizing_mode_menu->set_icon(TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/fit-image-to-view.png"sv))); + + m_sizing_mode_group = make(); + m_sizing_mode_group->set_exclusive(true); + m_sizing_mode_group->add_action(*m_size_fit_action); + m_sizing_mode_group->add_action(*m_size_fill_action); + m_sizing_mode_group->add_action(*m_size_stretch_action); + m_sizing_mode_group->add_action(*m_size_fullsize_action); + m_size_fit_action->set_checked(true); + + TRY(sizing_mode_menu->try_add_action(*m_size_fit_action)); + TRY(sizing_mode_menu->try_add_action(*m_size_fill_action)); + TRY(sizing_mode_menu->try_add_action(*m_size_stretch_action)); + TRY(sizing_mode_menu->try_add_action(*m_size_fullsize_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 9cd28be60c..3202430603 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWidget.h +++ b/Userland/Applications/VideoPlayer/VideoPlayerWidget.h @@ -70,6 +70,12 @@ private: RefPtr m_toggle_fullscreen_action; + OwnPtr m_sizing_mode_group; + RefPtr m_size_fit_action; + RefPtr m_size_fill_action; + RefPtr m_size_stretch_action; + RefPtr m_size_fullsize_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 0a8ec72f6e..162ea5f469 100644 --- a/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml +++ b/Userland/Applications/VideoPlayer/VideoPlayerWindow.gml @@ -41,7 +41,7 @@ @GUI::Button { name: "sizing" - text: "..." + icon: "/res/icons/16x16/fit-image-to-view.png" fixed_width: 24 button_style: "Coolbar" }