/static/scripts/galaxy.ui.scrollPanel.js

https://bitbucket.org/cistrome/cistrome-harvard/ · JavaScript · 88 lines · 75 code · 1 blank · 12 comment · 13 complexity · f82107404e00e6af733ea3a9c09eb660 MD5 · raw file

  1. // This is an extension to jQuery UI draggable
  2. // When dragging move the parent element ("panel") relative to its parent
  3. // ("viewport") so that the draggable is always visible.
  4. $.ui.plugin.add("draggable", "scrollPanel", {
  5. drag: function(e, ui) {
  6. var instance = $(this).data("draggable");
  7. clearTimeout( instance.timeout );
  8. var o = ui.options,
  9. element = instance.element,
  10. panel = o.panel,
  11. panel_pos = panel.position(),
  12. panel_w = panel.width(),
  13. panel_h = panel.height()
  14. viewport = panel.parent();
  15. viewport_w = viewport.width(),
  16. viewport_h = viewport.height(),
  17. element_w = element.width(),
  18. element_h = element.height(),
  19. moved = false,
  20. close_dist = 5,
  21. nudge = 23,
  22. // Legal panel range
  23. p_min_x = - ( panel_w - viewport_w ),
  24. p_min_y = - ( panel_h - viewport_h ),
  25. p_max_x = 0,
  26. p_max_y = 0,
  27. // Visible
  28. min_vis_x = - panel_pos.left,
  29. max_vis_x = min_vis_x + viewport_w,
  30. min_vis_y = - panel_pos.top,
  31. max_vis_y = min_vis_y + viewport_h,
  32. // Mouse
  33. mouse_x = ui.position.left + instance.offset.click.left;
  34. mouse_y = ui.position.top + instance.offset.click.top;
  35. // Move it
  36. if ( ( panel_pos.left < p_max_x ) && ( mouse_x - close_dist < min_vis_x ) ) {
  37. var t = Math.min( nudge, p_max_x - panel_pos.left );
  38. panel.css( "left", panel_pos.left + t );
  39. moved = true;
  40. instance.offset.parent.left += t;
  41. ui.position.left -= t
  42. }
  43. if ( ( ! moved ) && ( panel_pos.left > p_min_x ) && ( mouse_x + close_dist > max_vis_x ) ) {
  44. var t = Math.min( nudge, panel_pos.left - p_min_x );
  45. panel.css( "left", panel_pos.left - t );
  46. moved = true;
  47. instance.offset.parent.left -= t;
  48. ui.position.left += t;
  49. }
  50. if ( ( ! moved ) && ( panel_pos.top < p_max_y ) && ( mouse_y - close_dist < min_vis_y ) ) {
  51. var t = Math.min( nudge, p_max_y - panel_pos.top );
  52. panel.css( "top", panel_pos.top + t );
  53. // Firefox sometimes moves by less, so we need to check. Yuck.
  54. var amount_moved = panel.position().top - panel_pos.top;
  55. instance.offset.parent.top += amount_moved;
  56. ui.position.top -= amount_moved;
  57. moved = true;
  58. }
  59. if ( ( ! moved ) && ( panel_pos.top > p_min_y ) && ( mouse_y + close_dist > max_vis_y ) ) {
  60. var t = Math.min( nudge, panel_pos.top - p_min_x );
  61. panel.css( "top", ( panel_pos.top - t ) + "px" );
  62. // Firefox sometimes moves by less, so we need to check. Yuck.
  63. var amount_moved = panel_pos.top - panel.position().top;
  64. instance.offset.parent.top -= amount_moved;
  65. ui.position.top += amount_moved;
  66. moved = true;
  67. }
  68. // Still contain in panel
  69. ui.position.left = Math.max( ui.position.left, 0 );
  70. ui.position.top = Math.max( ui.position.top, 0 );
  71. ui.position.left = Math.min( ui.position.left, panel_w - element_w );
  72. ui.position.top = Math.min( ui.position.top, panel_h - element_h );
  73. // Update offsets
  74. if ( moved ) {
  75. $.ui.ddmanager.prepareOffsets( instance, e );
  76. }
  77. // Keep moving even if mouse doesn't move
  78. if ( moved ) {
  79. instance.old_e = e;
  80. instance.timeout = setTimeout( function() { instance.mouseMove( e ) }, 50 );
  81. }
  82. },
  83. stop: function( e, ui ) {
  84. var instance = $(this).data("draggable");
  85. clearTimeout( instance.timeout );
  86. }
  87. });