Merge pull request 'lju/load-paterns' (#3) from lju/load-paterns into main
Reviewed-on: #3
This commit was merged in pull request #3.
This commit is contained in:
@@ -33,6 +33,7 @@ typedef struct ctx {
|
||||
std::shared_ptr<Selection> selection = nullptr;
|
||||
std::shared_ptr<PaternsMenu> paterns_menu = nullptr;
|
||||
nlohmann::json config_json;
|
||||
std::filesystem::path program_dir;
|
||||
} ctx;
|
||||
|
||||
} // namespace gol
|
||||
|
||||
@@ -8,17 +8,31 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <context.hpp>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
namespace gol {
|
||||
|
||||
class PaternsMenu {
|
||||
public:
|
||||
PaternsMenu() = default;
|
||||
PaternsMenu(std::shared_ptr<ctx>);
|
||||
~PaternsMenu() = default;
|
||||
void Toogle();
|
||||
bool isOpen();
|
||||
void display();
|
||||
void refresh();
|
||||
private:
|
||||
bool loadPatern(std::string &path);
|
||||
bool is_open_ = false;
|
||||
std::shared_ptr<ctx> context_ = nullptr;
|
||||
std::map<std::string,std::string> paterns_paths_list_;
|
||||
std::vector<std::string> paterns_name_list_;
|
||||
int patern_width_ = 0;
|
||||
int patern_height_ = 0;
|
||||
std::vector<uint32_t> loaded_patern_;
|
||||
};
|
||||
|
||||
} // namespace gol
|
||||
|
||||
12
src/main.cpp
12
src/main.cpp
@@ -82,6 +82,15 @@ int main(int ac, char **av) {
|
||||
context->config_json["fps"] = 800;
|
||||
}
|
||||
|
||||
// Get program directory
|
||||
char path_buf[1024];
|
||||
ssize_t len = readlink("/proc/self/exe", path_buf, sizeof(path_buf)-1);
|
||||
if (len == -1) {
|
||||
std::cerr << "Failed to determine program directory" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
context->program_dir = std::filesystem::path(path_buf).parent_path();
|
||||
|
||||
InitWindow(context->config_json["screen_width"], context->config_json["screen_height"],
|
||||
&av[0][2]);
|
||||
|
||||
@@ -97,7 +106,7 @@ int main(int ac, char **av) {
|
||||
context->render = std::make_shared<Render>(context->settings_menu->getCellSize());
|
||||
context->selection_menu = std::make_shared<gol::SelectionMenu>(context);
|
||||
context->selection = std::make_shared<gol::Selection>(context);
|
||||
context->paterns_menu = std::make_shared<gol::PaternsMenu>();
|
||||
context->paterns_menu = std::make_shared<gol::PaternsMenu>(context);
|
||||
|
||||
// Speed handling values
|
||||
float sim_speed = 1.0f;
|
||||
@@ -106,6 +115,7 @@ int main(int ac, char **av) {
|
||||
|
||||
// Setups
|
||||
context->rules->setup(context->world);
|
||||
context->paterns_menu->refresh();
|
||||
// Diplay generations
|
||||
while (!WindowShouldClose()) {
|
||||
// Frames shinenigans
|
||||
|
||||
@@ -6,28 +6,92 @@
|
||||
* ------
|
||||
*/
|
||||
|
||||
#include <paterns_menu.hpp>
|
||||
|
||||
#include <imgui.h>
|
||||
#include <raylib.h>
|
||||
#include <rlImGui.h>
|
||||
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <paterns_menu.hpp>
|
||||
#include <sstream>
|
||||
|
||||
namespace gol {
|
||||
|
||||
void PaternsMenu::Toogle() {
|
||||
is_open_ = !is_open_;
|
||||
PaternsMenu::PaternsMenu(std::shared_ptr<ctx> 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::isOpen() {
|
||||
return is_open_;
|
||||
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(150, 200), ImGuiCond_Always);
|
||||
ImGuiWindowFlags paterns_flags =
|
||||
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize;
|
||||
ImGui::SetNextWindowSize(ImVec2(200, 250), ImGuiCond_Always);
|
||||
ImGui::Begin("paterns", &is_open_, paterns_flags);
|
||||
ImGui::Button("refresh");
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <filesystem>
|
||||
|
||||
#include <selection_menu.hpp>
|
||||
#include <paterns_menu.hpp>
|
||||
|
||||
namespace gol {
|
||||
|
||||
@@ -62,11 +63,8 @@ void SelectionMenu::display() {
|
||||
rlImGuiImageSize(&selectionTexture_.texture, 200, 200);
|
||||
ImGui::InputText("patern_name", patern_name_, 255);
|
||||
if (ImGui::Button("Save")) {
|
||||
char path_buf[1024];
|
||||
ssize_t len = readlink("/proc/self/exe", path_buf, sizeof(path_buf)-1);
|
||||
if (len != -1) {
|
||||
// Create paterns dir if not present
|
||||
std::filesystem::path paterns_dir = std::filesystem::path(path_buf).parent_path() / "paterns";
|
||||
std::filesystem::path paterns_dir = context_->program_dir / "paterns";
|
||||
if (!std::filesystem::exists(paterns_dir) && !std::filesystem::create_directory(paterns_dir)) {
|
||||
std::cerr << "Failed to create paterns directory" << std::endl;
|
||||
} else { // Could be optimized by early returning in a function
|
||||
@@ -93,11 +91,11 @@ void SelectionMenu::display() {
|
||||
}
|
||||
patern_file << std::flush;
|
||||
patern_file.close();
|
||||
context_->paterns_menu->refresh();
|
||||
}
|
||||
}
|
||||
sel_ctrl_ = false;
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Discard")) {
|
||||
sel_ctrl_ = false;
|
||||
|
||||
Reference in New Issue
Block a user