mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 02:34:11 +01:00 
			
		
		
		
	Merge pull request #11903 from Macj0rdan/scrollable-volume-button
Implemented wheel event for volume control in VolumeButton
This commit is contained in:
		
						commit
						5e69769356
					
				| @ -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 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user