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
experimental
Maselbas 10 years ago
parent 82f031cdff
commit f6b7c3819a
  1. 44
      sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java
  2. 137
      sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/MoveShortcut.java
  3. 197
      sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ShortcutManager.java
  4. 29
      sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ShortcutTool.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.JmeSpatial;
import com.jme3.gde.scenecomposer.tools.PickManager;
import com.jme3.gde.scenecomposer.tools.shortcuts.ShortcutManager;
import com.jme3.input.event.KeyInputEvent;
import com.jme3.light.Light;
import com.jme3.light.PointLight;
@ -31,6 +32,7 @@ import com.jme3.scene.control.Control;
import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture;
import java.util.concurrent.Callable;
import org.openide.util.Lookup;
/**
*
@ -184,7 +186,11 @@ public class SceneComposerToolController extends SceneToolController {
* @param 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.actionPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
}
@ -198,38 +204,64 @@ public class SceneComposerToolController extends SceneToolController {
* @param 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.actionSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
}
}
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.mouseMoved(mouseLoc, rootNode, editorController.getCurrentDataObject(), selectedSpatial);
}
}
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.draggedPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
}
}
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.draggedSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject());
}
}
void doKeyPressed(KeyInputEvent 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);
}
}
}
}
/**
* Adds a marker for the light to the scene if it does not exist yet

@ -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();
}
}
}

@ -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;
}
}

@ -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);
}
Loading…
Cancel
Save