slider-ignorewheel.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "slider-ignorewheel.hpp"
  2. SliderIgnoreScroll::SliderIgnoreScroll(QWidget *parent) : QSlider(parent)
  3. {
  4. setFocusPolicy(Qt::StrongFocus);
  5. }
  6. SliderIgnoreScroll::SliderIgnoreScroll(Qt::Orientation orientation,
  7. QWidget *parent)
  8. : QSlider(parent)
  9. {
  10. setFocusPolicy(Qt::StrongFocus);
  11. setOrientation(orientation);
  12. }
  13. void SliderIgnoreScroll::wheelEvent(QWheelEvent *event)
  14. {
  15. if (!hasFocus())
  16. event->ignore();
  17. else
  18. QSlider::wheelEvent(event);
  19. }
  20. VolumeSlider::VolumeSlider(obs_fader_t *fader, QWidget *parent)
  21. : SliderIgnoreScroll(parent)
  22. {
  23. fad = fader;
  24. }
  25. VolumeSlider::VolumeSlider(obs_fader_t *fader, Qt::Orientation orientation,
  26. QWidget *parent)
  27. : SliderIgnoreScroll(orientation, parent)
  28. {
  29. fad = fader;
  30. }
  31. VolumeAccessibleInterface::VolumeAccessibleInterface(QWidget *w)
  32. : QAccessibleWidget(w)
  33. {
  34. }
  35. VolumeSlider *VolumeAccessibleInterface::slider() const
  36. {
  37. return qobject_cast<VolumeSlider *>(object());
  38. }
  39. QString VolumeAccessibleInterface::text(QAccessible::Text t) const
  40. {
  41. if (slider()->isVisible()) {
  42. switch (t) {
  43. case QAccessible::Text::Value:
  44. return currentValue().toString();
  45. default:
  46. break;
  47. }
  48. }
  49. return QAccessibleWidget::text(t);
  50. }
  51. QVariant VolumeAccessibleInterface::currentValue() const
  52. {
  53. QString text;
  54. float db = obs_fader_get_db(slider()->fad);
  55. if (db < -96.0f)
  56. text = "-inf dB";
  57. else
  58. text = QString::number(db, 'f', 1).append(" dB");
  59. return text;
  60. }
  61. void VolumeAccessibleInterface::setCurrentValue(const QVariant &value)
  62. {
  63. slider()->setValue(value.toInt());
  64. }
  65. QVariant VolumeAccessibleInterface::maximumValue() const
  66. {
  67. return slider()->maximum();
  68. }
  69. QVariant VolumeAccessibleInterface::minimumValue() const
  70. {
  71. return slider()->minimum();
  72. }
  73. QVariant VolumeAccessibleInterface::minimumStepSize() const
  74. {
  75. return slider()->singleStep();
  76. }
  77. QAccessible::Role VolumeAccessibleInterface::role() const
  78. {
  79. return QAccessible::Role::Slider;
  80. }
  81. void SliderIgnoreClick::mousePressEvent(QMouseEvent *event)
  82. {
  83. QStyleOptionSlider styleOption;
  84. initStyleOption(&styleOption);
  85. QRect handle = style()->subControlRect(QStyle::CC_Slider, &styleOption,
  86. QStyle::SC_SliderHandle, this);
  87. #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
  88. QPointF pointExact = event->position();
  89. #endif
  90. if (handle.contains(
  91. #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
  92. QPoint(pointExact.x(), pointExact.y())
  93. #else
  94. // Ubuntu 20.04. Sigh.
  95. QPoint(event->x(), event->y())
  96. #endif
  97. )) {
  98. SliderIgnoreScroll::mousePressEvent(event);
  99. dragging = true;
  100. } else {
  101. event->accept();
  102. }
  103. }
  104. void SliderIgnoreClick::mouseReleaseEvent(QMouseEvent *event)
  105. {
  106. dragging = false;
  107. SliderIgnoreScroll::mouseReleaseEvent(event);
  108. }
  109. void SliderIgnoreClick::mouseMoveEvent(QMouseEvent *event)
  110. {
  111. if (dragging) {
  112. SliderIgnoreScroll::mouseMoveEvent(event);
  113. } else {
  114. event->accept();
  115. }
  116. }