diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-10-30 20:32:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-30 20:32:39 +0100 |
commit | 5e69769356c7667fc5c66b60207c6c5b79e53ed3 (patch) | |
tree | 14313f84874976c3c6c4371db2df4cc66d5d7935 | |
parent | Merge pull request #11728 from liushuyu/update-deps (diff) | |
parent | Implemented wheel event for volume control in VolumeButton (diff) | |
download | yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar.gz yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar.bz2 yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar.lz yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar.xz yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.tar.zst yuzu-5e69769356c7667fc5c66b60207c6c5b79e53ed3.zip |
-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 9eafacea7..0df163029 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; |