mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
Increase precision of volume widget slider
This commit is contained in:
parent
132d89b350
commit
bcf7c247bf
|
|
@ -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
|
||||
|
|
|
|||
63
lib/utils/double-slider.cpp
Normal file
63
lib/utils/double-slider.cpp
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
#include "double-slider.hpp"
|
||||
#include <QWheelEvent>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
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
|
||||
40
lib/utils/double-slider.hpp
Normal file
40
lib/utils/double-slider.hpp
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// Based on OBS DoubleSlider and SliderIgnoreScroll implementation
|
||||
|
||||
#pragma once
|
||||
#include "export-symbol-helper.hpp"
|
||||
|
||||
#include <QSlider>
|
||||
|
||||
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
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#pragma once
|
||||
#include "double-slider.hpp"
|
||||
|
||||
#include <obs.hpp>
|
||||
#include <QWidget>
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user