fix multiple clicks and reduce double click timeout

This commit is contained in:
nightwing 2012-05-25 21:23:28 +04:00
commit fead610584
2 changed files with 33 additions and 26 deletions

View file

@ -184,32 +184,41 @@ exports.addMouseWheelListener = function(el, callback) {
exports.addListener(el, "mousewheel", listener); exports.addListener(el, "mousewheel", listener);
}; };
exports.addMultiMouseDownListener = function(el, button, count, timeout, callback) { exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {
var clicks = 0; var clicks = 0;
var startX, startY; var startX, startY, timer;
var eventNames = {
2: "dblclick",
3: "tripleclick",
4: "quadclick"
};
var listener = function(e) { var listener = function(e) {
clicks += 1; if (exports.getButton(e) != 0) {
clicks = 0;
} else {
var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;
if (!timer || isNewClick)
clicks = 0;
clicks += 1;
if (timer)
clearTimeout(timer)
timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);
}
if (clicks == 1) { if (clicks == 1) {
startX = e.clientX; startX = e.clientX;
startY = e.clientY; startY = e.clientY;
setTimeout(function() {
clicks = 0;
}, timeout || 600);
} }
var isButton = exports.getButton(e) == button; eventHandler[callbackName]("mousedown", e);
if (!isButton || Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5)
clicks = 0;
if (clicks == count) { if (clicks > 4)
clicks = 0; clicks = 0;
callback(e); else if (clicks > 1)
} return eventHandler[callbackName](eventNames[clicks], e);
if (isButton)
return exports.preventDefault(e);
}; };
exports.addListener(el, "mousedown", listener); exports.addListener(el, "mousedown", listener);

View file

@ -57,12 +57,9 @@ var MouseHandler = function(editor) {
}); });
var mouseTarget = editor.renderer.getMouseEventTarget(); var mouseTarget = editor.renderer.getMouseEventTarget();
event.addListener(mouseTarget, "mousedown", this.onMouseEvent.bind(this, "mousedown"));
event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click")); event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"));
event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove")); event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"));
event.addMultiMouseDownListener(mouseTarget, 0, 2, 500, this.onMouseEvent.bind(this, "dblclick")); event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, "onMouseEvent");
event.addMultiMouseDownListener(mouseTarget, 0, 3, 600, this.onMouseEvent.bind(this, "tripleclick"));
event.addMultiMouseDownListener(mouseTarget, 0, 4, 600, this.onMouseEvent.bind(this, "quadclick"));
event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel")); event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"));
var gutterEl = editor.renderer.$gutter; var gutterEl = editor.renderer.$gutter;
@ -126,8 +123,9 @@ var MouseHandler = function(editor) {
this.y = ev.y; this.y = ev.y;
// do not move textarea during selection // do not move textarea during selection
var kt = this.editor.renderer.$keepTextAreaAtCursor; var renderer = this.editor.renderer;
this.editor.renderer.$keepTextAreaAtCursor = false; if (renderer.$keepTextAreaAtCursor)
renderer.$keepTextAreaAtCursor = null;
var self = this; var self = this;
var onMouseSelection = function(e) { var onMouseSelection = function(e) {
@ -139,8 +137,10 @@ var MouseHandler = function(editor) {
clearInterval(timerId); clearInterval(timerId);
self[self.state + "End"] && self[self.state + "End"](e); self[self.state + "End"] && self[self.state + "End"](e);
self.$clickSelection = null; self.$clickSelection = null;
self.editor.renderer.$keepTextAreaAtCursor = kt; if (renderer.$keepTextAreaAtCursor == null) {
self.editor.renderer.$moveTextAreaToCursor(); renderer.$keepTextAreaAtCursor = true;
renderer.$moveTextAreaToCursor();
}
}; };
var onSelectionInterval = function() { var onSelectionInterval = function() {
@ -149,8 +149,6 @@ var MouseHandler = function(editor) {
event.capture(this.editor.container, onMouseSelection, onMouseSelectionEnd); event.capture(this.editor.container, onMouseSelection, onMouseSelectionEnd);
var timerId = setInterval(onSelectionInterval, 20); var timerId = setInterval(onSelectionInterval, 20);
ev.preventDefault();
}; };
}).call(MouseHandler.prototype); }).call(MouseHandler.prototype);