multiselect.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /**
  2. * @description Select multiple albums or photos.
  3. * @copyright 2015 by Tobias Reich
  4. */
  5. multiselect = {}
  6. multiselect.position = {
  7. top: null,
  8. right: null,
  9. bottom: null,
  10. left: null
  11. }
  12. multiselect.bind = function() {
  13. $('#content') .on('mousedown', function(e) { if (e.which===1) multiselect.show(e) });
  14. $(document) .on('mouseup', function(e) { if (e.which===1) multiselect.getSelection(e) });
  15. return true;
  16. }
  17. multiselect.show = function(e) {
  18. if (lychee.publicMode) return false;
  19. if (visible.search()) return false;
  20. if (!visible.albums()&&!visible.album) return false;
  21. if ($('.album:hover, .photo:hover').length!==0) return false;
  22. if (visible.multiselect()) $('#multiselect').remove();
  23. sidebar.setSelectable(false);
  24. multiselect.position.top = e.pageY;
  25. multiselect.position.right = -1 * (e.pageX - $(document).width());
  26. multiselect.position.bottom = -1 * (multiselect.position.top - $(window).height());
  27. multiselect.position.left = e.pageX;
  28. $('body').append(build.multiselect(multiselect.position.top, multiselect.position.left));
  29. $(document).on('mousemove', multiselect.resize);
  30. }
  31. multiselect.selectAll = function() {
  32. var e,
  33. newWidth,
  34. newHeight;
  35. if (lychee.publicMode) return false;
  36. if (visible.search()) return false;
  37. if (!visible.albums()&&!visible.album) return false;
  38. if (visible.multiselect()) $('#multiselect').remove();
  39. sidebar.setSelectable(false);
  40. multiselect.position.top = 70;
  41. multiselect.position.right = 40;
  42. multiselect.position.bottom = 90;
  43. multiselect.position.left = 20;
  44. $('body').append(build.multiselect(multiselect.position.top, multiselect.position.left));
  45. newWidth = $(document).width() - multiselect.position.right + 2;
  46. newHeight = $(document).height() - multiselect.position.bottom;
  47. $('#multiselect').css({
  48. width: newWidth,
  49. height: newHeight
  50. });
  51. e = {
  52. pageX: $(document).width() - (multiselect.position.right / 2),
  53. pageY: $(document).height() - multiselect.position.bottom
  54. };
  55. multiselect.getSelection(e);
  56. }
  57. multiselect.resize = function(e) {
  58. var mouse_x = e.pageX,
  59. mouse_y = e.pageY,
  60. newHeight,
  61. newWidth;
  62. if (multiselect.position.top===null||
  63. multiselect.position.right===null||
  64. multiselect.position.bottom===null||
  65. multiselect.position.left===null) return false;
  66. if (mouse_y>=multiselect.position.top) {
  67. // Do not leave the screen
  68. newHeight = mouse_y - multiselect.position.top;
  69. if ((multiselect.position.top+newHeight)>=$(document).height())
  70. newHeight -= (multiselect.position.top + newHeight) - $(document).height() + 2;
  71. $('#multiselect').css({
  72. top: multiselect.position.top,
  73. bottom: 'inherit',
  74. height: newHeight
  75. });
  76. } else {
  77. $('#multiselect').css({
  78. top: 'inherit',
  79. bottom: multiselect.position.bottom,
  80. height: multiselect.position.top - e.pageY
  81. });
  82. }
  83. if (mouse_x>=multiselect.position.left) {
  84. // Do not leave the screen
  85. newWidth = mouse_x - multiselect.position.left;
  86. if ((multiselect.position.left+newWidth)>=$(document).width())
  87. newWidth -= (multiselect.position.left + newWidth) - $(document).width() + 2;
  88. $('#multiselect').css({
  89. right: 'inherit',
  90. left: multiselect.position.left,
  91. width: newWidth
  92. });
  93. } else {
  94. $('#multiselect').css({
  95. right: multiselect.position.right,
  96. left: 'inherit',
  97. width: multiselect.position.left - e.pageX
  98. });
  99. }
  100. }
  101. multiselect.stopResize = function() {
  102. $(document).off('mousemove');
  103. }
  104. multiselect.getSize = function() {
  105. if (!visible.multiselect()) return false;
  106. return {
  107. top: $('#multiselect').offset().top,
  108. left: $('#multiselect').offset().left,
  109. width: parseInt($('#multiselect').css('width').replace('px', '')),
  110. height: parseInt($('#multiselect').css('height').replace('px', ''))
  111. };
  112. }
  113. multiselect.getSelection = function(e) {
  114. var tolerance = 150,
  115. id,
  116. ids = [],
  117. offset,
  118. size = multiselect.getSize();
  119. if (visible.contextMenu()) return false;
  120. if (!visible.multiselect()) return false;
  121. $('.photo, .album').each(function() {
  122. offset = $(this).offset();
  123. if (offset.top>=(size.top-tolerance)&&
  124. offset.left>=(size.left-tolerance)&&
  125. (offset.top+206)<=(size.top+size.height+tolerance)&&
  126. (offset.left+206)<=(size.left+size.width+tolerance)) {
  127. id = $(this).data('id');
  128. if (id!=='0'&&id!==0&&id!=='f'&&id!=='s'&&id!=='r'&&id!==null&&id!==undefined) {
  129. ids.push(id);
  130. $(this).addClass('active');
  131. }
  132. }
  133. });
  134. if (ids.length!==0&&visible.album()) contextMenu.photoMulti(ids, e);
  135. else if (ids.length!==0&&visible.albums()) contextMenu.albumMulti(ids, e);
  136. else multiselect.close();
  137. }
  138. multiselect.close = function() {
  139. sidebar.setSelectable(true);
  140. multiselect.stopResize();
  141. multiselect.position.top = null;
  142. multiselect.position.right = null;
  143. multiselect.position.bottom = null;
  144. multiselect.position.left = null;
  145. lychee.animate('#multiselect', 'fadeOut');
  146. setTimeout(function() {
  147. $('#multiselect').remove();
  148. }, 300);
  149. }