浏览代码

Update TileMap when its TileSet changes

Make TileMap monitor its TileSet for changes and emit a signal when the TileSet changes. This makes the editor update and show the updated version of the TileSet.
ShyRed 7 年之前
父节点
当前提交
67f4944a21
共有 2 个文件被更改,包括 18 次插入3 次删除
  1. 16 3
      scene/2d/tile_map.cpp
  2. 2 0
      scene/2d/tile_map.h

+ 16 - 3
scene/2d/tile_map.cpp

@@ -142,16 +142,20 @@ void TileMap::_update_quadrant_transform() {
 
 void TileMap::set_tileset(const Ref<TileSet> &p_tileset) {
 
-	if (tile_set.is_valid())
+	if (tile_set.is_valid()) {
 		tile_set->disconnect("changed", this, "_recreate_quadrants");
+		tile_set->remove_change_receptor(this);
+	}
 
 	_clear_quadrants();
 	tile_set = p_tileset;
 
-	if (tile_set.is_valid())
+	if (tile_set.is_valid()) {
 		tile_set->connect("changed", this, "_recreate_quadrants");
-	else
+		tile_set->add_change_receptor(this);
+	} else {
 		clear();
+	}
 
 	_recreate_quadrants();
 	emit_signal("settings_changed");
@@ -1573,6 +1577,12 @@ void TileMap::_bind_methods() {
 	BIND_ENUM_CONSTANT(TILE_ORIGIN_BOTTOM_LEFT);
 }
 
+void TileMap::_changed_callback(Object *p_changed, const char *p_prop) {
+	if (tile_set.is_valid() && tile_set.ptr() == p_changed) {
+		emit_signal("settings_changed");
+	}
+}
+
 TileMap::TileMap() {
 
 	rect_cache_dirty = true;
@@ -1601,5 +1611,8 @@ TileMap::TileMap() {
 
 TileMap::~TileMap() {
 
+	if (tile_set.is_valid())
+		tile_set->remove_change_receptor(this);
+
 	clear();
 }

+ 2 - 0
scene/2d/tile_map.h

@@ -217,6 +217,8 @@ protected:
 	void _notification(int p_what);
 	static void _bind_methods();
 
+	virtual void _changed_callback(Object *p_changed, const char *p_prop);
+
 public:
 	enum {
 		INVALID_CELL = -1