Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(3626)

Unified Diff: closure/goog/fx/draglistgroup.js

Issue 3102041: DragListGroup: support drag threshold before starting drag Base URL: http://closure-library.googlecode.com/svn/trunk/
Patch Set: Created 13 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: closure/goog/fx/draglistgroup.js
===================================================================
--- closure/goog/fx/draglistgroup.js (revision 450)
+++ closure/goog/fx/draglistgroup.js (working copy)
@@ -36,6 +36,7 @@
goog.require('goog.fx.Dragger.EventType');
goog.require('goog.math.Coordinate');
goog.require('goog.style');
+goog.require('goog.fx.AbstractDragDrop');
/**
@@ -372,15 +373,90 @@
this.dragItems_.push(dragItem);
this.eventHandler_.listen(
dragItemHandle, goog.events.EventType.MOUSEDOWN,
- this.handleDragStart_);
+ this.mouseDown_);
}
}
this.isInitialized_ = true;
};
+/**
+ * Adds mouse move, mouse out, and mouse up handlers.
+ *
+ * @private
+ */
+goog.fx.DragListGroup.prototype.maybeStartDrag_ = function(event, element) {
+ goog.events.listen(element, goog.events.EventType.MOUSEMOVE,
+ this.mouseMove_, false, this);
+ goog.events.listen(element, goog.events.EventType.MOUSEOUT,
+ this.mouseMove_, false, this);
+ goog.events.listen(element, goog.events.EventType.MOUSEUP,
+ this.mouseUp_, false, this);
+ this.currentDragElement_ = element;
+ this.startPosition_ = new goog.math.Coordinate(
+ event.clientX, event.clientY);
+ event.preventDefault();
+};
+
/**
+ * Event handler for mouse down.
+ *
+ * @param {goog.events.BrowserEvent} event Mouse down event.
+ * @private
+ */
+goog.fx.DragListGroup.prototype.mouseDown_ = function(event) {
+ // Get the draggable element for the target.
+ var element = /** @type {Element} */(event.currentTarget);
+ if (element) {
+ this.maybeStartDrag_(event, element);
+ }
+};
+
+/**
+ * Event handler for mouse up. Removes mouse move, mouse out and mouse up event
+ * handlers.
+ *
+ * @param {goog.events.BrowserEvent} event Mouse up event.
+ * @private
+ */
+goog.fx.DragListGroup.prototype.mouseUp_ = function(event) {
+ var currentDragElement = this.currentDragElement_;
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEMOVE,
+ this.mouseMove_, false, this);
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEOUT,
+ this.mouseMove_, false, this);
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEUP,
+ this.mouseUp_, false, this);
+ delete this.startPosition_;
+ this.currentDragElement_ = null;
+};
+
+/**
+ * Event handler for mouse move. Starts drag operation if moved more than the
+ * threshold value.
+ *
+ * @param {goog.events.BrowserEvent} event Mouse move or mouse out event.
+ * @private
+ */
+goog.fx.DragListGroup.prototype.mouseMove_ = function(event) {
+ var distance = Math.abs(event.clientX - this.startPosition_.x) +
+ Math.abs(event.clientY - this.startPosition_.y);
+
+ if (distance > goog.fx.AbstractDragDrop.initDragDistanceThreshold) {
+ var currentDragElement = this.currentDragElement_;
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEMOVE,
+ this.mouseMove_, false, this);
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEOUT,
+ this.mouseMove_, false, this);
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEUP,
+ this.mouseUp_, false, this);
+
+ this.handleDragStart_(event, currentDragElement);
+ }
+};
+
+/**
* Disposes of the DragListGroup.
*/
goog.fx.DragListGroup.prototype.disposeInternal = function() {
@@ -411,9 +487,9 @@
* @return {boolean} Whether the event was handled.
* @private
*/
-goog.fx.DragListGroup.prototype.handleDragStart_ = function(e) {
+goog.fx.DragListGroup.prototype.handleDragStart_ = function(e, dragElem) {
- var uid = goog.getUid(/** @type {Node} */ (e.currentTarget));
+ var uid = goog.getUid(/** @type {Node} */ (dragElem));
var currDragItem = /** @type {Element} */ (this.dragItemForHandle_[uid]);
var rv = this.dispatchEvent(
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b