#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"); } void AppWin2Back::on_startup() { Application::on_startup(); const auto menu_bar = []() -> Glib::RefPtr { try { const auto builder = Gtk::Builder::create_from_file("menu_bar.ui"); return builder->get_object("menu"); } catch (const std::exception &e) { spdlog::error("Error occurred while loader menu bar: {}", e.what()); return nullptr; } }(); if (!menu_bar) { spdlog::error("Error occured while loading menu bar's."); } else { set_menubar(menu_bar); add_action("quit", sigc::mem_fun(*this, &AppWin2Back::on_quit)); set_accel_for_action("app.quit", "q"); } } Glib::RefPtr AppWin2Back::create() { return Glib::make_refptr_for_instance(new AppWin2Back()); } void AppWin2Back::on_activate() { Application::on_activate(); app_builder = [this] -> Glib::RefPtr { try { return Gtk::Builder::create_from_file("window_ui.ui"); } catch (const std::exception &e) { spdlog::critical("Error occurred while loading Window's UI: {}", e.what()); quit(); return nullptr; } }(); if (!app_builder) { spdlog::critical("Error while loading UI"); quit(); return; } main_window = Gtk::Builder::get_widget_derived(app_builder, "main_window"); if (main_window != nullptr) { add_window(*main_window); main_window->set_show_menubar(true); main_window->set_visible(true); } else { spdlog::critical("Error while getting window from builder"); on_quit(); return; } sword_switch = app_builder->get_widget("sword_switch"); lance_switch = app_builder->get_widget("lance_switch"); morgen_switch = app_builder->get_widget("morgenstern_switch"); bow_switch = app_builder->get_widget("arc_switch"); chainmail_switch = app_builder->get_widget("chainmail_switch"); cookpot_switch = app_builder->get_widget("cookingpot_switch"); pamphlet_switch = app_builder->get_widget("pamphlet_tourist_switch"); medkit_switch = app_builder->get_widget("medkit_switch"); fourche_switch = app_builder->get_widget("fourche_switch"); dagger_switch = app_builder->get_widget("dagger_switch"); rock_kit_switch = app_builder->get_widget("rock_kit_switch"); sack_switch = app_builder->get_widget("sack_switch"); const auto test_result = ranges::to >( std::array{ std::pair{ "sword_switch", sword_switch == nullptr }, std::pair{ "lance_switch", lance_switch == nullptr }, std::pair{ "morgen_switch", morgen_switch == nullptr }, std::pair{ "bow_switch", bow_switch == nullptr }, std::pair{ "chainmail_switch", chainmail_switch == nullptr }, std::pair{ "cookpot_switch", cookpot_switch == nullptr }, std::pair{ "pamphlet_switch", pamphlet_switch == nullptr }, std::pair{ "medkit_switch", medkit_switch == nullptr }, std::pair{ "fourche_switch", fourche_switch == nullptr }, std::pair{ "dagger_switch", dagger_switch == nullptr }, std::pair{ "rock_kit_switch", rock_kit_switch == nullptr }, std::pair{ "sack_switch", sack_switch == nullptr }, } | views::filter([](const auto &a) { return a.second; }) | views::keys ); if (!test_result.empty()) { spdlog::critical("Error occurred, at least one switch is not available. See logs below"); for (const auto result: test_result) { spdlog::critical(result); } 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; }); quit(); } } // gui_to_app