Browse Source

SDK SceneComposer : added abstract ShortcutTool class that extends SceneEditTool
- added a shortcutManager that provide some usefull methodes for ShortcutTools. Also handle activation of shortcuts.
- wip : implementation of the MoveShortcut (based on the same shortcut provided by the selectTool) using ShortcutTool and the ShortcutManager.
- modified the SceneComposerToolController to work with the ShortcutManager & ShortcutTool

Maselbas 10 years ago
parent
commit
f7e4f399dc

+ 40 - 8
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java

@@ -11,6 +11,7 @@ import com.jme3.gde.core.scene.controller.SceneToolController;
 import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
 import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
 import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
 import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
 import com.jme3.gde.scenecomposer.tools.PickManager;
 import com.jme3.gde.scenecomposer.tools.PickManager;
+import com.jme3.gde.scenecomposer.tools.shortcuts.ShortcutManager;
 import com.jme3.input.event.KeyInputEvent;
 import com.jme3.input.event.KeyInputEvent;
 import com.jme3.light.Light;
 import com.jme3.light.Light;
 import com.jme3.light.PointLight;
 import com.jme3.light.PointLight;
@@ -31,6 +32,7 @@ import com.jme3.scene.control.Control;
 import com.jme3.scene.shape.Quad;
 import com.jme3.scene.shape.Quad;
 import com.jme3.texture.Texture;
 import com.jme3.texture.Texture;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Callable;
+import org.openide.util.Lookup;
 
 
 /**
 /**
  *
  *
@@ -184,7 +186,11 @@ public class SceneComposerToolController extends SceneToolController {
      * @param camera
      * @param camera
      */
      */
     public void doEditToolActivatedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) {
     public void doEditToolActivatedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) {
-        if (editTool != null) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.getActiveShortcut().actionPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
+        } else if (editTool != null) {
             editTool.setCamera(camera);
             editTool.setCamera(camera);
             editTool.actionPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
             editTool.actionPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
         }
         }
@@ -198,36 +204,62 @@ public class SceneComposerToolController extends SceneToolController {
      * @param camera
      * @param camera
      */
      */
     public void doEditToolActivatedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) {
     public void doEditToolActivatedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) {
-        if (editTool != null) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.getActiveShortcut().actionSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
+        } else if (editTool != null) {
             editTool.setCamera(camera);
             editTool.setCamera(camera);
             editTool.actionSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
             editTool.actionSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
         }
         }
     }
     }
 
 
     public void doEditToolMoved(Vector2f mouseLoc, Camera camera) {
     public void doEditToolMoved(Vector2f mouseLoc, Camera camera) {
-        if (editTool != null) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.getActiveShortcut().mouseMoved(mouseLoc, rootNode, editorController.getCurrentDataObject(), selectedSpatial);
+        } else if (editTool != null) {
             editTool.setCamera(camera);
             editTool.setCamera(camera);
             editTool.mouseMoved(mouseLoc, rootNode, editorController.getCurrentDataObject(), selectedSpatial);
             editTool.mouseMoved(mouseLoc, rootNode, editorController.getCurrentDataObject(), selectedSpatial);
         }
         }
     }
     }
 
 
     public void doEditToolDraggedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) {
     public void doEditToolDraggedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) {
-        if (editTool != null) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.getActiveShortcut().draggedPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
+        } else if (editTool != null) {
             editTool.setCamera(camera);
             editTool.setCamera(camera);
             editTool.draggedPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
             editTool.draggedPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
         }
         }
     }
     }
 
 
     public void doEditToolDraggedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) {
     public void doEditToolDraggedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) {
-        if (editTool != null) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.getActiveShortcut().draggedSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
+        } else if (editTool != null) {
             editTool.setCamera(camera);
             editTool.setCamera(camera);
             editTool.draggedSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
             editTool.draggedSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
         }
         }
     }
     }
     
     
-    void doKeyPressed(KeyInputEvent kie) {
-        if (editTool != null) {
-            editTool.keyPressed(kie);
+    public void doKeyPressed(KeyInputEvent kie) {
+        ShortcutManager scm = Lookup.getDefault().lookup(ShortcutManager.class);
+        
+        if (scm.isActive()) {
+            scm.doKeyPressed(kie);
+        } else {
+            if (scm.activateShortcut(kie)) {
+                scm.getActiveShortcut().activate(manager, toolsNode, onTopToolsNode, selected, this);
+            } else {
+                if (editTool != null) {
+                    editTool.keyPressed(kie);
+                }
+            }
         }
         }
     }
     }
     
     

+ 137 - 0
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/MoveShortcut.java

