Implemented wheel event for volume control in VolumeButton
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user