GSlider.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <LibGUI/GPainter.h>
  2. #include <LibGUI/GSlider.h>
  3. #include <SharedGraphics/StylePainter.h>
  4. GSlider::GSlider(GWidget* parent)
  5. : GWidget(parent)
  6. {
  7. }
  8. GSlider::~GSlider()
  9. {
  10. }
  11. void GSlider::set_range(int min, int max)
  12. {
  13. ASSERT(min <= max);
  14. if (m_min == min && m_max == max)
  15. return;
  16. m_min = min;
  17. m_max = max;
  18. if (m_value > max)
  19. m_value = max;
  20. if (m_value < min)
  21. m_value = min;
  22. update();
  23. }
  24. void GSlider::set_value(int value)
  25. {
  26. if (value > m_max)
  27. value = m_max;
  28. if (value < m_min)
  29. value = m_min;
  30. if (m_value == value)
  31. return;
  32. m_value = value;
  33. update();
  34. if (on_value_changed)
  35. on_value_changed(m_value);
  36. }
  37. void GSlider::paint_event(GPaintEvent& event)
  38. {
  39. GPainter painter(*this);
  40. painter.add_clip_rect(event.rect());
  41. Rect track_rect { inner_rect().x(), 0, inner_rect().width(), track_height() };
  42. track_rect.center_vertically_within(inner_rect());
  43. StylePainter::paint_frame(painter, track_rect, FrameShape::Panel, FrameShadow::Sunken, 1);
  44. StylePainter::paint_button(painter, knob_rect(), ButtonStyle::Normal, false, m_knob_hovered);
  45. }
  46. Rect GSlider::knob_rect() const
  47. {
  48. auto inner_rect = this->inner_rect();
  49. float range_size = m_max - m_min;
  50. float adjusted_value = m_value - m_min;
  51. float relative_value = adjusted_value / range_size;
  52. Rect rect {
  53. inner_rect.x() + (int)(relative_value * inner_rect.width()) - knob_width() / 2,
  54. 0,
  55. knob_width(),
  56. knob_height()
  57. };
  58. rect.center_vertically_within(inner_rect);
  59. return rect;
  60. }
  61. void GSlider::mousedown_event(GMouseEvent& event)
  62. {
  63. if (!is_enabled())
  64. return;
  65. if (event.button() == GMouseButton::Left) {
  66. if (knob_rect().contains(event.position())) {
  67. m_dragging = true;
  68. m_drag_origin = event.position();
  69. m_drag_origin_value = m_value;
  70. return;
  71. }
  72. }
  73. return GWidget::mousedown_event(event);
  74. }
  75. void GSlider::mousemove_event(GMouseEvent& event)
  76. {
  77. if (!is_enabled())
  78. return;
  79. set_knob_hovered(knob_rect().contains(event.position()));
  80. if (m_dragging) {
  81. float delta = event.position().x() - m_drag_origin.x();
  82. float scrubbable_range = inner_rect().width();
  83. float value_steps_per_scrubbed_pixel = (m_max - m_min) / scrubbable_range;
  84. float new_value = m_drag_origin_value + (value_steps_per_scrubbed_pixel * delta);
  85. set_value((int)new_value);
  86. return;
  87. }
  88. return GWidget::mousemove_event(event);
  89. }
  90. void GSlider::mouseup_event(GMouseEvent& event)
  91. {
  92. if (!is_enabled())
  93. return;
  94. if (event.button() == GMouseButton::Left) {
  95. m_dragging = false;
  96. return;
  97. }
  98. return GWidget::mouseup_event(event);
  99. }
  100. void GSlider::leave_event(CEvent& event)
  101. {
  102. if (!is_enabled())
  103. return;
  104. set_knob_hovered(false);
  105. GWidget::leave_event(event);
  106. }
  107. void GSlider::change_event(GEvent& event)
  108. {
  109. if (event.type() == GEvent::Type::EnabledChange) {
  110. if (!is_enabled())
  111. m_dragging = false;
  112. }
  113. GWidget::change_event(event);
  114. }
  115. void GSlider::set_knob_hovered(bool hovered)
  116. {
  117. if (m_knob_hovered == hovered)
  118. return;
  119. m_knob_hovered = hovered;
  120. update(knob_rect());
  121. }