diff --git a/dist/apple/Info.plist.in b/dist/apple/Info.plist.in
index 2feacd1b6..6330613d3 100644
--- a/dist/apple/Info.plist.in
+++ b/dist/apple/Info.plist.in
@@ -35,6 +35,7 @@
cci
cxi
cia
+ 3ds
CFBundleTypeName
Nintendo 3DS File
diff --git a/dist/org.azahar_emu.Azahar.xml b/dist/org.azahar_emu.Azahar.xml
index 6f884c9ea..0fa7afbae 100644
--- a/dist/org.azahar_emu.Azahar.xml
+++ b/dist/org.azahar_emu.Azahar.xml
@@ -16,6 +16,7 @@
CTR Cart Image
+
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt
index 9ade73c83..cdcee4a19 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt
@@ -7,16 +7,12 @@ package org.citra.citra_emu.fragments
import android.annotation.SuppressLint
import android.net.Uri
import android.os.Bundle
-import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
-import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.edit
-import androidx.core.text.HtmlCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
@@ -50,7 +46,6 @@ class GamesFragment : Fragment() {
private val gamesViewModel: GamesViewModel by activityViewModels()
private val homeViewModel: HomeViewModel by activityViewModels()
- private var show3DSFileWarning: Boolean = true
private lateinit var gameAdapter: GameAdapter
private val openImageLauncher = registerForActivityResult(
@@ -224,34 +219,6 @@ class GamesFragment : Fragment() {
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(android.R.id.message) as TextView
- alertMessage.movementMethod = LinkMovementMethod.getInstance()
- }
- }
- show3DSFileWarning = false
- }
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt
index 797b7a262..7a204e3fd 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt
@@ -66,7 +66,7 @@ class Game(
val allExtensions: Set get() = extensions + badExtensions
val extensions: Set = 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 = HashSet(
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index bcd4445af..c2c71a447 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -36,7 +36,6 @@
Changes the files that Azahar uses to load applications
Modify the look of the app
Install CIA
- Learn more.]]>
Select GPU driver
@@ -398,8 +397,6 @@
Auto-Select
Start
Cancelling…
- Important
- Don\'t show again
Visibility
Information
diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp
index 6bd859ba8..57e8abc03 100644
--- a/src/citra_qt/citra_qt.cpp
+++ b/src/citra_qt/citra_qt.cpp
@@ -3168,7 +3168,7 @@ void GMainWindow::OnCompressFile() {
QStringList filepaths =
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 (*.*)"));
QString out_path;
@@ -3848,8 +3848,8 @@ static bool IsSingleFileDropEvent(const QMimeData* mime) {
return mime->hasUrls() && mime->urls().length() == 1;
}
-static const std::array AcceptedExtensions = {
- "cci", "cxi", "bin", "3dsx", "app", "elf", "axf", "zcci", "zcxi", "z3dsx"};
+static const std::array AcceptedExtensions = {
+ "cci", "cxi", "bin", "3dsx", "app", "elf", "axf", "zcci", "zcxi", "z3dsx", "3ds"};
static bool IsCorrectFileExtension(const QMimeData* mime) {
const QString& filename = mime->urls().at(0).toLocalFile();
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index b429cdae0..f443129c7 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -846,7 +846,6 @@ void QtConfig::ReadUIGameListValues() {
ReadBasicSetting(UISettings::values.game_list_row_2);
ReadBasicSetting(UISettings::values.game_list_hide_no_icon);
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_region_column);
@@ -1364,7 +1363,6 @@ void QtConfig::SaveUIGameListValues() {
WriteBasicSetting(UISettings::values.game_list_row_2);
WriteBasicSetting(UISettings::values.game_list_hide_no_icon);
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_region_column);
diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp
index cf73dab2e..3ab174440 100644
--- a/src/citra_qt/game_list.cpp
+++ b/src/citra_qt/game_list.cpp
@@ -391,40 +391,6 @@ GameList::GameList(PlayTime::PlayTimeManager& play_time_manager_, GMainWindow* p
layout->setContentsMargins(0, 0, 0, 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. Learn more."));
- 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(search_field);
setLayout(layout);
@@ -1107,9 +1073,9 @@ void GameList::LoadInterfaceLayout() {
}
const QStringList GameList::supported_file_extensions = {
- QStringLiteral("3dsx"), QStringLiteral("elf"), QStringLiteral("axf"),
- QStringLiteral("cci"), QStringLiteral("cxi"), QStringLiteral("app"),
- QStringLiteral("z3dsx"), QStringLiteral("zcci"), QStringLiteral("zcxi"),
+ QStringLiteral("3dsx"), QStringLiteral("elf"), QStringLiteral("axf"), QStringLiteral("cci"),
+ QStringLiteral("cxi"), QStringLiteral("app"), QStringLiteral("z3dsx"), QStringLiteral("zcci"),
+ QStringLiteral("zcxi"), QStringLiteral("3ds"),
};
void GameList::RefreshGameDirectory() {
diff --git a/src/citra_qt/game_list.h b/src/citra_qt/game_list.h
index 3d3cf92b5..85eec52dd 100644
--- a/src/citra_qt/game_list.h
+++ b/src/citra_qt/game_list.h
@@ -135,10 +135,6 @@ private:
void changeEvent(QEvent*) override;
void RetranslateUI();
- QHBoxLayout* warning_layout = nullptr;
- QWidget* warning_widget = nullptr;
- QLabel* deprecated_3ds_warning = nullptr;
- QPushButton* warning_hide = nullptr;
GameListSearchField* search_field;
GMainWindow* main_window = nullptr;
QVBoxLayout* layout = nullptr;
diff --git a/src/citra_qt/uisettings.h b/src/citra_qt/uisettings.h
index 1138d6b40..2c2d07fd6 100644
--- a/src/citra_qt/uisettings.h
+++ b/src/citra_qt/uisettings.h
@@ -105,7 +105,6 @@ struct Values {
Settings::Setting game_list_row_2{GameListText::FileName, "row2"};
Settings::Setting game_list_hide_no_icon{false, "hideNoIcon"};
Settings::Setting game_list_single_line_mode{false, "singleLineMode"};
- Settings::Setting show_3ds_files_warning{true, "show_3ds_files_warning"};
// Compatibility List
Settings::Setting show_compat_column{true, "show_compat_column"};
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index 5e5cdf2e2..f1d610d9e 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -48,7 +48,7 @@ FileType GuessFromExtension(const std::string& extension_) {
if (extension == ".elf" || extension == ".axf")
return FileType::ELF;
- if (extension == ".cci" || extension == ".zcci")
+ if (extension == ".cci" || extension == ".zcci" || extension == ".3ds")
return FileType::CCI;
if (extension == ".cxi" || extension == ".app" || extension == ".zcxi")