From 26b530a0e7d0a14b49708565b00c7706600bb60c Mon Sep 17 00:00:00 2001
From: Mick McGrath
Date: Tue, 11 Aug 2015 12:40:56 -0500
Subject: [PATCH 1/2] Add tolerance functionality and demo page
---
event/drop/tolerance/tolerance.html | 125 +++++++++++++++++++++++++++
event/drop/tolerance/tolerance.js | 126 ++++++++++++++++++++++++++++
2 files changed, 251 insertions(+)
create mode 100644 event/drop/tolerance/tolerance.html
create mode 100644 event/drop/tolerance/tolerance.js
diff --git a/event/drop/tolerance/tolerance.html b/event/drop/tolerance/tolerance.html
new file mode 100644
index 00000000..418b4a0a
--- /dev/null
+++ b/event/drop/tolerance/tolerance.html
@@ -0,0 +1,125 @@
+
+
+
+ drop
+
+
+
+
+
Tolerance Demo - Pointer
+
Drag Me
+
Dropout/Dropover
+
+
+
+
+
Tolerance Demo - Touch
+
Drag Me
+
Dropout/Dropover
+
+
+
+
+
Tolerance Demo - Fit
+
Drag Me
+
Dropout/Dropover
+
+
+
+
+
Tolerance Demo - Intersect
+
Drag Me
+
Dropout/Dropover
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/event/drop/tolerance/tolerance.js b/event/drop/tolerance/tolerance.js
new file mode 100644
index 00000000..aa897a38
--- /dev/null
+++ b/event/drop/tolerance/tolerance.js
@@ -0,0 +1,126 @@
+/**
+ * @add jQuery.Drop.prototype
+ */
+
+steal('jquery', 'jquerypp/event/drop', function( $ ) {
+
+
+ var allowedTolerances = [
+ 'touch', 'pointer', 'fit', 'intersect'
+ ];
+
+
+ $.Drop.prototype
+ /**
+ * @plugin jquerypp/event/drop/tolerance
+ * @download http://jmvcsite.heroku.com/pluginify?plugins[]=jquerypp/event/event/drop/tolerance/tolerance.js
+ *
+ * @function jQuery.Drop.prototype.tolerance tolerance
+ * @parent jQuery.Drop.prototype
+ *
+ * @body
+ * `drop.tolerance(tolerance)` sets the tolerance.
+ *
+ * $("#todos-droparea").on("dropinit", function( ev, drop ) {
+ * drop.tolerance('touch');
+ * })
+ *
+ * @param {String} tolerance "fit" | "intersect" | "pointer" | "touch" (default: "pointer")
+ * @return {drop} returns the drop for chaining.
+ */
+ .tolerance = function( tolerance ) {
+ if(allowedTolerances.indexOf(tolerance) > -1){
+ this.tolerance = tolerance;
+ }
+ return this;
+ };
+
+
+ $.extend($.Drop,{
+ tolerance: 'pointer',
+ isAffected: function( point, moveable, responder ) {
+ switch(responder.tolerance){
+ case "touch":
+ //TODO: would be nice to use this, but it does not handle outerWidth
+ //return (responder.element != moveable.element) && (moveable.element.withinBox(responder.element.offset().left, responder.element.offset().top, responder.element.outerWidth(), responder.element.outerHeight()).length == 1));
+
+ //TODO: cache width/height of elements for faster calculations
+ var $m = moveable.element,
+ $r = responder.element,
+ ro = $r.offset(),
+ rw = $r.outerWidth(),
+ rh = $r.outerHeight(),
+ rTop = ro.top,
+ rBottom = ro.top + rh,
+ rLeft = ro.left,
+ rRight = ro.left + rw,
+
+ mo = moveable.element.offset(),
+ mw = $m.outerWidth(),
+ mh = $m.outerHeight(),
+ mTop = mo.top,
+ mBottom = mo.top + mh,
+ mLeft = mo.left,
+ mRight = mo.left + mw,
+ res = !( (mTop > rBottom) || (mBottom < rTop) || (mLeft > rRight) || (mRight < rLeft));
+
+ return ((responder.element != moveable.element) && res);
+ break;
+
+ case "fit":
+ //TODO: cache width/height of elements for faster calculations
+ var $m = moveable.element,
+ $r = responder.element,
+ ro = $r.offset(),
+ rw = $r.outerWidth(),
+ rh = $r.outerHeight(),
+ rTop = ro.top,
+ rBottom = ro.top + rh,
+ rLeft = ro.left,
+ rRight = ro.left + rw,
+
+ mo = moveable.element.offset(),
+ mw = $m.outerWidth(),
+ mh = $m.outerHeight(),
+ mTop = mo.top,
+ mBottom = mo.top + mh,
+ mLeft = mo.left,
+ mRight = mo.left + mw,
+ res = (mTop > rTop) && (mBottom < rBottom) && (mLeft > rLeft) && (mRight < rRight);
+
+ return ((responder.element != moveable.element) && res);
+ break;
+
+ case "intersect":
+ //TODO: cache width/height of elements for faster calculations
+ var $m = moveable.element,
+ $r = responder.element,
+ ro = $r.offset(),
+ rw = $r.outerWidth(),
+ rh = $r.outerHeight(),
+ rTop = ro.top,
+ rBottom = ro.top + rh,
+ rLeft = ro.left,
+ rRight = ro.left + rw,
+
+ mo = moveable.element.offset(),
+ mw = $m.outerWidth(),
+ mh = $m.outerHeight(),
+ mTop = mo.top,
+ mBottom = mo.top + mh,
+ mLeft = mo.left,
+ mRight = mo.left + mw,
+ res = !( (mTop+(mh/2) > rBottom) || (mBottom-(mh/2) < rTop) || (mLeft+(mw/2) > rRight) || (mRight-(mw/2) < rLeft));
+
+ return ((responder.element != moveable.element) && res);
+ break;
+ case "pointer":
+ default:
+ return ((responder.element != moveable.element) && (responder.element.within(point[0], point[1], responder._cache).length == 1));
+ break;
+ }
+ }
+ });
+
+ return $;
+});
From a53bd5440b93b444e325e24e5194816636c092ff Mon Sep 17 00:00:00 2001
From: Mick McGrath
Date: Thu, 24 Sep 2015 13:48:35 -0500
Subject: [PATCH 2/2] added tolerance demo to the drop.html page | added tests
for drop dolerance to drop_test.js
---
event/drop/drop.html | 152 +++++++++++
event/drop/drop_test.js | 587 +++++++++++++++++++++++++++++++++++++---
2 files changed, 704 insertions(+), 35 deletions(-)
diff --git a/event/drop/drop.html b/event/drop/drop.html
index 5859f39d..fc12ea98 100644
--- a/event/drop/drop.html
+++ b/event/drop/drop.html
@@ -4,6 +4,10 @@
drop
+ .demo-block{
+ border:1px solid #555555;
+ margin:2em 5em;
+ }
.handle {
width: 100px;
height: 25px;
@@ -17,6 +21,11 @@
cursor : pointer;
background-color: white;
}
+ #droparea, .drop-area {
+ padding: 20px;
+ border: solid 1px blue;
+ margin:4em 6em;
+ }
#dropout {
padding: 20px;
border: solid 1px blue;
@@ -79,5 +88,148 @@ Dropmove/Dropon
})
+
+
+
+Option: tolerance
+
+
Tolerance Demo - Pointer
+
Drag Me
+
Dropout/Dropover
+
+
+$('#droparea-pointer')
+ .bind("dropinit", function(ev, drop, drag){
+ drop.tolerance("pointer");
+ })
+ .bind("dropover", function(){
+ $(this).addClass('over')
+ })
+ .bind("dropout", function(){
+ $(this).removeClass('over')
+ });
+
+
+
+
+
+
Tolerance Demo - Touch
+
Drag Me
+
Dropout/Dropover
+
+
+$('#droparea-touch')
+ .bind("dropinit", function(ev, drop, drag){
+ drop.tolerance("touch");
+ })
+ .bind("dropover", function(){
+ $(this).addClass('over')
+ })
+ .bind("dropout", function(){
+ $(this).removeClass('over')
+ });
+
+
+
+
+
+
Tolerance Demo - Fit
+
Drag Me
+
Dropout/Dropover
+
+
+$('#droparea-fit')
+ .bind("dropinit", function(ev, drop, drag){
+ drop.tolerance("fit");
+ })
+ .bind("dropover", function(){
+ $(this).addClass('over')
+ })
+ .bind("dropout", function(){
+ $(this).removeClass('over')
+ });
+
+
+
+
+
+
Tolerance Demo - Intersect
+
Drag Me
+
Dropout/Dropover
+
+
+$('#droparea-intersect')
+ .bind("dropinit", function(ev, drop, drag){
+ drop.tolerance("intersect");
+ })
+ .bind("dropover", function(){
+ $(this).addClass('over')
+ })
+ .bind("dropout", function(){
+ $(this).removeClass('over')
+ });
+
+
+
+
+