makeRemoveSplitGrid.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import { makeDiv,
  2. makeCenteredTextDiv,
  3. setElementPosition,
  4. getInputHeight } from '/domUtilities.js';
  5. import { getGridCoordinates,
  6. returnPanels } from './gridUtilities.js';
  7. import { jc as jcGlobal } from '/configuration.js';
  8. function makeTabsRemoveSplitPanel(coords,
  9. tabs,
  10. gridContents,
  11. i,
  12. redraw,
  13. availablePanels,
  14. gridSplits,
  15. prevGrid) {
  16. const jc = jcGlobal.jc;
  17. const inputHeight = getInputHeight();
  18. const div = makeDiv();
  19. setElementPosition(div, coords);
  20. const tabsCoords = [coords[0],
  21. coords[1],
  22. coords[2],
  23. inputHeight];
  24. const contentCoords = [coords[0],
  25. coords[1] + inputHeight,
  26. coords[2],
  27. coords[3] - inputHeight];
  28. if(gridSplits) {
  29. const tabsPanel = makeDiv();
  30. tabsPanel.style.opacity = 0;
  31. setElementPosition(tabsPanel, tabsCoords);
  32. const tabsDisplayPanel = makeCenteredTextDiv('remove split');
  33. tabsDisplayPanel.style.background = jc.General.removeSplitColor;
  34. tabsDisplayPanel.style.opacity = 0;
  35. setElementPosition(tabsDisplayPanel, coords);
  36. div.append(tabsDisplayPanel, tabsPanel);
  37. tabsPanel.onmouseover = () => {
  38. tabsDisplayPanel.style.opacity = 1;
  39. };
  40. tabsPanel.onmouseleave = () => {
  41. tabsDisplayPanel.style.opacity = 0;
  42. };
  43. tabsPanel.onmousedown = () => {
  44. const split = gridSplits[i];
  45. if(i > 0 && i < gridSplits.length - 1) {
  46. gridSplits[i-1] += split / 2;
  47. gridSplits[i+1] += split / 2;
  48. }else if(i === 0) {
  49. gridSplits[1] += split;
  50. }else if(i === gridSplits.length - 1) {
  51. gridSplits[gridSplits.length - 2] += split;
  52. }
  53. gridSplits.splice(i, 1);
  54. gridContents.splice(i, 1);
  55. returnPanels(tabs.contents, availablePanels);
  56. if(gridContents.length === 1 && prevGrid) {
  57. prevGrid.contents[prevGrid.i] = gridContents[0];
  58. }
  59. redraw();
  60. };
  61. }
  62. const currentContent = tabs.contents[tabs.getCurrentIndex()];
  63. if(currentContent.type === 'grid') {
  64. div.append(makeRemoveSplitGrid(contentCoords[0],
  65. contentCoords[1],
  66. contentCoords[2],
  67. contentCoords[3],
  68. currentContent.contents,
  69. currentContent.splits,
  70. currentContent.direction,
  71. redraw,
  72. jc,
  73. availablePanels,
  74. {contents: tabs.contents,
  75. i: tabs.getCurrentIndex()}));
  76. }else if(currentContent.type === 'tabs') {
  77. div.append(makeTabsRemoveSplitPanel(contentCoords,
  78. currentContent,
  79. tabs.contents,
  80. tabs.getCurrentIndex(),
  81. redraw,
  82. availablePanels));
  83. }
  84. return div;
  85. }
  86. function makeRemoveSplitGrid(x,
  87. y,
  88. width,
  89. height,
  90. contents,
  91. splits,
  92. direction,
  93. redraw,
  94. jc,
  95. availablePanels,
  96. prevGrid) {
  97. const div = makeDiv();
  98. setElementPosition(div, [x, y, width, height]);
  99. const coords = getGridCoordinates(x, y, width, height, splits, direction);
  100. contents.forEach((content, i) => {
  101. if(content.type === 'tabs') {
  102. div.append(makeTabsRemoveSplitPanel(coords[i],
  103. content,
  104. contents,
  105. i,
  106. redraw,
  107. availablePanels,
  108. splits,
  109. prevGrid));
  110. }else if(content.type !== 'grid') {
  111. const panel = makeCenteredTextDiv('remove split');
  112. panel.style.background = jc.General.removeSplitColor;
  113. setElementPosition(panel, coords[i]);
  114. panel.style.opacity = 0;
  115. panel.onmouseover = () => {
  116. panel.style.opacity = 1;
  117. };
  118. panel.onmouseleave = () => {
  119. panel.style.opacity = 0;
  120. };
  121. panel.onmousedown = () => {
  122. if(prevGrid || contents.length > 1) {
  123. if(contents[i].label) {
  124. availablePanels.push(contents[i]);
  125. }
  126. const split = splits[i];
  127. if(i > 0 && i < splits.length - 1) {
  128. splits[i-1] += split / 2;
  129. splits[i+1] += split / 2;
  130. }else if(i === 0) {
  131. splits[1] += split;
  132. }else if(i === splits.length - 1) {
  133. splits[splits.length - 2] += split;
  134. }
  135. splits.splice(i, 1);
  136. contents.splice(i, 1);
  137. if(contents.length === 1 && prevGrid) {
  138. prevGrid.contents[prevGrid.i] = contents[0];
  139. }
  140. redraw();
  141. }
  142. };
  143. div.append(panel);
  144. }else {
  145. div.append(makeRemoveSplitGrid(coords[i][0],
  146. coords[i][1],
  147. coords[i][2],
  148. coords[i][3],
  149. contents[i].contents,
  150. contents[i].splits,
  151. contents[i].direction,
  152. redraw,
  153. jc,
  154. availablePanels,
  155. {contents, i}));
  156. }
  157. });
  158. return div;
  159. }
  160. export { makeRemoveSplitGrid }