start fixing ts errors
This commit is contained in:
+61
-36
@@ -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,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,
|
||||||
|
|||||||
Reference in New Issue
Block a user