Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Qt: Fix SnapSlider in settings #10933

Merged
merged 1 commit into from Sep 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 22 additions & 9 deletions rpcs3/rpcs3qt/settings_dialog.cpp
Expand Up @@ -1869,24 +1869,25 @@ void settings_dialog::EnhanceSlider(emu_settings_type settings_type, QSlider* sl

void settings_dialog::SnapSlider(QSlider *slider, int interval)
{
connect(slider, &QSlider::sliderPressed, [this, slider]()
if (!slider)
{
m_current_slider = slider;
});

connect(slider, &QSlider::sliderReleased, [this]()
{
m_current_slider = nullptr;
});
return;
}

// Snap the slider to the next best interval position if the slider is currently modified with the mouse.
connect(slider, &QSlider::valueChanged, [this, slider, interval](int value)
{
if (slider != m_current_slider)
if (!slider || slider != m_current_slider)
{
return;
}
slider->setValue(utils::rounded_div(value, interval) * interval);
});

// Register the slider for the event filter which updates m_current_slider if a QSlider was pressed or released with the mouse.
// We can't just use sliderPressed and sliderReleased signals to update m_current_slider because those only trigger if the handle was clicked.
slider->installEventFilter(this);
m_snap_sliders.insert(slider);
}

void settings_dialog::AddStylesheets()
Expand Down Expand Up @@ -1987,6 +1988,18 @@ void settings_dialog::SubscribeTooltip(QObject* object, const QString& tooltip)
// Thanks Dolphin
bool settings_dialog::eventFilter(QObject* object, QEvent* event)
{
if (m_snap_sliders.contains(object))
{
if (event->type() == QEvent::MouseButtonPress)
{
m_current_slider = static_cast<QSlider*>(object);
}
else if (event->type() == QEvent::MouseButtonRelease)
{
m_current_slider = nullptr;
}
}

if (!m_descriptions.contains(object))
{
return QDialog::eventFilter(object, event);
Expand Down
1 change: 1 addition & 0 deletions rpcs3/rpcs3qt/settings_dialog.h
Expand Up @@ -34,6 +34,7 @@ class settings_dialog : public QDialog
// Snapping of sliders when moved with mouse
void SnapSlider(QSlider* slider, int interval);
QSlider* m_current_slider = nullptr;
std::set<QObject*> m_snap_sliders;

// Gui tab
void AddStylesheets();
Expand Down