diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f460426..bacbac25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,8 @@ target_sources( lib/utils/backup.hpp lib/utils/curl-helper.cpp lib/utils/curl-helper.hpp + lib/utils/double-slider.cpp + lib/utils/double-slider.hpp lib/utils/duration-control.cpp lib/utils/duration-control.hpp lib/utils/duration.cpp diff --git a/lib/utils/double-slider.cpp b/lib/utils/double-slider.cpp new file mode 100644 index 00000000..69e236f0 --- /dev/null +++ b/lib/utils/double-slider.cpp @@ -0,0 +1,63 @@ +#include "double-slider.hpp" +#include + +#include + +namespace advss { + +SliderIgnoreScroll::SliderIgnoreScroll(QWidget *parent) : QSlider(parent) +{ + setFocusPolicy(Qt::StrongFocus); +} + +SliderIgnoreScroll::SliderIgnoreScroll(Qt::Orientation orientation, + QWidget *parent) + : QSlider(parent) +{ + setFocusPolicy(Qt::StrongFocus); + setOrientation(orientation); +} + +void SliderIgnoreScroll::wheelEvent(QWheelEvent *event) +{ + if (!hasFocus()) { + event->ignore(); + } else { + QSlider::wheelEvent(event); + } +} + +DoubleSlider::DoubleSlider(QWidget *parent) : SliderIgnoreScroll(parent) +{ + connect(this, &DoubleSlider::valueChanged, [this](int val) { + emit DoubleValChanged((minVal / minStep + val) * minStep); + }); +} + +void DoubleSlider::SetDoubleConstraints(double newMin, double newMax, + double newStep, double val) +{ + minVal = newMin; + maxVal = newMax; + minStep = newStep; + + double total = maxVal - minVal; + int intMax = int(total / minStep); + + setMinimum(0); + setMaximum(intMax); + setSingleStep(1); + SetDoubleVal(val); +} + +double DoubleSlider::DoubleValue() +{ + return (minVal / minStep + value()) * minStep; +} + +void DoubleSlider::SetDoubleVal(double val) +{ + setValue(lround((val - minVal) / minStep)); +} + +} // namespace advss diff --git a/lib/utils/double-slider.hpp b/lib/utils/double-slider.hpp new file mode 100644 index 00000000..804b84b4 --- /dev/null +++ b/lib/utils/double-slider.hpp @@ -0,0 +1,40 @@ +// Based on OBS DoubleSlider and SliderIgnoreScroll implementation + +#pragma once +#include "export-symbol-helper.hpp" + +#include + +namespace advss { + +class SliderIgnoreScroll : public QSlider { + Q_OBJECT + +public: + SliderIgnoreScroll(QWidget *parent = nullptr); + SliderIgnoreScroll(Qt::Orientation orientation, + QWidget *parent = nullptr); + +protected: + virtual void wheelEvent(QWheelEvent *event) override; +}; + +class ADVSS_EXPORT DoubleSlider : public SliderIgnoreScroll { + Q_OBJECT + + double minVal = 0, maxVal = 100, minStep = 1; + +public: + DoubleSlider(QWidget *parent = nullptr); + + void SetDoubleConstraints(double newMin, double newMax, double newStep, + double val); + double DoubleValue(); +signals: + void DoubleValChanged(double val); + +public slots: + void SetDoubleVal(double val); +}; + +} // namespace advss diff --git a/lib/utils/volume-control.cpp b/lib/utils/volume-control.cpp index d1817fc0..2de9e966 100644 --- a/lib/utils/volume-control.cpp +++ b/lib/utils/volume-control.cpp @@ -90,15 +90,17 @@ void VolControl::setPeakMeterType(enum obs_peak_meter_type peakMeterType) } VolumeSlider::VolumeSlider(obs_fader_t *fader, QWidget *parent) - : QSlider(parent) + : DoubleSlider(parent) { fad = fader; } VolumeSlider::VolumeSlider(obs_fader_t *fader, Qt::Orientation orientation, QWidget *parent) - : QSlider(orientation, parent) + : DoubleSlider(parent) { + SetDoubleConstraints(0, 100, 0.01, 0); + setOrientation(orientation); fad = fader; } @@ -219,7 +221,6 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) nameLabel->setText(sourceName); slider->setMinimum(0); - slider->setMaximum(int(FADER_PRECISION)); obs_fader_add_callback(obs_fader, OBSVolumeChanged, this); obs_volmeter_add_callback(obs_volmeter, OBSVolumeLevel, this); @@ -592,7 +593,9 @@ void VolumeMeter::mousePressEvent(QMouseEvent *event) VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter, bool vertical) - : QWidget(parent), obs_volmeter(obs_volmeter), vertical(vertical) + : QWidget(parent), + obs_volmeter(obs_volmeter), + vertical(vertical) { setAttribute(Qt::WA_OpaquePaintEvent, true); diff --git a/lib/utils/volume-control.hpp b/lib/utils/volume-control.hpp index 7058fcd3..cef8069e 100644 --- a/lib/utils/volume-control.hpp +++ b/lib/utils/volume-control.hpp @@ -1,4 +1,5 @@ #pragma once +#include "double-slider.hpp" #include #include @@ -284,7 +285,7 @@ private: QLabel *nameLabel; QLabel *volLabel; VolumeMeter *volMeter; - QSlider *slider; + DoubleSlider *slider; QPushButton *config = nullptr; float levelTotal; float levelCount; @@ -327,10 +328,10 @@ public: inline void SetContextMenu(QMenu *cm) { contextMenu = cm; } void refreshColors(); - QSlider *GetSlider() const { return slider; } + DoubleSlider *GetSlider() const { return slider; } }; -class VolumeSlider : public QSlider { +class VolumeSlider : public DoubleSlider { Q_OBJECT public: