diff --git a/extensions/default/src/ViewerLayout/index.jsx b/extensions/default/src/ViewerLayout/index.jsx index 737dd25c2..ef6cabfcf 100644 --- a/extensions/default/src/ViewerLayout/index.jsx +++ b/extensions/default/src/ViewerLayout/index.jsx @@ -4,56 +4,10 @@ import { SidePanel, ErrorBoundary } from '@ohif/ui'; import Header from './Header.jsx'; import NestedMenu from './ToolbarButtonNestedMenu.jsx'; -function ViewerLayout({ - // From Extension Module Params - extensionManager, - servicesManager, - commandsManager, - // From Modes - leftPanels, - rightPanels, - viewports, - children, - ViewportGridComp, -}) { +// TODO: Having ToolbarPrimary and ToolbarSecondary is ugly, but +// these are going to be unified shortly so this is good enough for now. +function ToolbarPrimary({servicesManager}) { const { ToolBarService } = servicesManager.services; - /** - * Set body classes (tailwindcss) that don't allow vertical - * or horizontal overflow (no scrolling). Also guarantee window - * is sized to our viewport. - */ - useEffect(() => { - document.body.classList.add('bg-black'); - document.body.classList.add('overflow-hidden'); - return () => { - document.body.classList.remove('bg-black'); - document.body.classList.remove('overflow-hidden'); - }; - }, []); - - const getPanelData = id => { - const entry = extensionManager.getModuleEntry(id); - // TODO, not sure why sidepanel content has to be JSX, and not a children prop? - const content = entry.component; - - return { - iconName: entry.iconName, - iconLabel: entry.iconLabel, - label: entry.label, - name: entry.name, - content, - }; - }; - - const getViewportComponentData = viewportComponent => { - const entry = extensionManager.getModuleEntry(viewportComponent.namespace); - - return { - component: entry.component, - displaySetsToDisplay: viewportComponent.displaySetsToDisplay, - }; - }; - const defaultTool = { icon: 'tool-more-menu', label: 'More', @@ -99,6 +53,141 @@ function ViewerLayout({ return unsubscribe; }, [ToolBarService]); + return <> + {toolbars.primary.map((toolDef, index) => { + const isNested = Array.isArray(toolDef); + if (!isNested) { + const { id, Component, componentProps } = toolDef; + return ; + } else { + return ( + +
+ {toolDef.map(x => { + const { id, Component, componentProps } = x; + return ( + + ); + })} +
+
+ ); + } + })} + +} + +function ToolbarSecondary({servicesManager}) { + const { ToolBarService } = servicesManager.services; + const defaultTool = { + icon: 'tool-more-menu', + label: 'More', + isActive: false, + }; + const [toolbars, setToolbars] = useState({ primary: [], secondary: [] }); + const [activeTool, setActiveTool] = useState(defaultTool); + + const setActiveToolHandler = (tool, isNested) => { + setActiveTool(isNested ? tool : defaultTool); + }; + + const onPrimaryClickHandler = (evt, btn) => { + if ( + btn.props && + btn.props.commands && + evt.value && + btn.props.commands[evt.value] + ) { + const { commandName, commandOptions } = btn.props.commands[evt.value]; + commandsManager.runCommand(commandName, commandOptions); + } + }; + + useEffect(() => { + const { unsubscribe } = ToolBarService.subscribe( + ToolBarService.EVENTS.TOOL_BAR_MODIFIED, + () => { + console.warn('~~~ TOOL BAR MODIFIED EVENT CAUGHT'); + const updatedToolbars = { + primary: ToolBarService.getButtonSection('primary', { + onClick: onPrimaryClickHandler, + setActiveTool: setActiveToolHandler, + }), + secondary: ToolBarService.getButtonSection('secondary', { + setActiveTool: setActiveToolHandler, + }), + }; + setToolbars(updatedToolbars); + } + ); + + return unsubscribe; + }, [ToolBarService]); + + return <> + {toolbars.secondary.map(toolDef => { + const { id, Component, componentProps } = toolDef; + return ; + })} + +} + + +function ViewerLayout({ + // From Extension Module Params + extensionManager, + servicesManager, + commandsManager, + // From Modes + leftPanels, + rightPanels, + viewports, + children, + ViewportGridComp, +}) { + + /** + * Set body classes (tailwindcss) that don't allow vertical + * or horizontal overflow (no scrolling). Also guarantee window + * is sized to our viewport. + */ + useEffect(() => { + document.body.classList.add('bg-black'); + document.body.classList.add('overflow-hidden'); + return () => { + document.body.classList.remove('bg-black'); + document.body.classList.remove('overflow-hidden'); + }; + }, []); + + const getPanelData = id => { + const entry = extensionManager.getModuleEntry(id); + // TODO, not sure why sidepanel content has to be JSX, and not a children prop? + const content = entry.component; + + return { + iconName: entry.iconName, + iconLabel: entry.iconLabel, + label: entry.label, + name: entry.name, + content, + }; + }; + + const getViewportComponentData = viewportComponent => { + const entry = extensionManager.getModuleEntry(viewportComponent.namespace); + + return { + component: entry.component, + displaySetsToDisplay: viewportComponent.displaySetsToDisplay, + }; + }; + const leftPanelComponents = leftPanels.map(getPanelData); const rightPanelComponents = rightPanels.map(getPanelData); const viewportComponents = viewports.map(getViewportComponentData); @@ -108,31 +197,7 @@ function ViewerLayout({
- {toolbars.primary.map((toolDef, index) => { - const isNested = Array.isArray(toolDef); - if (!isNested) { - const { id, Component, componentProps } = toolDef; - return ; - } else { - return ( - -
- {toolDef.map(x => { - const { id, Component, componentProps } = x; - return ( - - ); - })} -
-
- ); - } - })} +
@@ -155,10 +220,7 @@ function ViewerLayout({
- {toolbars.secondary.map(toolDef => { - const { id, Component, componentProps } = toolDef; - return ; - })} +