GCMemcardManager: Add GUI to create new memory card.

This commit is contained in:
Admiral H. Curtiss 2019-11-20 21:47:10 +01:00
parent 4b00ddf9aa
commit e921cbe57c
6 changed files with 139 additions and 5 deletions

View File

@ -200,6 +200,8 @@ add_executable(dolphin-emu
GameList/GridProxyModel.h GameList/GridProxyModel.h
GameList/ListProxyModel.cpp GameList/ListProxyModel.cpp
GameList/ListProxyModel.h GameList/ListProxyModel.h
GCMemcardCreateNewDialog.cpp
GCMemcardCreateNewDialog.h
GCMemcardManager.cpp GCMemcardManager.cpp
GCMemcardManager.h GCMemcardManager.h
QtUtils/BlockUserInputFilter.cpp QtUtils/BlockUserInputFilter.cpp

View File

@ -153,6 +153,7 @@
<QtMoc Include="Debugger\PatchInstructionDialog.h" /> <QtMoc Include="Debugger\PatchInstructionDialog.h" />
<QtMoc Include="Debugger\RegisterWidget.h" /> <QtMoc Include="Debugger\RegisterWidget.h" />
<QtMoc Include="Debugger\WatchWidget.h" /> <QtMoc Include="Debugger\WatchWidget.h" />
<QtMoc Include="GCMemcardCreateNewDialog.h" />
<QtMoc Include="GCMemcardManager.h" /> <QtMoc Include="GCMemcardManager.h" />
<QtMoc Include="GameList\GameList.h" /> <QtMoc Include="GameList\GameList.h" />
<QtMoc Include="GameList\GameListModel.h" /> <QtMoc Include="GameList\GameListModel.h" />
@ -225,6 +226,7 @@
<ClCompile Include="$(QtMocOutPrefix)FileOpenEventFilter.cpp" /> <ClCompile Include="$(QtMocOutPrefix)FileOpenEventFilter.cpp" />
<ClCompile Include="$(QtMocOutPrefix)FilesystemWidget.cpp" /> <ClCompile Include="$(QtMocOutPrefix)FilesystemWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCKeyboardEmu.cpp" /> <ClCompile Include="$(QtMocOutPrefix)GCKeyboardEmu.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCMemcardCreateNewDialog.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCMemcardManager.cpp" /> <ClCompile Include="$(QtMocOutPrefix)GCMemcardManager.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCMicrophone.cpp" /> <ClCompile Include="$(QtMocOutPrefix)GCMicrophone.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCPadEmu.cpp" /> <ClCompile Include="$(QtMocOutPrefix)GCPadEmu.cpp" />
@ -401,6 +403,7 @@
<ClCompile Include="Debugger\RegisterColumn.cpp" /> <ClCompile Include="Debugger\RegisterColumn.cpp" />
<ClCompile Include="Debugger\RegisterWidget.cpp" /> <ClCompile Include="Debugger\RegisterWidget.cpp" />
<ClCompile Include="Debugger\WatchWidget.cpp" /> <ClCompile Include="Debugger\WatchWidget.cpp" />
<ClCompile Include="GCMemcardCreateNewDialog.cpp" />
<ClCompile Include="GCMemcardManager.cpp" /> <ClCompile Include="GCMemcardManager.cpp" />
<ClCompile Include="GameList\GameList.cpp" /> <ClCompile Include="GameList\GameList.cpp" />
<ClCompile Include="GameList\GameListModel.cpp" /> <ClCompile Include="GameList\GameListModel.cpp" />

View File

@ -0,0 +1,87 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "DolphinQt/GCMemcardCreateNewDialog.h"
#include <QComboBox>
#include <QDialogButtonBox>
#include <QFileDialog>
#include <QGridLayout>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>
#include "Common/FileUtil.h"
#include "Common/MsgHandler.h"
#include "Core/HW/GCMemcard/GCMemcard.h"
GCMemcardCreateNewDialog::GCMemcardCreateNewDialog(QWidget* parent) : QDialog(parent)
{
m_combobox_size = new QComboBox();
m_combobox_size->addItem(tr("4 Mbit (59 blocks)"), 4);
m_combobox_size->addItem(tr("8 Mbit (123 blocks)"), 8);
m_combobox_size->addItem(tr("16 Mbit (251 blocks)"), 16);
m_combobox_size->addItem(tr("32 Mbit (507 blocks)"), 32);
m_combobox_size->addItem(tr("64 Mbit (1019 blocks)"), 64);
m_combobox_size->addItem(tr("128 Mbit (2043 blocks)"), 128);
m_combobox_size->setCurrentIndex(5);
m_radio_western = new QRadioButton(tr("Western (Windows-1252)"));
m_radio_shiftjis = new QRadioButton(tr("Japanese (Shift-JIS)"));
m_radio_western->setChecked(true);
auto* card_size_label = new QLabel(tr("Card Size"));
auto* card_encoding_label = new QLabel(tr("Encoding"));
auto* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
button_box->button(QDialogButtonBox::Ok)->setText(tr("Create..."));
auto* layout = new QGridLayout();
layout->addWidget(card_size_label, 0, 0);
layout->addWidget(m_combobox_size, 0, 1);
layout->addWidget(card_encoding_label, 1, 0);
layout->addWidget(m_radio_western, 1, 1);
layout->addWidget(m_radio_shiftjis, 2, 1);
layout->addWidget(button_box, 3, 0, 1, 2, Qt::AlignRight);
setLayout(layout);
connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(button_box, &QDialogButtonBox::accepted, [this] {
if (CreateCard())
accept();
});
setWindowTitle(tr("Create New Memory Card"));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
}
GCMemcardCreateNewDialog::~GCMemcardCreateNewDialog() = default;
bool GCMemcardCreateNewDialog::CreateCard()
{
const u16 size = static_cast<u16>(m_combobox_size->currentData().toInt());
const bool is_shift_jis = m_radio_shiftjis->isChecked();
const QString path = QFileDialog::getSaveFileName(
this, tr("Create New Memory Card"), QString::fromStdString(File::GetUserPath(D_GCUSER_IDX)),
tr("GameCube Memory Cards (*.raw *.gcp)") + QStringLiteral(";;") + tr("All Files (*)"));
if (path.isEmpty())
return false;
const std::string p = path.toStdString();
auto memcard = GCMemcard::Create(p, size, is_shift_jis);
if (memcard && memcard->Save())
{
m_card_path = p;
return true;
}
return false;
}
std::string GCMemcardCreateNewDialog::GetMemoryCardPath() const
{
return m_card_path;
}

View File

@ -0,0 +1,28 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
#include <QDialog>
class QComboBox;
class QRadioButton;
class GCMemcardCreateNewDialog : public QDialog
{
Q_OBJECT
public:
explicit GCMemcardCreateNewDialog(QWidget* parent = nullptr);
~GCMemcardCreateNewDialog();
std::string GetMemoryCardPath() const;
private:
bool CreateCard();
QComboBox* m_combobox_size;
QRadioButton* m_radio_western;
QRadioButton* m_radio_shiftjis;
std::string m_card_path;
};

View File

@ -30,6 +30,7 @@
#include "Core/Config/MainSettings.h" #include "Core/Config/MainSettings.h"
#include "Core/HW/GCMemcard/GCMemcard.h" #include "Core/HW/GCMemcard/GCMemcard.h"
#include "DolphinQt/GCMemcardCreateNewDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/QtUtils/ModalMessageBox.h"
constexpr float ROW_HEIGHT = 28; constexpr float ROW_HEIGHT = 28;
@ -91,7 +92,8 @@ void GCMemcardManager::CreateWidgets()
{ {
m_slot_group[i] = new QGroupBox(i == 0 ? tr("Slot A") : tr("Slot B")); m_slot_group[i] = new QGroupBox(i == 0 ? tr("Slot A") : tr("Slot B"));
m_slot_file_edit[i] = new QLineEdit; m_slot_file_edit[i] = new QLineEdit;
m_slot_file_button[i] = new QPushButton(tr("&Browse...")); m_slot_open_button[i] = new QPushButton(tr("&Open..."));
m_slot_create_button[i] = new QPushButton(tr("&Create..."));
m_slot_table[i] = new QTableWidget; m_slot_table[i] = new QTableWidget;
m_slot_table[i]->setTabKeyNavigation(false); m_slot_table[i]->setTabKeyNavigation(false);
m_slot_stat_label[i] = new QLabel; m_slot_stat_label[i] = new QLabel;
@ -107,8 +109,9 @@ void GCMemcardManager::CreateWidgets()
m_slot_group[i]->setLayout(slot_layout); m_slot_group[i]->setLayout(slot_layout);
slot_layout->addWidget(m_slot_file_edit[i], 0, 0); slot_layout->addWidget(m_slot_file_edit[i], 0, 0);
slot_layout->addWidget(m_slot_file_button[i], 0, 1); slot_layout->addWidget(m_slot_open_button[i], 0, 1);
slot_layout->addWidget(m_slot_table[i], 1, 0, 1, 2); slot_layout->addWidget(m_slot_create_button[i], 0, 2);
slot_layout->addWidget(m_slot_table[i], 1, 0, 1, 3);
slot_layout->addWidget(m_slot_stat_label[i], 2, 0); slot_layout->addWidget(m_slot_stat_label[i], 2, 0);
layout->addWidget(m_slot_group[i], 0, i * 2, 9, 1); layout->addWidget(m_slot_group[i], 0, i * 2, 9, 1);
@ -143,8 +146,10 @@ void GCMemcardManager::ConnectWidgets()
{ {
connect(m_slot_file_edit[slot], &QLineEdit::textChanged, connect(m_slot_file_edit[slot], &QLineEdit::textChanged,
[this, slot](const QString& path) { SetSlotFile(slot, path); }); [this, slot](const QString& path) { SetSlotFile(slot, path); });
connect(m_slot_file_button[slot], &QPushButton::clicked, connect(m_slot_open_button[slot], &QPushButton::clicked,
[this, slot] { SetSlotFileInteractive(slot); }); [this, slot] { SetSlotFileInteractive(slot); });
connect(m_slot_create_button[slot], &QPushButton::clicked,
[this, slot] { CreateNewCard(slot); });
connect(m_slot_table[slot], &QTableWidget::itemSelectionChanged, this, connect(m_slot_table[slot], &QTableWidget::itemSelectionChanged, this,
&GCMemcardManager::UpdateActions); &GCMemcardManager::UpdateActions);
} }
@ -459,6 +464,13 @@ void GCMemcardManager::FixChecksums()
PanicAlertT("File write failed"); PanicAlertT("File write failed");
} }
void GCMemcardManager::CreateNewCard(int slot)
{
GCMemcardCreateNewDialog dialog(this);
if (dialog.exec() == QDialog::Accepted)
m_slot_file_edit[slot]->setText(QString::fromStdString(dialog.GetMemoryCardPath()));
}
void GCMemcardManager::DrawIcons() void GCMemcardManager::DrawIcons()
{ {
const auto column = 3; const auto column = 3;

View File

@ -54,6 +54,7 @@ private:
void ExportFiles(bool prompt); void ExportFiles(bool prompt);
void ExportAllFiles(); void ExportAllFiles();
void FixChecksums(); void FixChecksums();
void CreateNewCard(int slot);
void DrawIcons(); void DrawIcons();
QPixmap GetBannerFromSaveFile(int file_index, int slot); QPixmap GetBannerFromSaveFile(int file_index, int slot);
@ -75,7 +76,8 @@ private:
std::array<std::unique_ptr<GCMemcard>, SLOT_COUNT> m_slot_memcard; std::array<std::unique_ptr<GCMemcard>, SLOT_COUNT> m_slot_memcard;
std::array<QGroupBox*, SLOT_COUNT> m_slot_group; std::array<QGroupBox*, SLOT_COUNT> m_slot_group;
std::array<QLineEdit*, SLOT_COUNT> m_slot_file_edit; std::array<QLineEdit*, SLOT_COUNT> m_slot_file_edit;
std::array<QPushButton*, SLOT_COUNT> m_slot_file_button; std::array<QPushButton*, SLOT_COUNT> m_slot_open_button;
std::array<QPushButton*, SLOT_COUNT> m_slot_create_button;
std::array<QTableWidget*, SLOT_COUNT> m_slot_table; std::array<QTableWidget*, SLOT_COUNT> m_slot_table;
std::array<QLabel*, SLOT_COUNT> m_slot_stat_label; std::array<QLabel*, SLOT_COUNT> m_slot_stat_label;