Explorar o código

LibGUI: Split OpacitySlider into vertical and horizontal helper classes

FrHun %!s(int64=2) %!d(string=hai) anos
pai
achega
59028515c0

+ 3 - 2
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"
 }

+ 1 - 1
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<GUI::OpacitySlider>();
+    m_opacity_slider = opacity_container.add<GUI::HorizontalOpacitySlider>();
     m_opacity_slider->set_range(0, 100);
     m_opacity_slider->on_change = [this](int value) {
         if (m_layer)

+ 1 - 1
Userland/Applications/TerminalSettings/TerminalSettingsView.gml

@@ -13,7 +13,7 @@
             spacing: 16
         }
 
-        @GUI::OpacitySlider {
+        @GUI::HorizontalOpacitySlider {
             name: "background_opacity_slider"
             min: 0
             max: 255

+ 1 - 1
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<GUI::OpacitySlider>("background_opacity_slider");
+    auto& slider = *find_descendant_of_type_named<GUI::HorizontalOpacitySlider>("background_opacity_slider");
     m_opacity = Config::read_i32("Terminal"sv, "Window"sv, "Opacity"sv);
     m_original_opacity = m_opacity;
     slider.set_value(m_opacity);

+ 1 - 1
Userland/Demos/WidgetGallery/GalleryGML/SlidersTab.gml

@@ -16,7 +16,7 @@
                 margins: [8]
             }
 
-            @GUI::OpacitySlider {
+            @GUI::HorizontalOpacitySlider {
                 name: "opacity_slider"
                 tooltip: "Opacity Slider"
             }

+ 1 - 1
Userland/Demos/WidgetGallery/GalleryWidget.cpp

@@ -215,7 +215,7 @@ GalleryWidget::GalleryWidget()
     m_opacity_imagewidget = sliders_tab->find_descendant_of_type_named<GUI::ImageWidget>("opacity_imagewidget");
     m_opacity_imagewidget->load_from_file("/res/graphics/brand-banner.png"sv);
 
-    m_opacity_slider = sliders_tab->find_descendant_of_type_named<GUI::OpacitySlider>("opacity_slider");
+    m_opacity_slider = sliders_tab->find_descendant_of_type_named<GUI::HorizontalOpacitySlider>("opacity_slider");
 
     m_opacity_slider->on_change = [&](auto percent) {
         m_opacity_imagewidget->set_opacity_percent(percent);

+ 2 - 0
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;

+ 18 - 2
Userland/Libraries/LibGUI/OpacitySlider.cpp

@@ -10,7 +10,8 @@
 #include <LibGfx/Palette.h>
 #include <LibGfx/StylePainter.h>
 
-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<UISize> OpacitySlider::calculated_min_size() const
+{
+    if (orientation() == Gfx::Orientation::Vertical)
+        return { { 20, 40 } };
+    else
+        return { { 40, 20 } };
+}
+
+Optional<UISize> OpacitySlider::calculated_preferred_size() const
+{
+    if (orientation() == Gfx::Orientation::Vertical)
+        return { { SpecialDimension::Shrink, SpecialDimension::OpportunisticGrow } };
+    else
+        return { { SpecialDimension::OpportunisticGrow, SpecialDimension::Shrink } };
+}
+
 }

+ 28 - 2
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<UISize> 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)
+    {
+    }
+};
+
 }