|
12 | 12 | </div> |
13 | 13 | </div> |
14 | 14 | <div class="scroll-area" ref="scrollArea" @scroll="onVirtualScroll" v-show="!isDisconnected"> |
15 | | - <div class="scroll-virtual-content"></div> |
| 15 | + <div class="scroll-virtual-content" ref="virtualScrollContent"></div> |
16 | 16 | </div> |
17 | 17 | </div> |
18 | 18 | <div class="tab-area"> |
@@ -51,6 +51,7 @@ const maxLogLines = 1000; |
51 | 51 | // テンプレート参照 |
52 | 52 | const logArea = ref<HTMLElement>(); |
53 | 53 | const scrollArea = ref<HTMLElement>(); |
| 54 | +const virtualScrollContent = ref<HTMLElement>(); |
54 | 55 | const tabArea = ref<InstanceType<typeof TabArea>>(); |
55 | 56 | const row = ref<HTMLElement[]>([]); |
56 | 57 |
|
@@ -284,13 +285,42 @@ const grepLineClicked = (lineNumber: number) => { |
284 | 285 | jumpLine(lineNumber); |
285 | 286 | }; |
286 | 287 |
|
| 288 | +// 仮想スクロールサイズ変更 |
| 289 | +const updateScrollAreaHeight = () => { |
| 290 | + if(!virtualScrollContent.value) { |
| 291 | + return; |
| 292 | + } |
| 293 | + if (row.value.length === 0) { |
| 294 | + virtualScrollContent.value.style.height = '0'; |
| 295 | + return; |
| 296 | + } |
| 297 | + const averageHeight = row.value.map(x => x.clientHeight).reduce((a, b) => a + b) / row.value.length; |
| 298 | + if (isNaN(averageHeight)) { |
| 299 | + return; |
| 300 | + } |
| 301 | + virtualScrollContent.value.style.height = averageHeight * totalLines.value + 'px'; |
| 302 | +} |
| 303 | +
|
287 | 304 | // ウォッチャー |
288 | 305 | watch(logs, () => { |
289 | 306 | minLineNumber.value = logs.value[0]?.lineNumber ?? 0; |
290 | 307 | maxLineNumber.value = logs.value[logs.value.length - 1]?.lineNumber ?? 0; |
291 | 308 | setupObserverForLogScroll(); |
| 309 | + nextTick(() => { |
| 310 | + updateScrollAreaHeight(); |
| 311 | + }); |
292 | 312 | }, { deep: true }); |
293 | 313 |
|
| 314 | +watch(totalLines, () => { |
| 315 | + updateScrollAreaHeight(); |
| 316 | +}); |
| 317 | +
|
| 318 | +watch(() => props.wrapLines, () =>{ |
| 319 | + nextTick(() => { |
| 320 | + updateScrollAreaHeight(); |
| 321 | + }); |
| 322 | +}); |
| 323 | +
|
294 | 324 | onMounted(() => { |
295 | 325 | // テスト用 |
296 | 326 | if (!window.chrome?.webview) { |
@@ -345,7 +375,7 @@ onMounted(() => { |
345 | 375 | white-space: pre; |
346 | 376 | border-collapse: collapse; |
347 | 377 | flex: 1; |
348 | | - overflow: scroll; |
| 378 | + overflow: auto; |
349 | 379 | width: 100%; |
350 | 380 | } |
351 | 381 | /* 右:スクロールバー */ |
|
0 commit comments