|
1 | 1 | (function () { |
2 | | - var SILVER_INDICES = new Set([0, 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23]); |
| 2 | + var GRID_FULL = 24; |
| 3 | + var GRID_COMPACT = 23; |
| 4 | + var MIDDLE_SKIP = 11; |
| 5 | + var SILVER_SPLIT = [0, 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23]; |
| 6 | + var compactGrid = false; |
| 7 | + var silverIndices = new Set(SILVER_SPLIT); |
3 | 8 | var SILVER_HEX = '#c0c0c0'; |
4 | 9 | var BLACK_HEX = '#000000'; |
5 | 10 | var WHITE_HEX = '#ffffff'; |
|
19 | 24 | var strokeColor = null; |
20 | 25 | var silverWeight = 1; |
21 | 26 |
|
| 27 | + function gridSize() { |
| 28 | + return compactGrid ? GRID_COMPACT : GRID_FULL; |
| 29 | + } |
| 30 | + |
| 31 | + function paintBandCount() { |
| 32 | + return compactGrid ? 11 : 12; |
| 33 | + } |
| 34 | + |
| 35 | + function buildCompactSilverIndices() { |
| 36 | + var indices = []; |
| 37 | + for (var i = 0; i < GRID_COMPACT; i += 2) indices.push(i); |
| 38 | + return indices; |
| 39 | + } |
| 40 | + |
| 41 | + function updateSilverIndices() { |
| 42 | + silverIndices = new Set(compactGrid ? buildCompactSilverIndices() : SILVER_SPLIT); |
| 43 | + } |
| 44 | + |
22 | 45 | function isSilverIndex(i) { |
23 | | - return SILVER_INDICES.has(i); |
| 46 | + return silverIndices.has(i); |
| 47 | + } |
| 48 | + |
| 49 | + function copyCellFill(srcTd, destTd) { |
| 50 | + if (!srcTd || destTd.classList.contains('silver')) return; |
| 51 | + if (srcTd.classList.contains('filled') && srcTd.style.background && !srcTd.classList.contains('silver')) { |
| 52 | + destTd.style.background = srcTd.style.background; |
| 53 | + destTd.classList.add('filled'); |
| 54 | + } |
| 55 | + } |
| 56 | + |
| 57 | + function rebuildGrid() { |
| 58 | + var oldCells = cells; |
| 59 | + var size = gridSize(); |
| 60 | + var table = document.getElementById('grid'); |
| 61 | + table.innerHTML = ''; |
| 62 | + cells = []; |
| 63 | + |
| 64 | + for (var r = 0; r < size; r++) { |
| 65 | + var tr = document.createElement('tr'); |
| 66 | + var row = []; |
| 67 | + for (var c = 0; c < size; c++) { |
| 68 | + var td = document.createElement('td'); |
| 69 | + td.dataset.r = r; |
| 70 | + td.dataset.c = c; |
| 71 | + if (isSilverCell(r, c)) td.classList.add('silver'); |
| 72 | + |
| 73 | + if (oldCells.length) { |
| 74 | + var srcTd = null; |
| 75 | + if (compactGrid && oldCells.length === GRID_FULL) { |
| 76 | + srcTd = oldCells[r < MIDDLE_SKIP ? r : r + 1][c < MIDDLE_SKIP ? c : c + 1]; |
| 77 | + } else if (!compactGrid && oldCells.length === GRID_COMPACT) { |
| 78 | + if (r !== MIDDLE_SKIP && c !== MIDDLE_SKIP) { |
| 79 | + srcTd = oldCells[r < MIDDLE_SKIP ? r : r - 1][c < MIDDLE_SKIP ? c : c - 1]; |
| 80 | + } |
| 81 | + } else { |
| 82 | + srcTd = oldCells[r][c]; |
| 83 | + } |
| 84 | + copyCellFill(srcTd, td); |
| 85 | + } |
| 86 | + |
| 87 | + tr.appendChild(td); |
| 88 | + row.push(td); |
| 89 | + } |
| 90 | + table.appendChild(tr); |
| 91 | + cells.push(row); |
| 92 | + } |
| 93 | + sizingAttempts = 0; |
| 94 | + scheduleGridSizing(); |
| 95 | + } |
| 96 | + |
| 97 | + function setCompactGrid(on) { |
| 98 | + if (compactGrid === on) return; |
| 99 | + compactGrid = on; |
| 100 | + updateSilverIndices(); |
| 101 | + rebuildGrid(); |
24 | 102 | } |
25 | 103 |
|
26 | 104 | function isSilverCell(r, c) { |
|
54 | 132 | var h = Math.round(rect.height); |
55 | 133 | if (w < 1 || h < 1) return; |
56 | 134 |
|
57 | | - var colSizes = axisPixelSizes(w, 24, colWeight); |
58 | | - var rowSizes = axisPixelSizes(h, 24, rowWeight); |
| 135 | + var size = gridSize(); |
| 136 | + var colSizes = axisPixelSizes(w, size, colWeight); |
| 137 | + var rowSizes = axisPixelSizes(h, size, rowWeight); |
59 | 138 | var colgroup = table.querySelector('colgroup'); |
| 139 | + if (colgroup && colgroup.children.length !== size) { |
| 140 | + colgroup.remove(); |
| 141 | + colgroup = null; |
| 142 | + } |
60 | 143 | if (!colgroup) { |
61 | 144 | colgroup = document.createElement('colgroup'); |
62 | | - for (var c = 0; c < 24; c++) { |
| 145 | + for (var c = 0; c < size; c++) { |
63 | 146 | colgroup.appendChild(document.createElement('col')); |
64 | 147 | } |
65 | 148 | table.insertBefore(colgroup, table.firstChild); |
|
69 | 152 | colgroup.querySelectorAll('col').forEach(function (col, c) { |
70 | 153 | col.style.width = colSizes[c] + 'px'; |
71 | 154 | }); |
72 | | - for (var r = 0; r < 24; r++) { |
| 155 | + for (var r = 0; r < size; r++) { |
73 | 156 | table.rows[r].style.height = rowSizes[r] + 'px'; |
74 | 157 | } |
75 | 158 | } |
|
127 | 210 | } |
128 | 211 |
|
129 | 212 | function buildGrid() { |
130 | | - var table = document.getElementById('grid'); |
131 | | - cells = []; |
132 | | - for (var r = 0; r < 24; r++) { |
133 | | - var tr = document.createElement('tr'); |
134 | | - var row = []; |
135 | | - for (var c = 0; c < 24; c++) { |
136 | | - var td = document.createElement('td'); |
137 | | - td.dataset.r = r; |
138 | | - td.dataset.c = c; |
139 | | - if (isSilverCell(r, c)) td.classList.add('silver'); |
140 | | - tr.appendChild(td); |
141 | | - row.push(td); |
142 | | - } |
143 | | - table.appendChild(tr); |
144 | | - cells.push(row); |
145 | | - } |
| 213 | + rebuildGrid(); |
146 | 214 | } |
147 | 215 |
|
148 | 216 | function hexToRgb(hex) { |
|
529 | 597 |
|
530 | 598 | function saveImage() { |
531 | 599 | var gridPx = 480; |
532 | | - var colSizes = axisPixelSizes(gridPx, 24, colWeight); |
533 | | - var rowSizes = axisPixelSizes(gridPx, 24, rowWeight); |
| 600 | + var size = gridSize(); |
| 601 | + var colSizes = axisPixelSizes(gridPx, size, colWeight); |
| 602 | + var rowSizes = axisPixelSizes(gridPx, size, rowWeight); |
534 | 603 | var borderPx = 32; |
535 | 604 | var text = 'thanks for coming ❋ zesameri'; |
536 | 605 | var textGap = 36; |
|
545 | 614 | ctx.fillRect(0, 0, canvas.width, canvas.height); |
546 | 615 |
|
547 | 616 | var rowY = borderPx; |
548 | | - for (var r = 0; r < 24; r++) { |
| 617 | + for (var r = 0; r < size; r++) { |
549 | 618 | var colX = borderPx; |
550 | 619 | var cellH = rowSizes[r]; |
551 | | - for (var c = 0; c < 24; c++) { |
| 620 | + for (var c = 0; c < size; c++) { |
552 | 621 | var cellW = colSizes[c]; |
553 | 622 | ctx.fillStyle = getCellFill(cells[r][c]); |
554 | 623 | ctx.fillRect(colX, rowY, cellW, cellH); |
|
867 | 936 |
|
868 | 937 | function bandWidthsOnAxis(weight) { |
869 | 938 | var silverCount = 12; |
870 | | - var paintCount = 12; |
| 939 | + var paintCount = paintBandCount(); |
871 | 940 | var totalWeight = silverCount * weight + paintCount; |
872 | 941 | return { |
873 | 942 | silver: (AXIS_UNITS * weight) / totalWeight, |
|
900 | 969 | watchGridResize(); |
901 | 970 | scheduleGridSizing(); |
902 | 971 | bindSilverSizing('silverSize', 'silverSizeVal', 'silverSizeUnits', function (v) { silverWeight = v; }); |
| 972 | + document.getElementById('compactGridToggle').addEventListener('change', function (e) { |
| 973 | + setCompactGrid(e.target.checked); |
| 974 | + document.getElementById('silverSizeUnits').textContent = formatBandWidths(silverWeight); |
| 975 | + }); |
903 | 976 | updateRampTargetUI(); |
904 | 977 | setBorders(false); |
905 | 978 | updateCurrentUI(); |
|
0 commit comments