فهرست منبع

[scene] Added tag based filters, allow multiple prefabs to be tagged at once

Clément Espeute 11 ماه پیش
والد
کامیت
166d3f2216
3فایلهای تغییر یافته به همراه36 افزوده شده و 14 حذف شده
  1. 24 11
      hide/comp/SceneEditor.hx
  2. 1 1
      hide/view/FXEditor.hx
  3. 11 2
      hide/view/Prefab.hx

+ 24 - 11
hide/comp/SceneEditor.hx

@@ -387,6 +387,7 @@ enum RefreshMode {
 }
 
 typedef CustomPivot = { elt : PrefabElement, mesh : Mesh, locPos : Vector };
+typedef TagInfo = {id: String, color: String};
 
 class ViewModePopup extends hide.comp.Popup {
 	static var viewFilter : Array<{name: String, inf: {display: DisplayMode, debug: DebugMode}}> = [
@@ -1384,15 +1385,15 @@ class SceneEditor {
 		lastFocusObjects = objs;
 	}
 
-	function getAvailableTags(p: PrefabElement) : Array<{id: String, color: String}>{
+	function getAvailableTags() : Array<TagInfo>{
 		return null;
 	}
 
-	public function getTag(p: PrefabElement) {
+	public function getTag(p: PrefabElement) : TagInfo {
 		if(p.props != null) {
 			var tagId = Reflect.field(p.props, "tag");
 			if(tagId != null) {
-				var tags = getAvailableTags(p);
+				var tags = getAvailableTags();
 				if(tags != null)
 					return Lambda.find(tags, t -> t.id == tagId);
 			}
@@ -1437,21 +1438,33 @@ class SceneEditor {
 		}
 	}
 
-	function getTagMenu(p: PrefabElement) : Array<hide.comp.ContextMenu.ContextMenuItem> {
-		var tags = getAvailableTags(p);
+	function getTagMenu(prefabs: Array<PrefabElement>) : Array<hide.comp.ContextMenu.ContextMenuItem> {
+		var tags = getAvailableTags();
 		if(tags == null) return null;
 		var ret = [];
 		for(tag in tags) {
 			var style = 'background-color: ${tag.color};';
+			var checked = false;
+			for (p in prefabs) {
+				if (getTag(p) == tag)
+					checked = true;
+			}
 			ret.push({
 				label: '<span class="tag-disp-expand"><span class="tag-disp" style="$style">${tag.id}</span></span>',
 				click: function () {
-					if(getTag(p) == tag)
-						setTag(p, null);
-					else
-						setTag(p, tag.id);
+					for (p in prefabs) {
+						if(checked) {
+							setTag(p, null);
+						}
+						else {
+							setTag(p, tag.id);
+						}
+						applySceneStyle(p);
+					}
+					checked = !checked;
+
 				},
-				checked: getTag(p) == tag,
+				checked: checked,
 				stayOpen: true,
 			});
 		}
@@ -1778,7 +1791,7 @@ class SceneEditor {
 			}
 
 			if( current != null ) {
-				var menu = getTagMenu(current);
+				var menu = getTagMenu(selectedPrefabs);
 				if(menu != null)
 					menuItems.push({ label : "Tag", menu: menu });
 			}

+ 1 - 1
hide/view/FXEditor.hx

@@ -299,7 +299,7 @@ private class FXSceneEditor extends hide.comp.SceneEditor {
 		return menu;
 	}
 
-	override function getAvailableTags(p:PrefabElement) {
+	override function getAvailableTags() {
 		return cast ide.currentConfig.get("fx.tags");
 	}
 

+ 11 - 2
hide/view/Prefab.hx

@@ -168,7 +168,7 @@ class PrefabSceneEditor extends hide.comp.SceneEditor {
 		return newItems;
 	}
 
-	override function getAvailableTags(p:PrefabElement) {
+	override function getAvailableTags() {
 		return cast ide.currentConfig.get("sceneeditor.tags");
 	}
 }
@@ -734,8 +734,11 @@ class Prefab extends hide.view.FileView {
 			all = data.findAll(hrt.prefab.Prefab, true);
 		else
 			all = data.flatten(hrt.prefab.Prefab);
+
+		var tag = StringTools.replace(typeid, "tag:", "");
+		tag = tag != typeid ? tag : null;
 		for(p in all) {
-			if(p.type == typeid || p.getCdbType() == typeid) {
+			if(p.type == typeid || p.getCdbType() == typeid || (tag != null && (p.props:Dynamic)?.tag == tag)) {
 				sceneEditor.applySceneStyle(p);
 			}
 		}
@@ -879,6 +882,12 @@ class Prefab extends hide.view.FileView {
 				if(cdbType != null && sceneFilters.get(cdbType) == false)
 					visible = false;
 			}
+			if (visible) {
+				if ((p.props:Dynamic)?.tag != null) {
+					visible = sceneFilters.get('tag:${(p.props:Dynamic).tag}') != false;
+				}
+			}
+
 			if (obj3d.local3d != null) {
 				obj3d.local3d.visible = visible;
 			}