Bladeren bron

Cleanup MeshLibrary changed signals

kobewi 2 jaren geleden
bovenliggende
commit
ecc3944b1e

+ 5 - 0
modules/gridmap/doc_classes/GridMap.xml

@@ -228,6 +228,11 @@
 				Emitted when [member cell_size] changes.
 				Emitted when [member cell_size] changes.
 			</description>
 			</description>
 		</signal>
 		</signal>
+		<signal name="changed">
+			<description>
+				Emitted when the [MeshLibrary] of this GridMap changes.
+			</description>
+		</signal>
 	</signals>
 	</signals>
 	<constants>
 	<constants>
 		<constant name="INVALID_CELL_ITEM" value="-1">
 		<constant name="INVALID_CELL_ITEM" value="-1">

+ 33 - 15
modules/gridmap/editor/grid_map_editor_plugin.cpp

@@ -32,6 +32,7 @@
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 
 
+#include "core/core_string_names.h"
 #include "core/input/input.h"
 #include "core/input/input.h"
 #include "core/os/keyboard.h"
 #include "core/os/keyboard.h"
 #include "editor/editor_node.h"
 #include "editor/editor_node.h"
@@ -341,7 +342,6 @@ bool GridMapEditor::do_input_action(Camera3D *p_camera, const Point2 &p_point, b
 	if (selected_palette < 0 && input_action != INPUT_PICK && input_action != INPUT_SELECT && input_action != INPUT_PASTE) {
 	if (selected_palette < 0 && input_action != INPUT_PICK && input_action != INPUT_SELECT && input_action != INPUT_PASTE) {
 		return false;
 		return false;
 	}
 	}
-	Ref<MeshLibrary> mesh_library = node->get_mesh_library();
 	if (mesh_library.is_null()) {
 	if (mesh_library.is_null()) {
 		return false;
 		return false;
 	}
 	}
@@ -866,10 +866,7 @@ void GridMapEditor::update_palette() {
 	mesh_library_palette->set_fixed_icon_size(Size2(min_size, min_size));
 	mesh_library_palette->set_fixed_icon_size(Size2(min_size, min_size));
 	mesh_library_palette->set_max_text_lines(2);
 	mesh_library_palette->set_max_text_lines(2);
 
 
-	Ref<MeshLibrary> mesh_library = node->get_mesh_library();
-
 	if (mesh_library.is_null()) {
 	if (mesh_library.is_null()) {
-		last_mesh_library = nullptr;
 		search_box->set_text("");
 		search_box->set_text("");
 		search_box->set_editable(false);
 		search_box->set_editable(false);
 		info_message->show();
 		info_message->show();
@@ -922,13 +919,39 @@ void GridMapEditor::update_palette() {
 
 
 		item++;
 		item++;
 	}
 	}
+}
+
+void GridMapEditor::_update_mesh_library() {
+	ERR_FAIL_NULL(node);
+
+	Ref<MeshLibrary> new_mesh_library = node->get_mesh_library();
+	if (new_mesh_library != mesh_library) {
+		if (mesh_library.is_valid()) {
+			mesh_library->disconnect_changed(callable_mp(this, &GridMapEditor::update_palette));
+		}
+		mesh_library = new_mesh_library;
+	} else {
+		return;
+	}
 
 
-	last_mesh_library = *mesh_library;
+	if (mesh_library.is_valid()) {
+		mesh_library->connect_changed(callable_mp(this, &GridMapEditor::update_palette));
+	}
+
+	update_palette();
+	// Update the cursor and grid in case the library is changed or removed.
+	_update_cursor_instance();
+	update_grid();
 }
 }
 
 
 void GridMapEditor::edit(GridMap *p_gridmap) {
 void GridMapEditor::edit(GridMap *p_gridmap) {
-	if (node && node->is_connected("cell_size_changed", callable_mp(this, &GridMapEditor::_draw_grids))) {
-		node->disconnect("cell_size_changed", callable_mp(this, &GridMapEditor::_draw_grids));
+	if (node) {
+		node->disconnect(SNAME("cell_size_changed"), callable_mp(this, &GridMapEditor::_draw_grids));
+		node->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &GridMapEditor::_update_mesh_library));
+		if (mesh_library.is_valid()) {
+			mesh_library->disconnect_changed(callable_mp(this, &GridMapEditor::update_palette));
+			mesh_library = Ref<MeshLibrary>();
+		}
 	}
 	}
 
 
 	node = p_gridmap;
 	node = p_gridmap;
@@ -961,7 +984,9 @@ void GridMapEditor::edit(GridMap *p_gridmap) {
 	_draw_grids(node->get_cell_size());
 	_draw_grids(node->get_cell_size());
 	update_grid();
 	update_grid();
 
 
-	node->connect("cell_size_changed", callable_mp(this, &GridMapEditor::_draw_grids));
+	node->connect(SNAME("cell_size_changed"), callable_mp(this, &GridMapEditor::_draw_grids));
+	node->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &GridMapEditor::_update_mesh_library));
+	_update_mesh_library();
 }
 }
 
 
 void GridMapEditor::update_grid() {
 void GridMapEditor::update_grid() {
@@ -1092,13 +1117,6 @@ void GridMapEditor::_notification(int p_what) {
 				}
 				}
 				grid_xform = xf;
 				grid_xform = xf;
 			}
 			}
