Parcourir la source

remove conditional isTouch behavior

Adam Shaw il y a 9 ans
Parent
commit
72b76b624e
4 fichiers modifiés avec 43 ajouts et 38 suppressions
  1. 0 5
      src/Calendar.js
  2. 37 22
      src/common/Grid.events.js
  3. 6 8
      src/common/Grid.js
  4. 0 3
      src/main.js

+ 0 - 5
src/Calendar.js

@@ -9,7 +9,6 @@ var Calendar = FC.Calendar = Class.extend({
 	view: null, // current View object
 	header: null,
 	loadingLevel: 0, // number of simultaneous loading tasks
-	isTouch: false,
 
 
 	// a lot of this class' OOP logic is scoped within this constructor function,
@@ -56,10 +55,6 @@ var Calendar = FC.Calendar = Class.extend({
 		]);
 		populateInstanceComputableOptions(this.options);
 
-		this.isTouch = this.options.isTouch != null ?
-			this.options.isTouch :
-			FC.isTouch;
-
 		this.viewSpecCache = {}; // somewhat unrelated
 	},
 

+ 37 - 22
src/common/Grid.events.js

@@ -175,15 +175,10 @@ Grid.mixin({
 
 	// Attaches event-element-related handlers to the container element and leverage bubbling
 	bindSegHandlers: function() {
-		if (this.view.calendar.isTouch) {
-			this.bindSegHandler('touchstart', this.handleSegTouchStart);
-		}
-		else {
-			this.bindSegHandler('mouseenter', this.handleSegMouseover);
-			this.bindSegHandler('mouseleave', this.handleSegMouseout);
-			this.bindSegHandler('mousedown', this.handleSegMousedown);
-		}
-
+		this.bindSegHandler('touchstart', this.handleSegTouchStart);
+		this.bindSegHandler('mouseenter', this.handleSegMouseover);
+		this.bindSegHandler('mouseleave', this.handleSegMouseout);
+		this.bindSegHandler('mousedown', this.handleSegMousedown);
 		this.bindSegHandler('click', this.handleSegClick);
 	},
 
@@ -246,21 +241,12 @@ Grid.mixin({
 		}
 
 		if (!isResizing && (isDraggable || isResizable)) { // allowed to be selected?
-			this.clearDragListeners();
 
 			dragListener = isDraggable ?
 				this.buildSegDragListener(seg) :
-				new DragListener(); // seg isn't draggable, but let's use a generic DragListener
-				                    // simply for the delay, so it can be selected.
-
-			dragListener._dragStart = function() { // TODO: better way of binding
-				// if not previously selected, will fire after a delay. then, select the event
-				if (!isSelected) {
-					view.selectEvent(event);
-				}
-			};
+				this.buildSegSelectListener(seg); // seg isn't draggable, but still needs to be selected
 
-			dragListener.startInteraction(ev, {
+			dragListener.startInteraction(ev, { // won't start if already started
 				delay: isSelected ? 0 : this.view.opt('longPressDelay') // do delay if not already selected
 			});
 		}
@@ -271,7 +257,6 @@ Grid.mixin({
 		var isResizing = this.startSegResize(seg, ev, { distance: 5 });
 
 		if (!isResizing && this.view.isEventDraggable(seg.event)) {
-			this.clearDragListeners();
 			this.buildSegDragListener(seg)
 				.startInteraction(ev, {
 					distance: 5
@@ -285,7 +270,6 @@ Grid.mixin({
 	// `dragOptions` are optional.
 	startSegResize: function(seg, ev, dragOptions) {
 		if ($(ev.target).is('.fc-resizer')) {
-			this.clearDragListeners();
 			this.buildSegResizeListener(seg, $(ev.target).is('.fc-start-resizer'))
 				.startInteraction(ev, dragOptions);
 			return true;
@@ -311,6 +295,10 @@ Grid.mixin({
 		var mouseFollower; // A clone of the original element that will move with the mouse
 		var dropLocation; // zoned event date properties
 
+		if (this.segDragListener) {
+			return this.segDragListener;
+		}
+
 		// Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents
 		// of the view.
 		var dragListener = this.segDragListener = new HitDragListener(view, {
@@ -330,6 +318,10 @@ Grid.mixin({
 				mouseFollower.start(ev);
 			},
 			dragStart: function(ev) {
+				if (dragListener.isTouch && !view.isEventSelected(event)) {
+					// if not previously selected, will fire after a delay. then, select the event
+					view.selectEvent(event);
+				}
 				isDragging = true;
 				_this.handleSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported
 				_this.segDragStart(seg, ev);
@@ -401,6 +393,29 @@ Grid.mixin({
 	},
 
 
+	// seg isn't draggable, but let's use a generic DragListener
+	// simply for the delay, so it can be selected.
+	buildSegSelectListener: function(seg) {
+		var _this = this;
+		var view = this.view;
+		var event = seg.event;
+
+		var dragListener = this.segDragListener = new DragListener({
+			dragStart: function(ev) {
+				if (!view.isEventSelected(event)) {
+					// if not previously selected, will fire after a delay. then, select the event
+					view.selectEvent(event);
+				}
+			},
+			interactionEnd: function(ev) {
+				_this.segDragListener = null;
+			}
+		});
+
+		return dragListener;
+	},
+
+
 	// Called before event segment dragging starts
 	segDragStart: function(seg, ev) {
 		this.isDraggingSeg = true;

+ 6 - 8
src/common/Grid.js

@@ -170,12 +170,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 		this.el = el;
 		preventSelection(el);
 
-		if (this.view.calendar.isTouch) {
-			this.bindDayHandler('touchstart', this.dayTouchStart);
-		}
-		else {
-			this.bindDayHandler('mousedown', this.dayMousedown);
-		}
+		this.bindDayHandler('touchstart', this.dayTouchStart);
+		this.bindDayHandler('mousedown', this.dayMousedown);
 
 		// attach event-element-related handlers. in Grid.events
 		// same garbage collection note as above.
@@ -253,7 +249,6 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 
 	// Process a mousedown on an element that represents a day. For day clicking and selecting.
 	dayMousedown: function(ev) {
-		this.clearDragListeners();
 		this.buildDayDragListener().startInteraction(ev, {
 			//distance: 5, // needs more work if we want dayClick to fire correctly
 		});
@@ -261,7 +256,6 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 
 
 	dayTouchStart: function(ev) {
-		this.clearDragListeners();
 		this.buildDayDragListener().startInteraction(ev, {
 			delay: this.view.opt('longPressDelay')
 		});
@@ -277,6 +271,10 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
 		var dayClickHit; // null if invalid dayClick
 		var selectionSpan; // null if invalid selection
 
+		if (this.dayDragListener) {
+			return this.dayDragListener;
+		}
+
 		// this listener tracks a mousedown on a day element, and a subsequent drag.
 		// if the drag ends on the same day, it is a 'dayClick'.
 		// if 'selectable' is enabled, this listener also detects selections.

+ 0 - 3
src/main.js

@@ -6,9 +6,6 @@ var FC = $.fullCalendar = {
 var fcViews = FC.views = {};
 
 
-FC.isTouch = 'ontouchstart' in document;
-
-
 $.fn.fullCalendar = function(options) {
 	var args = Array.prototype.slice.call(arguments, 1); // for a possible method call
 	var res = this; // what this function will return (this jQuery object by default)