Use Slot in GCMemcardManager

This commit is contained in:
Pokechu22 2022-01-11 13:02:50 -08:00
parent 777bb4d82c
commit 9109258b85
2 changed files with 103 additions and 87 deletions

View File

@ -42,6 +42,8 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h" #include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/QtUtils/ModalMessageBox.h"
using namespace ExpansionInterface;
constexpr int ROW_HEIGHT = 36; constexpr int ROW_HEIGHT = 36;
constexpr int COLUMN_WIDTH_FILENAME = 100; constexpr int COLUMN_WIDTH_FILENAME = 100;
constexpr int COLUMN_WIDTH_BANNER = Memcard::MEMORY_CARD_BANNER_WIDTH + 6; constexpr int COLUMN_WIDTH_BANNER = Memcard::MEMORY_CARD_BANNER_WIDTH + 6;
@ -55,6 +57,14 @@ constexpr int COLUMN_INDEX_ICON = 3;
constexpr int COLUMN_INDEX_BLOCKS = 4; constexpr int COLUMN_INDEX_BLOCKS = 4;
constexpr int COLUMN_COUNT = 5; constexpr int COLUMN_COUNT = 5;
namespace
{
Slot OtherSlot(Slot slot)
{
return slot == Slot::A ? Slot::B : Slot::A;
}
}; // namespace
struct GCMemcardManager::IconAnimationData struct GCMemcardManager::IconAnimationData
{ {
// the individual frames // the individual frames
@ -70,7 +80,7 @@ GCMemcardManager::GCMemcardManager(QWidget* parent) : QDialog(parent)
CreateWidgets(); CreateWidgets();
ConnectWidgets(); ConnectWidgets();
SetActiveSlot(0); SetActiveSlot(Slot::A);
UpdateActions(); UpdateActions();
m_timer = new QTimer(this); m_timer = new QTimer(this);
@ -117,52 +127,54 @@ void GCMemcardManager::CreateWidgets()
auto* layout = new QGridLayout; auto* layout = new QGridLayout;
for (int i = 0; i < SLOT_COUNT; i++) for (Slot slot : MEMCARD_SLOTS)
{ {
m_slot_group[i] = new QGroupBox(i == 0 ? tr("Slot A") : tr("Slot B")); m_slot_group[slot] = new QGroupBox(slot == Slot::A ? tr("Slot A") : tr("Slot B"));
m_slot_file_edit[i] = new QLineEdit; m_slot_file_edit[slot] = new QLineEdit;
m_slot_open_button[i] = new QPushButton(tr("&Open...")); m_slot_open_button[slot] = new QPushButton(tr("&Open..."));
m_slot_create_button[i] = new QPushButton(tr("&Create...")); m_slot_create_button[slot] = new QPushButton(tr("&Create..."));
m_slot_table[i] = new QTableWidget; m_slot_table[slot] = new QTableWidget;
m_slot_table[i]->setTabKeyNavigation(false); m_slot_table[slot]->setTabKeyNavigation(false);
m_slot_stat_label[i] = new QLabel; m_slot_stat_label[slot] = new QLabel;
m_slot_table[i]->setSelectionMode(QAbstractItemView::ExtendedSelection); m_slot_table[slot]->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_slot_table[i]->setSelectionBehavior(QAbstractItemView::SelectRows); m_slot_table[slot]->setSelectionBehavior(QAbstractItemView::SelectRows);
m_slot_table[i]->setSortingEnabled(true); m_slot_table[slot]->setSortingEnabled(true);
m_slot_table[i]->horizontalHeader()->setHighlightSections(false); m_slot_table[slot]->horizontalHeader()->setHighlightSections(false);
m_slot_table[i]->horizontalHeader()->setMinimumSectionSize(0); m_slot_table[slot]->horizontalHeader()->setMinimumSectionSize(0);
m_slot_table[i]->horizontalHeader()->setSortIndicatorShown(true); m_slot_table[slot]->horizontalHeader()->setSortIndicatorShown(true);
m_slot_table[i]->setColumnCount(COLUMN_COUNT); m_slot_table[slot]->setColumnCount(COLUMN_COUNT);
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_FILENAME, m_slot_table[slot]->setHorizontalHeaderItem(COLUMN_INDEX_FILENAME,
new QTableWidgetItem(tr("Filename"))); new QTableWidgetItem(tr("Filename")));
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_BANNER, m_slot_table[slot]->setHorizontalHeaderItem(COLUMN_INDEX_BANNER,
new QTableWidgetItem(tr("Banner"))); new QTableWidgetItem(tr("Banner")));
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_TEXT, new QTableWidgetItem(tr("Title"))); m_slot_table[slot]->setHorizontalHeaderItem(COLUMN_INDEX_TEXT,
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_ICON, new QTableWidgetItem(tr("Icon"))); new QTableWidgetItem(tr("Title")));
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_BLOCKS, m_slot_table[slot]->setHorizontalHeaderItem(COLUMN_INDEX_ICON,
new QTableWidgetItem(tr("Blocks"))); new QTableWidgetItem(tr("Icon")));
m_slot_table[i]->setColumnWidth(COLUMN_INDEX_FILENAME, COLUMN_WIDTH_FILENAME); m_slot_table[slot]->setHorizontalHeaderItem(COLUMN_INDEX_BLOCKS,
m_slot_table[i]->setColumnWidth(COLUMN_INDEX_BANNER, COLUMN_WIDTH_BANNER); new QTableWidgetItem(tr("Blocks")));
m_slot_table[i]->setColumnWidth(COLUMN_INDEX_TEXT, COLUMN_WIDTH_TEXT); m_slot_table[slot]->setColumnWidth(COLUMN_INDEX_FILENAME, COLUMN_WIDTH_FILENAME);
m_slot_table[i]->setColumnWidth(COLUMN_INDEX_ICON, COLUMN_WIDTH_ICON); m_slot_table[slot]->setColumnWidth(COLUMN_INDEX_BANNER, COLUMN_WIDTH_BANNER);
m_slot_table[i]->setColumnWidth(COLUMN_INDEX_BLOCKS, COLUMN_WIDTH_BLOCKS); m_slot_table[slot]->setColumnWidth(COLUMN_INDEX_TEXT, COLUMN_WIDTH_TEXT);
m_slot_table[i]->verticalHeader()->setDefaultSectionSize(ROW_HEIGHT); m_slot_table[slot]->setColumnWidth(COLUMN_INDEX_ICON, COLUMN_WIDTH_ICON);
m_slot_table[i]->verticalHeader()->hide(); m_slot_table[slot]->setColumnWidth(COLUMN_INDEX_BLOCKS, COLUMN_WIDTH_BLOCKS);
m_slot_table[i]->setShowGrid(false); m_slot_table[slot]->verticalHeader()->setDefaultSectionSize(ROW_HEIGHT);
m_slot_table[slot]->verticalHeader()->hide();
m_slot_table[slot]->setShowGrid(false);
auto* slot_layout = new QGridLayout; auto* slot_layout = new QGridLayout;
m_slot_group[i]->setLayout(slot_layout); m_slot_group[slot]->setLayout(slot_layout);
slot_layout->addWidget(m_slot_file_edit[i], 0, 0); slot_layout->addWidget(m_slot_file_edit[slot], 0, 0);
slot_layout->addWidget(m_slot_open_button[i], 0, 1); slot_layout->addWidget(m_slot_open_button[slot], 0, 1);
slot_layout->addWidget(m_slot_create_button[i], 0, 2); slot_layout->addWidget(m_slot_create_button[slot], 0, 2);
slot_layout->addWidget(m_slot_table[i], 1, 0, 1, 3); slot_layout->addWidget(m_slot_table[slot], 1, 0, 1, 3);
slot_layout->addWidget(m_slot_stat_label[i], 2, 0); slot_layout->addWidget(m_slot_stat_label[slot], 2, 0);
layout->addWidget(m_slot_group[i], 0, i * 2, 8, 1); layout->addWidget(m_slot_group[slot], 0, slot == Slot::A ? 0 : 2, 8, 1);
UpdateSlotTable(i); UpdateSlotTable(slot);
} }
layout->addWidget(m_select_button, 1, 1); layout->addWidget(m_select_button, 1, 1);
@ -179,7 +191,8 @@ void GCMemcardManager::CreateWidgets()
void GCMemcardManager::ConnectWidgets() void GCMemcardManager::ConnectWidgets()
{ {
connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(m_select_button, &QPushButton::clicked, [this] { SetActiveSlot(!m_active_slot); }); connect(m_select_button, &QPushButton::clicked,
[this] { SetActiveSlot(OtherSlot(m_active_slot)); });
connect(m_export_gci_action, &QAction::triggered, connect(m_export_gci_action, &QAction::triggered,
[this] { ExportFiles(Memcard::SavefileFormat::GCI); }); [this] { ExportFiles(Memcard::SavefileFormat::GCI); });
connect(m_export_gcs_action, &QAction::triggered, connect(m_export_gcs_action, &QAction::triggered,
@ -191,7 +204,7 @@ void GCMemcardManager::ConnectWidgets()
connect(m_copy_button, &QPushButton::clicked, this, &GCMemcardManager::CopyFiles); connect(m_copy_button, &QPushButton::clicked, this, &GCMemcardManager::CopyFiles);
connect(m_fix_checksums_button, &QPushButton::clicked, this, &GCMemcardManager::FixChecksums); connect(m_fix_checksums_button, &QPushButton::clicked, this, &GCMemcardManager::FixChecksums);
for (int slot = 0; slot < SLOT_COUNT; slot++) for (Slot slot : MEMCARD_SLOTS)
{ {
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); });
@ -206,27 +219,26 @@ void GCMemcardManager::ConnectWidgets()
void GCMemcardManager::LoadDefaultMemcards() void GCMemcardManager::LoadDefaultMemcards()
{ {
for (int i = 0; i < SLOT_COUNT; i++) for (ExpansionInterface::Slot slot : ExpansionInterface::MEMCARD_SLOTS)
{ {
if (Config::Get(i == 0 ? Config::MAIN_SLOT_A : Config::MAIN_SLOT_B) != if (Config::Get(Config::GetInfoForEXIDevice(slot)) !=
ExpansionInterface::EXIDeviceType::MemoryCard) ExpansionInterface::EXIDeviceType::MemoryCard)
{ {
continue; continue;
} }
const QString path = QString::fromStdString( const QString path = QString::fromStdString(Config::Get(Config::GetInfoForMemcardPath(slot)));
Config::Get(i == 0 ? Config::MAIN_MEMCARD_A_PATH : Config::MAIN_MEMCARD_B_PATH)); SetSlotFile(slot, path);
SetSlotFile(i, path);
} }
} }
void GCMemcardManager::SetActiveSlot(int slot) void GCMemcardManager::SetActiveSlot(Slot slot)
{ {
for (int i = 0; i < SLOT_COUNT; i++) for (Slot slot2 : MEMCARD_SLOTS)
m_slot_table[i]->setEnabled(i == slot); m_slot_table[slot2]->setEnabled(slot2 == slot);
m_select_button->setText(slot == 0 ? tr("Switch to B") : tr("Switch to A")); m_select_button->setText(slot == Slot::A ? tr("Switch to B") : tr("Switch to A"));
m_copy_button->setText(slot == 0 ? tr("Copy to B") : tr("Copy to A")); m_copy_button->setText(slot == Slot::A ? tr("Copy to B") : tr("Copy to A"));
m_active_slot = slot; m_active_slot = slot;
@ -234,7 +246,7 @@ void GCMemcardManager::SetActiveSlot(int slot)
UpdateActions(); UpdateActions();
} }
void GCMemcardManager::UpdateSlotTable(int slot) void GCMemcardManager::UpdateSlotTable(Slot slot)
{ {
m_slot_active_icons[slot].clear(); m_slot_active_icons[slot].clear();
@ -307,7 +319,7 @@ void GCMemcardManager::UpdateActions()
auto selection = m_slot_table[m_active_slot]->selectedItems(); auto selection = m_slot_table[m_active_slot]->selectedItems();
bool have_selection = selection.count(); bool have_selection = selection.count();
bool have_memcard = m_slot_memcard[m_active_slot] != nullptr; bool have_memcard = m_slot_memcard[m_active_slot] != nullptr;
bool have_memcard_other = m_slot_memcard[!m_active_slot] != nullptr; bool have_memcard_other = m_slot_memcard[OtherSlot(m_active_slot)] != nullptr;
m_copy_button->setEnabled(have_selection && have_memcard_other); m_copy_button->setEnabled(have_selection && have_memcard_other);
m_export_button->setEnabled(have_selection); m_export_button->setEnabled(have_selection);
@ -316,7 +328,7 @@ void GCMemcardManager::UpdateActions()
m_fix_checksums_button->setEnabled(have_memcard); m_fix_checksums_button->setEnabled(have_memcard);
} }
void GCMemcardManager::SetSlotFile(int slot, QString path) void GCMemcardManager::SetSlotFile(Slot slot, QString path)
{ {
auto [error_code, memcard] = Memcard::GCMemcard::Open(path.toStdString()); auto [error_code, memcard] = Memcard::GCMemcard::Open(path.toStdString());
@ -337,14 +349,15 @@ void GCMemcardManager::SetSlotFile(int slot, QString path)
UpdateActions(); UpdateActions();
} }
void GCMemcardManager::SetSlotFileInteractive(int slot) void GCMemcardManager::SetSlotFileInteractive(Slot slot)
{ {
QString path = QDir::toNativeSeparators(DolphinFileDialog::getOpenFileName( QString path = QDir::toNativeSeparators(
this, DolphinFileDialog::getOpenFileName(this,
slot == 0 ? tr("Set memory card file for Slot A") : tr("Set memory card file for Slot B"), slot == Slot::A ? tr("Set memory card file for Slot A") :
QString::fromStdString(File::GetUserPath(D_GCUSER_IDX)), tr("Set memory card file for Slot B"),
QStringLiteral("%1 (*.raw *.gcp);;%2 (*)") QString::fromStdString(File::GetUserPath(D_GCUSER_IDX)),
.arg(tr("GameCube Memory Cards"), tr("All Files")))); QStringLiteral("%1 (*.raw *.gcp);;%2 (*)")
.arg(tr("GameCube Memory Cards"), tr("All Files"))));
if (!path.isEmpty()) if (!path.isEmpty())
m_slot_file_edit[slot]->setText(path); m_slot_file_edit[slot]->setText(path);
} }
@ -487,7 +500,7 @@ void GCMemcardManager::ExportFiles(Memcard::SavefileFormat format)
} }
} }
void GCMemcardManager::ImportFiles(int slot, const std::vector<Memcard::Savefile>& savefiles) void GCMemcardManager::ImportFiles(Slot slot, const std::vector<Memcard::Savefile>& savefiles)
{ {
auto& card = m_slot_memcard[slot]; auto& card = m_slot_memcard[slot];
if (!card) if (!card)
@ -611,7 +624,7 @@ void GCMemcardManager::CopyFiles()
if (!source_card) if (!source_card)
return; return;
auto& target_card = m_slot_memcard[!m_active_slot]; auto& target_card = m_slot_memcard[OtherSlot(m_active_slot)];
if (!target_card) if (!target_card)
return; return;
@ -627,7 +640,7 @@ void GCMemcardManager::CopyFiles()
return; return;
} }
ImportFiles(!m_active_slot, savefiles); ImportFiles(OtherSlot(m_active_slot), savefiles);
} }
void GCMemcardManager::DeleteFiles() void GCMemcardManager::DeleteFiles()
@ -677,7 +690,7 @@ void GCMemcardManager::FixChecksums()
} }
} }
void GCMemcardManager::CreateNewCard(int slot) void GCMemcardManager::CreateNewCard(Slot slot)
{ {
GCMemcardCreateNewDialog dialog(this); GCMemcardCreateNewDialog dialog(this);
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted)
@ -687,7 +700,7 @@ void GCMemcardManager::CreateNewCard(int slot)
void GCMemcardManager::DrawIcons() void GCMemcardManager::DrawIcons()
{ {
const int column = COLUMN_INDEX_ICON; const int column = COLUMN_INDEX_ICON;
for (int slot = 0; slot < SLOT_COUNT; slot++) for (Slot slot : MEMCARD_SLOTS)
{ {
QTableWidget* table = m_slot_table[slot]; QTableWidget* table = m_slot_table[slot];
const int row_count = table->rowCount(); const int row_count = table->rowCount();
@ -737,7 +750,7 @@ void GCMemcardManager::DrawIcons()
++m_current_frame; ++m_current_frame;
} }
QPixmap GCMemcardManager::GetBannerFromSaveFile(int file_index, int slot) QPixmap GCMemcardManager::GetBannerFromSaveFile(int file_index, Slot slot)
{ {
auto& memcard = m_slot_memcard[slot]; auto& memcard = m_slot_memcard[slot];
@ -753,7 +766,7 @@ QPixmap GCMemcardManager::GetBannerFromSaveFile(int file_index, int slot)
return QPixmap::fromImage(image); return QPixmap::fromImage(image);
} }
GCMemcardManager::IconAnimationData GCMemcardManager::GetIconFromSaveFile(int file_index, int slot) GCMemcardManager::IconAnimationData GCMemcardManager::GetIconFromSaveFile(int file_index, Slot slot)
{ {
auto& memcard = m_slot_memcard[slot]; auto& memcard = m_slot_memcard[slot];

View File

@ -12,6 +12,8 @@
#include <QDialog> #include <QDialog>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/EnumMap.h"
#include "Core/HW/EXI/EXI.h"
namespace Memcard namespace Memcard
{ {
@ -53,26 +55,26 @@ private:
void LoadDefaultMemcards(); void LoadDefaultMemcards();
void UpdateActions(); void UpdateActions();
void UpdateSlotTable(int slot); void UpdateSlotTable(ExpansionInterface::Slot slot);
void SetSlotFile(int slot, QString path); void SetSlotFile(ExpansionInterface::Slot slot, QString path);
void SetSlotFileInteractive(int slot); void SetSlotFileInteractive(ExpansionInterface::Slot slot);
void SetActiveSlot(int slot); void SetActiveSlot(ExpansionInterface::Slot slot);
std::vector<u8> GetSelectedFileIndices(); std::vector<u8> GetSelectedFileIndices();
void ImportFiles(int slot, const std::vector<Memcard::Savefile>& savefiles); void ImportFiles(ExpansionInterface::Slot slot, const std::vector<Memcard::Savefile>& savefiles);
void CopyFiles(); void CopyFiles();
void ImportFile(); void ImportFile();
void DeleteFiles(); void DeleteFiles();
void ExportFiles(Memcard::SavefileFormat format); void ExportFiles(Memcard::SavefileFormat format);
void FixChecksums(); void FixChecksums();
void CreateNewCard(int slot); void CreateNewCard(ExpansionInterface::Slot slot);
void DrawIcons(); void DrawIcons();
QPixmap GetBannerFromSaveFile(int file_index, int slot); QPixmap GetBannerFromSaveFile(int file_index, ExpansionInterface::Slot slot);
IconAnimationData GetIconFromSaveFile(int file_index, int slot); IconAnimationData GetIconFromSaveFile(int file_index, ExpansionInterface::Slot slot);
// Actions // Actions
QPushButton* m_select_button; QPushButton* m_select_button;
@ -87,17 +89,18 @@ private:
QPushButton* m_fix_checksums_button; QPushButton* m_fix_checksums_button;
// Slots // Slots
static constexpr int SLOT_COUNT = 2; Common::EnumMap<std::map<u8, IconAnimationData>, ExpansionInterface::MAX_MEMCARD_SLOT>
std::array<std::map<u8, IconAnimationData>, SLOT_COUNT> m_slot_active_icons; m_slot_active_icons;
std::array<std::unique_ptr<Memcard::GCMemcard>, SLOT_COUNT> m_slot_memcard; Common::EnumMap<std::unique_ptr<Memcard::GCMemcard>, ExpansionInterface::MAX_MEMCARD_SLOT>
std::array<QGroupBox*, SLOT_COUNT> m_slot_group; m_slot_memcard;
std::array<QLineEdit*, SLOT_COUNT> m_slot_file_edit; Common::EnumMap<QGroupBox*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_group;
std::array<QPushButton*, SLOT_COUNT> m_slot_open_button; Common::EnumMap<QLineEdit*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_file_edit;
std::array<QPushButton*, SLOT_COUNT> m_slot_create_button; Common::EnumMap<QPushButton*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_open_button;
std::array<QTableWidget*, SLOT_COUNT> m_slot_table; Common::EnumMap<QPushButton*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_create_button;
std::array<QLabel*, SLOT_COUNT> m_slot_stat_label; Common::EnumMap<QTableWidget*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_table;
Common::EnumMap<QLabel*, ExpansionInterface::MAX_MEMCARD_SLOT> m_slot_stat_label;
int m_active_slot; ExpansionInterface::Slot m_active_slot;
u64 m_current_frame = 0; u64 m_current_frame = 0;
QDialogButtonBox* m_button_box; QDialogButtonBox* m_button_box;