RangeSlider.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "pch.h"
  2. #include "RangeSlider.h"
  3. #include <QDebug>
  4. #include "util.h"
  5. RangeSlider::RangeSlider(QWidget *parent)
  6. : QWidget(parent), sliderRangeColor(200,200,200), rangeColor(0,122,204)
  7. {
  8. }
  9. RangeSlider::~RangeSlider()
  10. {
  11. }
  12. void RangeSlider::setMinSliderValue(int value)
  13. {
  14. value = std::clamp(value, minRange, maxRange);
  15. if (value > maxSliderValue) {
  16. minSliderValue = maxSliderValue;
  17. maxSliderValue = value;
  18. emit minChanged(minSliderValue);
  19. emit maxChanged(maxSliderValue);
  20. }
  21. else {
  22. minSliderValue = value;
  23. emit minChanged(minSliderValue);
  24. }
  25. }
  26. void RangeSlider::setMaxSliderValue(int value)
  27. {
  28. value = std::clamp(value, minRange, maxRange);
  29. if (value < minSliderValue) {
  30. maxSliderValue = minSliderValue;
  31. minSliderValue = value;
  32. emit minChanged(minSliderValue);
  33. emit maxChanged(maxSliderValue);
  34. }
  35. else {
  36. maxSliderValue = value;
  37. emit maxChanged(maxSliderValue);
  38. }
  39. }
  40. void RangeSlider::setRange(int min, int max)
  41. {
  42. if (min > max) {
  43. std::swap(min, max);
  44. }
  45. minRange = min;
  46. maxRange = max;
  47. }
  48. void RangeSlider::setMinRange(int value)
  49. {
  50. if (value > maxRange) {
  51. minRange = maxRange;
  52. maxRange = value;
  53. }
  54. else {
  55. minRange = value;
  56. }
  57. }
  58. void RangeSlider::setMaxRange(int value)
  59. {
  60. if (value < minRange) {
  61. maxRange = minRange;
  62. minRange = value;
  63. }
  64. else {
  65. maxRange = value;
  66. }
  67. }
  68. void RangeSlider::paintEvent(QPaintEvent* event)
  69. {
  70. QPainter painter(this);
  71. painter.setRenderHint(QPainter::RenderHint::HighQualityAntialiasing);
  72. painter.setPen(sliderRangeColor);
  73. //painter.setBrush(sliderRangeColor);
  74. //FindMiddle
  75. int middle = rect().center().y();
  76. painter.drawRect(QRect(QPoint(minPos(), middle + 2), QPoint(maxPos(), middle - 2)));
  77. double minSliderAlpha = util::inverseLinearInterpolation(minRange, maxRange, minSliderValue);
  78. double minSliderPos = util::linearInterpolate(minPos(), maxPos(), minSliderAlpha);
  79. double maxSliderAlpha = util::inverseLinearInterpolation(minRange, maxRange, maxSliderValue);
  80. double maxSliderPos = util::linearInterpolate(minPos(), maxPos(), maxSliderAlpha);
  81. //DrawRange
  82. painter.fillRect(QRectF(QPointF(minSliderPos, (double)middle - 2), QPointF(maxSliderPos, (double)middle + 2)), rangeColor);
  83. //DrawSlider
  84. QPen pen(rangeColor);
  85. pen.setWidth(2);
  86. painter.setPen(pen);
  87. painter.setBrush(sliderRangeColor);
  88. painter.drawEllipse(QPointF(minSliderPos, (double)middle + 1), 10, 10);
  89. painter.drawEllipse(QPointF(maxSliderPos, (double)middle + 1), 10, 10);
  90. }
  91. void RangeSlider::mouseMoveEvent(QMouseEvent* event)
  92. {
  93. updateSliderPosition(event);
  94. }
  95. void RangeSlider::mousePressEvent(QMouseEvent* event)
  96. {
  97. updateSliderPosition(event);
  98. }
  99. void RangeSlider::updateSliderPosition(QMouseEvent* event)
  100. {
  101. //pos to alpha
  102. double alpha = util::inverseLinearInterpolation(minPos(), maxPos(), event->pos().x());
  103. double minSliderAlpha = util::inverseLinearInterpolation(minRange, maxRange, minSliderValue);
  104. double maxSliderAlpha = util::inverseLinearInterpolation(minRange, maxRange, maxSliderValue);
  105. if (minSliderAlpha < alpha && alpha < maxSliderAlpha) {
  106. }
  107. double value = util::linearInterpolate(minRange, maxRange, alpha);
  108. double distanceToMin = std::abs(minSliderValue - value);
  109. double distanceToMax = std::abs(maxSliderValue - value);
  110. if (distanceToMin < distanceToMax) {
  111. setMinSliderValue(value);
  112. }
  113. else {
  114. setMaxSliderValue(value);
  115. }
  116. update();
  117. }
  118. int RangeSlider::maxPos()
  119. {
  120. return rect().right() - 11;
  121. }
  122. int RangeSlider::minPos()
  123. {
  124. return rect().left() + 11;
  125. }