|
@@ -54,9 +54,8 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
|
|
|
|
|
private final ArrayList<InputEvent> inputQueue = new ArrayList<InputEvent>();
|
|
private final ArrayList<InputEvent> inputQueue = new ArrayList<InputEvent>();
|
|
|
private InputManager inputManager;
|
|
private InputManager inputManager;
|
|
|
- private boolean isDragging = false, niftyOwnsDragging = false;
|
|
|
|
|
- private boolean pressed = false;
|
|
|
|
|
- private int buttonIndex;
|
|
|
|
|
|
|
+ private boolean[] niftyOwnsDragging = new boolean[3];
|
|
|
|
|
+ private int inputPointerId = -1;
|
|
|
private int x, y;
|
|
private int x, y;
|
|
|
private int height;
|
|
private int height;
|
|
|
private boolean shiftDown = false;
|
|
private boolean shiftDown = false;
|
|
@@ -70,9 +69,30 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
public void setResourceLoader(NiftyResourceLoader niftyResourceLoader) {
|
|
public void setResourceLoader(NiftyResourceLoader niftyResourceLoader) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Must be set in order for nifty events to be forwarded correctly.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param nifty
|
|
|
|
|
+ */
|
|
|
public void setNifty(Nifty nifty) {
|
|
public void setNifty(Nifty nifty) {
|
|
|
this.nifty = nifty;
|
|
this.nifty = nifty;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Reset internal state of the input system.
|
|
|
|
|
+ * Must be called when the display is reinitialized
|
|
|
|
|
+ * or when the internal state becomes invalid.
|
|
|
|
|
+ */
|
|
|
|
|
+ public void reset() {
|
|
|
|
|
+ x = 0;
|
|
|
|
|
+ y = 0;
|
|
|
|
|
+ inputPointerId = -1;
|
|
|
|
|
+ for (int i = 0; i < niftyOwnsDragging.length; i++) {
|
|
|
|
|
+ niftyOwnsDragging[i] = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ shiftDown = false;
|
|
|
|
|
+ ctrlDown = false;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @param height The height of the viewport. Used to convert
|
|
* @param height The height of the viewport. Used to convert
|
|
@@ -83,6 +103,7 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void setMousePosition(int x, int y) {
|
|
public void setMousePosition(int x, int y) {
|
|
|
|
|
+ // TODO: When does nifty use this?
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void beginInput() {
|
|
public void beginInput() {
|
|
@@ -92,48 +113,78 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
boolean result = nifty.update();
|
|
boolean result = nifty.update();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void handleMouseEvent(int button, boolean value, NiftyInputConsumer nic, InputEvent evt) {
|
|
|
|
|
+ if (value) {
|
|
|
|
|
+ // If nifty consumed the mouse down event, then
|
|
|
|
|
+ // it now owns the next mouse up event which
|
|
|
|
|
+ // won't be forwarded to jME3.
|
|
|
|
|
+
|
|
|
|
|
+ // processMouseEvent doesn't return true even if cursor is above
|
|
|
|
|
+ // a nifty element (bug).
|
|
|
|
|
+ boolean consumed = nic.processMouseEvent(x, y, 0, button, true)
|
|
|
|
|
+ | nifty.getCurrentScreen().isMouseOverElement();
|
|
|
|
|
+ niftyOwnsDragging[button] = consumed;
|
|
|
|
|
+ if (consumed) {
|
|
|
|
|
+ evt.setConsumed();
|
|
|
|
|
+ }
|
|
|
|
|
+ //System.out.format("niftyMouse(%d, %d, %d, true) = %b\n", x, y, button, consumed);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // Forward the event if nifty owns it or if the cursor is visible.
|
|
|
|
|
+ if (niftyOwnsDragging[button] || inputManager.isCursorVisible()){
|
|
|
|
|
+ boolean consumed = nic.processMouseEvent(x, y, 0, button, false);
|
|
|
|
|
+ // TODO: nifty must always consume up event when it consumes down event!
|
|
|
|
|
+ // Otherwise jME3 will see a mouse up event
|
|
|
|
|
+ // without a mouse down event!
|
|
|
|
|
+ if (consumed) {
|
|
|
|
|
+ evt.setConsumed();
|
|
|
|
|
+ processSoftKeyboard();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ niftyOwnsDragging[button] = false;
|
|
|
|
|
+ //System.out.format("niftyMouse(%d, %d, %d, false) = %b\n", x, y, button, consumed);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private void onTouchEventQueued(TouchEvent evt, NiftyInputConsumer nic) {
|
|
private void onTouchEventQueued(TouchEvent evt, NiftyInputConsumer nic) {
|
|
|
- boolean consumed = false;
|
|
|
|
|
|
|
+ if (inputManager.getSimulateMouse()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
x = (int) evt.getX();
|
|
x = (int) evt.getX();
|
|
|
y = (int) (height - evt.getY());
|
|
y = (int) (height - evt.getY());
|
|
|
-
|
|
|
|
|
- if (!inputManager.getSimulateMouse()) {
|
|
|
|
|
- switch (evt.getType()) {
|
|
|
|
|
- case DOWN:
|
|
|
|
|
- consumed = nic.processMouseEvent(x, y, 0, 0, true);
|
|
|
|
|
- isDragging = true;
|
|
|
|
|
- niftyOwnsDragging = consumed;
|
|
|
|
|
- if (consumed) {
|
|
|
|
|
- evt.setConsumed();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Input manager will not convert touch events to mouse events,
|
|
|
|
|
+ // thus we must do it ourselves..
|
|
|
|
|
+ switch (evt.getType()) {
|
|
|
|
|
+ case DOWN:
|
|
|
|
|
+ if (inputPointerId != -1) {
|
|
|
|
|
+ // Another touch was done by the user
|
|
|
|
|
+ // while the other interacts with nifty, ignore.
|
|
|
break;
|
|
break;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- case UP:
|
|
|
|
|
- if (niftyOwnsDragging) {
|
|
|
|
|
- consumed = nic.processMouseEvent(x, y, 0, 0, false);
|
|
|
|
|
- if (consumed) {
|
|
|
|
|
- evt.setConsumed();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- isDragging = false;
|
|
|
|
|
- niftyOwnsDragging = false;
|
|
|
|
|
-
|
|
|
|
|
- if (consumed) {
|
|
|
|
|
- processSoftKeyboard();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ inputPointerId = evt.getPointerId();
|
|
|
|
|
+ handleMouseEvent(0, true, nic, evt);
|
|
|
|
|
|
|
|
|
|
+ break;
|
|
|
|
|
+ case UP:
|
|
|
|
|
+ if (inputPointerId != evt.getPointerId()) {
|
|
|
|
|
+ // Another touch was done by the user
|
|
|
|
|
+ // while the other interacts with nifty, ignore.
|
|
|
break;
|
|
break;
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ inputPointerId = -1;
|
|
|
|
|
+ handleMouseEvent(0, false, nic, evt);
|
|
|
|
|
+
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void onMouseMotionEventQueued(MouseMotionEvent evt, NiftyInputConsumer nic) {
|
|
private void onMouseMotionEventQueued(MouseMotionEvent evt, NiftyInputConsumer nic) {
|
|
|
x = evt.getX();
|
|
x = evt.getX();
|
|
|
y = height - evt.getY();
|
|
y = height - evt.getY();
|
|
|
- nic.processMouseEvent(x, y, evt.getDeltaWheel(), buttonIndex, pressed);
|
|
|
|
|
|
|
+ nic.processMouseEvent(x, y, evt.getDeltaWheel(), -1, false);
|
|
|
// if (nic.processMouseEvent(niftyEvt) /*|| nifty.getCurrentScreen().isMouseOverElement()*/){
|
|
// if (nic.processMouseEvent(niftyEvt) /*|| nifty.getCurrentScreen().isMouseOverElement()*/){
|
|
|
// Do not consume motion events
|
|
// Do not consume motion events
|
|
|
//evt.setConsumed();
|
|
//evt.setConsumed();
|
|
@@ -141,38 +192,9 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void onMouseButtonEventQueued(MouseButtonEvent evt, NiftyInputConsumer nic) {
|
|
private void onMouseButtonEventQueued(MouseButtonEvent evt, NiftyInputConsumer nic) {
|
|
|
- boolean wasPressed = pressed;
|
|
|
|
|
- boolean forwardToNifty = true;
|
|
|
|
|
-
|
|
|
|
|
- buttonIndex = evt.getButtonIndex();
|
|
|
|
|
- pressed = evt.isPressed();
|
|
|
|
|
-
|
|
|
|
|
- // Mouse button raised. End dragging
|
|
|
|
|
- if (wasPressed && !pressed) {
|
|
|
|
|
- if (!niftyOwnsDragging) {
|
|
|
|
|
- forwardToNifty = true;
|
|
|
|
|
- }
|
|
|
|
|
- isDragging = false;
|
|
|
|
|
- niftyOwnsDragging = false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- boolean consumed = false;
|
|
|
|
|
- if (forwardToNifty) {
|
|
|
|
|
- consumed = nic.processMouseEvent(x, y, 0, buttonIndex, pressed);
|
|
|
|
|
- if (consumed) {
|
|
|
|
|
- evt.setConsumed();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // Mouse button pressed. Begin dragging
|
|
|
|
|
- if (!wasPressed && pressed) {
|
|
|
|
|
- isDragging = true;
|
|
|
|
|
- niftyOwnsDragging = consumed;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (consumed && pressed) {
|
|
|
|
|
- processSoftKeyboard();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ x = (int) evt.getX();
|
|
|
|
|
+ y = (int) (height - evt.getY());
|
|
|
|
|
+ handleMouseEvent(evt.getButtonIndex(), evt.isPressed(), nic, evt);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void onKeyEventQueued(KeyInputEvent evt, NiftyInputConsumer nic) {
|
|
private void onKeyEventQueued(KeyInputEvent evt, NiftyInputConsumer nic) {
|
|
@@ -205,8 +227,12 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void onMouseButtonEvent(MouseButtonEvent evt) {
|
|
public void onMouseButtonEvent(MouseButtonEvent evt) {
|
|
|
- if (inputManager.isCursorVisible() && evt.getButtonIndex() >= 0 && evt.getButtonIndex() <= 2) {
|
|
|
|
|
- inputQueue.add(evt);
|
|
|
|
|
|
|
+ if (evt.getButtonIndex() >= 0 && evt.getButtonIndex() <= 2) {
|
|
|
|
|
+ if (evt.isReleased() || inputManager.isCursorVisible()) {
|
|
|
|
|
+ // Always pass mouse button release events to nifty,
|
|
|
|
|
+ // even if the mouse cursor is invisible.
|
|
|
|
|
+ inputQueue.add(evt);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -249,7 +275,6 @@ public class InputSystemJme implements InputSystem, RawInputListener {
|
|
|
private void processSoftKeyboard() {
|
|
private void processSoftKeyboard() {
|
|
|
SoftTextDialogInput softTextDialogInput = JmeSystem.getSoftTextDialogInput();
|
|
SoftTextDialogInput softTextDialogInput = JmeSystem.getSoftTextDialogInput();
|
|
|
if (softTextDialogInput != null) {
|
|
if (softTextDialogInput != null) {
|
|
|
-
|
|
|
|
|
Element element = nifty.getCurrentScreen().getFocusHandler().getKeyboardFocusElement();
|
|
Element element = nifty.getCurrentScreen().getFocusHandler().getKeyboardFocusElement();
|
|
|
if (element != null) {
|
|
if (element != null) {
|
|
|
final TextField textField = element.getNiftyControl(TextField.class);
|
|
final TextField textField = element.getNiftyControl(TextField.class);
|