-			Ref<MeshLibrary> cgmt = node->get_mesh_library();
-			if (cgmt.operator->() != last_mesh_library) {
-				update_palette();
-				// Update the cursor and grid in case the library is changed or removed.
-				_update_cursor_instance();
-				update_grid();
-			}
 		} break;
 		} break;
 
 
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {

+ 2 - 1
modules/gridmap/editor/grid_map_editor_plugin.h

@@ -92,7 +92,7 @@ class GridMapEditor : public VBoxContainer {
 	List<SetItem> set_items;
 	List<SetItem> set_items;
 
 
 	GridMap *node = nullptr;
 	GridMap *node = nullptr;
-	MeshLibrary *last_mesh_library = nullptr;
+	Ref<MeshLibrary> mesh_library = nullptr;
 
 
 	Transform3D grid_xform;
 	Transform3D grid_xform;
 	Transform3D edit_grid_xform;
 	Transform3D edit_grid_xform;
@@ -191,6 +191,7 @@ class GridMapEditor : public VBoxContainer {
 	void _configure();
 	void _configure();
 	void _menu_option(int);
 	void _menu_option(int);
 	void update_palette();
 	void update_palette();
+	void _update_mesh_library();
 	void _set_display_mode(int p_mode);
 	void _set_display_mode(int p_mode);
 	void _item_selected_cbk(int idx);
 	void _item_selected_cbk(int idx);
 	void _update_cursor_transform();
 	void _update_cursor_transform();

+ 2 - 0
modules/gridmap/grid_map.cpp

@@ -30,6 +30,7 @@
 
 
 #include "grid_map.h"
 #include "grid_map.h"
 
 
+#include "core/core_string_names.h"
 #include "core/io/marshalls.h"
 #include "core/io/marshalls.h"
 #include "core/object/message_queue.h"
 #include "core/object/message_queue.h"
 #include "scene/3d/light_3d.h"
 #include "scene/3d/light_3d.h"
@@ -1122,6 +1123,7 @@ void GridMap::_bind_methods() {
 	BIND_CONSTANT(INVALID_CELL_ITEM);
 	BIND_CONSTANT(INVALID_CELL_ITEM);
 
 
 	ADD_SIGNAL(MethodInfo("cell_size_changed", PropertyInfo(Variant::VECTOR3, "cell_size")));
 	ADD_SIGNAL(MethodInfo("cell_size_changed", PropertyInfo(Variant::VECTOR3, "cell_size")));
+	ADD_SIGNAL(MethodInfo(CoreStringNames::get_singleton()->changed));
 }
 }
 
 
 void GridMap::set_cell_scale(float p_scale) {
 void GridMap::set_cell_scale(float p_scale) {

+ 1 - 7
scene/resources/mesh_library.cpp

@@ -132,6 +132,7 @@ void MeshLibrary::create_item(int p_item) {
 	ERR_FAIL_COND(p_item < 0);
 	ERR_FAIL_COND(p_item < 0);
 	ERR_FAIL_COND(item_map.has(p_item));
 	ERR_FAIL_COND(item_map.has(p_item));
 	item_map[p_item] = Item();
 	item_map[p_item] = Item();
+	emit_changed();
 	notify_property_list_changed();
 	notify_property_list_changed();
 }
 }
 
 
@@ -145,7 +146,6 @@ void MeshLibrary::set_item_mesh(int p_item, const Ref<Mesh> &p_mesh) {
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].mesh = p_mesh;
 	item_map[p_item].mesh = p_mesh;
 	emit_changed();
 	emit_changed();
-	notify_property_list_changed();
 }
 }
 
 
 void MeshLibrary::set_item_mesh_transform(int p_item, const Transform3D &p_transform) {
 void MeshLibrary::set_item_mesh_transform(int p_item, const Transform3D &p_transform) {
@@ -157,7 +157,6 @@ void MeshLibrary::set_item_mesh_transform(int p_item, const Transform3D &p_trans
 void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes) {
 void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes) {
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].shapes = p_shapes;
 	item_map[p_item].shapes = p_shapes;
-	notify_property_list_changed();
 	emit_changed();
 	emit_changed();
 	notify_property_list_changed();
 	notify_property_list_changed();
 }
 }
@@ -165,22 +164,18 @@ void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes)
 void MeshLibrary::set_item_navigation_mesh(int p_item, const Ref<NavigationMesh> &p_navigation_mesh) {
 void MeshLibrary::set_item_navigation_mesh(int p_item, const Ref<NavigationMesh> &p_navigation_mesh) {
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].navigation_mesh = p_navigation_mesh;
 	item_map[p_item].navigation_mesh = p_navigation_mesh;
-	notify_property_list_changed();
 	emit_changed();
 	emit_changed();
-	notify_property_list_changed();
 }
 }
 
 
 void MeshLibrary::set_item_navigation_mesh_transform(int p_item, const Transform3D &p_transform) {
 void MeshLibrary::set_item_navigation_mesh_transform(int p_item, const Transform3D &p_transform) {
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].navigation_mesh_transform = p_transform;
 	item_map[p_item].navigation_mesh_transform = p_transform;
 	emit_changed();
 	emit_changed();
-	notify_property_list_changed();
 }
 }
 
 
 void MeshLibrary::set_item_navigation_layers(int p_item, uint32_t p_navigation_layers) {
 void MeshLibrary::set_item_navigation_layers(int p_item, uint32_t p_navigation_layers) {
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].navigation_layers = p_navigation_layers;
 	item_map[p_item].navigation_layers = p_navigation_layers;
-	notify_property_list_changed();
 	emit_changed();
 	emit_changed();
 }
 }
 
 
@@ -188,7 +183,6 @@ void MeshLibrary::set_item_preview(int p_item, const Ref<Texture2D> &p_preview)
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'.");
 	item_map[p_item].preview = p_preview;
 	item_map[p_item].preview = p_preview;
 	emit_changed();
 	emit_changed();
-	notify_property_list_changed();
 }
 }
 
 
 String MeshLibrary::get_item_name(int p_item) const {
 String MeshLibrary::get_item_name(int p_item) const {