diff options
| -rw-r--r-- | src/yuzu/main.cpp | 30 | ||||
| -rw-r--r-- | src/yuzu/main.h | 25 | 
2 files changed, 53 insertions, 2 deletions
| diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 1431cf2fe..5e687891f 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1072,7 +1072,7 @@ void GMainWindow::InitializeWidgets() {      });      volume_popup->layout()->addWidget(volume_slider); -    volume_button = new QPushButton(); +    volume_button = new VolumeButton();      volume_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));      volume_button->setFocusPolicy(Qt::NoFocus);      volume_button->setCheckable(true); @@ -1103,6 +1103,8 @@ void GMainWindow::InitializeWidgets() {                  context_menu.exec(volume_button->mapToGlobal(menu_location));                  volume_button->repaint();              }); +    connect(volume_button, &VolumeButton::VolumeChanged, this, &GMainWindow::UpdateVolumeUI); +      statusBar()->insertPermanentWidget(0, volume_button);      // setup AA button @@ -5126,6 +5128,32 @@ void GMainWindow::changeEvent(QEvent* event) {      QWidget::changeEvent(event);  } +void VolumeButton::wheelEvent(QWheelEvent* event) { + +    int num_degrees = event->angleDelta().y() / 8; +    int num_steps = (num_degrees / 15) * scroll_multiplier; +    // Stated in QT docs: Most mouse types work in steps of 15 degrees, in which case the delta +    // value is a multiple of 120; i.e., 120 units * 1/8 = 15 degrees. + +    if (num_steps > 0) { +        Settings::values.volume.SetValue( +            std::min(200, Settings::values.volume.GetValue() + num_steps)); +    } else { +        Settings::values.volume.SetValue( +            std::max(0, Settings::values.volume.GetValue() + num_steps)); +    } + +    scroll_multiplier = std::min(MaxMultiplier, scroll_multiplier * 2); +    scroll_timer.start(100); // reset the multiplier if no scroll event occurs within 100 ms + +    emit VolumeChanged(); +    event->accept(); +} + +void VolumeButton::ResetMultiplier() { +    scroll_multiplier = 1; +} +  #ifdef main  #undef main  #endif diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 270a40c5f..f9c6efe4f 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -8,6 +8,7 @@  #include <QMainWindow>  #include <QMessageBox> +#include <QPushButton>  #include <QTimer>  #include <QTranslator> @@ -137,6 +138,28 @@ namespace VkDeviceInfo {  class Record;  } +class VolumeButton : public QPushButton { +    Q_OBJECT +public: +    explicit VolumeButton(QWidget* parent = nullptr) : QPushButton(parent), scroll_multiplier(1) { +        connect(&scroll_timer, &QTimer::timeout, this, &VolumeButton::ResetMultiplier); +    } + +signals: +    void VolumeChanged(); + +protected: +    void wheelEvent(QWheelEvent* event) override; + +private slots: +    void ResetMultiplier(); + +private: +    int scroll_multiplier; +    QTimer scroll_timer; +    constexpr static int MaxMultiplier = 8; +}; +  class GMainWindow : public QMainWindow {      Q_OBJECT @@ -481,7 +504,7 @@ private:      QPushButton* dock_status_button = nullptr;      QPushButton* filter_status_button = nullptr;      QPushButton* aa_status_button = nullptr; -    QPushButton* volume_button = nullptr; +    VolumeButton* volume_button = nullptr;      QWidget* volume_popup = nullptr;      QSlider* volume_slider = nullptr;      QTimer status_bar_update_timer; | 
