diff --git a/dist/qt_themes/colorful/icons/256x256/plus_folder.png b/dist/qt_themes/colorful/icons/256x256/plus_folder.png index 92539549ee..31471e3a2a 100644 Binary files a/dist/qt_themes/colorful/icons/256x256/plus_folder.png and b/dist/qt_themes/colorful/icons/256x256/plus_folder.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/download.png b/dist/qt_themes/colorful/icons/48x48/download.png deleted file mode 100644 index baceb7ae99..0000000000 Binary files a/dist/qt_themes/colorful/icons/48x48/download.png and /dev/null differ diff --git a/dist/qt_themes/colorful/icons/48x48/trash.png b/dist/qt_themes/colorful/icons/48x48/trash.png new file mode 100644 index 0000000000..e60dce2e32 Binary files /dev/null and b/dist/qt_themes/colorful/icons/48x48/trash.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/upload.png b/dist/qt_themes/colorful/icons/48x48/upload.png deleted file mode 100644 index 053b8c3fea..0000000000 Binary files a/dist/qt_themes/colorful/icons/48x48/upload.png and /dev/null differ diff --git a/dist/qt_themes/colorful/icons/48x48/user-trash.png b/dist/qt_themes/colorful/icons/48x48/user-trash.png deleted file mode 100644 index 19ce265069..0000000000 Binary files a/dist/qt_themes/colorful/icons/48x48/user-trash.png and /dev/null differ diff --git a/dist/qt_themes/colorful/style.qrc b/dist/qt_themes/colorful/style.qrc index f64d405707..fc85922d6b 100644 --- a/dist/qt_themes/colorful/style.qrc +++ b/dist/qt_themes/colorful/style.qrc @@ -18,9 +18,7 @@ SPDX-License-Identifier: GPL-2.0-or-later icons/48x48/bad_folder.png icons/48x48/chip.png icons/48x48/folder.png - icons/48x48/user-trash.png - icons/48x48/download.png - icons/48x48/upload.png + icons/48x48/trash.png icons/48x48/list-add.png icons/48x48/no_avatar.png icons/48x48/sd_card.png diff --git a/dist/qt_themes/colorful_midnight_blue/style.qrc b/dist/qt_themes/colorful_midnight_blue/style.qrc index 18f8a6b823..2aee8ea1e1 100644 --- a/dist/qt_themes/colorful_midnight_blue/style.qrc +++ b/dist/qt_themes/colorful_midnight_blue/style.qrc @@ -11,9 +11,7 @@ SPDX-License-Identifier: GPL-2.0-or-later ../colorful/icons/48x48/bad_folder.png ../colorful/icons/48x48/chip.png ../colorful/icons/48x48/folder.png - ../colorful/icons/48x48/user-trash.png - ../colorful/icons/48x48/download.png - ../colorful/icons/48x48/upload.png + ../colorful/icons/48x48/trash.png ../colorful/icons/48x48/list-add.png ../colorful/icons/48x48/sd_card.png ../colorful/icons/256x256/plus_folder.png diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc index e59f0ade9c..45a91ef2dc 100644 --- a/dist/qt_themes/default/default.qrc +++ b/dist/qt_themes/default/default.qrc @@ -14,9 +14,7 @@ SPDX-License-Identifier: GPL-2.0-or-later icons/48x48/bad_folder.png icons/48x48/chip.png icons/48x48/folder.png - icons/48x48/user-trash.png - icons/48x48/download.png - icons/48x48/upload.png + icons/48x48/trash.png icons/48x48/list-add.png icons/48x48/sd_card.png icons/48x48/star.png diff --git a/dist/qt_themes/default/icons/256x256/eden.png b/dist/qt_themes/default/icons/256x256/eden.png index dee7b91dc7..c0d7d8e37c 100644 Binary files a/dist/qt_themes/default/icons/256x256/eden.png and b/dist/qt_themes/default/icons/256x256/eden.png differ diff --git a/dist/qt_themes/default/icons/48x48/download.png b/dist/qt_themes/default/icons/48x48/download.png deleted file mode 100644 index c0e3213655..0000000000 Binary files a/dist/qt_themes/default/icons/48x48/download.png and /dev/null differ diff --git a/dist/qt_themes/default/icons/48x48/trash.png b/dist/qt_themes/default/icons/48x48/trash.png new file mode 100644 index 0000000000..547b821de9 Binary files /dev/null and b/dist/qt_themes/default/icons/48x48/trash.png differ diff --git a/dist/qt_themes/default/icons/48x48/upload.png b/dist/qt_themes/default/icons/48x48/upload.png deleted file mode 100644 index 46120cbdaf..0000000000 Binary files a/dist/qt_themes/default/icons/48x48/upload.png and /dev/null differ diff --git a/dist/qt_themes/default/icons/48x48/user-trash.png b/dist/qt_themes/default/icons/48x48/user-trash.png deleted file mode 100644 index ef360a4775..0000000000 Binary files a/dist/qt_themes/default/icons/48x48/user-trash.png and /dev/null differ diff --git a/dist/qt_themes/default_dark/style.qrc b/dist/qt_themes/default_dark/style.qrc index b76f9a0bda..ac6c9fe4e9 100644 --- a/dist/qt_themes/default_dark/style.qrc +++ b/dist/qt_themes/default_dark/style.qrc @@ -13,9 +13,7 @@ SPDX-License-Identifier: GPL-2.0-or-later ../colorful/icons/48x48/bad_folder.png ../colorful/icons/48x48/chip.png ../colorful/icons/48x48/folder.png - ../colorful/icons/48x48/user-trash.png - ../colorful/icons/48x48/download.png - ../colorful/icons/48x48/upload.png + ../colorful/icons/48x48/trash.png ../qdarkstyle/icons/48x48/no_avatar.png ../colorful/icons/48x48/list-add.png ../colorful/icons/48x48/sd_card.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/download.png b/dist/qt_themes/qdarkstyle/icons/48x48/download.png deleted file mode 100644 index d4d26fe2ea..0000000000 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/download.png and /dev/null differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/trash.png b/dist/qt_themes/qdarkstyle/icons/48x48/trash.png new file mode 100644 index 0000000000..e59fe85c03 Binary files /dev/null and b/dist/qt_themes/qdarkstyle/icons/48x48/trash.png differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/upload.png b/dist/qt_themes/qdarkstyle/icons/48x48/upload.png deleted file mode 100644 index ce255fb467..0000000000 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/upload.png and /dev/null differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/user-trash.png b/dist/qt_themes/qdarkstyle/icons/48x48/user-trash.png deleted file mode 100644 index e273528101..0000000000 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/user-trash.png and /dev/null differ diff --git a/dist/qt_themes/qdarkstyle/style.qrc b/dist/qt_themes/qdarkstyle/style.qrc index 3902996058..2b5ca31e72 100644 --- a/dist/qt_themes/qdarkstyle/style.qrc +++ b/dist/qt_themes/qdarkstyle/style.qrc @@ -9,9 +9,7 @@ icons/48x48/bad_folder.png icons/48x48/chip.png icons/48x48/folder.png - icons/48x48/user-trash.png - icons/48x48/download.png - icons/48x48/upload.png + icons/48x48/trash.png icons/48x48/no_avatar.png icons/48x48/list-add.png icons/48x48/sd_card.png diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc index 75212008a3..dc3d7fecbd 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc @@ -6,9 +6,6 @@ ../qdarkstyle/icons/48x48/bad_folder.png ../qdarkstyle/icons/48x48/chip.png ../qdarkstyle/icons/48x48/folder.png - ../qdarkstyle/icons/48x48/user-trash.png - ../qdarkstyle/icons/48x48/download.png - ../qdarkstyle/icons/48x48/upload.png ../qdarkstyle/icons/48x48/no_avatar.png ../qdarkstyle/icons/48x48/list-add.png ../qdarkstyle/icons/48x48/sd_card.png diff --git a/src/android/app/src/main/legacy/drawable/ic_icon_bg.png b/src/android/app/src/main/legacy/drawable/ic_icon_bg.png index f3d4c55dea..3327014f8f 100644 Binary files a/src/android/app/src/main/legacy/drawable/ic_icon_bg.png and b/src/android/app/src/main/legacy/drawable/ic_icon_bg.png differ diff --git a/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png b/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png index 5859c43f86..a9fc55a4f5 100644 Binary files a/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png and b/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png differ diff --git a/src/android/app/src/main/res/drawable/ic_icon_bg.png b/src/android/app/src/main/res/drawable/ic_icon_bg.png index db7e53410d..7da2c6a1a3 100644 Binary files a/src/android/app/src/main/res/drawable/ic_icon_bg.png and b/src/android/app/src/main/res/drawable/ic_icon_bg.png differ diff --git a/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png b/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png index ddb43b349c..18325c031a 100644 Binary files a/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png and b/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png differ diff --git a/src/core/device_memory_manager.h b/src/core/device_memory_manager.h index 6dcf7bb228..192c6e5c01 100644 --- a/src/core/device_memory_manager.h +++ b/src/core/device_memory_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -109,6 +112,9 @@ public: void ReadBlock(DAddr address, void* dest_pointer, size_t size); void ReadBlockUnsafe(DAddr address, void* dest_pointer, size_t size); +#ifdef YUZU_DEBUG + bool ReadBlockFastChecked(DAddr address, void* dest_pointer, size_t size); +#endif void WriteBlock(DAddr address, const void* src_pointer, size_t size); void WriteBlockUnsafe(DAddr address, const void* src_pointer, size_t size); diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 52dff5df9a..3629579c09 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -467,6 +470,29 @@ void DeviceMemoryManager::ReadBlockUnsafe(DAddr address, void* dest_poin }); } +#ifdef YUZU_DEBUG +template +bool DeviceMemoryManager::ReadBlockFastChecked(DAddr address, void* dest_pointer, + size_t size) { + bool success = true; + WalkBlock( + address, size, + [&](size_t copy_amount, DAddr current_vaddr) { + LOG_CRITICAL(Render, "DeviceMemory OOB/unmapped: addr=0x{:x} size={}", current_vaddr, + size); + std::memset(dest_pointer, 0, copy_amount); + success = false; + }, + [&](size_t copy_amount, const u8* const src_ptr) { + std::memcpy(dest_pointer, src_ptr, copy_amount); + }, + [&](const std::size_t copy_amount) { + dest_pointer = static_cast(dest_pointer) + copy_amount; + }); + return success; +} +#endif + template void DeviceMemoryManager::WriteBlockUnsafe(DAddr address, const void* src_pointer, size_t size) { diff --git a/src/frontend_common/data_manager.cpp b/src/frontend_common/data_manager.cpp index e83e3ada40..4a63ed9e28 100644 --- a/src/frontend_common/data_manager.cpp +++ b/src/frontend_common/data_manager.cpp @@ -21,9 +21,7 @@ const std::string GetDataDir(DataDir dir) case DataDir::UserNand: return (nand_dir / "user" / "Contents" / "registered").string(); case DataDir::SysNand: - // NB: do NOT delete save - // that contains profile data and other stuff - return (nand_dir / "system" / "Contents" / "registered").string(); + return (nand_dir / "system").string(); case DataDir::Mods: return Common::FS::GetEdenPathString(Common::FS::EdenPath::LoadDir); case DataDir::Shaders: diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt index 1f633fd894..fe728e0377 100644 --- a/src/qt_common/CMakeLists.txt +++ b/src/qt_common/CMakeLists.txt @@ -35,28 +35,9 @@ if (ENABLE_QT) target_link_libraries(qt_common PRIVATE Qt6::Widgets) endif() -target_compile_definitions(qt_common PUBLIC - # Use QStringBuilder for string concatenation to reduce - # the overall number of temporary strings created. - QT_USE_QSTRINGBUILDER - - # Disable implicit conversions from/to C strings - QT_NO_CAST_FROM_ASCII - QT_NO_CAST_TO_ASCII - - # Disable implicit type narrowing in signal/slot connect() calls. - QT_NO_NARROWING_CONVERSIONS_IN_CONNECT - - # Disable unsafe overloads of QProcess' start() function. - QT_NO_PROCESS_COMBINED_ARGUMENT_START - - # Disable implicit QString->QUrl conversions to enforce use of proper resolving functions. - QT_NO_URL_CAST_FROM_STRING -) - add_subdirectory(externals) -target_link_libraries(qt_common PRIVATE core Qt6::Core Qt6::Concurrent SimpleIni::SimpleIni QuaZip::QuaZip) +target_link_libraries(qt_common PRIVATE core Qt6::Core SimpleIni::SimpleIni QuaZip::QuaZip) target_link_libraries(qt_common PUBLIC frozen::frozen) if (NOT APPLE AND ENABLE_OPENGL) diff --git a/src/qt_common/externals/CMakeLists.txt b/src/qt_common/externals/CMakeLists.txt index b998090d90..189a52c0a6 100644 --- a/src/qt_common/externals/CMakeLists.txt +++ b/src/qt_common/externals/CMakeLists.txt @@ -16,4 +16,5 @@ set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) AddJsonPackage(quazip) # frozen +# TODO(crueter): Qt String Lookup AddJsonPackage(frozen) diff --git a/src/qt_common/qt_content_util.cpp b/src/qt_common/qt_content_util.cpp index 98ae9620c7..9cbd1caf02 100644 --- a/src/qt_common/qt_content_util.cpp +++ b/src/qt_common/qt_content_util.cpp @@ -1,21 +1,17 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "frontend_common/data_manager.h" +#include "qt_common/qt_game_util.h" #include "qt_content_util.h" #include "common/fs/fs.h" #include "core/hle/service/acc/profile_manager.h" #include "frontend_common/content_manager.h" #include "frontend_common/firmware_manager.h" #include "qt_common/qt_common.h" -#include "qt_common/qt_game_util.h" #include "qt_common/qt_progress_dialog.h" #include "qt_frontend_util.h" -#include -#include #include -#include namespace QtCommon::Content { @@ -25,10 +21,10 @@ bool CheckGameFirmware(u64 program_id, QObject* parent) && !FirmwareManager::CheckFirmwarePresence(*system)) { auto result = QtCommon::Frontend::ShowMessage( QMessageBox::Warning, - tr("Game Requires Firmware"), - tr("The game you are trying to launch requires firmware to boot or to get past the " - "opening menu. Please " - "dump and install firmware, or press \"OK\" to launch anyways."), + "Game Requires Firmware", + "The game you are trying to launch requires firmware to boot or to get past the " + "opening menu. Please " + "dump and install firmware, or press \"OK\" to launch anyways.", QMessageBox::Ok | QMessageBox::Cancel, parent); @@ -64,8 +60,8 @@ void InstallFirmware(const QString& location, bool recursive) const auto ShowMessage = [&]() { QtCommon::Frontend::ShowMessage(icon, - tr(failedTitle), - tr(GetFirmwareInstallResultString(result))); + failedTitle, + GetFirmwareInstallResultString(result)); }; LOG_INFO(Frontend, "Installing firmware from {}", location.toStdString()); @@ -129,8 +125,8 @@ void InstallFirmware(const QString& location, bool recursive) i++; auto firmware_src_vfile = vfs->OpenFile(firmware_src_path.generic_string(), FileSys::OpenMode::Read); - auto firmware_dst_vfile = firmware_vdir->CreateFileRelative( - firmware_src_path.filename().string()); + auto firmware_dst_vfile = firmware_vdir + ->CreateFileRelative(firmware_src_path.filename().string()); if (!VfsRawCopy(firmware_src_vfile, firmware_dst_vfile)) { LOG_ERROR(Frontend, @@ -172,9 +168,9 @@ void InstallFirmware(const QString& location, bool recursive) const auto failed_names = QString::fromStdString( fmt::format("{}", fmt::join(results, "\n"))); progress.close(); - QtCommon::Frontend::Critical( - tr("Firmware integrity verification failed!"), - tr("Verification failed for the following files:\n\n%1").arg(failed_names)); + QtCommon::Frontend::Critical(tr("Firmware integrity verification failed!"), + tr("Verification failed for the following files:\n\n%1") + .arg(failed_names)); return; } @@ -185,10 +181,10 @@ void InstallFirmware(const QString& location, bool recursive) const std::string display_version(firmware_data.display_version.data()); result = FirmwareInstallResult::Success; - QtCommon::Frontend::Information( - rootObject, - tr(successTitle), - tr(GetFirmwareInstallResultString(result)).arg(QString::fromStdString(display_version))); + QtCommon::Frontend::Information(rootObject, + tr(successTitle), + tr(GetFirmwareInstallResultString(result)) + .arg(QString::fromStdString(display_version))); } QString UnzipFirmwareToTmp(const QString& location) @@ -197,7 +193,7 @@ QString UnzipFirmwareToTmp(const QString& location) fs::path tmp{fs::temp_directory_path()}; if (!fs::create_directories(tmp / "eden" / "firmware")) { - return QString(); + return ""; } tmp /= "eden"; @@ -209,7 +205,7 @@ QString UnzipFirmwareToTmp(const QString& location) QStringList result = JlCompress::extractDir(&zip, qCacheDir); if (result.isEmpty()) { - return QString(); + return ""; } return qCacheDir; @@ -268,8 +264,9 @@ void InstallKeys() return; } - FirmwareManager::KeyInstallResult result - = FirmwareManager::InstallKeys(key_source_location.toStdString(), "keys"); + FirmwareManager::KeyInstallResult result = FirmwareManager::InstallKeys(key_source_location + .toStdString(), + "keys"); system->GetFileSystemController().CreateFactories(*QtCommon::vfs); @@ -285,14 +282,9 @@ void InstallKeys() } } -void VerifyInstalledContents() -{ +void VerifyInstalledContents() { // Initialize a progress dialog. - QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), - tr("Cancel"), - 0, - 100, - QtCommon::rootObject); + QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, QtCommon::rootObject); progress.setWindowModality(Qt::WindowModal); progress.setMinimumDuration(100); progress.setAutoClose(false); @@ -304,17 +296,16 @@ void VerifyInstalledContents() return progress.wasCanceled(); }; - const std::vector result - = ContentManager::VerifyInstalledContents(*QtCommon::system, - *QtCommon::provider, - QtProgressCallback); + const std::vector result = + ContentManager::VerifyInstalledContents(*QtCommon::system, *QtCommon::provider, QtProgressCallback); progress.close(); if (result.empty()) { QtCommon::Frontend::Information(tr("Integrity verification succeeded!"), tr("The operation completed successfully.")); } else { - const auto failed_names = QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); + const auto failed_names = + QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); QtCommon::Frontend::Critical( tr("Integrity verification failed!"), tr("Verification failed for the following files:\n\n%1").arg(failed_names)); @@ -341,7 +332,7 @@ void FixProfiles() qorphaned.reserve(8 * 33); for (const std::string& s : orphaned) { - qorphaned = qorphaned % QStringLiteral("\n") % QString::fromStdString(s); + qorphaned += "\n" + QString::fromStdString(s); } QtCommon::Frontend::Critical( @@ -357,19 +348,18 @@ void FixProfiles() QtCommon::Game::OpenSaveFolder(); } -void ClearDataDir(FrontendCommon::DataManager::DataDir dir) -{ - auto result = QtCommon::Frontend::Warning(tr("Really clear data?"), - tr("Important data may be lost!"), +void ClearDataDir(FrontendCommon::DataManager::DataDir dir) { + auto result = QtCommon::Frontend::Warning("Really clear data?", + "Important data may be lost!", QMessageBox::Yes | QMessageBox::No); if (result != QMessageBox::Yes) return; result = QtCommon::Frontend::Warning( - tr("Are you REALLY sure?"), - tr("Once deleted, your data will NOT come back!\n" - "Only do this if you're 100% sure you want to delete this data."), + "Are you REALLY sure?", + "Once deleted, your data will NOT come back!\n" + "Only do this if you're 100% sure you want to delete this data.", QMessageBox::Yes | QMessageBox::No); if (result != QMessageBox::Yes) @@ -383,130 +373,4 @@ void ClearDataDir(FrontendCommon::DataManager::DataDir dir) dialog.close(); } -void ExportDataDir(FrontendCommon::DataManager::DataDir data_dir, std::function callback) -{ - const std::string dir = FrontendCommon::DataManager::GetDataDir(data_dir); - - const QString zip_dump_location - = QtCommon::Frontend::GetSaveFileName(tr("Select Export Location"), - QStringLiteral("export.zip"), - tr("Zipped Archives (*.zip)")); - - if (zip_dump_location.isEmpty()) - return; - - QMetaObject::Connection* connection = new QMetaObject::Connection; - *connection = QObject::connect(qApp, &QGuiApplication::aboutToQuit, rootObject, [=]() mutable { - QtCommon::Frontend::Warning(tr("Still Exporting"), - tr("Eden is still exporting some data, and will continue " - "running in the background until it's done.")); - }); - - QtCommon::Frontend::QtProgressDialog* progress = new QtCommon::Frontend::QtProgressDialog( - tr("Compressing, this may take a while..."), tr("Background"), 0, 0, rootObject); - - progress->setWindowModality(Qt::WindowModal); - progress->show(); - QGuiApplication::processEvents(); - - QFuture future = QtConcurrent::run([&]() { - return JlCompress::compressDir(zip_dump_location, - QString::fromStdString(dir), - true, - QDir::Hidden | QDir::Files | QDir::Dirs); - }); - - QFutureWatcher* watcher = new QFutureWatcher(rootObject); - - QObject::connect(watcher, &QFutureWatcher::finished, rootObject, [=]() { - progress->close(); - progress->deleteLater(); - QObject::disconnect(*connection); - delete connection; - - if (watcher->result()) { - QtCommon::Frontend::Information(tr("Exported Successfully"), - tr("Data was exported successfully.")); - } else { - QtCommon::Frontend::Critical( - tr("Export Failed"), - tr("Ensure you have write permissions on the targeted directory and try again.")); - } - - watcher->deleteLater(); - callback(); - }); - - watcher->setFuture(future); -} - -void ImportDataDir(FrontendCommon::DataManager::DataDir data_dir, std::function callback) -{ - const std::string dir = FrontendCommon::DataManager::GetDataDir(data_dir); - - using namespace QtCommon::Frontend; - - const QString zip_dump_location = GetOpenFileName(tr("Select Import Location"), - {}, - tr("Zipped Archives (*.zip)")); - - if (zip_dump_location.isEmpty()) - return; - - StandardButton button = Warning( - tr("Import Warning"), - tr("All previous data in this directory will be deleted. Are you sure you wish to " - "proceed?"), - StandardButton::Yes | StandardButton::No); - - if (button != QMessageBox::Yes) - return; - - FrontendCommon::DataManager::ClearDir(data_dir); - - QMetaObject::Connection* connection = new QMetaObject::Connection; - *connection = QObject::connect(qApp, &QGuiApplication::aboutToQuit, rootObject, [=]() mutable { - Warning(tr("Still Importing"), - tr("Eden is still importing some data, and will continue " - "running in the background until it's done.")); - }); - - QtProgressDialog* progress = new QtProgressDialog(tr("Decompressing, this may take a while..."), - tr("Background"), - 0, - 0, - rootObject); - - progress->setWindowModality(Qt::WindowModal); - progress->show(); - QGuiApplication::processEvents(); - - QFuture future = QtConcurrent::run([=]() { - return !JlCompress::extractDir(zip_dump_location, - QString::fromStdString(dir)).empty(); - }); - - QFutureWatcher* watcher = new QFutureWatcher(rootObject); - - QObject::connect(watcher, &QFutureWatcher::finished, rootObject, [=]() { - progress->close(); - progress->deleteLater(); - QObject::disconnect(*connection); - delete connection; - - if (watcher->result()) { - Information(tr("Imported Successfully"), tr("Data was imported successfully.")); - } else { - Critical( - tr("Import Failed"), - tr("Ensure you have read permissions on the targeted directory and try again.")); - } - - watcher->deleteLater(); - callback(); - }); - - watcher->setFuture(future); -} - } // namespace QtCommon::Content diff --git a/src/qt_common/qt_content_util.h b/src/qt_common/qt_content_util.h index fb6d1b85fa..b2443829ab 100644 --- a/src/qt_common/qt_content_util.h +++ b/src/qt_common/qt_content_util.h @@ -48,8 +48,6 @@ void VerifyGameContents(const std::string &game_path); void VerifyInstalledContents(); void ClearDataDir(FrontendCommon::DataManager::DataDir dir); -void ExportDataDir(FrontendCommon::DataManager::DataDir dir, std::function callback = {}); -void ImportDataDir(FrontendCommon::DataManager::DataDir dir, std::function callback = {}); // Profiles // void FixProfiles(); diff --git a/src/qt_common/qt_frontend_util.cpp b/src/qt_common/qt_frontend_util.cpp index 3fe0ba0a80..d519669ad5 100644 --- a/src/qt_common/qt_frontend_util.cpp +++ b/src/qt_common/qt_frontend_util.cpp @@ -32,15 +32,4 @@ const QString GetOpenFileName(const QString &title, #endif } -const QString GetSaveFileName(const QString &title, - const QString &dir, - const QString &filter, - QString *selectedFilter, - Options options) -{ -#ifdef YUZU_QT_WIDGETS - return QFileDialog::getSaveFileName((QWidget *) rootObject, title, dir, filter, selectedFilter, options); -#endif -} - } // namespace QtCommon::Frontend diff --git a/src/qt_common/qt_frontend_util.h b/src/qt_common/qt_frontend_util.h index 59e8f15a4e..f86b9e1357 100644 --- a/src/qt_common/qt_frontend_util.h +++ b/src/qt_common/qt_frontend_util.h @@ -97,10 +97,10 @@ Q_ENUM_NS(Icon) // TODO(crueter) widgets-less impl, choices et al. StandardButton ShowMessage(Icon icon, - const QString &title, - const QString &text, - StandardButtons buttons = StandardButton::NoButton, - QObject *parent = nullptr); + const QString &title, + const QString &text, + StandardButtons buttons = StandardButton::NoButton, + QObject *parent = nullptr); #define UTIL_OVERRIDES(level) \ inline StandardButton level(QObject *parent, \ @@ -110,6 +110,21 @@ StandardButton ShowMessage(Icon icon, { \ return ShowMessage(Icon::level, title, text, buttons, parent); \ } \ + inline StandardButton level(QObject *parent, \ + const char *title, \ + const char *text, \ + StandardButtons buttons \ + = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, tr(title), tr(text), buttons, parent); \ + } \ + inline StandardButton level(const char *title, \ + const char *text, \ + StandardButtons buttons \ + = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, tr(title), tr(text), buttons, rootObject); \ + } \ inline StandardButton level(const QString title, \ const QString &text, \ StandardButtons buttons \ @@ -129,11 +144,5 @@ const QString GetOpenFileName(const QString &title, QString *selectedFilter = nullptr, Options options = Options()); -const QString GetSaveFileName(const QString &title, - const QString &dir, - const QString &filter, - QString *selectedFilter = nullptr, - Options options = Options()); - } // namespace QtCommon::Frontend #endif // QT_FRONTEND_UTIL_H diff --git a/src/qt_common/qt_game_util.cpp b/src/qt_common/qt_game_util.cpp index 0eddd10fe1..ac922ea967 100644 --- a/src/qt_common/qt_game_util.cpp +++ b/src/qt_common/qt_game_util.cpp @@ -220,8 +220,8 @@ void RemoveBaseContent(u64 program_id, InstalledEntryType type) program_id); if (res) { QtCommon::Frontend::Information(rootObject, - tr("Successfully Removed"), - tr("Successfully removed the installed base game.")); + "Successfully Removed", + "Successfully removed the installed base game."); } else { QtCommon::Frontend::Warning( rootObject, @@ -235,8 +235,8 @@ void RemoveUpdateContent(u64 program_id, InstalledEntryType type) const auto res = ContentManager::RemoveUpdate(system->GetFileSystemController(), program_id); if (res) { QtCommon::Frontend::Information(rootObject, - tr("Successfully Removed"), - tr("Successfully removed the installed update.")); + "Successfully Removed", + "Successfully removed the installed update."); } else { QtCommon::Frontend::Warning(rootObject, GetGameListErrorRemoving(type), diff --git a/src/qt_common/qt_path_util.cpp b/src/qt_common/qt_path_util.cpp index 632424e0ca..761e6e8405 100644 --- a/src/qt_common/qt_path_util.cpp +++ b/src/qt_common/qt_path_util.cpp @@ -17,12 +17,7 @@ bool OpenShaderCache(u64 program_id, QObject *parent) const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); const auto shader_cache_folder_path{shader_cache_dir / fmt::format("{:016x}", program_id)}; if (!Common::FS::CreateDirs(shader_cache_folder_path)) { - QtCommon::Frontend::ShowMessage(QMessageBox::Warning, - tr("Error Opening Shader Cache"), - tr("Failed to create or open shader cache for this title, " - "ensure your app data directory has write permissions."), - QMessageBox::Ok, - parent); + QtCommon::Frontend::ShowMessage(QMessageBox::Warning, "Error Opening Shader Cache", "Failed to create or open shader cache for this title, ensure your app data directory has write permissions.", QMessageBox::Ok, parent); } const auto shader_path_string{Common::FS::PathToUTF8String(shader_cache_folder_path)}; diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 5223afe937..388c8034c5 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -386,11 +386,10 @@ void BufferCache

