Compare commits

...

114 Commits

Author SHA1 Message Date
Rosalie Wanders 32a39afc75 Package: v0.2.9 2023-01-03 19:09:35 +01:00
Rosalie Wanders fd967cc2a3 RMG: correct commonInterfaceStyleSettings() in SettingsDialog 2023-01-03 18:39:51 +01:00
Rosalie Wanders 8c0bb09667 RMG: improve behavior of Hotkeys tab in SettingsDialog 2023-01-03 18:28:38 +01:00
Rosalie Wanders 8c753d6cfe RMG: add 'Current Save State' tab to Hotkeys tab in SettingsDialog 2023-01-03 18:02:40 +01:00
Rosalie Wanders 276e681f29 RMG-Core: add save state slot keybinding settings 2023-01-03 18:00:48 +01:00
Rosalie Wanders f23b17e1b8 RMG: "Choose ROM Directory" -> "Change ROM Directory" 2023-01-03 17:39:47 +01:00
Rosalie Wanders f1e10fa4b1 RMG: add icon for 'Current Save State' & 'GS Button' 2023-01-03 17:39:20 +01:00
Rosalie Wanders be67cd03cb RMG-Core: correct CORE_INSTALL_PREFIX name 2023-01-03 16:37:42 +01:00
Rosalie Wanders d7dfe12fb4 RMG: don't use setCurrentIndex() in MainWindow.cpp 2023-01-03 16:25:53 +01:00
Rosalie Wanders be437afd2f RMG: save geomtry in closeEvent() when emulation isn't running 2023-01-03 16:10:26 +01:00
Rosalie Wanders f72688773a RMG: don't switch back to ROM browser in closeEvent() 2023-01-03 15:07:44 +01:00
Rosalie Wanders fb328d8d92 RMG: install qt message handler 2023-01-03 14:40:51 +01:00
Rosalie Wanders 36e6d2fcc7 RMG: add -q/--quit-after-emulation commandline option 2023-01-03 13:57:08 +01:00
Rosalie Wanders 7b3293341b RMG: check visibility of OGLWidget in VidExt_OglSetup() 2023-01-03 13:50:57 +01:00
Rosalie Wanders 0a7b72a51b RMG: only set current directory in when PORTABLE_INSTALL is defined 2023-01-03 13:10:19 +01:00
Rosalie Wanders 6265973cc6 RMG-Core: use std::filesystem::path in osal_dynlib functions 2023-01-03 13:06:48 +01:00
Rosalie Wanders f1edc47a80 RMG-Core: correct osal_files_get_file_time for Windows 2023-01-03 12:53:06 +01:00
Rosalie Wanders 8f60d5c80f RMG-Core: only free buffer when opening a cartridge 2023-01-02 12:54:19 +01:00
Rosalie Wanders c42489fa81 RMG: correct 64DD disk file extension in RomBrowserEmptyWidget 2023-01-02 00:07:39 +01:00
Rosalie Wanders 66b60c988a RMG: update copyright year in AboutDialog 2023-01-02 00:04:22 +01:00
Rosalie Wanders 5d20e98aba Package: v0.2.8 2023-01-01 13:55:11 +01:00
Rosalie Wanders 617ee3f96c RMG: only call on_VidExt_ResizeWindow when not returning from fullscreen 2023-01-01 13:36:48 +01:00
Rosalie Wanders 083f7c2e4f RMG: simplify vidext function implementation 2023-01-01 13:14:07 +01:00
Rosalie Wanders a8ea1795bf Script: simplify BundleDependencies.sh 2023-01-01 12:43:49 +01:00
Rosalie Wanders 8a6cb4b5a8 RMG: configure toolbar & statusbar visibility in configureUI 2022-12-31 14:17:52 +01:00
Rosalie Wanders 53edf065a5 RMG: don't return when over the item limit in RomSearcherThread 2022-12-31 14:17:52 +01:00
Rosalie Wanders bf65be483d RMG: set current view widget in RomBrowserWidget constructor 2022-12-31 13:22:02 +01:00
Rosalie Wanders 1e90047368 3rdParty: use CMAKE_CONFIGURE_ARGS for mupen64plus-rsp-parallel 2022-12-30 14:24:07 +01:00
Rosalie Wanders abd1160f87 RMG: disable 'Uniform Size (Grid View)' during emulation 2022-12-29 01:34:49 +01:00
Rosalie Wanders 55d7dd9d89 RMG-Core: improve error message in read_raw_file 2022-12-29 01:18:58 +01:00
Rosalie Wanders b7eb1afb86 Package: v0.2.7 2022-12-29 00:28:43 +01:00
Rosalie Wanders 25ddb4a531 RMG: only refresh ROM list in SetGridViewUniformSizes when in grid view 2022-12-29 00:17:44 +01:00
Rosalie Wanders 79f7c2224b RMG: enable smooth scrolling in RomBrowserWidget 2022-12-29 00:14:58 +01:00
Rosalie Wanders 8adda4fc7d RMG: add more icons to the View menu 2022-12-29 00:14:38 +01:00
Rosalie Wanders 5d23743133 RMG: add 'Uniform Size (Grid View)' to View menu 2022-12-29 00:14:03 +01:00
Rosalie Wanders 2558e5d6a6 RMG-Core: add RomBrowser_GridViewUniformItemSizes setting 2022-12-29 00:08:49 +01:00
Rosalie Wanders 859b81b7e0 RMG: fixup cover filename in RomBrowserWidget 2022-12-28 23:09:46 +01:00
Rosalie Wanders 30369f58a9 3rdParty: update mupen64plus-core 2022-12-28 17:47:04 +01:00
Rosalie Wanders 30afc80a64 3rdParty: update mupen64plus-core 2022-12-28 17:23:32 +01:00
Rosalie Wanders 949eee8d08 RMG: improve updater script on windows 2022-12-28 16:34:40 +01:00
Rosalie Wanders 1fae30bd33 Script: also bundle libjpeg-8.dll for windows in BundleDependencies.sh 2022-12-28 16:18:59 +01:00
Rosalie Wanders d8817bf0f3 RMG: add disk files to RomBrowserEmptyWidget 2022-12-28 01:00:31 +01:00
Rosalie Wanders 5279b10b67 RMG: show core error even when statusbar is disabled 2022-12-28 00:36:21 +01:00
Rosalie Wanders 391f46be22 Package: update screenshots 2022-12-28 00:16:21 +01:00
Rosalie Wanders 44809bf28f Package: v0.2.6 2022-12-28 00:12:09 +01:00
Rosalie Wanders 3cd113c46f RMG: show context menu even when not having a selection 2022-12-28 00:10:56 +01:00
Rosalie Wanders 3d195c6a4d RMG: overhaul UI 2022-12-27 23:54:54 +01:00
Rosalie Wanders 423d30ac29 RMG-Core: introduce CoreClearRomHeaderAndSettingsCache() 2022-12-27 23:26:42 +01:00
Rosalie Wanders b07b73e005 RMG-Core: implement support for M64CMD_DISK_OPEN & M64CMD_DISK_CLOSE 2022-12-27 23:26:40 +01:00
Rosalie Wanders 418d9c4684 3rdParty: update mupen64plus-core 2022-12-27 23:26:38 +01:00
Rosalie Wanders 1801a48eaa 3rdParty: update GLideN64 2022-12-27 23:26:36 +01:00
Rosalie Wanders 8e8fbcdd2e Package: update archlinux PKGBUILD 2022-12-27 23:26:19 +01:00
Rosalie Wanders d5834de5e7 RMG-Input: disable Input_RemoveDuplicateMappings on linux 2022-12-27 23:25:53 +01:00
Rosalie Wanders a52e3fe1e5 RMG-Core: add more GUI settings 2022-12-19 21:07:45 +01:00
Rosalie Wanders eb261bc2bf RMG-Core: fix default save state/game directory being wrong 2022-12-19 21:07:45 +01:00
Rosalie Wanders 7b5f735714 RMG-Core: move over cheat settings in CoreUpdateCheat() 2022-12-19 13:27:10 +01:00
Rosalie Wanders 404c2c4f43 RMG: return M64ERR_UNSUPPORTED in VidExt_List{Modes,Rates} 2022-12-19 13:27:07 +01:00
Rosalie Wanders 57f1a33e51 3rdParty: update GLideN64 2022-12-19 13:27:05 +01:00
Rosalie Wanders fa277352b0 3rdParty: update angrylion-rdp-plus 2022-12-19 13:27:02 +01:00
Rosalie Wanders f502984e05 3rdParty: use $(MAKE) instead of make 2022-12-19 13:26:56 +01:00
Rosalie Wanders c205b5bfd3 3rdParty: update mupen64plus-video-parallel 2022-12-15 18:35:38 +01:00
Rosalie Wanders c6625e137d Package: v0.2.5 2022-12-14 20:46:09 +01:00
Rosalie Wanders 0ad7e1d715 Package: update & add screenshots 2022-12-14 20:38:45 +01:00
Rosalie Wanders 1f8d5be9a7 Package: update ArchLinux PKGBUILD 2022-12-14 20:30:12 +01:00
Rosalie Wanders 21673affbb RMG-Core: include Config.hpp in Directories.cpp 2022-12-14 20:28:11 +01:00
Rosalie Wanders a0a1255ef3 3rdParty: update mupen64plus-video-parallel 2022-12-14 20:16:26 +01:00
Rosalie Wanders 206a5ec7f6 3rdParty: update mupen64plus-video-angrylion-plus 2022-12-14 20:16:18 +01:00
Rosalie Wanders 8661273568 Script: update DownloadStyles.sh 2022-12-14 19:49:16 +01:00
Rosalie Wanders 6aed340831 RMG: call CoreGetVersion() in main.cpp 2022-12-14 19:13:38 +01:00
Rosalie Wanders f7bfb6aea1 RMG: remove Config.hpp include from main.cpp 2022-12-14 19:10:22 +01:00
Rosalie Wanders c5ae117cf8 RMG: remove Config.hpp include in RomBrowserWidget 2022-12-14 18:56:26 +01:00
Rosalie Wanders a1c9dc3f12 RMG: slightly redesign RomInfoDialog 2022-12-14 18:54:59 +01:00
Rosalie Wanders 0f3e70706d RMG-Input: allow removing/resetting the main profile 2022-12-14 18:50:55 +01:00
Rosalie Wanders 722ca67b87 RMG-Input: enable close button on all dialogs 2022-12-14 18:41:34 +01:00
Rosalie Wanders 981897df8c RMG-Audio: enable close button on all dialogs 2022-12-14 18:41:28 +01:00
Rosalie Wanders 3a066dfc03 RMG: enable close button on all dialogs 2022-12-14 18:41:06 +01:00
Rosalie Wanders 870481e34e Data: remove stylesheet.qss 2022-12-14 18:27:23 +01:00
Rosalie Wanders 9f5f2334d7 RMG: remove Config.hpp & use CoreGetVersion() 2022-12-14 18:26:30 +01:00
Rosalie Wanders 330a66c81c RMG-Core: introduce & use CoreGetVersion() 2022-12-14 18:26:01 +01:00
Rosalie Wanders 92b4d4dc32 RMG: remove 'About' button in plugins tab in SettingsDialog 2022-12-14 18:15:31 +01:00
Rosalie Wanders 531fab51be RMG: add correct info layouts to User Interface tab in SettingsDialog 2022-12-14 00:21:14 +01:00
Rosalie Wanders 3f027fad63 RMG-Input: force call on_controllerPluggedCheckBox_toggled() 2022-12-14 00:13:35 +01:00
Rosalie Wanders 6eb46dd63c RMG: also load misc settings tab in SettingsDialog 2022-12-13 23:53:58 +01:00
Rosalie Wanders 70830ae016 RMG-Input: do nothing in CheckInputDeviceSettings() when combobox is empty 2022-12-13 23:31:56 +01:00
Rosalie Wanders 8a88a736ad RMG-Input: actually add required svg resource 2022-12-13 23:02:39 +01:00
Rosalie Wanders d580d2be9a RMG-Input: add Z-Trigger to the svg & hook it up to ControllerImageWidget 2022-12-13 22:53:03 +01:00
Rosalie Wanders 0e3fc0e981 RMG: fix empty style setting 2022-12-13 21:57:47 +01:00
Rosalie Wanders 4907b2dd32 RMG: use fallback stylesheet 2022-12-13 21:57:44 +01:00
Rosalie Wanders 3ad2a5760e RMG: make ui_Stylesheet_Setup windows exclusive 2022-12-13 21:42:53 +01:00
Rosalie Wanders e474a09642 ci: execute DownloadStyles.sh on windows 2022-12-13 21:38:07 +01:00
Rosalie Wanders f5296c9f79 RMG: add style setting to SettingsDialog 2022-12-13 21:37:52 +01:00
Rosalie Wanders f8e1ed3920 RMG-Core: add GUI_Style setting 2022-12-13 21:33:01 +01:00
Rosalie Wanders 9aeca88946 Script: add DownloadStyles.sh 2022-12-13 21:32:43 +01:00
Rosalie Wanders 3961c066be ci: specify key for ccache-action 2022-12-13 16:11:32 +01:00
Rosalie Wanders 4aeb3da6eb cmake: respect C/C++ compiler in 3rdParty projects 2022-12-13 15:40:50 +01:00
Rosalie Wanders bf9e370ddd ci: use ccache 2022-12-13 15:26:29 +01:00
Rosalie Wanders 7c72fa98fd cmake: add USE_CCACHE option 2022-12-13 15:25:25 +01:00
Rosalie Wanders 0824586db9 RMG: remove Debugger checkbox from SettingsDialog 2022-12-13 14:51:56 +01:00
Rosalie Wanders 8a22c6d929 RMG: rename Interface tab to User Interface in SettingsDialog 2022-12-13 14:50:58 +01:00
Rosalie Wanders 8f76619d7d cmake: add USE_QT5 option 2022-12-13 13:48:15 +01:00
Rosalie Wanders d94d9fc5d7 3rdParty: update GLideN64 2022-12-12 21:58:27 +01:00
Rosalie Wanders 38312f8add Script: use windeployqt-qt6 in BundleDependencies.sh 2022-12-12 21:58:27 +01:00
Rosalie Wanders d52b1e1b5a RMG: don't link to sdl 2022-12-12 21:58:27 +01:00
Rosalie Wanders 06c9d9b826 3rdParty: update parallel-rdp-standalone 2022-12-12 21:58:27 +01:00
Rosalie Wanders 20a669dbbb 3rdParty: update angrylion-rdp-plus 2022-12-12 21:58:27 +01:00
Rosalie Wanders 68c8c431a2 3rdParty: update GLideN64 2022-12-12 21:58:27 +01:00
Rosalie Wanders d6b1fdfa7b ci: use Qt6 packages 2022-12-12 21:58:27 +01:00
Rosalie Wanders 6ac9208c7f RMG-Input: use Qt6 2022-12-12 21:58:27 +01:00
Rosalie Wanders fdcfaf3fad RMG-Audio: use Qt6 2022-12-12 21:58:27 +01:00
Rosalie Wanders dd08dfafc8 RMG: use Qt6 2022-12-12 21:58:27 +01:00
Rosalie Wanders 22a019abb1 RMG: remove unused included header 2022-12-12 21:58:27 +01:00
Rosalie Wanders e112ae75eb RMG-Input: prepare for Qt6 2022-12-11 22:35:18 +01:00
Rosalie Wanders 0de1073094 RMG: prepare for Qt6 2022-12-11 22:35:06 +01:00
Rosalie Wanders 18a1a6afe6 RMG-Input: fix 'full match' not being correct in ControllerWidget 2022-12-10 22:17:16 +01:00
154 changed files with 4877 additions and 2101 deletions
+12 -2
View File
@@ -9,11 +9,14 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: hendrikmuhs/ccache-action@v1.2.5
with:
key: Linux
- name: Install Packages
run: |
sudo apt-get -qq update
sudo apt-get upgrade
sudo apt-get -y install cmake libhidapi-dev libsamplerate0-dev libspeex-dev libminizip-dev libsdl2-dev libfreetype6-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config zlib1g-dev binutils-dev libspeexdsp-dev qtbase5-dev libqt5svg5-dev build-essential nasm git zip
sudo apt-get -y install cmake libhidapi-dev libsamplerate0-dev libspeex-dev libminizip-dev libsdl2-dev libfreetype6-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config zlib1g-dev binutils-dev libspeexdsp-dev qt6-base-dev libqt6svg6-dev build-essential nasm git zip
- name: Prepare Environment
run: |
echo "GIT_REVISION=$(git describe --tags --always)" >> $GITHUB_ENV
@@ -32,6 +35,9 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: hendrikmuhs/ccache-action@v1.2.5
with:
key: Windows
- uses: msys2/setup-msys2@v2
with:
path-type: inherit
@@ -45,7 +51,7 @@ jobs:
mingw-w64-x86_64-libpng
mingw-w64-x86_64-SDL2
mingw-w64-x86_64-jasper
mingw-w64-x86_64-qt5
mingw-w64-x86_64-qt6
mingw-w64-x86_64-SDL2
mingw-w64-x86_64-hidapi
mingw-w64-x86_64-speexdsp
@@ -53,6 +59,7 @@ jobs:
mingw-w64-x86_64-python3-pip
mingw-w64-x86_64-python3-pyopenssl
mingw-w64-x86_64-nasm
mingw-w64-x86_64-minizip
git
- name: Prepare Environment
run: |
@@ -62,6 +69,9 @@ jobs:
- name: Build RMG (Portable)
run: ./Source/Script/Build.sh Release
shell: msys2 {0}
- name: Download Styles
run: ./Source/Script/DownloadStyles.sh
shell: msys2 {0}
- name: Create Installer
run: .\Build\Release\Source\Installer\CreateInstaller.bat
- name: Upload RMG (Portable)
+20 -1
View File
@@ -7,6 +7,8 @@ option(PORTABLE_INSTALL "Portable Installation" ON)
option(NO_GIT_CLONE "Disables git clone usage for 3rdParty dependencies" OFF)
option(UPDATER "Enables updater" ${PORTABLE_INSTALL})
option(DISCORD_RPC "Enables Discord Rich Presence" ON)
option(USE_QT5 "Enables Qt5 instead of Qt6 (will be removed in the future)" OFF)
option(USE_CCACHE "Enables usage of ccache when ccache has been found" ON)
project(RMG)
@@ -19,6 +21,15 @@ execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (USE_CCACHE)
find_program(CCACHE_FOUND ccache)
if (CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
else(CCACHE_FOUND)
set(USE_CCACHE OFF)
endif(CCACHE_FOUND)
endif(USE_CCACHE)
if (NOT PORTABLE_INSTALL AND (WIN32 OR MSYS))
message(WARNING "Not-Portable build not supported on windows, re-enabling PORTABLE_INSTALL!")
set(PORTABLE_INSTALL ON)
@@ -48,6 +59,14 @@ else()
set(ICON_INSTALL_PATH "share/icons/hicolor/scalable/apps/")
endif()
if (USE_QT5)
set(QT_VERSION "Qt5")
set(USE_QT6 OFF)
else(USE_QT5)
set(QT_VERSION "Qt6")
set(USE_QT6 ON)
endif(USE_QT5)
add_subdirectory(Source/3rdParty)
add_subdirectory(Source/RMG-Core)
@@ -75,7 +94,7 @@ endif()
install(FILES ${MUPEN64PLUSCORE_LIB}
DESTINATION ${CORE_INSTALL_PATH}
)
install(FILES ${MUPEN64PLUSCORE_INI} Data/font.ttf Data/stylesheet.qss
install(FILES ${MUPEN64PLUSCORE_INI} Data/font.ttf
DESTINATION ${DATA_INSTALL_PATH}
)
file(GLOB GENERATED_CHEAT_FILES ${CMAKE_SOURCE_DIR}/Data/Cheats/Generated/*.cht)
+2 -2
View File
@@ -11,8 +11,8 @@ license=('GPLv3')
provides=("$_pkgname")
conflicts=("$_pkgname")
depends=("hidapi" "libsamplerate" "minizip" "sdl2" "zlib" "freetype2" "qt5-base" "qt5-svg")
makedepends=("git" "pkg-config" "nasm" "cmake" "rustup")
depends=("hidapi" "libsamplerate" "minizip" "sdl2" "zlib" "freetype2" "qt6-base" "qt6-svg" "xdg-user-dirs")
makedepends=("git" "pkg-config" "nasm" "cmake" "cargo")
source=("git+https://github.com/Rosalie241/${_pkgname}.git")
sha256sums=('SKIP')
Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 47 KiB

@@ -18,13 +18,104 @@
<caption>During A Game</caption>
<image type="source">https://github.com/Rosalie241/RMG/raw/master/Package/Screenshots/InGame.png</image>
</screenshot>
<screenshot type="default">
<caption>Cheats</caption>
<image type="source">https://github.com/Rosalie241/RMG/raw/master/Package/Screenshots/Cheats.png</image>
</screenshot>
<screenshot type="default">
<caption>Settings</caption>
<image type="source">https://github.com/Rosalie241/RMG/raw/master/Package/Screenshots/Settings.png</image>
</screenshot>
<screenshot type="default">
<caption>Input Settings</caption>
<image type="source">https://github.com/Rosalie241/RMG/raw/master/Package/Screenshots/InputSettings.png</image>
</screenshot>
</screenshots>
<description/>
<releases>
<release version="v0.2.9" date="2023-01-03" type="stable">
<description>
<p>Changes:</p>
<ul>
<li>Fix wrong 64DD Disk extension being listed in empty ROM browser</li>
<li>Fix memory corruption when having 64DD Disk files</li>
<li>Fix possible crash when render window wasn't visible yet</li>
<li>Fix RMG changing the current directory on non-portable installs</li>
<li>Remove Qt warning messages (you can view them by setting RMG_SHOW_DEBUG_QT_MESSAGES to 1)</li>
<li>Change "Choose ROM Directory" to "Change ROM Directory"</li>
<li>Add -q/--quit-after-emulation commandline option</li>
<li>Add 2 more icons to menubar menus/items</li>
<li>Add "Current Save State" tab to Hotkeys tab in settings dialog (this allows you to use a hotkey to change save state slots)</li>
<li>Improve behavior of Hotkeys tab in settings dialog</li>
<li>Improve behavior of window when exiting RMG while in-game</li>
</ul>
</description>
</release>
<release version="v0.2.8" date="2023-01-01" type="stable">
<description>
<p>Changes:</p>
<ul>
<li>Fix 'Uniform Size (Grid View)' not being disabled during emulation</li>
<li>Fix toolbar not respecting the view setting</li>
<li>Fix being stuck at the loading screen when having more ROMs than the ROM search limit</li>
<li>Improve error message when opening a ROM fails</li>
</ul>
</description>
</release>
<release version="v0.2.7" date="2022-12-29" type="stable">
<description>
<p>Changes:</p>
<ul>
<li>Fix core error not showing when the statusbar was hidden</li>
<li>Fix .ndd/.64d not being in the empty ROM Browser widget</li>
<li>Fix .jpg/.jpeg files not working on covers on Windows</li>
<li>Fix updater script not copying subdirectories on Windows (for portable installs)</li>
<li>Fix 64DD Disks which required the development IPL not working</li>
<li>Fix 64DD Disks showing the wrong internal ROM name (this fix requires clearing the ROM cache)</li>
<li>Fix cover filenames allowing invalid characters (they will now be replaced by _)</li>
<li>Add more icons to View menu in the menu bar</li>
<li>Add 'Uniform Size (Grid View)' to View menu in the menu bar</li>
<li>Add smooth scrolling to List View and Grid View</li>
</ul>
</description>
</release>
<release version="v0.2.6" date="2022-12-28" type="stable">
<description>
<p>Changes:</p>
<ul>
<li>Fix default save state/game directory being incorrect on first run (on non-portable installs)</li>
<li>Fix angrylion-rdp-plus not loading settings correctly</li>
<li>Fix cheat settings not moving over when renaming a cheat</li>
<li>Remove fullscreen resolution combobox from GLideN64 because it did nothing</li>
<li>Remove File menu from menu bar</li>
<li>Implement disk support without requiring a cartridge</li>
<li>Add toolbar</li>
<li>Add View menu to menu bar</li>
<li>Add Grid view to ROM browser</li>
<li>Add icons to all menu bar items</li>
<li>Add log dialog</li>
</ul>
</description>
</release>
<release version="v0.2.5" date="2022-12-14" type="stable">
<description>
<p>Changes:</p>
<ul>
<li>Fix incorrect controller being selected in RMG-Input when having 2 controllers with the same name</li>
<li>Fix some UI elements being enabled while the 'Controller Is Plugged In' checkbox is disabled in RMG-Input</li>
<li>Fix extra padding being added when having a controller selected and opening RMG-Input</li>
<li>Fix creating a new profile in GLideN64</li>
<li>Add Z-Trigger visualization in RMG-Input</li>
<li>Remove Debugger checkbox in the settings dialog because it did nothing</li>
<li>Remove About buttons in the plugin tab of the settings dialog because it did nothing</li>
<li>Implement close button on all dialogs</li>
<li>Implement custom style support (for Windows only)</li>
<li>Implement the ability to remove/reset the main profile in RMG-Input</li>
<li>Rename Interface tab in settings dialog to User Interface</li>
<li>Migrate to Qt6 (currently the flatpak will remain Qt5)</li>
</ul>
</description>
</release>
<release version="v0.2.4" date="2022-12-08" type="stable">
<description>
<p>Changes:</p>
+25 -14
View File
@@ -24,9 +24,20 @@ else(WIN32)
set(CORE_FILE "libmupen64plus.so")
endif(WIN32)
set(BASE_CMAKE_CONFIGURE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
if (USE_CCACHE)
set(CMAKE_CONFIGURE_ARGS ${BASE_CMAKE_CONFIGURE_ARGS} -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache)
set(MAKE_CC_COMPILER "ccache ${CMAKE_C_COMPILER}")
set(MAKE_CXX_COMPILER "ccache ${CMAKE_CXX_COMPILER}")
else(USE_CCACHE)
set(CMAKE_CONFIGURE_ARGS ${BASE_CMAKE_CONFIGURE_ARGS})
set(MAKE_CC_COMPILER "${CMAKE_C_COMPILER}")
set(MAKE_CXX_COMPILER "${CMAKE_CXX_COMPILER}")
endif(USE_CCACHE)
if(NOT NO_GIT_CLONE)
set(MUPEN64PLUSCORE_URL "https://github.com/mupen64plus/mupen64plus-core")
set(MUPEN64PLUSCORE_TAG "ba9a52483052248b67c324e3fd0e073b807bbea4")
set(MUPEN64PLUSCORE_URL "https://github.com/Rosalie241/mupen64plus-core")
set(MUPEN64PLUSCORE_TAG "3b6523edd467eb9224310e0862005c7e5ae9c290")
set(MUPEN64PLUS_RSP_CXD4_URL "https://github.com/mupen64plus/mupen64plus-rsp-cxd4")
set(MUPEN64PLUS_RSP_CXD4_TAG "39f79201baa15890c4cbae92f2215a634cc3ee6d")
@@ -44,13 +55,13 @@ if(NOT NO_GIT_CLONE)
set(MUPEN64PLUS_INPUT_GCA_TAG "21639fb13dfa797a7c0949ffd9bbda9a3456fc69")
set(MUPEN64PLUS_GFX_ANGRYLION_URL "https://github.com/Rosalie241/angrylion-rdp-plus")
set(MUPEN64PLUS_GFX_ANGRYLION_TAG "9d71074f6b71750e99ad06a713f28a9c32ad15cb")
set(MUPEN64PLUS_GFX_ANGRYLION_TAG "158e74d4ec1c818289cd19c3a05e498c3ceff758")
set(MUPEN64PLUS_GFX_GLIDEN64_URL "https://github.com/gonetz/GLideN64")
set(MUPEN64PLUS_GFX_GLIDEN64_TAG "ff47414c2bd6e572872e9148b2f3e1dbc83e5fee")
set(MUPEN64PLUS_GFX_GLIDEN64_TAG "7bbde56cf08ff96108efb592848e5b6eaac293c9")
set(MUPEN64PLUS_GFX_PARALLEL_URL "https://github.com/Rosalie241/parallel-rdp-standalone")
set(MUPEN64PLUS_GFX_PARALLEL_TAG "693f607728aca78d94ba5d45b0ce119b4ccbcd8c")
set(MUPEN64PLUS_GFX_PARALLEL_TAG "88d3626362e41aa9b011fca1f65e1c1237ddb3b2")
set(DISCORD_RPC_URL "https://github.com/discord/discord-rpc")
set(DISCORD_RPC_TAG "963aa9f3e5ce81a4682c6ca3d136cddda614db33")
@@ -65,7 +76,7 @@ ExternalProject_Add(mupen64plus-core
GIT_REPOSITORY ${MUPEN64PLUSCORE_URL}
GIT_TAG ${MUPEN64PLUSCORE_TAG}
BUILD_COMMAND make all OSD=0 NEW_DYNAREC=1 TARGET=${CORE_FILE} DEBUG=$<CONFIG:Debug> KEYBINDINGS=0
BUILD_COMMAND $(MAKE) all OSD=0 NEW_DYNAREC=1 TARGET=${CORE_FILE} DEBUG=$<CONFIG:Debug> KEYBINDINGS=0 CC=${MAKE_CC_COMPILER} CXX=${MAKE_CXX_COMPILER}
BUILD_IN_SOURCE False
BINARY_DIR ${M64P_CORE_DIR}/projects/unix
@@ -84,7 +95,7 @@ ExternalProject_Add(mupen64plus-rsp-cxd4
GIT_REPOSITORY ${MUPEN64PLUS_RSP_CXD4_URL}
GIT_TAG ${MUPEN64PLUS_RSP_CXD4_TAG}
BUILD_COMMAND make all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug> POSTFIX=
BUILD_COMMAND $(MAKE) all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug> POSTFIX= CC=${MAKE_CC_COMPILER} CXX=${MAKE_CXX_COMPILER}
BUILD_IN_SOURCE False
BINARY_DIR ${THIRDPARTY_DIR}/mupen64plus-rsp-cxd4/projects/unix
@@ -102,7 +113,7 @@ ExternalProject_Add(mupen64plus-rsp-hle
GIT_REPOSITORY ${MUPEN64PLUS_RSP_HLE_URL}
GIT_TAG ${MUPEN64PLUS_RSP_HLE_TAG}
BUILD_COMMAND make all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug>
BUILD_COMMAND $(MAKE) all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug> CC=${MAKE_CC_COMPILER} CXX=${MAKE_CXX_COMPILER}
BUILD_IN_SOURCE False
BINARY_DIR ${THIRDPARTY_DIR}/mupen64plus-rsp-hle/projects/unix
@@ -120,7 +131,7 @@ ExternalProject_Add(mupen64plus-rsp-parallel
INSTALL_COMMAND ""
BUILD_IN_SOURCE True
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
CMAKE_ARGS ${CMAKE_CONFIGURE_ARGS}
BUILD_BYPRODUCTS ${THIRDPARTY_DIR}/mupen64plus-rsp-parallel/mupen64plus-rsp-parallel.${SO_EXT}
DEPENDS mupen64plus-core
@@ -135,7 +146,7 @@ ExternalProject_Add(mupen64plus-input-raphnetraw
GIT_REPOSITORY ${MUPEN64PLUS_INPUT_RAPHNET_URL}
GIT_TAG ${MUPEN64PLUS_INPUT_RAPHNET_TAG}
BUILD_COMMAND make all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug>
BUILD_COMMAND $(MAKE) all APIDIR=${APIDIR} DEBUG=$<CONFIG:Debug> CC=${MAKE_CC_COMPILER} CXX=${MAKE_CXX_COMPILER}
BUILD_IN_SOURCE False
BINARY_DIR ${THIRDPARTY_DIR}/mupen64plus-input-raphnetraw/projects/unix
@@ -184,7 +195,7 @@ ExternalProject_Add(mupen64plus-video-angrylion-plus
INSTALL_COMMAND ""
BUILD_IN_SOURCE True
CMAKE_ARGS -DBUILD_MUPEN64PLUS=ON -DBUILD_PROJECT64=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
CMAKE_ARGS -DBUILD_MUPEN64PLUS=ON -DBUILD_PROJECT64=OFF -DUSE_QT5=${USE_QT5} ${CMAKE_CONFIGURE_ARGS}
BUILD_BYPRODUCTS ${THIRDPARTY_DIR}/mupen64plus-video-angrylion-plus/mupen64plus-video-angrylion-plus.${SO_EXT}
DEPENDS mupen64plus-core
@@ -199,7 +210,7 @@ ExternalProject_Add(mupen64plus-video-GLideN64
INSTALL_COMMAND ""
BUILD_IN_SOURCE False
CMAKE_ARGS -DMUPENPLUSAPI=ON -DMUPENPLUSAPI_GLIDENUI=ON -DUSE_SYSTEM_LIBS=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
CMAKE_ARGS -DMUPENPLUSAPI=ON -DMUPENPLUSAPI_GLIDENUI=ON -DGLIDENUI_QT6=${USE_QT6} -DUSE_SYSTEM_LIBS=ON ${CMAKE_CONFIGURE_ARGS}
SOURCE_SUBDIR ./src/
BINARY_DIR ${GLIDEN64_BUILD_DIR}
@@ -218,7 +229,7 @@ ExternalProject_Add(mupen64plus-video-parallel
INSTALL_COMMAND ""
BUILD_IN_SOURCE True
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
CMAKE_ARGS -DUSE_QT5=${USE_QT5} ${CMAKE_CONFIGURE_ARGS}
BUILD_BYPRODUCTS ${THIRDPARTY_DIR}/mupen64plus-video-parallel/mupen64plus-video-parallel.${SO_EXT}
DEPENDS mupen64plus-core
@@ -234,7 +245,7 @@ if (DISCORD_RPC)
INSTALL_COMMAND ""
BUILD_IN_SOURCE True
CMAKE_ARGS -DBUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_POSITION_INDEPENDENT_CODE=ON
CMAKE_ARGS -DBUILD_EXAMPLES=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON ${CMAKE_CONFIGURE_ARGS}
BUILD_BYPRODUCTS ${THIRDPARTY_DIR}/discord-rpc/src/libdiscord-rpc.a
)
+2 -2
View File
@@ -7,7 +7,7 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt5 COMPONENTS Gui Widgets Core REQUIRED)
find_package(${QT_VERSION} COMPONENTS Gui Widgets Core REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
@@ -36,7 +36,7 @@ target_link_libraries(RMG-Audio
${SDL2_LIBRARIES}
${SPEEX_LIBRARIES}
${SAMPLERATE_LIBRARIES}
Qt5::Gui Qt5::Widgets
${QT_VERSION}::Gui ${QT_VERSION}::Widgets
)
target_include_directories(RMG-Audio PRIVATE
+18 -1
View File
@@ -12,11 +12,13 @@
using namespace UserInterface;
MainDialog::MainDialog(QWidget* parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
MainDialog::MainDialog(QWidget* parent) : QDialog(parent)
{
this->setupUi(this);
this->setWindowIcon(QIcon(":Resource/RMG.png"));
this->setIconsForEmulationInfoText();
this->volumeSlider->setValue(CoreSettingsGetIntValue(SettingsID::Audio_Volume));
this->muteCheckBox->setChecked(CoreSettingsGetBoolValue(SettingsID::Audio_Muted));
@@ -38,6 +40,21 @@ MainDialog::~MainDialog()
{
}
void MainDialog::setIconsForEmulationInfoText(void)
{
QLabel* labels[] = {
this->infoIconLabel_0
};
QIcon infoIcon = QIcon::fromTheme("information-line");
QPixmap infoIconPixmap = infoIcon.pixmap(16, 16);
for (QLabel* label : labels)
{
label->setPixmap(infoIconPixmap);
}
}
void MainDialog::hideEmulationInfoText(void)
{
QHBoxLayout *layouts[] = {this->emulationInfoLayout};
@@ -25,6 +25,7 @@ public:
~MainDialog(void);
private:
void setIconsForEmulationInfoText(void);
void hideEmulationInfoText(void);
private slots:
+2 -2
View File
@@ -324,7 +324,7 @@
<item>
<layout class="QHBoxLayout" name="emulationInfoLayout">
<item>
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="infoIconLabel_0">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
@@ -335,7 +335,7 @@
<string/>
</property>
<property name="pixmap">
<pixmap resource="UIResources.qrc">:/Resource/Info.ico</pixmap>
<pixmap>:/Resource/Info.ico</pixmap>
</property>
<property name="scaledContents">
<bool>false</bool>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,6 +1,5 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>Resource/RMG.png</file>
<file>Resource/Info.ico</file>
</qresource>
</RCC>
+1
View File
@@ -33,6 +33,7 @@ set(RMG_CORE_SOURCES
SaveState.cpp
Callback.cpp
Plugins.cpp
Version.cpp
Cheats.cpp
VidExt.cpp
Video.cpp
@@ -275,3 +275,10 @@ bool CoreAddCachedRomHeaderAndSettings(std::filesystem::path file, CoreRomHeader
l_CacheEntriesChanged = true;
return true;
}
bool CoreClearRomHeaderAndSettingsCache(void)
{
l_CacheEntries.clear();
l_CacheEntriesChanged = true;
return true;
}
@@ -36,4 +36,8 @@ bool CoreGetCachedRomHeaderAndSettings(std::filesystem::path file, CoreRomHeader
// for given filename succeeds
bool CoreAddCachedRomHeaderAndSettings(std::filesystem::path file, CoreRomHeader header, CoreRomSettings settings);
// returns whether clearing rom header & settings cache
// succeeds
bool CoreClearRomHeaderAndSettingsCache(void);
#endif // CORE_CACHEDROMHEADERANDSETTINGS_HPP
+4 -3
View File
@@ -16,7 +16,7 @@
//
static bool l_SetupCallbacks = false;
static std::function<void(enum CoreDebugMessageType, std::string)> l_DebugCallbackFunc;
static std::function<void(enum CoreDebugMessageType, std::string, std::string)> l_DebugCallbackFunc;
//
// Internal Functions
@@ -29,6 +29,7 @@ void CoreDebugCallback(void* context, int level, const char* message)
return;
}
std::string contextString((const char*)context);
std::string messageString(message);
// convert string encoding accordingly
@@ -41,7 +42,7 @@ void CoreDebugCallback(void* context, int level, const char* message)
messageString = CoreConvertStringEncoding(message, CoreStringEncoding::Shift_JIS);
}
l_DebugCallbackFunc((CoreDebugMessageType)level, messageString);
l_DebugCallbackFunc((CoreDebugMessageType)level, contextString, messageString);
}
void CoreStateCallback(void* context, m64p_core_param param, int value)
@@ -53,7 +54,7 @@ void CoreStateCallback(void* context, m64p_core_param param, int value)
// Exported Functions
//
bool CoreSetupCallbacks(std::function<void(enum CoreDebugMessageType, std::string)> debugCallbackFunc)
bool CoreSetupCallbacks(std::function<void(enum CoreDebugMessageType, std::string, std::string)> debugCallbackFunc)
{
l_DebugCallbackFunc = debugCallbackFunc;
l_SetupCallbacks = true;
+1 -1
View File
@@ -32,6 +32,6 @@ enum class CoreDebugMessageType
Verbose = 5
};
bool CoreSetupCallbacks(std::function<void(enum CoreDebugMessageType, std::string)> debugCallbackFunc);
bool CoreSetupCallbacks(std::function<void(enum CoreDebugMessageType, std::string, std::string)> debugCallbackFunc);
#endif // CORE_CALLBACK_HPP
+41
View File
@@ -717,6 +717,7 @@ bool CoreUpdateCheat(CoreCheat oldCheat, CoreCheat newCheat)
CoreRomHeader romHeader;
CoreRomSettings romSettings;
std::filesystem::path cheatFilePath;
CoreCheatOption cheatOption;
if (!CoreGetCurrentRomHeader(romHeader) ||
!CoreGetCurrentRomSettings(romSettings))
@@ -726,6 +727,23 @@ bool CoreUpdateCheat(CoreCheat oldCheat, CoreCheat newCheat)
cheatFilePath = get_user_cheat_file_path(romHeader, romSettings);
// copy over cheat settings when name has changed
if (oldCheat.Name != newCheat.Name)
{
CoreEnableCheat(newCheat, CoreIsCheatEnabled(oldCheat));
// only set option to new cheat when
// retrieving from old one succeeds
if (CoreGetCheatOption(oldCheat, cheatOption))
{
CoreSetCheatOption(newCheat, cheatOption);
}
// reset old cheat settings
CoreEnableCheat(oldCheat, false);
CoreResetCheatOption(oldCheat);
}
// try to find old cheat in user cheats,
// when it isnt found, it's most likely a system cheat
auto iter = find_user_cheat_using_name(oldCheat.Name);
@@ -892,6 +910,29 @@ bool CoreGetCheatOption(CoreCheat cheat, CoreCheatOption& option)
return false;
}
bool CoreResetCheatOption(CoreCheat cheat)
{
CoreRomSettings romSettings;
std::string settingSection;
std::string settingKey;
if (!cheat.HasOptions)
{
return false;
}
if (!CoreGetCurrentRomSettings(romSettings))
{
return false;
}
settingSection = romSettings.MD5 + " Cheats";
settingKey = "Cheat \"" + cheat.Name + "\" Option";
CoreSettingsSetValue(settingSection, settingKey, -1);
return true;
}
bool CoreApplyCheats(void)
{
std::string error;
+3
View File
@@ -136,6 +136,9 @@ bool CoreSetCheatOption(CoreCheat cheat, CoreCheatOption option);
// attempts to retrieve the currently's set cheat's option
bool CoreGetCheatOption(CoreCheat cheat, CoreCheatOption& option);
// attempts to reset the cheat option
bool CoreResetCheatOption(CoreCheat cheat);
// attempts to apply the enabled cheats to the currently opened ROM
bool CoreApplyCheats(void);
+1 -1
View File
@@ -13,7 +13,7 @@
#define CORE_VERSION "${GIT_VERSION}"
#ifndef PORTABLE_INSTALL
#define CORE_INSTAlL_PREFIX "${CMAKE_INSTALL_PREFIX}"
#define CORE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}"
#endif // PORTABLE_INSTALL
#endif // CORE_CONFIG_HPP
+15 -9
View File
@@ -17,29 +17,32 @@
#include "m64p/api/version.h"
#include <filesystem>
#include <string>
#include <cstring>
//
// Local Variables
//
static osal_dynlib_lib_handle l_CoreLibHandle;
static char l_CoreContextString[20];
//
// Local Functions
//
std::string find_core_lib(void)
std::filesystem::path find_core_lib(void)
{
for (const auto& entry : std::filesystem::recursive_directory_iterator(CoreGetCoreDirectory()))
{
std::string path = entry.path().string();
if (path.ends_with(OSAL_DYNLIB_LIB_EXT_STR))
std::filesystem::path path = entry.path();
if (path.has_extension() &&
path.extension() == OSAL_DYNLIB_LIB_EXT_STR)
{
return path;
}
}
return std::string();
return std::filesystem::path();
}
bool config_override_user_dirs(void)
@@ -76,11 +79,14 @@ bool config_override_user_dirs(void)
bool CoreInit(void)
{
std::string error;
std::string core_file;
m64p_error m64p_ret;
std::string error;
std::filesystem::path core_file;
m64p_error m64p_ret;
bool ret = false;
// initialize context string
std::strcpy(l_CoreContextString, "[CORE] ");
core_file = find_core_lib();
if (core_file.empty())
{
@@ -89,7 +95,7 @@ bool CoreInit(void)
return false;
}
l_CoreLibHandle = osal_dynlib_open(core_file.c_str());
l_CoreLibHandle = osal_dynlib_open(core_file);
if (l_CoreLibHandle == nullptr)
{
error = "osal_dynlib_open Failed: ";
@@ -114,7 +120,7 @@ bool CoreInit(void)
return false;
}
m64p_ret = m64p::Core.Startup(FRONTEND_API_VERSION, CoreGetUserConfigDirectory().string().c_str(), CoreGetSharedDataDirectory().string().c_str(), nullptr, CoreDebugCallback, nullptr, CoreStateCallback);
m64p_ret = m64p::Core.Startup(FRONTEND_API_VERSION, CoreGetUserConfigDirectory().string().c_str(), CoreGetSharedDataDirectory().string().c_str(), (void*)l_CoreContextString, CoreDebugCallback, nullptr, CoreStateCallback);
if (m64p_ret != M64ERR_SUCCESS)
{
error = "CoreInit M64P::Core.Startup() Failed: ";
+1
View File
@@ -22,6 +22,7 @@
#include "RomHeader.hpp"
#include "Callback.hpp"
#include "Plugins.hpp"
#include "Version.hpp"
#include "Cheats.hpp"
#include "Error.hpp"
#include "Unzip.hpp"
+6 -6
View File
@@ -8,9 +8,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "Directories.hpp"
#include "Config.hpp"
#include "Error.hpp"
#include "Core.hpp"
#include "Config.hpp"
#include "m64p/Api.hpp"
#include <cstdio>
@@ -123,7 +123,7 @@ std::filesystem::path CoreGetCoreDirectory(void)
#ifdef PORTABLE_INSTALL
directory = "Core";
#else // Not Portable
directory = CORE_INSTAlL_PREFIX;
directory = CORE_INSTALL_PREFIX;
directory += "/lib/RMG/Core";
#endif // PORTABLE_INSTALL
return directory;
@@ -135,7 +135,7 @@ std::filesystem::path CoreGetPluginDirectory(void)
#ifdef PORTABLE_INSTALL
directory = "Plugin";
#else // Not Portable
directory = CORE_INSTAlL_PREFIX;
directory = CORE_INSTALL_PREFIX;
directory += "/lib/RMG/Plugin";
#endif // PORTABLE_INSTALL
return directory;
@@ -180,7 +180,7 @@ std::filesystem::path CoreGetDefaultSaveDirectory(void)
#ifdef PORTABLE_INSTALL
directory = "Save/Game";
#else // Not Portable
directory = CoreGetUserDataDirectory();
directory = CoreGetDefaultUserDataDirectory();
directory += "/Save/Game";
#endif // PORTABLE_INSTALL
return directory;
@@ -192,7 +192,7 @@ std::filesystem::path CoreGetDefaultSaveStateDirectory(void)
#ifdef PORTABLE_INSTALL
directory = "Save/State";
#else // Not Portable
directory = CoreGetUserDataDirectory();
directory = CoreGetDefaultUserDataDirectory();
directory += "/Save/State";
#endif // PORTABLE_INSTALL
return directory;
@@ -233,7 +233,7 @@ std::filesystem::path CoreGetSharedDataDirectory(void)
#ifdef PORTABLE_INSTALL
directory = "Data";
#else // Not Portable
directory = CORE_INSTAlL_PREFIX;
directory = CORE_INSTALL_PREFIX;
directory += "/share/RMG";
#endif // PORTABLE_INSTALL
return directory;
+5 -2
View File
@@ -126,8 +126,11 @@ bool CoreStartEmulation(std::filesystem::path n64rom, std::filesystem::path n64d
return false;
}
// set disk file in media loader
CoreMediaLoaderSetDiskFile(n64ddrom);
// set disk file in media loader when ROM is a cartridge
if (CoreGetRomType() == CoreRomType::Cartridge)
{
CoreMediaLoaderSetDiskFile(n64ddrom);
}
// apply core settings overlay
apply_coresettings_overlay();
+34 -1
View File
@@ -7,7 +7,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#define CORE_INTERNAL
#include "Plugins.hpp"
#include "Callback.hpp"
#include "Directories.hpp"
#include "Error.hpp"
#include "Emulation.hpp"
@@ -21,6 +23,7 @@
#include "m64p/Api.hpp"
#include <filesystem>
#include <cstring>
//
// Local Variables
@@ -28,6 +31,7 @@
static m64p::PluginApi l_Plugins[(int)CorePluginType::Input];
static std::string l_PluginFiles[(int)CorePluginType::Input];
static char l_PluginContext[(int)CorePluginType::Input][20];
//
// Local Functions
@@ -101,6 +105,32 @@ std::string get_plugin_type_name(CorePluginType type)
return name + " Plugin";
}
std::string get_plugin_context_name(CorePluginType type)
{
std::string name;
switch (type)
{
default:
name = "[UNKNOWN]";
break;
case CorePluginType::Rsp:
name = "[RSP] ";
break;
case CorePluginType::Gfx:
name = "[GFX] ";
break;
case CorePluginType::Audio:
name = "[AUDIO] ";
break;
case CorePluginType::Input:
name = "[INPUT] ";
break;
}
return name;
}
bool apply_plugin_settings(std::string pluginSettings[4])
{
std::string error;
@@ -121,6 +151,9 @@ bool apply_plugin_settings(std::string pluginSettings[4])
pluginType = (CorePluginType)(i + 1);
// copy context string to a c string using strcpy
std::strcpy(l_PluginContext[(int)pluginType], get_plugin_context_name(pluginType).c_str());
if (settingValue != l_PluginFiles[i])
{
plugin = &l_Plugins[i];
@@ -179,7 +212,7 @@ bool apply_plugin_settings(std::string pluginSettings[4])
}
// attempt to start plugin
ret = plugin->Startup(m64p::Core.GetHandle(), nullptr, nullptr);
ret = plugin->Startup(m64p::Core.GetHandle(), (void*)l_PluginContext[(int)pluginType], CoreDebugCallback);
if (ret != M64ERR_SUCCESS)
{
error = "apply_plugin_settings (";
+72 -12
View File
@@ -9,6 +9,7 @@
*/
#include "Rom.hpp"
#include "Error.hpp"
#include "MediaLoader.hpp"
#include "m64p/Api.hpp"
#include "RomSettings.hpp"
#include "Cheats.hpp"
@@ -17,6 +18,7 @@
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
//
// Local Defines
@@ -29,11 +31,26 @@
//
static bool l_HasRomOpen = false;
static bool l_HasDisk = false;
//
// Local Functions
//
static std::string to_lower_str(std::string str)
{
std::string resultString = str;
std::transform(resultString.begin(), resultString.end(), resultString.begin(),
[](unsigned char c)
{
return std::tolower(c);
}
);
return resultString;
}
static bool read_zip_file(std::filesystem::path file, char** buf, int* size)
{
std::string error;
@@ -74,9 +91,11 @@ static bool read_zip_file(std::filesystem::path file, char** buf, int* size)
// make sure file has supported file format,
// if it does, read it in memory
std::filesystem::path fileNamePath(fileName);
if (fileNamePath.extension() == ".z64" ||
fileNamePath.extension() == ".v64" ||
fileNamePath.extension() == ".n64")
std::string fileExtension = fileNamePath.has_extension() ? fileNamePath.extension().string() : "";
fileExtension = to_lower_str(fileExtension);
if (fileExtension == ".z64" ||
fileExtension == ".v64" ||
fileExtension == ".n64")
{
char* buffer;
char* outBuffer;
@@ -190,7 +209,11 @@ static bool read_raw_file(std::filesystem::path file, char** buf, int* size)
if (!fileStream.is_open())
{
error = "read_raw_file Failed: ";
error += "failed to open file!";
error += "failed to open file: ";
error += strerror(errno);
error += " (";
error += std::to_string(errno);
error += ")";
CoreSetError(error);
return false;
}
@@ -230,8 +253,9 @@ bool CoreOpenRom(std::filesystem::path file)
{
std::string error;
m64p_error ret;
char* buf;
int buf_size;
char* buf = nullptr;
int buf_size = 0;
std::string file_extension;
if (!m64p::Core.IsHooked())
{
@@ -246,12 +270,23 @@ bool CoreOpenRom(std::filesystem::path file)
return false;
}
if (file.has_extension() && file.extension() == ".zip")
file_extension = file.has_extension() ? file.extension().string() : "";
file_extension = to_lower_str(file_extension);
if (file_extension == ".zip")
{
if (!read_zip_file(file, &buf, &buf_size))
{
return false;
}
l_HasDisk = false;
}
else if (file_extension == ".d64" ||
file_extension == ".ndd")
{
CoreMediaLoaderSetDiskFile(file);
l_HasDisk = true;
}
else
{
@@ -259,17 +294,28 @@ bool CoreOpenRom(std::filesystem::path file)
{
return false;
}
l_HasDisk = false;
}
if (l_HasDisk)
{
ret = m64p::Core.DoCommand(M64CMD_DISK_OPEN, 0, nullptr);
error = "CoreOpenRom: m64p::Core.DoCommand(M64CMD_DISK_OPEN) Failed: ";
}
else
{
ret = m64p::Core.DoCommand(M64CMD_ROM_OPEN, buf_size, buf);
error = "CoreOpenRom: m64p::Core.DoCommand(M64CMD_ROM_OPEN) Failed: ";
free(buf);
}
ret = m64p::Core.DoCommand(M64CMD_ROM_OPEN, buf_size, buf);
if (ret != M64ERR_SUCCESS)
{
error = "CoreOpenRom: m64p::Core.DoCommand(M64CMD_ROM_OPEN) Failed: ";
error += m64p::Core.ErrorMessage(ret);
CoreSetError(error);
}
free(buf);
l_HasRomOpen = (ret == M64ERR_SUCCESS);
if (l_HasRomOpen)
@@ -288,6 +334,11 @@ bool CoreHasRomOpen(void)
return l_HasRomOpen;
}
CoreRomType CoreGetRomType(void)
{
return l_HasDisk ? CoreRomType::Disk : CoreRomType::Cartridge;
}
bool CoreCloseRom(void)
{
std::string error;
@@ -311,10 +362,19 @@ bool CoreCloseRom(void)
return false;
}
ret = m64p::Core.DoCommand(M64CMD_ROM_CLOSE, 0, nullptr);
if (l_HasDisk)
{
ret = m64p::Core.DoCommand(M64CMD_DISK_CLOSE, 0, nullptr);
error = "CoreCloseRom: m64p::Core.DoCommand(M64CMD_DISK_CLOSE) Failed: ";
}
else
{
ret = m64p::Core.DoCommand(M64CMD_ROM_CLOSE, 0, nullptr);
error = "CoreCloseRom: m64p::Core.DoCommand(M64CMD_ROM_CLOSE) Failed: ";
}
if (ret != M64ERR_SUCCESS)
{
error = "CoreCloseRom: m64p::Core.DoCommand(M64CMD_ROM_CLOSE) Failed: ";
error += m64p::Core.ErrorMessage(ret);
CoreSetError(error);
return false;
+9
View File
@@ -12,12 +12,21 @@
#include <filesystem>
enum class CoreRomType
{
Cartridge,
Disk
};
// opens the given file as ROM
bool CoreOpenRom(std::filesystem::path file);
// returns whether core has a ROM opened
bool CoreHasRomOpen(void);
// returns the opened ROM's type
CoreRomType CoreGetRomType(void);
// closes ROM
bool CoreCloseRom(void);
+76 -19
View File
@@ -10,7 +10,7 @@
#include "Settings.hpp"
#include "Directories.hpp"
#include "Config.hpp"
#include "Version.hpp"
#include "m64p/Api.hpp"
#include "Error.hpp"
#include "m64p/api/m64p_types.h"
@@ -161,6 +161,21 @@ static l_Setting get_setting(SettingsID settingId)
case SettingsID::GUI_AutomaticFullscreen:
setting = {SETTING_SECTION_GUI, "AutomaticFullscreen", false};
break;
case SettingsID::GUI_ShowVerboseLogMessages:
setting = {SETTING_SECTION_GUI, "ShowVerboseLogMessages", false};
break;
case SettingsID::GUI_Toolbar:
setting = {SETTING_SECTION_GUI, "Toolbar", true};
break;
case SettingsID::GUI_StatusBar:
setting = {SETTING_SECTION_GUI, "StatusBar", true};
break;
case SettingsID::GUI_Style:
setting = {SETTING_SECTION_GUI, "Style", ""};
break;
case SettingsID::GUI_IconTheme:
setting = {SETTING_SECTION_GUI, "IconTheme", "black"};
break;
case SettingsID::GUI_CheckForUpdates:
setting = {SETTING_SECTION_GUI, "CheckForUpdates", true};
break;
@@ -168,7 +183,7 @@ static l_Setting get_setting(SettingsID settingId)
setting = {SETTING_SECTION_GUI, "DiscordRpc", true};
break;
case SettingsID::GUI_Version:
setting = {SETTING_SECTION_GUI, "Version", CORE_VERSION};
setting = {SETTING_SECTION_GUI, "Version", CoreGetVersion()};
break;
case SettingsID::Core_GFX_Plugin:
@@ -359,17 +374,14 @@ static l_Setting get_setting(SettingsID settingId)
case SettingsID::KeyBinding_RemoveDuplicates:
setting = {SETTING_SECTION_KEYBIND, "RemoveDuplicates", true};
break;
case SettingsID::KeyBinding_OpenROM:
setting = {SETTING_SECTION_KEYBIND, "OpenROM", "Ctrl+O"};
case SettingsID::KeyBinding_StartROM:
setting = {SETTING_SECTION_KEYBIND, "StartROM", "Ctrl+O"};
break;
case SettingsID::KeyBinding_OpenCombo:
setting = {SETTING_SECTION_KEYBIND, "OpenCombo", "Ctrl+Shift+O"};
case SettingsID::KeyBinding_StartCombo:
setting = {SETTING_SECTION_KEYBIND, "StartCombo", "Ctrl+Shift+O"};
break;
case SettingsID::KeyBinding_StartEmulation:
setting = {SETTING_SECTION_KEYBIND, "StartEmulation", "F11"};
break;
case SettingsID::KeyBinding_EndEmulation:
setting = {SETTING_SECTION_KEYBIND, "EndEmulation", "F12"};
case SettingsID::KeyBinding_Shutdown:
setting = {SETTING_SECTION_KEYBIND, "Shutdown", "F12"};
break;
case SettingsID::KeyBinding_RefreshROMList:
setting = {SETTING_SECTION_KEYBIND, "RefreshROMList", "F5"};
@@ -386,15 +398,12 @@ static l_Setting get_setting(SettingsID settingId)
case SettingsID::KeyBinding_Resume:
setting = {SETTING_SECTION_KEYBIND, "Resume", "F2"};
break;
case SettingsID::KeyBinding_GenerateBitmap:
setting = {SETTING_SECTION_KEYBIND, "GenerateBitmap", "F3"};
case SettingsID::KeyBinding_Screenshot:
setting = {SETTING_SECTION_KEYBIND, "Screenshot", "F3"};
break;
case SettingsID::KeyBinding_LimitFPS:
setting = {SETTING_SECTION_KEYBIND, "LimitFPS", "F4"};
break;
case SettingsID::KeyBinding_SwapDisk:
setting = {SETTING_SECTION_KEYBIND, "SwapDisk", "Ctrl+D"};
break;
case SettingsID::KeyBinding_SaveState:
setting = {SETTING_SECTION_KEYBIND, "SaveState", "F5"};
break;
@@ -413,6 +422,36 @@ static l_Setting get_setting(SettingsID settingId)
case SettingsID::KeyBinding_GSButton:
setting = {SETTING_SECTION_KEYBIND, "GSButton", "F9"};
break;
case SettingsID::KeyBinding_SaveStateSlot0:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot0", "Ctrl+0"};
break;
case SettingsID::KeyBinding_SaveStateSlot1:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot1", "Ctrl+1"};
break;
case SettingsID::KeyBinding_SaveStateSlot2:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot2", "Ctrl+2"};
break;
case SettingsID::KeyBinding_SaveStateSlot3:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot3", "Ctrl+3"};
break;
case SettingsID::KeyBinding_SaveStateSlot4:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot4", "Ctrl+4"};
break;
case SettingsID::KeyBinding_SaveStateSlot5:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot5", "Ctrl+5"};
break;
case SettingsID::KeyBinding_SaveStateSlot6:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot6", "Ctrl+6"};
break;
case SettingsID::KeyBinding_SaveStateSlot7:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot7", "Ctrl+7"};
break;
case SettingsID::KeyBinding_SaveStateSlot8:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot8", "Ctrl+8"};
break;
case SettingsID::KeyBinding_SaveStateSlot9:
setting = {SETTING_SECTION_KEYBIND, "SaveStateSlot9", "Ctrl+9"};
break;
case SettingsID::KeyBinding_Fullscreen:
setting = {SETTING_SECTION_KEYBIND, "Fullscreen", "Alt+Return"};
break;
@@ -436,7 +475,25 @@ static l_Setting get_setting(SettingsID settingId)
setting = {SETTING_SECTION_ROMBROWSER, "Columns", std::vector<int>({0, 1, 2})};
break;
case SettingsID::RomBrowser_ColumnSizes:
setting = {SETTING_SECTION_ROMBROWSER, "ColumnSizes", std::vector<int>({0, 250, 1, 100, 2, 100})};
setting = {SETTING_SECTION_ROMBROWSER, "ColumnSizes", std::vector<int>({-1, -1, -1})};
break;
case SettingsID::RomBrowser_ViewMode:
setting = {SETTING_SECTION_ROMBROWSER, "ViewMode", 0};
break;
case SettingsID::RomBrowser_ListViewSortSection:
setting = {SETTING_SECTION_ROMBROWSER, "ListViewSortSection", 0};
break;
case SettingsID::RomBrowser_ListViewSortOrder:
setting = {SETTING_SECTION_ROMBROWSER, "ListViewSortOrder", 0};
break;
case SettingsID::RomBrowser_GridViewIconWidth:
setting = {SETTING_SECTION_ROMBROWSER, "GridViewIconWidth", 180};
break;
case SettingsID::RomBrowser_GridViewIconHeight:
setting = {SETTING_SECTION_ROMBROWSER, "GridViewIconHeight", 126};
break;
case SettingsID::RomBrowser_GridViewUniformItemSizes:
setting = {SETTING_SECTION_ROMBROWSER, "GridViewUniformItemSizes", true};
break;
case SettingsID::Settings_HasForceUsedSetOnce:
@@ -957,7 +1014,7 @@ bool CoreSettingsUpgrade(void)
// we don't need to do anything
// when the core version and the settings version match
if (settingsVersion == CORE_VERSION)
if (settingsVersion == CoreGetVersion())
{
return true;
}
@@ -996,7 +1053,7 @@ bool CoreSettingsUpgrade(void)
}
// save core version
CoreSettingsSetValue(SettingsID::GUI_Version, std::string(CORE_VERSION));
CoreSettingsSetValue(SettingsID::GUI_Version, CoreGetVersion());
CoreSettingsSave();
return true;
}
+26 -7
View File
@@ -13,6 +13,11 @@ enum class SettingsID
GUI_PauseEmulationOnFocusLoss,
GUI_ResumeEmulationOnFocus,
GUI_AutomaticFullscreen,
GUI_ShowVerboseLogMessages,
GUI_Toolbar,
GUI_StatusBar,
GUI_Style,
GUI_IconTheme,
GUI_CheckForUpdates,
GUI_DiscordRpc,
GUI_Version,
@@ -89,24 +94,32 @@ enum class SettingsID
// GUI KeyBindings
KeyBinding_RemoveDuplicates,
KeyBinding_OpenROM,
KeyBinding_OpenCombo,
KeyBinding_StartEmulation,
KeyBinding_EndEmulation,
KeyBinding_StartROM,
KeyBinding_StartCombo,
KeyBinding_Shutdown,
KeyBinding_RefreshROMList,
KeyBinding_Exit,
KeyBinding_SoftReset,
KeyBinding_HardReset,
KeyBinding_Resume,
KeyBinding_GenerateBitmap,
KeyBinding_Screenshot,
KeyBinding_LimitFPS,
KeyBinding_SwapDisk,
KeyBinding_SaveState,
KeyBinding_SaveAs,
KeyBinding_LoadState,
KeyBinding_Load,
KeyBinding_Cheats,
KeyBinding_GSButton,
KeyBinding_SaveStateSlot0,
KeyBinding_SaveStateSlot1,
KeyBinding_SaveStateSlot2,
KeyBinding_SaveStateSlot3,
KeyBinding_SaveStateSlot4,
KeyBinding_SaveStateSlot5,
KeyBinding_SaveStateSlot6,
KeyBinding_SaveStateSlot7,
KeyBinding_SaveStateSlot8,
KeyBinding_SaveStateSlot9,
KeyBinding_Fullscreen,
KeyBinding_Settings,
@@ -117,7 +130,13 @@ enum class SettingsID
RomBrowser_MaxItems,
RomBrowser_Columns,
RomBrowser_ColumnSizes,
RomBrowser_ViewMode,
RomBrowser_ListViewSortSection,
RomBrowser_ListViewSortOrder,
RomBrowser_GridViewIconWidth,
RomBrowser_GridViewIconHeight,
RomBrowser_GridViewUniformItemSizes,
// Settings Settings
Settings_HasForceUsedSetOnce,
@@ -7,10 +7,14 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
QTableView
#include "Version.hpp"
#include "Config.hpp"
//
// Exported Functions
//
std::string CoreGetVersion(void)
{
border: none;
color: #0096d3;
selection-color: #FFFFFF;
selection-background-color: #0096d3;
return std::string(CORE_VERSION);
}
+18
View File
@@ -0,0 +1,18 @@
/*
* Rosalie's Mupen GUI - https://github.com/Rosalie241/RMG
* Copyright (C) 2020 Rosalie Wanders <rosalie@mailbox.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef CORE_VERSION_HPP
#define CORE_VERSION_HPP
#include <string>
// returns the current RMG-Core version (as string)
std::string CoreGetVersion(void);
#endif // CORE_VERSION_HPP
+3 -1
View File
@@ -168,7 +168,9 @@ typedef enum {
M64CMD_NETPLAY_GET_VERSION,
M64CMD_NETPLAY_CLOSE,
M64CMD_PIF_OPEN,
M64CMD_ROM_SET_SETTINGS
M64CMD_ROM_SET_SETTINGS,
M64CMD_DISK_OPEN,
M64CMD_DISK_CLOSE
} m64p_command;
typedef struct {
+3 -2
View File
@@ -11,6 +11,7 @@
#define OSAL_DYNLIB_HPP
#include <string>
#include <filesystem>
#ifdef _WIN32
#include <windows.h>
@@ -25,11 +26,11 @@ typedef void* osal_dynlib_lib_sym;
// returns library handle for given filename,
// return nullptr when invalid library
osal_dynlib_lib_handle osal_dynlib_open(const char *);
osal_dynlib_lib_handle osal_dynlib_open(std::filesystem::path path);
// retrieves symbol handle for given library
// handle, returns nullptr when not found
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle, const char *);
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle, const char* symbol);
// closes library handle
void osal_dynlib_close(osal_dynlib_lib_handle);
+4 -4
View File
@@ -11,14 +11,14 @@
#include <dlfcn.h>
osal_dynlib_lib_handle osal_dynlib_open(const char* file)
osal_dynlib_lib_handle osal_dynlib_open(std::filesystem::path path)
{
return dlopen(file, RTLD_LAZY);
return dlopen(path.string().c_str(), RTLD_LAZY);
}
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle handle, const char *sym)
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle handle, const char* symbol)
{
return dlsym(handle, sym);
return dlsym(handle, symbol);
}
void osal_dynlib_close(osal_dynlib_lib_handle handle)
+4 -4
View File
@@ -9,14 +9,14 @@
*/
#include "osal_dynlib.hpp"
osal_dynlib_lib_handle osal_dynlib_open(const char* file)
osal_dynlib_lib_handle osal_dynlib_open(std::filesystem::path path)
{
return LoadLibrary(file);
return LoadLibraryW(path.wstring().c_str());
}
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle handle, const char *sym)
osal_dynlib_lib_sym osal_dynlib_sym(osal_dynlib_lib_handle handle, const char* symbol)
{
return GetProcAddress(handle, sym);
return GetProcAddress(handle, symbol);
}
void osal_dynlib_close(osal_dynlib_lib_handle handle)
+6 -4
View File
@@ -17,8 +17,9 @@ osal_files_file_time osal_files_get_file_time(std::filesystem::path file)
BOOL ret;
HANDLE file_handle;
FILETIME file_time;
ULARGE_INTEGER ularge_int;
file_handle = CreateFileA(file.string().c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
file_handle = CreateFileW(file.wstring().c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (file_handle == INVALID_HANDLE_VALUE)
{
return -1;
@@ -36,7 +37,8 @@ osal_files_file_time osal_files_get_file_time(std::filesystem::path file)
return -1;
}
// this is probably incorrect but it doesn't matter
// for our use-case
return file_time.dwLowDateTime + file_time.dwHighDateTime;
ularge_int.LowPart = file_time.dwLowDateTime;
ularge_int.HighPart = file_time.dwHighDateTime;
return ularge_int.QuadPart;
}
+2 -2
View File
@@ -8,7 +8,7 @@ set(CMAKE_AUTOUIC ON)
# disable lib prefix
set(CMAKE_SHARED_LIBRARY_PREFIX "")
find_package(Qt5 COMPONENTS Gui Widgets Core Svg REQUIRED)
find_package(${QT_VERSION} COMPONENTS Gui Widgets Core Svg REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
@@ -41,4 +41,4 @@ target_include_directories(RMG-Input PRIVATE
${SDL2_INCLUDE_DIRS}
)
target_link_libraries(RMG-Input Qt5::Gui Qt5::Widgets Qt5::Svg)
target_link_libraries(RMG-Input ${QT_VERSION}::Gui ${QT_VERSION}::Widgets ${QT_VERSION}::Svg)
@@ -18,7 +18,7 @@
using namespace UserInterface;
MainDialog::MainDialog(QWidget* parent, Thread::SDLThread* sdlThread) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
MainDialog::MainDialog(QWidget* parent, Thread::SDLThread* sdlThread) : QDialog(parent)
{
this->setupUi(this);
this->setWindowIcon(QIcon(":Resource/RMG.png"));
@@ -28,7 +28,7 @@ private:
QString deviceName;
int deviceNum;
bool operator== (inputDevice_t other)
bool operator== (inputDevice_t other) const
{
return other.deviceNum == deviceNum &&
other.deviceName == deviceName;
@@ -18,11 +18,14 @@ OptionsDialog::OptionsDialog(QWidget* parent, OptionsDialogSettings settings) :
{
this->setupUi(this);
this->setIconsForEmulationInfoText();
this->controllerPakComboBox->setCurrentIndex(settings.ControllerPak);
this->gameboyRomLineEdit->setText(QString::fromStdString(settings.GameboyRom));
this->gameboySaveLineEdit->setText(QString::fromStdString(settings.GameboySave));
this->removeDuplicateMappingsCheckbox->setChecked(settings.RemoveDuplicateMappings);
this->invertAxisCheckBox->setChecked(settings.InvertAxis);
if (!CoreIsEmulationRunning() && !CoreIsEmulationPaused())
{
this->hideEmulationInfoText();
@@ -39,6 +42,21 @@ OptionsDialogSettings OptionsDialog::GetSettings()
return this->settings;
}
void OptionsDialog::setIconsForEmulationInfoText(void)
{
QLabel* labels[] = {
this->infoIconLabel_0
};
QIcon infoIcon = QIcon::fromTheme("information-line");
QPixmap infoIconPixmap = infoIcon.pixmap(16, 16);
for (QLabel* label : labels)
{
label->setPixmap(infoIconPixmap);
}
}
void OptionsDialog::hideEmulationInfoText(void)
{
QHBoxLayout *layouts[] = {this->emulationInfoLayout_1};
@@ -43,6 +43,7 @@ private:
bool hasSaved = false;
OptionsDialogSettings settings;
void setIconsForEmulationInfoText(void);
void hideEmulationInfoText(void);
private slots:
@@ -151,7 +151,7 @@
<item>
<layout class="QHBoxLayout" name="emulationInfoLayout_1">
<item>
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="infoIconLabel_0">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -162,7 +162,7 @@
<string/>
</property>
<property name="pixmap">
<pixmap resource="UIResources.qrc">:/Resource/Info.ico</pixmap>
<pixmap>:/Resource/Info.ico</pixmap>
</property>
<property name="scaledContents">
<bool>false</bool>
@@ -8,7 +8,7 @@
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
id="svg21"
sodipodi:docname="Controller.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -23,15 +23,17 @@
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.28240146"
inkscape:cx="-426.69751"
inkscape:cy="3454.3023"
inkscape:zoom="0.070600365"
inkscape:cx="6019.7989"
inkscape:cy="1600.5583"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg21" />
inkscape:current-layer="layer2"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<path
id="Dark-Grey-Background"
serif:id="Dark Grey Background"
@@ -111,4 +113,39 @@
style="fill:#ec3f21"
id="circle18" />
</g>
</svg>
<g
id="layer2"
inkscape:label="Z-Button"
style="display:inline;opacity:1;stroke-width:1;stroke-dasharray:none;paint-order:markers stroke fill"
transform="matrix(50.366966,0,0,50.366966,3240.0678,-579.56452)"><g
id="layer2-0"
inkscape:label="Z-Button"
style="clip-rule:evenodd;display:inline;fill-rule:evenodd;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:2;stroke-dasharray:none;paint-order:markers stroke fill"><rect
style="clip-rule:evenodd;display:inline;opacity:1;fill:#5c5c5c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;image-rendering:auto"
id="rect1917-0-4"
width="11.478539"
height="16.72587"
x="-32.517441"
y="86.256668"
ry="3.4675589"
inkscape:label="btnZ-outline"
class="theme-button"
ojd-button="Z" /><rect
style="display:inline;opacity:1;fill:#bcbdbf;fill-opacity:1;stroke:none;stroke-width:0.960842;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;image-rendering:auto"
id="rect1917-8"
width="10.956328"
height="16.177647"
x="-32.225891"
y="86.523468"
ry="3.3539019"
inkscape:label="btnZ"
class="theme-button"
ojd-button="Z" /><g
aria-label="Z"
style="font-style:normal;font-weight:normal;font-size:5.73478px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;clip-rule:evenodd;display:inline;opacity:1;fill:#56575b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.751267;stroke-linejoin:round;stroke-miterlimit:2;stroke-dasharray:none;paint-order:markers stroke fill"
id="text1921-7"
transform="matrix(1.3310888,0,0,1.3310888,-67.459296,-40.853038)"><path
d="m 28.805176,99.685474 h 3.514231 v 0.652446 l -2.242948,2.71338 h 2.307352 v 0.81485 h -3.64304 v -0.65244 l 2.242948,-2.71338 h -2.178543 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#56575b;fill-opacity:1;stroke-width:0.751267;stroke-dasharray:none;paint-order:markers stroke fill"
id="path2008-2"
inkscape:connector-curvature="0" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@@ -8,7 +8,7 @@
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
id="svg21"
sodipodi:docname="Controller_NoAnalogStick.svg"
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -23,15 +23,17 @@
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.14120073"
inkscape:cx="2549.5619"
inkscape:cy="3325.0536"
inkscape:zoom="0.099843994"
inkscape:cx="2829.4141"
inkscape:cy="3475.4219"
inkscape:window-width="1920"
inkscape:window-height="1007"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg21" />
inkscape:current-layer="svg21"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<path
id="Dark-Grey-Background"
serif:id="Dark Grey Background"
@@ -101,4 +103,36 @@
style="fill:#ec3f21"
id="circle18" />
</g>
</svg>
<g
id="layer2"
inkscape:label="Z-Button"
style="display:inline;opacity:1;stroke-width:1;stroke-dasharray:none;paint-order:markers stroke fill"
transform="matrix(50.366966,0,0,50.366966,3240.0678,-579.56452)"><rect
style="clip-rule:evenodd;display:inline;opacity:1;fill:#5c5c5c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;image-rendering:auto"
id="rect1917-0"
width="11.478539"
height="16.72587"
x="-32.517441"
y="86.256668"
ry="3.4675589"
inkscape:label="btnZ-outline"
class="theme-button"
ojd-button="Z" /><rect
style="display:inline;opacity:1;fill:#bcbdbf;fill-opacity:1;stroke:none;stroke-width:0.960842;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill;image-rendering:auto"
id="rect1917"
width="10.956328"
height="16.177647"
x="-32.225891"
y="86.523468"
ry="3.3539019"
inkscape:label="btnZ"
class="theme-button"
ojd-button="Z" /><g
aria-label="Z"
style="font-style:normal;font-weight:normal;font-size:5.73478px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;clip-rule:evenodd;display:inline;opacity:1;fill:#56575b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.751267;stroke-linejoin:round;stroke-miterlimit:2;stroke-dasharray:none;paint-order:markers stroke fill"
id="text1921"
transform="matrix(1.3310888,0,0,1.3310888,-67.459296,-40.853038)"><path
d="m 28.805176,99.685474 h 3.514231 v 0.652446 l -2.242948,2.71338 h 2.307352 v 0.81485 h -3.64304 v -0.65244 l 2.242948,-2.71338 h -2.178543 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#56575b;fill-opacity:1;stroke-width:0.751267;stroke-dasharray:none;paint-order:markers stroke fill"
id="path2008"
inkscape:connector-curvature="0" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="6939.9795"
height="6772.564"
viewBox="0 0 6939.9795 6772.564"
version="1.1"
xml:space="preserve"
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
id="svg21"
sodipodi:docname="Controller_Pressed_ZTrigger.svg"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs25" /><sodipodi:namedview
id="namedview23"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.099843994"
inkscape:cx="2468.8516"
inkscape:cy="3856.0156"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg21"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<g
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
id="g5916"
transform="matrix(1.0882331,0,0,1.0882331,512.32815,1416.6572)"><circle
style="opacity:0.62;fill:#ececec;fill-rule:evenodd;stroke-width:0.280377"
id="path42"
cx="1267.6501"
cy="2546.3296"
r="180.5985" /></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -15,7 +15,7 @@
<file>Resource/Controller_Pressed_Start.svg</file>
<file>Resource/Controller_Pressed_LeftTrigger.svg</file>
<file>Resource/Controller_Pressed_RightTrigger.svg</file>
<file>Resource/Controller_Pressed_ZTrigger.svg</file>
<file>Resource/RMG.png</file>
<file>Resource/Info.ico</file>
</qresource>
</RCC>
@@ -125,6 +125,7 @@ void ControllerImageWidget::paintEvent(QPaintEvent *event)
{ N64ControllerButton::CButtonRight, ":Resource/Controller_Pressed_CButtonRight.svg" },
{ N64ControllerButton::LeftTrigger, ":Resource/Controller_Pressed_LeftTrigger.svg" },
{ N64ControllerButton::RightTrigger, ":Resource/Controller_Pressed_RightTrigger.svg" },
{ N64ControllerButton::ZTrigger, ":Resource/Controller_Pressed_ZTrigger.svg" }
};
static const QString baseImageUri = ":Resource/Controller_NoAnalogStick.svg";
@@ -58,6 +58,7 @@ ControllerWidget::ControllerWidget(QWidget* parent, EventFilter* eventFilter) :
{ N64ControllerButton::CButtonRight, this->cbuttonRightButton },
{ N64ControllerButton::LeftTrigger, this->leftTriggerButton },
{ N64ControllerButton::RightTrigger, this->rightTriggerButton },
{ N64ControllerButton::ZTrigger, this->zTriggerButton }
});
this->joystickWidgetMappings.append(
@@ -121,7 +122,7 @@ ControllerWidget::ControllerWidget(QWidget* parent, EventFilter* eventFilter) :
this->setupButtonWidgets.append(button);
}
this->on_controllerPluggedCheckBox_toggled(false);
this->initializeButtons();
}
@@ -292,6 +293,13 @@ void ControllerWidget::CheckInputDeviceSettings()
std::string deviceName = CoreSettingsGetStringValue(SettingsID::Input_DeviceName, section);
int deviceNum = CoreSettingsGetIntValue(SettingsID::Input_DeviceNum, section);
// do nothing when input device combobox
// is empty
if (this->inputDeviceComboBox->count() == 0)
{
return;
}
// clear (not found) devices first
int notFoundIndex = this->inputDeviceComboBox->findText("(not found)", Qt::MatchFlag::MatchEndsWith);
if (notFoundIndex != -1)
@@ -302,11 +310,11 @@ void ControllerWidget::CheckInputDeviceSettings()
int deviceNameIndex = this->inputDeviceComboBox->findText(QString::fromStdString(deviceName), Qt::MatchFlag::MatchStartsWith);
int deviceNumIndex = this->inputDeviceComboBox->findData(deviceNum);
if ((deviceNameIndex == deviceNumIndex) &&
(deviceNameIndex != -1))
if ((deviceNumIndex != -1) &&
(this->inputDeviceComboBox->itemText(deviceNumIndex).startsWith(QString::fromStdString(deviceName))))
{ // full match
this->inputDeviceComboBox->setCurrentIndex(deviceNameIndex);
this->inputDeviceComboBox->setCurrentIndex(deviceNumIndex);
}
else if (deviceNameIndex != -1)
{ // name only match
@@ -363,7 +371,7 @@ void ControllerWidget::on_profileComboBox_currentIndexChanged(int value)
// reload settings from section
this->LoadSettings(this->getCurrentSettingsSection());
// reload input device settings
CheckInputDeviceSettings();
this->CheckInputDeviceSettings();
}
void ControllerWidget::on_inputDeviceComboBox_currentIndexChanged(int value)
@@ -446,11 +454,15 @@ void ControllerWidget::on_removeProfileButton_clicked()
if (this->profileComboBox->currentIndex() == 0)
{
QMessageBox messageBox(this);
messageBox.setIcon(QMessageBox::Icon::Critical);
messageBox.setWindowTitle("Error");
messageBox.setText("Cannot remove main profile!");
messageBox.addButton(QMessageBox::Ok);
messageBox.exec();
messageBox.setIcon(QMessageBox::Icon::Warning);
messageBox.setText("Are you sure you want to reset the main profile?");
messageBox.addButton(QMessageBox::Yes);
messageBox.addButton(QMessageBox::No);
if (messageBox.exec() == QMessageBox::Yes)
{
this->SaveDefaultSettings();
this->LoadSettings(this->getCurrentSettingsSection());
}
return;
}
@@ -911,6 +923,8 @@ void ControllerWidget::LoadSettings(QString sectionQString)
buttonSetting.button->SetInputData(type, data, extraData, QString::fromStdString(name));
}
this->on_controllerPluggedCheckBox_toggled(this->IsPluggedIn());
}
void ControllerWidget::SaveDefaultSettings()
@@ -927,7 +941,11 @@ void ControllerWidget::SaveDefaultSettings()
CoreSettingsSetValue(SettingsID::Input_DeviceNum, section, -1);
CoreSettingsSetValue(SettingsID::Input_Deadzone, section, 9);
CoreSettingsSetValue(SettingsID::Input_Pak, section, 0);
#ifdef _WIN32
CoreSettingsSetValue(SettingsID::Input_RemoveDuplicateMappings, section, true);
#else
CoreSettingsSetValue(SettingsID::Input_RemoveDuplicateMappings, section, false);
#endif // _WIN32
CoreSettingsSetValue(SettingsID::Input_InvertAxis, section, true);
for (auto& buttonSetting : this->buttonSettingMappings)
+18 -10
View File
@@ -5,30 +5,37 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt5 COMPONENTS Gui Widgets Core REQUIRED)
find_package(${QT_VERSION} COMPONENTS Gui Widgets Core OpenGL REQUIRED)
if (PORTABLE_INSTALL)
add_definitions(-DPORTABLE_INSTALL)
endif(PORTABLE_INSTALL)
if (UPDATER)
find_package(Qt5 COMPONENTS Network REQUIRED)
add_definitions(-DUPDATER)
find_package(${QT_VERSION} COMPONENTS Network REQUIRED)
add_definitions(-DUPDATER)
endif(UPDATER)
if (DISCORD_RPC)
add_definitions(-DDISCORD_RPC)
add_definitions(-DDISCORD_RPC)
endif(DISCORD_RPC)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
configure_file(Config.hpp.in Config.hpp)
set(RMG_SOURCES
UserInterface/MainWindow.cpp
UserInterface/MainWindow.ui
UserInterface/Widget/RomBrowserWidget.cpp
UserInterface/Widget/RomBrowserListViewWidget.cpp
UserInterface/Widget/RomBrowserGridViewWidget.cpp
UserInterface/Widget/RomBrowserLoadingWidget.cpp
UserInterface/Widget/RomBrowserEmptyWidget.cpp
UserInterface/Widget/RomBrowserEmptyWidget.ui
UserInterface/Widget/OGLWidget.cpp
UserInterface/Widget/KeybindButton.cpp
UserInterface/Dialog/SettingsDialog.cpp
UserInterface/Dialog/SettingsDialog.ui
UserInterface/Dialog/SettingsDialog.qrc
UserInterface/Dialog/CheatsDialog.cpp
UserInterface/Dialog/CheatsDialog.ui
UserInterface/Dialog/AddCheatDialog.cpp
@@ -39,6 +46,8 @@ set(RMG_SOURCES
UserInterface/Dialog/RomInfoDialog.ui
UserInterface/Dialog/AboutDialog.cpp
UserInterface/Dialog/AboutDialog.ui
UserInterface/Dialog/LogDialog.cpp
UserInterface/Dialog/LogDialog.ui
UserInterface/NoFocusDelegate.cpp
UserInterface/EventFilter.cpp
UserInterface/UIResources.rc
@@ -70,7 +79,6 @@ endif()
target_link_libraries(RMG
RMG-Core
${SDL2_LIBRARIES}
)
target_include_directories(RMG PRIVATE
@@ -80,9 +88,9 @@ target_include_directories(RMG PRIVATE
${SDL2_INCLUDE_DIRS}
)
target_link_libraries(RMG Qt5::Gui Qt5::Widgets)
target_link_libraries(RMG ${QT_VERSION}::Gui ${QT_VERSION}::Widgets ${QT_VERSION}::OpenGL)
if (UPDATER)
target_link_libraries(RMG Qt5::Network)
target_link_libraries(RMG ${QT_VERSION}::Network)
endif(UPDATER)
+16 -2
View File
@@ -16,6 +16,7 @@
//
static CoreCallbacks* l_CoreCallbacks = nullptr;
static bool l_showVerboseMessages = false;
//
// Exported Functions
@@ -36,6 +37,8 @@ bool CoreCallbacks::Init(void)
// needed for Qt
qRegisterMetaType<CoreDebugMessageType>("CoreDebugMessageType");
this->LoadSettings();
l_CoreCallbacks = this;
return CoreSetupCallbacks(this->coreDebugCallback);
}
@@ -45,12 +48,23 @@ void CoreCallbacks::Stop(void)
l_CoreCallbacks = nullptr;
}
void CoreCallbacks::coreDebugCallback(CoreDebugMessageType type, std::string message)
void CoreCallbacks::LoadSettings(void)
{
l_showVerboseMessages = CoreSettingsGetBoolValue(SettingsID::GUI_ShowVerboseLogMessages);
}
void CoreCallbacks::coreDebugCallback(CoreDebugMessageType type, std::string context, std::string message)
{
if (l_CoreCallbacks == nullptr)
{
return;
}
emit l_CoreCallbacks->OnCoreDebugCallback(type, QString::fromStdString(message));
// only show verbose messages when enabled
if (!l_showVerboseMessages && type == CoreDebugMessageType::Verbose)
{
return;
}
emit l_CoreCallbacks->OnCoreDebugCallback(type, QString::fromStdString(context), QString::fromStdString(message));
}
+4 -2
View File
@@ -27,11 +27,13 @@ public:
bool Init(void);
void Stop(void);
void LoadSettings(void);
private:
static void coreDebugCallback(CoreDebugMessageType type, std::string message);
static void coreDebugCallback(CoreDebugMessageType type, std::string context, std::string message);
signals:
void OnCoreDebugCallback(CoreDebugMessageType type, QString message);
void OnCoreDebugCallback(CoreDebugMessageType type, QString context, QString message);
};
#endif // RMG_CALLBACKS_HPP
-7
View File
@@ -1,7 +0,0 @@
#ifndef CONFIG_HPP
#define CONFIG_HPP
#define WINDOW_TITLE "Rosalie's Mupen GUI (${GIT_VERSION})"
#define VERSION_STR "${GIT_VERSION}"
#endif // CONFIG_HPP
+2 -3
View File
@@ -44,9 +44,8 @@ class EmulationThread : public QThread
void on_VidExt_ResizeWindow(int, int);
void on_VidExt_Init(void);
void on_VidExt_SetMode(int, int, int, int, int);
void on_VidExt_SetWindowedModeWithRate(int, int, int, int, int);
void on_VidExt_SetFullscreenModeWithRate(int, int, int, int, int);
void on_VidExt_SetWindowedMode(int, int, int, int);
void on_VidExt_SetFullscreenMode(int, int, int, int);
void on_VidExt_SetCaption(QString);
void on_VidExt_ToggleFS(bool);
void on_VidExt_Quit(void);
+25 -12
View File
@@ -12,6 +12,7 @@
#include <QDir>
#include <QDirIterator>
#include <QElapsedTimer>
using namespace Thread;
@@ -28,22 +29,22 @@ RomSearcherThread::~RomSearcherThread(void)
void RomSearcherThread::SetDirectory(QString directory)
{
this->rom_Directory = directory;
this->directory = directory;
}
void RomSearcherThread::SetRecursive(bool value)
{
this->rom_Search_Recursive = value;
this->recursive = value;
}
void RomSearcherThread::SetMaximumFiles(int value)
{
this->rom_Search_MaxItems = value;
this->maxItems = value;
}
void RomSearcherThread::Stop(void)
{
this->rom_Search_Stop = true;
this->stop = true;
while (this->isRunning())
{
this->wait();
@@ -52,12 +53,12 @@ void RomSearcherThread::Stop(void)
void RomSearcherThread::run(void)
{
this->rom_Search_Stop = false;
this->rom_Search(this->rom_Directory);
this->stop = false;
this->searchDirectory(this->directory);
return;
}
void RomSearcherThread::rom_Search(QString directory)
void RomSearcherThread::searchDirectory(QString directory)
{
QDir dir(directory);
@@ -69,7 +70,7 @@ void RomSearcherThread::rom_Search(QString directory)
filter << "*.D64";
filter << "*.ZIP";
QDirIterator::IteratorFlag flag = this->rom_Search_Recursive ?
QDirIterator::IteratorFlag flag = this->recursive ?
QDirIterator::Subdirectories :
QDirIterator::NoIteratorFlags;
QDirIterator romDirIt(directory, filter, QDir::Files, flag);
@@ -83,6 +84,9 @@ void RomSearcherThread::rom_Search(QString directory)
{
QString file = romDirIt.next();
QElapsedTimer timer;
timer.start();
if (CoreHasRomHeaderAndSettingsCached(file.toStdU32String()))
{ // found cache entry
ret = CoreGetCachedRomHeaderAndSettings(file.toStdU32String(), header, settings);
@@ -104,18 +108,27 @@ void RomSearcherThread::rom_Search(QString directory)
if (ret)
{
if (count++ >= this->rom_Search_MaxItems)
if (count++ >= this->maxItems)
{
return;
break;
}
emit this->on_Rom_Found(file, header, settings);
emit this->RomFound(file, header, settings);
}
if (this->rom_Search_Stop)
if (this->stop)
{
break;
}
// ensure the UI thread has some breathing room
// instead of being locked up and unable to render anything
if (timer.elapsed() < 10)
{
QThread::msleep(10 - timer.elapsed());
}
}
emit this->Finished(this->stop);
}
+7 -6
View File
@@ -33,15 +33,16 @@ class RomSearcherThread : public QThread
void run(void) override;
private:
QString rom_Directory;
bool rom_Search_Recursive;
int rom_Search_MaxItems;
bool rom_Search_Stop = false;
QString directory;
bool recursive = false;
int maxItems = 0;
bool stop = false;
void rom_Search(QString);
void searchDirectory(QString);
signals:
void on_Rom_Found(QString file, CoreRomHeader header, CoreRomSettings settings);
void RomFound(QString file, CoreRomHeader header, CoreRomSettings settings);
void Finished(bool canceled);
};
} // namespace Thread
@@ -9,13 +9,13 @@
*/
#include "AboutDialog.hpp"
#include "Config.hpp"
#include <RMG-Core/Core.hpp>
using namespace UserInterface::Dialog;
AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent)
{
this->setupUi(this);
this->versionLabel->setText(QString("RMG %1").arg(VERSION_STR));
this->versionLabel->setText(QString("RMG %1").arg(QString::fromStdString(CoreGetVersion())));
}
@@ -94,7 +94,7 @@
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Copyright © 2020-2022 Rosalie Wanders</string>
<string>Copyright © 2020-2023 Rosalie Wanders</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@@ -22,7 +22,7 @@
using namespace UserInterface::Dialog;
AddCheatDialog::AddCheatDialog(QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
AddCheatDialog::AddCheatDialog(QWidget *parent) : QDialog(parent)
{
this->setupUi(this);
@@ -22,7 +22,7 @@ Q_DECLARE_METATYPE(CoreCheat);
using namespace UserInterface::Dialog;
CheatsDialog::CheatsDialog(QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
CheatsDialog::CheatsDialog(QWidget *parent) : QDialog(parent)
{
qRegisterMetaType<CoreCheat>();
@@ -18,7 +18,7 @@ Q_DECLARE_METATYPE(CoreCheatOption);
using namespace UserInterface::Dialog;
ChooseCheatOptionDialog::ChooseCheatOptionDialog(CoreCheat cheat, QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
ChooseCheatOptionDialog::ChooseCheatOptionDialog(CoreCheat cheat, QWidget *parent) : QDialog(parent)
{
qRegisterMetaType<CoreCheatOption>();
@@ -21,7 +21,7 @@
using namespace UserInterface::Dialog;
DownloadUpdateDialog::DownloadUpdateDialog(QWidget *parent, QUrl url, QString filename) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
DownloadUpdateDialog::DownloadUpdateDialog(QWidget *parent, QUrl url, QString filename) : QDialog(parent)
{
this->setupUi(this);
@@ -17,7 +17,7 @@
using namespace UserInterface::Dialog;
InstallUpdateDialog::InstallUpdateDialog(QWidget *parent, QString installationDirectory, QString temporaryDirectory, QString filename) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
InstallUpdateDialog::InstallUpdateDialog(QWidget *parent, QString installationDirectory, QString temporaryDirectory, QString filename) : QDialog(parent)
{
this->setupUi(this);
@@ -88,7 +88,7 @@ void InstallUpdateDialog::install(void)
"@echo off",
"del /F /Q \"" + fullFilePath + "\"",
"taskkill /F /PID:" + appPid,
"copy /Y \"" + extractDirectory + "\\*\" \"" + appPath + "/\"",
"xcopy /S /Y /I \"" + extractDirectory + "\\*\" \"" + appPath + "/\"",
"start \"\" \"" + appPath + "\\RMG.exe\"",
"rmdir /S /Q \"" + this->temporaryDirectory + "\"",
};
@@ -0,0 +1,66 @@
/*
* Rosalie's Mupen GUI - https://github.com/Rosalie241/RMG
* Copyright (C) 2020 Rosalie Wanders <rosalie@mailbox.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "LogDialog.hpp"
#include <QMessageBox>
#include <QFileInfo>
#include <QFont>
#include <QIcon>
using namespace UserInterface::Dialog;
LogDialog::LogDialog(QWidget *parent) : QDialog(parent)
{
this->setupUi(this);
this->setWindowIcon(QIcon(":Resource/RMG.png"));
QFont font("monospace");
this->plainTextEdit->setFont(font);
}
LogDialog::~LogDialog(void)
{
}
void LogDialog::AddLogLine(CoreDebugMessageType type, QString context, QString line)
{
QString text;
text = context;
switch (type)
{
case CoreDebugMessageType::Error:
text += "[ERROR] ";
break;
case CoreDebugMessageType::Info:
text += "[INFO] ";
break;
case CoreDebugMessageType::Verbose:
text += "[VERBOSE] ";
break;
case CoreDebugMessageType::Warning:
text += "[WARNING] ";
break;
case CoreDebugMessageType::Status:
text += "[STATUS] ";
break;
}
text += line;
this->plainTextEdit->appendPlainText(text);
}
void LogDialog::Clear(void)
{
this->plainTextEdit->clear();
}
@@ -0,0 +1,41 @@
/*
* Rosalie's Mupen GUI - https://github.com/Rosalie241/RMG
* Copyright (C) 2020 Rosalie Wanders <rosalie@mailbox.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef LOGDIALOG_HPP
#define LOGDIALOG_HPP
#include <QWidget>
#include <QDialog>
#include <RMG-Core/Core.hpp>
#include "ui_LogDialog.h"
namespace UserInterface
{
namespace Dialog
{
class LogDialog : public QDialog, private Ui::LogDialog
{
Q_OBJECT
private:
public:
LogDialog(QWidget* parent = nullptr);
~LogDialog(void);
void Clear(void);
public slots:
void AddLogLine(CoreDebugMessageType type, QString context, QString line);
};
} // namespace Dialog
} // namespace UserInterface
#endif // LOGDIALOG_HPP
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LogDialog</class>
<widget class="QDialog" name="LogDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>550</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>Log</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPlainTextEdit" name="plainTextEdit">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -14,63 +14,25 @@
using namespace UserInterface::Dialog;
RomInfoDialog::RomInfoDialog(QString file, QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
RomInfoDialog::RomInfoDialog(QString file, CoreRomHeader romHeader, CoreRomSettings romSettings, QWidget *parent) : QDialog(parent)
{
this->setupUi(this);
bool needCloseRom = false;
CoreRomHeader romHeader;
CoreRomSettings romSettings;
// try to open ROM
if (!CoreOpenRom(file.toStdU32String()))
{
this->showErrorMessage(parent, "CoreOpenRom() Failed", QString::fromStdString(CoreGetError()));
return;
}
// try to retrieve ROM header
if (!CoreGetCurrentRomHeader(romHeader))
{
this->showErrorMessage(parent, "CoreGetCurrentRomHeader() Failed", QString::fromStdString(CoreGetError()));
return;
}
// try to retrieve ROM settings
if (!CoreGetCurrentRomSettings(romSettings))
{
this->showErrorMessage(parent, "CoreGetCurrentRomSettings() Failed", QString::fromStdString(CoreGetError()));
return;
}
QFileInfo qFileInfo(file);
this->romNameLineEdit->setText(QString::fromStdString(romHeader.Name));
this->romNameLineEdit->setCursorPosition(0);
this->md5LineEdit->setText(QString::fromStdString(romSettings.MD5));
this->md5LineEdit->setCursorPosition(0);
this->fileNameLineEdit->setText(qFileInfo.fileName());
this->fileNameLineEdit->setCursorPosition(0);
this->locationLineEdit->setText(qFileInfo.absolutePath());
this->locationLineEdit->setCursorPosition(0);
this->crc1LineEdit->setText(QString::number(romHeader.CRC1, 16).toUpper());
this->crc2LineEdit->setText(QString::number(romHeader.CRC2, 16).toUpper());
if (!CoreCloseRom())
{
this->showErrorMessage(parent, "CoreCloseRom() Failed", QString::fromStdString(CoreGetError()));
return;
}
this->countryCodeLineEdit->setText(QString((char)romHeader.CountryCode));
}
RomInfoDialog::~RomInfoDialog(void)
{
}
void RomInfoDialog::showErrorMessage(QWidget* parent, QString error, QString details)
{
QMessageBox msgBox(parent);
msgBox.setIcon(QMessageBox::Icon::Critical);
msgBox.setWindowTitle("Error");
msgBox.setText(error);
msgBox.setDetailedText(details);
msgBox.addButton(QMessageBox::Ok);
msgBox.exec();
}
@@ -25,11 +25,8 @@ class RomInfoDialog : public QDialog, private Ui::RomInfoDialog
{
Q_OBJECT
private:
void showErrorMessage(QWidget* parent, QString error, QString details);
public:
RomInfoDialog(QString file, QWidget *parent);
RomInfoDialog(QString file, CoreRomHeader romHeader, CoreRomSettings romSettings, QWidget *parent);
~RomInfoDialog(void);
};
} // namespace Dialog
+217 -198
View File
@@ -13,206 +13,225 @@
<property name="windowTitle">
<string>ROM Information</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string/>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>ROM Information</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>ROM Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="romNameLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>File Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="fileNameLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Location:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="locationLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>MD5:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="md5LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>CRC1:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="crc1LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>CRC2</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="crc2LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>112</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="romNameLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>File Name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="fileNameLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Location</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="locationLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>MD5</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="md5LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>CRC1</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="crc1LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>CRC2</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="crc2LineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Country Code</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="countryCodeLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
@@ -14,13 +14,17 @@
#include <QFileDialog>
#include <QMessageBox>
#include <QDirIterator>
#include <QLabel>
using namespace UserInterface::Dialog;
SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent)
{
this->setupUi(this);
this->setIconsForEmulationInfoText();
this->romOpened = CoreHasRomOpen();
if (romOpened)
{
@@ -43,13 +47,13 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent, Qt::WindowSyst
pluginList = CoreGetAllPlugins();
for (int i = 0; i < 11; i++)
for (int i = 0; i < 13; i++)
{
this->reloadSettings(i);
}
// connect hotkey settings to slot
this->commonHotkeySettings(-1);
this->commonHotkeySettings(SettingsDialogAction::ConnectSignals);
#ifndef UPDATER
this->checkForUpdatesCheckBox->setHidden(true);
@@ -62,10 +66,14 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent, Qt::WindowSyst
// aren't defined, hide the tab
// with the settings for those
#ifndef UPDATER
this->innerInterfaceTabWidget->removeTab(2);
this->innerInterfaceTabWidget->removeTab(4);
#endif // !UPDATER
#endif // !DISCORD_RPC
#ifndef _WIN32
this->innerInterfaceTabWidget->removeTab(3);
#endif
int width = CoreSettingsGetIntValue(SettingsID::GUI_SettingsDialogWidth);
int height = CoreSettingsGetIntValue(SettingsID::GUI_SettingsDialogHeight);
@@ -117,37 +125,43 @@ void SettingsDialog::restoreDefaults(int stackedWidgetIndex)
{
default:
case 0:
loadDefaultCoreSettings();
this->loadDefaultCoreSettings();
break;
case 1:
loadDefaultGameSettings();
this->loadDefaultGameSettings();
break;
case 2:
loadDefaultGameCoreSettings();
this->loadDefaultGameCoreSettings();
break;
case 3:
loadDefaultGamePluginSettings();
this->loadDefaultGamePluginSettings();
break;
case 4:
loadDefaultPluginSettings();
this->loadDefaultPluginSettings();
break;
case 5:
loadDefaultDirectorySettings();
this->loadDefaultDirectorySettings();
break;
case 6:
loadDefault64DDSettings();
this->loadDefault64DDSettings();
break;
case 7:
loadDefaultHotkeySettings();
this->loadDefaultHotkeySettings();
break;
case 8:
loadDefaultInterfaceEmulationSettings();
this->loadDefaultInterfaceEmulationSettings();
break;
case 9:
loadDefaultInterfaceRomBrowserSettings();
this->loadDefaultInterfaceRomBrowserSettings();
break;
case 10:
loadDefaultInterfaceMiscSettings();
this->loadDefaultInterfaceLogWindowSettings();
break;
case 11:
this->loadDefaultInterfaceStyleSettings();
break;
case 12:
this->loadDefaultInterfaceMiscSettings();
break;
}
}
@@ -158,37 +172,43 @@ void SettingsDialog::reloadSettings(int stackedWidgetIndex)
{
default:
case 0:
loadCoreSettings();
this->loadCoreSettings();
break;
case 1:
loadGameSettings();
this->loadGameSettings();
break;
case 2:
loadGameCoreSettings();
this->loadGameCoreSettings();
break;
case 3:
loadGamePluginSettings();
this->loadGamePluginSettings();
break;
case 4:
loadPluginSettings();
this->loadPluginSettings();
break;
case 5:
loadDirectorySettings();
this->loadDirectorySettings();
break;
case 6:
load64DDSettings();
this->load64DDSettings();
break;
case 7:
loadHotkeySettings();
this->loadHotkeySettings();
break;
case 8:
loadInterfaceEmulationSettings();
this->loadInterfaceEmulationSettings();
break;
case 9:
loadInterfaceRomBrowserSettings();
this->loadInterfaceRomBrowserSettings();
break;
case 10:
loadInterfaceMiscSettings();
this->loadInterfaceLogWindowSettings();
break;
case 11:
this->loadInterfaceStyleSettings();
break;
case 12:
this->loadInterfaceMiscSettings();
break;
}
}
@@ -213,7 +233,7 @@ void SettingsDialog::loadCoreSettings(void)
this->coreCpuEmulatorComboBox->setCurrentIndex(cpuEmulator);
this->coreRandomizeTimingCheckBox->setChecked(randomizeInterrupt);
this->coreDebuggerCheckBox->setChecked(debugger);
//this->coreDebuggerCheckBox->setChecked(debugger);
this->coreOverrideGameSettingsGroup->setChecked(overrideGameSettings);
@@ -304,7 +324,7 @@ void SettingsDialog::loadGamePluginSettings(void)
void SettingsDialog::loadPluginSettings(void)
{
this->commonPluginSettings(0);
this->commonPluginSettings(SettingsDialogAction::LoadSettings);
}
void SettingsDialog::loadDirectorySettings(void)
@@ -353,7 +373,7 @@ void SettingsDialog::load64DDSettings(void)
void SettingsDialog::loadHotkeySettings(void)
{
this->commonHotkeySettings(0);
this->commonHotkeySettings(SettingsDialogAction::LoadSettings);
}
void SettingsDialog::loadInterfaceEmulationSettings(void)
@@ -373,10 +393,24 @@ void SettingsDialog::loadInterfaceRomBrowserSettings(void)
this->romSearchLimitSpinBox->setValue(CoreSettingsGetIntValue(SettingsID::RomBrowser_MaxItems));
}
void SettingsDialog::loadInterfaceLogWindowSettings(void)
{
this->showVerboseLogMessagesCheckBox->setChecked(CoreSettingsGetBoolValue(SettingsID::GUI_ShowVerboseLogMessages));
}
void SettingsDialog::loadInterfaceStyleSettings(void)
{
this->commonInterfaceStyleSettings(SettingsDialogAction::LoadSettings);
}
void SettingsDialog::loadInterfaceMiscSettings(void)
{
#ifdef UPDATER
this->checkForUpdatesCheckBox->setChecked(CoreSettingsGetBoolValue(SettingsID::GUI_CheckForUpdates));
#endif // UPDATER
#ifdef DISCORD_RPC
this->discordRpcCheckBox->setChecked(CoreSettingsGetBoolValue(SettingsID::GUI_DiscordRpc));
#endif // DISCORD_RPC
}
void SettingsDialog::loadDefaultCoreSettings(void)
@@ -399,7 +433,7 @@ void SettingsDialog::loadDefaultCoreSettings(void)
this->coreCpuEmulatorComboBox->setCurrentIndex(cpuEmulator);
this->coreRandomizeTimingCheckBox->setChecked(randomizeInterrupt);
this->coreDebuggerCheckBox->setChecked(debugger);
//this->coreDebuggerCheckBox->setChecked(debugger);
this->coreOverrideGameSettingsGroup->setChecked(overrideGameSettings);
@@ -453,7 +487,7 @@ void SettingsDialog::loadDefaultGamePluginSettings(void)
void SettingsDialog::loadDefaultPluginSettings(void)
{
this->commonPluginSettings(1);
this->commonPluginSettings(SettingsDialogAction::LoadDefaultSettings);
}
void SettingsDialog::loadDefaultDirectorySettings(void)
@@ -476,7 +510,7 @@ void SettingsDialog::loadDefault64DDSettings(void)
void SettingsDialog::loadDefaultHotkeySettings(void)
{
this->commonHotkeySettings(1);
this->commonHotkeySettings(SettingsDialogAction::LoadDefaultSettings);
}
void SettingsDialog::loadDefaultInterfaceEmulationSettings(void)
@@ -496,10 +530,24 @@ void SettingsDialog::loadDefaultInterfaceRomBrowserSettings(void)
this->romSearchLimitSpinBox->setValue(CoreSettingsGetDefaultIntValue(SettingsID::RomBrowser_MaxItems));
}
void SettingsDialog::loadDefaultInterfaceLogWindowSettings(void)
{
this->showVerboseLogMessagesCheckBox->setChecked(CoreSettingsGetDefaultBoolValue(SettingsID::GUI_ShowVerboseLogMessages));
}
void SettingsDialog::loadDefaultInterfaceStyleSettings(void)
{
this->commonInterfaceStyleSettings(SettingsDialogAction::LoadDefaultSettings);
}
void SettingsDialog::loadDefaultInterfaceMiscSettings(void)
{
#ifdef UPDATER
this->checkForUpdatesCheckBox->setChecked(CoreSettingsGetDefaultBoolValue(SettingsID::GUI_CheckForUpdates));
#endif // UPDATER
#ifdef DISCORD_RPC
this->discordRpcCheckBox->setChecked(CoreSettingsGetDefaultBoolValue(SettingsID::GUI_DiscordRpc));
#endif // DISCORD_RPC
}
void SettingsDialog::saveSettings(void)
@@ -519,6 +567,8 @@ void SettingsDialog::saveSettings(void)
this->saveHotkeySettings();
this->saveInterfaceEmulationSettings();
this->saveInterfaceRomBrowserSettings();
this->saveInterfaceLogWindowSettings();
this->saveInterfaceStyleSettings();
this->saveInterfaceMiscSettings();
}
@@ -529,12 +579,12 @@ void SettingsDialog::saveCoreSettings(void)
int cpuEmulator = this->coreCpuEmulatorComboBox->currentIndex();
int siDmaDuration = this->coreSiDmaDurationSpinBox->value();
bool randomizeInterrupt = this->coreRandomizeTimingCheckBox->isChecked();
bool debugger = this->coreDebuggerCheckBox->isChecked();
//bool debugger = this->coreDebuggerCheckBox->isChecked();
bool overrideGameSettings = this->coreOverrideGameSettingsGroup->isChecked();
CoreSettingsSetValue(SettingsID::CoreOverlay_CPU_Emulator, cpuEmulator);
CoreSettingsSetValue(SettingsID::CoreOverlay_RandomizeInterrupt, randomizeInterrupt);
CoreSettingsSetValue(SettingsID::CoreOverlay_EnableDebugger, debugger);
//CoreSettingsSetValue(SettingsID::CoreOverlay_EnableDebugger, debugger);
CoreSettingsSetValue(SettingsID::Core_OverrideGameSpecificSettings, overrideGameSettings);
if (!overrideGameSettings)
@@ -658,7 +708,7 @@ void SettingsDialog::save64DDSettings(void)
void SettingsDialog::saveHotkeySettings(void)
{
this->commonHotkeySettings(2);
this->commonHotkeySettings(SettingsDialogAction::SaveSettings);
}
void SettingsDialog::saveInterfaceEmulationSettings(void)
@@ -678,53 +728,123 @@ void SettingsDialog::saveInterfaceRomBrowserSettings(void)
CoreSettingsSetValue(SettingsID::RomBrowser_MaxItems, this->romSearchLimitSpinBox->value());
}
void SettingsDialog::saveInterfaceMiscSettings(void)
void SettingsDialog::saveInterfaceLogWindowSettings(void)
{
CoreSettingsSetValue(SettingsID::GUI_CheckForUpdates, this->checkForUpdatesCheckBox->isChecked());
CoreSettingsSetValue(SettingsID::GUI_DiscordRpc, this->discordRpcCheckBox->isChecked());
CoreSettingsSetValue(SettingsID::GUI_ShowVerboseLogMessages, this->showVerboseLogMessagesCheckBox->isChecked());
}
void SettingsDialog::commonHotkeySettings(int action)
void SettingsDialog::saveInterfaceStyleSettings(void)
{
struct
#ifdef _WIN32
CoreSettingsSetValue(SettingsID::GUI_Style, this->styleComboBox->currentData().toString().toStdString());
CoreSettingsSetValue(SettingsID::GUI_IconTheme, this->iconThemeComboBox->currentText().toStdString());
#endif // _WIN32
}
void SettingsDialog::saveInterfaceMiscSettings(void)
{
#ifdef UPDATER
CoreSettingsSetValue(SettingsID::GUI_CheckForUpdates, this->checkForUpdatesCheckBox->isChecked());
#endif // UPDATER
#ifdef DISCORD_RPC
CoreSettingsSetValue(SettingsID::GUI_DiscordRpc, this->discordRpcCheckBox->isChecked());
#endif // DISCORD_RPC
}
void SettingsDialog::commonHotkeySettings(SettingsDialogAction action)
{
struct keybinding
{
KeybindButton* button;
SettingsID settingId;
} keybindings[] =
};
std::vector<keybinding> keybindings;
std::vector<keybinding> keybindings_System =
{
{ this->openRomKeyButton, SettingsID::KeyBinding_OpenROM },
{ this->openComboKeyButton, SettingsID::KeyBinding_OpenCombo },
{ this->startEmuKeyButton, SettingsID::KeyBinding_StartEmulation },
{ this->endEmuKeyButton, SettingsID::KeyBinding_EndEmulation },
{ this->startRomKeyButton, SettingsID::KeyBinding_StartROM },
{ this->startComboKeyButton, SettingsID::KeyBinding_StartCombo },
{ this->shutdownKeyButton, SettingsID::KeyBinding_Shutdown },
{ this->refreshRomListKeyButton, SettingsID::KeyBinding_RefreshROMList },
{ this->exitKeyButton, SettingsID::KeyBinding_Exit },
{ this->softResetKeyButton, SettingsID::KeyBinding_SoftReset },
{ this->hardResetKeyButton, SettingsID::KeyBinding_HardReset },
{ this->pauseKeyButton, SettingsID::KeyBinding_Resume },
{ this->generateBitmapKeyButton, SettingsID::KeyBinding_GenerateBitmap },
{ this->generateBitmapKeyButton, SettingsID::KeyBinding_Screenshot },
{ this->limitFPSKeyButton, SettingsID::KeyBinding_LimitFPS },
{ this->swapDiskKeyButton, SettingsID::KeyBinding_SwapDisk },
{ this->saveStateKeyButton, SettingsID::KeyBinding_SaveState },
{ this->saveAsKeyButton, SettingsID::KeyBinding_SaveAs },
{ this->loadStateKeyButton, SettingsID::KeyBinding_LoadState },
{ this->loadKeyButton, SettingsID::KeyBinding_Load },
{ this->cheatsKeyButton, SettingsID::KeyBinding_Cheats },
{ this->gsButtonKeyButton, SettingsID::KeyBinding_GSButton },
{ this->fullscreenKeyButton, SettingsID::KeyBinding_Fullscreen },
};
std::vector<keybinding> keybindings_CurrentSaveState =
{
{ this->saveState0KeyButton, SettingsID::KeyBinding_SaveStateSlot0 },
{ this->saveState1KeyButton, SettingsID::KeyBinding_SaveStateSlot1 },
{ this->saveState2KeyButton, SettingsID::KeyBinding_SaveStateSlot2 },
{ this->saveState3KeyButton, SettingsID::KeyBinding_SaveStateSlot3 },
{ this->saveState4KeyButton, SettingsID::KeyBinding_SaveStateSlot4 },
{ this->saveState5KeyButton, SettingsID::KeyBinding_SaveStateSlot5 },
{ this->saveState6KeyButton, SettingsID::KeyBinding_SaveStateSlot6 },
{ this->saveState7KeyButton, SettingsID::KeyBinding_SaveStateSlot7 },
{ this->saveState8KeyButton, SettingsID::KeyBinding_SaveStateSlot8 },
{ this->saveState9KeyButton, SettingsID::KeyBinding_SaveStateSlot9 },
};
std::vector<keybinding> keybindings_Settings =
{
{ this->settingsKeyButton, SettingsID::KeyBinding_Settings },
};
std::vector<keybinding> keybindings_View =
{
{ this->fullscreenKeyButton, SettingsID::KeyBinding_Fullscreen },
};
if (action == SettingsDialogAction::LoadDefaultSettings)
{
int index = this->keybindingsMenuTabWidget->currentIndex();
switch (index)
{
default:
case 0:
keybindings.insert(keybindings.end(), keybindings_System.begin(), keybindings_System.end());
break;
case 1:
keybindings.insert(keybindings.end(), keybindings_CurrentSaveState.begin(), keybindings_CurrentSaveState.end());
break;
case 2:
keybindings.insert(keybindings.end(), keybindings_Settings.begin(), keybindings_Settings.end());
break;
case 3:
keybindings.insert(keybindings.end(), keybindings_View.begin(), keybindings_View.end());
break;
}
}
else
{
keybindings.insert(keybindings.end(), keybindings_System.begin(), keybindings_System.end());
keybindings.insert(keybindings.end(), keybindings_CurrentSaveState.begin(), keybindings_CurrentSaveState.end());
keybindings.insert(keybindings.end(), keybindings_Settings.begin(), keybindings_Settings.end());
keybindings.insert(keybindings.end(), keybindings_View.begin(), keybindings_View.end());
}
switch (action)
{
default:
break;
case 0:
case SettingsDialogAction::LoadSettings:
this->removeDuplicateHotkeysCheckBox->setChecked(CoreSettingsGetBoolValue(SettingsID::KeyBinding_RemoveDuplicates));
break;
case 1:
case SettingsDialogAction::LoadDefaultSettings:
this->removeDuplicateHotkeysCheckBox->setChecked(CoreSettingsGetDefaultBoolValue(SettingsID::KeyBinding_RemoveDuplicates));
break;
case 2:
case SettingsDialogAction::SaveSettings:
CoreSettingsSetValue(SettingsID::KeyBinding_RemoveDuplicates, this->removeDuplicateHotkeysCheckBox->isChecked());
break;
}
@@ -734,22 +854,22 @@ void SettingsDialog::commonHotkeySettings(int action)
switch (action)
{
default:
case -1:
case SettingsDialogAction::ConnectSignals:
connect(keybinding.button, &KeybindButton::on_KeybindButton_KeybindingChanged, this, &SettingsDialog::on_KeybindButton_KeybindingChanged);
case 0:
case SettingsDialogAction::LoadSettings:
keybinding.button->setText(QString::fromStdString(CoreSettingsGetStringValue(keybinding.settingId)));
break;
case 1:
case SettingsDialogAction::LoadDefaultSettings:
keybinding.button->setText(QString::fromStdString(CoreSettingsGetDefaultStringValue(keybinding.settingId)));
break;
case 2:
case SettingsDialogAction::SaveSettings:
CoreSettingsSetValue(keybinding.settingId, keybinding.button->text().toStdString());
break;
}
}
}
void SettingsDialog::commonPluginSettings(int action)
void SettingsDialog::commonPluginSettings(SettingsDialogAction action)
{
QComboBox *comboBoxArray[] = {this->rspPluginsComboBox, this->videoPluginsComboBox,
this->audioPluginsComboBox, this->inputPluginsComboBox};
@@ -772,7 +892,7 @@ void SettingsDialog::commonPluginSettings(int action)
index = ((int)p.Type - 1);
comboBox = comboBoxArray[index];
pluginFileName = action == 0 ?
pluginFileName = action == SettingsDialogAction::LoadSettings ?
CoreSettingsGetStringValue(settingsIdArray[index]) :
CoreSettingsGetDefaultStringValue(settingsIdArray[index]);
@@ -796,11 +916,79 @@ void SettingsDialog::commonPluginSettings(int action)
}
}
void SettingsDialog::commonInterfaceStyleSettings(SettingsDialogAction action)
{
#ifdef _WIN32
this->styleComboBox->clear();
this->styleComboBox->addItem("None", "");
QString currentStyle = action == SettingsDialogAction::LoadSettings ?
QString::fromStdString(CoreSettingsGetStringValue(SettingsID::GUI_Style)) :
QString::fromStdString(CoreSettingsGetDefaultStringValue(SettingsID::GUI_Style));
QString directory;
directory = QString::fromStdString(CoreGetSharedDataDirectory().string());
directory += "\\Styles\\";
QStringList filter;
filter << "*.qss";
bool styleFound = false;
QDirIterator stylesDirectoryIter(directory, filter, QDir::Files, QDirIterator::NoIteratorFlags);
while (stylesDirectoryIter.hasNext())
{
QString filePath = stylesDirectoryIter.next();
QFileInfo fileInfo(filePath);
this->styleComboBox->addItem(fileInfo.baseName(), filePath);
if (filePath == currentStyle)
{
styleFound = true;
this->styleComboBox->setCurrentText(fileInfo.baseName());
}
}
if (currentStyle.isEmpty())
{
this->styleComboBox->setCurrentText("None");
styleFound = true;
}
if (!styleFound)
{
this->styleComboBox->addItem("", "");
this->styleComboBox->setCurrentText("");
}
QString currentIconTheme = action == SettingsDialogAction::LoadSettings ?
QString::fromStdString(CoreSettingsGetStringValue(SettingsID::GUI_IconTheme)) :
QString::fromStdString(CoreSettingsGetDefaultStringValue(SettingsID::GUI_IconTheme));
this->iconThemeComboBox->setCurrentText(currentIconTheme);
#endif // _WIN32
}
void SettingsDialog::setIconsForEmulationInfoText(void)
{
QLabel* labels[] = {
this->infoIconLabel_0, this->infoIconLabel_1, this->infoIconLabel_2,
this->infoIconLabel_3, this->infoIconLabel_4, this->infoIconLabel_5,
this->infoIconLabel_6, this->infoIconLabel_7
};
QIcon infoIcon = QIcon::fromTheme("information-line");
QPixmap infoIconPixmap = infoIcon.pixmap(16, 16);
for (QLabel* label : labels)
{
label->setPixmap(infoIconPixmap);
}
}
void SettingsDialog::hideEmulationInfoText(void)
{
QHBoxLayout *layouts[] = {this->emulationInfoLayout_0, this->emulationInfoLayout_1,
this->emulationInfoLayout_2, this->emulationInfoLayout_3,
this->emulationInfoLayout_9, this->emulationInfoLayout_13};
this->emulationInfoLayout_9};
for (const auto &layout : layouts)
{
@@ -838,6 +1026,40 @@ void SettingsDialog::chooseIPLRom(QLineEdit *lineEdit)
lineEdit->setText(file);
}
bool SettingsDialog::applyPluginSettings(void)
{
// attempt to apply plugin settings when emulation
// isn't running, when it fails, show the user the error and
// don't allow the user to save invalid settings
if (!CoreIsEmulationPaused() && !CoreIsEmulationRunning())
{
if (!CoreApplyPluginSettings())
{
QMessageBox msgBox(this);
msgBox.setIcon(QMessageBox::Icon::Critical);
msgBox.setWindowTitle("Error");
msgBox.setText("CoreApplyPluginSettings() Failed");
msgBox.setDetailedText(QString::fromStdString(CoreGetError()));
msgBox.addButton(QMessageBox::Ok);
msgBox.exec();
return false;
}
}
return true;
}
void SettingsDialog::closeEvent(QCloseEvent* event)
{
if (this->applyPluginSettings())
{
event->accept();
}
else
{
event->ignore();
}
}
void SettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
{
QPushButton *pushButton = (QPushButton *)button;
@@ -853,22 +1075,9 @@ void SettingsDialog::on_buttonBox_clicked(QAbstractButton *button)
this->saveSettings();
}
// attempt to apply plugin settings when emulation
// isn't running, when it fails, show the user the error and
// don't allow the user to save invalid settings
if (!CoreIsEmulationPaused() && !CoreIsEmulationRunning())
if (!this->applyPluginSettings())
{
if (!CoreApplyPluginSettings())
{
QMessageBox msgBox(this);
msgBox.setIcon(QMessageBox::Icon::Critical);
msgBox.setWindowTitle("Error");
msgBox.setText("CoreApplyPluginSettings() Failed");
msgBox.setDetailedText(QString::fromStdString(CoreGetError()));
msgBox.addButton(QMessageBox::Ok);
msgBox.exec();
return;
}
return;
}
}
@@ -941,10 +1150,9 @@ void SettingsDialog::on_KeybindButton_KeybindingChanged(KeybindButton* button)
KeybindButton* keybindButtons[] =
{
this->openRomKeyButton,
this->openComboKeyButton,
this->startEmuKeyButton,
this->endEmuKeyButton,
this->startRomKeyButton,
this->startComboKeyButton,
this->shutdownKeyButton,
this->refreshRomListKeyButton,
this->exitKeyButton,
this->softResetKeyButton,
@@ -952,15 +1160,24 @@ void SettingsDialog::on_KeybindButton_KeybindingChanged(KeybindButton* button)
this->pauseKeyButton,
this->generateBitmapKeyButton,
this->limitFPSKeyButton,
this->swapDiskKeyButton,
this->saveStateKeyButton,
this->saveAsKeyButton,
this->loadStateKeyButton,
this->loadKeyButton,
this->cheatsKeyButton,
this->gsButtonKeyButton,
this->fullscreenKeyButton,
this->saveState0KeyButton,
this->saveState1KeyButton,
this->saveState2KeyButton,
this->saveState3KeyButton,
this->saveState4KeyButton,
this->saveState5KeyButton,
this->saveState6KeyButton,
this->saveState7KeyButton,
this->saveState8KeyButton,
this->saveState9KeyButton,
this->settingsKeyButton,
this->fullscreenKeyButton,
};
for (KeybindButton* keybindButton : keybindButtons)
@@ -37,6 +37,14 @@ class SettingsDialog : public QDialog, private Ui::SettingsDialog
Q_OBJECT
private:
enum class SettingsDialogAction
{
ConnectSignals = 0,
LoadSettings,
LoadDefaultSettings,
SaveSettings
};
bool romOpened = false;
CoreRomSettings currentGameSettings;
@@ -61,6 +69,8 @@ class SettingsDialog : public QDialog, private Ui::SettingsDialog
void loadHotkeySettings(void);
void loadInterfaceEmulationSettings(void);
void loadInterfaceRomBrowserSettings(void);
void loadInterfaceLogWindowSettings(void);
void loadInterfaceStyleSettings(void);
void loadInterfaceMiscSettings(void);
void loadDefaultCoreSettings(void);
@@ -73,6 +83,8 @@ class SettingsDialog : public QDialog, private Ui::SettingsDialog
void loadDefaultHotkeySettings(void);
void loadDefaultInterfaceEmulationSettings(void);
void loadDefaultInterfaceRomBrowserSettings(void);
void loadDefaultInterfaceLogWindowSettings(void);
void loadDefaultInterfaceStyleSettings(void);
void loadDefaultInterfaceMiscSettings(void);
void saveSettings(void);
@@ -86,16 +98,25 @@ class SettingsDialog : public QDialog, private Ui::SettingsDialog
void saveHotkeySettings(void);
void saveInterfaceEmulationSettings(void);
void saveInterfaceRomBrowserSettings(void);
void saveInterfaceLogWindowSettings(void);
void saveInterfaceStyleSettings(void);
void saveInterfaceMiscSettings(void);
void commonHotkeySettings(int);
void commonPluginSettings(int);
void commonHotkeySettings(SettingsDialogAction);
void commonPluginSettings(SettingsDialogAction);
void commonInterfaceStyleSettings(SettingsDialogAction);
void setIconsForEmulationInfoText(void);
void hideEmulationInfoText(void);
void chooseDirectory(QLineEdit *);
void chooseIPLRom(QLineEdit *);
bool applyPluginSettings(void);
protected:
void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE;
private slots:
void on_buttonBox_clicked(QAbstractButton *);
@@ -1,5 +0,0 @@
<RCC>
<qresource prefix="newPrefix">
<file>Resource/Info.ico</file>
</qresource>
</RCC>
File diff suppressed because it is too large Load Diff
@@ -23,7 +23,7 @@
using namespace UserInterface::Dialog;
UpdateDialog::UpdateDialog(QWidget *parent, QJsonObject jsonObject) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
UpdateDialog::UpdateDialog(QWidget *parent, QJsonObject jsonObject) : QDialog(parent)
{
this->setupUi(this);
File diff suppressed because it is too large Load Diff
+68 -90
View File
@@ -14,15 +14,16 @@
#include "Dialog/SettingsDialog.hpp"
#include "Dialog/CheatsDialog.hpp"
#include "Dialog/RomInfoDialog.hpp"
#include "Dialog/LogDialog.hpp"
#include "EventFilter.hpp"
#include "Widget/OGLWidget.hpp"
#include "Widget/RomBrowserWidget.hpp"
#include "Callbacks.hpp"
#include <QAction>
#include <QToolBar>
#include <QCloseEvent>
#include <QMainWindow>
#include <QOpenGLWidget>
#include <QSettings>
#include <QStackedWidget>
#include <QGuiApplication>
@@ -34,9 +35,11 @@
#include <QJsonObject>
#endif // UPDATER
#include "ui_MainWindow.h"
namespace UserInterface
{
class MainWindow : public QMainWindow
class MainWindow : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
@@ -44,12 +47,10 @@ class MainWindow : public QMainWindow
MainWindow(void);
~MainWindow(void);
bool Init(QGuiApplication*);
void OpenROM(QString, QString, bool);
bool Init(QApplication*);
void OpenROM(QString, QString, bool, bool);
private:
QIcon ui_Icon;
Thread::EmulationThread *emulationThread;
CoreCallbacks* coreCallBacks;
@@ -60,89 +61,61 @@ class MainWindow : public QMainWindow
EventFilter *ui_EventFilter;
QLabel *ui_StatusBar_Label;
QMenuBar *menuBar;
QMenu *menuBar_Menu;
QAction *action_File_OpenRom;
QAction *action_File_OpenCombo;
QAction *action_File_StartEmulation;
QAction *action_File_EndEmulation;
QAction *action_File_Language;
QAction *action_File_ChooseDirectory;
QAction *action_File_RefreshRomList;
QAction *action_File_RecentRom;
QAction *action_File_RecentRomDirectories;
QAction *action_File_Exit;
QAction *action_System_SoftReset;
QAction *action_System_HardReset;
QAction *action_System_Pause;
QAction *action_System_CaptureScreenshot;
QAction *action_System_LimitFPS;
QAction *action_System_SwapDisk;
QAction *action_System_SaveState;
QAction *action_System_SaveAs;
QAction *action_System_LoadState;
QAction *action_System_Load;
QMenu *menu_System_CurrentSaveState;
QAction *action_System_Cheats;
QAction *action_System_GSButton;
QAction *action_Options_FullScreen;
QAction *action_Options_ConfigGfx;
QAction *action_Options_ConfigAudio;
QAction *action_Options_ConfigRsp;
QAction *action_Options_ConfigControl;
QAction *action_Options_Settings;
QAction *action_Help_HomePage;
QAction *action_Help_About;
QByteArray ui_Geometry;
bool ui_Geometry_Saved = false;
QByteArray ui_VidExt_Geometry;
bool ui_VidExt_Geometry_Saved;
bool ui_AllowManualResizing;
bool ui_HideCursorInEmulation;
bool ui_HideCursorInFullscreenEmulation;
bool ui_AllowManualResizing = false;
bool ui_HideCursorInEmulation = false;
bool ui_HideCursorInFullscreenEmulation = false;
bool ui_NoSwitchToRomBrowser = false;
bool ui_VidExtForceSetMode;
bool ui_LaunchInFullscreen = false;
bool ui_VidExtForceSetMode = false;
bool ui_LaunchInFullscreen = false;
bool ui_QuitAfterEmulation = false;
bool ui_RefreshRomListAfterEmulation = false;
bool ui_ShowToolbar = false;
bool ui_ShowStatusbar = false;
bool ui_ManuallyPaused = true;
int ui_TimerId = 0;
int ui_TimerId = 0;
int ui_TimerTimeout = 0;
int ui_FullscreenTimerId = 0;
int ui_GamesharkButtonTimerId = 0;
QString ui_WindowTitle;
Dialog::LogDialog logDialog;
void closeEvent(QCloseEvent *) Q_DECL_OVERRIDE;
void ui_Init();
void ui_Setup();
void ui_Stylesheet_Setup();
void ui_MessageBox(QString, QString, QString);
void ui_InEmulation(bool, bool);
void ui_SaveGeometry(void);
void ui_LoadGeometry(void);
void initializeUI();
void configureUI(QApplication*);
void configureTheme(QApplication*);
void menuBar_Init(void);
void menuBar_Setup(bool, bool);
void showErrorMessage(QString, QString);
void updateUI(bool, bool);
void emulationThread_Init(void);
void emulationThread_Connect(void);
void emulationThread_Launch(QString, QString);
void emulationThread_Launch(QString);
void storeGeometry(void);
void loadGeometry(void);
void ui_Actions_Init(void);
void ui_Actions_Setup(bool, bool);
void ui_Actions_Add(void);
void ui_Actions_Remove(void);
void ui_Actions_Connect(void);
void initializeEmulationThread(void);
void connectEmulationThreadSignals(void);
void launchEmulationThread(QString, QString);
void launchEmulationThread(QString);
void configureActions(void);
void connectActionSignals(void);
void updateActions(bool, bool);
void addFullscreenActions(void);
void removeFullscreenActions(void);
#ifdef UPDATER
void ui_CheckForUpdates(void);
void checkForUpdates(void);
#endif // UPDATER
protected:
void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE;
@@ -150,7 +123,6 @@ class MainWindow : public QMainWindow
private slots:
void on_EventFilter_KeyPressed(QKeyEvent *);
void on_EventFilter_KeyReleased(QKeyEvent *);
void on_EventFilter_FileDropped(QDropEvent *);
void on_QGuiApplication_applicationStateChanged(Qt::ApplicationState);
@@ -158,18 +130,14 @@ class MainWindow : public QMainWindow
void on_networkAccessManager_Finished(QNetworkReply *);
#endif // UPDATER
void on_Action_File_OpenRom(void);
void on_Action_File_OpenCombo(void);
void on_Action_File_EndEmulation(void);
void on_Action_File_ChooseDirectory(void);
void on_Action_File_RefreshRomList(void);
void on_Action_File_Exit(void);
void on_Action_System_OpenRom(void);
void on_Action_System_OpenCombo(void);
void on_Action_System_Shutdown(void);
void on_Action_System_SoftReset(void);
void on_Action_System_HardReset(void);
void on_Action_System_Pause(void);
void on_Action_System_GenerateBitmap(void);
void on_Action_System_LimitFPS(void);
void on_Action_System_SwapDisk(void);
void on_Action_System_SaveState(void);
void on_Action_System_SaveAs(void);
void on_Action_System_LoadState(void);
@@ -177,13 +145,25 @@ class MainWindow : public QMainWindow
void on_Action_System_CurrentSaveState(int);
void on_Action_System_Cheats(void);
void on_Action_System_GSButton(void);
void on_Action_Options_FullScreen(void);
void on_Action_Options_ConfigGfx(void);
void on_Action_Options_ConfigAudio(void);
void on_Action_Options_ConfigRsp(void);
void on_Action_Options_ConfigControl(void);
void on_Action_Options_Settings(void);
void on_Action_Help_HomePage(void);
void on_Action_System_Exit(void);
void on_Action_Settings_Graphics(void);
void on_Action_Settings_Audio(void);
void on_Action_Settings_Rsp(void);
void on_Action_Settings_Input(void);
void on_Action_Settings_Settings(void);
void on_Action_View_Toolbar(bool);
void on_Action_View_StatusBar(bool);
void on_Action_View_GameList(bool);
void on_Action_View_GameGrid(bool);
void on_Action_View_UniformSize(bool);
void on_Action_View_Fullscreen(void);
void on_Action_View_RefreshRoms(void);
void on_Action_View_ClearRomCache(void);
void on_Action_View_Log(void);
void on_Action_Help_Github(void);
void on_Action_Help_About(void);
void on_Emulation_Started(void);
@@ -191,6 +171,7 @@ class MainWindow : public QMainWindow
void on_RomBrowser_PlayGame(QString);
void on_RomBrowser_PlayGameWithDisk(QString);
void on_RomBrowser_ChangeRomDirectory(void);
void on_RomBrowser_RomInformation(QString);
void on_RomBrowser_EditGameSettings(QString);
void on_RomBrowser_Cheats(QString);
@@ -199,15 +180,12 @@ class MainWindow : public QMainWindow
void on_VidExt_Init(void);
void on_VidExt_SetupOGL(QSurfaceFormat, QThread *);
void on_VidExt_SetMode(int, int, int, int, int);
void on_VidExt_SetWindowedModeWithRate(int, int, int, int, int);
void on_VidExt_SetFullscreenModeWithRate(int, int, int, int, int);
void on_VidExt_SetWindowedMode(int, int, int, int);
void on_VidExt_SetFullscreenMode(int, int, int, int);
void on_VidExt_ResizeWindow(int, int);
void on_VidExt_SetCaption(QString);
void on_VidExt_ToggleFS(bool);
void on_VidExt_Quit(void);
void on_Core_DebugCallback(CoreDebugMessageType, QString);
void on_Core_DebugCallback(CoreDebugMessageType, QString, QString);
};
} // namespace UserInterface
+540
View File
@@ -0,0 +1,540 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>639</width>
<height>543</height>
</rect>
</property>
<property name="windowTitle">
<string>Rosalie's Mupen GUI (VERSION)</string>
</property>
<property name="windowIcon">
<iconset resource="UIResources.qrc">
<normaloff>:/Resource/RMG.png</normaloff>:/Resource/RMG.png</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout"/>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>639</width>
<height>30</height>
</rect>
</property>
<widget class="QMenu" name="menuSystem">
<property name="title">
<string>System</string>
</property>
<widget class="QMenu" name="menuReset">
<property name="title">
<string>Reset</string>
</property>
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<addaction name="action_System_SoftReset"/>
<addaction name="action_System_HardReset"/>
</widget>
<widget class="QMenu" name="menuCurrent_Save_State">
<property name="title">
<string>Current Save State</string>
</property>
<property name="icon">
<iconset theme="save-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<addaction name="actionSlot_0"/>
<addaction name="actionSlot_1"/>
<addaction name="actionSlot_2"/>
<addaction name="actionSlot_3"/>
<addaction name="actionSlot_4"/>
<addaction name="actionSlot_5"/>
<addaction name="actionSlot_6"/>
<addaction name="actionSlot_7"/>
<addaction name="actionSlot_8"/>
<addaction name="actionSlot_9"/>
</widget>
<addaction name="action_System_StartRom"/>
<addaction name="action_System_OpenCombo"/>
<addaction name="separator"/>
<addaction name="action_System_Shutdown"/>
<addaction name="menuReset"/>
<addaction name="action_System_Pause"/>
<addaction name="separator"/>
<addaction name="action_System_Screenshot"/>
<addaction name="separator"/>
<addaction name="action_System_LimitFPS"/>
<addaction name="separator"/>
<addaction name="action_System_SaveState"/>
<addaction name="action_System_SaveAs"/>
<addaction name="action_System_LoadState"/>
<addaction name="action_System_Load"/>
<addaction name="separator"/>
<addaction name="menuCurrent_Save_State"/>
<addaction name="separator"/>
<addaction name="action_System_Cheats"/>
<addaction name="action_System_GSButton"/>
<addaction name="separator"/>
<addaction name="action_System_Exit"/>
</widget>
<widget class="QMenu" name="menuSettings">
<property name="title">
<string>Settings</string>
</property>
<addaction name="action_Settings_Graphics"/>
<addaction name="action_Settings_Audio"/>
<addaction name="action_Settings_Rsp"/>
<addaction name="action_Settings_Input"/>
<addaction name="separator"/>
<addaction name="action_Settings_Settings"/>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
<string>View</string>
</property>
<addaction name="action_View_Toolbar"/>
<addaction name="action_View_StatusBar"/>
<addaction name="separator"/>
<addaction name="action_View_GameList"/>
<addaction name="action_View_GameGrid"/>
<addaction name="separator"/>
<addaction name="action_View_UniformSize"/>
<addaction name="separator"/>
<addaction name="action_View_Fullscreen"/>
<addaction name="separator"/>
<addaction name="action_View_RefreshRoms"/>
<addaction name="action_View_ClearRomCache"/>
<addaction name="separator"/>
<addaction name="action_View_Log"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="action_Help_Github"/>
<addaction name="separator"/>
<addaction name="action_Help_About"/>
</widget>
<addaction name="menuSystem"/>
<addaction name="menuSettings"/>
<addaction name="menuView"/>
<addaction name="menuHelp"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<property name="movable">
<bool>false</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="action_System_StartRom"/>
<addaction name="action_System_OpenCombo"/>
<addaction name="separator"/>
<addaction name="action_System_Shutdown"/>
<addaction name="action_System_SoftReset"/>
<addaction name="action_System_Pause"/>
<addaction name="action_System_Screenshot"/>
<addaction name="separator"/>
<addaction name="action_View_Fullscreen"/>
<addaction name="separator"/>
<addaction name="action_Settings_Settings"/>
</widget>
<action name="action_System_StartRom">
<property name="icon">
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start ROM</string>
</property>
</action>
<action name="action_System_OpenCombo">
<property name="icon">
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start Combo</string>
</property>
</action>
<action name="action_System_Shutdown">
<property name="icon">
<iconset theme="shut-down-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Shutdown</string>
</property>
</action>
<action name="action_System_SoftReset">
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Soft Reset</string>
</property>
</action>
<action name="action_System_HardReset">
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Hard Reset</string>
</property>
</action>
<action name="action_System_Pause">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pause-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Pause</string>
</property>
</action>
<action name="action_System_Screenshot">
<property name="icon">
<iconset theme="screenshot-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Screenshot</string>
</property>
</action>
<action name="action_System_LimitFPS">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="speed-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Limit FPS</string>
</property>
</action>
<action name="action_System_SaveState">
<property name="icon">
<iconset theme="save-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Save State</string>
</property>
</action>
<action name="action_System_SaveAs">
<property name="icon">
<iconset theme="save-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Save As...</string>
</property>
</action>
<action name="action_System_LoadState">
<property name="icon">
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Load State</string>
</property>
</action>
<action name="action_System_Load">
<property name="icon">
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Load...</string>
</property>
</action>
<action name="actionSlot_0">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 0</string>
</property>
</action>
<action name="actionSlot_1">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 1</string>
</property>
</action>
<action name="actionSlot_2">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 2</string>
</property>
</action>
<action name="actionSlot_3">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 3</string>
</property>
</action>
<action name="actionSlot_4">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 4</string>
</property>
</action>
<action name="actionSlot_5">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 5</string>
</property>
</action>
<action name="actionSlot_6">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 6</string>
</property>
</action>
<action name="actionSlot_7">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 7</string>
</property>
</action>
<action name="actionSlot_8">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 8</string>
</property>
</action>
<action name="actionSlot_9">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Slot 9</string>
</property>
</action>
<action name="action_System_Cheats">
<property name="icon">
<iconset theme="code-box-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Cheats...</string>
</property>
</action>
<action name="action_System_GSButton">
<property name="icon">
<iconset theme="checkbox-blank-circle-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>GS Button</string>
</property>
</action>
<action name="action_System_Exit">
<property name="icon">
<iconset theme="door-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Exit</string>
</property>
</action>
<action name="action_Settings_Graphics">
<property name="icon">
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Graphics</string>
</property>
</action>
<action name="action_Settings_Input">
<property name="icon">
<iconset theme="gamepad-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Input</string>
</property>
</action>
<action name="action_Settings_Rsp">
<property name="icon">
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>RSP</string>
</property>
</action>
<action name="action_Settings_Audio">
<property name="icon">
<iconset theme="volume-up-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Audio</string>
</property>
</action>
<action name="action_Settings_Settings">
<property name="icon">
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Settings</string>
</property>
</action>
<action name="action_View_Fullscreen">
<property name="icon">
<iconset theme="fullscreen-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Fullscreen</string>
</property>
</action>
<action name="action_Help_Github">
<property name="icon">
<iconset theme="github-fill">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Github Repository</string>
</property>
</action>
<action name="action_Help_About">
<property name="icon">
<iconset theme="information-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>About RMG</string>
</property>
</action>
<action name="action_View_Toolbar">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="tools-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Toolbar</string>
</property>
</action>
<action name="action_View_StatusBar">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="information-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Status Bar</string>
</property>
</action>
<action name="action_View_GameList">
<property name="icon">
<iconset theme="list-check">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game List</string>
</property>
</action>
<action name="action_View_GameGrid">
<property name="icon">
<iconset theme="function-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game Grid</string>
</property>
</action>
<action name="action_View_RefreshRoms">
<property name="icon">
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Refresh ROMs</string>
</property>
</action>
<action name="action_View_Log">
<property name="icon">
<iconset theme="file-list-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Log</string>
</property>
</action>
<action name="action_View_ClearRomCache">
<property name="icon">
<iconset theme="delete-bin-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Clear ROM Cache</string>
</property>
</action>
<action name="action_View_UniformSize">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="function-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Uniform Size (Grid View)</string>
</property>
</action>
</widget>
<resources>
<include location="UIResources.qrc"/>
</resources>
<connections/>
</ui>
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

@@ -0,0 +1,9 @@
[Icon Theme]
Name=Black Icon Theme
Comment=Black Icon Theme
[svg]
Size=64
Type=Scalable
MinSize=64
MaxSize=1024
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M15.456 9.678l-.142-.142a5.475 5.475 0 0 0-2.39-1.349c-2.907-.778-5.699.869-6.492 3.83-.043.16-.066.34-.104.791-.154 1.87-.594 3.265-1.8 4.68 2.26.888 4.938 1.514 6.974 1.514a5.505 5.505 0 0 0 5.31-4.078 5.497 5.497 0 0 0-1.356-5.246zM13.29 6.216l4.939-3.841a1 1 0 0 1 1.32.082l2.995 2.994a1 1 0 0 1 .082 1.321l-3.84 4.938a7.505 7.505 0 0 1-7.283 9.292C8 21.002 3.5 19.5 1 18c3.98-3 3.047-4.81 3.5-6.5 1.058-3.95 4.842-6.257 8.789-5.284zm3.413 1.879c.065.063.13.128.193.194l1.135 1.134 2.475-3.182-1.746-1.746-3.182 2.475 1.125 1.125z"/></svg>

After

Width:  |  Height:  |  Size: 672 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16z"/></svg>

After

Width:  |  Height:  |  Size: 246 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h16V5H4zm16 7l-3.536 3.536-1.414-1.415L17.172 12 15.05 9.879l1.414-1.415L20 12zM6.828 12l2.122 2.121-1.414 1.415L4 12l3.536-3.536L8.95 9.88 6.828 12zm4.416 5H9.116l3.64-10h2.128l-3.64 10z"/></svg>

After

Width:  |  Height:  |  Size: 403 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm1 2H6v12h12V8zm-9 3h2v6H9v-6zm4 0h2v6h-2v-6zM9 4v2h6V4H9z"/></svg>

After

Width:  |  Height:  |  Size: 284 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0H24V24H0z"/><path d="M2 21v-2h2V4.835c0-.484.346-.898.821-.984l9.472-1.722c.326-.06.638.157.697.483.007.035.01.07.01.107v1.28L19 4c.552 0 1 .448 1 1v14h2v2h-4V6h-3v15H2zM13 4.396L6 5.67V19h7V4.396zM12 11v2h-2v-2h2z"/></svg>

After

Width:  |  Height:  |  Size: 331 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8l6-5.997zM5.83 8H9V4.83L5.83 8zM11 4v5a1 1 0 0 1-1 1H5v10h14V4h-8z"/></svg>

After

Width:  |  Height:  |  Size: 305 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M20 22H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1zm-1-2V4H5v16h14zM8 7h8v2H8V7zm0 4h8v2H8v-2zm0 4h8v2H8v-2z"/></svg>

After

Width:  |  Height:  |  Size: 268 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 21a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2H20a1 1 0 0 1 1 1v3h-2V7h-7.414l-2-2H4v11.998L5.5 11h17l-2.31 9.243a1 1 0 0 1-.97.757H3zm16.938-8H7.062l-1.5 6h12.876l1.5-6z"/></svg>

After

Width:  |  Height:  |  Size: 307 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M20 3h2v6h-2V5h-4V3h4zM4 3h4v2H4v4H2V3h2zm16 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"/></svg>

After

Width:  |  Height:  |  Size: 220 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 3h8v8H3V3zm0 10h8v8H3v-8zM13 3h8v8h-8V3zm0 10h8v8h-8v-8zm2-8v4h4V5h-4zm0 10v4h4v-4h-4zM5 5v4h4V5H5zm0 10v4h4v-4H5z"/></svg>

After

Width:  |  Height:  |  Size: 255 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17 4a6 6 0 0 1 6 6v4a6 6 0 0 1-6 6H7a6 6 0 0 1-6-6v-4a6 6 0 0 1 6-6h10zm0 2H7a4 4 0 0 0-3.995 3.8L3 10v4a4 4 0 0 0 3.8 3.995L7 18h10a4 4 0 0 0 3.995-3.8L21 14v-4a4 4 0 0 0-3.8-3.995L17 6zm-7 3v2h2v2H9.999L10 15H8l-.001-2H6v-2h2V9h2zm8 4v2h-2v-2h2zm-2-4v2h-2V9h2z"/></svg>

After

Width:  |  Height:  |  Size: 401 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2C6.475 2 2 6.475 2 12a9.994 9.994 0 0 0 6.838 9.488c.5.087.687-.213.687-.476 0-.237-.013-1.024-.013-1.862-2.512.463-3.162-.612-3.362-1.175-.113-.288-.6-1.175-1.025-1.413-.35-.187-.85-.65-.013-.662.788-.013 1.35.725 1.538 1.025.9 1.512 2.338 1.087 2.912.825.088-.65.35-1.087.638-1.337-2.225-.25-4.55-1.113-4.55-4.938 0-1.088.387-1.987 1.025-2.688-.1-.25-.45-1.275.1-2.65 0 0 .837-.262 2.75 1.026a9.28 9.28 0 0 1 2.5-.338c.85 0 1.7.112 2.5.337 1.912-1.3 2.75-1.024 2.75-1.024.55 1.375.2 2.4.1 2.65.637.7 1.025 1.587 1.025 2.687 0 3.838-2.337 4.688-4.562 4.938.362.312.675.912.675 1.85 0 1.337-.013 2.412-.013 2.75 0 .262.188.574.688.474A10.016 10.016 0 0 0 22 12c0-5.525-4.475-10-10-10z"/></svg>

After

Width:  |  Height:  |  Size: 827 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z"/></svg>

After

Width:  |  Height:  |  Size: 276 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M8 4h13v2H8V4zm-5-.5h3v3H3v-3zm0 7h3v3H3v-3zm0 7h3v3H3v-3zM8 11h13v2H8v-2zm0 7h13v2H8v-2z"/></svg>

After

Width:  |  Height:  |  Size: 227 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M6 5h2v14H6V5zm10 0h2v14h-2V5z"/></svg>

After

Width:  |  Height:  |  Size: 168 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.394 12L10 7.737v8.526L16.394 12zm2.982.416L8.777 19.482A.5.5 0 0 1 8 19.066V4.934a.5.5 0 0 1 .777-.416l10.599 7.066a.5.5 0 0 1 0 .832z"/></svg>

After

Width:  |  Height:  |  Size: 276 B

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