|
350 | 350 |
|
351 | 351 |
|
352 | 352 | function renderBounds() { |
| 353 | + fxctx.setTransform(1, 0, 0, 1, 0, 0); |
| 354 | + fxctx.clearRect(0, 0, fxCanvas.width, fxCanvas.height); |
353 | 355 | setTransform(bctx); |
354 | 356 | setTransform(fxctx); |
355 | 357 | bctx.fillStyle = "#2a2f38"; |
|
358 | 360 | bctx.fillRect(0, 0, contentW, contentH); |
359 | 361 | bctx.strokeRect(0, 0, contentW, contentH); |
360 | 362 | drawRectSelectionOverlay(fxctx); |
| 363 | + drawLineToolPreview(fxctx); |
| 364 | + drawRectToolPreview(fxctx); |
| 365 | + drawGrid(fxctx); |
| 366 | + drawGuides(fxctx); |
361 | 367 | } |
362 | 368 |
|
363 | 369 | function onionCompositeOperation() { |
|
404 | 410 | function clearFx() { |
405 | 411 | fxctx.setTransform(1, 0, 0, 1, 0, 0); |
406 | 412 | fxctx.clearRect(0, 0, fxCanvas.width, fxCanvas.height); |
| 413 | + setTransform(fxctx); |
| 414 | + drawRectSelectionOverlay(fxctx); |
| 415 | + drawLineToolPreview(fxctx); |
| 416 | + drawRectToolPreview(fxctx); |
| 417 | + drawGrid(fxctx); |
| 418 | + drawGuides(fxctx); |
407 | 419 | } |
408 | 420 |
|
409 | 421 | function wireBrushButtonRightClick() { |
|
901 | 913 | safeSetValue(snapValue, v); |
902 | 914 | updateHUD(); |
903 | 915 | }); |
| 916 | + const gridToggle = $("tlGridBtn"); |
| 917 | + const gridSnapToggle = $("tlGridSnapBtn"); |
| 918 | + const rulersToggle = $("tlRulersBtn"); |
| 919 | + const guideSnapToggle = $("tlGuideSnapBtn"); |
| 920 | + const addHGuideBtn = $("addHGuideBtn"); |
| 921 | + const addVGuideBtn = $("addVGuideBtn"); |
| 922 | + const clearGuidesBtn = $("clearGuidesBtn"); |
| 923 | + const guideModeHint = $("guideModeHint"); |
| 924 | + const gridSizeInput = $("tlGridSize"); |
| 925 | + |
| 926 | + let guidePlacementMode = null; |
| 927 | + |
| 928 | + if (gridToggle) { |
| 929 | + gridToggle.addEventListener("click", e => { |
| 930 | + gridEnabled = !gridEnabled; |
| 931 | + gridToggle.classList.toggle("active", gridEnabled); |
| 932 | + queueRenderAll(); |
| 933 | + }); |
| 934 | + } |
| 935 | + if (gridSizeInput) { |
| 936 | + gridSizeInput.addEventListener("change", e => { |
| 937 | + const v = Math.max(8, Math.min(128, parseInt(e.target.value) || 32)); |
| 938 | + gridSize = v; |
| 939 | + e.target.value = v; |
| 940 | + queueRenderAll(); |
| 941 | + }); |
| 942 | + } |
| 943 | + if (gridSnapToggle) { |
| 944 | + gridSnapToggle.addEventListener("click", e => { |
| 945 | + gridSnap = !gridSnap; |
| 946 | + gridSnapToggle.classList.toggle("active", gridSnap); |
| 947 | + }); |
| 948 | + } |
| 949 | + if (rulersToggle) { |
| 950 | + rulersToggle.addEventListener("click", e => { |
| 951 | + rulersEnabled = !rulersEnabled; |
| 952 | + rulersToggle.classList.toggle("active", rulersEnabled); |
| 953 | + queueRenderAll(); |
| 954 | + }); |
| 955 | + } |
| 956 | + if (guideSnapToggle) { |
| 957 | + guideSnapToggle.addEventListener("click", e => { |
| 958 | + guideSnap = !guideSnap; |
| 959 | + guideSnapToggle.classList.toggle("active", guideSnap); |
| 960 | + }); |
| 961 | + } |
| 962 | + function setGuidePlacementMode(mode) { |
| 963 | + guidePlacementMode = mode; |
| 964 | + if (addHGuideBtn) addHGuideBtn.classList.toggle("active", mode === "horizontal"); |
| 965 | + if (addVGuideBtn) addVGuideBtn.classList.toggle("active", mode === "vertical"); |
| 966 | + if (guideModeHint) { |
| 967 | + guideModeHint.hidden = !mode; |
| 968 | + guideModeHint.textContent = mode === "horizontal" ? "Click Canvas To Place H Guide" : mode === "vertical" ? "Click Canvas To Place V Guide" : ""; |
| 969 | + } |
| 970 | + if (!mode) { |
| 971 | + document.body.classList.remove("guide-place-mode"); |
| 972 | + document.body.classList.remove("guide-place-h"); |
| 973 | + document.body.classList.remove("guide-place-v"); |
| 974 | + } else { |
| 975 | + document.body.classList.add("guide-place-mode"); |
| 976 | + document.body.classList.toggle("guide-place-h", mode === "horizontal"); |
| 977 | + document.body.classList.toggle("guide-place-v", mode === "vertical"); |
| 978 | + } |
| 979 | + } |
| 980 | + if (addHGuideBtn) { |
| 981 | + addHGuideBtn.addEventListener("click", e => { |
| 982 | + if (guidePlacementMode === "horizontal") { |
| 983 | + setGuidePlacementMode(null); |
| 984 | + } else { |
| 985 | + setGuidePlacementMode("horizontal"); |
| 986 | + } |
| 987 | + }); |
| 988 | + } |
| 989 | + if (addVGuideBtn) { |
| 990 | + addVGuideBtn.addEventListener("click", e => { |
| 991 | + if (guidePlacementMode === "vertical") { |
| 992 | + setGuidePlacementMode(null); |
| 993 | + } else { |
| 994 | + setGuidePlacementMode("vertical"); |
| 995 | + } |
| 996 | + }); |
| 997 | + } |
| 998 | + if (clearGuidesBtn) { |
| 999 | + clearGuidesBtn.addEventListener("click", () => { |
| 1000 | + guides = []; |
| 1001 | + queueRenderAll(); |
| 1002 | + }); |
| 1003 | + } |
| 1004 | + window.__celstompSetGuidePlacementMode = setGuidePlacementMode; |
904 | 1005 | function rebuildTimelineKeepFrame() { |
905 | 1006 | const cur = currentFrame; |
906 | 1007 | buildTimeline(); |
|
0 commit comments