@@ -0,0 +1,137 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.scenecomposer.tools.shortcuts;
+
+import com.jme3.asset.AssetManager;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
+import com.jme3.gde.scenecomposer.SceneComposerToolController;
+import com.jme3.gde.scenecomposer.tools.PickManager;
+import com.jme3.input.KeyInput;
+import com.jme3.input.event.KeyInputEvent;
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+import org.openide.loaders.DataObject;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author dokthar
+ */
+public class MoveShortcut extends ShortcutTool {
+
+    private Vector3f currentAxis;
+    private StringBuilder numberBuilder;
+    private Spatial spatial;
+    private Vector3f initalLocation;
+    private Vector3f finalLocation;
+    private PickManager pickManager;
+
+    @Override
+    public boolean isActivableBy(KeyInputEvent kie) {
+        return kie.getKeyCode() == KeyInput.KEY_G;
+    }
+
+    @Override
+    public void cancel() {
+        spatial.setLocalTranslation(initalLocation);
+        terminate();
+    }
+
+    private void apply() {
+        // TODO creat UNDO/REDO
+        terminate();
+    }
+
+    @Override
+    public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) {
+        super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController); //To change body of generated methods, choose Tools | Templates.
+        hideMarker();
+        numberBuilder = new StringBuilder();
+        if (selectedSpatial == null) {
+            terminate();
+        } else {
+            spatial = selectedSpatial;
+            initalLocation = spatial.getLocalTranslation();
+            currentAxis = new Vector3f().set(Vector3f.UNIT_XYZ);
+
+            pickManager = Lookup.getDefault().lookup(PickManager.class);
+            ///pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_YZ, getTransformType(), camera, screenCoord);
+        }
+    }
+
+    @Override
+    public void keyPressed(KeyInputEvent kie) {
+        if (kie.isPressed()) {
+
+            /*
+             ShortcutTool otherShortcut = Lookup.getDefault().lookup(ShortcutManager.class).getActivableShortcut(kie);
+             if(otherShortcut != null){
+             Lookup.getDefault().lookup(ShortcutManager.class).setShortCut(otherShortcut);
+             }*/
+            Lookup.getDefault().lookup(ShortcutManager.class).activateShortcut(kie);
+
+            boolean axisChanged = ShortcutManager.checkAxisKey(kie, currentAxis);
+            boolean numberChanged = ShortcutManager.checkNumberKey(kie, numberBuilder);
+            boolean enterHit = ShortcutManager.checkEnterHit(kie);
+            boolean escHit = ShortcutManager.checkEscHit(kie);
+
+            if (escHit) {
+                cancel();
+            } else if (enterHit) {
+                apply();
+            } else if (axisChanged || numberChanged) {
+                //update transformation
+                float number = ShortcutManager.getNumberkey(numberBuilder);
+                Vector3f translation = currentAxis.mult(number);
+                finalLocation = initalLocation.add(translation);
+                spatial.setLocalTranslation(finalLocation);
+
+            }
+
+        }
+    }
+
+    @Override
+    public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
+        if (!pressed) {
+            apply();
+        }
+    }
+
+    @Override
+    public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
+        if (pressed) {
+            cancel();
+        }
+    }
+
+    @Override
+    public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject dataObject, JmeSpatial selectedSpatial) {
+        pickManager.updatePick(camera, screenCoord);
+        /* PickManager pickManager = Lookup.getDefault().lookup(PickManager.class);
+         if (toolController.isSnapToScene()) {
+         moveManager.setAlternativePickTarget(rootNode.getLookup().lookup(Node.class));
+         }
+         // free form translation
+         moveManager.move(camera, screenCoord, axis, toolController.isSnapToGrid());*/
+    }
+
+    @Override
+    public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
+        if (pressed) {
+            cancel();
+        }
+    }
+
+}

+ 197 - 0
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ShortcutManager.java

