diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 81cb881675..e74954e09f 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -165,7 +165,7 @@ jobs: - name: Compile RPCS3 shell: pwsh - run: msbuild rpcs3.sln /p:Configuration=Release /v:minimal /p:Platform=x64 /p:CLToolPath=${{ env.CCACHE_BIN_DIR }} /p:UseMultiToolTask=true /p:CustomAfterMicrosoftCommonTargets="${{ github.workspace }}\buildfiles\msvc\ci_no_debug_info.targets" + run: msbuild rpcs3.sln /p:Configuration=Release /v:minimal /p:Platform=x64 /p:CLToolPath=${{ env.CCACHE_BIN_DIR }} /p:UseMultiToolTask=true /p:CustomAfterMicrosoftCommonTargets="${{ github.workspace }}\buildfiles\msvc\ci_only.targets" - name: Pack up build artifacts run: | diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a1401a7e90..ab91b1e8a3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -121,7 +121,7 @@ jobs: # maximumCpuCount: true # platform: x64 # configuration: 'Release' -# msbuildArgs: /p:CLToolPath=$(CCACHE_BIN_DIR) /p:UseMultiToolTask=true /p:CustomAfterMicrosoftCommonTargets="$(Build.SourcesDirectory)\buildfiles\msvc\ci_no_debug_info.targets" +# msbuildArgs: /p:CLToolPath=$(CCACHE_BIN_DIR) /p:UseMultiToolTask=true /p:CustomAfterMicrosoftCommonTargets="$(Build.SourcesDirectory)\buildfiles\msvc\ci_only.targets" # displayName: Compile RPCS3 # - bash: .ci/deploy-windows.sh diff --git a/buildfiles/msvc/ci_no_debug_info.targets b/buildfiles/msvc/ci_only.targets similarity index 62% rename from buildfiles/msvc/ci_no_debug_info.targets rename to buildfiles/msvc/ci_only.targets index 147806ac97..0275047c3a 100644 --- a/buildfiles/msvc/ci_no_debug_info.targets +++ b/buildfiles/msvc/ci_only.targets @@ -3,6 +3,10 @@ None + true + + UseLinkTimeCodeGeneration + \ No newline at end of file diff --git a/buildfiles/msvc/rpcs3_release.props b/buildfiles/msvc/rpcs3_release.props index 82c8024284..378ba797d6 100644 --- a/buildfiles/msvc/rpcs3_release.props +++ b/buildfiles/msvc/rpcs3_release.props @@ -11,12 +11,10 @@ Speed MultiThreaded LLVM_AVAILABLE;%(PreprocessorDefinitions) - true true true - UseLinkTimeCodeGeneration %(AdditionalLibraryDirectories);$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\lib;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\$(Configuration)\lib;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\lib %(AdditionalDependencies); diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 3556502f7a..b6d4baecca 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -172,7 +172,7 @@ if (NOT ANDROID) COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/GuiConfigs $/GuiConfigs COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/git $/git COMMAND "${WINDEPLOYQT_EXECUTABLE}" --no-compiler-runtime --no-opengl-sw --no-patchqt - --no-translations --no-system-d3d-compiler --no-quick-import + --no-translations --no-system-d3d-compiler --no-system-dxc-compiler --no-ffmpeg --no-quick-import --plugindir "$,$/plugins,$/share/qt6/plugins>" --verbose 0 "$") endif() diff --git a/rpcs3/Emu/Cell/Modules/cellMic.cpp b/rpcs3/Emu/Cell/Modules/cellMic.cpp index 267dc889f5..cb8724f965 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMic.cpp @@ -74,6 +74,22 @@ void fmt_class_string::format(std::string& out, u64 arg) }); } +namespace fmt +{ + struct alc_error + { + ALCdevice* device{}; + ALCenum error{}; + }; +} + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + const fmt::alc_error& obj = get_object(arg); + fmt::append(out, "0x%x='%s'", obj.error, alcGetString(obj.device, obj.error)); +} + void mic_context::operator()() { // Timestep in microseconds @@ -448,7 +464,7 @@ error_code microphone_device::open_microphone(const u8 type, const u32 dsp_r, co if (ALCenum err = alcGetError(device); err != ALC_NO_ERROR || !device) { - cellMic.error("Error opening capture device %s (error=0x%x, device=*0x%x)", devices[0].name, err, device); + cellMic.error("Error opening capture device %s (error=%s, device=*0x%x)", devices[0].name, fmt::alc_error{device, err}, device); #ifdef _WIN32 cellMic.error("Make sure microphone use is authorized under \"Microphone privacy settings\" in windows configuration"); #endif @@ -466,7 +482,7 @@ error_code microphone_device::open_microphone(const u8 type, const u32 dsp_r, co if (ALCenum err = alcGetError(device); err != ALC_NO_ERROR || !device) { // Ignore it and move on - cellMic.error("Error opening 2nd SingStar capture device %s (error=0x%x, device=*0x%x)", devices[1].name, err, device); + cellMic.error("Error opening 2nd SingStar capture device %s (error=%s, device=*0x%x)", devices[1].name, fmt::alc_error{device, err}, device); } else { @@ -523,7 +539,7 @@ error_code microphone_device::start_microphone() alcCaptureStart(micdevice.device); if (ALCenum err = alcGetError(micdevice.device); err != ALC_NO_ERROR) { - cellMic.error("Error starting capture of device %s (error=0x%x)", micdevice.name, err); + cellMic.error("Error starting capture of device %s (error=%s)", micdevice.name, fmt::alc_error{micdevice.device, err}); stop_microphone(); return CELL_MICIN_ERROR_FATAL; } @@ -542,7 +558,7 @@ error_code microphone_device::stop_microphone() alcCaptureStop(micdevice.device); if (ALCenum err = alcGetError(micdevice.device); err != ALC_NO_ERROR) { - cellMic.error("Error stopping capture of device %s (error=0x%x)", micdevice.name, err); + cellMic.error("Error stopping capture of device %s (error=%s)", micdevice.name, fmt::alc_error{micdevice.device, err}); } } #endif @@ -621,7 +637,7 @@ u32 microphone_device::capture_audio() if (ALCenum err = alcGetError(micdevice.device); err != ALC_NO_ERROR) { - cellMic.error("Error getting number of captured samples of device %s (error=0x%x)", micdevice.name, err); + cellMic.error("Error getting number of captured samples of device %s (error=%s)", micdevice.name, fmt::alc_error{micdevice.device, err}); return CELL_MICIN_ERROR_FATAL; } @@ -639,7 +655,7 @@ u32 microphone_device::capture_audio() if (ALCenum err = alcGetError(micdevice.device); err != ALC_NO_ERROR) { - cellMic.error("Error capturing samples of device %s (error=0x%x)", micdevice.name, err); + cellMic.error("Error capturing samples of device %s (error=%s)", micdevice.name, fmt::alc_error{micdevice.device, err}); } } diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index db9cf47ab6..c158318a8d 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -5870,13 +5870,13 @@ public: { if (perm_only) { - set_vr(op.rt4, vperm2b256to128(as, b, c)); + set_vr(op.rt4, vperm2b(as, b, c)); return; } const auto m = gf2p8affineqb(c, build(0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20), 0x7f); const auto mm = select(noncast(m) >= 0, splat(0), m); - const auto ab = vperm2b256to128(as, b, c); + const auto ab = vperm2b(as, b, c); set_vr(op.rt4, select(noncast(c) >= 0, ab, mm)); return; } @@ -5920,13 +5920,13 @@ public: { if (perm_only) { - set_vr(op.rt4, vperm2b256to128(a, b, eval(c ^ 0xf))); + set_vr(op.rt4, vperm2b(a, b, eval(c ^ 0xf))); return; } const auto m = gf2p8affineqb(c, build(0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20), 0x7f); const auto mm = select(noncast(m) >= 0, splat(0), m); - const auto ab = vperm2b256to128(a, b, eval(c ^ 0xf)); + const auto ab = vperm2b(a, b, eval(c ^ 0xf)); set_vr(op.rt4, select(noncast(c) >= 0, ab, mm)); return; } @@ -5938,13 +5938,13 @@ public: { if (perm_only) { - set_vr(op.rt4, vperm2b256to128(b, a, eval(c ^ 0x1f))); + set_vr(op.rt4, vperm2b(b, a, eval(c ^ 0x1f))); return; } const auto m = gf2p8affineqb(c, build(0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20), 0x7f); const auto mm = select(noncast(m) >= 0, splat(0), m); - const auto ab = vperm2b256to128(b, a, eval(c ^ 0x1f)); + const auto ab = vperm2b(b, a, eval(c ^ 0x1f)); set_vr(op.rt4, select(noncast(c) >= 0, ab, mm)); return; } diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 85e9d96c89..4597d27b19 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -858,7 +858,7 @@ namespace np presence_self.pr_data = {}; presence_self.advertised = false; - if (g_cfg.net.psn_status == np_psn_status::psn_rpcn) + if (is_connected && is_psn_active && rpcn) { rpcn_log.notice("Setting RPCN state to disconnected!"); rpcn->reset_state(); diff --git a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp index e0a2d396bb..de99552fb1 100644 --- a/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.cpp @@ -453,6 +453,7 @@ namespace rsx std::vector> entries; std::string selected_user; s32 selected_index = 0; + bool rpcn_connected = true; // Get selected user name if (m_list && m_current_page == m_last_page) @@ -516,20 +517,25 @@ namespace rsx { rsx_log.error("Failed to connect to RPCN: %s", rpcn::rpcn_state_to_string(res)); status_flags |= status_bits::invalidate_image_cache; - m_list.reset(); - return; + rpcn_connected = false; } if (auto res = m_rpcn->wait_for_authentified(); res != rpcn::rpcn_state::failure_no_failure) { rsx_log.error("Failed to authentify to RPCN: %s", rpcn::rpcn_state_to_string(res)); status_flags |= status_bits::invalidate_image_cache; - m_list.reset(); - return; + rpcn_connected = false; } - // Get friends, setup callback and setup comboboxes - m_rpcn->get_friends(m_friend_data); + // Get friends + if (rpcn_connected) + { + m_rpcn->get_friends(m_friend_data); + } + else + { + m_friend_data = {}; + } switch (m_current_page) { diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 41ce47c04e..bce15c443e 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -303,6 +303,12 @@ static void fixup_settings(const psf::registry* _psf) g_cfg.video.resolution.set(new_resolution); } } + + if (g_cfg.net.net_active == np_internet_status::disabled && g_cfg.net.psn_status != np_psn_status::disabled) + { + sys_log.warning("Net status was set to disconnected so psn status was disabled"); + g_cfg.net.psn_status.set(np_psn_status::disabled); + } } extern void dump_executable(std::span data, const ppu_module* _module, std::string_view title_id) diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 3aecdb001a..7c39b0a88c 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -113,7 +113,7 @@ - $(QTDIR)\bin\windeployqt --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --release "$(TargetPath)" + $(QTDIR)\bin\windeployqt --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-ffmpeg --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --release "$(TargetPath)" xcopy /y /d "..\3rdparty\opencv\opencv\opencv410\build\x64\bin\opencv_world4100.dll" "$(OutDir)" @@ -164,7 +164,7 @@ - $(QTDIR)\bin\windeployqt --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --debug "$(TargetPath)" + $(QTDIR)\bin\windeployqt --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-ffmpeg --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --debug "$(TargetPath)" xcopy /y /d "..\3rdparty\opencv\opencv\opencv410\build\x64\bin\opencv_world4100.dll" "$(OutDir)" @@ -1099,11 +1099,11 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 9cf739ac37..3bf33f2a8c 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -223,6 +223,7 @@ void game_list_frame::LoadSettings() m_category_filters = m_gui_settings->GetGameListCategoryFilters(true); m_grid_category_filters = m_gui_settings->GetGameListCategoryFilters(false); m_draw_compat_status_to_grid = m_gui_settings->GetValue(gui::gl_draw_compat).toBool(); + m_prefer_game_data_icons = m_gui_settings->GetValue(gui::gl_pref_gd_icon).toBool(); m_show_custom_icons = m_gui_settings->GetValue(gui::gl_custom_icon).toBool(); m_play_hover_movies = m_gui_settings->GetValue(gui::gl_hover_gifs).toBool(); @@ -897,8 +898,8 @@ void game_list_frame::OnRefreshFinished() } } - // Let's fetch the game data icon if the path was empty for some reason - if (entry->info.icon_path.empty()) + // Let's fetch the game data icon if preferred or if the path was empty for some reason + if ((m_prefer_game_data_icons && !entry->has_custom_icon) || entry->info.icon_path.empty()) { if (std::string icon_path = other->info.path + "/" + localized_icon; fs::is_file(icon_path)) { @@ -909,6 +910,19 @@ void game_list_frame::OnRefreshFinished() entry->info.icon_path = std::move(icon_path); } } + + // Let's fetch the game data movie if preferred or if the path was empty + if (m_prefer_game_data_icons || entry->info.movie_path.empty()) + { + if (std::string movie_path = other->info.path + "/" + localized_movie; fs::is_file(movie_path)) + { + entry->info.movie_path = std::move(movie_path); + } + else if (std::string movie_path = other->info.path + "/ICON1.PAM"; fs::is_file(movie_path)) + { + entry->info.movie_path = std::move(movie_path); + } + } } } @@ -3001,6 +3015,16 @@ void game_list_frame::SetShowCompatibilityInGrid(bool show) m_gui_settings->SetValue(gui::gl_draw_compat, show); } +void game_list_frame::SetPreferGameDataIcons(bool enabled) +{ + if (m_prefer_game_data_icons != enabled) + { + m_prefer_game_data_icons = enabled; + m_gui_settings->SetValue(gui::gl_pref_gd_icon, enabled); + Refresh(true); + } +} + void game_list_frame::SetShowCustomIcons(bool show) { if (m_show_custom_icons != show) diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 7282f1b745..5e4156f09d 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -73,6 +73,7 @@ public Q_SLOTS: void SetListMode(const bool& is_list); void SetSearchText(const QString& text); void SetShowCompatibilityInGrid(bool show); + void SetPreferGameDataIcons(bool enabled); void SetShowCustomIcons(bool show); void SetPlayHoverGifs(bool play); void FocusAndSelectFirstEntryIfNoneIs(); @@ -212,6 +213,7 @@ private: qreal m_margin_factor; qreal m_text_factor; bool m_draw_compat_status_to_grid = false; + bool m_prefer_game_data_icons = false; bool m_show_custom_icons = true; bool m_play_hover_movies = true; std::optional> m_refresh_funcs_manage_type{std::in_place}; diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index b3fab563cf..fbf66dceed 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -214,6 +214,7 @@ namespace gui const gui_save gl_show_hidden = gui_save(game_list, "show_hidden", false); const gui_save gl_hidden_list = gui_save(game_list, "hidden_list", QStringList()); const gui_save gl_draw_compat = gui_save(game_list, "draw_compat", false); + const gui_save gl_pref_gd_icon = gui_save(game_list, "pref_gd_icon", false); const gui_save gl_custom_icon = gui_save(game_list, "custom_icon", true); const gui_save gl_hover_gifs = gui_save(game_list, "hover_gifs", true); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 47c6a5be68..eecb3be62e 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -3380,6 +3380,7 @@ void main_window::CreateConnects() ResizeIcons(index); }); + connect(ui->actionPreferGameDataIcons, &QAction::triggered, m_game_list_frame, &game_list_frame::SetPreferGameDataIcons); connect(ui->showCustomIconsAct, &QAction::triggered, m_game_list_frame, &game_list_frame::SetShowCustomIcons); connect(ui->playHoverGifsAct, &QAction::triggered, m_game_list_frame, &game_list_frame::SetPlayHoverGifs); @@ -3679,6 +3680,7 @@ void main_window::ConfigureGuiFromSettings() m_game_list_frame->SetShowHidden(ui->showHiddenEntriesAct->isChecked()); // prevent GetValue in m_game_list_frame->LoadSettings ui->showCompatibilityInGridAct->setChecked(m_gui_settings->GetValue(gui::gl_draw_compat).toBool()); + ui->actionPreferGameDataIcons->setChecked(m_gui_settings->GetValue(gui::gl_pref_gd_icon).toBool()); ui->showCustomIconsAct->setChecked(m_gui_settings->GetValue(gui::gl_custom_icon).toBool()); ui->playHoverGifsAct->setChecked(m_gui_settings->GetValue(gui::gl_hover_gifs).toBool()); diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 5bc38ff754..9cf59d35a0 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -35,7 +35,7 @@ true - QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::GroupedDragging + QMainWindow::DockOption::AllowNestedDocks|QMainWindow::DockOption::AllowTabbedDocks|QMainWindow::DockOption::AnimatedDocks|QMainWindow::DockOption::GroupedDragging @@ -344,6 +344,7 @@ + @@ -1415,6 +1416,14 @@ Savestates + + + true + + + Prefer Game Data Icons + + diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 1d275bb498..77790ac0a0 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -1481,6 +1481,16 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std const auto [text, value] = get_data(ui->netStatusBox, index); ui->gb_edit_dns->setEnabled(static_cast(value) != np_internet_status::disabled); ui->enable_upnp->setEnabled(static_cast(value) != np_internet_status::disabled); + + if (static_cast(value) == np_internet_status::disabled) + { + ui->psnStatusBox->setCurrentIndex(find_item(ui->psnStatusBox, static_cast(g_cfg.net.psn_status.def))); + ui->psnStatusBox->setEnabled(false); + } + else + { + ui->psnStatusBox->setEnabled(true); + } }); m_emu_settings->EnhanceComboBox(ui->netStatusBox, emu_settings_type::InternetStatus); SubscribeTooltip(ui->gb_netStatusBox, tooltips.settings.net_status);