Slider.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <LibGUI/AbstractSlider.h>
  9. namespace GUI {
  10. class Slider : public AbstractSlider {
  11. C_OBJECT(Slider);
  12. public:
  13. enum class KnobSizeMode {
  14. Fixed,
  15. Proportional,
  16. };
  17. virtual ~Slider() override = default;
  18. void set_knob_size_mode(KnobSizeMode mode) { m_knob_size_mode = mode; }
  19. KnobSizeMode knob_size_mode() const { return m_knob_size_mode; }
  20. int track_size() const { return 2; }
  21. int track_margin() const { return 10; }
  22. int knob_fixed_primary_size() const { return 8; }
  23. int knob_secondary_size() const { return 20; }
  24. bool knob_dragging() const { return m_dragging; }
  25. Gfx::IntRect knob_rect() const;
  26. Gfx::IntRect inner_rect() const
  27. {
  28. if (orientation() == Orientation::Horizontal)
  29. return rect().shrunken(track_margin() * 2, 0);
  30. return rect().shrunken(0, track_margin() * 2);
  31. }
  32. Function<void()> on_drag_start;
  33. Function<void()> on_drag_end;
  34. protected:
  35. explicit Slider(Orientation = Orientation::Vertical);
  36. virtual Optional<UISize> calculated_min_size() const override;
  37. virtual Optional<UISize> calculated_preferred_size() const override;
  38. virtual void paint_event(PaintEvent&) override;
  39. void start_drag(Gfx::IntPoint);
  40. virtual void mousedown_event(MouseEvent&) override;
  41. virtual void mousemove_event(MouseEvent&) override;
  42. void end_drag();
  43. virtual void mouseup_event(MouseEvent&) override;
  44. virtual void mousewheel_event(MouseEvent&) override;
  45. virtual void leave_event(Core::Event&) override;
  46. virtual void change_event(Event&) override;
  47. private:
  48. void set_knob_hovered(bool);
  49. bool m_knob_hovered { false };
  50. bool m_dragging { false };
  51. int m_drag_origin_value { 0 };
  52. Gfx::IntPoint m_drag_origin;
  53. KnobSizeMode m_knob_size_mode { KnobSizeMode::Fixed };
  54. };
  55. class VerticalSlider final : public Slider {
  56. C_OBJECT(VerticalSlider);
  57. public:
  58. virtual ~VerticalSlider() override = default;
  59. private:
  60. VerticalSlider()
  61. : Slider(Orientation::Vertical)
  62. {
  63. }
  64. };
  65. class HorizontalSlider final : public Slider {
  66. C_OBJECT(HorizontalSlider);
  67. public:
  68. virtual ~HorizontalSlider() override = default;
  69. private:
  70. HorizontalSlider()
  71. : Slider(Orientation::Horizontal)
  72. {
  73. }
  74. };
  75. }