@@ -0,0 +1,197 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.scenecomposer.tools.shortcuts;
+
+import com.jme3.gde.scenecomposer.SceneEditTool;
+import com.jme3.input.KeyInput;
+import com.jme3.input.event.KeyInputEvent;
+import com.jme3.math.Vector3f;
+import java.util.ArrayList;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ *
+ * @author dokthar
+ */
+@ServiceProvider(service = ShortcutManager.class)
+public class ShortcutManager {
+
+    private ShortcutTool currentShortcut;
+    private ArrayList<ShortcutTool> shortcutList;
+
+    public ShortcutManager() {
+        shortcutList = new ArrayList<ShortcutTool>();
+        shortcutList.add(new MoveShortcut());
+    }
+
+    /*
+     Methodes 
+     */
+    public void terminate() {
+        currentShortcut = null;
+    }
+
+    public boolean isActive() {
+        return currentShortcut != null;
+    }
+
+    public void setShortCut(ShortcutTool shortcut) {
+        if (isActive()) {
+            currentShortcut.cancel();
+        }
+        currentShortcut = shortcut;
+    }
+
+    public ShortcutTool getActivableShortcut(KeyInputEvent kie) {
+        for (ShortcutTool s : shortcutList) {
+            if (s != currentShortcut) {
+                if (s.isActivableBy(kie)) {
+                    return s;
+                }
+            }
+        }
+        return null;
+    }
+
+    public ShortcutTool getActiveShortcut() {
+        return currentShortcut;
+    }
+
+    public boolean canActivateShortcut(KeyInputEvent kie) {
+        return getActivableShortcut(kie) != null;
+    }
+
+    public boolean activateShortcut(KeyInputEvent kie) {
+        currentShortcut = getActivableShortcut(kie);
+        return isActive();
+    }
+
+    public void doKeyPressed(KeyInputEvent kie) {
+        ///todo check commande key
+        if (isActive()) {
+            currentShortcut.keyPressed(kie);
+        }
+    }
+
+    /*
+     STATIC
+     */
+    public static boolean checkEnterHit(KeyInputEvent kie) {
+        if (kie.getKeyCode() == KeyInput.KEY_RETURN) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean checkEscHit(KeyInputEvent kie) {
+        if (kie.getKeyCode() == KeyInput.KEY_ESCAPE) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean checkCtrlHit(KeyInputEvent kie) {
+        if (kie.getKeyCode() == KeyInput.KEY_LCONTROL || kie.getKeyCode() == KeyInput.KEY_RCONTROL) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean checkShiftHit(KeyInputEvent kie) {
+        if (kie.getKeyCode() == KeyInput.KEY_LSHIFT || kie.getKeyCode() == KeyInput.KEY_RSHIFT) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean checkAltHit(KeyInputEvent kie) {
+        if (kie.getKeyCode() == KeyInput.KEY_LMENU || kie.getKeyCode() == KeyInput.KEY_RMENU) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean checkNumberKey(KeyInputEvent kie, StringBuilder numberBuilder) {
+        if (kie.getKeyCode() == KeyInput.KEY_MINUS) {
+            if (numberBuilder.length() > 0) {
+                if (numberBuilder.charAt(0) == '-') {
+                    numberBuilder.replace(0, 1, "");
+                } else {
+                    numberBuilder.insert(0, '-');
+                }
+            } else {
+                numberBuilder.append('-');
+            }
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_0 || kie.getKeyCode() == KeyInput.KEY_NUMPAD0) {
+            numberBuilder.append('0');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_1 || kie.getKeyCode() == KeyInput.KEY_NUMPAD1) {
+            numberBuilder.append('1');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_2 || kie.getKeyCode() == KeyInput.KEY_NUMPAD2) {
+            numberBuilder.append('2');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_3 || kie.getKeyCode() == KeyInput.KEY_NUMPAD3) {
+            numberBuilder.append('3');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_4 || kie.getKeyCode() == KeyInput.KEY_NUMPAD4) {
+            numberBuilder.append('4');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_5 || kie.getKeyCode() == KeyInput.KEY_NUMPAD5) {
+            numberBuilder.append('5');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_6 || kie.getKeyCode() == KeyInput.KEY_NUMPAD6) {
+            numberBuilder.append('6');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_7 || kie.getKeyCode() == KeyInput.KEY_NUMPAD7) {
+            numberBuilder.append('7');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_8 || kie.getKeyCode() == KeyInput.KEY_NUMPAD8) {
+            numberBuilder.append('8');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_9 || kie.getKeyCode() == KeyInput.KEY_NUMPAD9) {
+            numberBuilder.append('9');
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_PERIOD) {
+            if (numberBuilder.indexOf(".") == -1) { // if it doesn't exist yet
+                if (numberBuilder.length() == 0
+                        || (numberBuilder.length() == 1 && numberBuilder.charAt(0) == '-')) {
+                    numberBuilder.append("0.");
+                } else {
+                    numberBuilder.append(".");
+                }
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+    public static float getNumberkey(StringBuilder numberBuilder) {
+        if (numberBuilder.length() == 0) {
+            return 0;
+        } else {
+            return new Float(numberBuilder.toString());
+        }
+    }
+
+    public static boolean checkAxisKey(KeyInputEvent kie, Vector3f axisStore) {
+        if (kie.getKeyCode() == KeyInput.KEY_X) {
+            axisStore = Vector3f.UNIT_X;
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_Y) {
+            axisStore = Vector3f.UNIT_Y;
+            return true;
+        } else if (kie.getKeyCode() == KeyInput.KEY_Z) {
+            axisStore = Vector3f.UNIT_Z;
+            return true;
+        }
+        return false;
+    }
+
+}

+ 29 - 0
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ShortcutTool.java

@@ -0,0 +1,29 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.scenecomposer.tools.shortcuts;
+
+import com.jme3.gde.scenecomposer.SceneEditTool;
+import com.jme3.input.event.KeyInputEvent;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author dokthar
+ */
+public abstract class ShortcutTool extends SceneEditTool {
+
+    public abstract boolean isActivableBy(KeyInputEvent kie);
+
+    public abstract void cancel();
+
+    protected final void terminate() {
+        Lookup.getDefault().lookup(ShortcutManager.class).terminate();
+    }
+
+    @Override
+    public abstract void keyPressed(KeyInputEvent kie);
+   
+}