start fixing ts errors

This commit is contained in:
Ross
2025-05-31 10:23:52 +01:00
parent be0d71d19d
commit c90c280255
3 changed files with 61 additions and 38 deletions
+61 -36
View File
@@ -21,6 +21,14 @@ import cornerstoneDICOMImageLoader from "@cornerstonejs/dicom-image-loader"
window.cornerstoneTools = cornerstoneTools; window.cornerstoneTools = cornerstoneTools;
type ViewportDiv = HTMLDivElement & {
_cornerstoneEnabled?: boolean;
_lastViewportType?: any;
_resizeObserver?: ResizeObserver;
_overlayListener?: EventListener;
};
const { MouseBindings, KeyboardBindings } = csToolsEnums; const { MouseBindings, KeyboardBindings } = csToolsEnums;
const { IMAGE_RENDERED } = Enums.Events; const { IMAGE_RENDERED } = Enums.Events;
@@ -142,6 +150,7 @@ function App() {
const [referenceLinesEnabled, setReferenceLinesEnabled] = useState(true); const [referenceLinesEnabled, setReferenceLinesEnabled] = useState(true);
const [showAdvancedMouseBindings, setShowAdvancedMouseBindings] = useState(false); const [showAdvancedMouseBindings, setShowAdvancedMouseBindings] = useState(false);
const [showAdvancedCtrlMouseBindings, setShowAdvancedCtrlMouseBindings] = useState(false);
const sortViewportImageIdsBySliceLocation = () => { const sortViewportImageIdsBySliceLocation = () => {
setViewportImageIds(prev => { setViewportImageIds(prev => {
@@ -222,7 +231,7 @@ function App() {
const [viewportMenuOpen, setViewportMenuOpen] = useState(false) const [viewportMenuOpen, setViewportMenuOpen] = useState(false)
// Store refs for each viewport // Store refs for each viewport
const viewportRefs = useRef<Array<HTMLDivElement | null>>([]) const viewportRefs = useRef<Array<ViewportDiv | null>>([]);
// Store the properties and scroll position of existing viewports before grid change // Store the properties and scroll position of existing viewports before grid change
const prevViewportProps = useRef<Record<number, any>>({}); const prevViewportProps = useRef<Record<number, any>>({});
@@ -702,13 +711,13 @@ function App() {
// Always (re-)attach overlay update for each viewport // Always (re-)attach overlay update for each viewport
if (element._overlayListener) { if ((element)._overlayListener) {
// Remove previous listener if present // Remove previous listener if present
viewport.element.removeEventListener(IMAGE_RENDERED, element._overlayListener); viewport.element.removeEventListener(IMAGE_RENDERED, (element)._overlayListener);
} }
const overlayListener = () => updateOverlay(i, viewport); const overlayListener = () => updateOverlay(i, viewport);
viewport.element.addEventListener(IMAGE_RENDERED, overlayListener); viewport.element.addEventListener(IMAGE_RENDERED, overlayListener);
element._overlayListener = overlayListener; (element)._overlayListener = overlayListener;
updateOverlay(i, viewport); updateOverlay(i, viewport);
} }
@@ -763,9 +772,9 @@ function App() {
// Cleanup: disconnect ResizeObservers // Cleanup: disconnect ResizeObservers
return () => { return () => {
viewportRefs.current.forEach(el => { viewportRefs.current.forEach(el => {
if (el && el._resizeObserver) { if (el && (el)._resizeObserver) {
el._resizeObserver.disconnect(); (el)._resizeObserver.disconnect();
delete el._resizeObserver; delete (el)._resizeObserver;
} }
}); });
cancelAnimationFrame(raf); cancelAnimationFrame(raf);
@@ -1329,7 +1338,6 @@ function App() {
position: "relative", position: "relative",
width: "99vw", width: "99vw",
height: "99vh", height: "99vh",
background: "#111",
padding: "12px", // <-- Add this line padding: "12px", // <-- Add this line
boxSizing: "border-box", // <-- Ensure padding doesn't shrink content boxSizing: "border-box", // <-- Ensure padding doesn't shrink content
background: "#222", background: "#222",
@@ -1620,7 +1628,7 @@ function App() {
fontSize: "15px", fontSize: "15px",
}} }}
onClick={() => { onClick={() => {
saveVisibleViewportState(viewportGrid, renderingEngineRef.current); saveVisibleViewportState();
setViewportGrid({ rows: opt.rows, cols: opt.cols }) setViewportGrid({ rows: opt.rows, cols: opt.cols })
setViewportMenuOpen(false) setViewportMenuOpen(false)
}} }}
@@ -1804,33 +1812,50 @@ function App() {
</div> </div>
))} ))}
{/* Expandable advanced ctrl+mouse bindings */} {/* Separate button for advanced Ctrl+Mouse bindings */}
{showAdvancedMouseBindings && ( <div style={{ margin: "12px 0" }}>
<div style={{ marginTop: 8 }}> <button
{ALL_MOUSE_BINDINGS.slice(3).map((btn) => ( style={{
<div key={btn.value + "_ctrl"} style={{ marginBottom: 10 }}> background: "#333",
<label style={{ marginRight: 8 }}>{btn.label} + Ctrl:</label> color: "#fff",
<select border: "none",
value={ctrlMouseToolBindings[btn.value] || ""} borderRadius: "4px",
onChange={e => setCtrlMouseToolBindings(prev => ({ ...prev, [btn.value]: e.target.value }))} padding: "4px 12px",
style={{ cursor: "pointer",
background: "#333", fontSize: "14px",
color: "#fff", marginBottom: "8px",
border: "1px solid #444", }}
borderRadius: "4px", onClick={() => setShowAdvancedCtrlMouseBindings(v => !v)}
padding: "4px 8px", >
fontSize: "14px", {showAdvancedCtrlMouseBindings ? "Hide" : "Show"} Advanced Ctrl + Mouse Bindings
}} </button>
> {showAdvancedCtrlMouseBindings && (
<option value="">(None)</option> <div style={{ marginTop: 8 }}>
{TOOL_OPTIONS.map(opt => ( {ALL_MOUSE_BINDINGS.slice(3).map((btn) => (
<option key={opt.value} value={opt.value}>{opt.label}</option> <div key={btn.value + "_ctrl"} style={{ marginBottom: 10 }}>
))} <label style={{ marginRight: 8 }}>{btn.label} + Ctrl:</label>
</select> <select
</div> value={ctrlMouseToolBindings[btn.value] || ""}
))} onChange={e => setCtrlMouseToolBindings(prev => ({ ...prev, [btn.value]: e.target.value }))}
</div> style={{
)} background: "#333",
color: "#fff",
border: "1px solid #444",
borderRadius: "4px",
padding: "4px 8px",
fontSize: "14px",
}}
>
<option value="">(None)</option>
{TOOL_OPTIONS.map(opt => (
<option key={opt.value} value={opt.value}>{opt.label}</option>
))}
</select>
</div>
))}
</div>
)}
</div>
</div> </div>
<button <button
style={{ style={{
-1
View File
@@ -1,7 +1,6 @@
import { api } from "dicomweb-client" import { api } from "dicomweb-client"
import cornerstoneDICOMImageLoader from "@cornerstonejs/dicom-image-loader" import cornerstoneDICOMImageLoader from "@cornerstonejs/dicom-image-loader"
import { readFile } from "dicom-parser"
/** /**
/** /**
* Uses dicomweb-client to fetch metadata of a study, cache it in cornerstone, * Uses dicomweb-client to fetch metadata of a study, cache it in cornerstone,
@@ -1,7 +1,6 @@
import { api } from "dicomweb-client" import { api } from "dicomweb-client"
import cornerstoneDICOMImageLoader from "@cornerstonejs/dicom-image-loader" import cornerstoneDICOMImageLoader from "@cornerstonejs/dicom-image-loader"
import { readFile } from "dicom-parser"
/** /**
/** /**
* Uses dicomweb-client to fetch metadata of a study, cache it in cornerstone, * Uses dicomweb-client to fetch metadata of a study, cache it in cornerstone,