浏览代码

Graphics and Scene filters in context menu

Jed 4 年之前
父节点
当前提交
ca861a7d9c
共有 2 个文件被更改,包括 38 次插入19 次删除
  1. 23 0
      hide/comp/Toolbar.hx
  2. 15 19
      hide/view/l3d/Level3D.hx

+ 23 - 0
hide/comp/Toolbar.hx

@@ -13,6 +13,12 @@ typedef ToolSelect<T> = {
 	dynamic function onSelect( v : T ) : Void;
 	dynamic function onSelect( v : T ) : Void;
 }
 }
 
 
+typedef ToolMenu<T> = {
+	var element : Element;
+	function setContent( elements : Array<hide.comp.ContextMenu.ContextMenuItem> ) : Void;
+	dynamic function onSelect( v : T ) : Void;
+}
+
 class Toolbar extends Component {
 class Toolbar extends Component {
 
 
 	public function new(?parent,?el) {
 	public function new(?parent,?el) {
@@ -89,6 +95,23 @@ class Toolbar extends Component {
 		return tool;
 		return tool;
 	}
 	}
 
 
+	public function addMenu<T>( icon : String, label : String ) : ToolMenu<T> {
+		var e = new Element('<div class="button"><div class="icon fa fa-$icon"/>${label==null ? "" : label}</div>');
+		var menuItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
+		var tool : ToolMenu<T> = {
+			element : e,
+			setContent : function(c) {
+					menuItems = c;
+			},
+			onSelect : function(_) {},
+		};
+		e.click(function(ev) if( ev.button == 0 ){
+			new hide.comp.ContextMenu(menuItems);
+		});
+		e.appendTo(element);
+		return tool;
+	}
+
 	public function addRange( label : String, onChange : Float -> Void, ?defValue = 0., min = 0., max = 1. ) {
 	public function addRange( label : String, onChange : Float -> Void, ?defValue = 0., min = 0., max = 1. ) {
 		var r = new hide.comp.Range(element,new Element('<input title="$label" type="range" min="$min" max="$max" value="$defValue">'));
 		var r = new hide.comp.Range(element,new Element('<input title="$label" type="range" min="$min" max="$max" value="$defValue">'));
 		r.onChange = function(_) onChange(r.value);
 		r.onChange = function(_) onChange(r.value);

+ 15 - 19
hide/view/l3d/Level3D.hx

@@ -673,21 +673,19 @@ class Level3D extends FileView {
 			sceneFilters.set(f, getDisplayState("sceneFilters/" + f) != false);
 			sceneFilters.set(f, getDisplayState("sceneFilters/" + f) != false);
 		}
 		}
 
 
-		if(layerButtons != null) {
-			for(b in layerButtons)
-				b.element.remove();
-		}
-		layerButtons = new Map<PrefabElement, hide.comp.Toolbar.ToolToggle>();
+		var sceneFiltersMenu = layerToolbar.addMenu("", "Scene filters");
+		var content : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
 		var initDone = false;
 		var initDone = false;
 		for(typeid in sceneFilters.keys()) {
 		for(typeid in sceneFilters.keys()) {
-			var btn = layerToolbar.addToggle("", typeid, typeid.charAt(0).toLowerCase() + typeid.substr(1), function(on) {
+			content.push({label : typeid, checked : sceneFilters[typeid], click : function() {
+				var on = !sceneFilters[typeid];
 				sceneFilters.set(typeid, on);
 				sceneFilters.set(typeid, on);
 				if(initDone)
 				if(initDone)
 					applySceneFilter(typeid, on);
 					applySceneFilter(typeid, on);
-			});
-			if(sceneFilters.get(typeid) != false)
-				btn.toggle(true);
+				content.find(function(item) return item.label == typeid).checked = on;
+			}});
 		}
 		}
+		sceneFiltersMenu.setContent(content);
 		initDone = true;
 		initDone = true;
 	}
 	}
 
 
@@ -705,21 +703,19 @@ class Level3D extends FileView {
 		for(f in filters) {
 		for(f in filters) {
 			graphicsFilters.set(f, getDisplayState("graphicsFilters/" + f) != false);
 			graphicsFilters.set(f, getDisplayState("graphicsFilters/" + f) != false);
 		}
 		}
-		if(layerButtons != null) {
-			for(b in layerButtons)
-				b.element.remove();
-		}
-		layerButtons = new Map<PrefabElement, hide.comp.Toolbar.ToolToggle>();
+		var graphicsFiltersMenu = layerToolbar.addMenu("", "Graphics filters");
+		var content : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
 		var initDone = false;
 		var initDone = false;
 		for(typeid in graphicsFilters.keys()) {
 		for(typeid in graphicsFilters.keys()) {
-			var btn = layerToolbar.addToggle("", typeid, typeid.charAt(0).toLowerCase() + typeid.substr(1), function(on) {
+			content.push({label : typeid, checked : graphicsFilters[typeid], click : function() {
+				var on = !graphicsFilters[typeid];
 				graphicsFilters.set(typeid, on);
 				graphicsFilters.set(typeid, on);
-				if (initDone)
+				if(initDone)
 					applyGraphicsFilters(typeid, on);
 					applyGraphicsFilters(typeid, on);
-			});
-			if(graphicsFilters.get(typeid) != false)
-				btn.toggle(true);
+				content.find(function(item) return item.label == typeid).checked = on;
+			}});
 		}
 		}
+		graphicsFiltersMenu.setContent(content);
 		initDone = true;
 		initDone = true;
 	}
 	}