Implemented wheel event for volume control in VolumeButton

This commit is contained in:
FrozenAra 2023-10-29 02:46:25 +02:00
parent 43be2bfe33
commit 0bb1c7c804
2 changed files with 53 additions and 2 deletions

View File

@ -1072,7 +1072,7 @@ void GMainWindow::InitializeWidgets() {
}); });
volume_popup->layout()->addWidget(volume_slider); volume_popup->layout()->addWidget(volume_slider);
volume_button = new QPushButton(); volume_button = new VolumeButton();
volume_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); volume_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
volume_button->setFocusPolicy(Qt::NoFocus); volume_button->setFocusPolicy(Qt::NoFocus);
volume_button->setCheckable(true); volume_button->setCheckable(true);
@ -1103,6 +1103,8 @@ void GMainWindow::InitializeWidgets() {
context_menu.exec(volume_button->mapToGlobal(menu_location)); context_menu.exec(volume_button->mapToGlobal(menu_location));
volume_button->repaint(); volume_button->repaint();
}); });
connect(volume_button, &VolumeButton::VolumeChanged, this, &GMainWindow::UpdateVolumeUI);
statusBar()->insertPermanentWidget(0, volume_button); statusBar()->insertPermanentWidget(0, volume_button);
// setup AA button // setup AA button
@ -5126,6 +5128,32 @@ void GMainWindow::changeEvent(QEvent* event) {
QWidget::changeEvent(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 #ifdef main
#undef main #undef main
#endif #endif

View File

@ -8,6 +8,7 @@
#include <QMainWindow> #include <QMainWindow>
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton>
#include <QTimer> #include <QTimer>
#include <QTranslator> #include <QTranslator>
@ -137,6 +138,28 @@ namespace VkDeviceInfo {
class Record; 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 { class GMainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
@ -481,7 +504,7 @@ private:
QPushButton* dock_status_button = nullptr; QPushButton* dock_status_button = nullptr;
QPushButton* filter_status_button = nullptr; QPushButton* filter_status_button = nullptr;
QPushButton* aa_status_button = nullptr; QPushButton* aa_status_button = nullptr;
QPushButton* volume_button = nullptr; VolumeButton* volume_button = nullptr;
QWidget* volume_popup = nullptr; QWidget* volume_popup = nullptr;
QSlider* volume_slider = nullptr; QSlider* volume_slider = nullptr;
QTimer status_bar_update_timer; QTimer status_bar_update_timer;