frontend: Revert removal of .3ds support (#1701)

* frontend: Revert removal of .3ds support

* Added 3ds extension to Info.plist

* Added .3ds extension to org.azahar_emu.Azahar.xml

* game_list.h: Removed leftover definitions

---------

Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
This commit is contained in:
PabloMK7 2026-01-29 13:10:02 +01:00 committed by GitHub
parent a9923b6844
commit fc137b0229
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 10 additions and 85 deletions

View file

@ -35,6 +35,7 @@
<string>cci</string> <string>cci</string>
<string>cxi</string> <string>cxi</string>
<string>cia</string> <string>cia</string>
<string>3ds</string>
</array> </array>
<key>CFBundleTypeName</key> <key>CFBundleTypeName</key>
<string>Nintendo 3DS File</string> <string>Nintendo 3DS File</string>

View file

@ -16,6 +16,7 @@
<expanded-acronym>CTR Cart Image</expanded-acronym> <expanded-acronym>CTR Cart Image</expanded-acronym>
<icon name="azahar"/> <icon name="azahar"/>
<glob pattern="*.cci"/> <glob pattern="*.cci"/>
<glob pattern="*.3ds"/>
<magic><match value="NCSD" type="string" offset="256"/></magic> <magic><match value="NCSD" type="string" offset="256"/></magic>
</mime-type> </mime-type>

View file

@ -7,16 +7,12 @@ package org.citra.citra_emu.fragments
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import androidx.core.text.HtmlCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
@ -50,7 +46,6 @@ class GamesFragment : Fragment() {
private val gamesViewModel: GamesViewModel by activityViewModels() private val gamesViewModel: GamesViewModel by activityViewModels()
private val homeViewModel: HomeViewModel by activityViewModels() private val homeViewModel: HomeViewModel by activityViewModels()
private var show3DSFileWarning: Boolean = true
private lateinit var gameAdapter: GameAdapter private lateinit var gameAdapter: GameAdapter
private val openImageLauncher = registerForActivityResult( private val openImageLauncher = registerForActivityResult(
@ -224,34 +219,6 @@ class GamesFragment : Fragment() {
setInsets() setInsets()
} }
override fun onResume() {
super.onResume()
if (show3DSFileWarning &&
!PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
.getBoolean("show_3ds_files_warning", false)) {
val message = HtmlCompat.fromHtml(getString(R.string.warning_3ds_files),
HtmlCompat.FROM_HTML_MODE_LEGACY)
context?.let {
val alert = MaterialAlertDialogBuilder(it)
.setTitle(getString(R.string.important))
.setMessage(message)
.setPositiveButton(R.string.dont_show_again) { _, _ ->
PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
.edit() {
putBoolean("show_3ds_files_warning", true)
}
}
.show()
val alertMessage = alert.findViewById<View>(android.R.id.message) as TextView
alertMessage.movementMethod = LinkMovementMethod.getInstance()
}
}
show3DSFileWarning = false
}
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
_binding = null _binding = null

View file

@ -66,7 +66,7 @@ class Game(
val allExtensions: Set<String> get() = extensions + badExtensions val allExtensions: Set<String> get() = extensions + badExtensions
val extensions: Set<String> = HashSet( val extensions: Set<String> = HashSet(
listOf("3dsx", "app", "axf", "cci", "cxi", "elf", "z3dsx", "zcci", "zcxi") listOf("3dsx", "app", "axf", "cci", "cxi", "elf", "z3dsx", "zcci", "zcxi", "3ds")
) )
val badExtensions: Set<String> = HashSet( val badExtensions: Set<String> = HashSet(

View file

@ -36,7 +36,6 @@
<string name="select_citra_user_folder_home_description">Changes the files that Azahar uses to load applications</string> <string name="select_citra_user_folder_home_description">Changes the files that Azahar uses to load applications</string>
<string name="theme_and_color_description">Modify the look of the app</string> <string name="theme_and_color_description">Modify the look of the app</string>
<string name="install_cia_title">Install CIA</string> <string name="install_cia_title">Install CIA</string>
<string name="warning_3ds_files"><![CDATA[Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href="https://azahar-emu.org/blog/game-loading-changes/">Learn more.</a>]]></string>
<!-- GPU driver installation --> <!-- GPU driver installation -->
<string name="select_gpu_driver">Select GPU driver</string> <string name="select_gpu_driver">Select GPU driver</string>
@ -398,8 +397,6 @@
<string name="auto_select">Auto-Select</string> <string name="auto_select">Auto-Select</string>
<string name="start">Start</string> <string name="start">Start</string>
<string name="cancelling">Cancelling…</string> <string name="cancelling">Cancelling…</string>
<string name="important">Important</string>
<string name="dont_show_again">Don\'t show again</string>
<string name="visibility">Visibility</string> <string name="visibility">Visibility</string>
<string name="information">Information</string> <string name="information">Information</string>

View file

@ -3183,7 +3183,7 @@ void GMainWindow::OnCompressFile() {
QStringList filepaths = QStringList filepaths =
QFileDialog::getOpenFileNames(this, tr("Load 3DS ROM Files"), UISettings::values.roms_path, QFileDialog::getOpenFileNames(this, tr("Load 3DS ROM Files"), UISettings::values.roms_path,
tr("3DS ROM Files (*.cia *.cci *.3dsx *.cxi)") + tr("3DS ROM Files (*.cia *.cci *.3dsx *.cxi *.3ds)") +
QStringLiteral(";;") + tr("All Files (*.*)")); QStringLiteral(";;") + tr("All Files (*.*)"));
QString out_path; QString out_path;
@ -3863,8 +3863,8 @@ static bool IsSingleFileDropEvent(const QMimeData* mime) {
return mime->hasUrls() && mime->urls().length() == 1; return mime->hasUrls() && mime->urls().length() == 1;
} }
static const std::array<std::string, 10> AcceptedExtensions = { static const std::array<std::string, 11> AcceptedExtensions = {
"cci", "cxi", "bin", "3dsx", "app", "elf", "axf", "zcci", "zcxi", "z3dsx"}; "cci", "cxi", "bin", "3dsx", "app", "elf", "axf", "zcci", "zcxi", "z3dsx", "3ds"};
static bool IsCorrectFileExtension(const QMimeData* mime) { static bool IsCorrectFileExtension(const QMimeData* mime) {
const QString& filename = mime->urls().at(0).toLocalFile(); const QString& filename = mime->urls().at(0).toLocalFile();

View file

@ -852,7 +852,6 @@ void QtConfig::ReadUIGameListValues() {
ReadBasicSetting(UISettings::values.game_list_row_2); ReadBasicSetting(UISettings::values.game_list_row_2);
ReadBasicSetting(UISettings::values.game_list_hide_no_icon); ReadBasicSetting(UISettings::values.game_list_hide_no_icon);
ReadBasicSetting(UISettings::values.game_list_single_line_mode); ReadBasicSetting(UISettings::values.game_list_single_line_mode);
ReadBasicSetting(UISettings::values.show_3ds_files_warning);
ReadBasicSetting(UISettings::values.show_compat_column); ReadBasicSetting(UISettings::values.show_compat_column);
ReadBasicSetting(UISettings::values.show_region_column); ReadBasicSetting(UISettings::values.show_region_column);
@ -1376,7 +1375,6 @@ void QtConfig::SaveUIGameListValues() {
WriteBasicSetting(UISettings::values.game_list_row_2); WriteBasicSetting(UISettings::values.game_list_row_2);
WriteBasicSetting(UISettings::values.game_list_hide_no_icon); WriteBasicSetting(UISettings::values.game_list_hide_no_icon);
WriteBasicSetting(UISettings::values.game_list_single_line_mode); WriteBasicSetting(UISettings::values.game_list_single_line_mode);
WriteBasicSetting(UISettings::values.show_3ds_files_warning);
WriteBasicSetting(UISettings::values.show_compat_column); WriteBasicSetting(UISettings::values.show_compat_column);
WriteBasicSetting(UISettings::values.show_region_column); WriteBasicSetting(UISettings::values.show_region_column);

View file

@ -391,40 +391,6 @@ GameList::GameList(PlayTime::PlayTimeManager& play_time_manager_, GMainWindow* p
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0); layout->setSpacing(0);
if (UISettings::values.show_3ds_files_warning.GetValue()) {
warning_layout = new QHBoxLayout;
deprecated_3ds_warning = new QLabel;
deprecated_3ds_warning->setText(
tr("IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting "
"and/or renaming to .cci may be necessary. <a "
"href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a>"));
deprecated_3ds_warning->setOpenExternalLinks(true);
deprecated_3ds_warning->setStyleSheet(
QString::fromStdString("color: black; font-weight: bold;"));
warning_hide = new QPushButton(tr("Don't show again"));
warning_hide->setStyleSheet(
QString::fromStdString("color: blue; text-decoration: underline;"));
warning_hide->setFlat(true);
warning_hide->setCursor(Qt::PointingHandCursor);
connect(warning_hide, &QPushButton::clicked, [this]() {
warning_widget->setVisible(false);
UISettings::values.show_3ds_files_warning.SetValue(false);
});
warning_layout->addWidget(deprecated_3ds_warning);
warning_layout->addStretch();
warning_layout->addWidget(warning_hide);
warning_layout->setContentsMargins(3, 3, 3, 3);
warning_widget = new QWidget;
warning_widget->setStyleSheet(QString::fromStdString("background-color: khaki;"));
warning_widget->setLayout(warning_layout);
layout->addWidget(warning_widget);
}
layout->addWidget(tree_view); layout->addWidget(tree_view);
layout->addWidget(search_field); layout->addWidget(search_field);
setLayout(layout); setLayout(layout);
@ -1107,9 +1073,9 @@ void GameList::LoadInterfaceLayout() {
} }
const QStringList GameList::supported_file_extensions = { const QStringList GameList::supported_file_extensions = {
QStringLiteral("3dsx"), QStringLiteral("elf"), QStringLiteral("axf"), QStringLiteral("3dsx"), QStringLiteral("elf"), QStringLiteral("axf"), QStringLiteral("cci"),
QStringLiteral("cci"), QStringLiteral("cxi"), QStringLiteral("app"), QStringLiteral("cxi"), QStringLiteral("app"), QStringLiteral("z3dsx"), QStringLiteral("zcci"),
QStringLiteral("z3dsx"), QStringLiteral("zcci"), QStringLiteral("zcxi"), QStringLiteral("zcxi"), QStringLiteral("3ds"),
}; };
void GameList::RefreshGameDirectory() { void GameList::RefreshGameDirectory() {

View file

@ -137,10 +137,6 @@ private:
void changeEvent(QEvent*) override; void changeEvent(QEvent*) override;
void RetranslateUI(); void RetranslateUI();
QHBoxLayout* warning_layout = nullptr;
QWidget* warning_widget = nullptr;
QLabel* deprecated_3ds_warning = nullptr;
QPushButton* warning_hide = nullptr;
GameListSearchField* search_field; GameListSearchField* search_field;
GMainWindow* main_window = nullptr; GMainWindow* main_window = nullptr;
QVBoxLayout* layout = nullptr; QVBoxLayout* layout = nullptr;

View file

@ -109,7 +109,6 @@ struct Values {
Settings::Setting<GameListText> game_list_row_2{GameListText::FileName, "row2"}; Settings::Setting<GameListText> game_list_row_2{GameListText::FileName, "row2"};
Settings::Setting<bool> game_list_hide_no_icon{false, "hideNoIcon"}; Settings::Setting<bool> game_list_hide_no_icon{false, "hideNoIcon"};
Settings::Setting<bool> game_list_single_line_mode{false, "singleLineMode"}; Settings::Setting<bool> game_list_single_line_mode{false, "singleLineMode"};
Settings::Setting<bool> show_3ds_files_warning{true, "show_3ds_files_warning"};
// Compatibility List // Compatibility List
Settings::Setting<bool> show_compat_column{true, "show_compat_column"}; Settings::Setting<bool> show_compat_column{true, "show_compat_column"};

View file

@ -48,7 +48,7 @@ FileType GuessFromExtension(const std::string& extension_) {
if (extension == ".elf" || extension == ".axf") if (extension == ".elf" || extension == ".axf")
return FileType::ELF; return FileType::ELF;
if (extension == ".cci" || extension == ".zcci") if (extension == ".cci" || extension == ".zcci" || extension == ".3ds")
return FileType::CCI; return FileType::CCI;
if (extension == ".cxi" || extension == ".app" || extension == ".zcxi") if (extension == ".cxi" || extension == ".app" || extension == ".zcxi")