Explorar o código

external dragging, listen to jqui sortable

Adam Shaw %!s(int64=11) %!d(string=hai) anos
pai
achega
3a09cdb125
Modificáronse 2 ficheiros con 17 adicións e 9 borrados
  1. 13 5
      src/common/Grid.events.js
  2. 4 4
      src/common/Grid.js

+ 13 - 5
src/common/Grid.events.js

@@ -7,6 +7,7 @@ Grid.mixin({
 	mousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing
 	isDraggingSeg: false, // is a segment being dragged? boolean
 	isResizingSeg: false, // is a segment being resized? boolean
+	isDraggingExternal: false, // jqui-dragging an external element? boolean
 	segs: null, // the event segments currently rendered in the grid
 
 
@@ -414,27 +415,28 @@ Grid.mixin({
 
 
 	// Called when a jQuery UI drag is initiated anywhere in the DOM
-	documentDragStart: function(ev, ui) {
+	externalDragStart: function(ev, ui) {
 		var view = this.view;
 		var el;
 		var accept;
 
 		if (view.opt('droppable')) { // only listen if this setting is on
-			el = $(ev.target);
+			el = $((ui ? ui.item : null) || ev.target);
 
 			// Test that the dragged element passes the dropAccept selector or filter function.
 			// FYI, the default is "*" (matches all)
 			accept = view.opt('dropAccept');
 			if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {
-
-				this.startExternalDrag(el, ev, ui);
+				if (!this.isDraggingExternal) { // prevent double-listening if fired twice
+					this.listenToExternalDrag(el, ev, ui);
+				}
 			}
 		}
 	},
 
 
 	// Called when a jQuery UI drag starts and it needs to be monitored for cell dropping
-	startExternalDrag: function(el, ev, ui) {
+	listenToExternalDrag: function(el, ev, ui) {
 		var _this = this;
 		var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create
 		var dragListener;
@@ -442,6 +444,9 @@ Grid.mixin({
 
 		// listener that tracks mouse movement over date-associated pixel regions
 		dragListener = new CellDragListener(this.coordMap, {
+			listenStart: function() {
+				_this.isDraggingExternal = true;
+			},
 			cellOver: function(cell) {
 				dropLocation = _this.computeExternalDrop(cell, meta);
 				if (dropLocation) {
@@ -463,6 +468,9 @@ Grid.mixin({
 				if (dropLocation) { // element was dropped on a valid date/time cell
 					_this.view.reportExternalDrop(meta, dropLocation, el, ev, ui);
 				}
+			},
+			listenStop: function() {
+				_this.isDraggingExternal = false;
 			}
 		});
 

+ 4 - 4
src/common/Grid.js

@@ -16,7 +16,7 @@ var Grid = fc.Grid = RowRenderer.extend({
 	coordMap: null, // a GridCoordMap that converts pixel values to datetimes
 	elsByFill: null, // a hash of jQuery element sets used for rendering each fill. Keyed by fill name.
 
-	documentDragStartProxy: null, // binds the Grid's scope to documentDragStart (in DayGrid.events)
+	externalDragStartProxy: null, // binds the Grid's scope to externalDragStart (in DayGrid.events)
 
 	// derived from options
 	colHeadFormat: null, // TODO: move to another class. not applicable to all Grids
@@ -38,7 +38,7 @@ var Grid = fc.Grid = RowRenderer.extend({
 
 		this.coordMap = new GridCoordMap(this);
 		this.elsByFill = {};
-		this.documentDragStartProxy = proxy(this, 'documentDragStart');
+		this.externalDragStartProxy = proxy(this, 'externalDragStart');
 	},
 
 
@@ -324,13 +324,13 @@ var Grid = fc.Grid = RowRenderer.extend({
 
 	// Binds DOM handlers to elements that reside outside the grid, such as the document
 	bindGlobalHandlers: function() {
-		$(document).on('dragstart', this.documentDragStartProxy); // jqui drag
+		$(document).on('dragstart sortstart', this.externalDragStartProxy); // jqui
 	},
 
 
 	// Unbinds DOM handlers from elements that reside outside the grid
 	unbindGlobalHandlers: function() {
-		$(document).off('dragstart', this.documentDragStartProxy); // jqui drag
+		$(document).off('dragstart sortstart', this.externalDragStartProxy); // jqui
 	},