useFocus
The useFocus hook provides business logic for changing the pan offset and zoom values in order to focus on specific areas of the viewport. It returns three functions: focusDesignArea, focusRegion, and focusItem.
focusDesignArea takes two arguments: the id of the panel to focus, and an optional options object with the following interface:
| name | type | required | comment |
|---|---|---|---|
animateOnPan | boolean | no | If true, set the |
changeZoom | boolean | no | Whether or not to actually change the zoom value when focusing. Default value: true |
Generally, focusDesignArea can be called when the experience loads, since the default zoom and pan values aren't likely to be useful.
focusRegion takes three arguments: The panelId within which to focus, a box with an x, y, width, and height
that defines the region to be focused, and an optional options object with the following interface:
| name | type | required | comment |
|---|---|---|---|
animateOnPan | boolean | no | If true, set the |
changeZoom | boolean | no | Whether or not to actually change the zoom value when focusing. Default value: true |
margins | Margins | no | An object with |
restrictToPanelBoundary | boolean | no | If the area requested to be focused is larger than the panel in some dimension, then constrain on the dimensions of the panel. Default value: true |
Lastly, focusItem takes two arguments: The id of the item to focus, and the same options object as focusRegion.
Check out the interactive demo below the example code block.
const FocusControls = observer(() => {
const { focusDesignArea, focusItem } = useFocus();
const designEngine = useDesignEngine();
const { panContainer } = useLayoutContainers();
const idaStore = designEngine.idaStore;
useEffect(() => {
if (panContainer) {
// Focus the first panel when the design starts
focusDesignArea(designEngine.cimDocStore.panels[0].id);
}
}, [panContainer]);
const selectedId = idaStore.selectedIds.size === 1 ? [...idaStore.selectedIds.values()][0] : undefined;
return (
<div>
<div>
<button onClick={() => focusDesignArea(designEngine.cimDocStore.panels[0].id)}>
Focus first panel
</button>
<button onClick={() => focusDesignArea(designEngine.cimDocStore.panels[1].id)}>
Focus second panel
</button>
<button
onClick={() => {
if (selectedId) {
focusItem(selectedId, { margins: { top: 10, left: 10, right: 10, bottom: 10 } });
}
}}
disabled={idaStore.selectedIds.size !== 1}
>
Focus selected item
</button>
</div>
</div>
);
});