mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-25 15:19:42 -06:00
Merge pull request #6757 from JosJuice/qt-filesystem-extraction
DolphinQt2: Fix disc extraction inconsistencies with DolphinWX
This commit is contained in:
@ -155,14 +155,31 @@ void FilesystemWidget::ShowContextMenu(const QPoint&)
|
|||||||
GetPartitionFromID(item->data(ENTRY_PARTITION).toInt());
|
GetPartitionFromID(item->data(ENTRY_PARTITION).toInt());
|
||||||
QString path = item->data(ENTRY_NAME).toString();
|
QString path = item->data(ENTRY_NAME).toString();
|
||||||
|
|
||||||
if ((type == EntryType::Disc && m_volume->GetPartitions().empty()) ||
|
const bool is_filesystem_root = (type == EntryType::Disc && m_volume->GetPartitions().empty()) ||
|
||||||
type == EntryType::Partition)
|
type == EntryType::Partition;
|
||||||
|
|
||||||
|
if (type == EntryType::Dir || is_filesystem_root)
|
||||||
|
{
|
||||||
|
AddAction(menu, tr("Extract Files..."), this, [this, partition, path] {
|
||||||
|
auto folder = SelectFolder();
|
||||||
|
|
||||||
|
if (!folder.isEmpty())
|
||||||
|
ExtractDirectory(partition, path, folder);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_filesystem_root)
|
||||||
{
|
{
|
||||||
AddAction(menu, tr("Extract System Data..."), this, [this, partition] {
|
AddAction(menu, tr("Extract System Data..."), this, [this, partition] {
|
||||||
auto folder = SelectFolder();
|
auto folder = SelectFolder();
|
||||||
|
|
||||||
if (!folder.isEmpty())
|
if (folder.isEmpty())
|
||||||
ExtractSystemData(partition, folder);
|
return;
|
||||||
|
|
||||||
|
if (ExtractSystemData(partition, folder))
|
||||||
|
QMessageBox::information(nullptr, tr("Success"), tr("Successfully extracted system data."));
|
||||||
|
else
|
||||||
|
QMessageBox::critical(nullptr, tr("Error"), tr("Failed to extract system data."));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,8 +198,15 @@ void FilesystemWidget::ShowContextMenu(const QPoint&)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (auto& p : m_volume->GetPartitions())
|
for (DiscIO::Partition& p : m_volume->GetPartitions())
|
||||||
ExtractPartition(p, folder);
|
{
|
||||||
|
if (const std::optional<u32> partition_type = m_volume->GetPartitionType(p))
|
||||||
|
{
|
||||||
|
const std::string partition_name =
|
||||||
|
DiscIO::DirectoryNameForPartitionType(*partition_type);
|
||||||
|
ExtractPartition(p, folder + QChar(u'/') + QString::fromStdString(partition_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -196,14 +220,6 @@ void FilesystemWidget::ShowContextMenu(const QPoint&)
|
|||||||
AddAction(menu, tr("Check Partition Integrity"), this,
|
AddAction(menu, tr("Check Partition Integrity"), this,
|
||||||
[this, partition] { CheckIntegrity(partition); });
|
[this, partition] { CheckIntegrity(partition); });
|
||||||
break;
|
break;
|
||||||
case EntryType::Dir:
|
|
||||||
AddAction(menu, tr("Extract Files..."), this, [this, partition, path] {
|
|
||||||
auto folder = SelectFolder();
|
|
||||||
|
|
||||||
if (!folder.isEmpty())
|
|
||||||
ExtractDirectory(partition, path, folder);
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case EntryType::File:
|
case EntryType::File:
|
||||||
AddAction(menu, tr("Extract File..."), this, [this, partition, path] {
|
AddAction(menu, tr("Extract File..."), this, [this, partition, path] {
|
||||||
auto dest = QFileDialog::getSaveFileName(this, tr("Save File to"));
|
auto dest = QFileDialog::getSaveFileName(this, tr("Save File to"));
|
||||||
@ -212,6 +228,9 @@ void FilesystemWidget::ShowContextMenu(const QPoint&)
|
|||||||
ExtractFile(partition, path, dest);
|
ExtractFile(partition, path, dest);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case EntryType::Dir:
|
||||||
|
// Handled above the switch statement
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
menu->exec(QCursor::pos());
|
menu->exec(QCursor::pos());
|
||||||
@ -224,18 +243,13 @@ DiscIO::Partition FilesystemWidget::GetPartitionFromID(int id)
|
|||||||
|
|
||||||
void FilesystemWidget::ExtractPartition(const DiscIO::Partition& partition, const QString& out)
|
void FilesystemWidget::ExtractPartition(const DiscIO::Partition& partition, const QString& out)
|
||||||
{
|
{
|
||||||
ExtractDirectory(partition, QStringLiteral(""), out);
|
ExtractDirectory(partition, QStringLiteral(""), out + QStringLiteral("/files"));
|
||||||
ExtractSystemData(partition, out);
|
ExtractSystemData(partition, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilesystemWidget::ExtractSystemData(const DiscIO::Partition& partition, const QString& out)
|
bool FilesystemWidget::ExtractSystemData(const DiscIO::Partition& partition, const QString& out)
|
||||||
{
|
{
|
||||||
bool success = DiscIO::ExportSystemData(*m_volume, partition, out.toStdString());
|
return DiscIO::ExportSystemData(*m_volume, partition, out.toStdString());
|
||||||
|
|
||||||
if (success)
|
|
||||||
QMessageBox::information(nullptr, tr("Success"), tr("Successfully extracted system data."));
|
|
||||||
else
|
|
||||||
QMessageBox::critical(nullptr, tr("Error"), tr("Failed to extract system data."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilesystemWidget::ExtractDirectory(const DiscIO::Partition& partition, const QString& path,
|
void FilesystemWidget::ExtractDirectory(const DiscIO::Partition& partition, const QString& path,
|
||||||
|
@ -39,7 +39,7 @@ private:
|
|||||||
void ExtractDirectory(const DiscIO::Partition& partition, const QString& path,
|
void ExtractDirectory(const DiscIO::Partition& partition, const QString& path,
|
||||||
const QString& out);
|
const QString& out);
|
||||||
void ExtractFile(const DiscIO::Partition& partition, const QString& path, const QString& out);
|
void ExtractFile(const DiscIO::Partition& partition, const QString& path, const QString& out);
|
||||||
void ExtractSystemData(const DiscIO::Partition& partition, const QString& out);
|
bool ExtractSystemData(const DiscIO::Partition& partition, const QString& out);
|
||||||
void CheckIntegrity(const DiscIO::Partition& partition);
|
void CheckIntegrity(const DiscIO::Partition& partition);
|
||||||
|
|
||||||
DiscIO::Partition GetPartitionFromID(int id);
|
DiscIO::Partition GetPartitionFromID(int id);
|
||||||
|
Reference in New Issue
Block a user