diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 75 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure.ui | 11 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.ui | 80 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_dialog.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_filesystem.cpp | 177 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_filesystem.h | 43 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_filesystem.ui | 395 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_general.cpp | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 55 | 
12 files changed, 774 insertions, 76 deletions
| diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f051e17b4..dc6fa07fc 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -33,6 +33,9 @@ add_executable(yuzu      configuration/configure_debug.ui      configuration/configure_dialog.cpp      configuration/configure_dialog.h +    configuration/configure_filesystem.cpp +    configuration/configure_filesystem.h +    configuration/configure_filesystem.ui      configuration/configure_gamelist.cpp      configuration/configure_gamelist.h      configuration/configure_gamelist.ui diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index f594106bf..92d9fb161 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -459,6 +459,49 @@ void Config::ReadDataStorageValues() {                      QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)))              .toString()              .toStdString()); +    FileUtil::GetUserPath( +        FileUtil::UserPath::LoadDir, +        qt_config +            ->value(QStringLiteral("load_directory"), +                    QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LoadDir))) +            .toString() +            .toStdString()); +    FileUtil::GetUserPath( +        FileUtil::UserPath::DumpDir, +        qt_config +            ->value(QStringLiteral("dump_directory"), +                    QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::DumpDir))) +            .toString() +            .toStdString()); +    FileUtil::GetUserPath( +        FileUtil::UserPath::CacheDir, +        qt_config +            ->value(QStringLiteral("cache_directory"), +                    QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir))) +            .toString() +            .toStdString()); +    Settings::values.gamecard_inserted = +        ReadSetting(QStringLiteral("gamecard_inserted"), false).toBool(); +    Settings::values.gamecard_current_game = +        ReadSetting(QStringLiteral("gamecard_current_game"), false).toBool(); +    Settings::values.gamecard_path = +        ReadSetting(QStringLiteral("gamecard_path"), QStringLiteral("")).toString().toStdString(); +    Settings::values.nand_total_size = static_cast<Settings::NANDTotalSize>( +        ReadSetting(QStringLiteral("nand_total_size"), +                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDTotalSize::S29_1GB))) +            .toULongLong()); +    Settings::values.nand_user_size = static_cast<Settings::NANDUserSize>( +        ReadSetting(QStringLiteral("nand_user_size"), +                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDUserSize::S26GB))) +            .toULongLong()); +    Settings::values.nand_system_size = static_cast<Settings::NANDSystemSize>( +        ReadSetting(QStringLiteral("nand_system_size"), +                    QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDSystemSize::S2_5GB))) +            .toULongLong()); +    Settings::values.sdmc_size = static_cast<Settings::SDMCSize>( +        ReadSetting(QStringLiteral("sdmc_size"), +                    QVariant::fromValue<u64>(static_cast<u64>(Settings::SDMCSize::S16GB))) +            .toULongLong());      qt_config->endGroup();  } @@ -466,6 +509,9 @@ void Config::ReadDataStorageValues() {  void Config::ReadDebuggingValues() {      qt_config->beginGroup(QStringLiteral("Debugging")); +    // Intentionally not using the QT default setting as this is intended to be changed in the ini +    Settings::values.record_frame_times = +        qt_config->value(QStringLiteral("record_frame_times"), false).toBool();      Settings::values.use_gdbstub = ReadSetting(QStringLiteral("use_gdbstub"), false).toBool();      Settings::values.gdbstub_port = ReadSetting(QStringLiteral("gdbstub_port"), 24689).toInt();      Settings::values.program_args = @@ -872,13 +918,40 @@ void Config::SaveDataStorageValues() {      WriteSetting(QStringLiteral("sdmc_directory"),                   QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)),                   QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir))); - +    WriteSetting(QStringLiteral("load_directory"), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LoadDir)), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LoadDir))); +    WriteSetting(QStringLiteral("dump_directory"), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::DumpDir)), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::DumpDir))); +    WriteSetting(QStringLiteral("cache_directory"), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir)), +                 QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir))); +    WriteSetting(QStringLiteral("gamecard_inserted"), Settings::values.gamecard_inserted, false); +    WriteSetting(QStringLiteral("gamecard_current_game"), Settings::values.gamecard_current_game, +                 false); +    WriteSetting(QStringLiteral("gamecard_path"), +                 QString::fromStdString(Settings::values.gamecard_path), QStringLiteral("")); +    WriteSetting(QStringLiteral("nand_total_size"), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_total_size)), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDTotalSize::S29_1GB))); +    WriteSetting(QStringLiteral("nand_user_size"), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_user_size)), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDUserSize::S26GB))); +    WriteSetting(QStringLiteral("nand_system_size"), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.nand_system_size)), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::NANDSystemSize::S2_5GB))); +    WriteSetting(QStringLiteral("sdmc_size"), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::values.sdmc_size)), +                 QVariant::fromValue<u64>(static_cast<u64>(Settings::SDMCSize::S16GB)));      qt_config->endGroup();  }  void Config::SaveDebuggingValues() {      qt_config->beginGroup(QStringLiteral("Debugging")); +    // Intentionally not using the QT default setting as this is intended to be changed in the ini +    qt_config->setValue(QStringLiteral("record_frame_times"), Settings::values.record_frame_times);      WriteSetting(QStringLiteral("use_gdbstub"), Settings::values.use_gdbstub, false);      WriteSetting(QStringLiteral("gdbstub_port"), Settings::values.gdbstub_port, 24689);      WriteSetting(QStringLiteral("program_args"), diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 267717bc9..49fadd0ef 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -63,6 +63,11 @@           <string>Profiles</string>          </attribute>         </widget> +       <widget class="ConfigureFilesystem" name="filesystemTab"> +        <attribute name="title"> +         <string>Filesystem</string> +        </attribute> +       </widget>         <widget class="ConfigureInputSimple" name="inputTab">          <attribute name="title">           <string>Input</string> @@ -126,6 +131,12 @@     <container>1</container>    </customwidget>    <customwidget> +   <class>ConfigureFilesystem</class> +   <extends>QWidget</extends> +   <header>configuration/configure_filesystem.h</header> +   <container>1</container> +  </customwidget> +  <customwidget>     <class>ConfigureAudio</class>     <extends>QWidget</extends>     <header>configuration/configure_audio.h</header> diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 5b7e03056..90c1f9459 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -34,8 +34,6 @@ void ConfigureDebug::SetConfiguration() {      ui->toggle_console->setChecked(UISettings::values.show_console);      ui->log_filter_edit->setText(QString::fromStdString(Settings::values.log_filter));      ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args)); -    ui->dump_exefs->setChecked(Settings::values.dump_exefs); -    ui->dump_decompressed_nso->setChecked(Settings::values.dump_nso);      ui->reporting_services->setChecked(Settings::values.reporting_services);      ui->quest_flag->setChecked(Settings::values.quest_flag);  } @@ -46,8 +44,6 @@ void ConfigureDebug::ApplyConfiguration() {      UISettings::values.show_console = ui->toggle_console->isChecked();      Settings::values.log_filter = ui->log_filter_edit->text().toStdString();      Settings::values.program_args = ui->homebrew_args_edit->text().toStdString(); -    Settings::values.dump_exefs = ui->dump_exefs->isChecked(); -    Settings::values.dump_nso = ui->dump_decompressed_nso->isChecked();      Settings::values.reporting_services = ui->reporting_services->isChecked();      Settings::values.quest_flag = ui->quest_flag->isChecked();      Debugger::ToggleConsole(); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 7e109cef0..ce49569bb 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -103,58 +103,6 @@          </item>         </layout>        </item> -     </layout> -    </widget> -   </item> -   <item> -    <widget class="QGroupBox" name="groupBox_3"> -     <property name="title"> -      <string>Homebrew</string> -     </property> -     <layout class="QVBoxLayout" name="verticalLayout_5"> -      <item> -       <layout class="QHBoxLayout" name="horizontalLayout_4"> -        <item> -         <widget class="QLabel" name="label_3"> -          <property name="text"> -           <string>Arguments String</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QLineEdit" name="homebrew_args_edit"/> -        </item> -       </layout> -      </item> -     </layout> -    </widget> -   </item> -   <item> -    <widget class="QGroupBox" name="groupBox_4"> -     <property name="title"> -      <string>Dump</string> -     </property> -     <layout class="QVBoxLayout" name="verticalLayout_6"> -      <item> -       <widget class="QCheckBox" name="dump_decompressed_nso"> -        <property name="whatsThis"> -         <string>When checked, any NSO yuzu tries to load or patch will be copied decompressed to the yuzu/dump directory.</string> -        </property> -        <property name="text"> -         <string>Dump Decompressed NSOs</string> -        </property> -       </widget> -      </item> -      <item> -       <widget class="QCheckBox" name="dump_exefs"> -        <property name="whatsThis"> -         <string>When checked, any game that yuzu loads will have its ExeFS dumped to the yuzu/dump directory.</string> -        </property> -        <property name="text"> -         <string>Dump ExeFS</string> -        </property> -       </widget> -      </item>        <item>         <widget class="QCheckBox" name="reporting_services">          <property name="text"> @@ -163,7 +111,7 @@         </widget>        </item>        <item> -       <widget class="QLabel" name="label_3"> +       <widget class="QLabel" name="label">          <property name="font">           <font>            <italic>true</italic> @@ -197,10 +145,36 @@      </widget>     </item>     <item> +    <widget class="QGroupBox" name="groupBox_3"> +     <property name="title"> +      <string>Homebrew</string> +     </property> +     <layout class="QVBoxLayout" name="verticalLayout_5"> +      <item> +       <layout class="QHBoxLayout" name="horizontalLayout_4"> +        <item> +         <widget class="QLabel" name="label_3"> +          <property name="text"> +           <string>Arguments String</string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QLineEdit" name="homebrew_args_edit"/> +        </item> +       </layout> +      </item> +     </layout> +    </widget> +   </item> +   <item>      <spacer name="verticalSpacer">       <property name="orientation">        <enum>Qt::Vertical</enum>       </property> +     <property name="sizeType"> +      <enum>QSizePolicy::Expanding</enum> +     </property>       <property name="sizeHint" stdset="0">        <size>         <width>20</width> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 775e3f2ea..7c875ae87 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -37,6 +37,7 @@ void ConfigureDialog::ApplyConfiguration() {      ui->gameListTab->ApplyConfiguration();      ui->systemTab->ApplyConfiguration();      ui->profileManagerTab->ApplyConfiguration(); +    ui->filesystemTab->applyConfiguration();      ui->inputTab->ApplyConfiguration();      ui->hotkeysTab->ApplyConfiguration(registry);      ui->graphicsTab->ApplyConfiguration(); @@ -73,7 +74,7 @@ Q_DECLARE_METATYPE(QList<QWidget*>);  void ConfigureDialog::PopulateSelectionList() {      const std::array<std::pair<QString, QList<QWidget*>>, 4> items{          {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->gameListTab}}, -         {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->audioTab}}, +         {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->filesystemTab, ui->audioTab}},           {tr("Graphics"), {ui->graphicsTab}},           {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}},      }; @@ -106,6 +107,7 @@ void ConfigureDialog::UpdateVisibleTabs() {          {ui->debugTab, tr("Debug")},          {ui->webTab, tr("Web")},          {ui->gameListTab, tr("Game List")}, +        {ui->filesystemTab, tr("Filesystem")},      };      [[maybe_unused]] const QSignalBlocker blocker(ui->tabWidget); diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp new file mode 100644 index 000000000..29f540eb7 --- /dev/null +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -0,0 +1,177 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QFileDialog> +#include <QMessageBox> +#include "common/common_paths.h" +#include "common/file_util.h" +#include "core/settings.h" +#include "ui_configure_filesystem.h" +#include "yuzu/configuration/configure_filesystem.h" +#include "yuzu/uisettings.h" + +namespace { + +template <typename T> +void SetComboBoxFromData(QComboBox* combo_box, T data) { +    const auto index = combo_box->findData(QVariant::fromValue(static_cast<u64>(data))); +    if (index >= combo_box->count() || index < 0) +        return; + +    combo_box->setCurrentIndex(index); +} + +} // Anonymous namespace + +ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) +    : QWidget(parent), ui(std::make_unique<Ui::ConfigureFilesystem>()) { +    ui->setupUi(this); +    this->setConfiguration(); + +    connect(ui->nand_directory_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::NAND, ui->nand_directory_edit); }); +    connect(ui->sdmc_directory_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::SD, ui->sdmc_directory_edit); }); +    connect(ui->gamecard_path_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::Gamecard, ui->gamecard_path_edit); }); +    connect(ui->dump_path_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::Dump, ui->dump_path_edit); }); +    connect(ui->load_path_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::Load, ui->load_path_edit); }); +    connect(ui->cache_directory_button, &QToolButton::pressed, this, +            [this] { SetDirectory(DirectoryTarget::Cache, ui->cache_directory_edit); }); + +    connect(ui->reset_game_list_cache, &QPushButton::pressed, this, +            &ConfigureFilesystem::ResetMetadata); + +    connect(ui->gamecard_inserted, &QCheckBox::stateChanged, this, +            &ConfigureFilesystem::UpdateEnabledControls); +    connect(ui->gamecard_current_game, &QCheckBox::stateChanged, this, +            &ConfigureFilesystem::UpdateEnabledControls); +} + +ConfigureFilesystem::~ConfigureFilesystem() = default; + +void ConfigureFilesystem::setConfiguration() { +    ui->nand_directory_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir))); +    ui->sdmc_directory_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir))); +    ui->gamecard_path_edit->setText(QString::fromStdString(Settings::values.gamecard_path)); +    ui->dump_path_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::DumpDir))); +    ui->load_path_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LoadDir))); +    ui->cache_directory_edit->setText( +        QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir))); + +    ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted); +    ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game); +    ui->dump_exefs->setChecked(Settings::values.dump_exefs); +    ui->dump_nso->setChecked(Settings::values.dump_nso); + +    ui->cache_game_list->setChecked(UISettings::values.cache_game_list); + +    SetComboBoxFromData(ui->nand_size, Settings::values.nand_total_size); +    SetComboBoxFromData(ui->usrnand_size, Settings::values.nand_user_size); +    SetComboBoxFromData(ui->sysnand_size, Settings::values.nand_system_size); +    SetComboBoxFromData(ui->sdmc_size, Settings::values.sdmc_size); + +    UpdateEnabledControls(); +} + +void ConfigureFilesystem::applyConfiguration() { +    FileUtil::GetUserPath(FileUtil::UserPath::NANDDir, +                          ui->nand_directory_edit->text().toStdString()); +    FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir, +                          ui->sdmc_directory_edit->text().toStdString()); +    FileUtil::GetUserPath(FileUtil::UserPath::DumpDir, ui->dump_path_edit->text().toStdString()); +    FileUtil::GetUserPath(FileUtil::UserPath::LoadDir, ui->load_path_edit->text().toStdString()); +    FileUtil::GetUserPath(FileUtil::UserPath::CacheDir, +                          ui->cache_directory_edit->text().toStdString()); +    Settings::values.gamecard_path = ui->gamecard_path_edit->text().toStdString(); + +    Settings::values.gamecard_inserted = ui->gamecard_inserted->isChecked(); +    Settings::values.gamecard_current_game = ui->gamecard_current_game->isChecked(); +    Settings::values.dump_exefs = ui->dump_exefs->isChecked(); +    Settings::values.dump_nso = ui->dump_nso->isChecked(); + +    UISettings::values.cache_game_list = ui->cache_game_list->isChecked(); + +    Settings::values.nand_total_size = static_cast<Settings::NANDTotalSize>( +        ui->nand_size->itemData(ui->nand_size->currentIndex()).toULongLong()); +    Settings::values.nand_system_size = static_cast<Settings::NANDSystemSize>( +        ui->nand_size->itemData(ui->sysnand_size->currentIndex()).toULongLong()); +    Settings::values.nand_user_size = static_cast<Settings::NANDUserSize>( +        ui->nand_size->itemData(ui->usrnand_size->currentIndex()).toULongLong()); +    Settings::values.sdmc_size = static_cast<Settings::SDMCSize>( +        ui->nand_size->itemData(ui->sdmc_size->currentIndex()).toULongLong()); +} + +void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit) { +    QString caption; + +    switch (target) { +    case DirectoryTarget::NAND: +        caption = tr("Select Emulated NAND Directory..."); +        break; +    case DirectoryTarget::SD: +        caption = tr("Select Emulated SD Directory..."); +        break; +    case DirectoryTarget::Gamecard: +        caption = tr("Select Gamecard Path..."); +        break; +    case DirectoryTarget::Dump: +        caption = tr("Select Dump Directory..."); +        break; +    case DirectoryTarget::Load: +        caption = tr("Select Mod Load Directory..."); +        break; +    case DirectoryTarget::Cache: +        caption = tr("Select Cache Directory..."); +        break; +    } + +    QString str; +    if (target == DirectoryTarget::Gamecard) { +        str = QFileDialog::getOpenFileName(this, caption, QFileInfo(edit->text()).dir().path(), +                                           QStringLiteral("NX Gamecard;*.xci")); +    } else { +        str = QFileDialog::getExistingDirectory(this, caption, edit->text()); +    } + +    if (str.isEmpty()) +        return; + +    edit->setText(str); +} + +void ConfigureFilesystem::ResetMetadata() { +    if (!FileUtil::Exists(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir) + DIR_SEP + +                          "game_list")) { +        QMessageBox::information(this, tr("Reset Metadata Cache"), +                                 tr("The metadata cache is already empty.")); +    } else if (FileUtil::DeleteDirRecursively(FileUtil::GetUserPath(FileUtil::UserPath::CacheDir) + +                                              DIR_SEP + "game_list")) { +        QMessageBox::information(this, tr("Reset Metadata Cache"), +                                 tr("The operation completed successfully.")); +        UISettings::values.is_game_list_reload_pending.exchange(true); +    } else { +        QMessageBox::warning( +            this, tr("Reset Metadata Cache"), +            tr("The metadata cache couldn't be deleted. It might be in use or non-existent.")); +    } +} + +void ConfigureFilesystem::UpdateEnabledControls() { +    ui->gamecard_current_game->setEnabled(ui->gamecard_inserted->isChecked()); +    ui->gamecard_path_edit->setEnabled(ui->gamecard_inserted->isChecked() && +                                       !ui->gamecard_current_game->isChecked()); +    ui->gamecard_path_button->setEnabled(ui->gamecard_inserted->isChecked() && +                                         !ui->gamecard_current_game->isChecked()); +} + +void ConfigureFilesystem::retranslateUi() { +    ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_filesystem.h b/src/yuzu/configuration/configure_filesystem.h new file mode 100644 index 000000000..a79303760 --- /dev/null +++ b/src/yuzu/configuration/configure_filesystem.h @@ -0,0 +1,43 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include <QWidget> + +class QLineEdit; + +namespace Ui { +class ConfigureFilesystem; +} + +class ConfigureFilesystem : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureFilesystem(QWidget* parent = nullptr); +    ~ConfigureFilesystem() override; + +    void applyConfiguration(); +    void retranslateUi(); + +private: +    void setConfiguration(); + +    enum class DirectoryTarget { +        NAND, +        SD, +        Gamecard, +        Dump, +        Load, +        Cache, +    }; + +    void SetDirectory(DirectoryTarget target, QLineEdit* edit); +    void ResetMetadata(); +    void UpdateEnabledControls(); + +    std::unique_ptr<Ui::ConfigureFilesystem> ui; +}; diff --git a/src/yuzu/configuration/configure_filesystem.ui b/src/yuzu/configuration/configure_filesystem.ui new file mode 100644 index 000000000..58cd07f52 --- /dev/null +++ b/src/yuzu/configuration/configure_filesystem.ui @@ -0,0 +1,395 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureFilesystem</class> + <widget class="QWidget" name="ConfigureFilesystem"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>453</width> +    <height>561</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Form</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <layout class="QVBoxLayout" name="verticalLayout_3"> +     <item> +      <widget class="QGroupBox" name="groupBox"> +       <property name="title"> +        <string>Storage Directories</string> +       </property> +       <layout class="QGridLayout" name="gridLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="label"> +          <property name="text"> +           <string>NAND</string> +          </property> +         </widget> +        </item> +        <item row="0" column="3"> +         <widget class="QToolButton" name="nand_directory_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +        <item row="0" column="2"> +         <widget class="QLineEdit" name="nand_directory_edit"/> +        </item> +        <item row="1" column="2"> +         <widget class="QLineEdit" name="sdmc_directory_edit"/> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="label_2"> +          <property name="text"> +           <string>SD Card</string> +          </property> +         </widget> +        </item> +        <item row="1" column="3"> +         <widget class="QToolButton" name="sdmc_directory_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <spacer name="horizontalSpacer"> +          <property name="orientation"> +           <enum>Qt::Horizontal</enum> +          </property> +          <property name="sizeType"> +           <enum>QSizePolicy::Maximum</enum> +          </property> +          <property name="sizeHint" stdset="0"> +           <size> +            <width>60</width> +            <height>20</height> +           </size> +          </property> +         </spacer> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="groupBox_2"> +       <property name="title"> +        <string>Gamecard</string> +       </property> +       <layout class="QGridLayout" name="gridLayout_2"> +        <item row="2" column="1"> +         <widget class="QLabel" name="label_3"> +          <property name="text"> +           <string>Path</string> +          </property> +         </widget> +        </item> +        <item row="2" column="2"> +         <widget class="QLineEdit" name="gamecard_path_edit"/> +        </item> +        <item row="0" column="1"> +         <widget class="QCheckBox" name="gamecard_inserted"> +          <property name="text"> +           <string>Inserted</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QCheckBox" name="gamecard_current_game"> +          <property name="text"> +           <string>Current Game</string> +          </property> +         </widget> +        </item> +        <item row="2" column="3"> +         <widget class="QToolButton" name="gamecard_path_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="groupBox_3"> +       <property name="title"> +        <string>Storage Sizes</string> +       </property> +       <layout class="QGridLayout" name="gridLayout_3"> +        <item row="3" column="0"> +         <widget class="QLabel" name="label_5"> +          <property name="text"> +           <string>SD Card</string> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="label_4"> +          <property name="text"> +           <string>System NAND</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QComboBox" name="sysnand_size"> +          <item> +           <property name="text"> +            <string>2.5 GB</string> +           </property> +          </item> +         </widget> +        </item> +        <item row="3" column="1"> +         <widget class="QComboBox" name="sdmc_size"> +          <property name="currentText"> +           <string>32 GB</string> +          </property> +          <item> +           <property name="text"> +            <string>1 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>2 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>4 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>8 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>16 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>32 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>64 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>128 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>256 GB</string> +           </property> +          </item> +          <item> +           <property name="text"> +            <string>1 TB</string> +           </property> +          </item> +         </widget> +        </item> +        <item row="2" column="1"> +         <widget class="QComboBox" name="usrnand_size"> +          <item> +           <property name="text"> +            <string>26 GB</string> +           </property> +          </item> +         </widget> +        </item> +        <item row="2" column="0"> +         <widget class="QLabel" name="label_6"> +          <property name="text"> +           <string>User NAND</string> +          </property> +         </widget> +        </item> +        <item row="0" column="0"> +         <widget class="QLabel" name="label_7"> +          <property name="text"> +           <string>NAND</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QComboBox" name="nand_size"> +          <item> +           <property name="text"> +            <string>29.1 GB</string> +           </property> +          </item> +         </widget> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="groupBox_4"> +       <property name="title"> +        <string>Patch Manager</string> +       </property> +       <layout class="QGridLayout" name="gridLayout_4"> +        <item row="1" column="2"> +         <widget class="QLineEdit" name="load_path_edit"/> +        </item> +        <item row="0" column="2"> +         <widget class="QLineEdit" name="dump_path_edit"/> +        </item> +        <item row="0" column="3"> +         <widget class="QToolButton" name="dump_path_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +        <item row="1" column="3"> +         <widget class="QToolButton" name="load_path_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +        <item row="2" column="0" colspan="4"> +         <layout class="QHBoxLayout" name="horizontalLayout"> +          <item> +           <widget class="QCheckBox" name="dump_nso"> +            <property name="text"> +             <string>Dump Decompressed NSOs</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QCheckBox" name="dump_exefs"> +            <property name="text"> +             <string>Dump ExeFS</string> +            </property> +           </widget> +          </item> +         </layout> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="label_9"> +          <property name="text"> +           <string>Mod Load Root</string> +          </property> +         </widget> +        </item> +        <item row="0" column="0"> +         <widget class="QLabel" name="label_8"> +          <property name="text"> +           <string>Dump Root</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <spacer name="horizontalSpacer_2"> +          <property name="orientation"> +           <enum>Qt::Horizontal</enum> +          </property> +          <property name="sizeType"> +           <enum>QSizePolicy::Fixed</enum> +          </property> +          <property name="sizeHint" stdset="0"> +           <size> +            <width>40</width> +            <height>20</height> +           </size> +          </property> +         </spacer> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="groupBox_5"> +       <property name="title"> +        <string>Caching</string> +       </property> +       <layout class="QGridLayout" name="gridLayout_5"> +        <item row="0" column="0"> +         <widget class="QLabel" name="label_10"> +          <property name="text"> +           <string>Cache Directory</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <spacer name="horizontalSpacer_3"> +          <property name="orientation"> +           <enum>Qt::Horizontal</enum> +          </property> +          <property name="sizeType"> +           <enum>QSizePolicy::Fixed</enum> +          </property> +          <property name="sizeHint" stdset="0"> +           <size> +            <width>40</width> +            <height>20</height> +           </size> +          </property> +         </spacer> +        </item> +        <item row="0" column="2"> +         <widget class="QLineEdit" name="cache_directory_edit"/> +        </item> +        <item row="0" column="3"> +         <widget class="QToolButton" name="cache_directory_button"> +          <property name="text"> +           <string>...</string> +          </property> +         </widget> +        </item> +        <item row="1" column="0" colspan="4"> +         <layout class="QHBoxLayout" name="horizontalLayout_2"> +          <item> +           <widget class="QCheckBox" name="cache_game_list"> +            <property name="text"> +             <string>Cache Game List Metadata</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QPushButton" name="reset_game_list_cache"> +            <property name="text"> +             <string>Reset Metadata Cache</string> +            </property> +           </widget> +          </item> +         </layout> +        </item> +       </layout> +      </widget> +     </item> +    </layout> +   </item> +   <item> +    <spacer name="verticalSpacer"> +     <property name="orientation"> +      <enum>Qt::Vertical</enum> +     </property> +     <property name="sizeHint" stdset="0"> +      <size> +       <width>20</width> +       <height>40</height> +      </size> +     </property> +    </spacer> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 10bcd650e..b49446be9 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -2,6 +2,7 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <QSpinBox>  #include "core/core.h"  #include "core/settings.h"  #include "ui_configure_general.h" diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 7613197f2..f2977719c 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -182,6 +182,8 @@ void ConfigureInput::UpdateUIEnabled() {          players_configure[i]->setEnabled(players_controller[i]->currentIndex() != 0);      } +    ui->handheld_connected->setChecked(ui->handheld_connected->isChecked() && +                                       !ui->use_docked_mode->isChecked());      ui->handheld_connected->setEnabled(!ui->use_docked_mode->isChecked());      ui->handheld_configure->setEnabled(ui->handheld_connected->isChecked() &&                                         !ui->use_docked_mode->isChecked()); diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 8304c6517..f147044d9 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -54,6 +54,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual  #include <QProgressDialog>  #include <QShortcut>  #include <QStatusBar> +#include <QSysInfo>  #include <QtConcurrent/QtConcurrent>  #include <fmt/format.h> @@ -66,6 +67,9 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual  #include "common/microprofile.h"  #include "common/scm_rev.h"  #include "common/scope_exit.h" +#ifdef ARCHITECTURE_x86_64 +#include "common/x64/cpu_detect.h" +#endif  #include "common/telemetry.h"  #include "core/core.h"  #include "core/crypto/key_manager.h" @@ -205,6 +209,10 @@ GMainWindow::GMainWindow()      LOG_INFO(Frontend, "yuzu Version: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch,               Common::g_scm_desc); +#ifdef ARCHITECTURE_x86_64 +    LOG_INFO(Frontend, "Host CPU: {}", Common::GetCPUCaps().cpu_string); +#endif +    LOG_INFO(Frontend, "Host OS: {}", QSysInfo::prettyProductName().toStdString());      UpdateWindowTitle();      show(); @@ -213,7 +221,7 @@ GMainWindow::GMainWindow()          std::make_unique<FileSys::ContentProviderUnion>());      Core::System::GetInstance().RegisterContentProvider(          FileSys::ContentProviderUnionSlot::FrontendManual, provider.get()); -    Service::FileSystem::CreateFactories(*vfs); +    Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs);      // Gen keys if necessary      OnReinitializeKeys(ReinitializeKeyBehavior::NoWarning); @@ -964,11 +972,11 @@ void GMainWindow::BootGame(const QString& filename) {      }      status_bar_update_timer.start(2000); +    const u64 title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); +      std::string title_name;      const auto res = Core::System::GetInstance().GetGameName(title_name);      if (res != Loader::ResultStatus::Success) { -        const u64 title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); -          const auto [nacp, icon_file] = FileSys::PatchManager(title_id).GetControlMetadata();          if (nacp != nullptr)              title_name = nacp->GetApplicationName(); @@ -976,7 +984,7 @@ void GMainWindow::BootGame(const QString& filename) {          if (title_name.empty())              title_name = FileUtil::GetFilename(filename.toStdString());      } - +    LOG_INFO(Frontend, "Booting game: {:016X} | {}", title_id, title_name);      UpdateWindowTitle(QString::fromStdString(title_name));      loading_screen->Prepare(Core::System::GetInstance().GetAppLoader()); @@ -1499,15 +1507,19 @@ void GMainWindow::OnMenuInstallToNAND() {              failed();              return;          } -        const auto res = -            Service::FileSystem::GetUserNANDContents()->InstallEntry(*nsp, false, qt_raw_copy); +        const auto res = Core::System::GetInstance() +                             .GetFileSystemController() +                             .GetUserNANDContents() +                             ->InstallEntry(*nsp, false, qt_raw_copy);          if (res == FileSys::InstallResult::Success) {              success();          } else {              if (res == FileSys::InstallResult::ErrorAlreadyExists) {                  if (overwrite()) { -                    const auto res2 = Service::FileSystem::GetUserNANDContents()->InstallEntry( -                        *nsp, true, qt_raw_copy); +                    const auto res2 = Core::System::GetInstance() +                                          .GetFileSystemController() +                                          .GetUserNANDContents() +                                          ->InstallEntry(*nsp, true, qt_raw_copy);                      if (res2 == FileSys::InstallResult::Success) {                          success();                      } else { @@ -1561,19 +1573,28 @@ void GMainWindow::OnMenuInstallToNAND() {          FileSys::InstallResult res;          if (index >= static_cast<size_t>(FileSys::TitleType::Application)) { -            res = Service::FileSystem::GetUserNANDContents()->InstallEntry( -                *nca, static_cast<FileSys::TitleType>(index), false, qt_raw_copy); +            res = Core::System::GetInstance() +                      .GetFileSystemController() +                      .GetUserNANDContents() +                      ->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), false, +                                     qt_raw_copy);          } else { -            res = Service::FileSystem::GetSystemNANDContents()->InstallEntry( -                *nca, static_cast<FileSys::TitleType>(index), false, qt_raw_copy); +            res = Core::System::GetInstance() +                      .GetFileSystemController() +                      .GetSystemNANDContents() +                      ->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), false, +                                     qt_raw_copy);          }          if (res == FileSys::InstallResult::Success) {              success();          } else if (res == FileSys::InstallResult::ErrorAlreadyExists) {              if (overwrite()) { -                const auto res2 = Service::FileSystem::GetUserNANDContents()->InstallEntry( -                    *nca, static_cast<FileSys::TitleType>(index), true, qt_raw_copy); +                const auto res2 = Core::System::GetInstance() +                                      .GetFileSystemController() +                                      .GetUserNANDContents() +                                      ->InstallEntry(*nca, static_cast<FileSys::TitleType>(index), +                                                     true, qt_raw_copy);                  if (res2 == FileSys::InstallResult::Success) {                      success();                  } else { @@ -1603,7 +1624,7 @@ void GMainWindow::OnMenuSelectEmulatedDirectory(EmulatedDirectoryTarget target)          FileUtil::GetUserPath(target == EmulatedDirectoryTarget::SDMC ? FileUtil::UserPath::SDMCDir                                                                        : FileUtil::UserPath::NANDDir,                                dir_path.toStdString()); -        Service::FileSystem::CreateFactories(*vfs); +        Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs);          game_list->PopulateAsync(UISettings::values.game_dirs);      }  } @@ -1988,7 +2009,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {          const auto function = [this, &keys, &pdm] {              keys.PopulateFromPartitionData(pdm); -            Service::FileSystem::CreateFactories(*vfs); +            Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs);              keys.DeriveETicket(pdm);          }; @@ -2033,7 +2054,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {          prog.close();      } -    Service::FileSystem::CreateFactories(*vfs); +    Core::System::GetInstance().GetFileSystemController().CreateFactories(*vfs);      if (behavior == ReinitializeKeyBehavior::Warning) {          game_list->PopulateAsync(UISettings::values.game_dirs); | 
