Forráskód Böngészése

Add editable object name

Daniele Bartolini 8 éve
szülő
commit
5745e79e4b

+ 2 - 1
tools/level_editor/action_type.vala

@@ -12,6 +12,7 @@ namespace Crown
 		SPAWN_SOUND,
 		DESTROY_SOUND,
 		MOVE_OBJECTS,
-		DUPLICATE_OBJECTS
+		DUPLICATE_OBJECTS,
+		OBJECT_SET_EDITOR_NAME
 	}
 }

+ 14 - 1
tools/level_editor/level.vala

@@ -29,6 +29,7 @@ namespace Crown
 
 		// Signals
 		public signal void selection_changed(Gee.ArrayList<Guid?> selection);
+		public signal void object_editor_name_changed(Guid object_id, string name);
 
 		public Level(Database db, ConsoleClient client, string source_dir, string toolchain_dir)
 		{
@@ -308,12 +309,20 @@ namespace Crown
 			_client.send_script(LevelEditorApi.set_sound_range(sound_id, range));
 		}
 
-		public string object_name(Guid object_id)
+		public string object_editor_name(Guid object_id)
 		{
 			Value? name = _db.get_property(object_id, "editor.name");
 			return name != null ? (string)name : "<unnamed>";
 		}
 
+		public void object_set_editor_name(Guid object_id, string name)
+		{
+			_db.add_restore_point((int)ActionType.OBJECT_SET_EDITOR_NAME, new Guid[] { object_id });
+			_db.set_property(object_id, "editor.name", name);
+
+			object_editor_name_changed(object_id, name);
+		}
+
 		private void send_spawn_units(Guid[] ids)
 		{
 			StringBuilder sb = new StringBuilder();
@@ -596,6 +605,10 @@ namespace Crown
 				}
 				break;
 
+			case (int)ActionType.OBJECT_SET_EDITOR_NAME:
+				object_editor_name_changed(data[0], object_editor_name(data[0]));
+				break;
+
 			default:
 				assert(false);
 				break;

+ 75 - 10
tools/level_editor/level_tree_view.vala

@@ -46,6 +46,7 @@ namespace Crown
 			// Data
 			_level = level;
 			_level.selection_changed.connect(on_level_selection_changed);
+			_level.object_editor_name_changed.connect(on_object_editor_name_changed);
 
 			_db = db;
 			_db.key_changed.connect(on_database_key_changed);
@@ -81,16 +82,21 @@ namespace Crown
 			});
 
 			_tree_view = new Gtk.TreeView();
-			// _tree_view.insert_column_with_attributes(-1
-			// 	, "Types"
-			// 	, new Gtk.CellRendererText()
-			// 	, "text"
-			// 	, Column.TYPE
-			// 	, null
-			// 	);
+			/*
+			_tree_view.insert_column_with_attributes(-1
+				, "Guids"
+				, new gtk.CellRendererText()
+				, "text"
+				, Column.GUID
+				, null
+				);
+			*/
+			Gtk.CellRendererText cell = new Gtk.CellRendererText();
+			cell.editable = true;
+			cell.edited.connect(on_object_name_edited);
 			_tree_view.insert_column_with_attributes(-1
 				, "Names"
-				, new Gtk.CellRendererText()
+				, cell
 				, "text"
 				, Column.NAME
 				, null
@@ -117,6 +123,33 @@ namespace Crown
 			show_all();
 		}
 
+		private void on_object_name_edited(string path, string new_text)
+		{
+			Gtk.TreeIter iter;
+			_tree_sort.get_iter_from_string(out iter, path);
+
+			Value type;
+			_tree_sort.get_value(iter, Column.TYPE, out type);
+			if ((int)type == ItemType.FOLDER)
+				return;
+
+			Value guid;
+			_tree_sort.get_value(iter, Column.GUID, out guid);
+
+			_level.object_set_editor_name(Guid.parse((string)guid), new_text);
+
+			Gtk.TreeIter iter_filter;
+			Gtk.TreeIter iter_model;
+			_tree_sort.convert_iter_to_child_iter(out iter_filter, iter);
+			_tree_filter.convert_iter_to_child_iter(out iter_model, iter_filter);
+
+			_tree_store.set(iter_model
+				, Column.NAME
+				, _level.object_editor_name(Guid.parse((string)guid))
+				, -1
+				);
+		}
+
 		private bool on_button_pressed(Gdk.EventButton ev)
 		{
 			uint button = ev.button;
@@ -221,6 +254,38 @@ namespace Crown
 			_tree_selection.changed.connect(on_tree_selection_changed);
 		}
 
+		private void on_object_editor_name_changed(Guid object_id, string name)
+		{
+			_tree_sort.foreach ((model, path, iter) => {
+				Value type;
+				model.get_value(iter, Column.TYPE, out type);
+				if ((int)type == ItemType.FOLDER)
+					return false;
+
+				Value guid;
+				model.get_value(iter, Column.GUID, out guid);
+				Guid guid_model = Guid.parse((string)guid);
+
+				if (guid_model == object_id)
+				{
+					Gtk.TreeIter iter_filter;
+					Gtk.TreeIter iter_model;
+					_tree_sort.convert_iter_to_child_iter(out iter_filter, iter);
+					_tree_filter.convert_iter_to_child_iter(out iter_model, iter_filter);
+
+					_tree_store.set(iter_model
+						, Column.NAME
+						, name
+						, -1
+						);
+
+					return true;
+				}
+
+				return false;
+			});
+		}
+
 		private void on_database_key_changed(Guid id, string key)
 		{
 			if (id != GUID_ZERO)
@@ -282,7 +347,7 @@ namespace Crown
 						, Column.GUID
 						, unit.to_string()
 						, Column.NAME
-						, _level.object_name(unit)
+						, _level.object_editor_name(unit)
 						, -1
 						);
 				}
@@ -299,7 +364,7 @@ namespace Crown
 						, Column.GUID
 						, sound.to_string()
 						, Column.NAME
-						, _level.object_name(sound)
+						, _level.object_editor_name(sound)
 						, -1
 						);
 				}