mirror of https://github.com/stenzek/duckstation
BIOS: Automatically detect images, improve selection UI
parent
3385346b7f
commit
7d01bedf07
@ -0,0 +1,123 @@
|
|||||||
|
#include "biossettingswidget.h"
|
||||||
|
#include "core/bios.h"
|
||||||
|
#include "qthostinterface.h"
|
||||||
|
#include "settingsdialog.h"
|
||||||
|
#include "settingwidgetbinder.h"
|
||||||
|
#include <QtWidgets/QFileDialog>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
static void populateDropDownForRegion(ConsoleRegion region, QComboBox* cb,
|
||||||
|
std::vector<std::pair<std::string, const BIOS::ImageInfo*>>& images)
|
||||||
|
{
|
||||||
|
cb->addItem(QIcon(QStringLiteral(":/icons/system-search.png")),
|
||||||
|
QT_TRANSLATE_NOOP("BIOSSettingsWidget", "Auto-Detect"));
|
||||||
|
|
||||||
|
std::sort(images.begin(), images.end(), [region](const auto& left, const auto& right) {
|
||||||
|
const bool left_region_match = (left.second && left.second->region == region);
|
||||||
|
const bool right_region_match = (right.second && right.second->region == region);
|
||||||
|
if (left_region_match && !right_region_match)
|
||||||
|
return true;
|
||||||
|
else if (right_region_match && left_region_match)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return left.first < right.first;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const auto& [name, info] : images)
|
||||||
|
{
|
||||||
|
QIcon icon;
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
switch (info->region)
|
||||||
|
{
|
||||||
|
case ConsoleRegion::NTSC_J:
|
||||||
|
icon = QIcon(QStringLiteral(":/icons/flag-jp.png"));
|
||||||
|
break;
|
||||||
|
case ConsoleRegion::PAL:
|
||||||
|
icon = QIcon(QStringLiteral(":/icons/flag-eu.png"));
|
||||||
|
break;
|
||||||
|
case ConsoleRegion::NTSC_U:
|
||||||
|
icon = QIcon(QStringLiteral(":/icons/flag-uc.png"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
icon = QIcon(QStringLiteral(":/icons/applications-other.png"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
icon = QIcon(QStringLiteral(":/icons/applications-other.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString name_str(QString::fromStdString(name));
|
||||||
|
cb->addItem(icon,
|
||||||
|
QStringLiteral("%1 (%2)")
|
||||||
|
.arg(info ? QString(info->description) : qApp->translate("BIOSSettingsWidget", "Unknown"))
|
||||||
|
.arg(name_str),
|
||||||
|
QVariant(name_str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setDropDownValue(QComboBox* cb, const std::string& name)
|
||||||
|
{
|
||||||
|
QSignalBlocker sb(cb);
|
||||||
|
|
||||||
|
if (name.empty())
|
||||||
|
{
|
||||||
|
cb->setCurrentIndex(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString qname(QString::fromStdString(name));
|
||||||
|
for (int i = 1; i < cb->count(); i++)
|
||||||
|
{
|
||||||
|
if (cb->itemData(i) == qname)
|
||||||
|
{
|
||||||
|
cb->setCurrentIndex(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cb->addItem(qname, QVariant(qname));
|
||||||
|
cb->setCurrentIndex(cb->count() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BIOSSettingsWidget::BIOSSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog)
|
||||||
|
: QWidget(parent), m_host_interface(host_interface)
|
||||||
|
{
|
||||||
|
m_ui.setupUi(this);
|
||||||
|
|
||||||
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.enableTTYOutput, "BIOS", "PatchTTYEnable");
|
||||||
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.fastBoot, "BIOS", "PatchFastBoot");
|
||||||
|
|
||||||
|
dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Unchecked"),
|
||||||
|
tr("Patches the BIOS to skip the console's boot animation. Does not work with all games, "
|
||||||
|
"but usually safe to enabled."));
|
||||||
|
|
||||||
|
auto images = m_host_interface->FindBIOSImagesInUserDirectory();
|
||||||
|
populateDropDownForRegion(ConsoleRegion::NTSC_J, m_ui.imageNTSCJ, images);
|
||||||
|
populateDropDownForRegion(ConsoleRegion::NTSC_U, m_ui.imageNTSCU, images);
|
||||||
|
populateDropDownForRegion(ConsoleRegion::PAL, m_ui.imagePAL, images);
|
||||||
|
|
||||||
|
setDropDownValue(m_ui.imageNTSCJ, m_host_interface->GetStringSettingValue("BIOS", "PathNTSCJ", ""));
|
||||||
|
setDropDownValue(m_ui.imageNTSCU, m_host_interface->GetStringSettingValue("BIOS", "PathNTSCU", ""));
|
||||||
|
setDropDownValue(m_ui.imagePAL, m_host_interface->GetStringSettingValue("BIOS", "PathPAL", ""));
|
||||||
|
|
||||||
|
connect(m_ui.imageNTSCJ, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index) {
|
||||||
|
m_host_interface->SetStringSettingValue("BIOS", "PathNTSCJ",
|
||||||
|
m_ui.imageNTSCJ->itemData(index).toString().toStdString().c_str());
|
||||||
|
m_host_interface->applySettings();
|
||||||
|
});
|
||||||
|
connect(m_ui.imageNTSCU, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index) {
|
||||||
|
m_host_interface->SetStringSettingValue("BIOS", "PathNTSCU",
|
||||||
|
m_ui.imageNTSCU->itemData(index).toString().toStdString().c_str());
|
||||||
|
m_host_interface->applySettings();
|
||||||
|
});
|
||||||
|
connect(m_ui.imagePAL, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index) {
|
||||||
|
m_host_interface->SetStringSettingValue("BIOS", "PathPAL",
|
||||||
|
m_ui.imagePAL->itemData(index).toString().toStdString().c_str());
|
||||||
|
m_host_interface->applySettings();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
BIOSSettingsWidget::~BIOSSettingsWidget() = default;
|
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "core/types.h"
|
||||||
|
#include <QtWidgets/QWidget>
|
||||||
|
|
||||||
|
#include "ui_biossettingswidget.h"
|
||||||
|
|
||||||
|
class QtHostInterface;
|
||||||
|
class SettingsDialog;
|
||||||
|
|
||||||
|
class BIOSSettingsWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit BIOSSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog);
|
||||||
|
~BIOSSettingsWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::BIOSSettingsWidget m_ui;
|
||||||
|
|
||||||
|
QtHostInterface* m_host_interface;
|
||||||
|
};
|
@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>BIOSSettingsWidget</class>
|
||||||
|
<widget class="QWidget" name="BIOSSettingsWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>472</width>
|
||||||
|
<height>259</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>BIOS Selection</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>NTSC-J (Japan):</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="imageNTSCJ">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>NTSC-U/C (US/Canada):</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="imageNTSCU">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>PAL (Europe, Australia):</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="imagePAL">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="title">
|
||||||
|
<string>Options and Patches</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="fastBoot">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast Boot</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="enableTTYOutput">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable TTY Output</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
Loading…
Reference in New Issue