Przeglądaj źródła

Added help button for SceneEditor

Clement Espeute 2 lat temu
rodzic
commit
1b55582503
3 zmienionych plików z 95 dodań i 38 usunięć
  1. 46 19
      hide/comp/SceneEditor.hx
  2. 37 5
      hide/ui/Keys.hx
  3. 12 14
      hide/view/Prefab.hx

+ 46 - 19
hide/comp/SceneEditor.hx

@@ -198,6 +198,31 @@ class SnapSettingsPopup extends Popup {
     }
 }
 
+class HelpPopup extends Popup {
+	var editor : SceneEditor;
+
+	public function new(?parent : Element, ?root : Element, editor: SceneEditor) {
+        super(parent, root);
+        this.editor = editor;
+
+        popup.append(new Element("<p>Shortcuts</p>"));
+        popup.addClass("settings-popup");
+        popup.css("max-width", "300px");
+
+		var form_div = new Element("<div>").addClass("form-grid").appendTo(popup);
+		var categories = editor.view.keys.sortDocCategories(editor.view.config);
+
+		for (cat => shortcuts in categories) {
+			if (cat == "none")
+				continue;
+			form_div.append(new Element('<p style="grid-column: 1 / -1">$cat</p>'));
+			for (s in shortcuts) {
+				form_div.append(new Element('<label>${s.name}</label><span>${s.shortcut}</span>'));
+			}
+		}
+	}
+}
+
 class SceneEditor {
 
 	public var tree : hide.comp.IconTree<PrefabElement>;
@@ -273,43 +298,43 @@ class SceneEditor {
 		context.init();
 		editorDisplay = true;
 
-		view.keys.register("copy", onCopy);
-		view.keys.register("paste", onPaste);
-		view.keys.register("cancel", deselect);
-		view.keys.register("selectAll", selectAll);
-		view.keys.register("duplicate", duplicate.bind(true));
-		view.keys.register("duplicateInPlace", duplicate.bind(false));
-		view.keys.register("group", groupSelection);
-		view.keys.register("delete", () -> deleteElements(curEdit.rootElements));
-		view.keys.register("search", function() tree.openFilter());
-		view.keys.register("rename", function () {
+		view.keys.register("copy", {name: "Copy", category: "Edit"}, onCopy);
+		view.keys.register("paste", {name: "Paste", category: "Edit"}, onPaste);
+		view.keys.register("cancel", {name: "De-select", category: "Scene"}, deselect);
+		view.keys.register("selectAll", {name: "Select All", category: "Scene"}, selectAll);
+		view.keys.register("duplicate", {name: "Duplicate", category: "Scene"}, duplicate.bind(true));
+		view.keys.register("duplicateInPlace", {name: "Duplicate in place", category: "Scene"}, duplicate.bind(false));
+		view.keys.register("group", {name: "Group Selection", category: "Scene"}, groupSelection);
+		view.keys.register("delete", {name: "Delete", category: "Scene"}, () -> deleteElements(curEdit.rootElements));
+		view.keys.register("search", {name: "Search", category: "Scene"}, function() tree.openFilter());
+		view.keys.register("rename", {name: "Rename", category: "Scene"}, function () {
 			if(curEdit.rootElements.length > 0)
 				tree.editNode(curEdit.rootElements[0]);
 		});
 
-		view.keys.register("sceneeditor.focus", focusSelection);
-		view.keys.register("sceneeditor.lasso", startLassoSelect);
-		view.keys.register("sceneeditor.hide", function() {
+		view.keys.register("sceneeditor.focus", {name: "Focus Selection", category: "Scene"}, focusSelection);
+		view.keys.register("sceneeditor.lasso", {name: "Lasso Select", category: "Scene"}, startLassoSelect);
+		view.keys.register("sceneeditor.hide", {name: "Hide Selection", category: "Scene"}, function() {
 			var isHidden = isHidden(curEdit.rootElements[0]);
 			setVisible(curEdit.elements, isHidden);
 		});
-		view.keys.register("sceneeditor.isolate", function() {	isolate(curEdit.elements); });
-		view.keys.register("sceneeditor.showAll", function() {	setVisible(context.shared.elements(), true); });
-		view.keys.register("sceneeditor.selectParent", function() {
+		view.keys.register("sceneeditor.isolate", {name: "Isolate", category: "Scene"}, function() {	isolate(curEdit.elements); });
+		view.keys.register("sceneeditor.showAll", {name: "Show all", category: "Scene"}, function() {	setVisible(context.shared.elements(), true); });
+		view.keys.register("sceneeditor.selectParent", {name: "Select Parent", category: "Scene"}, function() {
 			if(curEdit.rootElements.length > 0) {
 				var p = curEdit.rootElements[0].parent;
 				if( p != null && p != sceneData ) selectElements([p]);
 			}
 		});
-		view.keys.register("sceneeditor.reparent", function() {
+		view.keys.register("sceneeditor.reparent", {name: "Reparent", category: "Scene"}, function() {
 			if(curEdit.rootElements.length > 1) {
 				var children = curEdit.rootElements.copy();
 				var parent = children.pop();
 				reparentElement(children, parent, 0);
 			}
 		});
-		view.keys.register("sceneeditor.editPivot", editPivot);
-		view.keys.register("sceneeditor.gatherToMouse", gatherToMouse);
+		view.keys.register("sceneeditor.editPivot", {name: "Edit Pivot", category: "Scene"}, editPivot);
+		view.keys.register("sceneeditor.gatherToMouse", {name: "Gather to mouse", category: "Scene"}, gatherToMouse);
 
 		// Load display state
 		{
@@ -325,6 +350,8 @@ class SceneEditor {
 		}
 	}
 
+
+
     public function getSnapStatus() : Bool {
         var ctrl = K.isDown(K.CTRL);
         return (snapToggle && !ctrl) || (!snapToggle && ctrl);

+ 37 - 5
hide/ui/Keys.hx

@@ -1,14 +1,18 @@
 package hide.ui;
 
+
+typedef EntryDoc = {name: String, category: String};
+typedef Entry = {doc: EntryDoc, cb: Void->Void};
+
 class Keys {
 
-	var keys = new Map<String,Void->Void>();
+	var keys = new Map<String,Entry>();
 	var parent : js.html.Element;
 	var listeners = new Array<js.jquery.Event -> Bool>();
 	var disabledStack : Int = 0;
 
 	public function pushDisable() {
-		
+
 		disabledStack ++;
 	}
 
@@ -83,19 +87,47 @@ class Keys {
 				continue;
 			}
 			if( keyCode == key ) {
-				keys.get(k)();
+				keys.get(k).cb();
 				return true;
 			}
 		}
 		return false;
 	}
 
-	public function register( name : String, callb : Void -> Void ) {
-		keys.set(name, callb);
+	public function register( name : String, ?doc : EntryDoc, callb : Void -> Void ) {
+		keys.set(name, {doc: doc, cb:callb});
 	}
 
 	public static function get( e : Element ) : Keys {
 		return Reflect.field(e[0], "__keys");
 	}
 
+	public function sortDocCategories(config: Config) : Map<String, Array<{name: String, shortcut: String}>> {
+		var ret = new Map();
+		for (k => v in keys) {
+			var shortcut = config.get("key."+k);
+			if (shortcut != null) {
+				var name = null;
+				var category = "none";
+				if (v.doc != null) {
+					name = v.doc.name;
+					category = v.doc.category;
+				}
+				if (name == null) {
+					name = k;
+					var parts = name.split(".");
+					name = parts[parts.length-1];
+					name = name.charAt(0).toUpperCase() + name.substr(1);
+				}
+				if (!ret.exists(category)) {
+					ret.set(category, new Array<{name: String, shortcut: String}>());
+				}
+				var arr = ret.get(category);
+				arr.push({name: name, shortcut: shortcut});
+			}
+		}
+
+		return ret;
+	}
+
 }

+ 12 - 14
hide/view/Prefab.hx

@@ -353,24 +353,18 @@ class Prefab extends FileView {
 
 		toolsDefs.push({id: "perspectiveCamera", title : "Perspective camera", icon : "video-camera", type : Button(() -> resetCamera(false)) });
 		toolsDefs.push({id: "camSettings", title : "Camera Settings", icon : "camera", type : Popup((e : hide.Element) -> new hide.comp.CameraControllerEditor(sceneEditor, null,e)) });
-		
+
 		toolsDefs.push({id: "topCamera", title : "Top camera", icon : "video-camera", iconStyle: { transform: "rotateZ(90deg)" }, type : Button(() -> resetCamera(true))});
-		
+
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
-		
+
 		toolsDefs.push({id: "snapToGroundToggle", title : "Snap to ground", icon : "anchor", type : Toggle((v) -> sceneEditor.snapToGround = v)});
-		
+
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
-		
+
 		toolsDefs.push({id: "translationMode", title : "Gizmo translation Mode", icon : "arrows", type : Button(@:privateAccess sceneEditor.gizmo.translationMode)});
 		toolsDefs.push({id: "rotationMode", title : "Gizmo rotation Mode", icon : "refresh", type : Button(@:privateAccess sceneEditor.gizmo.rotationMode)});
 		toolsDefs.push({id: "scalingMode", title : "Gizmo scaling Mode", icon : "expand", type : Button(@:privateAccess sceneEditor.gizmo.scalingMode)});
-		
-		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
-
-        var bob = function() {
-            trace("bob");
-        }
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
 
@@ -378,11 +372,11 @@ class Prefab extends FileView {
         toolsDefs.push({id: "snap-menu", title : "", icon: "", type : Popup((e) -> new hide.comp.SceneEditor.SnapSettingsPopup(null, e, sceneEditor))});
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
-		
+
 		toolsDefs.push({id: "localTransformsToggle", title : "Local transforms", icon : "compass", type : Toggle((v) -> sceneEditor.localTransform = v)});
-		
+
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
-		
+
 		toolsDefs.push({id: "gridToggle", title : "Toggle grid", icon : "th", type : Toggle((v) -> { showGrid = v; updateGrid(); }) });
 		toolsDefs.push({id: "axisToggle", title : "Toggle model axis", icon : "cube", type : Toggle((v) -> { sceneEditor.showBasis = v; sceneEditor.updateBasis(); }) });
 		toolsDefs.push({id: "iconVisibility", title : "Toggle 3d icons visibility", icon : "image", type : Toggle((v) -> { hide.Ide.inst.show3DIcons = v; }), defaultValue: true });
@@ -437,6 +431,10 @@ class Prefab extends FileView {
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
 
+        toolsDefs.push({id: "help", title : "help", icon: "question", type : Popup((e) -> new hide.comp.SceneEditor.HelpPopup(null, e, sceneEditor))});
+
+		toolsDefs.push({id: "", title : "", icon : "", type : Separator});
+
 		toolsDefs.push({id: "viewModes", title : "View Modes", type : Menu(filtersToMenuItem(viewModes, "View"))});
 
 		toolsDefs.push({id: "", title : "", icon : "", type : Separator});