From 127b57b820ef0deb262f46ca7d2fdf09a8e48bff Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 23 Sep 2023 15:21:36 -0400 Subject: [PATCH] Add a settings file to store the game directory --- CMakeLists.txt | 2 ++ armoury/CMakeLists.txt | 1 - armoury/src/main.cpp | 5 ++++- common/CMakeLists.txt | 6 ++++-- common/include/settings.h | 5 +++++ common/src/settings.cpp | 21 +++++++++++++++++++++ parts/mdl/CMakeLists.txt | 2 +- renderer/CMakeLists.txt | 2 +- sdklauncher/CMakeLists.txt | 7 +------ sdklauncher/src/main.cpp | 32 ++++++++++++++++++++++++++++++++ sdklauncher/src/mainwindow.cpp | 13 +++++++++---- 11 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 common/include/settings.h create mode 100644 common/src/settings.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index be593d9..37b591b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(QT_MIN_VERSION 5.15) +set(KF_MIN_VERSION 5.100) find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) @@ -35,6 +36,7 @@ ecm_setup_version(${PROJECT_VERSION} ) find_package(Qt5 ${QT_MIN_VERSION} COMPONENTS Core Widgets Concurrent CONFIG REQUIRED) +find_package(KF5 ${KF_MIN_VERSION} REQUIRED COMPONENTS Config) find_package(Vulkan REQUIRED) find_package(glm REQUIRED) diff --git a/armoury/CMakeLists.txt b/armoury/CMakeLists.txt index d6360c0..bd73c84 100644 --- a/armoury/CMakeLists.txt +++ b/armoury/CMakeLists.txt @@ -24,7 +24,6 @@ target_link_libraries(armoury PUBLIC Qt5::Core Qt5::Widgets Qt5::Concurrent - renderer magic_enum physis z mdlpart diff --git a/armoury/src/main.cpp b/armoury/src/main.cpp index 6bec654..663c721 100644 --- a/armoury/src/main.cpp +++ b/armoury/src/main.cpp @@ -5,13 +5,16 @@ #include #include "mainwindow.h" +#include "settings.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); physis_initialize_logging(); - MainWindow w(physis_gamedata_initialize(argv[1])); + const QString gameDir{getGameDirectory()}; + const std::string gameDirStd{gameDir.toStdString()}; + MainWindow w(physis_gamedata_initialize(gameDirStd.c_str())); w.show(); return QApplication::exec(); diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 99faebc..5b3c230 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -5,13 +5,15 @@ add_library(NovusCommon STATIC) target_sources(NovusCommon PRIVATE include/aboutwindow.h include/filecache.h + include/settings.h src/aboutwindow.cpp - src/filecache.cpp) + src/filecache.cpp + src/settings.cpp) target_include_directories(NovusCommon PUBLIC include PRIVATE ${CMAKE_BINARY_DIR}) -target_link_libraries(NovusCommon PUBLIC Qt5::Core Qt5::Widgets physis) +target_link_libraries(NovusCommon PUBLIC Qt5::Core Qt5::Widgets KF5::ConfigCore physis) # meant for including the license text file(READ ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSES/GPL-3.0-or-later.txt LICENSE_TXT) diff --git a/common/include/settings.h b/common/include/settings.h new file mode 100644 index 0000000..03d173c --- /dev/null +++ b/common/include/settings.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +QString getGameDirectory(); \ No newline at end of file diff --git a/common/src/settings.cpp b/common/src/settings.cpp new file mode 100644 index 0000000..1d3e2ea --- /dev/null +++ b/common/src/settings.cpp @@ -0,0 +1,21 @@ +#include "settings.h" + +#include +#include +#include +#include + +QString getGameDirectory() { + KConfig config("novusrc"); + KConfigGroup game = config.group("Game"); + + if (game.hasKey("GameDir")) { + return game.readEntry("GameDir"); + } else { + QMessageBox msgBox; + msgBox.setText("The game directory has not been set. Please open the Novus SDK launcher and set it."); + msgBox.exec(); + QCoreApplication::quit(); + return {}; + } +} \ No newline at end of file diff --git a/parts/mdl/CMakeLists.txt b/parts/mdl/CMakeLists.txt index 940509b..a34f3d0 100644 --- a/parts/mdl/CMakeLists.txt +++ b/parts/mdl/CMakeLists.txt @@ -2,5 +2,5 @@ # SPDX-License-Identifier: CC0-1.0 add_library(mdlpart STATIC mdlpart.cpp) -target_link_libraries(mdlpart PUBLIC physis z ${LIBRARIES} Qt5::Core Qt5::Widgets renderer NovusCommon tinygltf) +target_link_libraries(mdlpart PUBLIC physis z Qt5::Core Qt5::Widgets renderer NovusCommon tinygltf) target_include_directories(mdlpart PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt index 094dca3..a2efba3 100644 --- a/renderer/CMakeLists.txt +++ b/renderer/CMakeLists.txt @@ -7,7 +7,7 @@ if(USE_STANDALONE_WINDOW) set(EXTRA_LIBRARIES SDL2::SDL2) endif() -add_library(renderer src/renderer.cpp ${EXTRA_SRC}) +add_library(renderer STATIC src/renderer.cpp ${EXTRA_SRC}) target_include_directories(renderer PUBLIC include) target_link_libraries(renderer PUBLIC Qt5::Core Vulkan::Vulkan physis z glm::glm ${EXTRA_LIBRARIES}) target_compile_definitions(renderer PUBLIC GLM_FORCE_RADIANS GLM_FORCE_DEPTH_ZERO_TO_ONE) diff --git a/sdklauncher/CMakeLists.txt b/sdklauncher/CMakeLists.txt index 36266af..b06949d 100644 --- a/sdklauncher/CMakeLists.txt +++ b/sdklauncher/CMakeLists.txt @@ -1,13 +1,8 @@ # SPDX-FileCopyrightText: 2023 Joshua Goins # SPDX-License-Identifier: CC0-1.0 -set(CMAKE_AUTOMOC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -find_package(Qt5 COMPONENTS Widgets REQUIRED) - add_executable(sdklauncher src/main.cpp src/mainwindow.cpp) -target_link_libraries(sdklauncher PUBLIC Qt5::Widgets) +target_link_libraries(sdklauncher PUBLIC Qt5::Widgets KF5::ConfigCore physis) target_include_directories(sdklauncher PUBLIC include) diff --git a/sdklauncher/src/main.cpp b/sdklauncher/src/main.cpp index 6960b32..4bc7926 100644 --- a/sdklauncher/src/main.cpp +++ b/sdklauncher/src/main.cpp @@ -1,13 +1,45 @@ // SPDX-FileCopyrightText: 2023 Joshua Goins // SPDX-License-Identifier: GPL-3.0-or-later +#include +#include #include +#include +#include +#include #include "mainwindow.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); + KConfig config("novusrc"); + KConfigGroup game = config.group("Game"); + + if (!game.hasKey("GameDir")) { + while (true) { + QMessageBox msgBox; + msgBox.setText("The game directory has not been set, please select it now. Select the 'game' folder."); + msgBox.exec(); + + const QString dir = QFileDialog::getExistingDirectory( + nullptr, + "Open Game Directory", + QStandardPaths::standardLocations(QStandardPaths::StandardLocation::HomeLocation).last(), + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + const std::string dirStd = dir.toStdString(); + + if (!physis_gamedata_initialize(dirStd.c_str())) + continue; + + game.writeEntry("GameDir", dir); + config.sync(); + + break; + } + } + MainWindow window; window.show(); diff --git a/sdklauncher/src/mainwindow.cpp b/sdklauncher/src/mainwindow.cpp index 25cba07..474b4ae 100644 --- a/sdklauncher/src/mainwindow.cpp +++ b/sdklauncher/src/mainwindow.cpp @@ -3,12 +3,14 @@ #include "mainwindow.h" +#include +#include +#include +#include +#include #include #include #include -#include -#include -#include static QMap applications = { {"Armoury", "armoury"}, @@ -48,10 +50,13 @@ MainWindow::MainWindow() { auto formLayout = new QFormLayout(); + KConfig config("novusrc"); + KConfigGroup game = config.group("Game"); + auto gameCombo = new QComboBox(); formLayout->addRow("Current Game", gameCombo); formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); - gameCombo->addItem("Placeholder"); + gameCombo->addItem(game.readEntry("GameDir")); auto mainLayout = new QVBoxLayout(); mainLayout->addWidget(centralFrame);