Play-/Source/ui_qt/memorycardmanagerdialog.cpp
2023-12-18 13:45:55 -05:00

236 lines
7.2 KiB
C++

#include <QFileDialog>
#include <QDateTime>
#include <QMessageBox>
#include "QStringUtils.h"
#include "memorycardmanagerdialog.h"
#include "ui_memorycardmanager.h"
#include "StdStream.h"
#include "StdStreamUtils.h"
#include "AppConfig.h"
#include "../PS2VM_Preferences.h"
MemoryCardManagerDialog::MemoryCardManagerDialog(QWidget* parent)
: QDialog(parent)
, ui(new Ui::MemoryCardManagerDialog)
, m_MemoryCard0(CAppConfig::GetInstance().GetPreferencePath(PREF_PS2_MC0_DIRECTORY))
, m_MemoryCard1(CAppConfig::GetInstance().GetPreferencePath(PREF_PS2_MC1_DIRECTORY))
{
ui->setupUi(this);
m_pMemoryCard[0] = &m_MemoryCard0;
m_pMemoryCard[1] = &m_MemoryCard1;
m_pCurrentMemoryCard = m_pMemoryCard[0];
populateSaveList();
ui->label_name->setWordWrap(true);
}
MemoryCardManagerDialog::~MemoryCardManagerDialog()
{
delete ui;
}
void MemoryCardManagerDialog::on_import_saves_button_clicked()
{
QFileDialog dialog(this);
dialog.setDirectory(m_lastpath);
dialog.setFileMode(QFileDialog::ExistingFiles);
dialog.setNameFilter(tr("All Supported types (*.psu *.sps *.xps *.max; *.ps2);;EMS Memory Adapter Save Dumps (*.psu);;Sharkport/X-Port Save Dumps (*.sps; *.xps);;Action Replay MAX Save Dumps (*.max);;Raw Memory Card Dumps (*.ps2);;All files (*.*)"));
if(dialog.exec())
{
QString fileName = dialog.selectedFiles().first();
m_lastpath = QFileInfo(fileName).path();
try
{
auto filePath = QStringToPath(fileName);
auto input = Framework::CreateInputStdStream(filePath.native());
CSaveImporter::ImportSave(input, m_pCurrentMemoryCard->GetBasePath(),
std::bind(&MemoryCardManagerDialog::OnImportOverwrite, this, std::placeholders::_1));
}
catch(const std::exception& Exception)
{
QString msg("Couldn't import save(s):\n\n%1");
QMessageBox messageBox;
messageBox.critical(this, "Error", msg.arg(Exception.what()));
messageBox.show();
return;
}
m_pCurrentMemoryCard->RefreshContents();
populateSaveList();
}
}
CSaveImporterBase::OVERWRITE_PROMPT_RETURN MemoryCardManagerDialog::OnImportOverwrite(const fs::path& filePath)
{
std::string fileName = filePath.filename().string();
QString msg("File %1 already exists.\n\nOverwrite?");
auto resBtn = QMessageBox::question(this, "Overwrite?",
msg.arg(fileName.c_str()),
QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll,
QMessageBox::Yes);
switch(resBtn)
{
default:
assert(false);
[[fallthrough]];
case QMessageBox::No:
return CSaveImporterBase::OVERWRITE_NO;
case QMessageBox::Yes:
return CSaveImporterBase::OVERWRITE_YES;
case QMessageBox::YesToAll:
return CSaveImporterBase::OVERWRITE_YESTOALL;
}
}
void MemoryCardManagerDialog::on_comboBox_currentIndexChanged(int index)
{
m_pCurrentMemoryCard = m_pMemoryCard[index];
populateSaveList();
}
void MemoryCardManagerDialog::populateSaveList()
{
unsigned int nItemCount = static_cast<unsigned int>(m_pCurrentMemoryCard->GetSaveCount());
ui->savelistWidget->clear();
for(unsigned int i = 0; i < nItemCount; i++)
{
auto item = new QListWidgetItem(ui->savelistWidget);
auto name = QString::fromWCharArray(m_pCurrentMemoryCard->GetSaveByIndex(i)->GetName());
item->setText(name);
item->setData(Qt::UserRole, i);
ui->savelistWidget->addItem(item);
}
ui->savelistWidget->sortItems();
}
int MemoryCardManagerDialog::getSelectedSaveIndex()
{
int saveIndex = -1;
auto selectedItem = ui->savelistWidget->currentItem();
if(selectedItem)
{
saveIndex = selectedItem->data(Qt::UserRole).toInt();
}
return saveIndex;
}
void MemoryCardManagerDialog::on_savelistWidget_currentRowChanged(int currentRow)
{
int saveIndex = getSelectedSaveIndex();
int saveCount = static_cast<int>(m_pCurrentMemoryCard->GetSaveCount() - 1);
if(saveIndex >= 0 && saveIndex <= saveCount)
{
const CSave* save = m_pCurrentMemoryCard->GetSaveByIndex(saveIndex);
QDateTime* dt = new QDateTime;
dt->setSecsSinceEpoch(save->GetLastModificationTime());
QString datetime = dt->toUTC().toString("hh:mm - dd.MM.yyyy");
ui->label_name->setText(QString::fromWCharArray(save->GetName()));
ui->label_name->setMinimumSize(ui->label_name->sizeHint());
ui->label_id->setText(QString(save->GetId()));
QString size("%1kb");
ui->label_size->setText(size.arg(QString::number(save->GetSize() / 1000)));
ui->label_last_mod->setText(datetime);
ui->delete_save_button->setEnabled(true);
ui->export_save_button->setEnabled(true);
}
else
{
ui->label_name->setText("--");
ui->label_id->setText("--");
ui->label_size->setText("--");
ui->label_last_mod->setText("--");
ui->delete_save_button->setEnabled(false);
ui->export_save_button->setEnabled(false);
}
}
void MemoryCardManagerDialog::on_delete_save_button_clicked()
{
QMessageBox::StandardButton resBtn = QMessageBox::question(this, "Overwrite?",
"Are you sure you want to delete the currently selected entry",
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes);
if(resBtn == QMessageBox::Yes)
{
int saveIndex = getSelectedSaveIndex();
int saveCount = static_cast<int>(m_pCurrentMemoryCard->GetSaveCount() - 1);
if(saveIndex >= 0 && saveIndex <= saveCount)
{
const CSave* save = m_pCurrentMemoryCard->GetSaveByIndex(saveIndex);
fs::remove_all(save->GetPath());
m_pCurrentMemoryCard->RefreshContents();
populateSaveList();
}
}
}
void MemoryCardManagerDialog::on_export_save_button_clicked()
{
int saveIndex = getSelectedSaveIndex();
int saveCount = static_cast<int>(m_pCurrentMemoryCard->GetSaveCount() - 1);
if(saveIndex >= 0 && saveIndex <= saveCount)
{
const CSave* save = m_pCurrentMemoryCard->GetSaveByIndex(saveIndex);
if(save != NULL)
{
QFileDialog dialog(this);
dialog.setAcceptMode(QFileDialog::AcceptSave);
dialog.setNameFilter(tr("EMS Memory Adapter Save Dumps (*.psu)"));
dialog.setDefaultSuffix("psu");
if(dialog.exec())
{
QString fileName = dialog.selectedFiles().first();
try
{
auto filePath = QStringToPath(fileName);
auto output = Framework::CreateOutputStdStream(filePath.native());
CSaveExporter::ExportPSU(output, save->GetPath());
}
catch(const std::exception& Exception)
{
QString msg("Couldn't export save(s):\n\n%1");
QMessageBox messageBox;
messageBox.critical(this, "Error", msg.arg(Exception.what()));
messageBox.show();
return;
}
QString msg("Save exported successfully.");
QMessageBox messageBox;
messageBox.information(this, "Success", msg);
messageBox.show();
return;
}
else
{
QString msg("Save export Cancelled.");
QMessageBox messageBox;
messageBox.warning(this, "Cancelled", msg);
messageBox.show();
return;
}
}
else
{
QString msg("Save not found,\nPlease try again.");
QMessageBox messageBox;
messageBox.critical(this, "Error", msg);
messageBox.show();
}
}
else
{
QString msg("Invalid selection,\nPlease try again.");
QMessageBox messageBox;
messageBox.critical(this, "Error", msg);
messageBox.show();
}
}