From 71522679374a95e50dfca6599f628e097eb6a0ae Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Sun, 27 Oct 2024 18:29:28 +0300 Subject: [PATCH] Separated dlayout data code --- .../stream/ui/building_layout_graph.cpp | 97 ++++++++++++++++++ src/modules/stream/ui/building_layout_graph.h | 7 ++ .../stream/ui/building_layout_graph_ui.h | 98 ++----------------- 3 files changed, 111 insertions(+), 91 deletions(-) diff --git a/src/modules/stream/ui/building_layout_graph.cpp b/src/modules/stream/ui/building_layout_graph.cpp index 622e6cd..af85144 100644 --- a/src/modules/stream/ui/building_layout_graph.cpp +++ b/src/modules/stream/ui/building_layout_graph.cpp @@ -99,3 +99,100 @@ void BuildingLayoutGraph::destroy_graph_entity(const String &path) if (e.is_valid()) e.destruct(); } + +flecs::entity BuildingLayoutGraph::get_layout_base() const +{ + const String &layout_base_name = "buildings_layout_graph"; + flecs::world ecs = BaseData::get_singleton()->get(); + flecs::entity layout_base_e = + ecs.lookup(layout_base_name.ascii().ptr()); + if (layout_base_e.is_valid()) + return layout_base_e; + else { + layout_base_e = ecs.entity(layout_base_name.ascii().ptr()); + assert(layout_base_e.is_valid()); + return layout_base_e; + } +} + +void BuildingLayoutGraph::get_layout_list(List *keys) const +{ + flecs::entity base = get_layout_base(); + base.children([keys](flecs::entity e) { + if (e.has()) + keys->push_back(String(e.name())); + }); +} + +void BuildingLayoutGraph::create_new_layout(const String &layout_name) +{ + flecs::world ecs = BaseData::get_singleton()->get(); + flecs::entity base = get_layout_base(); + flecs::entity e = base.lookup(layout_name.ascii().ptr()); + if (e.is_valid()) + return; + e = ecs.entity(layout_name.ascii().ptr()).child_of(base); + if (e.is_valid()) { + e.add(); + e.set({ 0 }); + } +} + +flecs::entity BuildingLayoutGraph::get_layout(const String &layout_name) const +{ + assert(layout_name.length() > 0); + flecs::entity base = get_layout_base(); + flecs::entity layout_e = base.lookup(layout_name.ascii().ptr()); + assert(layout_e.is_valid()); + assert(layout_e.has()); + return layout_e; + return flecs::entity(); +} + +void BuildingLayoutGraph::get_layout_entity_children( + flecs::entity layout_e, List *keys) const +{ + layout_e.children([keys](flecs::entity e) { keys->push_back(e); }); +} + +void BuildingLayoutGraph::recalculate_size(const String &layout_name) +{ + assert(layout_name.length() > 0); + flecs::entity layout_e = get_layout(layout_name); + assert(layout_e.is_valid()); + List queue; + layout_e.set( + { 0, 0, 0 }); + queue.push_back(layout_e); + while (!queue.empty()) { + flecs::entity e = queue.front()->get(); + queue.pop_front(); + int size = 1; + bool readd = false; + e.children([&readd, &size, &queue](flecs::entity fe) { + if (!fe.has()) { + fe.set( + { 0, 0, 0 }); + readd = true; + } + size += fe.get() + ->size; + queue.push_back(fe); + }); + if (readd) + queue.push_back(e); + if (e.get() + ->size != size) { + e.get_mut() + ->size = size; + if (e.parent() + .has()) + queue.push_back(e); + } + } +} diff --git a/src/modules/stream/ui/building_layout_graph.h b/src/modules/stream/ui/building_layout_graph.h index c9593c9..b1a01ea 100644 --- a/src/modules/stream/ui/building_layout_graph.h +++ b/src/modules/stream/ui/building_layout_graph.h @@ -32,4 +32,11 @@ public: void create_unit(const String &base_path); void create_room(const String &base_path, int id); void destroy_graph_entity(const String &path); + flecs::entity get_layout_base() const; + void get_layout_list(List *keys) const; + void create_new_layout(const String &layout_name); + flecs::entity get_layout(const String &layout_name) const; + void get_layout_entity_children(flecs::entity layout_e, + List *keys) const; + void recalculate_size(const String &layout_name); }; \ No newline at end of file diff --git a/src/modules/stream/ui/building_layout_graph_ui.h b/src/modules/stream/ui/building_layout_graph_ui.h index 41cb56e..39e4465 100644 --- a/src/modules/stream/ui/building_layout_graph_ui.h +++ b/src/modules/stream/ui/building_layout_graph_ui.h @@ -72,36 +72,12 @@ public: } update_graph(); } - flecs::entity get_layout_base() - { - const String &layout_base_name = "buildings_layout_graph"; - flecs::world ecs = BaseData::get_singleton()->get(); - flecs::entity layout_base_e = - ecs.lookup(layout_base_name.ascii().ptr()); - if (layout_base_e.is_valid()) - return layout_base_e; - else { - layout_base_e = - ecs.entity(layout_base_name.ascii().ptr()); - assert(layout_base_e.is_valid()); - return layout_base_e; - } - } - void get_layout_list(List *keys) - { - flecs::entity base = get_layout_base(); - base.children([keys](flecs::entity e) { - if (e.has()) - keys->push_back(String(e.name())); - }); - } void update_layout_item_list() { ItemList *item_list = gui->get_as_node("%building_layout_list"); List items; - get_layout_list(&items); + BuildingLayoutGraph::get_singleton()->get_layout_list(&items); List::Element *e = items.front(); item_list->clear(); while (e) { @@ -109,35 +85,11 @@ public: e = e->next(); } } - void create_new_layout(const String &layout_name) - { - flecs::world ecs = BaseData::get_singleton()->get(); - flecs::entity base = get_layout_base(); - flecs::entity e = base.lookup(layout_name.ascii().ptr()); - if (e.is_valid()) - return; - e = ecs.entity(layout_name.ascii().ptr()).child_of(base); - if (e.is_valid()) { - e.add(); - e.set( - { 0 }); - } - } flecs::entity get_current_layout() { assert(current_layout.length() > 0); - flecs::entity base = get_layout_base(); - flecs::entity layout_e = - base.lookup(current_layout.ascii().ptr()); - assert(layout_e.has< - WorldEditor::components::buildings_layout_graph>()); - return layout_e; - } - void get_layout_entity_children(flecs::entity layout_e, - List *keys) - { - layout_e.children( - [keys](flecs::entity e) { keys->push_back(e); }); + return BuildingLayoutGraph::get_singleton()->get_layout( + current_layout); } void select_layout(int id) { @@ -161,7 +113,8 @@ public: item_list->disconnect("item_selected", this, "select_layout"); String new_name = line_edit->get_text().strip_edges(); - create_new_layout(new_name); + BuildingLayoutGraph::get_singleton()->create_new_layout( + new_name); update_layout_item_list(); int selected = -1; for (i = 0; i < item_list->get_item_count(); i++) @@ -221,49 +174,12 @@ public: void update_buttons(ColorRect *canvas) { assert(current_layout.length() > 0); + BuildingLayoutGraph::get_singleton()->recalculate_size( + current_layout); flecs::entity layout_e = get_current_layout(); List queue; bool layout_empty = true; queue.push_back(layout_e); - layout_e.set< - WorldEditor::components::buildings_layout_graph_node>( - { 0, 0, 0 }); - queue.clear(); - queue.push_back(layout_e); - while (!queue.empty()) { - flecs::entity e = queue.front()->get(); - queue.pop_front(); - int size = 1; - bool readd = false; - e.children([&readd, &size, &queue](flecs::entity fe) { - if (!fe.has()) { - fe.set( - { 0, 0, 0 }); - readd = true; - } - size += fe.get() - ->size; - queue.push_back(fe); - }); - if (readd) - queue.push_back(e); - if (e.get() - ->size != size) { - e.get_mut() - ->size = size; - if (e.parent() - .has()) - queue.push_back(e); - } - } - queue.clear(); - queue.push_back(layout_e); while (!queue.empty()) { buttons.clear(); layout_empty = false;