diff --git a/.gitmodules b/.gitmodules index e69de29..654268b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "external/assimp"] + path = external/assimp + url = https://github.com/assimp/assimp.git +[submodule "external/spdlog"] + path = external/spdlog + url = https://github.com/gabime/spdlog.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 735fca4..036843c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,19 +58,28 @@ if (${ENABLE_COVERAGE}) list(APPEND LINKER_FLAGS gcov) endif () -fetchcontent_declare( - spdlog - GIT_REPOSITORY https://github.com/gabime/spdlog.git - GIT_TAG v1.17.0 - GIT_SHALLOW ON -) -set(SPDLOG_ENABLE_PCH ON) -set(SPDLOG_BUILD_WARNINGS ON) -set(SPDLOG_PREVENT_CHILD_FD ON) -set(SPDLOG_NO_THREAD_ID ON) -set(SPDLOG_NO_TLS ON) -set(SPDLOG_NO_ATOMIC_LEVELS ON) -fetchcontent_makeavailable(spdlog) +option(BUILD_SHARED_LIBS "Build package with shared libraries." ON) +option(ASSIMP_NO_EXPORT "Disable Assimp's export functionality." ON) +option(ASSIMP_INSTALL "Disable this if you want to use assimp as a submodule." OFF) +option(ASSIMP_BUILD_ZLIB "Build your own zlib" OFF) +option(ASSIMP_BUILD_TESTS "If the test suite for Assimp is built in addition to the library." OFF) +option(ASSIMP_WARNINGS_AS_ERRORS "Treat all warnings as errors." OFF) +option(ASSIMP_INSTALL_PDB "Install MSVC debug files." OFF) +option(ASSIMP_INJECT_DEBUG_POSTFIX "Inject debug postfix in .a/.so/.dll lib names" OFF) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + option(ASSIMP_INJECT_DEBUG_POSTFIX "Inject debug postfix in .a/.so/.dll lib names" ON) +else () + option(ASSIMP_INJECT_DEBUG_POSTFIX "Inject debug postfix in .a/.so/.dll lib names" OFF) +endif () +add_subdirectory(external/assimp EXCLUDE_FROM_ALL) + +option(SPDLOG_ENABLE_PCH "Build static or shared library using precompiled header to speed up compilation time" ON) +option(SPDLOG_BUILD_WARNINGS "Enable compiler warnings" ON) +option(SPDLOG_PREVENT_CHILD_FD "Prevent from child processes to inherit log file descriptors" ON) +option(SPDLOG_NO_THREAD_ID "prevent spdlog from querying the thread id on each log call if thread id is not needed" ON) +option(SPDLOG_NO_TLS "prevent spdlog from using thread local storage" ON) +option(SPDLOG_NO_ATOMIC_LEVELS "prevent spdlog from using of std::atomic log levels (use only if your code never modifies log levels concurrently" ON) +add_subdirectory(external/spdlog EXCLUDE_FROM_ALL) add_executable(LearnGtk4 main.cpp hello_world.cpp @@ -79,14 +88,15 @@ add_executable(LearnGtk4 main.cpp app_win_2_back.hpp ) -set_target_properties(LearnGtk4 spdlog_header_only PROPERTIES - CXX_STANDARD 23 +set_target_properties(LearnGtk4 assimp spdlog_header_only PROPERTIES + CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF INTERPROCEDURAL_OPTIMIZATION ON ) target_compile_definitions(LearnGtk4 PUBLIC $<$:_GLIBCXX_DEBUG>) +target_compile_definitions(assimp PUBLIC $<$:_GLIBCXX_DEBUG>) target_compile_options(LearnGtk4 PUBLIC ${COMPILE_FLAGS}) target_link_options(LearnGtk4 PUBLIC ${LINKER_OPTIONS}) -target_link_libraries(LearnGtk4 PkgConfig::GTKMM4 spdlog_header_only BillySheet) +target_link_libraries(LearnGtk4 PkgConfig::GTKMM4 assimp spdlog_header_only BillySheet) diff --git a/app_win_2_back.cpp b/app_win_2_back.cpp index 1feca51..aa743ed 100644 --- a/app_win_2_back.cpp +++ b/app_win_2_back.cpp @@ -1,16 +1,10 @@ #include "app_win_2_back.hpp" #include "hello_world.hpp" - #include #include #include -#include - namespace gui_to_app { - namespace ranges = std::ranges; - namespace views = std::views; - AppWin2Back::AppWin2Back() : Gtk::Application("org.billy_adventures.character_sheet", Flags::HANDLES_OPEN) { Glib::set_application_name("Billy's character sheet"); } @@ -42,7 +36,7 @@ namespace gui_to_app { void AppWin2Back::on_activate() { Application::on_activate(); - app_builder = [this] -> Glib::RefPtr { + app_builder = [this]() -> Glib::RefPtr { try { return Gtk::Builder::create_from_file("window_ui.ui"); } catch (const std::exception &e) { @@ -79,7 +73,7 @@ namespace gui_to_app { rock_kit_switch = app_builder->get_widget("rock_kit_switch"); sack_switch = app_builder->get_widget("sack_switch"); - const auto test_result = [this] -> std::vector { + const auto test_result = [this]() -> std::vector { const std::array test_ptrs{ std::pair{ "sword_switch", sword_switch == nullptr }, std::pair{ "lance_switch", lance_switch == nullptr }, @@ -94,12 +88,16 @@ namespace gui_to_app { std::pair{ "rock_kit_switch", rock_kit_switch == nullptr }, std::pair{ "sack_switch", sack_switch == nullptr }, }; - - return ranges::to >( - test_ptrs - | views::filter([](const auto &a) { return a.second; }) - | views::keys - ); + std::vector local_test_result; + local_test_result.reserve(test_ptrs.size()); + std::for_each(test_ptrs.cbegin(), + test_ptrs.cend(), + [&local_test_result](const auto &a) { + if (a.second) { + local_test_result.emplace_back(a.first); + } + }); + return local_test_result; }(); if (!test_result.empty()) { spdlog::critical("Error occurred, at least one switch is not available. See logs below"); @@ -109,15 +107,16 @@ namespace gui_to_app { on_quit(); return; } - // TODO: interaction avec la CharacterSheet } void AppWin2Back::on_quit() noexcept { - ranges::for_each(get_windows() | views::filter([](const auto windows) { return windows != nullptr; }), - [](auto *window) { - window->set_visible(false); - delete window; - }); + auto windows = get_windows(); + for (auto *window: windows) { + if (window != nullptr) { + window->set_visible(false); + delete window; + } + } quit(); } } // gui_to_app diff --git a/external/assimp b/external/assimp new file mode 160000 index 0000000..f6c6260 --- /dev/null +++ b/external/assimp @@ -0,0 +1 @@ +Subproject commit f6c62605c76001ac37f1d86da9922ef61e65501d diff --git a/external/spdlog b/external/spdlog new file mode 160000 index 0000000..27cb4c7 --- /dev/null +++ b/external/spdlog @@ -0,0 +1 @@ +Subproject commit 27cb4c76708608465c413f6d0e6b8d99a4d84302 diff --git a/hello_world.cpp b/hello_world.cpp index 43cdb38..87dbeb3 100644 --- a/hello_world.cpp +++ b/hello_world.cpp @@ -3,6 +3,5 @@ namespace learn_gtkmm4 { HelloWorld::HelloWorld(BaseObjectType *cobject, const Glib::RefPtr &builder) : - Gtk::ApplicationWindow(cobject), m_builder(builder) { - } -} // learn_gtkmm4 + Gtk::ApplicationWindow(cobject), m_builder(builder) {} +} // learn_gtkmm4 \ No newline at end of file diff --git a/hello_world.hpp b/hello_world.hpp index ea2cfd0..f3ab9a8 100644 --- a/hello_world.hpp +++ b/hello_world.hpp @@ -7,6 +7,7 @@ namespace learn_gtkmm4 { + class HelloWorld final : public Gtk::ApplicationWindow { public: using Gtk::ApplicationWindow::BaseObjectType; @@ -18,6 +19,7 @@ namespace learn_gtkmm4 { protected: Glib::RefPtr m_builder; }; + } // learn_gtkmm4 #endif //LEARNGTK4_HELLO_WORLD_HPP diff --git a/main.cpp b/main.cpp index d267240..fe0d3eb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,6 @@ #include "app_win_2_back.hpp" -int main(const int argc, char *argv[]) { - const auto app = gui_to_app::AppWin2Back::create(); +int main(int argc, char *argv[]) { + auto app = gui_to_app::AppWin2Back::create(); return app->run(argc, argv); }