WidgetLayerBottom.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. SC.loadPackage({ 'WidgetLayerBottom': {
  2. comment: 'I am the widget that brings the current selection to the bottom of layering.',
  3. traits: ['Widget'],
  4. sharedProperties: {
  5. widgetMenu: { initValue: '<div class="sg-editing-widget-container"><button id="sg-editing-widget-layerBottom" class="sg-editing-widget-button"></button></div>' }
  6. },
  7. methods: {
  8. init: {
  9. comment: 'I init the widget.',
  10. code: function(theSelection){
  11. this.delegate('Widget', 'init', theSelection);
  12. this.set({ isActionButton: true });
  13. var self = this,
  14. onMouseUp = function(evt){
  15. var modifierKey = evt.shiftKey || evt.ctrlKey,
  16. elements = SuperGlue.get('selection').get('elements'),
  17. pageContainer = SuperGlue.get('document').get('pageContainer'),
  18. documentChilds = SuperGlue.get('document').get('children'),
  19. selectionHasGaps = false,
  20. elementsToMove = [];
  21. if(documentChilds.length <= 1){
  22. return;
  23. }
  24. SuperGlue.get('history').do('actionHasStarted', self.do('createState'));
  25. if(elements.length === 1){
  26. if(modifierKey){
  27. SuperGlue.get('document').do('layerDown', elements[0]);
  28. }else{
  29. for(var i = documentChilds.indexOf(elements[0]);
  30. i > 0; i--){
  31. SuperGlue.get('document').do('layerDown', elements[0]);
  32. }
  33. }
  34. }else{
  35. for(var i = 0, l = elements.length; i < l; i++){
  36. elementsToMove.push({
  37. index: documentChilds.indexOf(elements[i]),
  38. child: elements[i],
  39. gapBelow: null
  40. });
  41. }
  42. elementsToMove.sort(function(a,b){ return a.index > b.index; });
  43. for(var i = 1, l = elementsToMove.length; i < l; i++){
  44. if(elementsToMove[i].index !== elementsToMove[i - 1].index + 1){
  45. selectionHasGaps = true;
  46. break;
  47. }
  48. }
  49. if(selectionHasGaps){
  50. for(var i = 1, l = elementsToMove.length; i < l; i++){
  51. elementsToMove[i].gapBelow = elementsToMove[i].index - i - elementsToMove[0].index;
  52. }
  53. for(var i = 1, l = elementsToMove.length; i < l; i++){
  54. for(var k = elementsToMove[i].gapBelow; k > 0; k--){
  55. SuperGlue.get('document').do('layerDown', elementsToMove[i].child);
  56. }
  57. }
  58. }else{
  59. if(elementsToMove[0].index === 0){
  60. return;
  61. }
  62. if(modifierKey){
  63. for(var i = 0, l = elementsToMove.length; i < l; i++){
  64. SuperGlue.get('document').do('layerDown', elementsToMove[i].child);
  65. }
  66. }else{
  67. for(var n = elementsToMove[0].index;
  68. n > 0; n--){
  69. for(var i = 0, l = elementsToMove.length; i < l; i++){
  70. SuperGlue.get('document').do('layerDown', elementsToMove[i].child);
  71. }
  72. }
  73. }
  74. }
  75. }
  76. SuperGlue.get('history').do('actionHasSucceeded', self.do('createState'));
  77. };
  78. this.get('widgetButton').addEventListener('mouseup', onMouseUp, false)
  79. }
  80. },
  81. createState: {
  82. comment: 'I create a reflection function to restore a state.',
  83. code: function(){
  84. return (function(children){
  85. var savedElements = children.slice();
  86. return function(){
  87. SuperGlue.get('document').set({ children: savedElements });
  88. var pageContainer = SuperGlue.get('document').get('pageContainer');
  89. while(pageContainer.firstChild){
  90. pageContainer.removeChild(pageContainer.firstChild);
  91. }
  92. for(var i = 0, l = savedElements.length; i < l; i++){
  93. pageContainer.appendChild(savedElements[i].get('node'));
  94. }
  95. }
  96. }).call(this, SuperGlue.get('document').get('children'));
  97. }
  98. }
  99. }
  100. }});