diff options
Diffstat (limited to 'src/libaudqt/volumebutton.cc')
-rw-r--r-- | src/libaudqt/volumebutton.cc | 171 |
1 files changed, 95 insertions, 76 deletions
diff --git a/src/libaudqt/volumebutton.cc b/src/libaudqt/volumebutton.cc index 9455c55..8e6c5d9 100644 --- a/src/libaudqt/volumebutton.cc +++ b/src/libaudqt/volumebutton.cc @@ -1,6 +1,6 @@ /* * volumebutton.cc - * Copyright 2014 William Pitcock + * Copyright 2014 Ariadne Conill * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -28,142 +28,161 @@ #include <libaudcore/drct.h> #include <libaudcore/hook.h> +#include <libaudcore/runtime.h> -namespace audqt { +namespace audqt +{ class VolumeButton : public QToolButton { public: - VolumeButton (QWidget * parent = nullptr); + VolumeButton(QWidget * parent = nullptr); private: - void updateIcon (int val); - void updateVolume (); - void showSlider (); - void setVolume (int val); - QToolButton * newSliderButton (int delta); + void updateDelta(); + void updateIcon(int val); + void updateVolume(); + void showSlider(); + void setVolume(int val); + QToolButton * newSliderButton(int dir); - void wheelEvent (QWheelEvent * e); + void wheelEvent(QWheelEvent * e); QSlider * m_slider; QFrame * m_container; + int m_scroll_delta = 0; + + HookReceiver<VolumeButton> update_hook{"set volume_delta", this, + &VolumeButton::updateDelta}; }; -VolumeButton::VolumeButton (QWidget * parent) : - QToolButton (parent) +VolumeButton::VolumeButton(QWidget * parent) : QToolButton(parent) { - setFocusPolicy (Qt::NoFocus); + setFocusPolicy(Qt::NoFocus); + + m_container = new QFrame(this, Qt::Popup); + m_container->setFrameShape(QFrame::StyledPanel); - m_container = new QFrame (this, Qt::Popup); - m_container->setFrameShape (QFrame::StyledPanel); + m_slider = new QSlider(Qt::Vertical, this); + m_slider->setMinimumHeight(audqt::sizes.OneInch); + m_slider->setRange(0, 100); - m_slider = new QSlider (Qt::Vertical, this); - m_slider->setMinimumHeight (audqt::sizes.OneInch); - m_slider->setRange (0, 100); - m_slider->setSingleStep (2); - m_slider->setPageStep (20); + updateDelta(); - auto layout = make_vbox (m_container, sizes.TwoPt); - layout->setContentsMargins (margins.TwoPt); + auto layout = make_vbox(m_container, sizes.TwoPt); + layout->setContentsMargins(margins.TwoPt); - layout->addWidget (newSliderButton (5)); - layout->addWidget (m_slider); - layout->addWidget (newSliderButton (-5)); + layout->addWidget(newSliderButton(1)); + layout->addWidget(m_slider); + layout->addWidget(newSliderButton(-1)); - int val = aud_drct_get_volume_main (); - m_slider->setValue (val); - updateIcon (val); + int val = aud_drct_get_volume_main(); + m_slider->setValue(val); + updateIcon(val); - connect (this, & QAbstractButton::clicked, this, & VolumeButton::showSlider); - connect (m_slider, & QAbstractSlider::valueChanged, this, & VolumeButton::setVolume); + connect(this, &QAbstractButton::clicked, this, &VolumeButton::showSlider); + connect(m_slider, &QAbstractSlider::valueChanged, this, + &VolumeButton::setVolume); - auto timer = new Timer<VolumeButton> (TimerRate::Hz4, this, & VolumeButton::updateVolume); - connect (this, & QObject::destroyed, [timer] () { delete timer; }); + auto timer = new Timer<VolumeButton>(TimerRate::Hz4, this, + &VolumeButton::updateVolume); + connect(this, &QObject::destroyed, [timer]() { delete timer; }); - timer->start (); + timer->start(); } -void VolumeButton::updateIcon (int val) +void VolumeButton::updateDelta() +{ + int delta = aud_get_int("volume_delta"); + m_slider->setSingleStep(delta); + m_slider->setPageStep(delta); +} + +void VolumeButton::updateIcon(int val) { if (val == 0) - setIcon (audqt::get_icon ("audio-volume-muted")); + setIcon(audqt::get_icon("audio-volume-muted")); else if (val < 34) - setIcon (audqt::get_icon ("audio-volume-low")); + setIcon(audqt::get_icon("audio-volume-low")); else if (val < 67) - setIcon (audqt::get_icon ("audio-volume-medium")); + setIcon(audqt::get_icon("audio-volume-medium")); else - setIcon (audqt::get_icon ("audio-volume-high")); + setIcon(audqt::get_icon("audio-volume-high")); - setToolTip (QString ("%1 %").arg (val)); + setToolTip(QString("%1 %").arg(val)); } -void VolumeButton::updateVolume () +void VolumeButton::updateVolume() { - if (m_slider->isSliderDown ()) + if (m_slider->isSliderDown()) return; - int val = aud_drct_get_volume_main (); - if (val != m_slider->value ()) + int val = aud_drct_get_volume_main(); + if (val != m_slider->value()) { - disconnect (m_slider, nullptr, this, nullptr); - m_slider->setValue (val); - updateIcon (val); - connect (m_slider, & QAbstractSlider::valueChanged, this, & VolumeButton::setVolume); + disconnect(m_slider, nullptr, this, nullptr); + m_slider->setValue(val); + updateIcon(val); + connect(m_slider, &QAbstractSlider::valueChanged, this, + &VolumeButton::setVolume); } } -void VolumeButton::showSlider () +void VolumeButton::showSlider() { - QSize button_size = sizeHint (); - QSize container_size = m_container->sizeHint (); + QSize button_size = sizeHint(); + QSize container_size = m_container->sizeHint(); - int dx = container_size.width () / 2 - button_size.width () / 2; - int dy = container_size.height () / 2 - button_size.height () / 2; + int dx = container_size.width() / 2 - button_size.width() / 2; + int dy = container_size.height() / 2 - button_size.height() / 2; - QPoint pos = mapToGlobal (QPoint (0, 0)); - pos -= QPoint (dx, dy); + QPoint pos = mapToGlobal(QPoint(0, 0)); + pos -= QPoint(dx, dy); pos.setX(qMax(pos.x(), 0)); pos.setY(qMax(pos.y(), 0)); - m_container->move (pos); - window_bring_to_front (m_container); + m_container->move(pos); + window_bring_to_front(m_container); } -void VolumeButton::setVolume (int val) +void VolumeButton::setVolume(int val) { - aud_drct_set_volume_main (val); - updateIcon (val); + aud_drct_set_volume_main(val); + updateIcon(val); } -QToolButton * VolumeButton::newSliderButton (int delta) +QToolButton * VolumeButton::newSliderButton(int dir) { - auto button = new QToolButton (this); - button->setText (delta < 0 ? "-" : "+"); - button->setAutoRaise (true); - button->setSizePolicy (QSizePolicy::Ignored, QSizePolicy::Preferred); - - connect (button, & QAbstractButton::clicked, [this, delta] () { - int val = aud_drct_get_volume_main (); - m_slider->setValue (val + delta); + auto button = new QToolButton(this); + button->setText(dir < 0 ? "-" : "+"); + button->setAutoRaise(true); + button->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); + + connect(button, &QAbstractButton::clicked, [this, dir]() { + m_slider->setValue(m_slider->value() + + dir * aud_get_int("volume_delta")); }); return button; } -void VolumeButton::wheelEvent (QWheelEvent * e) +void VolumeButton::wheelEvent(QWheelEvent * e) { - int val = m_slider->value (); - int y = e->angleDelta ().y (); + m_scroll_delta += e->angleDelta().y(); - if (y < 0) - m_slider->setValue (-- val); - else - m_slider->setValue (++ val); + /* we want discrete steps here */ + int steps = m_scroll_delta / 120; + if (steps != 0) + { + m_scroll_delta -= 120 * steps; + m_slider->setValue(m_slider->value() + + steps * aud_get_int("volume_delta")); + } } -EXPORT QToolButton * volume_button_new (QWidget * parent) +EXPORT QToolButton * volume_button_new(QWidget * parent) { - return new VolumeButton (parent); + return new VolumeButton(parent); } } // namespace audqt |