Compare commits

..
101 Commits
Author SHA1 Message Date
chaoticgdandTy 1b5c352566 Debugger: Improve symbol tree enum editing 2025-11-12 18:46:10 -05:00
PCSX2 Botandlightningterror bed6a9e4d4 [ci skip] Qt: Update Base Translation. 2025-11-12 01:03:38 +01:00
lightningterror d602ad1d3e GS/HW: Purge no longer needed/replaced crc hacks GSC_ZettaiZetsumeiToshi2, GSC_SteambotChronicles. 2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror 51c31347df GS/HW: Remove clamp hack for edge garbage.
Not seemingly required anymore, might be because NS is a thing.
2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror 00876e7076 GameDB: Fixes for later IRem games 2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror 47eb499893 GS/HW: Add CRC hack to cover IRem games to deal with depth deswizzle shuffle 2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror b8680c3139 GS/HW: Mask channel offsets in channel shuffle heuristic 2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror 9b4e3b8f74 GS/HW: Adjust target lookup to better check on source match 2025-11-11 22:36:46 +01:00
refractionpcsx2andlightningterror 3e858167bc Build: Update gamedb documentation and linter 2025-11-11 21:19:02 +01:00
refractionpcsx2andlightningterror 44d66555cc GS/HW: Add options to maintain upscale in Native Scaling
This will adjust how the box filter samples to simulate bilinear when upscaling
2025-11-11 21:19:02 +01:00
refractionpcsx2andlightningterror c5438ceca3 GS/HW: Fix up invalidly selected Tex in RT targets 2025-11-11 20:58:35 +01:00
JordanTheToasterandlightningterror 3e1927ae44 GameDB: Ore no Shita de Agake fixes 2025-11-11 14:59:04 +01:00
TheTechnician27andTellowKrinkle b688117002 RTC: Automatically detect timezone 2025-11-10 20:14:36 -06:00
dependabot[bot]andTy e62e6fb6c3 Bump softprops/action-gh-release in the ci-deps group
Bumps the ci-deps group with 1 update: [softprops/action-gh-release](https://github.com/softprops/action-gh-release).


Updates `softprops/action-gh-release` from 2.4.1 to 2.4.2
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/6da8fa9354ddfdc4aeace5fc48d7f679b5214090...5be0e66d93ac7ed76da52eca8bb058f665c3a5fe)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 2.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: ci-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 19:28:32 -05:00
PCSX2 Botandlightningterror 262e94e5d7 [ci skip] PAD: Update to latest controller database. 2025-11-10 20:01:35 +01:00
PCSX2 Botandlightningterror 11a4b4e7ff [ci skip] Qt: Update Base Translation. 2025-11-10 01:07:34 +01:00
chaoticgdandTy a98cfcf28c CDVD: Synchronise access from different threads 2025-11-09 09:27:27 -05:00
PCSX2 BotandTellowKrinkle d02f30ee62 [ci skip] Qt: Update Base Translation. 2025-11-08 18:23:15 -06:00
JordanTheToasterandTy c0bf01a646 MacOS: Patch Tahoe unclickable buttons 2025-11-08 08:31:46 -05:00
TheTechnician27andTy babb985e9e GS Hotkeys: Improve upscale and downscale hotkeys 2025-11-07 20:28:27 -05:00
PCSX2 Botandlightningterror e379c8317d [ci skip] Qt: Update Base Translation. 2025-11-07 03:49:56 +01:00
chaoticgdandTy 5098277474 Debugger: Fix 1 pixel gap under layout tabs on non-Windows platforms 2025-11-06 09:32:29 -05:00
TheLastRarandTy 4a94cb6cbd DEV9: Remove using namespace in TAPAdapter header 2025-11-05 16:44:10 -05:00
TheTechnician27andTy e245454b91 GameListWidget: Fix icon cell highlights and column widths 2025-11-05 16:43:28 -05:00
TheTechnician27andTy b003eadd2d VMManager: More helpful error message on no BIOS present 2025-11-03 12:52:28 -05:00
JordanTheToasterandTy a5984d8213 Flatpak: Update KDE runtime to 6.10 2025-11-03 12:49:35 -05:00
SternandTy 4dbd95b0bb labeler: Add OSD / ImGui labeler 2025-11-03 10:38:26 -05:00
JordanTheToasterandTy 68803229da Core: Bump savestate version.
[SAVEVERSION+]
2025-11-02 20:19:38 -05:00
chaoticgdandTy b661a2a149 Deps: Update KDDockWidgets to 2.4.0 2025-11-02 15:02:25 -05:00
PCSX2 BotandTy 63cd355d7a [ci skip] Qt: Update Base Translation. 2025-11-02 14:43:04 -05:00
ZiemasandTy 0f5ff68679 SPU: Remove KON delay/check key once per T 2025-11-02 14:36:54 -05:00
JordanTheToasterandTy bd74921926 Deps: Update SDL3 to v3.2.26 2025-11-01 11:32:32 -04:00
TheLastRarandTy 78f83514f4 Deps: Force lib directory for libjpeg-turbo build 2025-11-01 11:31:20 -04:00
TheTechnician27andTy 2c36259b88 DB: Remove some unsupported or nonexistent serials 2025-11-01 11:29:27 -04:00
TheTechnician27andTy 32a0bed6af GameListModel: Touch up a couple functions 2025-11-01 11:28:59 -04:00
TheTechnician27andTy d415f8364c Snapshots: Clean up per-game snapshots folder code 2025-11-01 11:14:55 -04:00
Ty Lamontagne 7c768b6833 Qt: Mouse Lock: Add warning about mixed-resolution non 100% DPI configs 2025-11-01 10:21:54 -04:00
Ty Lamontagne 773f6968a4 Qt: Implement mouse locking when rendering to separate window 2025-11-01 10:21:54 -04:00
Ty Lamontagne 1021199512 Qt: Visually disable the mouse lock button on wayland 2025-11-01 10:21:54 -04:00
Ty Lamontagne 08ef9e2bd9 Qt: Make mouse screen locking DPI aware
Also removed some global mouse hook stuff. Don't ever want to use that anyways.
2025-11-01 10:21:54 -04:00
refractionpcsx2andTy 6ba3f96f27 GS/MAD: Try to reconstruct centre line if previous version was weaved in motion 2025-11-01 09:29:09 -04:00
TheTechnician27andTy 7d5b7bc3ce FUNDING.yml: Add Liberapay 2025-11-01 09:20:57 -04:00
TheTechnician27andTy 0d43d30346 OSD: Fix uninitialized save state slot timestamp 2025-10-31 22:19:07 -04:00
PCSX2 Botandlightningterror da824b4e9e [ci skip] Qt: Update Base Translation. 2025-10-31 01:03:12 +01:00
chaoticgdandTy ed08b5f34e Memcard: Fix infinite loop caused by UB when YAML parsing fails 2025-10-30 14:02:55 -04:00
chaoticgdandTy 0ce312c1c3 GameDB: Fix infinite loops caused by UB when YAML parsing fails 2025-10-30 14:02:55 -04:00
PCSX2 Botandlightningterror 07bc2fa452 [ci skip] Qt: Update Base Translation. 2025-10-28 01:19:58 +01:00
TheTechnician27andGovanifY bfd2775074 Qt: Add TextBrowserInteraction to labels where appropriate 2025-10-28 00:36:00 +01:00
TheTechnician27andTy 94ccafd745 MainWindow: Make Settings > Video Capture checkbox toggle correctly 2025-10-27 19:25:25 -04:00
KamFretoZandGovanifY 5c6049c4ae Qt: Add Create game shortcut functionality 2025-10-28 00:11:09 +01:00
PCSX2 BotandGovanifY 090464c42d [ci skip] PAD: Update to latest controller database. 2025-10-27 18:43:11 +01:00
PCSX2 BotandGovanifY 89a00db3d6 [ci skip] Qt: Update Base Translation. 2025-10-27 14:08:50 +01:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
fc415dff93 GHActions: Update action scripts
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 08:36:36 -04:00
TheTechnician27andTy f648a9a438 QtHost: Fix locale crash on non-Windows machines 2025-10-25 17:58:00 -04:00
chaoticgdandTy cac6669423 Debugger: Respond to OS colour scheme changes 2025-10-25 09:48:18 -04:00
TheTechnician27andGovanifY 7db487a49b Game List: Improve dialog for Reset Play Time 2025-10-25 15:32:52 +02:00
TJnotJTandTy c96607fe37 GSRunner: Allow loading GS settings from INI. 2025-10-24 21:44:52 -04:00
SternXDandTy ba0dae5f57 ImGui: Rename BackgroundProgressDialog to ProgressDialog
Signed-off-by: SternXD <stern@sidestore.io>
2025-10-24 21:41:42 -04:00
SternXDandTy 5fe5148e86 BPM: Add Network and HDD settings page
Signed-off-by: SternXD <stern@sidestore.io>
2025-10-24 21:41:42 -04:00
TJnotJTandTy 5445cb516a GS: Handle zero clears separately in transfer dump. 2025-10-24 21:40:37 -04:00
PCSX2 Botandlightningterror 84a29ffcca [ci skip] Qt: Update Base Translation. 2025-10-25 02:03:31 +02:00
PCSX2 BotandTy e56075976f [ci skip] Qt: Update Base Translation. 2025-10-24 15:53:19 -04:00
SternXDandTy 0f709735c0 FullscreenUI: Add footer for clear bindings
Signed-off-by: SternXD <stern@sidestore.io>
2025-10-24 15:53:05 -04:00
SternXDandTy ad3f0fd6cd ImGuiFullscreen: Add append and queue footer hints
Signed-off-by: SternXD <stern@sidestore.io>
2025-10-24 15:53:05 -04:00
TheTechnician27andTy fbfdacd589 Game Grid: Set Size Hint for List View 2025-10-24 15:50:44 -04:00
chaoticgdandTy aedc51e151 Qt: Set QStyleHints colorScheme property properly 2025-10-23 20:17:23 -04:00
TheTechnician27andTy fe95a697f4 GameListModel: Remove dead, nonsense switch case 2025-10-23 19:52:38 -04:00
TheTechnician27andTy f99cf28429 MainWindow: Add a separator between Achievements and Controllers 2025-10-23 10:38:43 -04:00
JordanTheToasterandTy bea1eb0cf9 MacOS: Fix for missing Metal Toolchain 2025-10-23 09:03:43 -04:00
SilentandTy 3cf21e0ab6 usb_eyetoy: Clean up COM initialization, prevent a double-release
If the EyeToy camera was enabled in the settings, but not enabled
by the game, it would call CoUninitialize without having called
CoInitializeEx first.
2025-10-22 09:48:06 -04:00
SilentandTy 521b32c253 USB: Initialize COM before using Cubeb on Windows 2025-10-22 09:48:06 -04:00
SilentandTy 190b525ca6 CubebAudioStream: Call CoInitializeEx before creating cubeb 2025-10-22 09:48:06 -04:00
PCSX2 Botandlightningterror baa00e4d38 [ci skip] Qt: Update Base Translation. 2025-10-22 13:37:14 +02:00
TheTechnician27andTy 51bc6c1465 pcsx2-qt: Add buddies and tabstops 2025-10-21 18:48:54 -04:00
JordanTheToasterandTy ea8492082a Windows: Optimize Qt build for size 2025-10-21 12:06:14 -04:00
dependabot[bot]andTy 9d1fd23d78 Bump the ci-deps group with 2 updates
Bumps the ci-deps group with 2 updates: [flatpak/flatpak-github-actions](https://github.com/flatpak/flatpak-github-actions) and [actions/setup-node](https://github.com/actions/setup-node).


Updates `flatpak/flatpak-github-actions` from 6.5 to 6.6
- [Release notes](https://github.com/flatpak/flatpak-github-actions/releases)
- [Commits](https://github.com/flatpak/flatpak-github-actions/compare/v6.5...92ae9851ad316786193b1fd3f40c4b51eb5cb101)

Updates `actions/setup-node` from 5 to 6
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v5...v6)

---
updated-dependencies:
- dependency-name: flatpak/flatpak-github-actions
  dependency-version: '6.6'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: ci-deps
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: ci-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-21 11:44:24 -04:00
TellowKrinkleandTy 9ff575377d GHActions: Reduce ccache max size
Reduces the amount of GH cache quota they take up.

[ci skip]
2025-10-21 11:43:37 -04:00
JordanTheToasterandTy 47250293cd Mac OS: Use Xcode 26.0.1 2025-10-20 19:01:03 -04:00
JordanTheToasterandTy f9b346521d Mac OS: Bump runner to Mac OS 26 2025-10-20 19:01:03 -04:00
TheTechnician27andGovanifY b5a4c71eff RTC: Add option to choose between system locale and yyyy-MM-dd HH:mm:ss 2025-10-20 18:20:41 +02:00
JordanTheToasterandGovanifY 2604256424 GameDB: Various fixes 2025-10-20 17:49:22 +02:00
chaoticgdandGovanifY 906ac6a8ea Patch: Fix some incorrect format strings 2025-10-20 15:38:33 +02:00
TheTechnician27andTellowKrinkle 3db21e0579 FSUI: Remove defunct option and move OSD position options 2025-10-19 22:29:31 -05:00
PCSX2 BotandTellowKrinkle abd03884de [ci skip] Qt: Update Base Translation. 2025-10-19 20:02:42 -05:00
TheLastRarandlightningterror a159256b07 FSUI: Allow specifying default button in message dialogs 2025-10-18 02:26:09 +02:00
Silentandlightningterror d9a2618b7a Achievements: Use the actual image names for cache
Fixes an issue where PCSX2 cache was unaware of the game or achievement
icon getting updated in the backend, and it continued to show
the old image
2025-10-18 02:24:04 +02:00
PCSX2 Botandlightningterror dca0291cfb [ci skip] Qt: Update Base Translation. 2025-10-18 02:23:19 +02:00
JordanTheToasterandlightningterror b261873471 GameDB: Wild Arms 5 SPS fix 2025-10-18 02:23:03 +02:00
TellowKrinkleandTy bfd01c913a macOS: Update to Qt 6.10.0 2025-10-17 18:11:04 -04:00
TellowKrinkleandTy 818b3fe779 macOS: Update to Qt 6.9.3 2025-10-17 18:11:04 -04:00
TellowKrinkleandTy 66a28e4488 macOS: Optimize Qt build for size
Saves a MB or so, there's no reason we need speed optimizations in our GUI toolkit
2025-10-17 18:11:04 -04:00
TellowKrinkleandTy 28e2ecf920 macOS: Fix parallel kddockwidgets build for universal dependencies 2025-10-17 18:11:04 -04:00
TellowKrinkleandTy d3dbf53fa7 MacOS: Make universal build script executable 2025-10-17 18:11:04 -04:00
SternXDandTellowKrinkle 8fb2940f25 Qt/BPM: Improve memory card shutdown warning clarity and safety emphasis 2025-10-15 23:48:35 -05:00
chaoticgdandTy 55498762f9 Qt: Fix typo in Windows dependencies build script 2025-10-15 18:07:05 -04:00
JordanTheToasterandTy 50baaf39d6 Deps: Update Mac OS ffmpeg to 8.0 2025-10-15 08:32:19 -04:00
lightningterror 4743ccac8c GS/HW/Shaders: Fix afail shader typo.
No dual source blend means PS_NO_COLOR1 is true, no output on target 1.
2025-10-15 00:57:33 +02:00
lightningterror 0dc3fc6228 GS/HW: Unify blend levels when barriers are and are not supported.
When barriers/multidraw fb copy is supported no change.
When barriers/multidraw fb copy isn't supported keep the same levels but only enable them if there's no overlap.
2025-10-14 02:19:43 +02:00
lightningterror a7a4583c84 GS/HW: Enable any fbmask emulation if Blending is above minimum.
Since dx11/12 now supports sw blending and copies/draw area/quads optimizations have been made perf impact will be lower so we can use the same unified path if texture barriers are disabled.
2025-10-14 02:19:43 +02:00
lightningterror 6b52937262 GS/TC: Make sure target is created before setting any flags.
Xenosaga 3 fails to create a target because the rect is empty so we should avoid setting any flags since it's null.
2025-10-14 02:19:08 +02:00
PCSX2 Botandlightningterror df9caf6fb8 [ci skip] Qt: Update Base Translation. 2025-10-14 02:17:24 +02:00
205 changed files with 10399 additions and 5675 deletions
+1
View File
@@ -1,3 +1,4 @@
# These are supported funding model platforms
github: [PCSX2]
liberapay: PCSX2
+7
View File
@@ -40,6 +40,13 @@
- 'pcsx2-qt/**/*'
- '3rdparty/Qt/*'
- '3rdparty/Qt/**/*'
'OSD / ImGui':
- changed-files:
- any-glob-to-any-file:
- 'pcsx2/ImGui/*'
- 'pcsx2/ImGui/**/*'
- '3rdparty/imgui/*'
- '3rdparty/imgui/**/*'
'GameDB':
- changed-files:
- any-glob-to-any-file:
+4 -4
View File
@@ -45,7 +45,7 @@ jobs:
name: ${{ inputs.jobName }}
runs-on: ${{ inputs.os }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.7
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.9
options: --privileged
timeout-minutes: 60
@@ -129,7 +129,7 @@ jobs:
- name: Push to Flathub (beta)
if: ${{ inputs.publish == true && (inputs.stableBuild == false || inputs.stableBuild == 'false') }}
uses: flatpak/flatpak-github-actions/flat-manager@10a3c29f0162516f0f68006be14c92f34bd4fa6c
uses: flatpak/flatpak-github-actions/flat-manager@92ae9851ad316786193b1fd3f40c4b51eb5cb101
with:
flat-manager-url: https://hub.flathub.org/
repository: beta
@@ -138,7 +138,7 @@ jobs:
- name: Push to Flathub (stable)
if: ${{ inputs.publish == true && (inputs.stableBuild == true || inputs.stableBuild == 'true') }}
uses: flatpak/flatpak-github-actions/flat-manager@10a3c29f0162516f0f68006be14c92f34bd4fa6c
uses: flatpak/flatpak-github-actions/flat-manager@92ae9851ad316786193b1fd3f40c4b51eb5cb101
with:
flat-manager-url: https://hub.flathub.org/
repository: stable
@@ -153,7 +153,7 @@ jobs:
mv "./${{ steps.artifact-metadata.outputs.artifact-name }}.flatpak" "$GITHUB_WORKSPACE"/ci-artifacts/
- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ${{ steps.artifact-metadata.outputs.artifact-name }}
path: ci-artifacts
+2 -2
View File
@@ -55,7 +55,7 @@ jobs:
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPRESS: true
CCACHE_COMPRESSLEVEL: 9
CCACHE_MAXSIZE: 500M
CCACHE_MAXSIZE: 100M
steps:
- name: Checkout Repository
@@ -174,7 +174,7 @@ jobs:
- name: Upload artifact
if: inputs.buildAppImage == true
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ${{ steps.artifact-metadata.outputs.artifact-name }}
path: ci-artifacts
+9 -6
View File
@@ -12,7 +12,7 @@ on:
os:
required: false
type: string
default: macos-15
default: macos-26
patchesUrl:
required: false
type: string
@@ -42,7 +42,7 @@ jobs:
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPRESS: true
CCACHE_COMPRESSLEVEL: 9
CCACHE_MAXSIZE: 500M
CCACHE_MAXSIZE: 100M
# Only way to use a secret in an if statement
SIGN_KEY: ${{ secrets.APPLE_SIGN_P12_B64 }}
@@ -62,8 +62,11 @@ jobs:
echo "#define DEFAULT_UPDATER_CHANNEL \"stable\"" > ./pcsx2-qt/DefaultUpdaterChannel.h
cat ./pcsx2-qt/DefaultUpdaterChannel.h
- name: Use Xcode 16.4
run: sudo xcode-select -s /Applications/Xcode_16.4.app
- name: Use Xcode 26.0.1
run: sudo xcode-select -s /Applications/Xcode_26.0.1.app
- name: Install Metal Toolchain
run: xcodebuild -downloadComponent MetalToolchain
- name: Prepare Artifact Metadata
id: artifact-metadata
@@ -91,7 +94,7 @@ jobs:
uses: actions/cache@v4
with:
path: ~/deps
key: ${{ inputs.os }} deps ${{ hashFiles('.github/workflows/scripts/macos/build-dependencies.sh', '.github/workflows/scripts/common/*.patch') }}
key: ${{ inputs.os }} deps ${{ hashFiles('.github/workflows/scripts/macos/*', '.github/workflows/scripts/common/*.patch') }}
- name: Build Dependencies
if: steps.cache-deps.outputs.cache-hit != 'true'
@@ -194,7 +197,7 @@ jobs:
cp "${{ steps.artifact-metadata.outputs.artifact-name }}.tar.xz" ci-artifacts/macOS.tar.xz
- name: Upload Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ${{ steps.artifact-metadata.outputs.artifact-name }}
path: "*.tar.xz"
+4 -4
View File
@@ -68,7 +68,7 @@ jobs:
mv ./release-notes.md ${GITHUB_WORKSPACE}/release-notes.md
- name: Create a GitHub Release (Manual)
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090
uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe
if: steps.tag_version.outputs.new_tag && github.event_name == 'workflow_dispatch'
with:
body_path: ./release-notes.md
@@ -77,7 +77,7 @@ jobs:
tag_name: ${{ steps.tag_version.outputs.new_tag }}
- name: Create a GitHub Release (Push)
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090
uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe
if: steps.tag_version.outputs.new_tag && github.event_name != 'workflow_dispatch'
with:
body_path: ./release-notes.md
@@ -168,7 +168,7 @@ jobs:
- name: Prepare Artifact Folder
run: mkdir ./ci-artifacts/
- uses: actions/download-artifact@v5
- uses: actions/download-artifact@v6
name: Download all Artifacts
with:
path: ./ci-artifacts/
@@ -203,7 +203,7 @@ jobs:
echo "TAG_VAL=${TAG_VAL}"
gh release edit ${TAG_VAL} --draft=false --repo PCSX2/pcsx2
- uses: actions/setup-node@v5
- uses: actions/setup-node@v6
with:
node-version: 22
@@ -20,12 +20,12 @@ LIBBACKTRACE=ad106d5fdd5d960bd33fae1c48a351af567fd075
LIBJPEGTURBO=3.1.2
LIBPNG=1.6.50
LIBWEBP=1.6.0
SDL=SDL3-3.2.24
SDL=SDL3-3.2.26
QT=6.10.0
QTAPNG=1.3.0
LZ4=1.10.0
ZSTD=1.5.7
KDDOCKWIDGETS=2.3.0
KDDOCKWIDGETS=2.4.0
PLUTOVG=1.3.1
PLUTOSVG=0.0.7
@@ -44,7 +44,7 @@ fd6f417fe9e3a071cf1424a5152d926a34c4a3c5070745470be6cf12a404ed79 $LIBBACKTRACE.
8f0012234b464ce50890c490f18194f913a7b1f4e6a03d6644179fa0f867d0cf libjpeg-turbo-$LIBJPEGTURBO.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz
e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 libwebp-$LIBWEBP.tar.gz
81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76 $SDL.tar.gz
dad488474a51a0b01d547cd2834893d6299328d2e30f479a3564088b5476bae2 $SDL.tar.gz
687ddc0c7cb128a3ea58e159b5129252537c27ede0c32a93f11f03127f0c0165 libpng-$LIBPNG-apng.patch.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
@@ -59,7 +59,7 @@ a8e4a25e5c2686fd36981e527ed05e451fcfc226bddf350f4e76181371190937 shaderc-$SHADE
9427deccbdf4bde6a269938df38c6bd75247493786a310d8d733a2c82065ef47 shaderc-glslang-$SHADERC_GLSLANG.tar.gz
c2225a49c3d7efa5c4f4ce4a6b42081e6ea3daca376f3353d9d7c2722d77a28a shaderc-spirv-headers-$SHADERC_SPIRVHEADERS.tar.gz
44d1005880c583fc00a0fb41c839214c68214b000ea8dcb54d352732fee600ff shaderc-spirv-tools-$SHADERC_SPIRVTOOLS.tar.gz
843baf9e1812c1ab82fd81d85b57cbc0d29bb43245efeb2539039780004b1056 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
51dbf24fe72e43dd7cb9a289d3cab47112010f1a2ed69b6fc8ac0dff31991ed2 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
bea672eb96ee36c2cbeb911b9bac66dfe989b3ad9a9943101e00aeb2df2aefdb plutovg-$PLUTOVG.tar.gz
78561b571ac224030cdc450ca2986b4de915c2ba7616004a6d71a379bffd15f3 plutosvg-$PLUTOSVG.tar.gz
EOF
@@ -116,7 +116,9 @@ echo "Building libjpegturbo..."
rm -fr "libjpeg-turbo-$LIBJPEGTURBO"
tar xf "libjpeg-turbo-$LIBJPEGTURBO.tar.gz"
cd "libjpeg-turbo-$LIBJPEGTURBO"
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DENABLE_STATIC=OFF -DENABLE_SHARED=ON -B build -G Ninja
# On non debian or debian based Linux systems, libjpeg-turbo will set CMAKE_INSTALL_DEFAULT_LIBDIR "lib64" (or libx32)
# That will prevent CMake from finding the deps libjpeg later on. if we set CMAKE_INSTALL_DEFAULT_LIBDIR, libjpeg-turbo will leave it as is, so set it to "lib"
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DENABLE_STATIC=OFF -DENABLE_SHARED=ON -DCMAKE_INSTALL_DEFAULT_LIBDIR="lib" -B build -G Ninja
cmake --build build --parallel
ninja -C build install
cd ..
@@ -14,8 +14,8 @@
"sources": [
{
"type": "archive",
"url": "https://libsdl.org/release/SDL3-3.2.24.tar.gz",
"sha256": "81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76"
"url": "https://libsdl.org/release/SDL3-3.2.26.tar.gz",
"sha256": "dad488474a51a0b01d547cd2834893d6299328d2e30f479a3564088b5476bae2"
}
],
"cleanup": [
@@ -1,15 +1,15 @@
{
"app-id": "net.pcsx2.PCSX2",
"runtime": "org.kde.Platform",
"runtime-version": "6.9",
"runtime-version": "6.10",
"sdk": "org.kde.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.llvm18"
"org.freedesktop.Sdk.Extension.llvm20"
],
"add-extensions": {
"org.freedesktop.Platform.ffmpeg-full": {
"directory": "lib/ffmpeg",
"version": "24.08",
"version": "25.08",
"add-ld-path": ".",
"autodownload": true
}
@@ -50,8 +50,8 @@
"-DCMAKE_PREFIX_PATH=\"${FLATPAK_DEST}\"",
"-DCMAKE_BUILD_TYPE=Release",
"-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON",
"-DCMAKE_C_COMPILER=/usr/lib/sdk/llvm18/bin/clang",
"-DCMAKE_CXX_COMPILER=/usr/lib/sdk/llvm18/bin/clang++",
"-DCMAKE_C_COMPILER=/usr/lib/sdk/llvm20/bin/clang",
"-DCMAKE_CXX_COMPILER=/usr/lib/sdk/llvm20/bin/clang++",
"-DCMAKE_EXE_LINKER_FLAGS_INIT=-fuse-ld=lld",
"-DCMAKE_MODULE_LINKER_FLAGS_INIT=-fuse-ld=lld",
"-DCMAKE_SHARED_LINKER_FLAGS_INIT=-fuse-ld=lld",
+22 -18
View File
@@ -40,17 +40,17 @@ fi
FREETYPE=2.14.1
HARFBUZZ=12.0.0
SDL=SDL3-3.2.24
SDL=SDL3-3.2.26
ZSTD=1.5.7
LZ4=1.10.0
LIBPNG=1.6.50
LIBJPEGTURBO=3.1.2
LIBWEBP=1.6.0
FFMPEG=6.0
FFMPEG=8.0
MOLTENVK=1.2.9
QT=6.7.3
QT=6.10.0
QTAPNG=1.3.0
KDDOCKWIDGETS=2.3.0
KDDOCKWIDGETS=2.4.0
PLUTOVG=1.3.1
PLUTOSVG=0.0.7
@@ -80,26 +80,26 @@ CMAKE_ARCH_UNIVERSAL=-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cat > SHASUMS <<EOF
32427e8c471ac095853212a37aef816c60b42052d4d9e48230bab3bdf2936ccc freetype-$FREETYPE.tar.xz
c4a398539c3e0fdc9a82dfe7824d0438cae78c1e2124e7c6ada3dfa600cdb6c8 harfbuzz-$HARFBUZZ.tar.gz
81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76 $SDL.tar.gz
dad488474a51a0b01d547cd2834893d6299328d2e30f479a3564088b5476bae2 $SDL.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz
e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 libwebp-$LIBWEBP.tar.gz
687ddc0c7cb128a3ea58e159b5129252537c27ede0c32a93f11f03127f0c0165 libpng-$LIBPNG-apng.patch.gz
8f0012234b464ce50890c490f18194f913a7b1f4e6a03d6644179fa0f867d0cf libjpeg-turbo-$LIBJPEGTURBO.tar.gz
57be87c22d9b49c112b6d24bc67d42508660e6b718b3db89c44e47e289137082 ffmpeg-$FFMPEG.tar.xz
b2751fccb6cc4c77708113cd78b561059b6fa904b24162fa0be2d60273d27b8e ffmpeg-$FFMPEG.tar.xz
f415a09385030c6510a936155ce211f617c31506db5fbc563e804345f1ecf56e v$MOLTENVK.tar.gz
8ccbb9ab055205ac76632c9eeddd1ed6fc66936fc56afc2ed0fd5d9e23da3097 qtbase-everywhere-src-$QT.tar.xz
9fd58144081654c3373768dd96ead294023830927b14fe3d3c1ef641fb324753 qtimageformats-everywhere-src-$QT.tar.xz
40142cb71fb1e07ad612bc361b67f5d54cd9367f9979ae6b86124a064deda06b qtsvg-everywhere-src-$QT.tar.xz
f03bb7df619cd9ac9dba110e30b7bcab5dd88eb8bdc9cc752563b4367233203f qttools-everywhere-src-$QT.tar.xz
dcc762acac043b9bb5e4d369b6d6f53e0ecfcf76a408fe0db5f7ef071c9d6dc8 qttranslations-everywhere-src-$QT.tar.xz
ead4623bcb54a32257c5b3e3a5aec6d16ec96f4cda58d2e003f5a0c16f72046d qtbase-everywhere-src-$QT.tar.xz
64450a52507c540de53616ed5e516df0e0905a99d3035ddfaa690f2b3f7c0cea qtimageformats-everywhere-src-$QT.tar.xz
5ed2c0e04d5e73ff75c2a2ed92db5dc1788ba70f704fc2b71bc21644beda2533 qtsvg-everywhere-src-$QT.tar.xz
d86d5098cf3e3e599f37e18df477e65908fc8f036e10ea731b3469ec4fdbd02a qttools-everywhere-src-$QT.tar.xz
326e8253cfd0cb5745238117f297da80e30ce8f4c1db81990497bd388b026cde qttranslations-everywhere-src-$QT.tar.xz
f1d3be3489f758efe1a8f12118a212febbe611aa670af32e0159fa3c1feab2a6 QtApng-$QTAPNG.tar.gz
a8e4a25e5c2686fd36981e527ed05e451fcfc226bddf350f4e76181371190937 shaderc-$SHADERC.tar.gz
9427deccbdf4bde6a269938df38c6bd75247493786a310d8d733a2c82065ef47 shaderc-glslang-$SHADERC_GLSLANG.tar.gz
c2225a49c3d7efa5c4f4ce4a6b42081e6ea3daca376f3353d9d7c2722d77a28a shaderc-spirv-headers-$SHADERC_SPIRVHEADERS.tar.gz
44d1005880c583fc00a0fb41c839214c68214b000ea8dcb54d352732fee600ff shaderc-spirv-tools-$SHADERC_SPIRVTOOLS.tar.gz
843baf9e1812c1ab82fd81d85b57cbc0d29bb43245efeb2539039780004b1056 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
51dbf24fe72e43dd7cb9a289d3cab47112010f1a2ed69b6fc8ac0dff31991ed2 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
bea672eb96ee36c2cbeb911b9bac66dfe989b3ad9a9943101e00aeb2df2aefdb plutovg-$PLUTOVG.tar.gz
78561b571ac224030cdc450ca2986b4de915c2ba7616004a6d71a379bffd15f3 plutosvg-$PLUTOSVG.tar.gz
EOF
@@ -285,6 +285,10 @@ echo "Installing Qt Base..."
rm -fr "qtbase-everywhere-src-$QT"
tar xf "qtbase-everywhere-src-$QT.tar.xz"
cd "qtbase-everywhere-src-$QT"
# Patch Qt to support macOS 11
patch -p1 < "$SCRIPTDIR/qt-macos11compat.patch"
# since we don't have a direct reference to QtSvg, it doesn't deployed directly from the main binary
# (only indirectly from iconengines), and the libqsvg.dylib imageformat plugin does not get deployed.
# We could run macdeployqt twice, but that's even more janky than patching it.
@@ -320,7 +324,7 @@ tar xf "qtsvg-everywhere-src-$QT.tar.xz"
cd "qtsvg-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL"
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DQT_GENERATE_SBOM=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -331,7 +335,7 @@ tar xf "qtimageformats-everywhere-src-$QT.tar.xz"
cd "qtimageformats-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DFEATURE_system_webp=ON
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DQT_GENERATE_SBOM=OFF -DFEATURE_system_webp=ON
make "-j$NPROCS"
make install
cd ../..
@@ -342,7 +346,7 @@ tar xf "qttools-everywhere-src-$QT.tar.xz"
cd "qttools-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=OFF -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DQT_GENERATE_SBOM=OFF -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=OFF -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -371,7 +375,7 @@ tar xf "qttranslations-everywhere-src-$QT.tar.xz"
cd "qttranslations-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL"
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DQT_GENERATE_SBOM=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -391,8 +395,8 @@ rm -fr "KDDockWidgets-$KDDOCKWIDGETS"
tar xf "KDDockWidgets-$KDDOCKWIDGETS.tar.gz"
cd "KDDockWidgets-$KDDOCKWIDGETS"
cmake "${CMAKE_COMMON[@]}" "$CMAKE_ARCH_UNIVERSAL" -DKDDockWidgets_QT6=true -DKDDockWidgets_EXAMPLES=false -DKDDockWidgets_FRONTENDS=qtwidgets -B build
cmake --build build --parallel
cmake --install build
make -C build "-j$NPROCS"
make -C build install
cd ..
echo "Building PlutoVG..."
@@ -22,17 +22,17 @@ fi
FREETYPE=2.14.1
HARFBUZZ=12.0.0
SDL=SDL3-3.2.24
SDL=SDL3-3.2.26
ZSTD=1.5.7
LZ4=1.10.0
LIBPNG=1.6.50
LIBJPEGTURBO=3.1.2
LIBWEBP=1.6.0
FFMPEG=6.0
FFMPEG=8.0
MOLTENVK=1.2.9
QT=6.7.3
QT=6.10.0
QTAPNG=1.3.0
KDDOCKWIDGETS=2.3.0
KDDOCKWIDGETS=2.4.0
PLUTOVG=1.3.1
PLUTOSVG=0.0.7
@@ -54,32 +54,33 @@ CMAKE_COMMON=(
-DCMAKE_PREFIX_PATH="$INSTALLDIR"
-DCMAKE_INSTALL_PREFIX="$INSTALLDIR"
-DCMAKE_OSX_ARCHITECTURES="x86_64"
-DCMAKE_APPLE_SILICON_PROCESSOR="x86_64"
-DCMAKE_INSTALL_NAME_DIR='$<INSTALL_PREFIX>/lib'
)
cat > SHASUMS <<EOF
32427e8c471ac095853212a37aef816c60b42052d4d9e48230bab3bdf2936ccc freetype-$FREETYPE.tar.xz
c4a398539c3e0fdc9a82dfe7824d0438cae78c1e2124e7c6ada3dfa600cdb6c8 harfbuzz-$HARFBUZZ.tar.gz
81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76 $SDL.tar.gz
dad488474a51a0b01d547cd2834893d6299328d2e30f479a3564088b5476bae2 $SDL.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz
e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 libwebp-$LIBWEBP.tar.gz
687ddc0c7cb128a3ea58e159b5129252537c27ede0c32a93f11f03127f0c0165 libpng-$LIBPNG-apng.patch.gz
8f0012234b464ce50890c490f18194f913a7b1f4e6a03d6644179fa0f867d0cf libjpeg-turbo-$LIBJPEGTURBO.tar.gz
57be87c22d9b49c112b6d24bc67d42508660e6b718b3db89c44e47e289137082 ffmpeg-$FFMPEG.tar.xz
b2751fccb6cc4c77708113cd78b561059b6fa904b24162fa0be2d60273d27b8e ffmpeg-$FFMPEG.tar.xz
f415a09385030c6510a936155ce211f617c31506db5fbc563e804345f1ecf56e v$MOLTENVK.tar.gz
8ccbb9ab055205ac76632c9eeddd1ed6fc66936fc56afc2ed0fd5d9e23da3097 qtbase-everywhere-src-$QT.tar.xz
9fd58144081654c3373768dd96ead294023830927b14fe3d3c1ef641fb324753 qtimageformats-everywhere-src-$QT.tar.xz
40142cb71fb1e07ad612bc361b67f5d54cd9367f9979ae6b86124a064deda06b qtsvg-everywhere-src-$QT.tar.xz
f03bb7df619cd9ac9dba110e30b7bcab5dd88eb8bdc9cc752563b4367233203f qttools-everywhere-src-$QT.tar.xz
dcc762acac043b9bb5e4d369b6d6f53e0ecfcf76a408fe0db5f7ef071c9d6dc8 qttranslations-everywhere-src-$QT.tar.xz
ead4623bcb54a32257c5b3e3a5aec6d16ec96f4cda58d2e003f5a0c16f72046d qtbase-everywhere-src-$QT.tar.xz
64450a52507c540de53616ed5e516df0e0905a99d3035ddfaa690f2b3f7c0cea qtimageformats-everywhere-src-$QT.tar.xz
5ed2c0e04d5e73ff75c2a2ed92db5dc1788ba70f704fc2b71bc21644beda2533 qtsvg-everywhere-src-$QT.tar.xz
d86d5098cf3e3e599f37e18df477e65908fc8f036e10ea731b3469ec4fdbd02a qttools-everywhere-src-$QT.tar.xz
326e8253cfd0cb5745238117f297da80e30ce8f4c1db81990497bd388b026cde qttranslations-everywhere-src-$QT.tar.xz
f1d3be3489f758efe1a8f12118a212febbe611aa670af32e0159fa3c1feab2a6 QtApng-$QTAPNG.tar.gz
a8e4a25e5c2686fd36981e527ed05e451fcfc226bddf350f4e76181371190937 shaderc-$SHADERC.tar.gz
9427deccbdf4bde6a269938df38c6bd75247493786a310d8d733a2c82065ef47 shaderc-glslang-$SHADERC_GLSLANG.tar.gz
c2225a49c3d7efa5c4f4ce4a6b42081e6ea3daca376f3353d9d7c2722d77a28a shaderc-spirv-headers-$SHADERC_SPIRVHEADERS.tar.gz
44d1005880c583fc00a0fb41c839214c68214b000ea8dcb54d352732fee600ff shaderc-spirv-tools-$SHADERC_SPIRVTOOLS.tar.gz
843baf9e1812c1ab82fd81d85b57cbc0d29bb43245efeb2539039780004b1056 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
51dbf24fe72e43dd7cb9a289d3cab47112010f1a2ed69b6fc8ac0dff31991ed2 KDDockWidgets-$KDDOCKWIDGETS.tar.gz
bea672eb96ee36c2cbeb911b9bac66dfe989b3ad9a9943101e00aeb2df2aefdb plutovg-$PLUTOVG.tar.gz
78561b571ac224030cdc450ca2986b4de915c2ba7616004a6d71a379bffd15f3 plutosvg-$PLUTOSVG.tar.gz
EOF
@@ -233,26 +234,18 @@ rm -fr "qtbase-everywhere-src-$QT"
tar xf "qtbase-everywhere-src-$QT.tar.xz"
cd "qtbase-everywhere-src-$QT"
# Patch Qt to support macOS 11
patch -p1 < "$SCRIPTDIR/qt-macos11compat.patch"
# Patch Qt to fix a bug with message boxes on Tahoe
patch -p1 < "$SCRIPTDIR/clickbutton.patch"
# since we don't have a direct reference to QtSvg, it doesn't deployed directly from the main binary
# (only indirectly from iconengines), and the libqsvg.dylib imageformat plugin does not get deployed.
# We could run macdeployqt twice, but that's even more janky than patching it.
# https://github.com/qt/qtbase/commit/7b018629c3c3ab23665bf1da00c43c1546042035
# The QProcess default wait time of 30s may be too short in e.g. CI environments where processes may be blocked
# for a longer time waiting for CPU or IO.
patch -u src/tools/macdeployqt/shared/shared.cpp <<EOF
--- shared.cpp
+++ shared.cpp
@@ -152,7 +152,7 @@
LogDebug() << " inspecting" << binaryPath;
QProcess otool;
otool.start("otool", QStringList() << "-L" << binaryPath);
- otool.waitForFinished();
+ otool.waitForFinished(-1);
if (otool.exitStatus() != QProcess::NormalExit || otool.exitCode() != 0) {
LogError() << otool.readAllStandardError();
@@ -1122,14 +1122,8 @@
addPlugins(QStringLiteral("networkinformation"));
}
@@ -271,7 +264,7 @@ patch -u src/tools/macdeployqt/shared/shared.cpp <<EOF
// Platforminputcontext plugins if QtGui is in use
EOF
cmake -B build "${CMAKE_COMMON[@]}" -DFEATURE_dbus=OFF -DFEATURE_framework=OFF -DFEATURE_icu=OFF -DFEATURE_opengl=OFF -DFEATURE_sql=OFF -DFEATURE_gssapi=OFF -DFEATURE_system_png=ON -DFEATURE_system_jpeg=ON -DFEATURE_system_zlib=ON -DFEATURE_system_freetype=ON -DFEATURE_system_harfbuzz=ON
cmake -B build "${CMAKE_COMMON[@]}" -DCMAKE_BUILD_TYPE=MinSizeRel -DFEATURE_dbus=OFF -DFEATURE_framework=OFF -DFEATURE_icu=OFF -DFEATURE_opengl=OFF -DFEATURE_sql=OFF -DFEATURE_gssapi=OFF -DFEATURE_system_png=ON -DFEATURE_system_jpeg=ON -DFEATURE_system_zlib=ON -DFEATURE_system_freetype=ON -DFEATURE_system_harfbuzz=ON
make -C build "-j$NPROCS"
make -C build install
cd ..
@@ -282,7 +275,7 @@ tar xf "qtsvg-everywhere-src-$QT.tar.xz"
cd "qtsvg-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}"
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DQT_GENERATE_SBOM=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -293,7 +286,7 @@ tar xf "qtimageformats-everywhere-src-$QT.tar.xz"
cd "qtimageformats-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DFEATURE_system_webp=ON
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DQT_GENERATE_SBOM=OFF -DFEATURE_system_webp=ON
make "-j$NPROCS"
make install
cd ../..
@@ -304,7 +297,7 @@ tar xf "qttools-everywhere-src-$QT.tar.xz"
cd "qttools-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=ON -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DQT_GENERATE_SBOM=OFF -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=ON -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -333,7 +326,7 @@ tar xf "qttranslations-everywhere-src-$QT.tar.xz"
cd "qttranslations-everywhere-src-$QT"
mkdir build
cd build
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}"
"$INSTALLDIR/bin/qt-configure-module" .. -- "${CMAKE_COMMON[@]}" -DQT_GENERATE_SBOM=OFF
make "-j$NPROCS"
make install
cd ../..
@@ -0,0 +1,16 @@
--- a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm
+++ b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm
@@ -88,6 +88,11 @@ bool QCocoaMessageDialog::show(Qt::WindowModality windowModality)
qCWarning(lcQpaDialogs, "Cannot run window modal dialog without parent window");
return false;
}
+
+ // Tahoe has issues with window-modal alert buttons not responding to mouse
+ if (windowModality == Qt::WindowModal
+ && QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSTahoe)
+ return false;
// And without options we don't know what to show
if (!options())
# Source https://codereview.qt-project.org/c/qt/qtbase/+/689796
@@ -0,0 +1,78 @@
diff --git a/.cmake.conf b/.cmake.conf
index 9a21ff42a74..d6707ba7dff 100644
--- a/.cmake.conf
+++ b/.cmake.conf
@@ -51,7 +51,7 @@ set(QT_MAX_NEW_POLICY_CMAKE_VERSION_QT_APPLE "3.21")
set(QT_SUPPORTED_MIN_MACOS_SDK_VERSION "14")
set(QT_SUPPORTED_MAX_MACOS_SDK_VERSION "26")
set(QT_SUPPORTED_MIN_MACOS_XCODE_VERSION "15")
-set(QT_SUPPORTED_MIN_MACOS_VERSION "13")
+set(QT_SUPPORTED_MIN_MACOS_VERSION "11")
set(QT_SUPPORTED_MAX_MACOS_VERSION_TESTED "26")
set(QT_SUPPORTED_MIN_IOS_SDK_VERSION "17")
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d3a14fc67eb..1553b956fe3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,10 @@ cmake_minimum_required(VERSION 3.16)
# Get the repo version and CMake policy details
include(.cmake.conf)
+if(APPLE)
+ add_compile_options(-Werror=unguarded-availability-new)
+endif()
+
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/QtBaseHelpers.cmake)
qt_internal_check_if_path_has_symlinks("${CMAKE_BINARY_DIR}")
diff --git a/src/corelib/global/qsysinfo.cpp b/src/corelib/global/qsysinfo.cpp
index ae762c0cc6d..9171a5736b4 100644
--- a/src/corelib/global/qsysinfo.cpp
+++ b/src/corelib/global/qsysinfo.cpp
@@ -1027,7 +1027,7 @@ QByteArray QSysInfo::machineUniqueId()
{
#if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
char uuid[UuidStringLen + 1];
- io_service_t service = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
+ io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
QCFString stringRef = (CFStringRef)IORegistryEntryCreateCFProperty(service, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
CFStringGetCString(stringRef, uuid, sizeof(uuid), kCFStringEncodingMacRoman);
return QByteArray(uuid);
diff --git a/src/corelib/kernel/qcore_mac.mm b/src/corelib/kernel/qcore_mac.mm
index 9f27dbe694e..c023a48cad3 100644
--- a/src/corelib/kernel/qcore_mac.mm
+++ b/src/corelib/kernel/qcore_mac.mm
@@ -372,7 +372,7 @@ bool qt_apple_runningWithLiquidGlass()
return config;
#endif
- QIOType<io_registry_entry_t> nvram = IORegistryEntryFromPath(kIOMainPortDefault, "IODeviceTree:/options");
+ QIOType<io_registry_entry_t> nvram = IORegistryEntryFromPath(kIOMasterPortDefault, "IODeviceTree:/options");
if (!nvram) {
qWarning("Failed to locate NVRAM entry in IO registry");
return {};
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 6b33d94d58c..867389e4c93 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -323,6 +323,8 @@ a normal (not maximized or full screen) top-level window.
m_view.safeAreaInsets.bottom
};
+ if (@available(macOS 12, *)) {
+
// The screen's safe area insets represent the distances from the screen's
// edges at which content isn't obscured. The view's safe area margins do
// not include the screen's insets automatically, so we need to manually
@@ -355,6 +357,10 @@ a normal (not maximized or full screen) top-level window.
};
return (screenSafeAreaMargins | viewSafeAreaMargins).toMargins();
+
+ } else {
+ return viewSafeAreaMargins.toMargins();
+ }
}
void QCocoaWindow::updateSafeAreaMarginsIfNeeded()
@@ -47,7 +47,7 @@ set HARFBUZZ=12.0.0
set LIBJPEGTURBO=3.1.2
set LIBPNG=1650
set LIBPNGLONG=1.6.50
set SDL=SDL3-3.2.24
set SDL=SDL3-3.2.26
set QT=6.10.0
set QTMINOR=6.10
set QTAPNG=1.3.0
@@ -56,7 +56,7 @@ set WEBP=1.6.0
set ZLIB=1.3.1
set ZLIBSHORT=131
set ZSTD=1.5.7
set KDDOCKWIDGETS=2.3.0
set KDDOCKWIDGETS=2.4.0
set PLUTOVG=1.3.1
set PLUTOSVG=0.0.7
@@ -71,8 +71,7 @@ call :downloadfile "lpng%LIBPNG%.zip" https://download.sourceforge.net/libpng/lp
call :downloadfile "lpng%LIBPNG%-apng.patch.gz" https://download.sourceforge.net/libpng-apng/libpng-%LIBPNGLONG%-apng.patch.gz 687ddc0c7cb128a3ea58e159b5129252537c27ede0c32a93f11f03127f0c0165 || goto error
call :downloadfile "libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/%LIBJPEGTURBO%/libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" 8f0012234b464ce50890c490f18194f913a7b1f4e6a03d6644179fa0f867d0cf || goto error
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" ca7fe2ca54a97e047f5eff236e62ae87546e862f509f0a62fc6e564ded3c6a95 || goto error
call :downloadfile "SDL-7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch" https://github.com/libsdl-org/SDL/commit/7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch 5c09a29a9cac87a85ec3b8f5a68ff0e5c6c47229f3e2282241b9c32166f26977 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 739356eef1192fff9d641c320a8f5ef4a10506b8927def4b9ceb764c7e947369 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" d3b5379edcace266273d789249b6d68ae9495ec1b0b562ba6d039034cd315d8e || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" ac2fe34a9f1c1451b6785474e9b1b64eb59edef6553be3d630240f16a730456d || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" c12f8bfb617e4a03da104be36f6966ba7f64bee331f0095da1a649a1149796d2 || goto error
@@ -82,7 +81,7 @@ call :downloadfile "QtApng-%QTAPNG%.zip" "https://github.com/jurplel/QtApng/arch
call :downloadfile "lz4-%LZ4%.zip" "https://github.com/lz4/lz4/archive/refs/tags/v%LZ4%.zip" 3224b4c80f351f194984526ef396f6079bd6332dd9825c72ac0d7a37b3cdc565 || goto error
call :downloadfile "zlib%ZLIBSHORT%.zip" "https://zlib.net/zlib%ZLIBSHORT%.zip" 72af66d44fcc14c22013b46b814d5d2514673dda3d115e64b690c1ad636e7b17 || goto error
call :downloadfile "zstd-%ZSTD%.zip" "https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD%.zip" 7897bc5d620580d9b7cd3539c44b59d78f3657d33663fe97a145e07b4ebd69a4 || goto error
call :downloadfile "KDDockWidgets-%KDDOCKWIDGETS%.zip" "https://github.com/KDAB/KDDockWidgets/archive/v%KDDOCKWIDGETS%.zip" d2b9592ebe5d053ac97a0213ea35139866d8d5e0a1d84b7d3fb581db7f0b01c6 || goto error
call :downloadfile "KDDockWidgets-%KDDOCKWIDGETS%.zip" "https://github.com/KDAB/KDDockWidgets/archive/v%KDDOCKWIDGETS%.zip" 47ddb48197872055f0adf8e90a7235f8a3b795ca1ee3a28ac2c504c673ae3806 || goto error
call :downloadfile "plutovg-%PLUTOVG%.zip" "https://github.com/sammycage/plutovg/archive/v%PLUTOVG%.zip" 615184f756d91ce416f2cf883bb67fd4262651417c2e40c4d681c8641a48263e || goto error
call :downloadfile "plutosvg-%PLUTOSVG%.zip" "https://github.com/sammycage/plutosvg/archive/v%PLUTOSVG%.zip" 82dee2c57ad712bdd6d6d81d3e76249d89caa4b5a4214353660fd5adff12201a || goto error
@@ -97,7 +96,7 @@ if %DEBUG%==1 (
echo Building release libraries...
)
set FORCEPDB=-DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/DEBUG"
set FORCEPDB=-DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/DEBUG" -DCMAKE_SHARED_LINKER_FLAGS_MINSIZEREL="/DEBUG"
set ARM64TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE="%SCRIPTDIR%\cmake-toolchain-windows-arm64.cmake"
echo Building Zlib...
@@ -189,7 +188,6 @@ echo Building SDL...
rmdir /S /Q "%SDL%"
%SEVENZIP% x "%SDL%.zip" || goto error
cd "%SDL%" || goto error
%PATCH% -p1 < "..\SDL-7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch" || goto error
cmake -B build %ARM64TOOLCHAIN% -DCMAKE_BUILD_TYPE=Release %FORCEPDB% -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error
cmake --build build --parallel || goto error
ninja -C build install || goto error
@@ -199,7 +197,7 @@ cd .. || goto error
if %DEBUG%==1 (
set QTBUILDSPEC=-DCMAKE_CONFIGURATION_TYPES="Release;Debug" -G "Ninja Multi-Config"
) else (
set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=Release -G Ninja
set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=MinSizeRel -G Ninja
)
echo Building Qt base...
@@ -44,7 +44,7 @@ set FREETYPE=2.14.1
set HARFBUZZ=12.0.0
set LIBJPEGTURBO=3.1.2
set LIBPNG=1650
set SDL=SDL3-3.2.24
set SDL=SDL3-3.2.26
set LIBPNGLONG=1.6.50
set QT=6.10.0
set QTMINOR=6.10
@@ -54,7 +54,7 @@ set WEBP=1.6.0
set ZLIB=1.3.1
set ZLIBSHORT=131
set ZSTD=1.5.7
set KDDOCKWIDGETS=2.3.0
set KDDOCKWIDGETS=2.4.0
set PLUTOVG=1.3.1
set PLUTOSVG=0.0.7
@@ -69,8 +69,7 @@ call :downloadfile "lpng%LIBPNG%.zip" https://download.sourceforge.net/libpng/lp
call :downloadfile "lpng%LIBPNG%-apng.patch.gz" https://download.sourceforge.net/libpng-apng/libpng-%LIBPNGLONG%-apng.patch.gz 687ddc0c7cb128a3ea58e159b5129252537c27ede0c32a93f11f03127f0c0165 || goto error
call :downloadfile "libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/%LIBJPEGTURBO%/libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" 8f0012234b464ce50890c490f18194f913a7b1f4e6a03d6644179fa0f867d0cf || goto error
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" ca7fe2ca54a97e047f5eff236e62ae87546e862f509f0a62fc6e564ded3c6a95 || goto error
call :downloadfile "SDL-7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch" https://github.com/libsdl-org/SDL/commit/7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch 5c09a29a9cac87a85ec3b8f5a68ff0e5c6c47229f3e2282241b9c32166f26977 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 739356eef1192fff9d641c320a8f5ef4a10506b8927def4b9ceb764c7e947369 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" d3b5379edcace266273d789249b6d68ae9495ec1b0b562ba6d039034cd315d8e || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" ac2fe34a9f1c1451b6785474e9b1b64eb59edef6553be3d630240f16a730456d || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" c12f8bfb617e4a03da104be36f6966ba7f64bee331f0095da1a649a1149796d2 || goto error
@@ -80,7 +79,7 @@ call :downloadfile "QtApng-%QTAPNG%.zip" "https://github.com/jurplel/QtApng/arch
call :downloadfile "lz4-%LZ4%.zip" "https://github.com/lz4/lz4/archive/refs/tags/v%LZ4%.zip" 3224b4c80f351f194984526ef396f6079bd6332dd9825c72ac0d7a37b3cdc565 || goto error
call :downloadfile "zlib%ZLIBSHORT%.zip" "https://zlib.net/zlib%ZLIBSHORT%.zip" 72af66d44fcc14c22013b46b814d5d2514673dda3d115e64b690c1ad636e7b17 || goto error
call :downloadfile "zstd-%ZSTD%.zip" "https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD%.zip" 7897bc5d620580d9b7cd3539c44b59d78f3657d33663fe97a145e07b4ebd69a4 || goto error
call :downloadfile "KDDockWidgets-%KDDOCKWIDGETS%.zip" "https://github.com/KDAB/KDDockWidgets/archive/v%KDDOCKWIDGETS%.zip" d2b9592ebe5d053ac97a0213ea35139866d8d5e0a1d84b7d3fb581db7f0b01c6 || goto error
call :downloadfile "KDDockWidgets-%KDDOCKWIDGETS%.zip" "https://github.com/KDAB/KDDockWidgets/archive/v%KDDOCKWIDGETS%.zip" 47ddb48197872055f0adf8e90a7235f8a3b795ca1ee3a28ac2c504c673ae3806 || goto error
call :downloadfile "plutovg-%PLUTOVG%.zip" "https://github.com/sammycage/plutovg/archive/v%PLUTOVG%.zip" 615184f756d91ce416f2cf883bb67fd4262651417c2e40c4d681c8641a48263e || goto error
call :downloadfile "plutosvg-%PLUTOSVG%.zip" "https://github.com/sammycage/plutosvg/archive/v%PLUTOSVG%.zip" 82dee2c57ad712bdd6d6d81d3e76249d89caa4b5a4214353660fd5adff12201a || goto error
@@ -95,7 +94,7 @@ if %DEBUG%==1 (
echo Building release libraries...
)
set FORCEPDB=-DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/DEBUG" -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="/DEBUG"
set FORCEPDB=-DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/DEBUG" -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="/DEBUG" -DCMAKE_SHARED_LINKER_FLAGS_MINSIZEREL="/DEBUG" -DCMAKE_MODULE_LINKER_FLAGS_MINSIZEREL="/DEBUG"
echo Building Zlib...
rmdir /S /Q "zlib-%ZLIB%"
@@ -186,7 +185,6 @@ echo Building SDL...
rmdir /S /Q "%SDL%"
%SEVENZIP% x "%SDL%.zip" || goto error
cd "%SDL%" || goto error
%PATCH% -p1 < "..\SDL-7914bdb7ea14ee5109d50df857c8dfc69a28a62d.patch" || goto error
cmake -B build -DCMAKE_BUILD_TYPE=Release %FORCEPDB% -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error
cmake --build build --parallel || goto error
ninja -C build install || goto error
@@ -196,7 +194,7 @@ cd .. || goto error
if %DEBUG%==1 (
set QTBUILDSPEC=-DCMAKE_CONFIGURATION_TYPES="Release;Debug" -G "Ninja Multi-Config"
) else (
set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=Release -G Ninja
set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=MinSizeRel -G Ninja
)
echo Building Qt base...
@@ -235,7 +233,7 @@ ninja install || goto error
cd ..\.. || goto error
echo Building Qt Tools...
rmdir /S /Q "qtimageformats-everywhere-src-%QT%"
rmdir /S /Q "qttools-everywhere-src-%QT%"
%SEVENZIP% x "qttools-everywhere-src-%QT%.zip" || goto error
cd "qttools-everywhere-src-%QT%" || goto error
mkdir build || goto error
+2 -2
View File
@@ -154,7 +154,7 @@ jobs:
cmake --build build --config Release --target unittests
- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ${{ steps.artifact-metadata.outputs.artifact-name }}
path: |
@@ -186,7 +186,7 @@ jobs:
}
- name: Upload artifact - with symbols
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ${{ steps.artifact-metadata.outputs.artifact-name }}-symbols
path: |
+250 -130
View File
@@ -532,6 +532,8 @@ PAPX-90524:
name-sort: "わいるどあーむず ざ ふぃふすゔぁんがーど [たいけんばん]"
name-en: "Wild Arms - The Vth Vanguard [Trial]"
region: "NTSC-J"
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -1838,6 +1840,8 @@ SCAJ-20095:
region: "NTSC-Unk"
gameFixes:
- EETimingHack
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SCAJ-20096:
name: "Guilty Gear Isuka"
region: "NTSC-Unk"
@@ -2061,10 +2065,13 @@ SCAJ-20129:
name: "Ponkotsu Roman Daikatsugeki Bumpy Trot"
region: "NTSC-Unk"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SCAJ-20130:
name: "Namco x Capcom"
region: "NTSC-Unk"
@@ -2362,9 +2369,13 @@ SCAJ-20171:
name-en: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku Tachi"
region: "NTSC-J"
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SCAJ-20172:
name: "Final Fantasy XII"
region: "NTSC-Unk"
@@ -2450,6 +2461,8 @@ SCAJ-20183:
name-sort: "わいるどあーむず ざ ふぃふすゔぁんがーど"
name-en: "Wild Arms - The Vth Vanguard"
region: "NTSC-J"
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -3817,9 +3830,13 @@ SCED-52491:
SCED-52496:
name: "This Is Football 2004 [Demo]"
region: "PAL-M4"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCED-52497:
name: "This Is Football 2004 [Demo]"
region: "PAL-M4"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCED-52549:
name: "Official PlayStation 2 Magazine Demo 47"
region: "PAL-M5"
@@ -5387,18 +5404,28 @@ SCES-51608:
SCES-51610:
name: "This is Football 2004 [Red Devils 2004]"
region: "PAL-BE"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCES-51611:
name: "This is Football 2004"
region: "PAL-M4"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCES-51612:
name: "This is Football 5"
name: "This Is Football 2004"
region: "PAL-E-N"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCES-51613:
name: "This is Football 2004"
region: "PAL-M4"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCES-51614:
name: "Monde des Bleus 2004, Le - Nouvelle Generation"
region: "PAL-F"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCES-51618:
name: "SOCOM - U.S. Navy SEALs"
region: "PAL-M5"
@@ -7552,10 +7579,13 @@ SCKA-20058:
name-en: "Action Romance Bumpy Trot"
region: "NTSC-K"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SCKA-20059:
name: "소울칼리버 Ⅲ"
name-en: "SoulCalibur III"
@@ -9566,6 +9596,8 @@ SCPS-15118:
name-sort: "わいるどあーむず ざ ふぃふすゔぁんがーど"
name-en: "Wild ARMs - The Vth Vanguard"
region: "NTSC-J"
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -10276,6 +10308,8 @@ SCPS-19333:
name-sort: "わいるどあーむず ざ ふぃふすゔぁんがーど [PlayStation2 the Best]"
name-en: "Wild ARMs - The Vth Vanguard [PlayStation2 the Best]"
region: "NTSC-J"
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -11003,7 +11037,7 @@ SCUS-97115:
recommendedBlendingLevel: 3 # Improves banding in car showcase as well as car brightness and sheen.
getSkipCount: "GSC_PolyphonyDigitalGames" # Fixes post-processing.
SCUS-97116:
name: "Kiosk Demo Disc 2.01"
name: "Kiosk Disc 2.1"
region: "NTSC-U"
SCUS-97117:
name: "PlayStation 2 Demo Disc Version 2.1 [Need for Speed - Underground]"
@@ -11041,7 +11075,7 @@ SCUS-97126:
name: "PlayStation 2 Demo Disc Version 2.2"
region: "NTSC-U"
SCUS-97127:
name: "Kiosk Demo Disc 2.02"
name: "Kiosk Disc 2.2"
region: "NTSC-U"
SCUS-97128:
name: "Drakan - The Ancients' Gates"
@@ -11112,7 +11146,7 @@ SCUS-97140:
patch=0,EE,0032940C,word,48459000
patch=0,EE,00329420,word,4BDAD1FF
SCUS-97142:
name: "Primal - Civilization Is Only Skin Deep"
name: "Primal"
region: "NTSC-U"
compat: 5
roundModes:
@@ -11158,7 +11192,7 @@ SCUS-97155:
name: "PlayStation 2 Demo Disc Version 2.3"
region: "NTSC-U"
SCUS-97156:
name: "Kiosk Demo Disc 2.03"
name: "Kiosk Demo Disc 2.3"
region: "NTSC-U"
SCUS-97157:
name: "Frequency [Demo]"
@@ -11239,7 +11273,7 @@ SCUS-97173:
region: "NTSC-U"
compat: 5
SCUS-97174:
name: "Kiosk Demo Disc 2.04"
name: "Kiosk Demo Disc 2.4"
region: "NTSC-U"
SCUS-97175:
name: "NCAA Final Four 2002 [Demo]"
@@ -11337,7 +11371,7 @@ SCUS-97199:
halfPixelOffset: 4 # Aligns post bloom.
nativeScaling: 1 # Fixes light blooms.
SCUS-97200:
name: "Kiosk Demo Disc 2.05"
name: "Kiosk Demo Disc 2.5"
region: "NTSC-U"
SCUS-97201:
name: "The Mark of Kri"
@@ -11417,7 +11451,7 @@ SCUS-97216:
name: "PlayStation Underground Summer Sampler"
region: "NTSC-U"
SCUS-97217:
name: "NBA Shootout 2003"
name: "NBA ShootOut 2003"
region: "NTSC-U"
gameFixes:
- EETimingHack # Fixes an issue with loading screens which cause the game to return on the Bios.
@@ -11425,7 +11459,7 @@ SCUS-97217:
cpuSpriteRenderBW: 2 # Fixes broken player rendering and skin flashing.
cpuSpriteRenderLevel: 2 # Needed for above.
SCUS-97218:
name: "Kiosk Demo Disc 2.06"
name: "Kiosk Demo Disc 2.6"
region: "NTSC-U"
SCUS-97219:
name: "Gran Turismo 3 - A-Spec - Nissan 350Z Edition"
@@ -11463,7 +11497,7 @@ SCUS-97226:
name: "NCAA GameBreaker 2003 [Demo]"
region: "NTSC-U"
SCUS-97227:
name: "Kiosk Demo Disc 2.07"
name: "Kiosk Demo Disc 2.7"
region: "NTSC-U"
SCUS-97229:
name: "Dark Cloud 2 [Demo]"
@@ -11566,7 +11600,7 @@ SCUS-97252:
name: "Official U.S. PlayStation Magazine Demo Disc 077"
region: "NTSC-U"
SCUS-97253:
name: "NBA Shootout 2003 [Demo]"
name: "NBA ShootOut 2003 [Demo]"
region: "NTSC-U"
gameFixes:
- EETimingHack # Fixes an issue with loading screens which cause the game to return on the Bios.
@@ -11590,7 +11624,7 @@ SCUS-97260:
name: "War of the Monsters [Demo]"
region: "NTSC-U"
SCUS-97261:
name: "Kiosk Demo Disc 2.08"
name: "Kiosk Demo Disc 2.8"
region: "NTSC-U"
SCUS-97262:
name: "Amplitude [Demo]"
@@ -11650,7 +11684,7 @@ SCUS-97269:
region: "NTSC-U"
compat: 3
SCUS-97270:
name: "Kiosk Demo Disc 2.09"
name: "Kiosk Demo Disc 2.9"
region: "NTSC-U"
SCUS-97271:
name: "Final Fantasy XI - Online [Beta Version] [Disc 1 of 2]"
@@ -11710,9 +11744,6 @@ SCUS-97282:
halfPixelOffset: 4 # Fixes post-processing alignment.
nativeScaling: 1 # Fixes depth blur intensity.
textureInsideRT: 1 # Fixes on screen garbage.
SCUS-97292:
name: "Amplitude [Demo]"
region: "NTSC-U"
SCUS-97312:
name: "Jampack Demo Disc - Winter 2003 [T-Rated]"
region: "NTSC-U"
@@ -11742,7 +11773,7 @@ SCUS-97319:
region: "NTSC-U"
compat: 5
SCUS-97321:
name: "Kiosk Demo Disc 2.10"
name: "Kiosk June·July·August 2003" # Kiosk Demo Disc 2.10 or "PS2-10"
region: "NTSC-U"
SCUS-97322:
name: "Ratchet & Clank 2 - Going Commando [Regular Demo]"
@@ -11763,10 +11794,10 @@ SCUS-97323:
halfPixelOffset: 4 # Aligns post bloom.
nativeScaling: 1 # Fixes light blooms.
SCUS-97324:
name: "Kiosk Demo Disc 2.11"
name: "Kiosk 2-11 Winter 2003" # Kiosk Demo Disc 2.11
region: "NTSC-U"
SCUS-97325:
name: "NBA Shootout 2004 [Demo]"
name: "NBA ShootOut 2004 [Demo]"
region: "NTSC-U"
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken player rendering and skin flashing.
@@ -11900,6 +11931,8 @@ SCUS-97362:
SCUS-97365:
name: "World Tour Soccer 2005"
region: "NTSC-U"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCUS-97366:
name: "SOCOM II - U.S. Navy SEALs [Public Beta v1.0]"
region: "NTSC-U"
@@ -11975,13 +12008,13 @@ SCUS-97381:
halfPixelOffset: 4 # Aligns post bloom.
nativeScaling: 1 # Fixes light blooms.
SCUS-97382:
name: "NBA Shootout 2004 [Demo]"
name: "NBA ShootOut 2004 [Demo]"
region: "NTSC-U"
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken player rendering and skin flashing.
cpuSpriteRenderLevel: 2 # Needed for above.
SCUS-97383:
name: "Kiosk Demo Disc 2.12"
name: "Kiosk 2-12 Spring 2004" # Kiosk Demo Disc 2.12
region: "NTSC-U"
SCUS-97384:
name: "Gran Turismo Special Edition 2004 Toyota [Demo]"
@@ -12003,6 +12036,8 @@ SCUS-97395:
SCUS-97396:
name: "World Tour Soccer 2005 [Demo]"
region: "NTSC-U"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
SCUS-97397:
name: "Syphon Filter - The Omega Strain"
region: "NTSC-U"
@@ -18851,7 +18886,7 @@ SLES-51879:
name: "Hot Wheels World Race"
region: "PAL-E"
SLES-51881:
name: "Mercedes Bens World Racing"
name: "World Racing"
region: "PAL-F-G"
SLES-51883:
name: "Scooby-Doo! Mystery Mayhem"
@@ -19962,6 +19997,10 @@ SLES-52342:
name: "Worms Forts - Under Siege"
region: "PAL-E-F"
compat: 5
gameFixes:
- BlitInternalFPSHack # Fixes internal FPS detection.
gsHWFixes:
PCRTCOverscan: 1 # Centers game output.
SLES-52343:
name: "Midway Arcade Treasures"
region: "PAL-E"
@@ -21160,6 +21199,10 @@ SLES-52733:
SLES-52734:
name: "Worms Forts - Under Siege"
region: "PAL-M5"
gameFixes:
- BlitInternalFPSHack # Fixes internal FPS detection.
gsHWFixes:
PCRTCOverscan: 1 # Centers game output.
SLES-52737:
name: "Obscure"
region: "PAL-E"
@@ -23260,6 +23303,8 @@ SLES-53458:
name: "Shin Megami Tensei - Digital Devil Saga"
region: "PAL-E"
compat: 5
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLES-53459:
name: "Marc Ecko's Getting Up - Contents Under Pressure"
region: "PAL-M5"
@@ -25472,10 +25517,13 @@ SLES-54138:
name: "Steambot Chronicles"
region: "PAL-E"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLES-54139:
name: "Earache - Extreme Metal Racing"
region: "PAL-E"
@@ -26130,10 +26178,13 @@ SLES-54335:
name: "Steambot Chronicles"
region: "PAL-F"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLES-54336:
name: "Lumines Plus"
region: "PAL-M5"
@@ -27011,8 +27062,13 @@ SLES-54587:
name: "Raw Danger"
region: "PAL-E"
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLES-54588:
name: "Brunswick Pro Bowling"
region: "PAL-E"
@@ -28238,6 +28294,8 @@ SLES-54971:
SLES-54972:
name: "Wild Arms 5"
region: "PAL-M3"
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -29750,9 +29808,6 @@ SLES-55415:
SLES-55418:
name: "Tube Mania"
region: "PAL-F-DU"
SLES-55421:
name: "Buzz! Brain of Switzerland"
region: "PAL-SWI"
SLES-55428:
name: "Disney Bolt"
region: "PAL-SC"
@@ -32371,6 +32426,8 @@ SLKA-25300:
compat: 5
gameFixes:
- EETimingHack
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLKA-25301:
name: "디지털 데빌 사가: 아바탈 튜너 2" # Undumped on ReDump as of 2025-08-28
name-en: "Digital Devil Saga - Avatar Tuner 2"
@@ -34353,7 +34410,7 @@ SLPM-55163:
SLPM-55164:
name: "Myself;Yourself [Yeti Best]"
name-sort: "まいせるふ ゆあせるふ [Yeti Best]"
name-en: "Myself, Yourself [Yeti Best]"
name-en: "Myself; Yourself [Yeti Best]"
region: "NTSC-J"
SLPM-55165:
name: "SuperLite 2000 アドベンチャー アオイシロ"
@@ -35669,28 +35726,39 @@ SLPM-60253:
name-en: "Zettai Zetsumei Toshi 2 - Itetsuita Kioutachi [Trial Type-B]"
region: "NTSC-J"
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPM-60254:
name: "絶体絶命都市2 -凍てついた記憶たち- [体験版l Type-A]"
name-sort: "ぜったいぜつめいとし2 -いてついたきおくたち- [たいけんばん Type-A]"
name-en: "Zettai Zetsumei Toshi 2 - Itetsuita Kioutachi [Trial Type-A]"
region: "NTSC-J"
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPM-60255:
name: "ポンコツ浪漫大活劇バンピートロット [体験版]"
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと [たいけんばん]"
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot [Trial]"
region: "NTSC-J"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPM-60256:
name: "電撃PS2 / 電撃PlayStation D73"
name-sort: "でんげき PS2 でんげきPlayStation D73"
@@ -35755,10 +35823,13 @@ SLPM-60266:
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot [Trial]"
region: "NTSC-J"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPM-60267:
name: "餓狼伝 Breakblow [体験版]"
name-sort: "がろうでん Breakblow [たいけんばん]"
@@ -35809,8 +35880,13 @@ SLPM-60273:
name-en: "Zettai Zetsumei Toshi 2 - Itetsuita Kioutachi [Trial Type-B]"
region: "NTSC-J"
gsHWFixes:
cpuCLUTRender: 1 # Fixes some shading/shadows.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPM-60274:
name: "フルハウスキス2 [体験版]"
name-sort: "ふるはうすきす2 [たいけんばん]"
@@ -37617,7 +37693,7 @@ SLPM-62188:
SLPM-62190:
name: "ハイヒートメジャーリーグベースボール 2003"
name-sort: "はいひーとめじゃーりーぐべーすぼーる 2003"
name-en: "High Heat - Major League Baseball 2003"
name-en: "High Heat Major League Baseball 2003"
region: "NTSC-J"
SLPM-62192:
name: "実況パワフルプロ野球 9"
@@ -44239,6 +44315,8 @@ SLPM-65597:
region: "NTSC-J"
gameFixes:
- EETimingHack
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLPM-65598:
name: "転生學園 幻蒼録"
name-sort: "てんしょうがくえん げんそうろく"
@@ -48985,6 +49063,8 @@ SLPM-66372:
region: "NTSC-J"
gameFixes:
- EETimingHack
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLPM-66373:
name: "DIGITAL DEVIL SAGA ~アバタール・チューナー2 [ATLUS BEST COLLECTION]"
name-sort: "でじたるでびるさーが あばたーるちゅーなー2 [ATLUS BEST COLLECTION]"
@@ -52219,12 +52299,12 @@ SLPM-66890:
SLPM-66891:
name: "Myself;Yourself [初回限定版]"
name-sort: "まいせるふ ゆあせるふ [しょかいげんていばん]"
name-en: "Myself, Yourself [First Limited Edition]"
name-en: "Myself; Yourself [First Limited Edition]"
region: "NTSC-J"
SLPM-66892:
name: "Myself;Yourself [通常版]"
name-sort: "まいせるふ ゆあせるふ [つうじょうばん]"
name-en: "Myself, Yourself [Standard Edition]"
name-en: "Myself; Yourself [Standard Edition]"
region: "NTSC-J"
SLPM-66893:
name: "ファイナルファンタジーⅪ ヴァナ・ディール コレクション [プレイオンライン]"
@@ -56348,6 +56428,13 @@ SLPS-20443:
region: "NTSC-J"
gsHWFixes:
recommendedBlendingLevel: 4 # Fixes water reflections.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-20444:
name: "SIMPLE2000シリーズ Vol.90 THE お姉チャンバラ2"
name-sort: "しんぷる2000しりーず Vol. 90 THE おねえちゃんばら2"
@@ -59031,7 +59118,7 @@ SLPS-25381:
SLPS-25382:
name: "ワンピース ランドランド!"
name-sort: "わんぴーす らんどらんど!"
name-en: "One Piece - Land Land"
name-en: "One Piece - Land Land!"
region: "NTSC-J"
SLPS-25383:
name: "デジモンバトルクロニクル"
@@ -59496,10 +59583,13 @@ SLPS-25457:
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot"
region: "NTSC-J"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25458:
name: "THE KING OF FIGHTERS 2001 [SNK BEST COLLECTION]"
name-sort: "ざ きんぐ おぶ ふぁいたーず2001 [SNK BEST COLLECTION]"
@@ -60159,8 +60249,13 @@ SLPS-25574:
name-en: "PachiPara 12 - Ooumi to Natsu no Omoide"
region: "NTSC-J"
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken minimap.
cpuSpriteRenderLevel: 1 # Needed for above.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25575:
name: "ケロロ軍曹 メロメロバトルロイヤルZ"
name-sort: "けろろぐんそう めろめろばとるろいやるZ"
@@ -60367,9 +60462,13 @@ SLPS-25606:
region: "NTSC-J"
compat: 5
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25607:
name: "魔界戦記ディスガイア2 [初回限定版]"
name-sort: "まかいせんきでぃすがいあ2 [しょかいげんていばん]"
@@ -60875,18 +60974,26 @@ SLPS-25682:
name-en: "PachiPara 13 - Super Umi to PachiPro Fu-unroku"
region: "NTSC-J"
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken minimap.
cpuSpriteRenderLevel: 1 # Needed for above.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25683:
name: "ポンコツ浪漫大活劇バンピートロット [Irem COLLECTION]"
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと [Irem COLLECTION]"
name-en: "Ponkotsu Roman Daikatsugeki Bumpy Trot [Irem Collection]"
region: "NTSC-J"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25684:
name: "マーメイドプリズム [限定版BOX]"
name-sort: "まーめいどぷりずむ [げんていばんBOX]"
@@ -61497,8 +61604,13 @@ SLPS-25787:
region: "NTSC-J"
compat: 5
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken minimap.
cpuSpriteRenderLevel: 1 # Needed for above.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25788:
name: "メタルスラッグ [SNK BEST COLLECTION]"
name-sort: "めたるすらっぐ [SNK BEST COLLECTION]"
@@ -61542,8 +61654,11 @@ SLPS-25795:
SLPS-25796:
name: "俺の下でAGAKE"
name-sort: "おれのしたであがけ"
name-en: "Ore no Shite Agake"
name-en: "Ore no Shita de Agake"
region: "NTSC-J"
gsHWFixes:
gpuTargetCLUT: 1 # Fixes incorrect rendering and some missing text.
cpuCLUTRender: 1 # Fixes the rest of the incorrect rendering and missing text.
SLPS-25797:
name: "一騎当千 Shining Dragon [限定爆裂パック]"
name-sort: "いっきとうせん Shining Dragon [げんていばくれつぱっく]"
@@ -61888,17 +62003,26 @@ SLPS-25851:
name-en: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku Tachi [Irem Collection]"
region: "NTSC-J"
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_ZettaiZetsumeiToshi2"
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25852:
name: "パチパラ13 ~スーパー海とパチプロ風雲録~ [Irem COLLECTION]"
name-sort: "ぱちぱら13 すーぱーうみとぱちぷろふううんろく [Irem COLLECTION]"
name-en: "PachiPara 13 - Super Umi to PachiPro Fu-unroku [Irem Collection]"
region: "NTSC-J"
gsHWFixes:
cpuSpriteRenderBW: 2 # Fixes broken minimap.
cpuSpriteRenderLevel: 1 # Needed for above.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLPS-25853:
name: "パチってちょんまげ達人14 ~ ぱちんこ仮面ライダー ショッカー全滅大作戦"
name-sort: "ぱちってちょんまげたつじん14 ~ ぱちんこかめんらいだー しょっかーぜんめつだいさくせん"
@@ -64131,7 +64255,7 @@ SLUS-20132:
region: "NTSC-U"
compat: 5
SLUS-20133:
name: "High Heat Baseball 2002"
name: "High Heat Major League Baseball 2002"
region: "NTSC-U"
SLUS-20134:
name: "Sky Odyssey"
@@ -64365,10 +64489,6 @@ SLUS-20182:
gsHWFixes:
halfPixelOffset: 4 # Aligns post effects.
autoFlush: 1 # Fixes ghosting.
SLUS-20183:
name: "Tiny Toon Adventures - Defenders of the Universe"
region: "NTSC-U"
compat: 5
SLUS-20184:
name: "Resident Evil - CODE Veronica X"
region: "NTSC-U"
@@ -64903,7 +65023,7 @@ SLUS-20297:
region: "NTSC-U"
compat: 5
SLUS-20298:
name: "High Heat - Major League Baseball 2003"
name: "High Heat Major League Baseball 2003"
region: "NTSC-U"
SLUS-20299:
name: "Street Hoops - King of the Court"
@@ -65682,9 +65802,6 @@ SLUS-20443:
name: "Rugrats - Royal Ransom"
region: "NTSC-U"
compat: 5
SLUS-20444:
name: "Tankers - Smoking Barrels"
region: "NTSC-U"
SLUS-20445:
name: "Robot Alchemic Drive - R.A.D."
region: "NTSC-U"
@@ -66541,7 +66658,7 @@ SLUS-20601:
gsHWFixes:
autoFlush: 1 # Fixes missing blur layer on reflections and surfaces.
SLUS-20602:
name: "High Heat - Major League Baseball 2004"
name: "High Heat Major League Baseball 2004"
region: "NTSC-U"
SLUS-20603:
name: "Mary-Kate & Ashley - Sweet Sixteen - Licensed to Drive"
@@ -66822,7 +66939,7 @@ SLUS-20657:
region: "NTSC-U"
compat: 5
SLUS-20658:
name: "Freedom Fighters - The Battle for Liberty Island"
name: "Freedom Fighters" # Originally Freedom The Battle for Liberty Island
region: "NTSC-U"
compat: 5
SLUS-20659:
@@ -67060,9 +67177,6 @@ SLUS-20698:
compat: 5
clampModes:
eeClampMode: 2 # Needed for SPS on some characters.
SLUS-20699:
name: "Cowboy Bebop"
region: "NTSC-U"
SLUS-20701:
name: "Scooby-Doo! Mystery Mayhem"
region: "NTSC-U"
@@ -67608,9 +67722,6 @@ SLUS-20797:
gsHWFixes:
halfPixelOffset: 4 # Fixes misaligned bloom.
autoFlush: 2 # Fixes sun occlusion and heat radiosity.
SLUS-20798:
name: "Starcraft - Ghost"
region: "NTSC-U"
SLUS-20799:
name: "Terminator 3 - Rise of the Machines"
region: "NTSC-U"
@@ -67673,9 +67784,6 @@ SLUS-20812:
name: "Dynasty Warriors 4 - Xtreme Legends"
region: "NTSC-U"
compat: 5
SLUS-20813:
name: "Plague of Darkness"
region: "NTSC-U"
SLUS-20814:
name: "Max Payne 2 - The Fall of Max Payne"
region: "NTSC-U"
@@ -68144,9 +68252,6 @@ SLUS-20896:
vuClampMode: 3 # Fixes lighting on character models as caves and other locations don't turn mobs into glow-in-the-dark creatures by themselves.
gsHWFixes:
maximumBlendingLevel: 0 # Fixes unnecessary load on the GPU.
SLUS-20897:
name: "Swords of Yi"
region: "NTSC-U"
SLUS-20898:
name: "Star Wars - Battlefront"
region: "NTSC-U"
@@ -68233,7 +68338,7 @@ SLUS-20911:
gsHWFixes:
halfPixelOffset: 4 # Fixes bilinear on lighting effects.
SLUS-20912:
name: "Superbikes TT"
name: "Suzuki TT Superbikes - Real Road Racing"
region: "NTSC-U"
compat: 5
SLUS-20913:
@@ -68643,6 +68748,8 @@ SLUS-20974:
name: "Shin Megami Tensei - Digital Devil Saga"
region: "NTSC-U"
compat: 5
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLUS-20975:
name: "One Piece - Grand Battle"
region: "NTSC-U"
@@ -69366,6 +69473,8 @@ SLUS-21093:
name: "Worms Forts - Under Siege"
region: "NTSC-U"
compat: 5
gameFixes:
- BlitInternalFPSHack # Fixes internal FPS detection.
SLUS-21094:
name: "Midway Arcade Treasures 3"
region: "NTSC-U"
@@ -71055,10 +71164,13 @@ SLUS-21344:
region: "NTSC-U"
compat: 5
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLUS-21345:
name: "Grandia III [Disc 2 of 2]"
region: "NTSC-U"
@@ -71934,9 +72046,6 @@ SLUS-21467:
compat: 5
gsHWFixes:
halfPixelOffset: 4 # Aligns post effects.
SLUS-21468:
name: "Charlie Brown's All-Stars [Cancelled]"
region: "NTSC-U"
SLUS-21469:
name: "Nicktoons - Battle for Volcano Island"
region: "NTSC-U"
@@ -72158,8 +72267,13 @@ SLUS-21501:
region: "NTSC-U"
compat: 5
gsHWFixes:
halfPixelOffset: 4 # Aligns post-processing.
nativeScaling: 2 # Fixes post effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLUS-21503:
name: "God Hand"
region: "NTSC-U"
@@ -72635,6 +72749,8 @@ SLUS-21615:
name: "Wild ARMs 5"
region: "NTSC-U"
compat: 5
clampModes:
vu1ClampMode: 3 # Fixes SPS on shell worm enemies.
gsHWFixes:
roundSprite: 1 # Fixes font sizes and lines in UI.
textureInsideRT: 1 # Fixes sepia-tone flashback sequences.
@@ -73855,7 +73971,7 @@ SLUS-21831:
region: "NTSC-U"
compat: 5
SLUS-21834:
name: "Goosebumps Horrorland - Happy Halloween"
name: "Goosebumps Horrorland"
region: "NTSC-U"
compat: 5
clampModes:
@@ -74553,7 +74669,7 @@ SLUS-28027:
name: "Black & Bruised [Trade Demo]"
region: "NTSC-U"
SLUS-28029:
name: "High Heat - Major League Baseball 2004 [Trade Demo]"
name: "High Heat Major League Baseball 2004 [Trade Demo]"
region: "NTSC-U"
SLUS-28031:
name: "Auto Modellista - Public Beta Volume 2.0"
@@ -74611,6 +74727,8 @@ SLUS-28046:
SLUS-28049:
name: "Shin Megami Tensei - Digital Devil Saga [Trade Demo]"
region: "NTSC-U"
gsHWFixes:
halfPixelOffset: 4 # Aligns shadows to prevent artefacts.
SLUS-28050:
name: "Stella Deus - The Gate of Eternity [Trade Demo]"
region: "NTSC-U"
@@ -74643,10 +74761,13 @@ SLUS-28061:
name: "Steambot Chronicles [Trade Demo]"
region: "NTSC-U"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLUS-28062:
name: "Dance Factory [Trade Demo]"
region: "NTSC-U"
@@ -74739,7 +74860,7 @@ SLUS-29017:
name: "AirBlade [Demo]"
region: "NTSC-U"
SLUS-29019:
name: "High Heat - Major League Baseball 2003 [Demo]"
name: "High Heat Major League Baseball 2003 [Demo]"
region: "NTSC-U"
SLUS-29020:
name: "Sky Gunner [Regular Demo]"
@@ -75414,10 +75535,13 @@ SLUS-29188:
name: "Steambot Chronicles [Regular Demo]"
region: "NTSC-U"
gsHWFixes:
getSkipCount: "GSC_SteambotChronicles" # Causes green (incorrect) water but removes depth and blur issues.
roundSprite: 1 # Fixes colored 3D anaglyph bleeding effects.
halfPixelOffset: 5 # Aligns effects.
getSkipCount: "GSC_IRem"
halfPixelOffset: 2 # Aligns effects.
nativeScaling: 1 # Helps align effects.
textureInsideRT: 1 # Fixes channel shuffles.
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
SLUS-29189:
name: "FIFA World Cup - Germany 2006 [Demo]"
region: "NTSC-U"
@@ -75493,12 +75617,6 @@ SLUS-29201:
halfPixelOffset: 2 # Fixes misaligned bloom and edge garbage.
nativeScaling: 1 # Fixes misaligned bloom.
mipmap: 0 # Currently totally breaks player uniform rendering if mipmapping is enabled.
SLUS-80421:
name: "Resident Evil 2 [Demo]"
region: "NTSC-U"
SLUS-90009:
name: "Resident Evil 2 [Trade Demo]"
region: "NTSC-U"
SLUS-97405:
name: "ATV Offroad Fury 3"
region: "NTSC-U"
@@ -75512,7 +75630,9 @@ TCES-10001:
region: "PAL-E"
TCES-51613:
name: "This Is Football 2004 Beta Trial Code"
region: "PAL-E-S"
region: "PAL-E"
gsHWFixes:
PCRTCOffsets: 1 # Fixes boot videos screen size.
TCES-51904:
name: "SOCOM II - U.S. Navy SEALs Beta Trial Code"
region: "PAL-M5"
+3 -2
View File
@@ -1,5 +1,5 @@
# Game Controller DB for SDL in 2.0.16 format
# Source: https://github.com/gabomdq/SDL_GameControllerDB
# Source: https://github.com/mdqinc/SDL_GameControllerDB
# Windows
03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,
@@ -253,7 +253,6 @@
03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f025000021c1000010010000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
@@ -1197,6 +1196,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
03000000c82d00000960000011010000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -1331,6 +1331,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000f025000021c1000010010000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000f0250000c283000010010000,Gioteck VX2 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux,
190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux,
Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

+2 -1
View File
@@ -80,6 +80,7 @@ PS_OUTPUT ps_downsample_copy(PS_INPUT input)
int DownsampleFactor = DOFFSET;
int2 ClampMin = int2(EMODA, EMODC);
float Weight = BGColor.x;
float step_multiplier = BGColor.y;
int2 coord = max(int2(input.p.xy) * DownsampleFactor, ClampMin);
@@ -88,7 +89,7 @@ PS_OUTPUT ps_downsample_copy(PS_INPUT input)
for (int yoff = 0; yoff < DownsampleFactor; yoff++)
{
for (int xoff = 0; xoff < DownsampleFactor; xoff++)
output.c += Texture.Load(int3(coord + int2(xoff, yoff), 0));
output.c += Texture.Load(int3(coord + int2(xoff * step_multiplier, yoff * step_multiplier), 0));
}
output.c /= Weight;
return output;
+26 -2
View File
@@ -175,8 +175,32 @@ float4 ps_main4(PS_INPUT input) : SV_Target0
// high motion -> interpolate pixels above and below
return (hn + ln) / 2.0f;
else
// low motion -> weave
return cn;
{
// Check if it's completely static first, we don't need to mess with any of that.
if((mh_max != -motion_thr.x) || (ml_max != -motion_thr.x) || (mc_max != -motion_thr.x))
{
// Check the diff with the above and below lines, if the difference is smaller between the new high and low lines
// compared to the new centre line and the high line (with some threshold of about 25 color steps), then reconstruct.
float3 mhln = hn.rgb - ln.rgb;
float3 mchn = hn.rgb - cn.rgb;
mhln = max(mhln, -mhln) - motion_thr;
mchn = max(mchn, -mchn) - motion_thr;
float mhln_max = max(max(mhln.x, mhln.y), mhln.z);
float mchn_max = max(max(mchn.x, mchn.y), mchn.z);
// The new centre line is a fair chunk different from those surrounding it, so quite likely incorrect.
if (mhln_max < 0.0f && mchn_max >= (mhln_max * 0.90f))
return (hn + ln) / 2.0f;
else
// low motion -> weave
return cn;
}
else
// low motion -> weave
return cn;
}
}
return float4(0.0f, 0.0f, 0.0f, 0.0f);
+1 -1
View File
@@ -1197,7 +1197,7 @@ PS_OUTPUT ps_main(PS_INPUT input)
#if !PS_NO_COLOR1
output.c1 = alpha_blend;
#endif
#if PS_AFAIL == 3 && !PS_NO_COLOR1 // RGB_ONLY, no dual src blend
#if PS_AFAIL == 3 && PS_NO_COLOR1 // RGB_ONLY, no dual src blend
if (!atst_pass)
{
float RTa = NEEDS_RT_FOR_AFAIL ? RtTexture.Load(int3(input.p.xy, 0)).a : 0.0f;
+2 -1
View File
@@ -70,6 +70,7 @@ void ps_depth_copy()
uniform ivec2 ClampMin;
uniform int DownsampleFactor;
uniform float Weight;
uniform float StepMultiplier;
void ps_downsample_copy()
{
@@ -78,7 +79,7 @@ void ps_downsample_copy()
for (int yoff = 0; yoff < DownsampleFactor; yoff++)
{
for (int xoff = 0; xoff < DownsampleFactor; xoff++)
result += texelFetch(TextureSampler, coord + ivec2(xoff, yoff), 0);
result += texelFetch(TextureSampler, coord + ivec2(xoff * StepMultiplier, yoff * StepMultiplier), 0);
}
SV_Target0 = result / Weight;
}
+26 -2
View File
@@ -173,8 +173,32 @@ void ps_main4()
// high motion -> interpolate pixels above and below
SV_Target0 = (hn + ln) / 2.0f;
else
// low motion -> weave
SV_Target0 = cn;
{
// Check if it's completely static first, we don't need to mess with any of that.
if((mh_max != -motion_thr.x) || (ml_max != -motion_thr.x) || (mc_max != -motion_thr.x))
{
// Check the diff with the above and below lines, if the difference is smaller between the new high and low lines
// compared to the new centre line and the high line (with some threshold of about 25 color steps), then reconstruct.
vec3 mhln = hn.rgb - ln.rgb;
vec3 mchn = hn.rgb - cn.rgb;
mhln = max(mhln, -mhln) - motion_thr;
mchn = max(mchn, -mchn) - motion_thr;
float mhln_max = max(max(mhln.x, mhln.y), mhln.z);
float mchn_max = max(max(mchn.x, mchn.y), mchn.z);
// The new centre line is a fair chunk different from those surrounding it, so quite likely incorrect.
if (mhln_max < 0.0f && mchn_max >= (mhln_max * 0.90f))
SV_Target0 = (hn + ln) / 2.0f;
else
// low motion -> weave
SV_Target0 = cn;
}
else
// low motion -> weave
SV_Target0 = cn;
}
}
}
+1 -1
View File
@@ -1134,7 +1134,7 @@ void ps_main()
#else
SV_Target0.rgb = C.rgb / 255.0f;
#endif
#if PS_AFAIL == 3 && !PS_NO_COLOR1 // RGB_ONLY, no dual src blend
#if PS_AFAIL == 3 && PS_NO_COLOR1 // RGB_ONLY, no dual src blend
if (!atst_pass)
SV_Target0.a = sample_from_rt().a;
#endif
+5 -2
View File
@@ -66,7 +66,8 @@ layout(push_constant) uniform cb10
int DownsampleFactor;
int pad0;
float Weight;
vec3 pad1;
float step_multiplier;
vec2 pad1;
};
void ps_downsample_copy()
{
@@ -75,7 +76,9 @@ void ps_downsample_copy()
for (int yoff = 0; yoff < DownsampleFactor; yoff++)
{
for (int xoff = 0; xoff < DownsampleFactor; xoff++)
result += texelFetch(samp0, coord + ivec2(xoff, yoff), 0);
{
result += texelFetch(samp0, coord + ivec2(xoff * step_multiplier, yoff * step_multiplier), 0);
}
}
o_col0 = result / Weight;
}
+26 -2
View File
@@ -194,8 +194,32 @@ void ps_main4()
// high motion -> interpolate pixels above and below
o_col0 = (hn + ln) / 2.0f;
else
// low motion -> weave
o_col0 = cn;
{
// Check if it's completely static first, we don't need to mess with any of that.
if((mh_max != -motion_thr.x) || (ml_max != -motion_thr.x) || (mc_max != -motion_thr.x))
{
// Check the diff with the above and below lines, if the difference is smaller between the new high and low lines
// compared to the new centre line and the high line (with some threshold of about 25 color steps), then reconstruct.
vec3 mhln = hn.rgb - ln.rgb;
vec3 mchn = hn.rgb - cn.rgb;
mhln = max(mhln, -mhln) - motion_thr;
mchn = max(mchn, -mchn) - motion_thr;
float mhln_max = max(max(mhln.x, mhln.y), mhln.z);
float mchn_max = max(max(mchn.x, mchn.y), mchn.z);
// The new centre line is a fair chunk different from those surrounding it, so quite likely incorrect.
if (mhln_max < 0.0f && mchn_max >= (mhln_max * 0.90f))
o_col0 = (hn + ln) / 2.0f;
else
// low motion -> weave
o_col0 = cn;
}
else
// low motion -> weave
o_col0 = cn;
}
}
}
#endif
+1 -1
View File
@@ -108,7 +108,7 @@ disable_compiler_warnings_for_target(speex)
# Find the Qt components that we need.
if(ENABLE_QT_UI)
find_package(Qt6 6.7.3 COMPONENTS CoreTools Core GuiTools Gui WidgetsTools Widgets LinguistTools REQUIRED)
find_package(Qt6 6.10.0 COMPONENTS CoreTools Core GuiTools Gui WidgetsTools Widgets LinguistTools REQUIRED)
endif()
if (Qt6_VERSION VERSION_GREATER_EQUAL 6.10.0)
+3 -2
View File
@@ -7,7 +7,6 @@ endif(NOT TOP_CMAKE_WAS_SOURCED)
add_library(common)
# x86emitter sources
target_sources(common PRIVATE
AlignedMalloc.cpp
Assertions.cpp
@@ -34,9 +33,9 @@ target_sources(common PRIVATE
Timer.cpp
WAVWriter.cpp
WindowInfo.cpp
YAML.cpp
)
# x86emitter headers
target_sources(common PRIVATE
AlignedMalloc.h
Assertions.h
@@ -81,6 +80,7 @@ target_sources(common PRIVATE
WAVWriter.h
WindowInfo.h
WrappedMemCopy.h
YAML.h
)
if(_M_X86)
@@ -208,6 +208,7 @@ target_link_libraries(common PRIVATE
target_link_libraries(common PUBLIC
fmt::fmt
fast_float
rapidyaml::rapidyaml
)
fixup_file_properties(common)
+1 -5
View File
@@ -15,10 +15,6 @@ namespace CocoaTools
void DestroyMetalLayer(WindowInfo* wi);
std::optional<float> GetViewRefreshRate(const WindowInfo& wi);
/// Add a handler to be run when macOS changes between dark and light themes
void AddThemeChangeHandler(void* ctx, void(handler)(void* ctx));
/// Remove a handler previously added using AddThemeChangeHandler with the given context
void RemoveThemeChangeHandler(void* ctx);
/// Mark an NSMenu as the help menu
void MarkHelpMenu(void* menu);
/// Returns the bundle path.
@@ -44,6 +40,6 @@ namespace CocoaTools
void RunCocoaEventLoop(bool wait_forever = false);
/// Posts an event to the main telling `RunCocoaEventLoop(true)` to exit
void StopMainThreadEventLoop();
}
} // namespace CocoaTools
#endif // __APPLE__
+1 -57
View File
@@ -85,63 +85,7 @@ std::optional<float> CocoaTools::GetViewRefreshRate(const WindowInfo& wi)
return ret;
}
// MARK: - Theme Change Handlers
@interface PCSX2KVOHelper : NSObject
- (void)addCallback:(void*)ctx run:(void(*)(void*))callback;
- (void)removeCallback:(void*)ctx;
@end
@implementation PCSX2KVOHelper
{
std::vector<std::pair<void*, void(*)(void*)>> _callbacks;
}
- (void)addCallback:(void*)ctx run:(void(*)(void*))callback
{
_callbacks.push_back(std::make_pair(ctx, callback));
}
- (void)removeCallback:(void*)ctx
{
auto new_end = std::remove_if(_callbacks.begin(), _callbacks.end(), [ctx](const auto& entry){
return ctx == entry.first;
});
_callbacks.erase(new_end, _callbacks.end());
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
for (const auto& callback : _callbacks)
callback.second(callback.first);
}
@end
static PCSX2KVOHelper* s_themeChangeHandler;
void CocoaTools::AddThemeChangeHandler(void* ctx, void(handler)(void* ctx))
{
assert([NSThread isMainThread]);
if (!s_themeChangeHandler)
{
s_themeChangeHandler = [[PCSX2KVOHelper alloc] init];
NSApplication* app = [NSApplication sharedApplication];
[app addObserver:s_themeChangeHandler
forKeyPath:@"effectiveAppearance"
options:0
context:nil];
}
[s_themeChangeHandler addCallback:ctx run:handler];
}
void CocoaTools::RemoveThemeChangeHandler(void* ctx)
{
assert([NSThread isMainThread]);
[s_themeChangeHandler removeCallback:ctx];
}
// MARK: - Help menu
void CocoaTools::MarkHelpMenu(void* menu)
{
+16 -1
View File
@@ -85,7 +85,7 @@ static inline bool FileSystemCharacterIsSane(char32_t c, bool strip_slashes)
if (c == '*')
return false;
// macos doesn't allow colons, apparently
// macos doesn't allow colons, apparently
#ifdef __APPLE__
if (c == U':')
return false;
@@ -2490,6 +2490,21 @@ bool FileSystem::DeleteDirectory(const char* path)
return (rmdir(path) == 0);
}
std::string FileSystem::GetPackagePath()
{
// NOTE: The reason this function is separated from FileSystem::GetProgramPath() is because
// This path check breaks other usages of FileSystem::GetProgramPath for the AppImage.
// Notably the CI-generated AppImage fails to start because PCSX2 can't find its resources
// since it tries to look for them relative to the .AppImage file instead of relative to the actual executable.
// Check if we are running inside appimage. If so, return the path to the appimage instead.
if (const char* appimage_path = getenv("APPIMAGE"))
return std::string(appimage_path);
// Otherwise, find the executable file directly
return GetProgramPath();
}
std::string FileSystem::GetProgramPath()
{
#if defined(__linux__)
+3
View File
@@ -166,6 +166,9 @@ namespace FileSystem
/// Copies one file to another, optionally replacing it if it already exists.
bool CopyFilePath(const char* source, const char* destination, bool replace);
/// Returns the path to the current package (AppImage).
std::string GetPackagePath();
/// Returns the path to the current executable.
std::string GetProgramPath();
+3 -41
View File
@@ -100,54 +100,16 @@ void Common::SetMousePosition(int x, int y)
SetCursorPos(x, y);
}
/*
static HHOOK mouseHook = nullptr;
static std::function<void(int, int)> fnMouseMoveCb;
LRESULT CALLBACK Mousecb(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0 && wParam == WM_MOUSEMOVE)
{
MSLLHOOKSTRUCT* mouse = (MSLLHOOKSTRUCT*)lParam;
fnMouseMoveCb(mouse->pt.x, mouse->pt.y);
}
return CallNextHookEx(mouseHook, nCode, wParam, lParam);
}
*/
// This (and the above) works, but is not recommended on Windows and is only here for consistency.
// Defer to using raw input instead.
bool Common::AttachMousePositionCb(std::function<void(int, int)> cb)
{
/*
if (mouseHook)
Common::DetachMousePositionCb();
fnMouseMoveCb = cb;
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, Mousecb, GetModuleHandle(NULL), 0);
if (!mouseHook)
{
Console.Warning("Failed to set mouse hook: %d", GetLastError());
return false;
}
#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD)
static bool warned = false;
if (!warned)
{
Console.Warning("Mouse hooks are enabled, and this isn't a release build! Using a debugger, or loading symbols, _will_ stall the hook and cause global mouse lag.");
warned = true;
}
#endif
*/
// We use raw input messages which are handled by the windows message loop.
// The alternative is to use a low-level mouse hook, but this passes Windows all mouse messages to PCSX2.
// If PCSX2 hangs, or you attach a debugger, the mouse will stop working system-wide.
return true;
}
void Common::DetachMousePositionCb()
{
/*
UnhookWindowsHookEx(mouseHook);
mouseHook = nullptr;
*/
}
bool Common::PlaySoundAsync(const char* path)
+43
View File
@@ -0,0 +1,43 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "YAML.h"
#include <csetjmp>
#include <cstdlib>
struct RapidYAMLContext
{
std::jmp_buf env;
Error* error = nullptr;
};
std::optional<ryml::Tree> ParseYAMLFromString(ryml::csubstr yaml, ryml::csubstr file_name, Error* error)
{
RapidYAMLContext context;
context.error = error;
ryml::Callbacks callbacks;
callbacks.m_user_data = static_cast<void*>(&context);
callbacks.m_error = [](const char* msg, size_t msg_len, ryml::Location location, void* user_data) {
RapidYAMLContext* context = static_cast<RapidYAMLContext*>(user_data);
Error::SetString(context->error, std::string(msg, msg_len));
std::longjmp(context->env, 1);
};
ryml::EventHandlerTree event_handler(callbacks);
ryml::Parser parser(&event_handler);
ryml::Tree tree;
// The only options RapidYAML provides for recovering from errors are
// throwing an exception or using setjmp/longjmp. Since we have exceptions
// disabled we have to use the latter option.
if (setjmp(context.env))
return std::nullopt;
ryml::parse_in_arena(&parser, file_name, yaml, &tree);
return tree;
}
+18
View File
@@ -0,0 +1,18 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#pragma once
#include "Error.h"
#include "ryml_std.hpp"
#include "ryml.hpp"
#include "ryml.hpp"
#include <optional>
/// Parse a YAML file with RapidYAML, and use setjmp/longjmp to recover from
/// parsing errors (as is recommended by the documentation for cases where
/// exceptions are disabled). The file_name parameter is only used for error
/// messages, which are returned via the error parameter.
std::optional<ryml::Tree> ParseYAMLFromString(ryml::csubstr yaml, ryml::csubstr file_name, Error* error);
+4
View File
@@ -36,10 +36,12 @@
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fast_float\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fmt\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\jpgd</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\rapidyaml\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<ForcedIncludeFiles>PrecompiledHeader.h</ForcedIncludeFiles>
<PrecompiledHeaderFile>PrecompiledHeader.h</PrecompiledHeaderFile>
<ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>
<PreprocessorDefinitions>C4_NO_DEBUG_BREAK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
@@ -71,6 +73,7 @@
<ClCompile Include="Timer.cpp" />
<ClCompile Include="WAVWriter.cpp" />
<ClCompile Include="WindowInfo.cpp" />
<ClCompile Include="YAML.cpp" />
<ClCompile Include="Perf.cpp" />
<ClCompile Include="PrecompiledHeader.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
@@ -157,6 +160,7 @@
<ClInclude Include="Timer.h" />
<ClInclude Include="WAVWriter.h" />
<ClInclude Include="WindowInfo.h" />
<ClInclude Include="YAML.h" />
<ClInclude Include="Threading.h" />
<ClInclude Include="emitter\implement\avx.h" />
<ClInclude Include="emitter\implement\bmi.h" />
+7 -1
View File
@@ -127,6 +127,9 @@
<ClCompile Include="SmallString.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="YAML.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="AlignedMalloc.h">
@@ -335,6 +338,9 @@
</ClInclude>
<ClInclude Include="SingleRegisterTypes.h" />
<ClInclude Include="FPControl.h" />
<ClInclude Include="YAML.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="Source Files">
@@ -349,4 +355,4 @@
<Filter>Source Files</Filter>
</MASM>
</ItemGroup>
</Project>
</Project>
+65 -36
View File
@@ -59,6 +59,7 @@ namespace GSRunner
{
static void InitializeConsole();
static bool InitializeConfig();
static void SettingsOverride();
static bool ParseCommandLineArgs(int argc, char* argv[], VMBootParameters& params);
static void DumpStats();
@@ -119,42 +120,6 @@ bool GSRunner::InitializeConfig()
VMManager::SetDefaultSettings(si, true, true, true, true, true);
// complete as quickly as possible
si.SetBoolValue("EmuCore/GS", "FrameLimitEnable", false);
si.SetIntValue("EmuCore/GS", "VsyncEnable", false);
// Force screenshot quality settings to something more performant, overriding any defaults good for users.
si.SetIntValue("EmuCore/GS", "ScreenshotFormat", static_cast<int>(GSScreenshotFormat::PNG));
si.SetIntValue("EmuCore/GS", "ScreenshotQuality", 10);
// ensure all input sources are disabled, we're not using them
si.SetBoolValue("InputSources", "SDL", false);
si.SetBoolValue("InputSources", "XInput", false);
// we don't need any sound output
si.SetStringValue("SPU2/Output", "OutputModule", "nullout");
// none of the bindings are going to resolve to anything
Pad::ClearPortBindings(si, 0);
si.ClearSection("Hotkeys");
// force logging
si.SetBoolValue("Logging", "EnableSystemConsole", !s_no_console);
si.SetBoolValue("Logging", "EnableTimestamps", true);
si.SetBoolValue("Logging", "EnableVerbose", true);
// and show some stats :)
si.SetBoolValue("EmuCore/GS", "OsdShowFPS", true);
si.SetBoolValue("EmuCore/GS", "OsdShowResolution", true);
si.SetBoolValue("EmuCore/GS", "OsdShowGSStats", true);
// remove memory cards, so we don't have sharing violations
for (u32 i = 0; i < 2; i++)
{
si.SetBoolValue("MemoryCards", fmt::format("Slot{}_Enable", i + 1).c_str(), false);
si.SetStringValue("MemoryCards", fmt::format("Slot{}_Filename", i + 1).c_str(), "");
}
VMManager::Internal::LoadStartupSettings();
return true;
}
@@ -709,6 +674,28 @@ bool GSRunner::ParseCommandLineArgs(int argc, char* argv[], VMBootParameters& pa
continue;
}
else if (CHECK_ARG_PARAM("-ini"))
{
std::string path = std::string(StringUtil::StripWhitespace(argv[++i]));
if (!FileSystem::FileExists(path.c_str()))
{
Console.ErrorFmt("INI file {} does not exit.", path);
return false;
}
INISettingsInterface si_ini(path);
if (!si_ini.Load())
{
Console.ErrorFmt("Unable to load INI settings from {}.", path);
return false;
}
for (const auto& [key, value] : si_ini.GetKeyValueList("EmuCore/GS"))
s_settings_interface.SetStringValue("EmuCore/GS", key.c_str(), value.c_str());
continue;
}
else if (CHECK_ARG_PARAM("-upscale"))
{
const float upscale = StringUtil::FromChars<float>(argv[++i]).value_or(0.0f);
@@ -813,6 +800,45 @@ bool GSRunner::ParseCommandLineArgs(int argc, char* argv[], VMBootParameters& pa
return true;
}
void GSRunner::SettingsOverride()
{
// complete as quickly as possible
s_settings_interface.SetBoolValue("EmuCore/GS", "FrameLimitEnable", false);
s_settings_interface.SetIntValue("EmuCore/GS", "VsyncEnable", false);
// Force screenshot quality settings to something more performant, overriding any defaults good for users.
s_settings_interface.SetIntValue("EmuCore/GS", "ScreenshotFormat", static_cast<int>(GSScreenshotFormat::PNG));
s_settings_interface.SetIntValue("EmuCore/GS", "ScreenshotQuality", 10);
// ensure all input sources are disabled, we're not using them
s_settings_interface.SetBoolValue("InputSources", "SDL", false);
s_settings_interface.SetBoolValue("InputSources", "XInput", false);
// we don't need any sound output
s_settings_interface.SetStringValue("SPU2/Output", "OutputModule", "nullout");
// none of the bindings are going to resolve to anything
Pad::ClearPortBindings(s_settings_interface, 0);
s_settings_interface.ClearSection("Hotkeys");
// force logging
s_settings_interface.SetBoolValue("Logging", "EnableSystemConsole", !s_no_console);
s_settings_interface.SetBoolValue("Logging", "EnableTimestamps", true);
s_settings_interface.SetBoolValue("Logging", "EnableVerbose", true);
// and show some stats :)
s_settings_interface.SetBoolValue("EmuCore/GS", "OsdShowFPS", true);
s_settings_interface.SetBoolValue("EmuCore/GS", "OsdShowResolution", true);
s_settings_interface.SetBoolValue("EmuCore/GS", "OsdShowGSStats", true);
// remove memory cards, so we don't have sharing violations
for (u32 i = 0; i < 2; i++)
{
s_settings_interface.SetBoolValue("MemoryCards", fmt::format("Slot{}_Enable", i + 1).c_str(), false);
s_settings_interface.SetStringValue("MemoryCards", fmt::format("Slot{}_Filename", i + 1).c_str(), "");
}
}
void GSRunner::DumpStats()
{
std::atomic_thread_fence(std::memory_order_acquire);
@@ -871,6 +897,9 @@ int main(int argc, char* argv[])
return EXIT_FAILURE;
}
// Override settings that shouldn't be picked up from defaults or INIs.
GSRunner::SettingsOverride();
// apply new settings (e.g. pick up renderer change)
VMManager::ApplySettings();
GSDumpReplayer::SetIsDumpRunner(true);
+6
View File
@@ -81,6 +81,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -115,6 +118,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
+8 -2
View File
@@ -3,7 +3,7 @@
<class>AutoUpdaterDialog</class>
<widget class="QDialog" name="AutoUpdaterDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
<enum>Qt::WindowModality::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
@@ -91,7 +91,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -132,6 +132,12 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>updateNotes</tabstop>
<tabstop>downloadAndInstall</tabstop>
<tabstop>skipThisUpdate</tabstop>
<tabstop>remindMeLater</tabstop>
</tabstops>
<resources>
<include location="resources/resources.qrc"/>
</resources>
+8
View File
@@ -264,6 +264,14 @@ target_sources(pcsx2-qt PRIVATE
resources/resources.qrc
)
if (NOT APPLE)
target_sources(pcsx2-qt PRIVATE
ShortcutCreationDialog.cpp
ShortcutCreationDialog.h
ShortcutCreationDialog.ui
)
endif()
file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Translations/*.ts)
target_precompile_headers(pcsx2-qt PRIVATE PrecompiledHeader.h)
+25 -1
View File
@@ -28,7 +28,7 @@
<pixmap resource="resources/resources.qrc">:/icons/black/svg/artboard-2-line.svg</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
</widget>
</item>
@@ -40,6 +40,12 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>label</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -52,6 +58,12 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>urls</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -65,6 +77,12 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>useTitleFileNames</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -110,6 +128,12 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>urls</tabstop>
<tabstop>useTitleFileNames</tabstop>
<tabstop>start</tabstop>
<tabstop>close</tabstop>
</tabstops>
<resources>
<include location="resources/resources.qrc"/>
</resources>
+12 -3
View File
@@ -34,6 +34,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -45,10 +48,10 @@
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
@@ -80,7 +83,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -108,6 +111,12 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>scrollArea</tabstop>
<tabstop>closeCheckBox</tabstop>
<tabstop>analyseButton</tabstop>
<tabstop>closeButton</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -3,7 +3,7 @@
<class>BreakpointDialog</class>
<widget class="QDialog" name="BreakpointDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
<enum>Qt::WindowModality::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
@@ -56,10 +56,10 @@
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
<widget class="QGroupBox" name="grpType">
@@ -111,13 +111,16 @@
</property>
<layout class="QFormLayout" name="formLayout">
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Address</string>
</property>
<property name="buddy">
<cstring>txtAddress</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -147,6 +150,9 @@
<property name="text">
<string>Description</string>
</property>
<property name="buddy">
<cstring>txtDescription</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -221,6 +227,9 @@
<property name="text">
<string>Size</string>
</property>
<property name="buddy">
<cstring>txtSize</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -264,6 +273,9 @@
<property name="text">
<string>Condition</string>
</property>
<property name="buddy">
<cstring>txtCondition</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -310,6 +322,19 @@
</layout>
</widget>
</widget>
<tabstops>
<tabstop>rdoMemory</tabstop>
<tabstop>rdoExecute</tabstop>
<tabstop>txtAddress</tabstop>
<tabstop>txtDescription</tabstop>
<tabstop>chkLog</tabstop>
<tabstop>chkEnable</tabstop>
<tabstop>chkRead</tabstop>
<tabstop>chkWrite</tabstop>
<tabstop>chkChange</tabstop>
<tabstop>txtSize</tabstop>
<tabstop>txtCondition</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
+14
View File
@@ -238,6 +238,12 @@ int DebuggerWindow::fontSize()
void DebuggerWindow::updateTheme()
{
// Detect recursive StyleChange events caused by updating the stylesheet.
if (m_is_updating_theme)
return;
m_is_updating_theme = true;
// TODO: Migrate away from stylesheets to improve performance.
setStyleSheet(QString("font-size: %1pt;").arg(m_font_size));
@@ -248,6 +254,8 @@ void DebuggerWindow::updateTheme()
setStyleSheet(QString());
dockManager().updateTheme();
m_is_updating_theme = false;
}
void DebuggerWindow::saveWindowGeometry()
@@ -535,6 +543,12 @@ void DebuggerWindow::onStepOut()
this->repaint();
}
void DebuggerWindow::changeEvent(QEvent* event)
{
if (event->type() == QEvent::PaletteChange || event->type() == QEvent::StyleChange)
updateTheme();
}
void DebuggerWindow::closeEvent(QCloseEvent* event)
{
dockManager().saveCurrentLayout();
+4 -1
View File
@@ -60,7 +60,8 @@ Q_SIGNALS:
void onVMActuallyPaused();
protected:
void closeEvent(QCloseEvent* event);
void changeEvent(QEvent* event) override;
void closeEvent(QCloseEvent* event) override;
private:
DebugInterface* currentCPU();
@@ -75,6 +76,8 @@ private:
int m_font_size;
static const constexpr int MINIMUM_FONT_SIZE = 5;
static const constexpr int MAXIMUM_FONT_SIZE = 30;
bool m_is_updating_theme = false;
};
extern DebuggerWindow* g_debugger_window;
+1 -1
View File
@@ -939,7 +939,7 @@ inline QString DisassemblyView::DisassemblyStringFromAddress(u32 address, QFont
QColor DisassemblyView::GetAddressFunctionColor(u32 address)
{
std::array<QColor, 6> colors;
if (QtUtils::IsLightTheme(palette()))
if (!QtHost::IsDarkApplicationTheme())
{
colors = {
QColor::fromRgba(0xFFFA3434),
@@ -305,7 +305,6 @@ QSize DockMenuBarStyle::sizeFromContents(
{
QSize size = QProxyStyle::sizeFromContents(type, option, contents_size, widget);
#ifdef Q_OS_WIN32
// Adjust the sizes of the layout switcher tabs depending on the theme.
if (type == CT_TabBarTab)
{
@@ -336,7 +335,6 @@ QSize DockMenuBarStyle::sizeFromContents(
size.setWidth(size.height());
}
}
#endif
return size;
}
-7
View File
@@ -145,15 +145,8 @@ DockTabBar::DockTabBar(KDDockWidgets::Core::TabBar* controller, QWidget* parent)
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &DockTabBar::customContextMenuRequested, this, &DockTabBar::openContextMenu);
// The constructor of KDDockWidgets::QtWidgets::TabBar makes a QProxyStyle
// that ends up taking ownerhsip of the style for the entire application!
if (QProxyStyle* proxy_style = qobject_cast<QProxyStyle*>(style()))
{
if (proxy_style->baseStyle() == qApp->style())
proxy_style->baseStyle()->setParent(qApp);
proxy_style->setBaseStyle(QStyleFactory::create(qApp->style()->name()));
}
}
void DockTabBar::openContextMenu(QPoint pos)
+3 -2
View File
@@ -3,6 +3,7 @@
#include "DropIndicators.h"
#include "QtHost.h"
#include "QtUtils.h"
#include "Debugger/Docking/DockViews.h"
@@ -21,7 +22,7 @@ static std::pair<QColor, QColor> pickNiceColours(const QPalette& palette, bool h
QColor fill = palette.highlight().color();
QColor outline = palette.highlight().color();
if (QtUtils::IsLightTheme(palette))
if (!QtHost::IsDarkApplicationTheme())
{
fill = fill.darker(200);
outline = outline.darker(200);
@@ -197,7 +198,7 @@ static const constexpr int INDICATOR_MARGIN = 10;
static bool isWayland()
{
return KDDockWidgets::Core::Platform::instance()->displayType() ==
KDDockWidgets::Core::Platform::DisplayType::Wayland;
KDDockWidgets::Core::Platform::DisplayType::Wayland;
}
static QWidget* parentForIndicatorWindow(KDDockWidgets::Core::ClassicDropIndicatorOverlay* classic_indicators)
@@ -21,6 +21,9 @@
<property name="text">
<string>Name</string>
</property>
<property name="buddy">
<cstring>nameEditor</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
@@ -28,6 +31,9 @@
<property name="text">
<string>Target</string>
</property>
<property name="buddy">
<cstring>cpuEditor</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
@@ -35,6 +41,9 @@
<property name="text">
<string>Initial State</string>
</property>
<property name="buddy">
<cstring>initialStateEditor</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -66,10 +75,10 @@
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
@@ -77,6 +86,11 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>nameEditor</tabstop>
<tabstop>cpuEditor</tabstop>
<tabstop>initialStateEditor</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
+11 -5
View File
@@ -20,7 +20,7 @@
<item>
<spacer name="topSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -36,7 +36,10 @@
<string>There are no layouts.</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="buddy">
<cstring>createDefaultLayoutsButton</cstring>
</property>
</widget>
</item>
@@ -45,7 +48,7 @@
<item>
<spacer name="leftSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -65,7 +68,7 @@
<item>
<spacer name="rightSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -80,7 +83,7 @@
<item>
<spacer name="bottomSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -92,6 +95,9 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>createDefaultLayoutsButton</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+31 -2
View File
@@ -21,6 +21,9 @@
<property name="text">
<string>Value</string>
</property>
<property name="buddy">
<cstring>txtSearchValue</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -31,6 +34,9 @@
<property name="text">
<string>Type</string>
</property>
<property name="buddy">
<cstring>cmbSearchType</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -82,6 +88,9 @@
<property name="text">
<string>Hex</string>
</property>
<property name="buddy">
<cstring>chkSearchHex</cstring>
</property>
</widget>
</item>
<item row="2" column="3">
@@ -155,20 +164,26 @@
<property name="text">
<string>Comparison</string>
</property>
<property name="buddy">
<cstring>cmbSearchComparison</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0" alignment="Qt::AlignLeft">
<item row="0" column="0" alignment="Qt::AlignmentFlag::AlignLeft">
<widget class="QLabel" name="startLabel">
<property name="text">
<string>Start</string>
</property>
<property name="buddy">
<cstring>txtSearchStart</cstring>
</property>
</widget>
</item>
<item row="0" column="1" alignment="Qt::AlignLeft">
<item row="0" column="1" alignment="Qt::AlignmentFlag::AlignLeft">
<widget class="QLineEdit" name="txtSearchStart">
<property name="text">
<string notr="true">0x00</string>
@@ -180,6 +195,9 @@
<property name="text">
<string>End</string>
</property>
<property name="buddy">
<cstring>txtSearchEnd</cstring>
</property>
</widget>
</item>
<item row="0" column="3">
@@ -206,6 +224,17 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>txtSearchValue</tabstop>
<tabstop>cmbSearchComparison</tabstop>
<tabstop>cmbSearchType</tabstop>
<tabstop>chkSearchHex</tabstop>
<tabstop>txtSearchStart</tabstop>
<tabstop>txtSearchEnd</tabstop>
<tabstop>btnSearch</tabstop>
<tabstop>btnFilterSearch</tabstop>
<tabstop>listSearchResults</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -114,12 +114,30 @@ QWidget* SymbolTreeValueDelegate::createEditor(QWidget* parent, const QStyleOpti
const ccc::ast::Enum& enumeration = type.as<ccc::ast::Enum>();
QComboBox* combo_box = new QComboBox(parent);
for (s32 i = 0; i < (s32)enumeration.constants.size(); i++)
bool named = false;
for (size_t i = 0; i < enumeration.constants.size(); i++)
{
combo_box->addItem(QString::fromStdString(enumeration.constants[i].second));
QString text = QString::fromStdString(enumeration.constants[i].second);
combo_box->addItem(text, enumeration.constants[i].first);
if (enumeration.constants[i].first == value.toInt())
combo_box->setCurrentIndex(i);
{
combo_box->setCurrentIndex(static_cast<int>(i));
named = true;
}
}
if (!named)
{
// The value isn't equal to any of the named constants, so
// add an extra item to the combo box representing the
// current value so that the first named constant isn't
// written back to VM memory accidentally.
QString text = display_options.signedIntegerToString(value.toInt(), 32);
combo_box->insertItem(0, text, value.toInt());
combo_box->setCurrentIndex(0);
}
connect(combo_box, &QComboBox::currentIndexChanged, this, &SymbolTreeValueDelegate::onComboBoxIndexChanged);
result = combo_box;
@@ -245,15 +263,10 @@ void SymbolTreeValueDelegate::setModelData(QWidget* editor, QAbstractItemModel*
}
case ccc::ast::ENUM:
{
const ccc::ast::Enum& enumeration = type.as<ccc::ast::Enum>();
QComboBox* combo_box = qobject_cast<QComboBox*>(editor);
Q_ASSERT(combo_box);
s32 comboIndex = combo_box->currentIndex();
if (comboIndex < 0 || comboIndex >= (s32)enumeration.constants.size())
break;
value = enumeration.constants[comboIndex].first;
value = combo_box->currentData().toInt();
break;
}
@@ -390,15 +390,13 @@ QString SymbolTreeNode::generateDisplayString(
}
case ccc::ast::ENUM:
{
s32 value = (s32)location.read32(cpu);
s32 value = static_cast<s32>(location.read32(cpu));
const auto& enum_type = physical_type.as<ccc::ast::Enum>();
for (auto [test_value, name] : enum_type.constants)
{
for (const auto& [test_value, name] : enum_type.constants)
if (test_value == value)
return QString::fromStdString(name);
}
break;
return display_options.signedIntegerToString(value, 32);
}
case ccc::ast::POINTER_OR_REFERENCE:
{
+12 -8
View File
@@ -14,7 +14,7 @@
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -30,7 +30,7 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;No games in supported formats were found.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Please add a directory with games to begin.&lt;/p&gt;&lt;p&gt;Game dumps in the following formats will be scanned and listed:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -40,7 +40,7 @@
<string notr="true">TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -49,7 +49,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -69,7 +69,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -86,7 +86,7 @@
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -106,7 +106,7 @@
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -121,7 +121,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -133,6 +133,10 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>addGameDirectory</tabstop>
<tabstop>scanForNewGames</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+85 -131
View File
@@ -23,19 +23,25 @@ static constexpr std::array<const char*, GameListModel::Column_Count> s_column_n
static constexpr int COVER_ART_WIDTH = 350;
static constexpr int COVER_ART_HEIGHT = 512;
static constexpr int COVER_ART_SPACING = 32;
// Scaling these is not a linear transform due to float conversions; add them together here.
static constexpr int SIZE_HINT_WIDTH = COVER_ART_WIDTH + (COVER_ART_SPACING / 2);
static constexpr int SIZE_HINT_HEIGHT = COVER_ART_HEIGHT + (COVER_ART_SPACING / 2);
static constexpr int SIZE_HINT_HEIGHT_TITLES = SIZE_HINT_HEIGHT + COVER_ART_SPACING;
static constexpr int MIN_COVER_CACHE_SIZE = 256;
static int DPRScale(int size, qreal dpr)
static int DPRScale(const int size, const qreal dpr)
{
return static_cast<int>(static_cast<qreal>(size) * dpr);
}
static int DPRUnscale(int size, qreal dpr)
static int DPRUnscale(const int size, const qreal dpr)
{
return static_cast<int>(static_cast<qreal>(size) / dpr);
}
static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_height, qreal dpr)
static void resizeAndPadPixmap(QPixmap* pm, const int expected_width, const int expected_height, const qreal dpr)
{
const int dpr_expected_width = DPRScale(expected_width, dpr);
const int dpr_expected_height = DPRScale(expected_height, dpr);
@@ -70,8 +76,8 @@ static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_hei
*pm = padded_image;
}
static QPixmap createPlaceholderImage(const QPixmap& placeholder_pixmap, int width, int height, float scale,
qreal dpr, const std::string& title)
static QPixmap createPlaceholderImage(const QPixmap& placeholder_pixmap, const int width, const int height,
const float scale, const qreal dpr, const std::string& title)
{
QPixmap pm(placeholder_pixmap.copy());
pm.setDevicePixelRatio(dpr);
@@ -96,9 +102,9 @@ static QPixmap createPlaceholderImage(const QPixmap& placeholder_pixmap, int wid
return pm;
}
std::optional<GameListModel::Column> GameListModel::getColumnIdForName(std::string_view name)
std::optional<GameListModel::Column> GameListModel::getColumnIdForName(const std::string_view name)
{
for (int column = 0; column < Column_Count; column++)
for (u32 column = 0; column < Column_Count; column++)
{
if (name == s_column_names[column])
return static_cast<Column>(column);
@@ -107,12 +113,12 @@ std::optional<GameListModel::Column> GameListModel::getColumnIdForName(std::stri
return std::nullopt;
}
const char* GameListModel::getColumnName(Column col)
const char* GameListModel::getColumnName(const Column col)
{
return s_column_names[static_cast<int>(col)];
}
GameListModel::GameListModel(float cover_scale, bool show_cover_titles, qreal dpr, QObject* parent /* = nullptr */)
GameListModel::GameListModel(const float cover_scale, const bool show_cover_titles, const qreal dpr, QObject* parent /* = nullptr */)
: QAbstractTableModel(parent)
, m_show_titles_for_covers(show_cover_titles)
, m_dpr{dpr}
@@ -175,29 +181,31 @@ void GameListModel::loadOrGenerateCover(const GameList::Entry* ge)
QFuture<QPixmap> future = QtConcurrent::run([this, entry = *ge, counter]() -> QPixmap {
QPixmap image;
// Initial check that the scale is unchanged before we run costly image generation.
if (m_cover_scale_counter.load(std::memory_order_acquire) == counter)
{
const std::string cover_path(GameList::GetCoverImagePathForEntry(&entry));
if (!cover_path.empty())
{
image = QPixmap(QString::fromStdString(cover_path));
if (!image.isNull())
{
image.setDevicePixelRatio(m_dpr);
resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), m_dpr);
}
// Create placeholder image if no user-provided cover exists.
if (image.isNull())
{
const std::string& title = entry.GetTitle(m_prefer_english_titles);
image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, m_dpr, title);
}
// Create resized image from user-provided cover.
else
{
image.setDevicePixelRatio(m_dpr);
resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), m_dpr);
}
}
const std::string& title = entry.GetTitle(m_prefer_english_titles);
// Final check that scale is unchanged before we send out the produced image.
return m_cover_scale_counter.load(std::memory_order_acquire) == counter ? image : QPixmap();
if (image.isNull())
image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, m_dpr, title);
if (m_cover_scale_counter.load(std::memory_order_acquire) != counter)
image = {};
return image;
});
// Context must be 'this' so we run on the UI thread.
@@ -213,25 +221,18 @@ void GameListModel::loadOrGenerateCover(const GameList::Entry* ge)
void GameListModel::invalidateCoverForPath(const std::string& path)
{
// This isn't ideal, but not sure how else we can get the row, when it might change while scanning...
auto lock = GameList::GetLock();
const auto lock = GameList::GetLock();
const u32 count = GameList::GetEntryCount();
std::optional<u32> row;
for (u32 i = 0; i < count; i++)
for (u32 row = 0; row < count; row++)
{
if (GameList::GetEntryByIndex(i)->path == path)
if (GameList::GetEntryByIndex(row)->path == path)
{
row = i;
break;
const QModelIndex mi(index(row, Column_Cover));
emit dataChanged(mi, mi, {Qt::DecorationRole});
return;
}
}
if (!row.has_value())
{
// Game removed?
return;
}
const QModelIndex mi(index(static_cast<int>(row.value()), Column_Cover));
emit dataChanged(mi, mi, {Qt::DecorationRole});
}
int GameListModel::getCoverArtWidth() const
@@ -251,45 +252,43 @@ int GameListModel::getCoverArtSpacing() const
int GameListModel::rowCount(const QModelIndex& parent) const
{
if (parent.isValid())
return 0;
return static_cast<int>(GameList::GetEntryCount());
return parent.isValid() ? 0 : static_cast<int>(GameList::GetEntryCount());
}
int GameListModel::columnCount(const QModelIndex& parent) const
{
if (parent.isValid())
return 0;
return Column_Count;
return parent.isValid() ? 0 : Column_Count;
}
QString GameListModel::formatTimespan(time_t timespan)
QString GameListModel::formatTimespan(const time_t timespan)
{
// avoid an extra string conversion
// Avoid an extra string conversion over calling QString::fromStdString(GameList::FormatTimespan).
const u32 hours = static_cast<u32>(timespan / 3600);
const u32 minutes = static_cast<u32>((timespan % 3600) / 60);
if (hours > 0)
return qApp->translate("GameList", "%n hours", "", hours);
else
const u32 minutes = static_cast<u32>((timespan % 3600) / 60);
if (minutes > 0)
return qApp->translate("GameList", "%n minutes", "", minutes);
else
return qApp->translate("GameList", "%n seconds", "", static_cast<u32>((timespan % 3600) % 60));
}
QVariant GameListModel::data(const QModelIndex& index, int role) const
QVariant GameListModel::data(const QModelIndex& index, const int role) const
{
if (!index.isValid())
return {};
return QVariant();
const int row = index.row();
if (row < 0 || row >= static_cast<int>(GameList::GetEntryCount()))
return {};
return QVariant();
const auto lock = GameList::GetLock();
const GameList::Entry* ge = GameList::GetEntryByIndex(row);
if (!ge)
return {};
return QVariant();
// See: https://doc.qt.io/qt-6/qt.html#ItemDataRole-enum
switch (role)
{
case Qt::DisplayRole:
@@ -309,12 +308,7 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const
return QString::fromStdString(fmt::format("{:08X}", ge->crc));
case Column_TimePlayed:
{
if (ge->total_played_time == 0)
return {};
else
return formatTimespan(ge->total_played_time);
}
return ge->total_played_time ? formatTimespan(ge->total_played_time) : QVariant();
case Column_LastPlayed:
return QString::fromStdString(GameList::FormatTimestamp(ge->last_played_time));
@@ -323,55 +317,10 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const
return QString("%1 MB").arg(static_cast<double>(ge->total_size) / 1048576.0, 0, 'f', 2);
case Column_Cover:
{
if (m_show_titles_for_covers)
return QString::fromStdString(ge->GetTitle(m_prefer_english_titles));
else
return {};
}
return m_show_titles_for_covers ? QString::fromStdString(ge->GetTitle(m_prefer_english_titles)) : QVariant();
default:
return {};
}
}
case Qt::InitialSortOrderRole:
{
switch (index.column())
{
case Column_Type:
return static_cast<int>(ge->type);
case Column_Serial:
return QString::fromStdString(ge->serial);
case Column_Title:
case Column_Cover:
return QString::fromStdString(ge->GetTitleSort(m_prefer_english_titles));
case Column_FileTitle:
return QtUtils::StringViewToQString(Path::GetFileTitle(ge->path));
case Column_CRC:
return static_cast<int>(ge->crc);
case Column_TimePlayed:
return static_cast<qlonglong>(ge->total_played_time);
case Column_LastPlayed:
return static_cast<qlonglong>(ge->last_played_time);
case Column_Region:
return static_cast<int>(ge->region);
case Column_Compatibility:
return static_cast<int>(ge->compatibility_rating);
case Column_Size:
return static_cast<qulonglong>(ge->total_size);
default:
return {};
return QVariant();
}
}
@@ -380,22 +329,16 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const
switch (index.column())
{
case Column_Type:
{
return m_type_pixmaps[static_cast<u32>(ge->type)];
}
case Column_Region:
{
return m_region_pixmaps[static_cast<u32>(ge->region)];
}
case Column_Compatibility:
{
return m_compatibility_pixmaps[static_cast<u32>(
(static_cast<u32>(ge->compatibility_rating) >= GameList::CompatibilityRatingCount) ?
GameList::CompatibilityRating::Unknown :
ge->compatibility_rating)];
}
case Column_Cover:
{
@@ -403,27 +346,38 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const
if (pm)
return *pm;
// We insert the placeholder into the cache, so that we don't repeatedly
// queue loading jobs for this game.
// Insert the placeholder into the cache so we don't repeatedly queue loading jobs for this game.
const_cast<GameListModel*>(this)->loadOrGenerateCover(ge);
return *m_cover_pixmap_cache.Insert(ge->path, m_loading_pixmap);
}
break;
default:
return {};
return QVariant();
}
default:
return {};
}
case Qt::SizeHintRole:
{
switch (index.column())
{
case Column_Cover:
return QSize(static_cast<int>(static_cast<float>(SIZE_HINT_WIDTH) * m_cover_scale),
static_cast<int>(static_cast<float>(m_show_titles_for_covers ? SIZE_HINT_HEIGHT_TITLES : SIZE_HINT_HEIGHT) * m_cover_scale));
default:
return QVariant();
}
}
default:
return QVariant();
}
}
QVariant GameListModel::headerData(int section, Qt::Orientation orientation, int role) const
QVariant GameListModel::headerData(const int section, const Qt::Orientation orientation, const int role) const
{
if (orientation != Qt::Horizontal || role != Qt::DisplayRole || section < 0 || section >= Column_Count)
return {};
return QVariant();
return m_column_display_names[section];
}
@@ -435,7 +389,7 @@ void GameListModel::refresh()
endResetModel();
}
bool GameListModel::titlesLessThan(int left_row, int right_row) const
bool GameListModel::titlesLessThan(const int left_row, const int right_row) const
{
if (left_row < 0 || left_row >= static_cast<int>(GameList::GetEntryCount()) || right_row < 0 ||
right_row >= static_cast<int>(GameList::GetEntryCount()))
@@ -449,7 +403,7 @@ bool GameListModel::titlesLessThan(int left_row, int right_row) const
QString::fromStdString(right->GetTitleSort(m_prefer_english_titles))) < 0;
}
bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& right_index, int column) const
bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& right_index, const int column) const
{
if (!left_index.isValid() || !right_index.isValid())
return false;
@@ -482,13 +436,12 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r
{
if (left->serial == right->serial)
return titlesLessThan(left_row, right_row);
return (StringUtil::Strcasecmp(left->serial.c_str(), right->serial.c_str()) < 0);
}
case Column_Title:
{
return titlesLessThan(left_row, right_row);
}
case Column_FileTitle:
{
@@ -505,6 +458,7 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r
{
if (left->region == right->region)
return titlesLessThan(left_row, right_row);
return (static_cast<int>(left->region) < static_cast<int>(right->region));
}
@@ -558,7 +512,7 @@ void GameListModel::loadSettings()
m_prefer_english_titles = Host::GetBaseBoolSettingValue("UI", "PreferEnglishGameList", false);
}
QIcon GameListModel::getIconForType(GameList::EntryType type)
QIcon GameListModel::getIconForType(const GameList::EntryType type)
{
switch (type)
{
@@ -572,7 +526,7 @@ QIcon GameListModel::getIconForType(GameList::EntryType type)
}
}
QIcon GameListModel::getIconForRegion(GameList::Region region)
QIcon GameListModel::getIconForRegion(const GameList::Region region)
{
return QIcon(
QStringLiteral("%1/icons/flags/%2.svg").arg(QtHost::GetResourcesBasePath()).arg(GameList::RegionToString(region, false)));
@@ -583,8 +537,8 @@ void GameListModel::loadThemeSpecificImages()
for (u32 type = 0; type < static_cast<u32>(GameList::EntryType::Count); type++)
m_type_pixmaps[type] = getIconForType(static_cast<GameList::EntryType>(type)).pixmap(QSize(24, 24), m_dpr);
for (u32 i = 0; i < static_cast<u32>(GameList::Region::Count); i++)
m_region_pixmaps[i] = getIconForRegion(static_cast<GameList::Region>(i)).pixmap(QSize(36, 26), m_dpr);
for (u32 region = 0; region < static_cast<u32>(GameList::Region::Count); region++)
m_region_pixmaps[region] = getIconForRegion(static_cast<GameList::Region>(region)).pixmap(QSize(36, 26), m_dpr);
}
void GameListModel::loadCommonImages()
@@ -592,8 +546,8 @@ void GameListModel::loadCommonImages()
loadThemeSpecificImages();
const QString base_path(QtHost::GetResourcesBasePath());
for (u32 i = 1; i < GameList::CompatibilityRatingCount; i++)
m_compatibility_pixmaps[i] = QIcon((QStringLiteral("%1/icons/star-%2.svg").arg(base_path).arg(i - 1))).pixmap(QSize(88, 16), m_dpr);
for (u32 rating = 1; rating < GameList::CompatibilityRatingCount; rating++)
m_compatibility_pixmaps[rating] = QIcon((QStringLiteral("%1/icons/star-%2.svg").arg(base_path).arg(rating - 1))).pixmap(QSize(88, 16), m_dpr);
m_placeholder_pixmap.load(QStringLiteral("%1/cover-placeholder.png").arg(base_path));
}
+1 -1
View File
@@ -84,7 +84,7 @@ private:
void loadOrGenerateCover(const GameList::Entry* ge);
void invalidateCoverForPath(const std::string& path);
static QString formatTimespan(time_t timespan);
static QString formatTimespan(const time_t timespan);
float m_cover_scale = 0.0f;
std::atomic<u32> m_cover_scale_counter{0};
+17 -10
View File
@@ -4,14 +4,17 @@
#include "GameListRefreshThread.h"
#include "pcsx2/GameList.h"
#include "pcsx2/Host.h"
#include "common/Assertions.h"
#include "common/Console.h"
#include "common/ProgressCallback.h"
#include "common/Timer.h"
#include <QtWidgets/QMessageBox>
AsyncRefreshProgressCallback::AsyncRefreshProgressCallback(GameListRefreshThread* parent)
AsyncRefreshProgressCallback::AsyncRefreshProgressCallback(bool popup_on_error, GameListRefreshThread* parent)
: m_parent(parent)
, m_popup_on_error(popup_on_error)
{
}
@@ -57,17 +60,20 @@ void AsyncRefreshProgressCallback::SetTitle(const char* title)
void AsyncRefreshProgressCallback::DisplayError(const char* message)
{
QMessageBox::critical(nullptr, QStringLiteral("Error"), QString::fromUtf8(message));
if (m_popup_on_error)
Host::ReportErrorAsync(TRANSLATE_SV("GameListRefreshThread", "Error"), message);
else
ERROR_LOG("{}", message);
}
void AsyncRefreshProgressCallback::DisplayWarning(const char* message)
{
QMessageBox::warning(nullptr, QStringLiteral("Warning"), QString::fromUtf8(message));
pxFailRel("Not implemented.");
}
void AsyncRefreshProgressCallback::DisplayInformation(const char* message)
{
QMessageBox::information(nullptr, QStringLiteral("Information"), QString::fromUtf8(message));
pxFailRel("Not implemented.");
}
void AsyncRefreshProgressCallback::DisplayDebugMessage(const char* message)
@@ -77,17 +83,18 @@ void AsyncRefreshProgressCallback::DisplayDebugMessage(const char* message)
void AsyncRefreshProgressCallback::ModalError(const char* message)
{
QMessageBox::critical(nullptr, QStringLiteral("Error"), QString::fromUtf8(message));
pxFailRel("Not implemented.");
}
bool AsyncRefreshProgressCallback::ModalConfirmation(const char* message)
{
return QMessageBox::question(nullptr, QStringLiteral("Question"), QString::fromUtf8(message)) == QMessageBox::Yes;
pxFailRel("Not implemented.");
return false;
}
void AsyncRefreshProgressCallback::ModalInformation(const char* message)
{
QMessageBox::information(nullptr, QStringLiteral("Information"), QString::fromUtf8(message));
pxFailRel("Not implemented.");
}
void AsyncRefreshProgressCallback::fireUpdate()
@@ -95,9 +102,9 @@ void AsyncRefreshProgressCallback::fireUpdate()
m_parent->refreshProgress(m_status_text, m_last_value, m_last_range);
}
GameListRefreshThread::GameListRefreshThread(bool invalidate_cache)
GameListRefreshThread::GameListRefreshThread(bool invalidate_cache, bool popup_on_error)
: QThread()
, m_progress(this)
, m_progress(popup_on_error, this)
, m_invalidate_cache(invalidate_cache)
{
}
+4 -2
View File
@@ -14,7 +14,7 @@ class GameListRefreshThread;
class AsyncRefreshProgressCallback : public BaseProgressCallback
{
public:
AsyncRefreshProgressCallback(GameListRefreshThread* parent);
AsyncRefreshProgressCallback(bool popup_on_error, GameListRefreshThread* parent);
void Cancel();
@@ -38,6 +38,7 @@ private:
QString m_status_text;
int m_last_range = 1;
int m_last_value = 0;
bool m_popup_on_error = false;
};
class GameListRefreshThread final : public QThread
@@ -45,7 +46,7 @@ class GameListRefreshThread final : public QThread
Q_OBJECT
public:
GameListRefreshThread(bool invalidate_cache);
GameListRefreshThread(bool invalidate_cache, bool popup_on_error);
~GameListRefreshThread();
void cancel();
@@ -60,4 +61,5 @@ protected:
private:
AsyncRefreshProgressCallback m_progress;
bool m_invalidate_cache;
bool m_popup_on_error;
};
+44 -50
View File
@@ -106,6 +106,7 @@ private:
namespace
{
// Used for Type, Region, and Compatibility columns to center icons; Qt::AlignCenter only works on DisplayRole (text).
class GameListIconStyleDelegate final : public QStyledItemDelegate
{
public:
@@ -115,62 +116,61 @@ namespace
}
~GameListIconStyleDelegate() = default;
// See: QStyledItemDelegate::paint(), QItemDelegate::drawDecoration(), and Qt::QStyleOptionViewItem.
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
// https://stackoverflow.com/questions/32216568/how-to-set-icon-center-in-qtableview
Q_ASSERT(index.isValid());
// Draw the base item, with a blank icon
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
opt.icon = QIcon();
// Based on QStyledItemDelegate::paint()
const QStyle* style = option.widget ? option.widget->style() : QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, option.widget);
// Draw highlight for cell.
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &option, painter, option.widget);
// Fetch icon pixmap
const QRect r = option.rect;
const QPixmap pix = qvariant_cast<QPixmap>(index.data(Qt::DecorationRole));
// Fetch icon pixmap and stop if no icon exists
const QPixmap icon = qvariant_cast<QPixmap>(index.data(Qt::DecorationRole));
if (pix.isNull())
if (icon.isNull())
return;
const int pix_width = static_cast<int>(pix.width() / pix.devicePixelRatio());
const int pix_height = static_cast<int>(pix.height() / pix.devicePixelRatio());
// Clip the pixmaps so they don't extend outside the column
// Save painter state and restore later so clip setting doesn't persist across cell draws.
painter->save();
painter->setClipRect(option.rect);
// Draw the icon, using code derived from QItemDelegate::drawDecoration()
const bool enabled = option.state & QStyle::State_Enabled;
const QPoint p = QPoint((r.width() - pix_width) / 2, (r.height() - pix_height) / 2);
// Clip pixmap so it doesn't extend outside the cell.
const QRect rect = option.rect;
painter->setClipRect(rect);
// Determine starting location of icon (Qt uses top-left origin).
const int icon_width = static_cast<int>(static_cast<qreal>(icon.width()) / icon.devicePixelRatio());
const int icon_height = static_cast<int>(static_cast<qreal>(icon.height()) / icon.devicePixelRatio());
const QPoint icon_top_left = QPoint((rect.width() - icon_width) / 2, (rect.height() - icon_height) / 2);
// Change palette if the item is selected.
if (option.state & QStyle::State_Selected)
{
// See QItemDelegate::selectedPixmap()
// Set color based on whether cell is enabled.
const bool enabled = option.state & QStyle::State_Enabled;
QColor color = option.palette.color(enabled ? QPalette::Normal : QPalette::Disabled, QPalette::Highlight);
color.setAlphaF(0.3f);
QString key = QString::fromStdString(fmt::format("{:016X}-{:d}-{:08X}", pix.cacheKey(), enabled, color.rgba()));
QPixmap pm;
if (!QPixmapCache::find(key, &pm))
// Fetch pixmap from cache or construct a new one.
const QString key = QString::fromStdString(fmt::format("{:016X}-{:d}-{:08X}", icon.cacheKey(), enabled, color.rgba()));
QPixmap highlighted_icon;
if (!QPixmapCache::find(key, &highlighted_icon))
{
QImage img = pix.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
QImage img = icon.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
QPainter tinted_painter(&img);
tinted_painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
tinted_painter.fillRect(0, 0, img.width(), img.height(), color);
tinted_painter.end();
pm = QPixmap(QPixmap::fromImage(img));
QPixmapCache::insert(key, pm);
highlighted_icon = QPixmap(QPixmap::fromImage(img));
QPixmapCache::insert(key, highlighted_icon);
}
painter->drawPixmap(r.topLeft() + p, pm);
painter->drawPixmap(rect.topLeft() + icon_top_left, highlighted_icon);
}
else
{
painter->drawPixmap(r.topLeft() + p, pix);
painter->drawPixmap(rect.topLeft() + icon_top_left, icon);
}
// Restore the old clip path.
@@ -240,11 +240,13 @@ void GameListWidget::initialize()
m_table_view->setAlternatingRowColors(true);
m_table_view->setMouseTracking(true);
m_table_view->setShowGrid(false);
m_table_view->setCurrentIndex({});
m_table_view->setCurrentIndex(QModelIndex());
m_table_view->horizontalHeader()->setHighlightSections(false);
m_table_view->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
m_table_view->verticalHeader()->hide();
m_table_view->setVerticalScrollMode(QAbstractItemView::ScrollMode::ScrollPerPixel);
// Custom painter to center-align DisplayRoles (icons)
m_table_view->setItemDelegateForColumn(0, new GameListIconStyleDelegate(this));
m_table_view->setItemDelegateForColumn(8, new GameListIconStyleDelegate(this));
m_table_view->setItemDelegateForColumn(9, new GameListIconStyleDelegate(this));
@@ -260,7 +262,7 @@ void GameListWidget::initialize()
connect(m_table_view->horizontalHeader(), &QHeaderView::customContextMenuRequested, this,
&GameListWidget::onTableViewHeaderContextMenuRequested);
connect(m_table_view->horizontalHeader(), &QHeaderView::sortIndicatorChanged, this,
&GameListWidget::onTableViewHeaderSortIndicatorChanged);
&GameListWidget::saveTableViewColumnSortSettings);
m_ui.stack->insertWidget(0, m_table_view);
@@ -292,7 +294,7 @@ void GameListWidget::initialize()
m_empty_ui.setupUi(m_empty_widget);
m_empty_ui.supportedFormats->setText(qApp->translate("GameListWidget", SUPPORTED_FORMATS_STRING));
connect(m_empty_ui.addGameDirectory, &QPushButton::clicked, this, [this]() { emit addGameDirectoryRequested(); });
connect(m_empty_ui.scanForNewGames, &QPushButton::clicked, this, [this]() { refresh(false); });
connect(m_empty_ui.scanForNewGames, &QPushButton::clicked, this, [this]() { refresh(false, true); });
connect(qApp, &QGuiApplication::applicationStateChanged, this, [this]() { GameListWidget::updateCustomBackgroundState(); });
m_ui.stack->insertWidget(2, m_empty_widget);
@@ -451,11 +453,11 @@ bool GameListWidget::getShowGridCoverTitles() const
return m_model->getShowCoverTitles();
}
void GameListWidget::refresh(bool invalidate_cache)
void GameListWidget::refresh(bool invalidate_cache, bool popup_on_error)
{
cancelRefresh();
m_refresh_thread = new GameListRefreshThread(invalidate_cache);
m_refresh_thread = new GameListRefreshThread(invalidate_cache, popup_on_error);
connect(m_refresh_thread, &GameListRefreshThread::refreshProgress, this, &GameListWidget::onRefreshProgress,
Qt::QueuedConnection);
connect(m_refresh_thread, &GameListRefreshThread::refreshComplete, this, &GameListWidget::onRefreshComplete,
@@ -571,11 +573,6 @@ void GameListWidget::onTableViewHeaderContextMenuRequested(const QPoint& point)
menu.exec(m_table_view->mapToGlobal(point));
}
void GameListWidget::onTableViewHeaderSortIndicatorChanged(int, Qt::SortOrder)
{
saveTableViewColumnSortSettings();
}
void GameListWidget::onCoverScaleChanged()
{
m_model->updateCacheSize(width(), height());
@@ -729,16 +726,16 @@ bool GameListWidget::event(QEvent* event)
void GameListWidget::resizeTableViewColumnsToFit()
{
QtUtils::ResizeColumnsForTableView(m_table_view, {
45, // type
80, // code
55, // type
85, // code
-1, // title
-1, // file title
65, // crc
80, // time played
80, // last played
75, // crc
95, // time played
90, // last played
80, // size
60, // region
120 // compatibility
120, // compatibility
});
}
@@ -804,18 +801,15 @@ void GameListWidget::loadTableViewColumnSortSettings()
hv->setSortIndicator(sort_column, sort_order);
}
void GameListWidget::saveTableViewColumnSortSettings()
void GameListWidget::saveTableViewColumnSortSettings(const int sort_column, const Qt::SortOrder sort_order)
{
const int sort_column = m_table_view->horizontalHeader()->sortIndicatorSection();
const bool sort_descending = (m_table_view->horizontalHeader()->sortIndicatorOrder() == Qt::DescendingOrder);
if (sort_column >= 0 && sort_column < GameListModel::Column_Count)
{
Host::SetBaseStringSettingValue(
"GameListTableView", "SortColumn", GameListModel::getColumnName(static_cast<GameListModel::Column>(sort_column)));
}
Host::SetBaseBoolSettingValue("GameListTableView", "SortDescending", sort_descending);
Host::SetBaseBoolSettingValue("GameListTableView", "SortDescending", sort_order == Qt::DescendingOrder);
Host::CommitBaseSettingChanges();
}
+2 -3
View File
@@ -46,7 +46,7 @@ public:
void initialize();
void resizeTableViewColumnsToFit();
void refresh(bool invalidate_cache);
void refresh(bool invalidate_cache, bool popup_on_error);
void cancelRefresh();
void reloadThemeSpecificImages();
void setCustomBackground(bool force = false);
@@ -81,7 +81,6 @@ private Q_SLOTS:
void onTableViewItemActivated(const QModelIndex& index);
void onTableViewContextMenuRequested(const QPoint& point);
void onTableViewHeaderContextMenuRequested(const QPoint& point);
void onTableViewHeaderSortIndicatorChanged(int, Qt::SortOrder);
void onListViewItemActivated(const QModelIndex& index);
void onListViewContextMenuRequested(const QPoint& point);
void onCoverScaleChanged();
@@ -106,7 +105,7 @@ private:
void saveTableViewColumnVisibilitySettings();
void saveTableViewColumnVisibilitySettings(int column);
void loadTableViewColumnSortSettings();
void saveTableViewColumnSortSettings();
void saveTableViewColumnSortSettings(const int sort_column, const Qt::SortOrder sort_order);
void listZoom(float delta);
void updateToolbar();
+9
View File
@@ -214,6 +214,15 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>viewGameList</tabstop>
<tabstop>viewGameGrid</tabstop>
<tabstop>viewGridTitles</tabstop>
<tabstop>gridScale</tabstop>
<tabstop>filterType</tabstop>
<tabstop>filterRegion</tabstop>
<tabstop>searchText</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+131 -120
View File
@@ -21,6 +21,10 @@
#include "Tools/InputRecording/InputRecordingViewer.h"
#include "Tools/InputRecording/NewInputRecordingDlg.h"
#if !defined(__APPLE__)
#include "ShortcutCreationDialog.h"
#endif
#include "pcsx2/Achievements.h"
#include "pcsx2/CDVD/CDVDcommon.h"
#include "pcsx2/CDVD/CDVDdiscReader.h"
@@ -138,21 +142,11 @@ MainWindow::~MainWindow()
#ifdef _WIN32
unregisterForDeviceNotifications();
#endif
#ifdef __APPLE__
CocoaTools::RemoveThemeChangeHandler(this);
#endif
}
void MainWindow::initialize()
{
#ifdef __APPLE__
CocoaTools::AddThemeChangeHandler(this, [](void* ctx) {
// This handler is called *before* the style change has propagated far enough for Qt to see it
// Use RunOnUIThread to delay until it has
QtHost::RunOnUIThread([ctx = static_cast<MainWindow*>(ctx)] {
ctx->updateTheme(); // Qt won't notice the style change without us touching the palette in some way
});
});
// The cocoa backing isn't initialized yet, delay this until stuff is set up with a `RunOnUIThread` call
QtHost::RunOnUIThread([this] {
CocoaTools::MarkHelpMenu(m_ui.menuHelp->toNSMenu());
@@ -363,8 +357,8 @@ void MainWindow::connectSignals()
[this]() { doControllerSettings(ControllerSettingsWindow::Category::HotkeySettings); });
connect(m_ui.actionAddGameDirectory, &QAction::triggered,
[this]() { getSettingsWindow()->getGameListSettingsWidget()->addSearchDirectory(this); });
connect(m_ui.actionScanForNewGames, &QAction::triggered, [this]() { refreshGameList(false); });
connect(m_ui.actionRescanAllGames, &QAction::triggered, [this]() { refreshGameList(true); });
connect(m_ui.actionScanForNewGames, &QAction::triggered, [this]() { refreshGameList(false, true); });
connect(m_ui.actionRescanAllGames, &QAction::triggered, [this]() { refreshGameList(true, true); });
connect(m_ui.actionViewToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarActionToggled);
connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewLockToolbarActionToggled);
connect(m_ui.actionViewStatusBar, &QAction::toggled, this, &MainWindow::onViewStatusBarActionToggled);
@@ -553,7 +547,7 @@ void MainWindow::recreate()
MainWindow* new_main_window = new MainWindow();
pxAssert(g_main_window == new_main_window);
new_main_window->initialize();
new_main_window->refreshGameList(false);
new_main_window->refreshGameList(false, false);
new_main_window->show();
deleteLater();
@@ -748,45 +742,37 @@ void MainWindow::onVideoCaptureToggled(bool checked)
{
if (!s_vm_valid)
{
QMessageBox msgbox(this);
msgbox.setIcon(QMessageBox::Question);
msgbox.setWindowIcon(QtHost::GetAppIcon());
msgbox.setWindowTitle(tr("Record On Boot"));
msgbox.setWindowModality(Qt::WindowModal);
msgbox.addButton(QMessageBox::Yes);
msgbox.addButton(QMessageBox::No);
msgbox.setDefaultButton(QMessageBox::Yes);
if (!s_record_on_start)
{
QMessageBox msgbox(this);
msgbox.setIcon(QMessageBox::Question);
msgbox.setWindowIcon(QtHost::GetAppIcon());
msgbox.setWindowTitle(tr("Record On Boot"));
msgbox.setWindowModality(Qt::WindowModal);
msgbox.setText(tr("Did you want to start recording on boot?"));
msgbox.addButton(QMessageBox::Yes);
msgbox.addButton(QMessageBox::No);
msgbox.setDefaultButton(QMessageBox::Yes);
if (msgbox.exec() == QMessageBox::Yes)
{
const QString container(QString::fromStdString(
Host::GetStringSettingValue("EmuCore/GS", "CaptureContainer", Pcsx2Config::GSOptions::DEFAULT_CAPTURE_CONTAINER)));
const QString filter(tr("%1 Files (*.%2)").arg(container.toUpper()).arg(container));
QString temp(QStringLiteral("%1.%2").arg(QString::fromStdString(GSGetBaseVideoFilename())).arg(container));
temp = QDir::toNativeSeparators(QFileDialog::getSaveFileName(this, tr("Video Capture"), temp, filter));
s_path_to_recording_for_record_on_start = temp;
if (s_path_to_recording_for_record_on_start.isEmpty())
return;
s_record_on_start = true;
const QString base_video_filename(QStringLiteral("%1.%2").arg(QString::fromStdString(GSGetBaseVideoFilename())).arg(container));
s_path_to_recording_for_record_on_start = QDir::toNativeSeparators(QFileDialog::getSaveFileName(this, tr("Video Capture"), base_video_filename, filter));
s_record_on_start = !s_path_to_recording_for_record_on_start.isEmpty();
}
}
else
{
QMessageBox msgbox(this);
msgbox.setIcon(QMessageBox::Question);
msgbox.setWindowIcon(QtHost::GetAppIcon());
msgbox.setWindowTitle(tr("Record On Boot"));
msgbox.setWindowModality(Qt::WindowModal);
msgbox.setText(tr("Did you want to cancel recording on boot?"));
msgbox.addButton(QMessageBox::Yes);
msgbox.addButton(QMessageBox::No);
msgbox.setDefaultButton(QMessageBox::Yes);
if (msgbox.exec() == QMessageBox::Yes)
s_record_on_start = false;
}
QSignalBlocker sb(m_ui.actionVideoCapture);
m_ui.actionVideoCapture->setChecked(s_record_on_start);
return;
}
@@ -1151,23 +1137,39 @@ bool MainWindow::shouldMouseLock() const
if (!Host::GetBoolSettingValue("EmuCore", "EnableMouseLock", false))
return false;
if (m_display_created == false || m_display_widget == nullptr && !isRenderingToMain())
return false;
bool windowsHidden = (!g_debugger_window || g_debugger_window->isHidden()) &&
(!m_controller_settings_window || m_controller_settings_window->isHidden()) &&
(!m_settings_window || m_settings_window->isHidden());
return windowsHidden && (isActiveWindow() || isRenderingFullscreen());
auto* displayWindow = isRenderingToMain() ? window() : m_display_widget->window();
if (displayWindow == nullptr)
return false;
return windowsHidden && (displayWindow->isActiveWindow() || displayWindow->isFullScreen());
}
bool MainWindow::shouldAbortForMemcardBusy(const VMLock& lock)
{
if (MemcardBusy::IsBusy() && !GSDumpReplayer::IsReplayingDump())
{
const QMessageBox::StandardButton res = QMessageBox::critical(
lock.getDialogParent(),
tr("WARNING: Memory Card Busy"),
tr("WARNING: Your memory card is still writing data. Shutting down now <b>WILL IRREVERSIBLY DESTROY YOUR MEMORY CARD.</b> It is strongly recommended to resume your game and let it finish writing to your memory card.<br><br>Do you wish to shutdown anyways and <b>IRREVERSIBLY DESTROY YOUR MEMORY CARD?</b>"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
QMessageBox msgbox(lock.getDialogParent());
msgbox.setIcon(QMessageBox::Warning);
msgbox.setWindowTitle(tr("WARNING: Memory Card Busy"));
msgbox.setWindowIcon(QtHost::GetAppIcon());
msgbox.setWindowModality(Qt::WindowModal);
msgbox.setTextFormat(Qt::RichText);
msgbox.setText(tr("Your memory card is still saving data."));
msgbox.setInformativeText(tr("WARNING: Shutting down now can <b>IRREVERSIBLY CORRUPT YOUR MEMORY CARD.</b><br><br>"
"You are strongly advised to select 'No' and let the save finish.<br><br>"
"Do you want to shutdown anyway and <b>IRREVERSIBLY CORRUPT YOUR MEMORY CARD</b>?"));
msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgbox.setDefaultButton(QMessageBox::No);
if (res != QMessageBox::Yes)
if (msgbox.exec() != QMessageBox::Yes)
{
return true;
}
@@ -1213,13 +1215,9 @@ void MainWindow::switchToEmulationView()
m_display_widget->setFocus();
}
void MainWindow::refreshGameList(bool invalidate_cache)
void MainWindow::refreshGameList(bool invalidate_cache, bool popup_on_error)
{
// can't do this while the VM is running because of CDVD
if (s_vm_valid)
return;
m_game_list_widget->refresh(invalidate_cache);
m_game_list_widget->refresh(invalidate_cache, popup_on_error);
}
void MainWindow::cancelGameListRefresh()
@@ -1454,18 +1452,24 @@ void MainWindow::onGameListEntryContextMenuRequested(const QPoint& point)
action = menu.addAction(tr("Set Cover Image..."));
connect(action, &QAction::triggered, [this, entry]() { setGameListEntryCoverImage(entry); });
#if !defined(__APPLE__)
connect(menu.addAction(tr("Create Game Shortcut...")), &QAction::triggered, [this]() { MainWindow::onCreateGameShortcutTriggered(); });
#endif
connect(menu.addAction(tr("Exclude From List")), &QAction::triggered,
[this, entry]() { getSettingsWindow()->getGameListSettingsWidget()->addExcludedPath(entry->path); });
connect(menu.addAction(tr("Reset Play Time")), &QAction::triggered, [this, entry]() { clearGameListEntryPlayTime(entry); });
const time_t entry_played_time = GameList::GetCachedPlayedTimeForSerial(entry->serial);
// Best two options given zero play time are to grey this out or to not show it at all.
if (entry_played_time)
connect(menu.addAction(tr("Reset Play Time")), &QAction::triggered, [this, entry, entry_played_time]() { clearGameListEntryPlayTime(entry, entry_played_time); });
// Check Wiki Page functionality is based on a serial redirect.
if (!entry->serial.empty())
{
connect(menu.addAction(tr("Check Wiki Page")), &QAction::triggered, [this, entry]() { goToWikiPage(entry); });
}
action = menu.addAction(tr("Open Screenshots Folder"));
connect(action, &QAction::triggered, [this, entry]() { openScreenshotsFolderForGame(entry); });
action = menu.addAction(tr("Open Snapshots Folder"));
connect(action, &QAction::triggered, [this, entry]() { openSnapshotsFolderForGame(entry); });
menu.addSeparator();
if (!s_vm_valid)
@@ -1752,11 +1756,22 @@ void MainWindow::onToolsCoverDownloaderTriggered()
{
// This can be invoked via big picture, so exit fullscreen.
VMLock lock(pauseAndLockVM());
CoverDownloadDialog dlg(lock.getDialogParent());
CoverDownloadDialog dlg(this);
connect(&dlg, &CoverDownloadDialog::coverRefreshRequested, m_game_list_widget, &GameListWidget::refreshGridCovers);
dlg.exec();
}
#if !defined(__APPLE__)
void MainWindow::onCreateGameShortcutTriggered()
{
const GameList::Entry* entry = m_game_list_widget->getSelectedEntry();
const QString title = QString::fromStdString(entry->GetTitle());
const QString path = QString::fromStdString(entry->path);
VMLock lock(pauseAndLockVM());
ShortcutCreationDialog dlg(lock.getDialogParent(), title, path);
dlg.exec();
}
#endif
void MainWindow::onToolsEditCheatsPatchesTriggered(bool cheats)
{
if (s_current_disc_serial.isEmpty() || s_current_running_crc == 0)
@@ -1795,9 +1810,6 @@ void MainWindow::updateTheme()
{
QtHost::UpdateApplicationTheme();
reloadThemeSpecificImages();
if (g_debugger_window)
g_debugger_window->updateTheme();
}
void MainWindow::reloadThemeSpecificImages()
@@ -2085,7 +2097,7 @@ void MainWindow::onVMStopped()
// reload played time
if (m_game_list_widget->isShowingGameList())
m_game_list_widget->refresh(false);
m_game_list_widget->refresh(false, false);
}
void MainWindow::onGameChanged(const QString& title, const QString& elf_override, const QString& disc_path,
@@ -2314,19 +2326,24 @@ bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr
if (msg->message == WM_INPUT)
{
UINT dwSize = 40;
static BYTE lpb[40];
if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)))
UINT dwSize = 0;
GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, nullptr, &dwSize, sizeof(RAWINPUTHEADER));
if (dwSize > 0)
{
const RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEMOUSE)
std::vector<BYTE> lpb(dwSize);
if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb.data(), &dwSize, sizeof(RAWINPUTHEADER)) == dwSize)
{
const RAWMOUSE& mouse = raw->data.mouse;
if (mouse.usFlags == MOUSE_MOVE_ABSOLUTE || mouse.usFlags == MOUSE_MOVE_RELATIVE)
const RAWINPUT* raw = reinterpret_cast<const RAWINPUT*>(lpb.data());
if (raw->header.dwType == RIM_TYPEMOUSE)
{
POINT cursorPos;
GetCursorPos(&cursorPos);
checkMousePosition(cursorPos.x, cursorPos.y);
const RAWMOUSE& mouse = raw->data.mouse;
if (mouse.usFlags == MOUSE_MOVE_ABSOLUTE || mouse.usFlags == MOUSE_MOVE_RELATIVE)
{
POINT cursorPos;
if (GetCursorPos(&cursorPos))
checkMousePosition(cursorPos.x, cursorPos.y);
}
}
}
}
@@ -2627,33 +2644,35 @@ void MainWindow::setupMouseMoveHandler()
void MainWindow::checkMousePosition(int x, int y)
{
if (!shouldMouseLock())
return;
// This function is called from a different thread on Linux/macOS
// kaboom can happen when the widget is destroyed after shouldMouseLock is called, so queue everything to the UI thread
QtHost::RunOnUIThread([this, x, y]() {
if (!shouldMouseLock())
return;
const QPoint globalCursorPos = {x, y};
QRect windowBounds = isRenderingFullscreen() ? screen()->geometry() : geometry();
if (windowBounds.contains(globalCursorPos))
return;
// physical mouse position
const QPoint physicalPos(x, y);
Common::SetMousePosition(
std::clamp(globalCursorPos.x(), windowBounds.left(), windowBounds.right()),
std::clamp(globalCursorPos.y(), windowBounds.top(), windowBounds.bottom()));
const auto* displayWindow = getDisplayContainer()->window();
/*
Provided below is how we would handle this if we were using low level hooks (What is used in Common::AttachMouseCb)
We currently use rawmouse on Windows, so Common::SetMousePosition called directly works fine.
*/
#if 0
// We are currently in a low level hook. SetCursorPos here (what is in Common::SetMousePosition) will not work!
// Let's (a)buse Qt's event loop to dispatch the call at a later time, outside of the hook.
QMetaObject::invokeMethod(
this, [=]() {
Common::SetMousePosition(
std::clamp(globalCursorPos.x(), windowBounds.left(), windowBounds.right()),
std::clamp(globalCursorPos.y(), windowBounds.top(), windowBounds.bottom()));
},
Qt::QueuedConnection);
#endif
// logical (DIP) frame rect
QRectF logicalBounds = displayWindow->geometry();
// physical frame rect
const qreal scale = displayWindow->devicePixelRatioF();
QRectF physicalBounds(
logicalBounds.x() * scale,
logicalBounds.y() * scale,
logicalBounds.width() * scale,
logicalBounds.height() * scale);
if (physicalBounds.contains(physicalPos))
return;
Common::SetMousePosition(
std::clamp(physicalPos.x(), (int)physicalBounds.left(), (int)physicalBounds.right()),
std::clamp(physicalPos.y(), (int)physicalBounds.top(), (int)physicalBounds.bottom()));
});
}
void MainWindow::saveDisplayWindowGeometryToConfig()
@@ -2903,17 +2922,18 @@ void MainWindow::setGameListEntryCoverImage(const GameList::Entry* entry)
m_game_list_widget->refreshGridCovers();
}
void MainWindow::clearGameListEntryPlayTime(const GameList::Entry* entry)
void MainWindow::clearGameListEntryPlayTime(const GameList::Entry* entry, const time_t entry_played_time)
{
if (QMessageBox::question(this, tr("Confirm Reset"),
tr("Are you sure you want to reset the play time for '%1'?\n\nThis action cannot be undone.")
.arg(QString::fromStdString(entry->title))) != QMessageBox::Yes)
tr("Are you sure you want to reset the play time for '%1' (%2)?\n\nYour current play time is %3.\n\nThis action cannot be undone.")
.arg(entry->title.empty() ? tr("empty title") : QString::fromStdString(entry->title),
entry->serial.empty() ? tr("no serial") : QString::fromStdString(entry->serial),
QString::fromStdString(GameList::FormatTimespan(entry_played_time, true))),
(QMessageBox::Yes | QMessageBox::No), QMessageBox::No) == QMessageBox::Yes)
{
return;
GameList::ClearPlayedTimeForSerial(entry->serial);
m_game_list_widget->refresh(false, false);
}
GameList::ClearPlayedTimeForSerial(entry->serial);
m_game_list_widget->refresh(false);
}
void MainWindow::goToWikiPage(const GameList::Entry* entry)
@@ -2921,37 +2941,28 @@ void MainWindow::goToWikiPage(const GameList::Entry* entry)
QtUtils::OpenURL(this, fmt::format("https://wiki.pcsx2.net/{}", entry->serial).c_str());
}
void MainWindow::openScreenshotsFolderForGame(const GameList::Entry* entry)
void MainWindow::openSnapshotsFolderForGame(const GameList::Entry* entry)
{
if (!entry || entry->title.empty())
return;
// if disabled open the snapshots folder
if (!EmuConfig.GS.OrganizeScreenshotsByGame)
// Go to top-level snapshots directory if not organizing by game.
if (EmuConfig.GS.OrganizeSnapshotsByGame && entry && !entry->title.empty())
{
QtUtils::OpenURL(this, QUrl::fromLocalFile(QString::fromStdString(EmuFolders::Snapshots)));
return;
}
std::string game_name = entry->title;
Path::SanitizeFileName(&game_name);
std::string game_name = entry->title;
Path::SanitizeFileName(&game_name);
if (game_name.length() > 219)
{
game_name.resize(219);
}
const std::string game_dir = Path::Combine(EmuFolders::Snapshots, game_name);
const std::string game_dir = Path::Combine(EmuFolders::Snapshots, game_name);
if (!FileSystem::DirectoryExists(game_dir.c_str()))
{
if (!FileSystem::CreateDirectoryPath(game_dir.c_str(), false))
// Make sure the per-game directory exists or that we can successfully create it.
if (FileSystem::DirectoryExists(game_dir.c_str()) || FileSystem::CreateDirectoryPath(game_dir.c_str(), false))
{
QMessageBox::critical(this, tr("Error"), tr("Failed to create screenshots directory '%1'.").arg(QString::fromStdString(game_dir)));
const QFileInfo fi(QString::fromStdString(game_dir));
QtUtils::OpenURL(this, QUrl::fromLocalFile(fi.absoluteFilePath()));
return;
}
QMessageBox::critical(this, tr("Error"), tr("Failed to create snapshots directory '%1'\n\nOpening default directory.").arg(QString::fromStdString(game_dir)));
}
const QFileInfo fi(QString::fromStdString(game_dir));
QtUtils::OpenURL(this, QUrl::fromLocalFile(fi.absoluteFilePath()));
QtUtils::OpenURL(this, QUrl::fromLocalFile(QString::fromStdString(EmuFolders::Snapshots)));
}
std::optional<bool> MainWindow::promptForResumeState(const QString& save_state_path)
+6 -3
View File
@@ -113,7 +113,7 @@ public:
void checkMousePosition(int x, int y);
public Q_SLOTS:
void checkForUpdates(bool display_message, bool force_check);
void refreshGameList(bool invalidate_cache);
void refreshGameList(bool invalidate_cache, bool popup_on_error);
void cancelGameListRefresh();
void reportInfo(const QString& title, const QString& message);
void reportError(const QString& title, const QString& message);
@@ -170,6 +170,9 @@ private Q_SLOTS:
void onAboutActionTriggered();
void onToolsOpenDataDirectoryTriggered();
void onToolsCoverDownloaderTriggered();
#if !defined(__APPLE__)
void onCreateGameShortcutTriggered();
#endif
void onToolsEditCheatsPatchesTriggered(bool cheats);
void onCreateMemoryCardOpenRequested();
void updateTheme();
@@ -273,9 +276,9 @@ private:
void startGameListEntry(
const GameList::Entry* entry, std::optional<s32> save_slot = std::nullopt, std::optional<bool> fast_boot = std::nullopt, bool load_backup = false);
void setGameListEntryCoverImage(const GameList::Entry* entry);
void clearGameListEntryPlayTime(const GameList::Entry* entry);
void clearGameListEntryPlayTime(const GameList::Entry* entry, const time_t entry_played_time);
void goToWikiPage(const GameList::Entry* entry);
void openScreenshotsFolderForGame(const GameList::Entry* entry);
void openSnapshotsFolderForGame(const GameList::Entry* entry);
std::optional<bool> promptForResumeState(const QString& save_state_path);
void loadSaveStateSlot(s32 slot, bool load_backup = false);
+1
View File
@@ -104,6 +104,7 @@
<addaction name="actionDEV9Settings"/>
<addaction name="actionFolderSettings"/>
<addaction name="actionAchievementSettings"/>
<addaction name="separator"/>
<addaction name="actionControllerSettings"/>
<addaction name="actionHotkeySettings"/>
<addaction name="separator"/>
+7 -2
View File
@@ -1152,7 +1152,7 @@ void Host::OpenHostFileSelectorAsync(std::string_view title, bool select_directo
if (!filters.empty())
{
filters_str.append(QStringLiteral("All File Types (%1)")
.arg(QString::fromStdString(StringUtil::JoinString(filters.begin(), filters.end(), " "))));
.arg(QString::fromStdString(StringUtil::JoinString(filters.begin(), filters.end(), " "))));
for (const std::string& filter : filters)
{
filters_str.append(
@@ -2328,7 +2328,12 @@ int main(int argc, char* argv[])
{
CrashHandler::Install();
// Exceptions are disabled, so we can't try/catch this.
// Timestamps in some locales showed up wrong on Windows.
// Qt already applies the user locale on Unix-like systems.
#ifdef _WIN32
std::locale::global(std::locale(""));
#endif
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
QtHost::RegisterTypes();
@@ -2380,7 +2385,7 @@ int main(int argc, char* argv[])
// When running in batch mode, ensure game list is loaded, but don't scan for any new files.
if (!s_batch_mode)
g_main_window->refreshGameList(false);
g_main_window->refreshGameList(false, false);
else
GameList::Refresh(false, true);
+3 -6
View File
@@ -90,7 +90,9 @@ namespace QtUtils
const int min_column_width = header->minimumSectionSize();
const int scrollbar_width = ((view->verticalScrollBar() && view->verticalScrollBar()->isVisible()) ||
view->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) ? view->verticalScrollBar()->width() : 0;
view->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) ?
view->verticalScrollBar()->width() :
0;
int num_flex_items = 0;
int total_width = 0;
int column_index = 0;
@@ -346,11 +348,6 @@ namespace QtUtils
return csv;
}
bool IsLightTheme(const QPalette& palette)
{
return palette.text().color().lightnessF() < 0.5;
}
bool IsCompositorManagerRunning()
{
if (qEnvironmentVariableIsSet("PCSX2_NO_COMPOSITING"))
+1 -3
View File
@@ -96,9 +96,7 @@ namespace QtUtils
/// Converts an abstract item model to a CSV string.
QString AbstractItemModelToCSV(QAbstractItemModel* model, int role = Qt::DisplayRole, bool useQuotes = false);
// Heuristic to check if the current theme is a light or dark theme.
bool IsLightTheme(const QPalette& palette);
/// Checks if we can use transparency effects e.g. for dock drop indicators.
bool IsCompositorManagerRunning();
/// Sets the scalable icon to a given label (svg icons, or icons with multiple size pixmaps)
+15 -5
View File
@@ -3,7 +3,7 @@
<class>AchievementLoginDialog</class>
<widget class="QDialog" name="AchievementLoginDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
<enum>Qt::WindowModality::WindowModal</enum>
</property>
<property name="geometry">
<rect>
@@ -44,7 +44,7 @@
<string comment="Header text">RetroAchievements Login</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
</widget>
</item>
@@ -63,7 +63,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -80,6 +80,9 @@
<property name="text">
<string>User Name:</string>
</property>
<property name="buddy">
<cstring>userName</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -90,12 +93,15 @@
<property name="text">
<string>Password:</string>
</property>
<property name="buddy">
<cstring>password</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="password">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
@@ -113,7 +119,7 @@
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel</set>
<set>QDialogButtonBox::StandardButton::Cancel</set>
</property>
</widget>
</item>
@@ -121,6 +127,10 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>userName</tabstop>
<tabstop>password</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+56 -8
View File
@@ -78,13 +78,13 @@
<number>5</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
<enum>QSlider::TickPosition::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1</number>
@@ -124,13 +124,13 @@
<number>5</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
<enum>QSlider::TickPosition::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1</number>
@@ -165,6 +165,9 @@
<property name="text">
<string>Notification Position:</string>
</property>
<property name="buddy">
<cstring>notificationPosition</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
@@ -284,6 +287,9 @@
<property name="text">
<string>Overlay Position:</string>
</property>
<property name="buddy">
<cstring>overlayPosition</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
@@ -418,7 +424,13 @@
Login token generated at:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="buddy">
<cstring>viewProfile</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
@@ -458,7 +470,10 @@ Login token generated at:</string>
<item row="0" column="0">
<widget class="QLabel" name="gameInfo">
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
@@ -471,7 +486,7 @@ Login token generated at:</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;PCSX2 uses RetroAchievements as an achievement database and for tracking progress. To use achievements, please sign up for an account at &lt;a href=&quot;https://retroachievements.org/&quot;&gt;retroachievements.org&lt;/a&gt;.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;To view the achievement list in-game, press the hotkey for &lt;span style=&quot; font-weight:600;&quot;&gt;Open Pause Menu&lt;/span&gt; and select &lt;span style=&quot; font-weight:600;&quot;&gt;Achievements&lt;/span&gt; from the menu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
<enum>Qt::TextFormat::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -487,7 +502,7 @@ Login token generated at:</string>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -499,6 +514,39 @@ Login token generated at:</string>
</item>
</layout>
</widget>
<tabstops>
<tabstop>enable</tabstop>
<tabstop>hardcoreMode</tabstop>
<tabstop>encoreMode</tabstop>
<tabstop>spectatorMode</tabstop>
<tabstop>unofficialAchievements</tabstop>
<tabstop>achievementNotifications</tabstop>
<tabstop>achievementNotificationsDuration</tabstop>
<tabstop>leaderboardNotifications</tabstop>
<tabstop>leaderboardNotificationsDuration</tabstop>
<tabstop>soundEffects</tabstop>
<tabstop>notificationPosition</tabstop>
<tabstop>overlays</tabstop>
<tabstop>leaderboardOverlays</tabstop>
<tabstop>overlayPosition</tabstop>
<tabstop>notificationSound</tabstop>
<tabstop>notificationSoundPath</tabstop>
<tabstop>notificationSoundBrowse</tabstop>
<tabstop>notificationSoundOpen</tabstop>
<tabstop>notificationSoundReset</tabstop>
<tabstop>unlockSound</tabstop>
<tabstop>unlockSoundPath</tabstop>
<tabstop>unlockSoundBrowse</tabstop>
<tabstop>unlockSoundOpen</tabstop>
<tabstop>unlockSoundReset</tabstop>
<tabstop>lbSound</tabstop>
<tabstop>lbSoundPath</tabstop>
<tabstop>lbSoundBrowse</tabstop>
<tabstop>lbSoundOpen</tabstop>
<tabstop>lbSoundReset</tabstop>
<tabstop>viewProfile</tabstop>
<tabstop>loginButton</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+61 -1
View File
@@ -32,6 +32,9 @@
<property name="text">
<string extracomment="Rounding refers here to the mathematical term.">Rounding Mode:</string>
</property>
<property name="buddy">
<cstring>eeRoundingMode</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -63,6 +66,9 @@
<property name="text">
<string extracomment="Rounding refers here to the mathematical term.">Division Rounding Mode:</string>
</property>
<property name="buddy">
<cstring>eeDivRoundingMode</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -94,6 +100,9 @@
<property name="text">
<string extracomment="Clamping: Forcing out of bounds things in bounds by changing them to the closest possible value. In this case, this refers to clamping large PS2 floating point values (which map to infinity or NaN in PCs' IEEE754 floats) to non-infinite ones.">Clamping Mode:</string>
</property>
<property name="buddy">
<cstring>eeClampMode</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -187,6 +196,9 @@
<property name="text">
<string>VU1 Rounding Mode:</string>
</property>
<property name="buddy">
<cstring>vu1RoundingMode</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -274,6 +286,9 @@
<property name="text">
<string>VU0 Clamping Mode:</string>
</property>
<property name="buddy">
<cstring>vu0ClampMode</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
@@ -281,6 +296,9 @@
<property name="text">
<string>VU0 Rounding Mode:</string>
</property>
<property name="buddy">
<cstring>vu0RoundingMode</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
@@ -288,6 +306,9 @@
<property name="text">
<string>VU1 Clamping Mode:</string>
</property>
<property name="buddy">
<cstring>vu1ClampMode</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -446,6 +467,9 @@
<property name="text">
<string>Compression Level:</string>
</property>
<property name="buddy">
<cstring>savestateCompressionLevel</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
@@ -460,6 +484,9 @@
<property name="text">
<string>Compression Method:</string>
</property>
<property name="buddy">
<cstring>savestateCompressionMethod</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
@@ -499,6 +526,9 @@
<property name="text">
<string>Slot:</string>
</property>
<property name="buddy">
<cstring>pineSlot</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
@@ -514,7 +544,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -526,6 +556,36 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>eeRoundingMode</tabstop>
<tabstop>eeDivRoundingMode</tabstop>
<tabstop>eeClampMode</tabstop>
<tabstop>eeRecompiler</tabstop>
<tabstop>eeCache</tabstop>
<tabstop>eeWaitLoopDetection</tabstop>
<tabstop>eeINTCSpinDetection</tabstop>
<tabstop>eeFastmem</tabstop>
<tabstop>pauseOnTLBMiss</tabstop>
<tabstop>extraMemory</tabstop>
<tabstop>vu0RoundingMode</tabstop>
<tabstop>vu0ClampMode</tabstop>
<tabstop>vu1RoundingMode</tabstop>
<tabstop>vu1ClampMode</tabstop>
<tabstop>vu0Recompiler</tabstop>
<tabstop>vu1Recompiler</tabstop>
<tabstop>vuFlagHack</tabstop>
<tabstop>instantVU1</tabstop>
<tabstop>iopRecompiler</tabstop>
<tabstop>gameFixes</tabstop>
<tabstop>patches</tabstop>
<tabstop>savestateCompressionMethod</tabstop>
<tabstop>savestateCompressionLevel</tabstop>
<tabstop>backupSaveStates</tabstop>
<tabstop>saveStateOnShutdown</tabstop>
<tabstop>savestateSelector</tabstop>
<tabstop>pineEnable</tabstop>
<tabstop>pineSlot</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -19,6 +19,9 @@
<property name="text">
<string>Circular Wrap:</string>
</property>
<property name="buddy">
<cstring>circularWrap</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -59,6 +62,9 @@
<property name="text">
<string>Shift:</string>
</property>
<property name="buddy">
<cstring>shift</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
@@ -99,6 +105,9 @@
<property name="text">
<string>Depth:</string>
</property>
<property name="buddy">
<cstring>depth</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
@@ -139,6 +148,9 @@
<property name="text">
<string>Focus:</string>
</property>
<property name="buddy">
<cstring>focus</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
@@ -179,6 +191,9 @@
<property name="text">
<string>Center Image:</string>
</property>
<property name="buddy">
<cstring>centerImage</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
@@ -219,6 +234,9 @@
<property name="text">
<string>Front Separation:</string>
</property>
<property name="buddy">
<cstring>frontSeparation</cstring>
</property>
</widget>
</item>
<item row="7" column="1">
@@ -259,6 +277,9 @@
<property name="text">
<string>Rear Separation:</string>
</property>
<property name="buddy">
<cstring>rearSeparation</cstring>
</property>
</widget>
</item>
<item row="8" column="1">
@@ -299,6 +320,9 @@
<property name="text">
<string>Low Cutoff:</string>
</property>
<property name="buddy">
<cstring>lowCutoff</cstring>
</property>
</widget>
</item>
<item row="9" column="1">
@@ -339,6 +363,9 @@
<property name="text">
<string>High Cutoff:</string>
</property>
<property name="buddy">
<cstring>highCutoff</cstring>
</property>
</widget>
</item>
<item row="10" column="1">
@@ -428,6 +455,9 @@
<property name="text">
<string>Block Size:</string>
</property>
<property name="buddy">
<cstring>blockSize</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -471,6 +501,18 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>blockSize</tabstop>
<tabstop>circularWrap</tabstop>
<tabstop>shift</tabstop>
<tabstop>depth</tabstop>
<tabstop>focus</tabstop>
<tabstop>centerImage</tabstop>
<tabstop>frontSeparation</tabstop>
<tabstop>rearSeparation</tabstop>
<tabstop>lowCutoff</tabstop>
<tabstop>highCutoff</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+59 -12
View File
@@ -34,6 +34,9 @@
<property name="text">
<string>Driver:</string>
</property>
<property name="buddy">
<cstring>driver</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -76,10 +79,10 @@
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBothSides</enum>
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>20</number>
@@ -117,6 +120,9 @@
<property name="text">
<string>Buffer Size:</string>
</property>
<property name="buddy">
<cstring>bufferMS</cstring>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
@@ -125,7 +131,10 @@
<string>Maximum latency: 0 frames (0.00ms)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
@@ -134,6 +143,9 @@
<property name="text">
<string>Backend:</string>
</property>
<property name="buddy">
<cstring>audioBackend</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
@@ -147,10 +159,10 @@
<number>200</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBothSides</enum>
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>20</number>
@@ -181,6 +193,9 @@
<property name="text">
<string>Output Latency:</string>
</property>
<property name="buddy">
<cstring>outputLatencyMS</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -191,6 +206,9 @@
<property name="text">
<string>Output Device:</string>
</property>
<property name="buddy">
<cstring>outputDevice</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
@@ -198,6 +216,9 @@
<property name="text">
<string>Expansion:</string>
</property>
<property name="buddy">
<cstring>expansionMode</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
@@ -205,6 +226,9 @@
<property name="text">
<string>Synchronization:</string>
</property>
<property name="buddy">
<cstring>syncMode</cstring>
</property>
</widget>
</item>
</layout>
@@ -221,6 +245,9 @@
<property name="text">
<string>Standard Volume:</string>
</property>
<property name="buddy">
<cstring>standardVolume</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -234,10 +261,10 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBothSides</enum>
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>10</number>
@@ -256,7 +283,7 @@
<string>100%</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -283,10 +310,10 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBothSides</enum>
<enum>QSlider::TickPosition::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>10</number>
@@ -305,7 +332,7 @@
<string>100%</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -326,6 +353,9 @@
<property name="text">
<string>Fast Forward Volume:</string>
</property>
<property name="buddy">
<cstring>fastForwardVolume</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
@@ -341,7 +371,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -353,6 +383,23 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>audioBackend</tabstop>
<tabstop>driver</tabstop>
<tabstop>outputDevice</tabstop>
<tabstop>expansionMode</tabstop>
<tabstop>expansionSettings</tabstop>
<tabstop>syncMode</tabstop>
<tabstop>stretchSettings</tabstop>
<tabstop>bufferMS</tabstop>
<tabstop>outputLatencyMS</tabstop>
<tabstop>outputLatencyMinimal</tabstop>
<tabstop>standardVolume</tabstop>
<tabstop>resetStandardVolume</tabstop>
<tabstop>fastForwardVolume</tabstop>
<tabstop>resetFastForwardVolume</tabstop>
<tabstop>muted</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -19,6 +19,9 @@
<property name="text">
<string>Sequence Length:</string>
</property>
<property name="buddy">
<cstring>sequenceLength</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -59,6 +62,9 @@
<property name="text">
<string>Seekwindow Size:</string>
</property>
<property name="buddy">
<cstring>seekWindowSize</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -99,6 +105,9 @@
<property name="text">
<string>Overlap:</string>
</property>
<property name="buddy">
<cstring>overlap</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
@@ -199,6 +208,13 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>sequenceLength</tabstop>
<tabstop>seekWindowSize</tabstop>
<tabstop>overlap</tabstop>
<tabstop>useQuickSeek</tabstop>
<tabstop>useAAFilter</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+18 -2
View File
@@ -37,6 +37,12 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>searchDirectory</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
@@ -74,7 +80,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -156,7 +162,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -168,6 +174,16 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>searchDirectory</tabstop>
<tabstop>browseSearchDirectory</tabstop>
<tabstop>resetSearchDirectory</tabstop>
<tabstop>fileList</tabstop>
<tabstop>openSearchDirectory</tabstop>
<tabstop>refresh</tabstop>
<tabstop>fastBoot</tabstop>
<tabstop>fastBootFastForward</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -418,7 +418,7 @@
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1021,7 +1021,7 @@
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1038,7 +1038,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1076,7 +1076,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1093,7 +1093,7 @@
<item row="2" column="0" colspan="4">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -1255,6 +1255,36 @@
<header>Settings/InputBindingWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>Up</tabstop>
<tabstop>Down</tabstop>
<tabstop>Left</tabstop>
<tabstop>Right</tabstop>
<tabstop>Triangle</tabstop>
<tabstop>Cross</tabstop>
<tabstop>Square</tabstop>
<tabstop>Circle</tabstop>
<tabstop>L1</tabstop>
<tabstop>L2</tabstop>
<tabstop>R1</tabstop>
<tabstop>R2</tabstop>
<tabstop>LUp</tabstop>
<tabstop>LDown</tabstop>
<tabstop>LLeft</tabstop>
<tabstop>LRight</tabstop>
<tabstop>L3</tabstop>
<tabstop>RUp</tabstop>
<tabstop>RDown</tabstop>
<tabstop>RLeft</tabstop>
<tabstop>RRight</tabstop>
<tabstop>R3</tabstop>
<tabstop>Select</tabstop>
<tabstop>Start</tabstop>
<tabstop>Analog</tabstop>
<tabstop>LargeMotor</tabstop>
<tabstop>SmallMotor</tabstop>
<tabstop>Pressure</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -23,7 +23,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -55,7 +55,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -307,6 +307,19 @@
<header>Settings/InputBindingWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>Start</tabstop>
<tabstop>Select</tabstop>
<tabstop>Up</tabstop>
<tabstop>Down</tabstop>
<tabstop>Orange</tabstop>
<tabstop>Blue</tabstop>
<tabstop>Yellow</tabstop>
<tabstop>Red</tabstop>
<tabstop>Green</tabstop>
<tabstop>Whammy</tabstop>
<tabstop>Tilt</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -249,7 +249,7 @@
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -683,7 +683,7 @@
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -700,7 +700,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -738,7 +738,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -799,7 +799,7 @@
<item row="1" column="0" colspan="4">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -825,6 +825,26 @@
<header>Settings/InputBindingWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>Up</tabstop>
<tabstop>Down</tabstop>
<tabstop>Left</tabstop>
<tabstop>Right</tabstop>
<tabstop>Triangle</tabstop>
<tabstop>Cross</tabstop>
<tabstop>Square</tabstop>
<tabstop>Circle</tabstop>
<tabstop>L1</tabstop>
<tabstop>L2</tabstop>
<tabstop>R1</tabstop>
<tabstop>R2</tabstop>
<tabstop>DialLeft</tabstop>
<tabstop>DialRight</tabstop>
<tabstop>Select</tabstop>
<tabstop>Start</tabstop>
<tabstop>LargeMotor</tabstop>
<tabstop>SmallMotor</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -249,7 +249,7 @@
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -581,7 +581,7 @@
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -598,7 +598,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -636,7 +636,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -697,7 +697,7 @@
<item row="1" column="0" colspan="4">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -723,6 +723,23 @@
<header>Settings/InputBindingWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>Up</tabstop>
<tabstop>Down</tabstop>
<tabstop>Left</tabstop>
<tabstop>Right</tabstop>
<tabstop>I</tabstop>
<tabstop>II</tabstop>
<tabstop>A</tabstop>
<tabstop>B</tabstop>
<tabstop>L</tabstop>
<tabstop>R</tabstop>
<tabstop>TwistLeft</tabstop>
<tabstop>TwistRight</tabstop>
<tabstop>Start</tabstop>
<tabstop>LargeMotor</tabstop>
<tabstop>SmallMotor</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -43,7 +43,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -81,7 +81,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -343,7 +343,7 @@
<item row="1" column="0" colspan="5">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -524,6 +524,19 @@
<header>Settings/InputBindingWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>Select</tabstop>
<tabstop>Start</tabstop>
<tabstop>YellowL</tabstop>
<tabstop>BlueL</tabstop>
<tabstop>BlueR</tabstop>
<tabstop>YellowR</tabstop>
<tabstop>WhiteL</tabstop>
<tabstop>GreenL</tabstop>
<tabstop>Red</tabstop>
<tabstop>GreenR</tabstop>
<tabstop>WhiteR</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -26,7 +26,7 @@
<item row="7" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -64,6 +64,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -90,6 +93,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -109,6 +115,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="0">
@@ -142,6 +151,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -159,8 +171,7 @@
<string>Controller LED Settings</string>
</property>
<property name="icon">
<iconset theme="lightbulb-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="lightbulb-line"/>
</property>
</widget>
</item>
@@ -201,9 +212,15 @@
<property name="text">
<string>PCSX2 allows you to use your mouse to simulate analog stick movement.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
@@ -241,6 +258,9 @@
<property name="text">
<string>The XInput source provides support for Xbox 360 / Xbox One / Xbox Series controllers, and third party controllers which implement the XInput protocol.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
@@ -283,6 +303,22 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>enableSDLSource</tabstop>
<tabstop>enableSDLEnhancedMode</tabstop>
<tabstop>ledSettings</tabstop>
<tabstop>enableSDLRawInput</tabstop>
<tabstop>enableSDLIOKitDriver</tabstop>
<tabstop>enableSDLMFIDriver</tabstop>
<tabstop>enableXInputSource</tabstop>
<tabstop>enableDInputSource</tabstop>
<tabstop>enableMouseMapping</tabstop>
<tabstop>mouseSettings</tabstop>
<tabstop>multitapPort1</tabstop>
<tabstop>multitapPort2</tabstop>
<tabstop>useProfileHotkeyBindings</tabstop>
<tabstop>deviceList</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -65,7 +65,7 @@
<item row="3" column="0" colspan="4">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<property name="bottomMargin">
<number>0</number>
@@ -92,7 +92,7 @@
</sizepolicy>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
<set>QDialogButtonBox::StandardButton::Close</set>
</property>
</widget>
</item>
@@ -107,6 +107,13 @@
<header>ColorPickerButton.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>SDL0LED</tabstop>
<tabstop>SDL1LED</tabstop>
<tabstop>SDL2LED</tabstop>
<tabstop>SDL3LED</tabstop>
<tabstop>enableSDLPS5PlayerLED</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+24 -3
View File
@@ -33,13 +33,19 @@
<widget class="QListWidget" name="bindList"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="bindListLabel">
<property name="text">
<string>Select the buttons which you want to trigger with this macro. All buttons are activated concurrently.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>bindList</cstring>
</property>
</widget>
</item>
</layout>
@@ -52,13 +58,19 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="pressureLabel">
<property name="text">
<string>For buttons which are pressure sensitive, this slider controls how much force will be simulated when the macro is active.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>pressure</cstring>
</property>
</widget>
</item>
<item>
@@ -116,6 +128,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -137,10 +152,13 @@
<item row="2" column="0">
<layout class="QHBoxLayout" name="deadzoneLayout" stretch="0,1,0">
<item>
<widget class="QLabel" name="label_4">
<widget class="QLabel" name="deadzoneLabel">
<property name="text">
<string>Deadzone:</string>
</property>
<property name="buddy">
<cstring>deadzone</cstring>
</property>
</widget>
</item>
<item>
@@ -190,6 +208,9 @@
<property name="text">
<string>Macro will toggle every N frames.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -38,10 +38,10 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Controller Mapping Settings&lt;/span&gt;&lt;br/&gt;These settings fine-tune the behavior when mapping physical controllers to the emulated controllers.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
<enum>Qt::TextFormat::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -71,6 +71,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="buddy">
<cstring>ignoreInversion</cstring>
</property>
</widget>
</item>
</layout>
@@ -79,7 +82,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -92,12 +95,15 @@
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
<set>QDialogButtonBox::StandardButton::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>ignoreInversion</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
@@ -17,7 +17,7 @@
<item row="5" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
<set>QDialogButtonBox::StandardButton::Close</set>
</property>
</widget>
</item>
@@ -40,6 +40,9 @@
<property name="text">
<string>Y Speed</string>
</property>
<property name="buddy">
<cstring>pointerYSpeedSlider</cstring>
</property>
</widget>
</item>
<item>
@@ -63,7 +66,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -107,6 +110,9 @@
<property name="text">
<string>X Speed</string>
</property>
<property name="buddy">
<cstring>pointerXSpeedSlider</cstring>
</property>
</widget>
</item>
<item>
@@ -130,7 +136,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -182,10 +188,10 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Mouse Mapping Settings&lt;/span&gt;&lt;br/&gt;These settings fine-tune the behavior when mapping a mouse to the emulated controller.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
<enum>Qt::TextFormat::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -197,7 +203,7 @@
<item row="4" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -226,6 +232,9 @@
<property name="text">
<string>Inertia</string>
</property>
<property name="buddy">
<cstring>pointerInertiaSlider</cstring>
</property>
</widget>
</item>
<item>
@@ -249,7 +258,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -293,6 +302,9 @@
<property name="text">
<string>X Dead Zone</string>
</property>
<property name="buddy">
<cstring>pointerXDeadZoneSlider</cstring>
</property>
</widget>
</item>
<item>
@@ -316,7 +328,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -360,6 +372,9 @@
<property name="text">
<string>Y Dead Zone</string>
</property>
<property name="buddy">
<cstring>pointerYDeadZoneSlider</cstring>
</property>
</widget>
</item>
<item>
@@ -383,7 +398,7 @@
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
@@ -410,6 +425,13 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>pointerXSpeedSlider</tabstop>
<tabstop>pointerXDeadZoneSlider</tabstop>
<tabstop>pointerYSpeedSlider</tabstop>
<tabstop>pointerYDeadZoneSlider</tabstop>
<tabstop>pointerInertiaSlider</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+9 -1
View File
@@ -19,6 +19,9 @@
<property name="text">
<string>Select Hosts</string>
</property>
<property name="buddy">
<cstring>hostList</cstring>
</property>
</widget>
</item>
<item>
@@ -36,7 +39,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -64,6 +67,11 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>hostList</tabstop>
<tabstop>btnOK</tabstop>
<tabstop>btnCancel</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+67 -5
View File
@@ -37,6 +37,9 @@
<property name="text">
<string>Ethernet Device:</string>
</property>
<property name="buddy">
<cstring>ethDev</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
@@ -44,6 +47,9 @@
<property name="text">
<string>Ethernet Device Type:</string>
</property>
<property name="buddy">
<cstring>ethDevType</cstring>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
@@ -84,6 +90,9 @@
<property name="text">
<string>Subnet Mask:</string>
</property>
<property name="buddy">
<cstring>ethNetMask</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
@@ -91,6 +100,9 @@
<property name="text">
<string>Gateway Address:</string>
</property>
<property name="buddy">
<cstring>ethGatewayAddr</cstring>
</property>
</widget>
</item>
<item row="3" column="2">
@@ -105,6 +117,9 @@
<property name="text">
<string>Intercept DHCP:</string>
</property>
<property name="buddy">
<cstring>ethInterceptDHCP</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -126,6 +141,9 @@
<property name="text">
<string>PS2 Address:</string>
</property>
<property name="buddy">
<cstring>ethPS2Addr</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
@@ -140,6 +158,9 @@
<property name="text">
<string>DNS1 Address:</string>
</property>
<property name="buddy">
<cstring>ethDNS1Addr</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
@@ -154,6 +175,9 @@
<property name="text">
<string>DNS2 Address:</string>
</property>
<property name="buddy">
<cstring>ethDNS2Addr</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
@@ -213,7 +237,7 @@
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -230,12 +254,15 @@
<property name="text">
<string>Internal DNS can be selected using the DNS1/2 dropdowns, or by setting them to 192.0.2.1</string>
</property>
<property name="buddy">
<cstring>ethHosts</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QTableView" name="ethHosts">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
</property>
<property name="sortingEnabled">
<bool>true</bool>
@@ -326,10 +353,10 @@
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
<enum>QSlider::TickPosition::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>5</number>
@@ -360,6 +387,9 @@
<property name="text">
<string>HDD File:</string>
</property>
<property name="buddy">
<cstring>hddFile</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
@@ -367,6 +397,9 @@
<property name="text">
<string>HDD Size (GiB):</string>
</property>
<property name="buddy">
<cstring>hddSizeSlider</cstring>
</property>
</widget>
</item>
<item row="2" column="2">
@@ -382,7 +415,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -394,6 +427,35 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>ethEnabled</tabstop>
<tabstop>ethDevType</tabstop>
<tabstop>ethDev</tabstop>
<tabstop>ethTabWidget</tabstop>
<tabstop>ethInterceptDHCP</tabstop>
<tabstop>ethPS2Addr</tabstop>
<tabstop>ethNetMask</tabstop>
<tabstop>ethNetMaskAuto</tabstop>
<tabstop>ethGatewayAddr</tabstop>
<tabstop>ethGatewayAuto</tabstop>
<tabstop>ethDNS1Addr</tabstop>
<tabstop>ethDNS1Mode</tabstop>
<tabstop>ethDNS2Addr</tabstop>
<tabstop>ethDNS2Mode</tabstop>
<tabstop>ethHostAdd</tabstop>
<tabstop>ethHostDel</tabstop>
<tabstop>ethHostExport</tabstop>
<tabstop>ethHostImport</tabstop>
<tabstop>ethHostPerGame</tabstop>
<tabstop>ethHosts</tabstop>
<tabstop>hddEnabled</tabstop>
<tabstop>hddLBA48</tabstop>
<tabstop>hddFile</tabstop>
<tabstop>hddBrowseFile</tabstop>
<tabstop>hddSizeSlider</tabstop>
<tabstop>hddSizeSpinBox</tabstop>
<tabstop>hddCreate</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -28,6 +28,9 @@
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
@@ -49,6 +52,9 @@
<property name="text">
<string>Automatically Analyze Program:</string>
</property>
<property name="buddy">
<cstring>analysisCondition</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -94,6 +100,10 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>analysisCondition</tabstop>
<tabstop>generateSymbolsForIRXExportTables</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -86,7 +86,7 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -168,6 +168,9 @@
<property name="text">
<string>Import from file (.elf, .sym, etc):</string>
</property>
<property name="buddy">
<cstring>symbolFileTable</cstring>
</property>
</widget>
</item>
<item>
@@ -188,10 +191,10 @@
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum>
</property>
<property name="textElideMode">
<enum>Qt::ElideLeft</enum>
<enum>Qt::TextElideMode::ElideLeft</enum>
</property>
<property name="wordWrap">
<bool>false</bool>
@@ -231,7 +234,7 @@
<item>
<spacer name="importSymbolFileSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -280,6 +283,9 @@
<property name="text">
<string>Scan Mode:</string>
</property>
<property name="buddy">
<cstring>functionScanMode</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -328,10 +334,10 @@
<item>
<spacer name="startSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Maximum</enum>
<enum>QSizePolicy::Policy::Maximum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -346,6 +352,9 @@
<property name="text">
<string>Start:</string>
</property>
<property name="buddy">
<cstring>addressRangeStart</cstring>
</property>
</widget>
</item>
<item>
@@ -356,6 +365,9 @@
<property name="text">
<string>End:</string>
</property>
<property name="buddy">
<cstring>addressRangeEnd</cstring>
</property>
</widget>
</item>
<item>
@@ -364,10 +376,10 @@
<item>
<spacer name="endSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Maximum</enum>
<enum>QSizePolicy::Policy::Maximum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -408,7 +420,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -420,6 +432,22 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>automaticallyClearSymbols</tabstop>
<tabstop>symbolSourceScrollArea</tabstop>
<tabstop>importFromElf</tabstop>
<tabstop>importSymFileFromDefaultLocation</tabstop>
<tabstop>demangleSymbols</tabstop>
<tabstop>demangleParameters</tabstop>
<tabstop>symbolFileTable</tabstop>
<tabstop>addSymbolFile</tabstop>
<tabstop>removeSymbolFile</tabstop>
<tabstop>functionScanMode</tabstop>
<tabstop>customAddressRange</tabstop>
<tabstop>addressRangeStart</tabstop>
<tabstop>addressRangeEnd</tabstop>
<tabstop>grayOutOverwrittenFunctions</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+39 -1
View File
@@ -85,6 +85,9 @@
<property name="text">
<string>Save Draw Start:</string>
</property>
<property name="buddy">
<cstring>saveDrawStart</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -99,6 +102,9 @@
<property name="text">
<string>Save Draw Count:</string>
</property>
<property name="buddy">
<cstring>saveDrawCount</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
@@ -116,6 +122,9 @@
<property name="text">
<string>Save Frame Start:</string>
</property>
<property name="buddy">
<cstring>saveFrameStart</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
@@ -130,6 +139,9 @@
<property name="text">
<string>Save Frame Count:</string>
</property>
<property name="buddy">
<cstring>saveFrameCount</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
@@ -147,6 +159,9 @@
<property name="text">
<string>Hardware Dump Directory:</string>
</property>
<property name="buddy">
<cstring>hwDumpDirectory</cstring>
</property>
</widget>
</item>
<item row="6" column="0">
@@ -154,6 +169,9 @@
<property name="text">
<string>Software Dump Directory:</string>
</property>
<property name="buddy">
<cstring>swDumpDirectory</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
@@ -204,7 +222,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -216,6 +234,26 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>dumpGSData</tabstop>
<tabstop>saveFrame</tabstop>
<tabstop>saveRT</tabstop>
<tabstop>saveDepth</tabstop>
<tabstop>saveTexture</tabstop>
<tabstop>saveAlpha</tabstop>
<tabstop>saveInfo</tabstop>
<tabstop>saveTransferImages</tabstop>
<tabstop>saveDrawStart</tabstop>
<tabstop>saveDrawCount</tabstop>
<tabstop>saveFrameStart</tabstop>
<tabstop>saveFrameCount</tabstop>
<tabstop>hwDumpDirectory</tabstop>
<tabstop>hwDumpBrowse</tabstop>
<tabstop>hwDumpOpen</tabstop>
<tabstop>swDumpDirectory</tabstop>
<tabstop>swDumpBrowse</tabstop>
<tabstop>swDumpOpen</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+38 -3
View File
@@ -176,7 +176,7 @@
<item>
<spacer name="eeLoggingSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -286,7 +286,7 @@
<item>
<spacer name="iopLoggingSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -304,7 +304,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -316,6 +316,41 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>chkEnable</tabstop>
<tabstop>chkEECOP0</tabstop>
<tabstop>chkEECOP1</tabstop>
<tabstop>chkEECOP2</tabstop>
<tabstop>chkEER5900</tabstop>
<tabstop>chkEECache</tabstop>
<tabstop>chkEEMemory</tabstop>
<tabstop>chkEEMMIO</tabstop>
<tabstop>chkEEUNKNWNMMIO</tabstop>
<tabstop>chkEEDMARegs</tabstop>
<tabstop>chkEEDMACTRL</tabstop>
<tabstop>chkEEMSKPATH3</tabstop>
<tabstop>chkEEMFIFO</tabstop>
<tabstop>chkEEIPU</tabstop>
<tabstop>chkEECounters</tabstop>
<tabstop>chkEEVIFCodes</tabstop>
<tabstop>chkEEGIFTags</tabstop>
<tabstop>chkEEVIF</tabstop>
<tabstop>chkEEGIF</tabstop>
<tabstop>chkEEBIOS</tabstop>
<tabstop>chkEESIF</tabstop>
<tabstop>chkIOPCOP2</tabstop>
<tabstop>chkIOPR3000A</tabstop>
<tabstop>chkIOPMemcards</tabstop>
<tabstop>chkIOPPad</tabstop>
<tabstop>chkIOPDMARegs</tabstop>
<tabstop>chkIOPDMACTRL</tabstop>
<tabstop>chkIOPMMIO</tabstop>
<tabstop>chkIOPUNKNWNMMIO</tabstop>
<tabstop>chkIOPCounters</tabstop>
<tabstop>chkIOPCDVD</tabstop>
<tabstop>chkIOPMDEC</tabstop>
<tabstop>chkIOPBIOS</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
@@ -51,6 +51,9 @@
<property name="text">
<string>Refresh Interval:</string>
</property>
<property name="buddy">
<cstring>refreshInterval</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -89,6 +92,9 @@
<property name="text">
<string>Drop Indicator Style:</string>
</property>
<property name="buddy">
<cstring>dropIndicator</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -100,7 +106,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -112,6 +118,12 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>refreshInterval</tabstop>
<tabstop>showOnStartup</tabstop>
<tabstop>saveWindowGeometry</tabstop>
<tabstop>dropIndicator</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
+14 -3
View File
@@ -51,7 +51,10 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* settings_dialog
m_ui.rtcDateTime->setDateRange(QDate(2000, 1, 1), QDate(2099, 12, 31));
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.manuallySetRealTimeClock, "EmuCore", "ManuallySetRealTimeClock", false);
connect(m_ui.manuallySetRealTimeClock, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::onManuallySetRealTimeClockChanged);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.rtcUseSystemLocaleFormat, "EmuCore", "UseSystemLocaleFormat", false);
connect(m_ui.rtcUseSystemLocaleFormat, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::onUseSystemLocaleFormatChanged);
EmulationSettingsWidget::onManuallySetRealTimeClockChanged();
EmulationSettingsWidget::onUseSystemLocaleFormatChanged();
m_ui.eeCycleRate->insertItem(0,
tr("Use Global Setting [%1]")
@@ -159,10 +162,11 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* settings_dialog
dialog()->registerWidgetHelp(m_ui.manuallySetRealTimeClock, tr("Manually Set Real-Time Clock"), tr("Unchecked"),
tr("Manually set a real-time clock to use for the virtual PlayStation 2 instead of using your OS' system clock."));
dialog()->registerWidgetHelp(m_ui.rtcDateTime, tr("Real-Time Clock"), tr("Current date and time"),
tr("Real-time clock (RTC) used by the virtual PlayStation 2. Date format is the same as the one used by your OS. "
"This time is only applied upon booting the PS2; changing it while in-game will have no effect. "
"NOTE: This assumes you have your PS2 set to the default timezone of GMT+0 and default DST of Summer Time. "
tr("Real-time clock (RTC) used by the virtual PlayStation 2.<br>"
"This time is only applied upon booting the PS2; changing it while in-game will have no effect.<br>"
"Some games require an RTC date/time set after their release date."));
dialog()->registerWidgetHelp(m_ui.rtcUseSystemLocaleFormat, tr("Use System Locale Format"), tr("User Preference"),
tr("Uses the operating system's date/time format rather than \"yyyy-MM-dd HH:mm:ss\". May exclude seconds."));
updateOptimalFramePacing();
updateUseVSyncForTimingEnabled();
@@ -314,4 +318,11 @@ void EmulationSettingsWidget::onManuallySetRealTimeClockChanged()
{
const bool enabled = dialog()->getEffectiveBoolValue("EmuCore", "ManuallySetRealTimeClock", false);
m_ui.rtcDateTime->setEnabled(enabled);
m_ui.rtcUseSystemLocaleFormat->setEnabled(enabled);
}
void EmulationSettingsWidget::onUseSystemLocaleFormatChanged()
{
const bool enabled = dialog()->getEffectiveBoolValue("EmuCore", "UseSystemLocaleFormat", false);
m_ui.rtcDateTime->setDisplayFormat(enabled ? QLocale::system().dateTimeFormat(QLocale::ShortFormat) : "yyyy-MM-dd HH:mm:ss");
}
@@ -24,6 +24,7 @@ private:
void updateOptimalFramePacing();
void updateUseVSyncForTimingEnabled();
void onManuallySetRealTimeClockChanged();
void onUseSystemLocaleFormatChanged();
Ui::EmulationSettingsWidget m_ui;
};
+47 -1
View File
@@ -22,6 +22,9 @@
<property name="text">
<string>Slow-Motion Speed:</string>
</property>
<property name="buddy">
<cstring>slowMotionSpeed</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -35,6 +38,9 @@
<property name="text">
<string>Normal Speed:</string>
</property>
<property name="buddy">
<cstring>normalSpeed</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
@@ -42,6 +48,9 @@
<property name="text">
<string>Fast-Forward Speed:</string>
</property>
<property name="buddy">
<cstring>fastForwardSpeed</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
@@ -170,6 +179,9 @@
<property name="text">
<string>EE Cycle Rate:</string>
</property>
<property name="buddy">
<cstring>eeCycleRate</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
@@ -177,6 +189,9 @@
<property name="text">
<string>EE Cycle Skipping:</string>
</property>
<property name="buddy">
<cstring>eeCycleSkipping</cstring>
</property>
</widget>
</item>
</layout>
@@ -206,6 +221,9 @@
<property name="text">
<string>Maximum Frame Latency:</string>
</property>
<property name="buddy">
<cstring>maxFrameLatency</cstring>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
@@ -266,13 +284,20 @@
<item row="0" column="1">
<widget class="QDateTimeEdit" name="rtcDateTime"/>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="rtcUseSystemLocaleFormat">
<property name="text">
<string>Use System Locale Format</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -284,6 +309,27 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>normalSpeed</tabstop>
<tabstop>fastForwardSpeed</tabstop>
<tabstop>slowMotionSpeed</tabstop>
<tabstop>eeCycleRate</tabstop>
<tabstop>eeCycleSkipping</tabstop>
<tabstop>MTVU</tabstop>
<tabstop>threadPinning</tabstop>
<tabstop>cheats</tabstop>
<tabstop>hostFilesystem</tabstop>
<tabstop>precacheCDVD</tabstop>
<tabstop>fastCDVD</tabstop>
<tabstop>maxFrameLatency</tabstop>
<tabstop>optimalFramePacing</tabstop>
<tabstop>syncToHostRefreshRate</tabstop>
<tabstop>vsync</tabstop>
<tabstop>useVSyncForTiming</tabstop>
<tabstop>skipPresentingDuplicateFrames</tabstop>
<tabstop>manuallySetRealTimeClock</tabstop>
<tabstop>rtcDateTime</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+7 -8
View File
@@ -19,14 +19,13 @@ FolderSettingsWidget::FolderSettingsWidget(SettingsWindow* settings_dialog, QWid
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.cheats, m_ui.cheatsBrowse, m_ui.cheatsOpen, m_ui.cheatsReset, "Folders", "Cheats", Path::Combine(EmuFolders::DataRoot, "cheats"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.covers, m_ui.coversBrowse, m_ui.coversOpen, m_ui.coversReset, "Folders", "Covers", Path::Combine(EmuFolders::DataRoot, "covers"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.snapshots, m_ui.snapshotsBrowse, m_ui.snapshotsOpen, m_ui.snapshotsReset, "Folders", "Snapshots", Path::Combine(EmuFolders::DataRoot, "snaps"));
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.organizeScreenshotsByGame, "EmuCore/GS", "OrganizeScreenshotsByGame", false);
connect(m_ui.organizeScreenshotsByGame, &QCheckBox::checkStateChanged, this, [](int state) {
GSConfig.OrganizeScreenshotsByGame = (state == Qt::Checked);
});
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.saveStates, m_ui.saveStatesBrowse, m_ui.saveStatesOpen, m_ui.saveStatesReset, "Folders", "SaveStates", Path::Combine(EmuFolders::DataRoot, "sstates"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.videoDumpingDirectory, m_ui.videoDumpingDirectoryBrowse, m_ui.videoDumpingDirectoryOpen, m_ui.videoDumpingDirectoryReset, "Folders", "Videos", Path::Combine(EmuFolders::DataRoot, "videos"));
dialog()->registerWidgetHelp(m_ui.organizeScreenshotsByGame, tr("Organize Screenshots by Game"), tr("Unchecked"),
tr("When enabled, screenshots will be saved in a folder with the game's name, instead of all being saved in the Snapshots folder"));
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.organizeSnapshotsByGame, "EmuCore/GS", "OrganizeScreenshotsByGame", false);
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.saveStates, m_ui.saveStatesBrowse, m_ui.saveStatesOpen, m_ui.saveStatesReset,
"Folders", "SaveStates", Path::Combine(EmuFolders::DataRoot, "sstates"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.videoDumpingDirectory, m_ui.videoDumpingDirectoryBrowse, m_ui.videoDumpingDirectoryOpen, m_ui.videoDumpingDirectoryReset,
"Folders", "Videos", Path::Combine(EmuFolders::DataRoot, "videos"));
dialog()->registerWidgetHelp(m_ui.organizeSnapshotsByGame, tr("Organize Snapshots by Game"), tr("Unchecked"),
tr("Saves snapshots to per-game subfolders instead of a shared folder."));
}
FolderSettingsWidget::~FolderSettingsWidget() = default;
+66 -3
View File
@@ -46,6 +46,12 @@
<property name="text">
<string>Used for storing shaders, game list, and achievement data.</string>
</property>
<property name="buddy">
<cstring>cache</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -86,6 +92,12 @@
<property name="text">
<string>Used for storing .pnach files containing game cheats.</string>
</property>
<property name="buddy">
<cstring>cheats</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -124,12 +136,18 @@
<item row="0" column="0" colspan="4">
<widget class="QLabel" name="snaphotsLabel">
<property name="text">
<string>Used for screenshots and saving GS dumps.</string>
<string>Used for saving screenshots and GS dumps.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>snapshots</cstring>
</property>
</widget>
</item>
<item row="2" column="0" colspan="4">
<widget class="QCheckBox" name="organizeScreenshotsByGame">
<widget class="QCheckBox" name="organizeSnapshotsByGame">
<property name="text">
<string>Save Snapshots in Game-Specific Folders</string>
</property>
@@ -149,6 +167,12 @@
<property name="text">
<string>Used for storing save states.</string>
</property>
<property name="buddy">
<cstring>saveStates</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -213,6 +237,12 @@
<property name="text">
<string>Used for storing covers in the game grid/Big Picture UIs.</string>
</property>
<property name="buddy">
<cstring>covers</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -253,6 +283,12 @@
<property name="text">
<string>Used for storing video captures.</string>
</property>
<property name="buddy">
<cstring>videoDumpingDirectory</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -261,7 +297,7 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -273,6 +309,33 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>cache</tabstop>
<tabstop>cacheBrowse</tabstop>
<tabstop>cacheOpen</tabstop>
<tabstop>cacheReset</tabstop>
<tabstop>cheats</tabstop>
<tabstop>cheatsBrowse</tabstop>
<tabstop>cheatsOpen</tabstop>
<tabstop>cheatsReset</tabstop>
<tabstop>snapshots</tabstop>
<tabstop>snapshotsBrowse</tabstop>
<tabstop>snapshotsOpen</tabstop>
<tabstop>snapshotsReset</tabstop>
<tabstop>organizeSnapshotsByGame</tabstop>
<tabstop>saveStates</tabstop>
<tabstop>saveStatesBrowse</tabstop>
<tabstop>saveStatesOpen</tabstop>
<tabstop>saveStatesReset</tabstop>
<tabstop>covers</tabstop>
<tabstop>coversBrowse</tabstop>
<tabstop>coversOpen</tabstop>
<tabstop>coversReset</tabstop>
<tabstop>videoDumpingDirectory</tabstop>
<tabstop>videoDumpingDirectoryBrowse</tabstop>
<tabstop>videoDumpingDirectoryOpen</tabstop>
<tabstop>videoDumpingDirectoryReset</tabstop>
</tabstops>
<resources>
<include location="../resources/resources.qrc"/>
</resources>
+13 -4
View File
@@ -54,13 +54,13 @@
<item>
<widget class="QTreeView" name="cheatList">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
<enum>QAbstractItemView::SelectionMode::NoSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
<enum>QAbstractItemView::SelectionBehavior::SelectItems</enum>
</property>
</widget>
</item>
@@ -93,7 +93,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -114,6 +114,15 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>enableCheats</tabstop>
<tabstop>searchText</tabstop>
<tabstop>cheatList</tabstop>
<tabstop>enableAll</tabstop>
<tabstop>disableAll</tabstop>
<tabstop>allCRCsCheckbox</tabstop>
<tabstop>reloadCheats</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

Some files were not shown because too many files have changed in this diff Show More