diff --git a/CMakeLists.txt b/CMakeLists.txt index 63b2d8453..c46eaa179 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,13 @@ endif() project(shadps4) +option(ENABLE_QT_GUI "Enable the Qt GUI. If not selected then the emulator uses a minimal SDL-based UI instead" OFF) + +if(ENABLE_QT_GUI) + find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent) + qt_standard_project_setup() +endif() + # This function should be passed a list of all files in a target. It will automatically generate # file groups following the directory hierarchy, so that the layout of the files in IDEs matches the # one in the filesystem. @@ -128,11 +135,78 @@ set(HOST_SOURCES src/Emulator/Host/controller.cpp ) # the above is shared in sdl and qt version (TODO share them all) -set(COMMON src/common/types.h - src/common/endian.h + +if(ENABLE_QT_GUI) + set(QT_GUI + src/qt_gui/main_window_ui.h + src/qt_gui/main_window.cpp + src/qt_gui/main_window.h + src/qt_gui/gui_settings.cpp + src/qt_gui/gui_settings.h + src/qt_gui/settings.cpp + src/qt_gui/settings.h + src/qt_gui/gui_save.h + src/qt_gui/custom_dock_widget.h + src/qt_gui/custom_table_widget_item.cpp + src/qt_gui/custom_table_widget_item.h + src/qt_gui/game_list_item.h + src/qt_gui/game_list_table.cpp + src/qt_gui/game_list_table.h + src/qt_gui/game_list_utils.h + src/qt_gui/game_info.h + src/qt_gui/game_list_grid.cpp + src/qt_gui/game_list_grid.h + src/qt_gui/game_list_grid_delegate.cpp + src/qt_gui/game_list_grid_delegate.h + src/qt_gui/game_list_frame.cpp + src/qt_gui/game_list_frame.h + src/qt_gui/qt_utils.h + src/qt_gui/game_install_dialog.cpp + src/qt_gui/game_install_dialog.h + src/qt_gui/main_window_themes.cpp + src/qt_gui/main_window_themes.h + src/qt_gui/main.cpp + ) +endif() + +set(COMMON src/common/logging/backend.cpp + src/common/logging/backend.h + src/common/logging/filter.cpp + src/common/logging/filter.h + src/common/logging/formatter.h + src/common/logging/log_entry.h + src/common/logging/log.h + src/common/logging/text_formatter.cpp + src/common/logging/text_formatter.h + src/common/logging/types.h + src/common/assert.cpp + src/common/assert.h + src/common/bounded_threadsafe_queue.h src/common/concepts.h + src/common/debug.h + src/common/disassembler.cpp + src/common/disassembler.h + src/common/discord.cpp + src/common/discord.h + src/common/endian.h src/common/io_file.cpp src/common/io_file.h + src/common/error.cpp + src/common/error.h + src/common/native_clock.cpp + src/common/native_clock.h + src/common/path_util.cpp + src/common/path_util.h + src/common/rdtsc.cpp + src/common/rdtsc.h + src/common/singleton.h + src/common/string_util.cpp + src/common/string_util.h + src/common/thread.cpp + src/common/thread.h + src/common/types.h + src/common/uint128.h + src/common/version.h ) set(CORE src/core/loader.cpp @@ -152,40 +226,21 @@ set(FILE_FORMAT src/core/file_format/pfs.h src/core/file_format/psf.h ) +set(UTILITIES src/Util/config.cpp + src/Util/config.h +) + +if(ENABLE_QT_GUI) +qt_add_executable(shadps4 + ${QT_GUI} + ${COMMON} + ${CORE} + ${CRYPTO} + ${FILE_FORMAT} + ${UTILITIES} +) +else() add_executable(shadps4 - src/common/assert.cpp - src/common/assert.h - src/common/bounded_threadsafe_queue.h - src/common/debug.h - src/common/disassembler.cpp - src/common/disassembler.h - src/common/discord.cpp - src/common/discord.h - src/common/error.cpp - src/common/error.h - src/common/path_util.cpp - src/common/path_util.h - src/common/logging/backend.cpp - src/common/logging/backend.h - src/common/logging/filter.cpp - src/common/logging/filter.h - src/common/logging/formatter.h - src/common/logging/log_entry.h - src/common/logging/log.h - src/common/logging/text_formatter.cpp - src/common/logging/text_formatter.h - src/common/logging/types.h - src/common/native_clock.cpp - src/common/native_clock.h - src/common/rdtsc.cpp - src/common/rdtsc.h - src/common/singleton.h - src/common/string_util.cpp - src/common/string_util.h - src/common/thread.cpp - src/common/thread.h - src/common/uint128.h - src/common/version.h ${LIBC_SOURCES} ${USERSERVICE_SOURCES} ${PAD_SOURCES} @@ -196,8 +251,6 @@ add_executable(shadps4 src/main.cpp src/core/loader/elf.cpp src/core/loader/elf.h - src/Util/config.cpp - src/Util/config.h src/core/virtual_memory.cpp src/core/virtual_memory.h src/core/linker.cpp @@ -252,12 +305,18 @@ add_executable(shadps4 ${CORE} ${CRYPTO} ${FILE_FORMAT} + ${UTILITIES} ) +endif() create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11) -target_link_libraries(shadps4 PRIVATE discord-rpc SDL3-shared vulkan-1 xxhash Zydis) +target_link_libraries(shadps4 PRIVATE discord-rpc vulkan-1 xxhash Zydis) + +if(NOT ENABLE_QT_GUI) + target_link_libraries(shadps4 PRIVATE SDL3-shared) +endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND MSVC) target_link_libraries(shadps4 PRIVATE cryptoppwin zlib) @@ -265,6 +324,10 @@ else() target_link_libraries(shadps4 PRIVATE cryptopp::cryptopp zlib) endif() +if(ENABLE_QT_GUI) + target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent) +endif() + if (WIN32) target_link_libraries(shadps4 PRIVATE mincore winpthread clang_rt.builtins-x86_64.lib) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS) @@ -277,6 +340,13 @@ endif() target_include_directories(shadps4 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +if(ENABLE_QT_GUI) +set_target_properties(shadps4 PROPERTIES + WIN32_EXECUTABLE ON + MACOSX_BUNDLE ON +) +endif() + if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_custom_command(TARGET shadps4 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different @@ -287,10 +357,13 @@ add_custom_command(TARGET shadps4 POST_BUILD "${PROJECT_SOURCE_DIR}/externals/zlib-ng-win/bin/zlib-ng2.dll" $) endif() +if(NOT ENABLE_QT_GUI) add_custom_command(TARGET shadps4 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $) +endif() + if (WIN32) add_custom_command(TARGET shadps4 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 2b3cfcb02..5d8a5ecd9 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -9,7 +9,7 @@ #include #include "custom_table_widget_item.h" -#include "emulator/file_format/psf.h" +#include "core/file_format/psf.h" #include "game_list_frame.h" #include "gui_settings.h" #include "qt_utils.h" diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp new file mode 100644 index 000000000..727027534 --- /dev/null +++ b/src/qt_gui/main.cpp @@ -0,0 +1,18 @@ +#include + +#include "qt_gui/game_install_dialog.h" +#include "qt_gui/gui_settings.h" +#include "qt_gui/main_window.h" + +int main(int argc, char* argv[]) { + QApplication a(argc, argv); + auto m_gui_settings = std::make_shared(); + if (m_gui_settings->GetValue(gui::settings_install_dir) == "") { + GameInstallDialog dlg(m_gui_settings); + dlg.exec(); + } + MainWindow* m_main_window = new MainWindow(m_gui_settings, nullptr); + m_main_window->Init(); + + return a.exec(); +} \ No newline at end of file diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 3ccaec1b8..9311b1563 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -7,8 +7,8 @@ #include #include "common/io_file.h" -#include "emulator/file_format/pkg.h" -#include "emulator/loader.h" +#include "core/file_format/pkg.h" +#include "core/loader.h" #include "game_install_dialog.h" #include "game_list_frame.h" #include "gui_settings.h" diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 55a23c110..2c9f843fb 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -12,8 +12,10 @@ add_subdirectory(fmt EXCLUDE_FROM_ALL) # MagicEnum add_subdirectory(magic_enum EXCLUDE_FROM_ALL) +if(NOT ENABLE_QT_GUI) # SDL3 add_subdirectory(SDL EXCLUDE_FROM_ALL) +endif() # Toml11 add_subdirectory(toml11 EXCLUDE_FROM_ALL)