Browse Source

Added [untested] code to combine kayboard and mouse events, to allow for keyboard+mouse event combos.

dev-tmpl
Bryan Miller 5 years ago
parent
commit
842d93207f
1 changed files with 133 additions and 42 deletions
  1. +133
    -42
      app/js/ui/Input.js

+ 133
- 42
app/js/ui/Input.js View File

145:"scrolllock", 145:"scrolllock",
}; };



var KEYBYNAME = (function(){ var KEYBYNAME = (function(){
var keys = Object.keys(KEYBYCODE); var keys = Object.keys(KEYBYCODE);
var o = {}; var o = {};
return (code in Object.keys(KEYBYCODE)) ? KEYBYCODE[code] : "" + code; return (code in Object.keys(KEYBYCODE)) ? KEYBYCODE[code] : "" + code;
} }


function CodesToEventName(codes){
function CodesToEventName(codes, mouse){
var ename = ""; var ename = "";
mouse = (mouse === true);
for (var i=0; i < codes.length; i++){ for (var i=0; i < codes.length; i++){
ename += ((ename !== "") ? "+" : "") + CodeToKeyName(codes[i]);
if (mouse){
switch(codes[i]){
case 0:
ename += ((ename !== "") ? "+" : "") + "mouseleft";
break;
case 1:
ename += ((ename !== "") ? "+" : "") + "mouseright";
break;
case 2:
ename += ((ename !== "") ? "+" : "") + "mousemiddle";
break;
case 8000:
ename += ((ename !== "") ? "+" : "") + "mousemove";
break;
default:
ename += ((ename !== "") ? "+" : "") + "mousebtn" + codes[i].toString();
}
} else {
ename += ((ename !== "") ? "+" : "") + CodeToKeyName(codes[i]);
}
} }
return ename; return ename;
} }




function ReorderEventName(ename){ function ReorderEventName(ename){
// This function takes a keyboard event name and reorders it into key-code order.
// This function takes a keyboard and mouse event name and reorders it into key-code order.
// This way users can write the event any way they want, but should still result in proper // This way users can write the event any way they want, but should still result in proper
// event being called. // event being called.
var elist = ename.split("+"); var elist = ename.split("+");
// TODO: Need to test for duplicate event names for both keyboard and mouse event names.
var ecodes = []; var ecodes = [];
var mcodes = [];
for (var i=0; i < elist.length; i++){ for (var i=0; i < elist.length; i++){
var key = elist[i].trim().toLowerCase(); var key = elist[i].trim().toLowerCase();

// Check for mouse events first. These are hardcoded for now.
if (key === "mouseleft"){
mcodes.push(0);
} else if (key === "mouseright"){
mcodes.push(1);
} else if (key === "mousemiddle"){
mcodes.push(2);
} else if (key.startsWith("mousebtn")){
var sub = key.substring(8);
if (!Number.isNaN(sub)){
mcodes.push(parseInt(sub));
} else {
return ""; // This event name does not include valid mouse button code.
}
} else if (key === "mousemove"){
mcodes.push(8000);
}

// Now handle keyboard event names.
if (!(key in Object.keys(KEYBYNAME))){ if (!(key in Object.keys(KEYBYNAME))){
if (!Number.isNaN(key)) if (!Number.isNaN(key))
ecodes.push(parseInt(key)); ecodes.push(parseInt(key));
} }
if (ecodes.length > 0){ if (ecodes.length > 0){
ecodes.sort(function(a, b){return a-b;}); ecodes.sort(function(a, b){return a-b;});
return CodesToEventName(ecodes);
mcodes.sort(function(a, b){return a-b;});
return CodesToEventName(ecodes) + CodesToEventName(mcodes);
} }
return ""; return "";
} }
this.__keyboardEnabled = false; this.__keyboardEnabled = false;
this.__mouseEnabled = false; this.__mouseEnabled = false;



var buttonID = (function(e){
var btn = e.button;
if ((this.__ieMouseMode && btn === 1) || (!this.__ieMouseMode && btn === 0)){
btn = 0;
} else if ((this.__ieMouseMode && e.button === 4) || (!this.__ieMouseMode && e.button === 1)){
btn = 1;
}
return btn;
}).bind(this);

var addMouseButton = (function(btn){
if (this.__mouseButtons.findIndex(b=>b[0]===btn) < 0){
this.__mouseButtons.push([btn, Math.floor(Date.now())]);
return true;
}
return false;
}).bind(this);

var removeMouseButton = (function(btn){
var idx = this.__mouseButtons.findIndex(b=>b[0]===btn);
var diff = -1;
if (idx >= 0){
diff = Math.floor(Date.now()) - this.__mouseButtons[idx][1];
this.__mouseButtons.splice(idx, 1);
}
return diff;
}).bind(this);

// ---------------------------------------------------------------------
// Handling keyboard events.

this.enableKeyboardInput = (function(){ this.enableKeyboardInput = (function(){
var handle_keydown = (function(e){ var handle_keydown = (function(e){
if (AddToKeymap(e.keyCode, "keydown")){ if (AddToKeymap(e.keyCode, "keydown")){
}).bind(this); }).bind(this);
}).apply(this); }).apply(this);



// ---------------------------------------------------------------------------------------
// Handling mouse events.

var MouseButtonsEventName = (function(){
var e = "";
for (var i=0; i < this.__mouseButtons.length; i++){
e += (e !== "") ? "+" : "";
switch (this.__mouseButtons[i]){
case 0:
e += "mouseleft";
break;
case 1:
e += "mouseright";
break;
case 2:
e += "mousemiddle";
break;
default:
e += "mousebtn" + this.__mouseButtons[i].toString();
}
}
return e;
}).bind(this);


// This function will only return an event name if keyboard
var MouseEventName = (function(addon){
var ename = KeymapEventName();
var mname = MouseButtonsEventName();
if (mname !== "")
ename += ((ename !== "") ? "+" : "") + mname;
if (typeof(addon) === "string")
ename += ((ename !== "") ? "+" : "") + addon;
return ename;
}).bind(this);

this.enableMouseInput = (function(){ this.enableMouseInput = (function(){
var mousePosition = (function(e){ var mousePosition = (function(e){
var pos = { var pos = {
pos.x = Math.floor(pos.x); pos.x = Math.floor(pos.x);
pos.y = Math.floor(pos.y); pos.y = Math.floor(pos.y);
return pos; return pos;
}).bind(this);

var buttonID = (function(e){
var btn = e.button;
if ((this.__ieMouseMode && btn === 1) || (!this.__ieMouseMode && btn === 0)){
btn = 0;
} else if ((this.__ieMouseMode && e.button === 4) || (!this.__ieMouseMode && e.button === 1)){
btn = 1;
}
return btn;
}).bind(this);

var addMouseButton = (function(btn){
if (this.__mouseButtons.findIndex(b=>b[0]===btn) < 0){
this.__mouseButtons.push([btn, Math.floor(Date.now())]);
return true;
}
return false;
}).bind(this);

var removeMouseButton = (function(btn){
var idx = this.__mouseButtons.findIndex(b=>b[0]===btn);
var diff = -1;
if (idx >= 0){
diff = Math.floor(Date.now()) - this.__mouseButtons[idx][1];
this.__mouseButtons.splice(idx, 1);
}
return diff;
}).bind(this);
}).bind(this);


var handle_mousemove = (function(e){ var handle_mousemove = (function(e){
var pos = mousePosition(e); var pos = mousePosition(e);
if (e.stopPropagation) if (e.stopPropagation)
e.stopPropagation(); e.stopPropagation();
e.cancelBubble = true; e.cancelBubble = true;
}
}
this.__mousePosition = pos; this.__mousePosition = pos;
this.__mouseLastAction = "mousemove"; this.__mouseLastAction = "mousemove";
this.__emitter.emit("mousemove", {
var ename = MouseEventName();
var data = {
source: this, source: this,
lastX: pos.lastX, lastX: pos.lastX,
lastY: pos.lastY, lastY: pos.lastY,
y: pos.y, y: pos.y,
button: this.__mouseLastButton, button: this.__mouseLastButton,
action: "mousemove" action: "mousemove"
});
};
if (ename !== "" && ename !== "mousemove")
this.__emitter.emit(ename, data);
this.__emitter.emit("mousemove", data);
} }
return false; return false;
}).bind(this); }).bind(this);
e.cancelBubble = true; e.cancelBubble = true;
} }
if (addMouseButton(button)){ if (addMouseButton(button)){
this.__mousePosition = pos;
this.__mouseLastButton = button;
this.__mouseLastAction = "mousedown";
this.__emitter.emit("mousedown", {
var ename = MouseEventName();
var data = {
source: this, source: this,
lastX: pos.lastX, lastX: pos.lastX,
lastY: pos.lastY, lastY: pos.lastY,
y: pos.y, y: pos.y,
button: button, button: button,
action: "mousedown" action: "mousedown"
});
};
this.__mousePosition = pos;
this.__mouseLastButton = button;
this.__mouseLastAction = "mousedown";
if (ename !== "")
this.__emitter.emit(ename, data);
this.__emitter.emit("mousedown", data);
} }
} }
return false; return false;

Loading…
Cancel
Save