fix: adjust the slider to set the sound multiple times

log: add a timer to set once in 50 ms
This commit is contained in:
tsic404 2023-08-23 14:11:20 +08:00 committed by deepin-bot[bot]
parent 9f71814849
commit 5d87a44ac4
4 changed files with 18 additions and 1 deletions

View File

@ -26,6 +26,7 @@
#include <QtConcurrent> #include <QtConcurrent>
#include <QIcon> #include <QIcon>
#include <QPixmap> #include <QPixmap>
#include <QTimer>
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
@ -55,10 +56,13 @@ SoundDevicesWidget::SoundDevicesWidget(QWidget *parent)
, m_soundInter(new DBusAudio("org.deepin.dde.Audio1", "/org/deepin/dde/Audio1", QDBusConnection::sessionBus(), this)) , m_soundInter(new DBusAudio("org.deepin.dde.Audio1", "/org/deepin/dde/Audio1", QDBusConnection::sessionBus(), this))
, m_sinkInter(new DBusSink("org.deepin.dde.Audio1", m_soundInter->defaultSink().path(), QDBusConnection::sessionBus(), this)) , m_sinkInter(new DBusSink("org.deepin.dde.Audio1", m_soundInter->defaultSink().path(), QDBusConnection::sessionBus(), this))
, m_model(new QStandardItemModel(this)) , m_model(new QStandardItemModel(this))
, m_setVolumeTimer(new QTimer(this))
{ {
initUi(); initUi();
initConnection(); initConnection();
onAudioDevicesChanged(); onAudioDevicesChanged();
m_setVolumeTimer->setInterval(50);
m_setVolumeTimer->setSingleShot(true);
QMetaObject::invokeMethod(this, [ this ] { QMetaObject::invokeMethod(this, [ this ] {
deviceEnabled(m_ports.size() > 0); deviceEnabled(m_ports.size() > 0);
@ -208,13 +212,18 @@ void SoundDevicesWidget::initConnection()
m_sliderContainer->setRange(0, std::round(maxValue * 100.00)); m_sliderContainer->setRange(0, std::round(maxValue * 100.00));
emit iconChanged(); emit iconChanged();
}); });
connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [ this ](int value) { connect(m_setVolumeTimer, &QTimer::timeout, this, [=](){
int value = m_sliderContainer->getSliderValue();
m_sinkInter->SetVolume(value * 0.01, true); m_sinkInter->SetVolume(value * 0.01, true);
if (m_sinkInter->mute()) { if (m_sinkInter->mute()) {
m_sinkInter->SetMuteQueued(false); m_sinkInter->SetMuteQueued(false);
} }
emit iconChanged(); emit iconChanged();
}); });
connect(m_sliderContainer, &SliderContainer::sliderValueChanged, this, [=](int value) {
Q_UNUSED(value)
m_setVolumeTimer->start();
});
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [ = ] { connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [ = ] {
// 更新右icon左icon放在pixmap跟随refreshIcon一起更新 // 更新右icon左icon放在pixmap跟随refreshIcon一起更新

View File

@ -13,6 +13,7 @@
#include <QWidget> #include <QWidget>
#include <DGuiApplicationHelper> #include <DGuiApplicationHelper>
#include <QTimer>
namespace Dtk { namespace Widget { class DListView; } } namespace Dtk { namespace Widget { class DListView; } }
@ -91,6 +92,7 @@ private:
DBusSink *m_sinkInter; DBusSink *m_sinkInter;
QStandardItemModel *m_model; QStandardItemModel *m_model;
QList<SoundDevicePort *> m_ports; QList<SoundDevicePort *> m_ports;
QTimer *m_setVolumeTimer;
}; };
#endif // VOLUMEDEVICESWIDGET_H #endif // VOLUMEDEVICESWIDGET_H

View File

@ -193,6 +193,11 @@ void SliderContainer::updateSliderValue(int value)
m_slider->blockSignals(false); m_slider->blockSignals(false);
} }
int SliderContainer::getSliderValue()
{
return m_slider->value();
}
void SliderContainer::setSliderProxyStyle(QProxyStyle *proxyStyle) void SliderContainer::setSliderProxyStyle(QProxyStyle *proxyStyle)
{ {
proxyStyle->setParent(m_slider); proxyStyle->setParent(m_slider);

View File

@ -41,6 +41,7 @@ public:
void setPageStep(int step); void setPageStep(int step);
void setRange(int min, int max); void setRange(int min, int max);
int getSliderValue();
Q_SIGNALS: Q_SIGNALS:
void iconClicked(const IconPosition &); void iconClicked(const IconPosition &);