::BindHostComputeBuffers() { template void BufferCache

::SetUniformBuffersState(const std::array& mask, const UniformBufferSizes* sizes) { - if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { - if (channel_state->enabled_uniform_buffer_masks != mask) { - if constexpr (IS_OPENGL) { - channel_state->fast_bound_uniform_buffers.fill(0); - } + const bool mask_changed = channel_state->enabled_uniform_buffer_masks != mask; + if (mask_changed) { + channel_state->fast_bound_uniform_buffers.fill(0); + if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { channel_state->dirty_uniform_buffers.fill(~u32{0}); channel_state->uniform_buffer_binding_sizes.fill({}); } @@ -806,7 +805,7 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 channel_state->uniform_buffer_binding_sizes[stage][binding_index] != size; if (should_fast_bind) { // We only have to bind when the currently bound buffer is not the fast version - channel_state->fast_bound_uniform_buffers[stage] |= 1U << binding_index; + channel_state->fast_bound_uniform_buffers[stage] |= 1u << binding_index; channel_state->uniform_buffer_binding_sizes[stage][binding_index] = size; runtime.BindFastUniformBuffer(stage, binding_index, size); } @@ -815,13 +814,22 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 return; } } - if constexpr (IS_OPENGL) { - channel_state->fast_bound_uniform_buffers[stage] |= 1U << binding_index; - channel_state->uniform_buffer_binding_sizes[stage][binding_index] = size; - } + channel_state->fast_bound_uniform_buffers[stage] |= 1u << binding_index; + channel_state->uniform_buffer_binding_sizes[stage][binding_index] = size; // Stream buffer path to avoid stalling on non-Nvidia drivers or Vulkan const std::span span = runtime.BindMappedUniformBuffer(stage, binding_index, size); +#ifdef YUZU_DEBUG + ASSERT(binding_index < NUM_GRAPHICS_UNIFORM_BUFFERS); + ASSERT(span.size() >= size && "UBO stream span too small"); + if (!device_memory.ReadBlockFastChecked(device_addr, span.data(), size)) { + LOG_CRITICAL(Render, "DeviceMemory OOB/unmapped: addr=0x{:x} size={}", device_addr, size); + channel_state->fast_bound_uniform_buffers[stage] &= ~(1u << binding_index); + ASSERT(false); + return; + } +#else device_memory.ReadBlockUnsafe(device_addr, span.data(), size); +#endif return; } // Classic cached path @@ -830,7 +838,8 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 } // Skip binding if it's not needed and if the bound buffer is not the fast version // This exists to avoid instances where the fast buffer is bound and a GPU write happens - needs_bind |= HasFastUniformBufferBound(stage, binding_index); + const bool was_fast_bound = HasFastUniformBufferBound(stage, binding_index); + needs_bind |= was_fast_bound; if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { needs_bind |= channel_state->uniform_buffer_binding_sizes[stage][binding_index] != size; } @@ -839,9 +848,6 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 } const u32 offset = buffer.Offset(device_addr); if constexpr (IS_OPENGL) { - // Fast buffer will be unbound - channel_state->fast_bound_uniform_buffers[stage] &= ~(1U << binding_index); - // Mark the index as dirty if offset doesn't match const bool is_copy_bind = offset != 0 && !runtime.SupportsNonZeroUniformOffset(); channel_state->dirty_uniform_buffers[stage] |= (is_copy_bind ? 1U : 0U) << index; @@ -855,6 +861,7 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 } else { runtime.BindUniformBuffer(buffer, offset, size); } + channel_state->fast_bound_uniform_buffers[stage] &= ~(1u << binding_index); } template @@ -1789,12 +1796,7 @@ std::span BufferCache

::ImmediateBuffer(size_t wanted_capacity) { template bool BufferCache

::HasFastUniformBufferBound(size_t stage, u32 binding_index) const noexcept { - if constexpr (IS_OPENGL) { - return ((channel_state->fast_bound_uniform_buffers[stage] >> binding_index) & 1) != 0; - } else { - // Only OpenGL has fast uniform buffers - return false; - } + return ((channel_state->fast_bound_uniform_buffers[stage] >> binding_index) & 1u) != 0; } template diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 486d19fb79..09631ffd83 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -53,6 +53,7 @@ constexpr u32 NUM_COMPUTE_UNIFORM_BUFFERS = 8; constexpr u32 NUM_STORAGE_BUFFERS = 16; constexpr u32 NUM_TEXTURE_BUFFERS = 32; constexpr u32 NUM_STAGES = 5; +static_assert(NUM_GRAPHICS_UNIFORM_BUFFERS <= 32, "fast bitmask must fit u32"); using UniformBufferSizes = std::array, NUM_STAGES>; using ComputeUniformBufferSizes = std::array; @@ -137,8 +138,8 @@ public: u32 written_compute_texture_buffers = 0; u32 image_compute_texture_buffers = 0; - std::array uniform_cache_hits{}; - std::array uniform_cache_shots{}; + std::array uniform_cache_hits{}; + std::array uniform_cache_shots{}; u32 uniform_buffer_skip_cache_size = DEFAULT_SKIP_CACHE_SIZE; diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index ecc4f77dc7..0fbe707b04 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -25,12 +25,12 @@ namespace { using namespace Common::Literals; -// Maximum potential alignment of a Vulkan buffer -constexpr VkDeviceSize MAX_ALIGNMENT = 256; +// Minimum alignment we want to enforce for the streaming ring +constexpr VkDeviceSize MIN_STREAM_ALIGNMENT = 256; // Stream buffer size in bytes constexpr VkDeviceSize MAX_STREAM_BUFFER_SIZE = 128_MiB; -size_t GetStreamBufferSize(const Device& device) { +size_t GetStreamBufferSize(const Device& device, VkDeviceSize alignment) { VkDeviceSize size{0}; if (device.HasDebuggingToolAttached()) { bool found_heap = false; @@ -53,8 +53,9 @@ size_t GetStreamBufferSize(const Device& device) { // Clamp to the configured maximum, align up for safety, and ensure a sane minimum so // region_size (stream_buffer_size / NUM_SYNCS) never becomes zero. - const VkDeviceSize aligned = (std::min)(Common::AlignUp(size, MAX_ALIGNMENT), MAX_STREAM_BUFFER_SIZE); - const VkDeviceSize min_size = MAX_ALIGNMENT * StagingBufferPool::NUM_SYNCS; + const VkDeviceSize aligned = + (std::min)(Common::AlignUp(size, alignment), MAX_STREAM_BUFFER_SIZE); + const VkDeviceSize min_size = alignment * StagingBufferPool::NUM_SYNCS; return static_cast((std::max)(aligned, min_size)); } } // Anonymous namespace @@ -62,8 +63,10 @@ size_t GetStreamBufferSize(const Device& device) { StagingBufferPool::StagingBufferPool(const Device& device_, MemoryAllocator& memory_allocator_, Scheduler& scheduler_) : device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_}, - stream_buffer_size{GetStreamBufferSize(device)}, region_size{stream_buffer_size / - StagingBufferPool::NUM_SYNCS} { + stream_alignment{std::max(device_.GetUniformBufferAlignment(), + MIN_STREAM_ALIGNMENT)}, + stream_buffer_size{GetStreamBufferSize(device_, stream_alignment)}, + region_size{stream_buffer_size / StagingBufferPool::NUM_SYNCS} { VkBufferCreateInfo stream_ci = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, @@ -116,10 +119,11 @@ void StagingBufferPool::TickFrame() { } StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { - const size_t aligned_size = Common::AlignUp(size, MAX_ALIGNMENT); + const size_t alignment = static_cast(stream_alignment); + const size_t aligned_size = Common::AlignUp(size, alignment); const bool wraps = iterator + size >= stream_buffer_size; const size_t new_iterator = - wraps ? aligned_size : Common::AlignUp(iterator + size, MAX_ALIGNMENT); + wraps ? aligned_size : Common::AlignUp(iterator + size, alignment); const size_t begin_region = wraps ? 0 : Region(iterator); const size_t last_byte = new_iterator == 0 ? 0 : new_iterator - 1; const size_t end_region = (std::min)(Region(last_byte) + 1, NUM_SYNCS); @@ -145,7 +149,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { current_tick); used_iterator = 0; iterator = 0; - free_iterator = size; + free_iterator = aligned_size; const size_t head_last_byte = aligned_size == 0 ? 0 : aligned_size - 1; const size_t head_end_region = (std::min)(Region(head_last_byte) + 1, NUM_SYNCS); if (AreRegionsActive(0, head_end_region)) { @@ -160,7 +164,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { iterator = new_iterator; if (!wraps) { - free_iterator = (std::max)(free_iterator, offset + size); + free_iterator = (std::max)(free_iterator, offset + aligned_size); } return StagingBufferRef{ diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h index f63a203272..5c40ca069f 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -102,6 +105,7 @@ private: MemoryAllocator& memory_allocator; Scheduler& scheduler; + VkDeviceSize stream_alignment; vk::Buffer stream_buffer; std::span stream_pointer; VkDeviceSize stream_buffer_size; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 010a3db174..f4669d0914 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -393,7 +393,7 @@ endif() target_link_libraries(yuzu PRIVATE nlohmann_json::nlohmann_json) target_link_libraries(yuzu PRIVATE common core input_common frontend_common network video_core qt_common) -target_link_libraries(yuzu PRIVATE Boost::headers glad Qt6::Widgets Qt6::Concurrent) +target_link_libraries(yuzu PRIVATE Boost::headers glad Qt6::Widgets) target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) if (NOT WIN32) @@ -408,6 +408,25 @@ if (UNIX AND NOT APPLE) endif() endif() +target_compile_definitions(yuzu PRIVATE + # Use QStringBuilder for string concatenation to reduce + # the overall number of temporary strings created. + QT_USE_QSTRINGBUILDER + + # Disable implicit conversions from/to C strings + QT_NO_CAST_FROM_ASCII + QT_NO_CAST_TO_ASCII + + # Disable implicit type narrowing in signal/slot connect() calls. + QT_NO_NARROWING_CONVERSIONS_IN_CONNECT + + # Disable unsafe overloads of QProcess' start() function. + QT_NO_PROCESS_COMBINED_ARGUMENT_START + + # Disable implicit QString->QUrl conversions to enforce use of proper resolving functions. + QT_NO_URL_CAST_FROM_STRING +) + if (YUZU_ENABLE_COMPATIBILITY_REPORTING) target_compile_definitions(yuzu PRIVATE YUZU_ENABLE_COMPATIBILITY_REPORTING) endif() diff --git a/src/yuzu/compatdb.cpp b/src/yuzu/compatdb.cpp index 6d5d263e16..0e58f17405 100644 --- a/src/yuzu/compatdb.cpp +++ b/src/yuzu/compatdb.cpp @@ -1,13 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include #include -#include +#include #include "common/logging/log.h" #include "ui_compatdb.h" #include "yuzu/compatdb.h" diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index 7a693be10c..15a0029901 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -14,7 +14,7 @@ #include #endif -#include +#include #include "common/settings.h" #include "ui_configure_web.h" #include "qt_common/uisettings.h" diff --git a/src/yuzu/data_dialog.cpp b/src/yuzu/data_dialog.cpp index d7c937e7ed..87d81e4f43 100644 --- a/src/yuzu/data_dialog.cpp +++ b/src/yuzu/data_dialog.cpp @@ -4,16 +4,12 @@ #include "data_dialog.h" #include "frontend_common/data_manager.h" #include "qt_common/qt_content_util.h" -#include "qt_common/qt_frontend_util.h" -#include "qt_common/qt_progress_dialog.h" #include "qt_common/qt_string_lookup.h" #include "ui_data_dialog.h" #include -#include #include -#include -#include +#include DataDialog::DataDialog(QWidget *parent) : QDialog(parent) @@ -53,41 +49,25 @@ DataWidget::DataWidget(FrontendCommon::DataManager::DataDir data_dir, ui->tooltip->setText(QtCommon::StringLookup::Lookup(tooltip)); - ui->clear->setIcon(QIcon::fromTheme(QStringLiteral("user-trash"))); + ui->clear->setIcon(QIcon::fromTheme(QStringLiteral("trash"))); ui->open->setIcon(QIcon::fromTheme(QStringLiteral("folder"))); - ui->upload->setIcon(QIcon::fromTheme(QStringLiteral("upload"))); - ui->download->setIcon(QIcon::fromTheme(QStringLiteral("download"))); connect(ui->clear, &QPushButton::clicked, this, &DataWidget::clear); connect(ui->open, &QPushButton::clicked, this, &DataWidget::open); - connect(ui->upload, &QPushButton::clicked, this, &DataWidget::upload); - connect(ui->download, &QPushButton::clicked, this, &DataWidget::download); scan(); } -void DataWidget::clear() -{ +void DataWidget::clear() { QtCommon::Content::ClearDataDir(m_dir); scan(); } -void DataWidget::open() -{ +void DataWidget::open() { QDesktopServices::openUrl(QUrl::fromLocalFile( QString::fromStdString(FrontendCommon::DataManager::GetDataDir(m_dir)))); } -void DataWidget::upload() -{ - QtCommon::Content::ExportDataDir(m_dir); -} - -void DataWidget::download() -{ - QtCommon::Content::ImportDataDir(m_dir, std::bind(&DataWidget::scan, this)); -} - void DataWidget::scan() { ui->size->setText(tr("Calculating...")); diff --git a/src/yuzu/data_dialog.h b/src/yuzu/data_dialog.h index 8a64659965..9f367d6049 100644 --- a/src/yuzu/data_dialog.h +++ b/src/yuzu/data_dialog.h @@ -37,9 +37,6 @@ public: public slots: void clear(); void open(); - void upload(); - void download(); - void scan(); private: diff --git a/src/yuzu/data_widget.ui b/src/yuzu/data_widget.ui index 99010d8856..ed67078fa1 100644 --- a/src/yuzu/data_widget.ui +++ b/src/yuzu/data_widget.ui @@ -13,8 +13,8 @@ Form - - + + @@ -50,8 +50,14 @@ - - + + + + QLayout::SizeConstraint::SetFixedSize + + + 25 + @@ -63,7 +69,7 @@ 52 - 47 + 42 @@ -71,10 +77,14 @@ QPushButton { -max-width: 50px; -max-height: 45px; -min-width: 50px; -min-height: 45px; + border-style: solid; + border-width:1px; + border-radius:25px; + border-color: transparent; + max-width:50px; + max-height:40px; + min-width:50px; + min-height:40px; } @@ -82,8 +92,8 @@ min-height: 45px; - 28 - 28 + 24 + 24 @@ -99,7 +109,7 @@ min-height: 45px; 52 - 47 + 42 @@ -107,10 +117,14 @@ min-height: 45px; QPushButton { -max-width: 50px; -max-height: 45px; -min-width: 50px; -min-height: 45px; + border-style: solid; + border-width:1px; + border-radius:25px; + border-color: transparent; + max-width:50px; + max-height:40px; + min-width:50px; + min-height:40px; } @@ -118,80 +132,8 @@ min-height: 45px; - 28 - 28 - - - - - - - - - 1 - 1 - - - - - 52 - 47 - - - - Export all data in this directory. This may take a while! - - - QPushButton { -max-width: 50px; -max-height: 45px; -min-width: 50px; -min-height: 45px; -} - - - - - - - 28 - 28 - - - - - - - - - 1 - 1 - - - - - 52 - 47 - - - - Import data for this directory. This may take a while, and will delete ALL EXISTING DATA! - - - QPushButton { -max-width: 50px; -max-height: 45px; -min-width: 50px; -min-height: 45px; -} - - - - - - - 28 - 28 + 24 + 24 diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 21c92c495f..b6dded447c 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -3939,10 +3939,6 @@ void GMainWindow::OnEdenDependencies() { void GMainWindow::OnDataDialog() { DataDialog dataDialog(this); dataDialog.exec(); - - // refresh stuff in case it was cleared - OnGameListRefresh(); - } void GMainWindow::OnToggleFilterBar() { @@ -4485,15 +4481,11 @@ void GMainWindow::SetFirmwareVersion() { if (result.IsError() || !CheckFirmwarePresence()) { LOG_INFO(Frontend, "Installed firmware: No firmware available"); - ui->menu_Applets->setEnabled(false); - ui->menu_Create_Shortcuts->setEnabled(false); firmware_label->setVisible(false); return; } firmware_label->setVisible(true); - ui->menu_Applets->setEnabled(true); - ui->menu_Create_Shortcuts->setEnabled(true); const std::string display_version(firmware_data.display_version.data()); const std::string display_title(firmware_data.display_title.data()); diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp index 53beda0f8e..4c2c41ea2a 100644 --- a/src/yuzu/multiplayer/chat_room.cpp +++ b/src/yuzu/multiplayer/chat_room.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "common/logging/log.h" #include "network/announce_multiplayer_session.h" #include "ui_chat_room.h" diff --git a/src/yuzu/multiplayer/client_room.cpp b/src/yuzu/multiplayer/client_room.cpp index 4e995c044f..93d6662c1e 100644 --- a/src/yuzu/multiplayer/client_room.cpp +++ b/src/yuzu/multiplayer/client_room.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include "common/logging/log.h" #include "network/announce_multiplayer_session.h" #include "ui_client_room.h" diff --git a/src/yuzu/multiplayer/direct_connect.cpp b/src/yuzu/multiplayer/direct_connect.cpp index 6291979fe6..deac3b9e59 100644 --- a/src/yuzu/multiplayer/direct_connect.cpp +++ b/src/yuzu/multiplayer/direct_connect.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include "common/settings.h" #include "core/core.h" #include "core/internal_network/network_interface.h" diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index cc163a5420..4dd3958550 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" diff --git a/src/yuzu/multiplayer/lobby.cpp b/src/yuzu/multiplayer/lobby.cpp index e8daa0c6eb..84723041df 100644 --- a/src/yuzu/multiplayer/lobby.cpp +++ b/src/yuzu/multiplayer/lobby.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include "common/logging/log.h" #include "common/settings.h" #include "core/core.h"