Qt: Fix resolution dropdown if resolution flags of game are empty

Fixes custom config creation error for games that have no resolution.
Fixes empty dropdowns if resolution flags are 0 by adding all resolutions.
Make sure to keep 720p as option if the dropdown would be empty after all.
This commit is contained in:
Megamouse 2024-07-22 22:38:38 +02:00
parent c533dc969d
commit 82de139be5
4 changed files with 25 additions and 5 deletions

View file

@ -51,9 +51,9 @@ namespace cfg_adapter
QStringList get_options(const cfg_location& location)
{
QStringList values;
for (const auto& v : cfg_adapter::get_cfg(g_cfg, location.cbegin(), location.cend()).to_list())
for (const std::string& value : cfg_adapter::get_cfg(g_cfg, location.cbegin(), location.cend()).to_list())
{
values.append(QString::fromStdString(v));
values.append(QString::fromStdString(value));
}
return values;
}

View file

@ -275,7 +275,7 @@ void emu_settings::RestoreDefaults()
Q_EMIT RestoreDefaultsSignal();
}
void emu_settings::SaveSettings()
void emu_settings::SaveSettings() const
{
YAML::Emitter out;
emit_data(out, m_current_settings);
@ -1345,6 +1345,7 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_
case xfloat_accuracy::relaxed: return tr("Relaxed XFloat");
case xfloat_accuracy::inaccurate: return tr("Inaccurate XFloat");
}
break;
default:
break;
}

View file

@ -104,7 +104,7 @@ Q_SIGNALS:
public Q_SLOTS:
/** Writes the unsaved settings to file. Used in settings dialog on accept.*/
void SaveSettings();
void SaveSettings() const;
private:
YAML::Node m_default_settings; // The default settings as a YAML node.

View file

@ -479,6 +479,7 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
};
const int saved_index = ui->resBox->currentIndex();
bool remove_720p = false;
for (int i = ui->resBox->count() - 1; i >= 0; i--)
{
@ -489,18 +490,36 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
const bool is_interlaced = (resolution == video_resolution::_1080i ||
resolution == video_resolution::_480i ||
resolution == video_resolution::_576i);
const bool supported_by_game = !game || (game && game->resolution > 0 && resolutions.contains(resolution) && (game->resolution & resolutions.at(resolution)));
const bool supported_by_game = !game || !game->resolution || (resolutions.contains(resolution) && (game->resolution & resolutions.at(resolution)));
if (!supported_by_game || is_interlaced)
{
// Don't remove 720p yet. We may need it as fallback if no other resolution is supported.
if (resolution == video_resolution::_720p)
{
remove_720p = true;
continue;
}
ui->resBox->removeItem(i);
if (i == saved_index)
{
saved_index_removed = true;
}
}
}
// Remove 720p if unsupported unless it's the only option
if (remove_720p && ui->resBox->count() > 1)
{
if (const int index = find_item(ui->resBox, static_cast<int>(video_resolution::_720p)); index >= 0)
{
ui->resBox->removeItem(index);
}
}
}
for (int i = 0; i < ui->resBox->count(); i++)
{
const auto [text, value] = get_data(ui->resBox, i);