|
362 | 362 |
|
363 | 363 |
|
364 | 364 | function renderBounds() { |
| 365 | + fxctx.setTransform(1, 0, 0, 1, 0, 0); |
| 366 | + fxctx.clearRect(0, 0, fxCanvas.width, fxCanvas.height); |
365 | 367 | setTransform(bctx); |
366 | 368 | setTransform(fxctx); |
367 | 369 | bctx.fillStyle = "#2a2f38"; |
|
902 | 904 | safeSetChecked(onion, onionEnabled); |
903 | 905 | safeSetChecked(psnap, playSnapped); |
904 | 906 | toggle?.addEventListener("click", () => { |
905 | | - if (isPlaying) pausePlayback(); else startPlayback(); |
| 907 | + if (isPlaying) { |
| 908 | + pausePlayback(); |
| 909 | + toggle.classList.remove("playing"); |
| 910 | + } else { |
| 911 | + startPlayback(); |
| 912 | + toggle.classList.add("playing"); |
| 913 | + } |
906 | 914 | }); |
907 | 915 | prevF?.addEventListener("click", () => gotoFrame(stepBySnap(-1))); |
908 | 916 | nextF?.addEventListener("click", () => gotoFrame(stepBySnap(1))); |
|
919 | 927 | safeSetValue(snapValue, v); |
920 | 928 | updateHUD(); |
921 | 929 | }); |
| 930 | + const gridToggle = $("tlGridBtn"); |
| 931 | + const gridSnapToggle = $("tlGridSnapBtn"); |
| 932 | + const rulersToggle = $("tlRulersBtn"); |
| 933 | + const guideSnapToggle = $("tlGuideSnapBtn"); |
| 934 | + const addHGuideBtn = $("addHGuideBtn"); |
| 935 | + const addVGuideBtn = $("addVGuideBtn"); |
| 936 | + const clearGuidesBtn = $("clearGuidesBtn"); |
| 937 | + const guideModeHint = $("guideModeHint"); |
| 938 | + const gridSizeInput = $("tlGridSize"); |
| 939 | + |
| 940 | + let guidePlacementMode = null; |
| 941 | + |
| 942 | + if (gridToggle) { |
| 943 | + gridToggle.addEventListener("click", e => { |
| 944 | + gridEnabled = !gridEnabled; |
| 945 | + gridToggle.classList.toggle("active", gridEnabled); |
| 946 | + queueRenderAll(); |
| 947 | + }); |
| 948 | + } |
| 949 | + if (gridSizeInput) { |
| 950 | + gridSizeInput.addEventListener("change", e => { |
| 951 | + const v = Math.max(8, Math.min(128, parseInt(e.target.value) || 32)); |
| 952 | + gridSize = v; |
| 953 | + e.target.value = v; |
| 954 | + queueRenderAll(); |
| 955 | + }); |
| 956 | + } |
| 957 | + if (gridSnapToggle) { |
| 958 | + gridSnapToggle.addEventListener("click", e => { |
| 959 | + gridSnap = !gridSnap; |
| 960 | + gridSnapToggle.classList.toggle("active", gridSnap); |
| 961 | + }); |
| 962 | + } |
| 963 | + if (rulersToggle) { |
| 964 | + rulersToggle.addEventListener("click", e => { |
| 965 | + rulersEnabled = !rulersEnabled; |
| 966 | + rulersToggle.classList.toggle("active", rulersEnabled); |
| 967 | + queueRenderAll(); |
| 968 | + }); |
| 969 | + } |
| 970 | + if (guideSnapToggle) { |
| 971 | + guideSnapToggle.addEventListener("click", e => { |
| 972 | + guideSnap = !guideSnap; |
| 973 | + guideSnapToggle.classList.toggle("active", guideSnap); |
| 974 | + }); |
| 975 | + } |
| 976 | + function setGuidePlacementMode(mode) { |
| 977 | + guidePlacementMode = mode; |
| 978 | + if (addHGuideBtn) addHGuideBtn.classList.toggle("active", mode === "horizontal"); |
| 979 | + if (addVGuideBtn) addVGuideBtn.classList.toggle("active", mode === "vertical"); |
| 980 | + if (guideModeHint) { |
| 981 | + guideModeHint.hidden = !mode; |
| 982 | + guideModeHint.textContent = mode === "horizontal" ? "Click Canvas To Place H Guide" : mode === "vertical" ? "Click Canvas To Place V Guide" : ""; |
| 983 | + } |
| 984 | + if (!mode) { |
| 985 | + document.body.classList.remove("guide-place-mode"); |
| 986 | + document.body.classList.remove("guide-place-h"); |
| 987 | + document.body.classList.remove("guide-place-v"); |
| 988 | + } else { |
| 989 | + document.body.classList.add("guide-place-mode"); |
| 990 | + document.body.classList.toggle("guide-place-h", mode === "horizontal"); |
| 991 | + document.body.classList.toggle("guide-place-v", mode === "vertical"); |
| 992 | + } |
| 993 | + } |
| 994 | + if (addHGuideBtn) { |
| 995 | + addHGuideBtn.addEventListener("click", e => { |
| 996 | + if (guidePlacementMode === "horizontal") { |
| 997 | + setGuidePlacementMode(null); |
| 998 | + } else { |
| 999 | + setGuidePlacementMode("horizontal"); |
| 1000 | + } |
| 1001 | + }); |
| 1002 | + } |
| 1003 | + if (addVGuideBtn) { |
| 1004 | + addVGuideBtn.addEventListener("click", e => { |
| 1005 | + if (guidePlacementMode === "vertical") { |
| 1006 | + setGuidePlacementMode(null); |
| 1007 | + } else { |
| 1008 | + setGuidePlacementMode("vertical"); |
| 1009 | + } |
| 1010 | + }); |
| 1011 | + } |
| 1012 | + if (clearGuidesBtn) { |
| 1013 | + clearGuidesBtn.addEventListener("click", () => { |
| 1014 | + guides = []; |
| 1015 | + queueRenderAll(); |
| 1016 | + }); |
| 1017 | + } |
| 1018 | + window.__celstompSetGuidePlacementMode = setGuidePlacementMode; |
922 | 1019 | function rebuildTimelineKeepFrame() { |
923 | 1020 | const cur = currentFrame; |
924 | 1021 | buildTimeline(); |
|
953 | 1050 | const showLeft = $("showLeftEdge"); |
954 | 1051 | const showRight = $("showRightEdge"); |
955 | 1052 | const showTl = $("showTimelineEdge"); |
| 1053 | + const timelineEl = $("timeline"); |
956 | 1054 | const tLeft = $("toggleSidebarBtn"); |
957 | 1055 | const tRight = $("toggleRightbarBtn"); |
958 | 1056 | function applyLayoutChange() { |
|
974 | 1072 | } |
975 | 1073 | function setTimelineOpen(open) { |
976 | 1074 | app.classList.toggle("tl-collapsed", !open); |
| 1075 | + document.body?.classList.toggle("tl-collapsed", !open); |
| 1076 | + if (timelineEl) { |
| 1077 | + timelineEl.hidden = !open; |
| 1078 | + timelineEl.style.display = open ? "" : "none"; |
| 1079 | + timelineEl.setAttribute("aria-hidden", open ? "false" : "true"); |
| 1080 | + } |
| 1081 | + if (showTl) { |
| 1082 | + showTl.style.display = open ? "none" : "block"; |
| 1083 | + } |
977 | 1084 | applyLayoutChange(); |
978 | 1085 | } |
| 1086 | + if (!document._celstompPanelToggleDelegated) { |
| 1087 | + document._celstompPanelToggleDelegated = true; |
| 1088 | + document.addEventListener("click", e => { |
| 1089 | + if (e.target.closest("#hideLeftPanelBtn")) setLeftOpen(false); |
| 1090 | + if (e.target.closest("#hideRightPanelBtn")) setRightOpen(false); |
| 1091 | + if (e.target.closest("#hideTimelineBtn")) setTimelineOpen(false); |
| 1092 | + if (e.target.closest("#showLeftEdge")) setLeftOpen(true); |
| 1093 | + if (e.target.closest("#showRightEdge")) setRightOpen(true); |
| 1094 | + if (e.target.closest("#showTimelineEdge")) setTimelineOpen(true); |
| 1095 | + }); |
| 1096 | + } |
979 | 1097 | setLeftOpen(true); |
980 | 1098 | setRightOpen(true); |
981 | 1099 | setTimelineOpen(true); |
|
0 commit comments