Skip to content

Commit

Permalink
Qt, Config controls system: Remove signal block so signals can refres…
Browse files Browse the repository at this point in the history
…h the enabled status of certain options when a new config is loaded (such as on starting a game). Blocks previously unwanted behavior with a new safety check.

QCheckBox::toggled and other similar signals are used to save changes and to update widget status (such as enabled).. OnConfigChanged needs to load new values and trigger widget updates, but the new value shouldn't trigger a save. A save is unnecessary (the config has the correct values and the UI is being updated to those values) and it'd trigger another ConfigChanged signal.   This commit blocks the save without blocking the signal entirely.
  • Loading branch information
TryTwo committed Jan 7, 2025
1 parent b8921b1 commit 5395f21
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ void ConfigStringChoice::Load()
const int index = m_text_is_data ? findText(setting_value) : findData(setting_value);

// This can be called publicly.
const QSignalBlocker block(this);
setCurrentIndex(index);
}

Expand Down Expand Up @@ -145,6 +144,7 @@ void ConfigComplexChoice::UpdateComboIndex()
auto it = std::find(m_options.begin(), m_options.end(), values);
int index = static_cast<int>(std::distance(m_options.begin(), it));

// Will crash if not blocked
const QSignalBlocker blocker(this);
setCurrentIndex(index);
}
Expand Down
11 changes: 9 additions & 2 deletions Source/Core/DolphinQt/Config/ConfigControls/ConfigControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#include <QFont>
#include <QMouseEvent>
#include <QSignalBlocker>

#include "Common/Config/Enums.h"
#include "Common/Config/Layer.h"
Expand Down Expand Up @@ -49,14 +48,21 @@ class ConfigControl : public Derived
bf.setBold(IsConfigLocal());
Derived::setFont(bf);

const QSignalBlocker blocker(this);
// This isn't signal blocked because the UI may need to be updated.
m_updating = true;
OnConfigChanged();
m_updating = false;
});
}

template <typename T>
void SaveValue(const Config::Info<T>& setting, const T& value)
{
// Avoid OnConfigChanged -> option changed to current config's value -> unnecessary save ->
// ConfigChanged.
if (m_updating)
return;

if (m_layer != nullptr)
{
m_layer->Set(m_location, value);
Expand Down Expand Up @@ -100,6 +106,7 @@ class ConfigControl : public Derived
}
}

bool m_updating = false;
const Config::Location m_location;
Config::Layer* m_layer;
};
5 changes: 4 additions & 1 deletion Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,10 @@ void GeneralWidget::OnEmulationStateChanged(bool running)
std::string current_backend = m_backend_combo->currentData().toString().toStdString();
if (Config::Get(Config::MAIN_GFX_BACKEND) != current_backend)
{
m_backend_combo->Load();
{
const QSignalBlocker blocker(m_backend_combo);
m_backend_combo->Load();
}
emit BackendChanged(QString::fromStdString(Config::Get(Config::MAIN_GFX_BACKEND)));
}
}
Expand Down

0 comments on commit 5395f21

Please sign in to comment.