GSlider.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include <LibGUI/GPainter.h>
  2. #include <LibGUI/GSlider.h>
  3. #include <LibDraw/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. Rect rect;
  50. rect.set_y(0);
  51. rect.set_height(knob_height());
  52. if (knob_size_mode() == KnobSizeMode::Fixed) {
  53. if (m_max - m_min)
  54. {
  55. float scale = (float)inner_rect.width() / (float)(m_max - m_min);
  56. rect.set_x(inner_rect.x() + ((int)(m_value * scale)) - (knob_fixed_width() / 2));
  57. }
  58. else
  59. rect.set_x(0);
  60. rect.set_width(knob_fixed_width());
  61. }
  62. else {
  63. float scale = (float)inner_rect.width() / (float)(m_max - m_min + 1);
  64. rect.set_x(inner_rect.x() + ((int)(m_value * scale)));
  65. if (m_max - m_min)
  66. rect.set_width(::max((int)(scale), knob_fixed_width()));
  67. else
  68. rect.set_width(inner_rect.width());
  69. }
  70. rect.center_vertically_within(inner_rect);
  71. return rect;
  72. }
  73. void GSlider::mousedown_event(GMouseEvent& event)
  74. {
  75. if (!is_enabled())
  76. return;
  77. if (event.button() == GMouseButton::Left) {
  78. if (knob_rect().contains(event.position())) {
  79. m_dragging = true;
  80. m_drag_origin = event.position();
  81. m_drag_origin_value = m_value;
  82. return;
  83. }
  84. else {
  85. if (event.position().x() > knob_rect().right())
  86. set_value(m_value + 1);
  87. else if (event.position().x() < knob_rect().left())
  88. set_value(m_value - 1);
  89. }
  90. }
  91. return GWidget::mousedown_event(event);
  92. }
  93. void GSlider::mousemove_event(GMouseEvent& event)
  94. {
  95. if (!is_enabled())
  96. return;
  97. set_knob_hovered(knob_rect().contains(event.position()));
  98. if (m_dragging) {
  99. float delta = event.position().x() - m_drag_origin.x();
  100. float scrubbable_range = inner_rect().width();
  101. float value_steps_per_scrubbed_pixel = (m_max - m_min) / scrubbable_range;
  102. float new_value = m_drag_origin_value + (value_steps_per_scrubbed_pixel * delta);
  103. set_value((int)new_value);
  104. return;
  105. }
  106. return GWidget::mousemove_event(event);
  107. }
  108. void GSlider::mouseup_event(GMouseEvent& event)
  109. {
  110. if (!is_enabled())
  111. return;
  112. if (event.button() == GMouseButton::Left) {
  113. m_dragging = false;
  114. return;
  115. }
  116. return GWidget::mouseup_event(event);
  117. }
  118. void GSlider::leave_event(CEvent& event)
  119. {
  120. if (!is_enabled())
  121. return;
  122. set_knob_hovered(false);
  123. GWidget::leave_event(event);
  124. }
  125. void GSlider::change_event(GEvent& event)
  126. {
  127. if (event.type() == GEvent::Type::EnabledChange) {
  128. if (!is_enabled())
  129. m_dragging = false;
  130. }
  131. GWidget::change_event(event);
  132. }
  133. void GSlider::set_knob_hovered(bool hovered)
  134. {
  135. if (m_knob_hovered == hovered)
  136. return;
  137. m_knob_hovered = hovered;
  138. update(knob_rect());
  139. }