diff --git a/src/frontend/title_info_dialog.cpp b/src/frontend/title_info_dialog.cpp index 26ca74e..f36f600 100644 --- a/src/frontend/title_info_dialog.cpp +++ b/src/frontend/title_info_dialog.cpp @@ -2,7 +2,10 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include +#include +#include #include #include #include @@ -61,12 +64,7 @@ void TitleInfoDialog::LoadInfo() { // Icons if (has_smdh) { - ui->iconLargeLabel->setPixmap( - QPixmap::fromImage(QImage(reinterpret_cast(smdh.GetIcon(true).data()), 48, - 48, QImage::Format::Format_RGB16))); - ui->iconSmallLabel->setPixmap( - QPixmap::fromImage(QImage(reinterpret_cast(smdh.GetIcon(false).data()), - 24, 24, QImage::Format::Format_RGB16))); + LoadIcons(); } // Names @@ -103,6 +101,24 @@ void TitleInfoDialog::LoadEncryption(Core::NCCHContainer& ncch) { ui->encryptionLineEdit->setText(encryption_text); } +void TitleInfoDialog::LoadIcons() { + ui->iconLargeLabel->setPixmap( + QPixmap::fromImage(QImage(reinterpret_cast(smdh.GetIcon(true).data()), 48, 48, + QImage::Format::Format_RGB16))); + + QAction* save_icon_large = new QAction(tr("Save Icon (Large)"), this); + ui->iconLargeLabel->addAction(save_icon_large); + connect(save_icon_large, &QAction::triggered, this, [this] { SaveIcon(true); }); + + ui->iconSmallLabel->setPixmap( + QPixmap::fromImage(QImage(reinterpret_cast(smdh.GetIcon(false).data()), 24, + 24, QImage::Format::Format_RGB16))); + + QAction* save_icon_small = new QAction(tr("Save Icon (Small)"), this); + ui->iconSmallLabel->addAction(save_icon_small); + connect(save_icon_small, &QAction::triggered, this, [this] { SaveIcon(false); }); +} + void TitleInfoDialog::InitializeLanguageComboBox() { if (!ui->namesGroupBox->isEnabled()) { // SMDH not available return; @@ -141,6 +157,29 @@ void TitleInfoDialog::InitializeLanguageComboBox() { UpdateNames(); } +void TitleInfoDialog::SaveIcon(bool large) { + const auto types = QImageWriter::supportedImageFormats(); + QStringList filters; + for (const auto& type : types) { + const QString extension = QString::fromUtf8(type); + filters << QStringLiteral("%1 Image (*.%2)").arg(extension.toUpper(), extension); + } + + static QString last_path; + const QString path = QFileDialog::getSaveFileName(this, tr("Save Icon"), last_path, + filters.join(QStringLiteral(";;"))); + if (path.isEmpty()) { + return; + } + last_path = QFileInfo(path).path(); + + const auto pixmap = large ? ui->iconLargeLabel->pixmap(Qt::ReturnByValue) + : ui->iconSmallLabel->pixmap(Qt::ReturnByValue); + if (!pixmap.save(path)) { + QMessageBox::warning(this, tr("threeSD"), tr("Could not save icon.")); + } +} + void TitleInfoDialog::UpdateNames() { const auto& title = smdh.titles.at(ui->languageComboBox->currentData().toInt()); ui->shortTitleLineEdit->setText( diff --git a/src/frontend/title_info_dialog.h b/src/frontend/title_info_dialog.h index 1e39640..19c8f9d 100644 --- a/src/frontend/title_info_dialog.h +++ b/src/frontend/title_info_dialog.h @@ -30,9 +30,11 @@ private: void LoadInfo(); void LoadEncryption(Core::NCCHContainer& ncch); + void LoadIcons(); void InitializeLanguageComboBox(); void InitializeChecks(Core::TitleMetadata& tmd); + void SaveIcon(bool large); void UpdateNames(); void ExecuteContentsCheck(); diff --git a/src/frontend/title_info_dialog.ui b/src/frontend/title_info_dialog.ui index 3ba34cc..9fbfb73 100644 --- a/src/frontend/title_info_dialog.ui +++ b/src/frontend/title_info_dialog.ui @@ -42,6 +42,9 @@ 48 + + Qt::ActionsContextMenu + @@ -52,6 +55,9 @@ 24 + + Qt::ActionsContextMenu +