Slider.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. protected:
  33. explicit Slider(Orientation = Orientation::Vertical);
  34. virtual void paint_event(PaintEvent&) override;
  35. virtual void mousedown_event(MouseEvent&) override;
  36. virtual void mousemove_event(MouseEvent&) override;
  37. virtual void mouseup_event(MouseEvent&) override;
  38. virtual void mousewheel_event(MouseEvent&) override;
  39. virtual void leave_event(Core::Event&) override;
  40. virtual void change_event(Event&) override;
  41. private:
  42. void set_knob_hovered(bool);
  43. bool m_knob_hovered { false };
  44. bool m_dragging { false };
  45. int m_drag_origin_value { 0 };
  46. Gfx::IntPoint m_drag_origin;
  47. KnobSizeMode m_knob_size_mode { KnobSizeMode::Fixed };
  48. };
  49. class VerticalSlider final : public Slider {
  50. C_OBJECT(VerticalSlider);
  51. public:
  52. virtual ~VerticalSlider() override = default;
  53. private:
  54. VerticalSlider()
  55. : Slider(Orientation::Vertical)
  56. {
  57. }
  58. };
  59. class HorizontalSlider final : public Slider {
  60. C_OBJECT(HorizontalSlider);
  61. public:
  62. virtual ~HorizontalSlider() override = default;
  63. private:
  64. HorizontalSlider()
  65. : Slider(Orientation::Horizontal)
  66. {
  67. }
  68. };
  69. }