(config: ViewerConfig)
| 157 | } |
| 158 | |
| 159 | function useFileViewer(config: ViewerConfig) { |
| 160 | let wrapper!: HTMLDivElement |
| 161 | let container!: HTMLDivElement |
| 162 | let overlay!: HTMLDivElement |
| 163 | let selectionFrame: number | undefined |
| 164 | let dragFrame: number | undefined |
| 165 | let dragStart: number | undefined |
| 166 | let dragEnd: number | undefined |
| 167 | let dragMoved = false |
| 168 | let lastSelection: SelectedLineRange | null = null |
| 169 | let pendingSelectionEnd = false |
| 170 | |
| 171 | const ready = createReadyWatcher() |
| 172 | const bridge = createLineNumberSelectionBridge() |
| 173 | const [rendered, setRendered] = createSignal(0) |
| 174 | |
| 175 | const getRoot = () => getViewerRoot(container) |
| 176 | const getHost = () => getViewerHost(container) |
| 177 | |
| 178 | const find = createFileFind({ |
| 179 | wrapper: () => wrapper, |
| 180 | overlay: () => overlay, |
| 181 | getRoot, |
| 182 | }) |
| 183 | |
| 184 | // -- selection scheduling -- |
| 185 | |
| 186 | const scheduleSelectionUpdate = () => { |
| 187 | if (selectionFrame !== undefined) return |
| 188 | selectionFrame = requestAnimationFrame(() => { |
| 189 | selectionFrame = undefined |
| 190 | const finishing = pendingSelectionEnd |
| 191 | config.updateSelection(finishing) |
| 192 | if (!pendingSelectionEnd) return |
| 193 | pendingSelectionEnd = false |
| 194 | config.onLineSelectionEnd(lastSelection) |
| 195 | }) |
| 196 | } |
| 197 | |
| 198 | const scheduleDragUpdate = () => { |
| 199 | if (dragFrame !== undefined) return |
| 200 | dragFrame = requestAnimationFrame(() => { |
| 201 | dragFrame = undefined |
| 202 | const selected = config.buildDragSelection() |
| 203 | if (selected) config.setSelectedLines(selected) |
| 204 | }) |
| 205 | } |
| 206 | |
| 207 | // -- mouse handlers -- |
| 208 | |
| 209 | const handleMouseDown = (event: MouseEvent) => { |
| 210 | if (!config.enableLineSelection()) return |
| 211 | if (event.button !== 0) return |
| 212 | |
| 213 | const hit = config.lineFromMouseEvent(event) |
| 214 | if (hit.numberColumn) { |
| 215 | bridge.begin(true, hit.line) |
| 216 | return |
no test coverage detected