(panesUpdatedCallback: () => void, deadWidth: number, deadHeight: number)
| 143 | readonly RESIZER_SIZE = document.getElementById("resizer-ranges").offsetHeight; |
| 144 | |
| 145 | constructor(panesUpdatedCallback: () => void, deadWidth: number, deadHeight: number) { |
| 146 | const resizer = this; |
| 147 | resizer.panesUpdatedCallback = panesUpdatedCallback; |
| 148 | resizer.deadWidth = deadWidth; |
| 149 | resizer.deadHeight = deadHeight; |
| 150 | resizer.left = document.getElementById(C.SOURCE_PANE_ID); |
| 151 | resizer.right = document.getElementById(C.GENERATED_PANE_ID); |
| 152 | resizer.ranges = document.getElementById(C.RANGES_PANE_ID); |
| 153 | resizer.middle = document.getElementById(C.INTERMEDIATE_PANE_ID); |
| 154 | resizer.resizerLeft = d3.select("#resizer-left"); |
| 155 | resizer.resizerRight = d3.select("#resizer-right"); |
| 156 | resizer.resizerRanges = d3.select("#resizer-ranges"); |
| 157 | // Set default sizes, if they weren't set. |
| 158 | storageSetIfIsNotExist("source-pane-percent", C.SOURCE_PANE_DEFAULT_PERCENT); |
| 159 | storageSetIfIsNotExist("disassembly-pane-percent", C.DISASSEMBLY_PANE_DEFAULT_PERCENT); |
| 160 | storageSetIfIsNotExist("ranges-pane-height-percent", C.RANGES_PANE_HEIGHT_DEFAULT_PERCENT); |
| 161 | storageSetIfIsNotExist("ranges-pane-width-percent", C.RANGES_PANE_WIDTH_DEFAULT_PERCENT); |
| 162 | |
| 163 | this.updateSizes(); |
| 164 | |
| 165 | const dragResizeLeft = d3.drag() |
| 166 | .on("drag", () => { |
| 167 | const [x, _] = d3.mouse(document.body); |
| 168 | resizer.sepLeft = Math.min(Math.max(0, x), resizer.sepRight); |
| 169 | if (resizer.sepLeft > resizer.sepRangesX) { |
| 170 | resizer.sepRangesX = resizer.sepLeft; |
| 171 | } |
| 172 | resizer.updatePanes(); |
| 173 | }) |
| 174 | .on("start", () => { |
| 175 | resizer.rangesInLandscapeMode = resizer.isRangesInLandscapeMode(); |
| 176 | resizer.resizerLeft.classed("dragged", true); |
| 177 | }) |
| 178 | .on("end", () => { |
| 179 | // If the panel is close enough to the left, treat it as if it was pulled |
| 180 | // all the way to the left. |
| 181 | const [x, y] = d3.mouse(document.body); |
| 182 | if (x <= deadWidth) { |
| 183 | resizer.sepLeft = 0; |
| 184 | resizer.updatePanes(); |
| 185 | } |
| 186 | // Snap if dragged all the way to the left. |
| 187 | resizer.resizerLeft.classed("snapped", resizer.sepLeft === 0); |
| 188 | if (!resizer.isLeftSnapped()) { |
| 189 | storageSetItem("source-pane-percent", |
| 190 | resizer.sepLeft / document.body.getBoundingClientRect().width); |
| 191 | } |
| 192 | resizer.snapper.setSourceExpanded(!resizer.isLeftSnapped()); |
| 193 | resizer.resizerLeft.classed("dragged", false); |
| 194 | if (!resizer.rangesInLandscapeMode) { |
| 195 | resizer.dragRangesEnd(y, resizer.sepRangesX >= resizer.sepRight - deadWidth); |
| 196 | } |
| 197 | }); |
| 198 | resizer.resizerLeft.call(dragResizeLeft); |
| 199 | |
| 200 | const dragResizeRight = d3.drag() |
| 201 | .on("drag", () => { |
| 202 | const [x, _] = d3.mouse(document.body); |
nothing calls this directly
no test coverage detected