From 59028515c07c1e22204028f763cdb2a07684cd40 Mon Sep 17 00:00:00 2001 From: FrHun <28605587+frhun@users.noreply.github.com> Date: Wed, 7 Dec 2022 23:40:36 +0100 Subject: [PATCH] LibGUI: Split OpacitySlider into vertical and horizontal helper classes --- .../man/man5/GML-Widget-OpacitySlider.md | 5 ++-- .../PixelPaint/LayerPropertiesWidget.cpp | 2 +- .../TerminalSettings/TerminalSettingsView.gml | 2 +- .../TerminalSettingsWidget.cpp | 2 +- .../WidgetGallery/GalleryGML/SlidersTab.gml | 2 +- .../Demos/WidgetGallery/GalleryWidget.cpp | 2 +- Userland/Libraries/LibGUI/Forward.h | 2 ++ Userland/Libraries/LibGUI/OpacitySlider.cpp | 20 +++++++++++-- Userland/Libraries/LibGUI/OpacitySlider.h | 30 +++++++++++++++++-- 9 files changed, 56 insertions(+), 11 deletions(-) diff --git a/Base/usr/share/man/man5/GML-Widget-OpacitySlider.md b/Base/usr/share/man/man5/GML-Widget-OpacitySlider.md index f3303f0cdf..cabb0edf2d 100644 --- a/Base/usr/share/man/man5/GML-Widget-OpacitySlider.md +++ b/Base/usr/share/man/man5/GML-Widget-OpacitySlider.md @@ -8,12 +8,13 @@ Defines a GUI opacity slider widget. ## Synopsis -`@GUI::OpacitySlider` +`@GUI::HorizontalOpacitySlider` +`@GUI::VerticalOpacitySlider` ## Examples ```gml -@GUI::OpacitySlider { +@GUI::HorizontalOpacitySlider { name: "opacity_slider" tooltip: "Opacity Slider" } diff --git a/Userland/Applications/PixelPaint/LayerPropertiesWidget.cpp b/Userland/Applications/PixelPaint/LayerPropertiesWidget.cpp index 1ad8a5329b..c0addb4d96 100644 --- a/Userland/Applications/PixelPaint/LayerPropertiesWidget.cpp +++ b/Userland/Applications/PixelPaint/LayerPropertiesWidget.cpp @@ -51,7 +51,7 @@ LayerPropertiesWidget::LayerPropertiesWidget() opacity_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); opacity_label.set_fixed_size(80, 20); - m_opacity_slider = opacity_container.add(); + m_opacity_slider = opacity_container.add(); m_opacity_slider->set_range(0, 100); m_opacity_slider->on_change = [this](int value) { if (m_layer) diff --git a/Userland/Applications/TerminalSettings/TerminalSettingsView.gml b/Userland/Applications/TerminalSettings/TerminalSettingsView.gml index ad40063887..db20b83ee9 100644 --- a/Userland/Applications/TerminalSettings/TerminalSettingsView.gml +++ b/Userland/Applications/TerminalSettings/TerminalSettingsView.gml @@ -13,7 +13,7 @@ spacing: 16 } - @GUI::OpacitySlider { + @GUI::HorizontalOpacitySlider { name: "background_opacity_slider" min: 0 max: 255 diff --git a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp index 28dab184e2..bc6c1c1424 100644 --- a/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp +++ b/Userland/Applications/TerminalSettings/TerminalSettingsWidget.cpp @@ -104,7 +104,7 @@ TerminalSettingsViewWidget::TerminalSettingsViewWidget() { load_from_gml(terminal_settings_view_gml); - auto& slider = *find_descendant_of_type_named("background_opacity_slider"); + auto& slider = *find_descendant_of_type_named("background_opacity_slider"); m_opacity = Config::read_i32("Terminal"sv, "Window"sv, "Opacity"sv); m_original_opacity = m_opacity; slider.set_value(m_opacity); diff --git a/Userland/Demos/WidgetGallery/GalleryGML/SlidersTab.gml b/Userland/Demos/WidgetGallery/GalleryGML/SlidersTab.gml index fef57a9eec..0f9e0fc986 100644 --- a/Userland/Demos/WidgetGallery/GalleryGML/SlidersTab.gml +++ b/Userland/Demos/WidgetGallery/GalleryGML/SlidersTab.gml @@ -16,7 +16,7 @@ margins: [8] } - @GUI::OpacitySlider { + @GUI::HorizontalOpacitySlider { name: "opacity_slider" tooltip: "Opacity Slider" } diff --git a/Userland/Demos/WidgetGallery/GalleryWidget.cpp b/Userland/Demos/WidgetGallery/GalleryWidget.cpp index 0136712bcb..d8973608ae 100644 --- a/Userland/Demos/WidgetGallery/GalleryWidget.cpp +++ b/Userland/Demos/WidgetGallery/GalleryWidget.cpp @@ -215,7 +215,7 @@ GalleryWidget::GalleryWidget() m_opacity_imagewidget = sliders_tab->find_descendant_of_type_named("opacity_imagewidget"); m_opacity_imagewidget->load_from_file("/res/graphics/brand-banner.png"sv); - m_opacity_slider = sliders_tab->find_descendant_of_type_named("opacity_slider"); + m_opacity_slider = sliders_tab->find_descendant_of_type_named("opacity_slider"); m_opacity_slider->on_change = [&](auto percent) { m_opacity_imagewidget->set_opacity_percent(percent); diff --git a/Userland/Libraries/LibGUI/Forward.h b/Userland/Libraries/LibGUI/Forward.h index 0ad380d344..b6b5fd6786 100644 --- a/Userland/Libraries/LibGUI/Forward.h +++ b/Userland/Libraries/LibGUI/Forward.h @@ -33,6 +33,7 @@ class Frame; class GroupBox; class HeaderView; class HorizontalBoxLayout; +class HorizontalOpacitySlider; class HorizontalSlider; class Icon; class IconView; @@ -88,6 +89,7 @@ class TreeView; class ValueSlider; class Variant; class VerticalBoxLayout; +class VerticalOpacitySlider; class VerticalSlider; class WMEvent; class Widget; diff --git a/Userland/Libraries/LibGUI/OpacitySlider.cpp b/Userland/Libraries/LibGUI/OpacitySlider.cpp index 299f1e2c0a..ed12fdf512 100644 --- a/Userland/Libraries/LibGUI/OpacitySlider.cpp +++ b/Userland/Libraries/LibGUI/OpacitySlider.cpp @@ -10,7 +10,8 @@ #include #include -REGISTER_WIDGET(GUI, OpacitySlider) +REGISTER_WIDGET(GUI, HorizontalOpacitySlider) +REGISTER_WIDGET(GUI, VerticalOpacitySlider) namespace GUI { @@ -20,7 +21,6 @@ OpacitySlider::OpacitySlider(Gfx::Orientation orientation) set_min(0); set_max(100); set_value(100); - set_fixed_height(20); } Gfx::IntRect OpacitySlider::frame_inner_rect() const @@ -182,4 +182,20 @@ void OpacitySlider::mousewheel_event(MouseEvent& event) decrease_slider_by(event.wheel_delta_y()); } +Optional OpacitySlider::calculated_min_size() const +{ + if (orientation() == Gfx::Orientation::Vertical) + return { { 20, 40 } }; + else + return { { 40, 20 } }; +} + +Optional OpacitySlider::calculated_preferred_size() const +{ + if (orientation() == Gfx::Orientation::Vertical) + return { { SpecialDimension::Shrink, SpecialDimension::OpportunisticGrow } }; + else + return { { SpecialDimension::OpportunisticGrow, SpecialDimension::Shrink } }; +} + } diff --git a/Userland/Libraries/LibGUI/OpacitySlider.h b/Userland/Libraries/LibGUI/OpacitySlider.h index d35f7e5af7..8876d7be14 100644 --- a/Userland/Libraries/LibGUI/OpacitySlider.h +++ b/Userland/Libraries/LibGUI/OpacitySlider.h @@ -18,6 +18,8 @@ public: virtual ~OpacitySlider() override = default; protected: + explicit OpacitySlider(Gfx::Orientation); + virtual void paint_event(PaintEvent&) override; virtual void mousedown_event(MouseEvent&) override; virtual void mousemove_event(MouseEvent&) override; @@ -25,8 +27,6 @@ protected: virtual void mousewheel_event(MouseEvent&) override; private: - explicit OpacitySlider(Gfx::Orientation = Gfx::Orientation::Horizontal); - Gfx::IntRect frame_inner_rect() const; virtual Optional calculated_min_size() const override; @@ -37,4 +37,30 @@ private: bool m_dragging { false }; }; +class VerticalOpacitySlider final : public OpacitySlider { + C_OBJECT(VerticalOpacitySlider); + +public: + virtual ~VerticalOpacitySlider() override = default; + +private: + VerticalOpacitySlider() + : OpacitySlider(Orientation::Vertical) + { + } +}; + +class HorizontalOpacitySlider final : public OpacitySlider { + C_OBJECT(HorizontalOpacitySlider); + +public: + virtual ~HorizontalOpacitySlider() override = default; + +private: + HorizontalOpacitySlider() + : OpacitySlider(Orientation::Horizontal) + { + } +}; + }