From aa324903fd1ccb16e87a559d7b5726d5081e66f8 Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Thu, 24 Oct 2024 04:48:36 +0300 Subject: [PATCH] Editor UI refactoring --- godot/main/editor.tscn | 275 +----- src/flecs | 2 +- src/godot | 2 +- src/meshoptimizer | 2 +- src/modules/stream/SCsub | 6 +- src/modules/stream/buildings/element_data.cpp | 6 + src/modules/stream/buildings/element_data.h | 7 +- src/modules/stream/buildings_editor.cpp | 451 +-------- src/modules/stream/npc/SCsub | 11 + src/modules/stream/npc/npc.cpp | 147 +++ src/modules/stream/npc/npc.h | 13 + src/modules/stream/register_types.cpp | 2 + src/modules/stream/ui/SCsub | 18 + src/modules/stream/ui/main_tabs.cpp | 910 ++++++++++++++++++ src/modules/stream/ui/main_tabs.h | 22 + src/modules/stream/world_editor.cpp | 29 + src/modules/stream/world_editor.h | 15 + 17 files changed, 1249 insertions(+), 669 deletions(-) create mode 100644 src/modules/stream/npc/SCsub create mode 100644 src/modules/stream/npc/npc.cpp create mode 100644 src/modules/stream/npc/npc.h create mode 100644 src/modules/stream/ui/SCsub create mode 100644 src/modules/stream/ui/main_tabs.cpp create mode 100644 src/modules/stream/ui/main_tabs.h diff --git a/godot/main/editor.tscn b/godot/main/editor.tscn index a4db5d9..77e3b87 100644 --- a/godot/main/editor.tscn +++ b/godot/main/editor.tscn @@ -63,264 +63,24 @@ margin_bottom = 48.0 rect_min_size = Vector2( 48, 48 ) focus_mode = 2 -[node name="ColorRect" type="ColorRect" parent="VBoxContainer"] +[node name="MainTabs" type="MainTabs" parent="VBoxContainer"] +unique_name_in_owner = true margin_top = 52.0 margin_right = 248.0 -margin_bottom = 82.0 -rect_min_size = Vector2( 160, 30 ) -size_flags_horizontal = 3 -size_flags_vertical = 5 -color = Color( 0.25098, 0.25098, 0.25098, 1 ) - -[node name="Label" type="Label" parent="VBoxContainer/ColorRect"] -margin_left = 39.0 -margin_top = 8.0 -margin_right = 118.0 -margin_bottom = 22.0 -size_flags_horizontal = 3 -size_flags_vertical = 7 -text = "Mode select" -align = 1 -valign = 1 - -[node name="select_buildings" type="Button" parent="VBoxContainer"] -unique_name_in_owner = true -margin_top = 86.0 -margin_right = 248.0 -margin_bottom = 106.0 -text = "Buildings Mode" - -[node name="select_navigation" type="Button" parent="VBoxContainer"] -unique_name_in_owner = true -margin_top = 110.0 -margin_right = 248.0 -margin_bottom = 130.0 -text = "Navigation Mode" - -[node name="select_poi" type="Button" parent="VBoxContainer"] -unique_name_in_owner = true -margin_top = 134.0 -margin_right = 248.0 -margin_bottom = 154.0 -text = "POI Mode" - -[node name="select_road_lines" type="Button" parent="VBoxContainer"] -unique_name_in_owner = true -margin_top = 158.0 -margin_right = 248.0 -margin_bottom = 178.0 -text = "Road Lines Mode" - -[node name="select_npc" type="Button" parent="VBoxContainer"] -unique_name_in_owner = true -margin_top = 182.0 -margin_right = 248.0 -margin_bottom = 202.0 -text = "NPC Mode" +margin_bottom = 500.0 [node name="v_buildings" type="VBoxContainer" parent="VBoxContainer"] unique_name_in_owner = true -margin_top = 206.0 +margin_top = 504.0 margin_right = 248.0 -margin_bottom = 650.0 - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings"] -margin_right = 248.0 -margin_bottom = 4.0 - -[node name="base" type="PanelContainer" parent="VBoxContainer/v_buildings"] -margin_top = 8.0 -margin_right = 248.0 -margin_bottom = 444.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/v_buildings/base"] -margin_left = 7.0 -margin_top = 7.0 -margin_right = 241.0 -margin_bottom = 429.0 - -[node name="Label" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_right = 234.0 -margin_bottom = 14.0 -text = "Buildings mode" - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 18.0 -margin_right = 234.0 -margin_bottom = 22.0 - -[node name="Label3" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 26.0 -margin_right = 234.0 -margin_bottom = 40.0 -text = "Cursor position" - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 44.0 -margin_right = 234.0 -margin_bottom = 68.0 - -[node name="building_cursor_x" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -margin_right = 63.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="building_cursor_y" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -margin_left = 67.0 -margin_right = 130.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="building_cursor_z" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -margin_left = 134.0 -margin_right = 197.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="buildings_set_cursor_position" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -margin_left = 201.0 -margin_right = 233.0 -margin_bottom = 24.0 -text = "Set" - -[node name="Label5" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 72.0 -margin_right = 234.0 -margin_bottom = 86.0 -text = "Selected building position" - -[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 90.0 -margin_right = 234.0 -margin_bottom = 114.0 - -[node name="building_position_x" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -margin_right = 75.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="building_position_y" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -margin_left = 79.0 -margin_right = 154.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="building_position_z" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -margin_left = 158.0 -margin_right = 234.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 118.0 -margin_right = 234.0 -margin_bottom = 142.0 - -[node name="Label" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer3"] -margin_top = 5.0 -margin_right = 18.0 -margin_bottom = 19.0 -text = "rot" - -[node name="building_rotation_y" type="LineEdit" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer3"] -unique_name_in_owner = true -margin_left = 22.0 -margin_right = 80.0 -margin_bottom = 24.0 - -[node name="buildings_set_building_position" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer/HBoxContainer3"] -unique_name_in_owner = true -margin_left = 84.0 -margin_right = 116.0 -margin_bottom = 24.0 -text = "Set" - -[node name="HSeparator3" type="HSeparator" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 146.0 -margin_right = 234.0 -margin_bottom = 150.0 - -[node name="Label4" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 154.0 -margin_right = 234.0 -margin_bottom = 168.0 -text = "Mode" - -[node name="buildings_edit_mode" type="OptionButton" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 172.0 -margin_right = 234.0 -margin_bottom = 192.0 -text = "Select" -items = [ "Select", null, false, 0, null, "Move", null, false, 1, null, "Rotate", null, false, 2, null, "Create", null, false, 3, null ] -selected = 0 - -[node name="Label2" type="Label" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 196.0 -margin_right = 234.0 -margin_bottom = 210.0 -text = "Building type" - -[node name="building_type" type="OptionButton" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 214.0 -margin_right = 234.0 -margin_bottom = 234.0 -text = "Building Type" - -[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -margin_top = 238.0 -margin_right = 234.0 -margin_bottom = 242.0 - -[node name="buildings_delete_building" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 246.0 -margin_right = 234.0 -margin_bottom = 266.0 -text = "Delete building" - -[node name="buildings_create_building" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 270.0 -margin_right = 234.0 -margin_bottom = 290.0 -text = "Create building" - -[node name="buildings_save" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 294.0 -margin_right = 234.0 -margin_bottom = 314.0 -text = "Save Buildings" - -[node name="lines_list_building" type="ItemList" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 318.0 -margin_right = 234.0 -margin_bottom = 398.0 -rect_min_size = Vector2( 0, 80 ) -size_flags_horizontal = 3 - -[node name="buildings_assign_to_line" type="Button" parent="VBoxContainer/v_buildings/base/VBoxContainer"] -unique_name_in_owner = true -margin_top = 402.0 -margin_right = 234.0 -margin_bottom = 422.0 -text = "Assign To Line" +margin_bottom = 504.0 [node name="v_navigation" type="VBoxContainer" parent="VBoxContainer"] unique_name_in_owner = true -margin_top = 654.0 +visible = false +margin_top = 246.0 margin_right = 248.0 -margin_bottom = 676.0 +margin_bottom = 268.0 [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_navigation"] margin_right = 248.0 @@ -334,9 +94,10 @@ text = "Navigation mode" [node name="v_poi" type="VBoxContainer" parent="VBoxContainer"] unique_name_in_owner = true -margin_top = 680.0 +visible = false +margin_top = 246.0 margin_right = 248.0 -margin_bottom = 702.0 +margin_bottom = 268.0 [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_poi"] margin_right = 248.0 @@ -350,9 +111,10 @@ text = "POI mode" [node name="v_road_lines" type="VBoxContainer" parent="VBoxContainer"] unique_name_in_owner = true -margin_top = 706.0 +visible = false +margin_top = 246.0 margin_right = 248.0 -margin_bottom = 1665.0 +margin_bottom = 1205.0 [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_road_lines"] margin_right = 248.0 @@ -604,8 +366,8 @@ size_flags_vertical = 3 scroll_horizontal_enabled = false [node name="v" type="VBoxContainer" parent="VBoxContainer/v_road_lines/road_lines_edit_metadata_dlg/scroll"] -margin_right = 222.0 -margin_bottom = 418.0 +margin_right = 234.0 +margin_bottom = 250.0 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -730,9 +492,10 @@ text = "Close" [node name="v_npc" type="VBoxContainer" parent="VBoxContainer"] unique_name_in_owner = true -margin_top = 1669.0 +visible = false +margin_top = 1749.0 margin_right = 248.0 -margin_bottom = 1691.0 +margin_bottom = 1771.0 [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_npc"] margin_right = 248.0 diff --git a/src/flecs b/src/flecs index b002dcb..de8b378 160000 --- a/src/flecs +++ b/src/flecs @@ -1 +1 @@ -Subproject commit b002dcb57592ae751bd20dcc0a7d8198a163460f +Subproject commit de8b378bd8937bd6fbb760d050c4cfab4610788e diff --git a/src/godot b/src/godot index 3ee8ecd..3841d76 160000 --- a/src/godot +++ b/src/godot @@ -1 +1 @@ -Subproject commit 3ee8ecdf256de274a715d69308bab1a450c92b0b +Subproject commit 3841d76515eb6f836937eccc891bf7956cb06001 diff --git a/src/meshoptimizer b/src/meshoptimizer index 7f936ad..b0cc223 160000 --- a/src/meshoptimizer +++ b/src/meshoptimizer @@ -1 +1 @@ -Subproject commit 7f936ad1b51ddc1f45c3e852453aeee58778931b +Subproject commit b0cc223e1a973b848a539c31ae0c4647af598ed7 diff --git a/src/modules/stream/SCsub b/src/modules/stream/SCsub index 30c29a4..cccafbf 100644 --- a/src/modules/stream/SCsub +++ b/src/modules/stream/SCsub @@ -3,14 +3,14 @@ Import("env") Import("env_modules") - -env_stream = env_modules.Clone() - # Godot source files module_obj = [] SConscript("buildings/SCsub") +SConscript("ui/SCsub") + +env_stream = env_modules.Clone() env_stream.Prepend(CPPPATH=["../../meshoptimizer/src"]) env_stream.add_source_files(module_obj, "*.cpp") diff --git a/src/modules/stream/buildings/element_data.cpp b/src/modules/stream/buildings/element_data.cpp index 7eb609a..f7c1378 100644 --- a/src/modules/stream/buildings/element_data.cpp +++ b/src/modules/stream/buildings/element_data.cpp @@ -205,6 +205,7 @@ void ElementData::grow_cell(int type, const String &key, bool exterior, int fl, } void ElementData::create_new_layout(const String &key) { + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity top = ecs.lookup("grid_layouts"); assert(top.is_valid()); flecs::entity layout = ecs.entity(key.ascii().ptr()).child_of(top); @@ -220,6 +221,7 @@ void ElementData::create_new_layout(const String &key) void ElementData::create_new_exterior_floor(const String &key) { int i; + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity ext = get_base(key, true); assert(ext.is_valid()); struct grid_layout_base *l = ext.get_mut(); @@ -243,6 +245,7 @@ void ElementData::create_new_interior_floor(const String &key) assert(intr.is_valid()); struct grid_layout_base *l = intr.get_mut(); int floor = l->floor_count; + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity fl = ecs.entity(("floor_" + itos(floor)).ascii().ptr()) .child_of(intr); assert(fl.is_valid()); @@ -257,6 +260,7 @@ void ElementData::create_new_interior_floor(const String &key) } void ElementData::serialize_layouts(Dictionary &store) { + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity top = ecs.lookup("grid_layouts"); assert(top.is_valid()); top.children([this, &store](flecs::entity l) { @@ -324,6 +328,7 @@ void ElementData::serialize_layouts(Dictionary &store) void ElementData::unserialize_layouts(const Dictionary &store) { int i; + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity top = ecs.lookup("grid_layouts"); assert(top.is_valid()); // delete all layouts @@ -417,6 +422,7 @@ void ElementData::ensure_floor(const String &key, bool exterior, int fl) int i; if (has_floor(key, exterior, fl)) return; + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity base = get_base(key, exterior); flecs::entity floor_e = ecs.entity(("floor_" + itos(fl)).ascii().ptr()).child_of(base); diff --git a/src/modules/stream/buildings/element_data.h b/src/modules/stream/buildings/element_data.h index b07243a..40b543f 100644 --- a/src/modules/stream/buildings/element_data.h +++ b/src/modules/stream/buildings/element_data.h @@ -8,6 +8,7 @@ #include #include #include +#include "base_data.h" #include "editor_event.h" template T *get_as_node(const String &path) { @@ -60,7 +61,6 @@ template void select_control_item(T *ctl, const String &item) } #define ELEMENT_SOCKETS 16 class ElementData { - flecs::world ecs; static ElementData *singleton; public: @@ -124,6 +124,7 @@ public: protected: ElementData() { + flecs::world ecs = BaseData::get_singleton()->get(); ecs.component(); ecs.component(); ecs.component(); @@ -185,6 +186,7 @@ public: } inline const flecs::entity get_layout(const String &key) const { + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity top = ecs.lookup("grid_layouts"); assert(top.is_valid()); flecs::entity layout = top.lookup(key.ascii().ptr()); @@ -301,6 +303,7 @@ public: } void get_grid_layouts_key_list(List *keys) { + flecs::world ecs = BaseData::get_singleton()->get(); flecs::entity top = ecs.lookup("grid_layouts"); assert(top.is_valid()); flecs::query_builder qb = @@ -438,4 +441,4 @@ public: void load_data(); }; -#endif \ No newline at end of file +#endif diff --git a/src/modules/stream/buildings_editor.cpp b/src/modules/stream/buildings_editor.cpp index 6683f74..b88d8ae 100644 --- a/src/modules/stream/buildings_editor.cpp +++ b/src/modules/stream/buildings_editor.cpp @@ -1,6 +1,7 @@ #undef NDEBUG #include #include +#include #include #include #include @@ -12,342 +13,10 @@ #include "editor_event.h" #include "world_editor.h" #include "buildings_data.h" +#include "base_data.h" +#include "ui/main_tabs.h" #include "buildings_editor.h" -class HandlePositionSetting : public Object { - GDCLASS(HandlePositionSetting, Object) - BuildingsEditor *editor; - int old_mode; - -public: - HandlePositionSetting(BuildingsEditor *editor) - : Object() - , editor(editor) - , old_mode(-1) - { - SceneTree::get_singleton()->connect("idle_frame", this, - "handle_update"); - Button *set_cursor_position = editor->get_as_node