/* * File name: paterns_menu.cpp * Author: lejulien * Date created: 01-01-1970 00:59:59 // Date modified: 12-01-2026 21:30:10 * ------ */ #include #include #include #include #include #include #include #include namespace gol { PaternsMenu::PaternsMenu(std::shared_ptr ctx) : context_(ctx) {} void PaternsMenu::Toogle() { is_open_ = !is_open_; } bool PaternsMenu::isOpen() { return is_open_; } void PaternsMenu::refresh() { paterns_name_list_.clear(); paterns_paths_list_.clear(); auto paterns_path = context_->program_dir / "paterns"; if (std::filesystem::exists(paterns_path) && std::filesystem::is_directory(paterns_path)) { for (const auto &entry : std::filesystem::directory_iterator(paterns_path)) { if (!std::filesystem::is_directory(entry) && entry.path().has_filename()) { paterns_paths_list_[entry.path().filename()] = entry.path(); paterns_name_list_.push_back(entry.path().filename()); } } } } bool PaternsMenu::loadPatern(std::string &path) { std::ifstream file(path); std::string file_data; if (!file.is_open()) { std::cerr << "Failure in opening patern : " << path << std::endl; return false; } loaded_patern_.clear(); try { std::getline(file, file_data); std::stringstream ss(file_data); std::string width, height, data; std::getline(ss, width, '|'); std::getline(ss, height, '|'); std::getline(ss, data, '|'); patern_width_ = std::stoi(width); patern_height_ = std::stoi(height); for (int i = 0; i < patern_width_ * patern_height_; i++) { loaded_patern_.push_back((data[i] == '1') ? 1 : 0); } } catch (std::exception &e) { std::cerr << "Failure in loading patern : " << path << std::endl; return 1; } return true; } void PaternsMenu::display() { if (is_open_) { ImGuiWindowFlags paterns_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize; ImGui::SetNextWindowSize(ImVec2(200, 250), ImGuiCond_Always); ImGui::Begin("paterns", &is_open_, paterns_flags); for (auto patern_name : paterns_name_list_) { ImGui::PushID(patern_name.c_str()); if (ImGui::Button(patern_name.c_str()) && loadPatern(paterns_paths_list_[patern_name])) { // TODO: If patern is loaded successfuly, start the preview in the // editor } ImGui::PopID(); ImGui::SameLine(ImGui::GetWindowWidth() - 57.); std::string del_id = patern_name.c_str(); del_id.append("_del"); ImGui::PushID(del_id.c_str()); if (ImGui::Button("delete")) { std::filesystem::remove(paterns_paths_list_[patern_name]); refresh(); } ImGui::PopID(); } ImGui::End(); } } } // namespace gol