dolphin/Source/Core/DolphinQt/Settings/GameCubePane.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

549 lines
19 KiB
C++
Raw Normal View History

2018-01-04 01:41:31 +01:00
// Copyright 2018 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2018-01-04 01:41:31 +01:00
2018-07-07 00:40:15 +02:00
#include "DolphinQt/Settings/GameCubePane.h"
2018-01-04 01:41:31 +01:00
#include <QCheckBox>
#include <QComboBox>
#include <QFileDialog>
#include <QFileInfo>
#include <QFormLayout>
2018-01-04 01:41:31 +01:00
#include <QGridLayout>
#include <QGroupBox>
#include <QInputDialog>
2018-01-04 01:41:31 +01:00
#include <QLabel>
2021-07-04 12:53:53 +02:00
#include <QLineEdit>
2018-01-04 01:41:31 +01:00
#include <QPushButton>
#include <QVBoxLayout>
#include <array>
#include <utility>
2022-01-11 21:25:17 +01:00
#include "Common/Assert.h"
2018-01-04 01:41:31 +01:00
#include "Common/CommonPaths.h"
#include "Common/Config/Config.h"
2018-01-04 01:41:31 +01:00
#include "Common/FileUtil.h"
2021-07-04 12:53:53 +02:00
#include "Common/MsgHandler.h"
2018-05-28 03:48:04 +02:00
#include "Core/Config/MainSettings.h"
2018-01-04 01:41:31 +01:00
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/HW/EXI/EXI.h"
#include "Core/HW/GCMemcard/GCMemcard.h"
2021-07-04 12:53:53 +02:00
#include "Core/NetPlayServer.h"
2018-05-28 03:48:04 +02:00
2018-07-07 00:40:15 +02:00
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/GCMemcardManager.h"
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
2019-03-04 20:49:00 +01:00
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
2021-07-04 12:53:53 +02:00
#include "DolphinQt/Settings.h"
#include "DolphinQt/Settings/BroadbandAdapterSettingsDialog.h"
2018-01-04 01:41:31 +01:00
enum
{
SLOT_A_INDEX,
SLOT_B_INDEX,
SLOT_SP1_INDEX,
SLOT_COUNT
};
2018-01-04 01:41:31 +01:00
GameCubePane::GameCubePane()
{
CreateWidgets();
LoadSettings();
ConnectWidgets();
2018-01-04 01:41:31 +01:00
}
void GameCubePane::CreateWidgets()
{
2020-08-17 09:07:38 +02:00
using ExpansionInterface::EXIDeviceType;
QVBoxLayout* layout = new QVBoxLayout(this);
2018-01-04 01:41:31 +01:00
// IPL Settings
QGroupBox* ipl_box = new QGroupBox(tr("IPL Settings"), this);
QVBoxLayout* ipl_box_layout = new QVBoxLayout(ipl_box);
ipl_box->setLayout(ipl_box_layout);
2018-01-04 01:41:31 +01:00
m_skip_main_menu = new QCheckBox(tr("Skip Main Menu"), ipl_box);
ipl_box_layout->addWidget(m_skip_main_menu);
QFormLayout* ipl_language_layout = new QFormLayout;
ipl_language_layout->setFormAlignment(Qt::AlignLeft | Qt::AlignTop);
ipl_language_layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
ipl_box_layout->addLayout(ipl_language_layout);
m_language_combo = new QComboBox(ipl_box);
m_language_combo->setCurrentIndex(-1);
ipl_language_layout->addRow(tr("System Language:"), m_language_combo);
2018-01-04 01:41:31 +01:00
// Add languages
for (const auto& entry : {std::make_pair(tr("English"), 0), std::make_pair(tr("German"), 1),
std::make_pair(tr("French"), 2), std::make_pair(tr("Spanish"), 3),
std::make_pair(tr("Italian"), 4), std::make_pair(tr("Dutch"), 5)})
{
m_language_combo->addItem(entry.first, entry.second);
}
2018-01-04 01:41:31 +01:00
// Device Settings
QGroupBox* device_box = new QGroupBox(tr("Device Settings"), this);
QGridLayout* device_layout = new QGridLayout(device_box);
2018-01-04 01:41:31 +01:00
device_box->setLayout(device_layout);
2022-01-11 21:25:17 +01:00
for (ExpansionInterface::Slot slot : ExpansionInterface::SLOTS)
{
2022-01-11 21:25:17 +01:00
m_slot_combos[slot] = new QComboBox(device_box);
m_slot_combos[slot]->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
m_slot_buttons[slot] = new NonDefaultQPushButton(tr("..."), device_box);
2022-01-11 21:25:17 +01:00
m_slot_buttons[slot]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
}
2018-01-04 01:41:31 +01:00
// Add slot devices
for (const auto device : {EXIDeviceType::None, EXIDeviceType::Dummy, EXIDeviceType::MemoryCard,
EXIDeviceType::MemoryCardFolder, EXIDeviceType::Gecko,
EXIDeviceType::AGP, EXIDeviceType::Microphone})
2018-01-04 01:41:31 +01:00
{
const QString name = tr(fmt::format("{:n}", device).c_str());
const int value = static_cast<int>(device);
2022-01-11 21:25:17 +01:00
m_slot_combos[ExpansionInterface::Slot::A]->addItem(name, value);
m_slot_combos[ExpansionInterface::Slot::B]->addItem(name, value);
2018-01-04 01:41:31 +01:00
}
// Add SP1 devices
for (const auto device : {
EXIDeviceType::None,
EXIDeviceType::Dummy,
EXIDeviceType::Ethernet,
EXIDeviceType::EthernetXLink,
#ifdef __APPLE__
EXIDeviceType::EthernetTapServer,
#endif
})
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
m_slot_combos[ExpansionInterface::Slot::SP1]->addItem(tr(fmt::format("{:n}", device).c_str()),
static_cast<int>(device));
2018-01-04 01:41:31 +01:00
}
device_layout->addWidget(new QLabel(tr("Slot A:")), 0, 0);
2022-01-11 21:25:17 +01:00
device_layout->addWidget(m_slot_combos[ExpansionInterface::Slot::A], 0, 1);
device_layout->addWidget(m_slot_buttons[ExpansionInterface::Slot::A], 0, 2);
2018-01-04 01:41:31 +01:00
device_layout->addWidget(new QLabel(tr("Slot B:")), 1, 0);
2022-01-11 21:25:17 +01:00
device_layout->addWidget(m_slot_combos[ExpansionInterface::Slot::B], 1, 1);
device_layout->addWidget(m_slot_buttons[ExpansionInterface::Slot::B], 1, 2);
2018-01-04 01:41:31 +01:00
device_layout->addWidget(new QLabel(tr("SP1:")), 2, 0);
2022-01-11 21:25:17 +01:00
device_layout->addWidget(m_slot_combos[ExpansionInterface::Slot::SP1], 2, 1);
device_layout->addWidget(m_slot_buttons[ExpansionInterface::Slot::SP1], 2, 2);
2018-01-04 01:41:31 +01:00
2021-07-04 12:53:53 +02:00
#ifdef HAS_LIBMGBA
// GBA Settings
auto* gba_box = new QGroupBox(tr("GBA Settings"), this);
auto* gba_layout = new QGridLayout(gba_box);
gba_box->setLayout(gba_layout);
int gba_row = 0;
m_gba_threads = new QCheckBox(tr("Run GBA Cores in Dedicated Threads"));
gba_layout->addWidget(m_gba_threads, gba_row, 0, 1, -1);
gba_row++;
m_gba_bios_edit = new QLineEdit();
m_gba_browse_bios = new NonDefaultQPushButton(QStringLiteral("..."));
2021-07-04 12:53:53 +02:00
gba_layout->addWidget(new QLabel(tr("BIOS:")), gba_row, 0);
gba_layout->addWidget(m_gba_bios_edit, gba_row, 1);
gba_layout->addWidget(m_gba_browse_bios, gba_row, 2);
gba_row++;
for (size_t i = 0; i < m_gba_rom_edits.size(); ++i)
{
m_gba_rom_edits[i] = new QLineEdit();
m_gba_browse_roms[i] = new NonDefaultQPushButton(QStringLiteral("..."));
2021-07-04 12:53:53 +02:00
gba_layout->addWidget(new QLabel(tr("Port %1 ROM:").arg(i + 1)), gba_row, 0);
gba_layout->addWidget(m_gba_rom_edits[i], gba_row, 1);
gba_layout->addWidget(m_gba_browse_roms[i], gba_row, 2);
gba_row++;
}
m_gba_save_rom_path = new QCheckBox(tr("Save in Same Directory as the ROM"));
gba_layout->addWidget(m_gba_save_rom_path, gba_row, 0, 1, -1);
gba_row++;
m_gba_saves_edit = new QLineEdit();
m_gba_browse_saves = new NonDefaultQPushButton(QStringLiteral("..."));
2021-07-04 12:53:53 +02:00
gba_layout->addWidget(new QLabel(tr("Saves:")), gba_row, 0);
gba_layout->addWidget(m_gba_saves_edit, gba_row, 1);
gba_layout->addWidget(m_gba_browse_saves, gba_row, 2);
gba_row++;
#endif
2018-01-04 01:41:31 +01:00
layout->addWidget(ipl_box);
layout->addWidget(device_box);
2021-07-04 12:53:53 +02:00
#ifdef HAS_LIBMGBA
layout->addWidget(gba_box);
#endif
2018-01-04 01:41:31 +01:00
2018-03-24 18:18:17 +01:00
layout->addStretch();
2018-01-04 01:41:31 +01:00
setLayout(layout);
}
void GameCubePane::ConnectWidgets()
{
// IPL Settings
connect(m_skip_main_menu, &QCheckBox::stateChanged, this, &GameCubePane::SaveSettings);
connect(m_language_combo, qOverload<int>(&QComboBox::currentIndexChanged), this,
&GameCubePane::SaveSettings);
2018-01-04 01:41:31 +01:00
// Device Settings
2022-01-11 21:25:17 +01:00
for (ExpansionInterface::Slot slot : ExpansionInterface::SLOTS)
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
connect(m_slot_combos[slot], qOverload<int>(&QComboBox::currentIndexChanged), this,
[this, slot] { UpdateButton(slot); });
connect(m_slot_combos[slot], qOverload<int>(&QComboBox::currentIndexChanged), this,
2018-01-04 01:41:31 +01:00
&GameCubePane::SaveSettings);
2022-01-11 21:25:17 +01:00
connect(m_slot_buttons[slot], &QPushButton::clicked, [this, slot] { OnConfigPressed(slot); });
}
2021-07-04 12:53:53 +02:00
#ifdef HAS_LIBMGBA
// GBA Settings
connect(m_gba_threads, &QCheckBox::stateChanged, this, &GameCubePane::SaveSettings);
connect(m_gba_bios_edit, &QLineEdit::editingFinished, this, &GameCubePane::SaveSettings);
connect(m_gba_browse_bios, &QPushButton::clicked, this, &GameCubePane::BrowseGBABios);
connect(m_gba_save_rom_path, &QCheckBox::stateChanged, this, &GameCubePane::SaveRomPathChanged);
connect(m_gba_saves_edit, &QLineEdit::editingFinished, this, &GameCubePane::SaveSettings);
connect(m_gba_browse_saves, &QPushButton::clicked, this, &GameCubePane::BrowseGBASaves);
for (size_t i = 0; i < m_gba_browse_roms.size(); ++i)
{
connect(m_gba_rom_edits[i], &QLineEdit::editingFinished, this, &GameCubePane::SaveSettings);
connect(m_gba_browse_roms[i], &QPushButton::clicked, this, [this, i] { BrowseGBARom(i); });
}
#endif
// Emulation State
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
&GameCubePane::OnEmulationStateChanged);
OnEmulationStateChanged();
}
void GameCubePane::OnEmulationStateChanged()
{
#ifdef HAS_LIBMGBA
bool gba_enabled = !NetPlay::IsNetPlayRunning();
m_gba_threads->setEnabled(gba_enabled);
m_gba_bios_edit->setEnabled(gba_enabled);
m_gba_browse_bios->setEnabled(gba_enabled);
m_gba_save_rom_path->setEnabled(gba_enabled);
m_gba_saves_edit->setEnabled(gba_enabled);
m_gba_browse_saves->setEnabled(gba_enabled);
for (size_t i = 0; i < m_gba_browse_roms.size(); ++i)
{
m_gba_rom_edits[i]->setEnabled(gba_enabled);
m_gba_browse_roms[i]->setEnabled(gba_enabled);
}
#endif
}
2022-01-11 21:25:17 +01:00
void GameCubePane::UpdateButton(ExpansionInterface::Slot slot)
{
2020-08-17 09:07:38 +02:00
const auto device =
static_cast<ExpansionInterface::EXIDeviceType>(m_slot_combos[slot]->currentData().toInt());
bool has_config = false;
switch (slot)
{
2022-01-11 21:25:17 +01:00
case ExpansionInterface::Slot::A:
case ExpansionInterface::Slot::B:
2020-08-17 09:07:38 +02:00
has_config = (device == ExpansionInterface::EXIDeviceType::MemoryCard ||
device == ExpansionInterface::EXIDeviceType::AGP ||
device == ExpansionInterface::EXIDeviceType::Microphone);
break;
2022-01-11 21:25:17 +01:00
case ExpansionInterface::Slot::SP1:
2020-08-17 09:07:38 +02:00
has_config = (device == ExpansionInterface::EXIDeviceType::Ethernet ||
device == ExpansionInterface::EXIDeviceType::EthernetXLink);
break;
2018-01-04 01:41:31 +01:00
}
m_slot_buttons[slot]->setEnabled(has_config);
2018-01-04 01:41:31 +01:00
}
2022-01-11 21:25:17 +01:00
void GameCubePane::OnConfigPressed(ExpansionInterface::Slot slot)
2018-01-04 01:41:31 +01:00
{
2020-08-17 09:07:38 +02:00
const ExpansionInterface::EXIDeviceType device =
static_cast<ExpansionInterface::EXIDeviceType>(m_slot_combos[slot]->currentData().toInt());
switch (device)
2018-01-04 01:41:31 +01:00
{
2020-08-17 09:07:38 +02:00
case ExpansionInterface::EXIDeviceType::MemoryCard:
2022-01-11 21:25:17 +01:00
BrowseMemcard(slot);
return;
2020-08-17 09:07:38 +02:00
case ExpansionInterface::EXIDeviceType::AGP:
2022-01-11 21:25:17 +01:00
BrowseAGPRom(slot);
return;
2020-08-17 09:07:38 +02:00
case ExpansionInterface::EXIDeviceType::Microphone:
2022-01-11 21:25:17 +01:00
// TODO: convert MappingWindow to use Slot?
MappingWindow(this, MappingWindow::Type::MAPPING_GC_MICROPHONE, static_cast<int>(slot)).exec();
2018-01-04 01:41:31 +01:00
return;
2020-08-17 09:07:38 +02:00
case ExpansionInterface::EXIDeviceType::Ethernet:
{
BroadbandAdapterSettingsDialog(this, BroadbandAdapterSettingsDialog::Type::Ethernet).exec();
return;
}
2020-08-17 09:07:38 +02:00
case ExpansionInterface::EXIDeviceType::EthernetXLink:
2020-06-08 05:25:45 +02:00
{
BroadbandAdapterSettingsDialog(this, BroadbandAdapterSettingsDialog::Type::XLinkKai).exec();
return;
}
default:
2020-08-17 09:07:38 +02:00
PanicAlertFmt("Unknown settings pressed for {}", device);
return;
2018-01-04 01:41:31 +01:00
}
2022-01-11 21:25:17 +01:00
}
void GameCubePane::BrowseMemcard(ExpansionInterface::Slot slot)
{
ASSERT(ExpansionInterface::IsMemcardSlot(slot));
2018-01-04 01:41:31 +01:00
QString filename = DolphinFileDialog::getSaveFileName(
this, tr("Choose a file to open"), QString::fromStdString(File::GetUserPath(D_GCUSER_IDX)),
2022-01-11 21:25:17 +01:00
tr("GameCube Memory Cards (*.raw *.gcp)"), 0, QFileDialog::DontConfirmOverwrite);
2018-01-04 01:41:31 +01:00
if (filename.isEmpty())
2018-01-04 01:41:31 +01:00
return;
2018-02-02 12:28:57 +01:00
QString path_abs = QFileInfo(filename).absoluteFilePath();
2018-01-04 01:41:31 +01:00
// Memcard validity checks
2022-01-11 21:25:17 +01:00
if (File::Exists(filename.toStdString()))
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
auto [error_code, mc] = Memcard::GCMemcard::Open(filename.toStdString());
2022-01-11 21:25:17 +01:00
if (error_code.HasCriticalErrors() || !mc || !mc->IsValid())
{
ModalMessageBox::critical(
this, tr("Error"),
tr("The file\n%1\nis either corrupted or not a GameCube memory card file.\n%2")
.arg(filename)
.arg(GCMemcardManager::GetErrorMessagesForErrorCode(error_code)));
return;
2018-01-04 01:41:31 +01:00
}
2022-01-11 21:25:17 +01:00
}
2018-01-04 01:41:31 +01:00
2022-01-11 21:25:17 +01:00
for (ExpansionInterface::Slot other_slot : ExpansionInterface::MEMCARD_SLOTS)
{
if (other_slot == slot)
continue;
bool other_slot_memcard = m_slot_combos[other_slot]->currentData().toInt() ==
static_cast<int>(ExpansionInterface::EXIDeviceType::MemoryCard);
2018-02-02 12:28:57 +01:00
if (other_slot_memcard)
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
QString path_other =
QFileInfo(QString::fromStdString(Config::Get(Config::GetInfoForMemcardPath(other_slot))))
2018-02-02 12:28:57 +01:00
.absoluteFilePath();
2022-01-11 21:25:17 +01:00
if (path_abs == path_other)
2018-02-02 12:28:57 +01:00
{
2022-01-11 21:25:17 +01:00
ModalMessageBox::critical(
this, tr("Error"),
tr("The same file can't be used in multiple slots; it is already used by %1.")
.arg(QString::fromStdString(fmt::to_string(other_slot))));
2018-02-02 12:28:57 +01:00
return;
}
2018-01-04 01:41:31 +01:00
}
}
2022-01-11 21:25:17 +01:00
QString path_old =
QFileInfo(QString::fromStdString(Config::Get(Config::GetInfoForMemcardPath(slot))))
.absoluteFilePath();
2022-01-11 21:25:17 +01:00
Config::SetBase(Config::GetInfoForMemcardPath(slot), path_abs.toStdString());
if (Core::IsRunning() && path_abs != path_old)
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
// ChangeDevice unplugs the device for 1 second, which means that games should notice that
// the path has changed and thus the memory card contents have changed
ExpansionInterface::ChangeDevice(slot, ExpansionInterface::EXIDeviceType::MemoryCard);
2018-01-04 01:41:31 +01:00
}
2022-01-11 21:25:17 +01:00
}
void GameCubePane::BrowseAGPRom(ExpansionInterface::Slot slot)
{
ASSERT(ExpansionInterface::IsMemcardSlot(slot));
QString filename = DolphinFileDialog::getSaveFileName(
this, tr("Choose a file to open"), QString::fromStdString(File::GetUserPath(D_GCUSER_IDX)),
tr("Game Boy Advance Carts (*.gba)"), 0, QFileDialog::DontConfirmOverwrite);
if (filename.isEmpty())
return;
QString path_abs = QFileInfo(filename).absoluteFilePath();
QString path_old =
QFileInfo(QString::fromStdString(Config::Get(Config::GetInfoForAGPCartPath(slot))))
.absoluteFilePath();
Config::SetBase(Config::GetInfoForAGPCartPath(slot), path_abs.toStdString());
if (Core::IsRunning() && path_abs != path_old)
{
2022-01-11 21:25:17 +01:00
// ChangeDevice unplugs the device for 1 second. For an actual AGP, you can remove the
// cartridge without unplugging it, and it's not clear if the AGP software actually notices
// that it's been unplugged or the cartridge has changed, but this was done for memcards so
// we might as well do it for the AGP too.
ExpansionInterface::ChangeDevice(slot, ExpansionInterface::EXIDeviceType::AGP);
}
2018-01-04 01:41:31 +01:00
}
2021-07-04 12:53:53 +02:00
void GameCubePane::BrowseGBABios()
{
QString file = QDir::toNativeSeparators(DolphinFileDialog::getOpenFileName(
2021-07-04 12:53:53 +02:00
this, tr("Select GBA BIOS"), QString::fromStdString(File::GetUserPath(F_GBABIOS_IDX)),
tr("All Files (*)")));
if (!file.isEmpty())
{
m_gba_bios_edit->setText(file);
SaveSettings();
}
}
void GameCubePane::BrowseGBARom(size_t index)
{
QString file = QString::fromStdString(GetOpenGBARom({}));
if (!file.isEmpty())
{
m_gba_rom_edits[index]->setText(file);
SaveSettings();
}
}
void GameCubePane::SaveRomPathChanged()
{
m_gba_saves_edit->setEnabled(!m_gba_save_rom_path->isChecked());
m_gba_browse_saves->setEnabled(!m_gba_save_rom_path->isChecked());
SaveSettings();
}
void GameCubePane::BrowseGBASaves()
{
QString dir = QDir::toNativeSeparators(DolphinFileDialog::getExistingDirectory(
this, tr("Select GBA Saves Path"),
QString::fromStdString(File::GetUserPath(D_GBASAVES_IDX))));
2021-07-04 12:53:53 +02:00
if (!dir.isEmpty())
{
m_gba_saves_edit->setText(dir);
SaveSettings();
}
}
2018-01-04 01:41:31 +01:00
void GameCubePane::LoadSettings()
{
// IPL Settings
SignalBlocking(m_skip_main_menu)->setChecked(Config::Get(Config::MAIN_SKIP_IPL));
SignalBlocking(m_language_combo)
->setCurrentIndex(m_language_combo->findData(Config::Get(Config::MAIN_GC_LANGUAGE)));
2018-01-04 01:41:31 +01:00
bool have_menu = false;
for (const std::string dir : {USA_DIR, JAP_DIR, EUR_DIR})
2018-01-04 01:41:31 +01:00
{
const auto path = DIR_SEP + dir + DIR_SEP GC_IPL;
2018-01-04 01:41:31 +01:00
if (File::Exists(File::GetUserPath(D_GCUSER_IDX) + path) ||
File::Exists(File::GetSysDirectory() + GC_SYS_DIR + path))
2018-01-04 01:41:31 +01:00
{
have_menu = true;
break;
}
}
m_skip_main_menu->setEnabled(have_menu);
m_skip_main_menu->setToolTip(have_menu ? QString{} : tr("Put IPL ROMs in User/GC/<region>."));
2018-01-04 01:41:31 +01:00
// Device Settings
2022-01-11 21:25:17 +01:00
for (ExpansionInterface::Slot slot : ExpansionInterface::SLOTS)
2018-01-04 01:41:31 +01:00
{
2020-08-17 09:07:38 +02:00
const ExpansionInterface::EXIDeviceType exi_device =
2022-01-11 21:25:17 +01:00
Config::Get(Config::GetInfoForEXIDevice(slot));
SignalBlocking(m_slot_combos[slot])
->setCurrentIndex(m_slot_combos[slot]->findData(static_cast<int>(exi_device)));
2022-01-11 21:25:17 +01:00
UpdateButton(slot);
2018-01-04 01:41:31 +01:00
}
2021-07-04 12:53:53 +02:00
#ifdef HAS_LIBMGBA
// GBA Settings
SignalBlocking(m_gba_threads)->setChecked(Config::Get(Config::MAIN_GBA_THREADS));
SignalBlocking(m_gba_bios_edit)
->setText(QString::fromStdString(File::GetUserPath(F_GBABIOS_IDX)));
SignalBlocking(m_gba_save_rom_path)->setChecked(Config::Get(Config::MAIN_GBA_SAVES_IN_ROM_PATH));
SignalBlocking(m_gba_saves_edit)
->setText(QString::fromStdString(File::GetUserPath(D_GBASAVES_IDX)));
2021-07-04 12:53:53 +02:00
for (size_t i = 0; i < m_gba_rom_edits.size(); ++i)
{
SignalBlocking(m_gba_rom_edits[i])
->setText(QString::fromStdString(Config::Get(Config::MAIN_GBA_ROM_PATHS[i])));
}
2021-07-04 12:53:53 +02:00
#endif
2018-01-04 01:41:31 +01:00
}
void GameCubePane::SaveSettings()
{
Config::ConfigChangeCallbackGuard config_guard;
2018-01-04 01:41:31 +01:00
// IPL Settings
Config::SetBaseOrCurrent(Config::MAIN_SKIP_IPL, m_skip_main_menu->isChecked());
Config::SetBaseOrCurrent(Config::MAIN_GC_LANGUAGE, m_language_combo->currentData().toInt());
2018-01-04 01:41:31 +01:00
2021-07-04 12:53:53 +02:00
// Device Settings
2022-01-11 21:25:17 +01:00
for (ExpansionInterface::Slot slot : ExpansionInterface::SLOTS)
2018-01-04 01:41:31 +01:00
{
2020-08-17 09:07:38 +02:00
const auto dev =
2022-01-11 21:25:17 +01:00
static_cast<ExpansionInterface::EXIDeviceType>(m_slot_combos[slot]->currentData().toInt());
2020-08-17 09:07:38 +02:00
const ExpansionInterface::EXIDeviceType current_exi_device =
2022-01-11 21:25:17 +01:00
Config::Get(Config::GetInfoForEXIDevice(slot));
2018-01-04 01:41:31 +01:00
if (Core::IsRunning() && current_exi_device != dev)
2018-01-04 01:41:31 +01:00
{
2022-01-11 21:25:17 +01:00
ExpansionInterface::ChangeDevice(slot, dev);
2018-01-04 01:41:31 +01:00
}
2022-01-11 21:25:17 +01:00
Config::SetBaseOrCurrent(Config::GetInfoForEXIDevice(slot), dev);
2018-01-04 01:41:31 +01:00
}
2021-07-04 12:53:53 +02:00
#ifdef HAS_LIBMGBA
// GBA Settings
if (!NetPlay::IsNetPlayRunning())
{
Config::SetBaseOrCurrent(Config::MAIN_GBA_THREADS, m_gba_threads->isChecked());
Config::SetBaseOrCurrent(Config::MAIN_GBA_BIOS_PATH, m_gba_bios_edit->text().toStdString());
Config::SetBaseOrCurrent(Config::MAIN_GBA_SAVES_IN_ROM_PATH, m_gba_save_rom_path->isChecked());
Config::SetBaseOrCurrent(Config::MAIN_GBA_SAVES_PATH, m_gba_saves_edit->text().toStdString());
File::SetUserPath(F_GBABIOS_IDX, Config::Get(Config::MAIN_GBA_BIOS_PATH));
File::SetUserPath(D_GBASAVES_IDX, Config::Get(Config::MAIN_GBA_SAVES_PATH));
for (size_t i = 0; i < m_gba_rom_edits.size(); ++i)
{
Config::SetBaseOrCurrent(Config::MAIN_GBA_ROM_PATHS[i],
m_gba_rom_edits[i]->text().toStdString());
}
2021-07-04 13:33:58 +02:00
auto server = Settings::Instance().GetNetPlayServer();
if (server)
server->SetGBAConfig(server->GetGBAConfig(), true);
2021-07-04 12:53:53 +02:00
}
#endif
2018-01-04 01:41:31 +01:00
LoadSettings();
}
2021-07-04 12:53:53 +02:00
std::string GameCubePane::GetOpenGBARom(std::string_view title)
{
QString caption = tr("Select GBA ROM");
if (!title.empty())
caption += QStringLiteral(": %1").arg(QString::fromStdString(std::string(title)));
return QDir::toNativeSeparators(
DolphinFileDialog::getOpenFileName(
2021-07-04 12:53:53 +02:00
nullptr, caption, QString(),
tr("Game Boy Advance ROMs (*.gba *.gbc *.gb *.7z *.zip *.agb *.mb *.rom *.bin);;"
"All Files (*)")))
.toStdString();
}