/* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2022 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with PCSX2. * If not, see . */ #include "PrecompiledHeader.h" #include "common/FileSystem.h" #include "common/Path.h" #include "common/StringUtil.h" #include #include #include "Settings/CreateMemoryCardDialog.h" #include "pcsx2/MemoryCardFile.h" #include "pcsx2/System.h" CreateMemoryCardDialog::CreateMemoryCardDialog(QWidget* parent /* = nullptr */) : QDialog(parent) { m_ui.setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); connect(m_ui.name, &QLineEdit::textChanged, this, &CreateMemoryCardDialog::nameTextChanged); connect(m_ui.size8MB, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::File, MemoryCardFileType::PS2_8MB); }); connect(m_ui.size16MB, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::File, MemoryCardFileType::PS2_16MB); }); connect(m_ui.size32MB, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::File, MemoryCardFileType::PS2_32MB); }); connect(m_ui.size64MB, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::File, MemoryCardFileType::PS2_64MB); }); connect(m_ui.size128KB, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::File, MemoryCardFileType::PS1); }); connect(m_ui.sizeFolder, &QRadioButton::clicked, this, [this]() { setType(MemoryCardType::Folder, MemoryCardFileType::Unknown); }); disconnect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, nullptr); connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &CreateMemoryCardDialog::createCard); connect(m_ui.buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &CreateMemoryCardDialog::close); connect(m_ui.buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, &CreateMemoryCardDialog::restoreDefaults); #ifndef _WIN32 m_ui.ntfsCompression->setEnabled(false); #endif updateState(); } CreateMemoryCardDialog::~CreateMemoryCardDialog() = default; void CreateMemoryCardDialog::nameTextChanged() { QString controlName(m_ui.name->text()); const int cursorPos = m_ui.name->cursorPosition(); controlName.replace(".", ""); QSignalBlocker sb(m_ui.name); if (controlName.isEmpty()) m_ui.name->setText(QString()); else m_ui.name->setText(controlName); m_ui.name->setCursorPosition(cursorPos); updateState(); } void CreateMemoryCardDialog::setType(MemoryCardType type, MemoryCardFileType fileType) { m_type = type; m_fileType = fileType; updateState(); } void CreateMemoryCardDialog::restoreDefaults() { setType(MemoryCardType::File, MemoryCardFileType::PS2_8MB); m_ui.size8MB->setChecked(true); m_ui.size16MB->setChecked(false); m_ui.size32MB->setChecked(false); m_ui.size64MB->setChecked(false); m_ui.size128KB->setChecked(false); m_ui.sizeFolder->setChecked(false); } void CreateMemoryCardDialog::updateState() { const bool okay = (m_ui.name->text().length() > 0); m_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(okay); #ifdef _WIN32 m_ui.ntfsCompression->setEnabled(m_type == MemoryCardType::File); #endif } void CreateMemoryCardDialog::createCard() { QString name(m_ui.name->text()); std::string nameStr; if (m_fileType == MemoryCardFileType::PS1) { name += QStringLiteral(".mcr"); } else { name += QStringLiteral(".ps2"); } nameStr = name.toStdString(); if (FileMcd_GetCardInfo(nameStr).has_value()) { QMessageBox::critical(this, tr("Create Memory Card"), tr("Failed to create the memory card, because another card with the name '%1' already exists.").arg(name)); return; } if (!FileMcd_CreateNewCard(nameStr, m_type, m_fileType)) { QMessageBox::critical(this, tr("Create Memory Card"), tr("Failed to create the memory card, the log may contain more information.")); return; } #ifdef _WIN32 if (m_ui.ntfsCompression->isChecked() && m_type == MemoryCardType::File) { const std::string fullPath(Path::Combine(EmuFolders::MemoryCards, nameStr)); FileSystem::SetPathCompression(fullPath.c_str(), true); } #endif QMessageBox::information(this, tr("Create Memory Card"), tr("Memory card '%1' created.").arg(name)); accept(); }