WidgetLayerTop.js 5.4 KB

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