r2870 - positionTo: first prototype for collision detection: renamed option to "collision", imple...
Author: joern.zaefferer
Date: Sun Jul 5 11:11:39 2009
New Revision: 2870
Modified:
branches/dev/positionTo/demos/positionTo/default.html
branches/dev/positionTo/ui/ui.positionTo.js
Log:
positionTo: first prototype for collision detection: renamed option
to "collision", implemented fit and modified default demo to use fit
(instead of default flip)
Modified: branches/dev/positionTo/demos/positionTo/default.html
==============================================================================
--- branches/dev/positionTo/demos/positionTo/default.html (original)
+++ branches/dev/positionTo/demos/positionTo/default.html Sun Jul 5
11:11:39 2009
@@ -49,7 +49,9 @@
my: $('#my_horizontal').val() + ' ' +
$('#my_vertical').val(),
at: $('#at_horizontal').val() + ' '+
$('#at_vertical').val(),
offset: $('#offset').val(),
- by: by
+ by: by,
+ // for testing only, remove once fully implemented
+ collision: "fit"
});
}
@@ -93,7 +95,7 @@
</div>
-<div class="positionable" style="width:90px; height: 60px;">
+<div class="positionable" style="width:120px; height: 40px;">
to position 2
Modified: branches/dev/positionTo/ui/ui.positionTo.js
==============================================================================
--- branches/dev/positionTo/ui/ui.positionTo.js (original)
+++ branches/dev/positionTo/ui/ui.positionTo.js Sun Jul 5 11:11:39 2009
@@ -16,7 +16,7 @@
$.fn.positionTo = function(options) {
options = $.extend({
- collisionDetect: 'flip',
+ collision: 'flip',
stackFix: true
}, options);
@@ -58,6 +58,14 @@
pos[1] = verticalPositions.test(pos[1]) ? pos[1] : verticalDefault;
options[this] = pos;
});
+
+ // normalize collision option
+ if (options.collision) {
+ var collision = options.collision.split(' ');
+ options.collision = collision.length == 1
+ ? [collision[0], collision[0]]
+ : collision
+ }
switch (options.at[0]) {
case 'right':
@@ -106,7 +114,35 @@
break;
}
- // TODO: collision option
+ // TODO fit breaks when the window scrolls; need to take scrollLeft/Top
into account
+ if (options.collision) {
+ if (options.collision[0] != "none") {
+ var over = (position.left + elemWidth) - $(window).width();
+ if (over > 0) {
+ switch(options.collision[0]) {
+ case 'fit':
+ position.left -= over;
+ break;
+ case 'flip':
+ // TODO not yet implemented
+ break;
+ }
+ }
+ }
+ if (options.collision[1] != "none") {
+ var over = (position.top + elemHeight) - $(window).height();
+ if (over > 0) {
+ switch(options.collision[1]) {
+ case 'fit':
+ position.top -= over;
+ break;
+ case 'flip':
+ // TODO not yet implemented
+ break;
+ }
+ }
+ }
+ }
(options.stackfix && $.fn.stackfix && elem.stackfix());
// the by function is passed the offset values, not the position values