import clsx from 'clsx'; import { useCallback } from 'react'; import { Graph } from '@/models/Graph'; import { IconGraphCollapse, IconGraphCore, IconGraphExpand, IconGraphInputs, IconGraphInverse, IconGraphMaximize, IconGraphOutputs, IconPredecessor, IconReset } from '../Icons'; import { CProps } from '../props'; import MiniButton from '../ui/MiniButton'; interface ToolbarGraphSelectionProps extends CProps.Styling { graph: Graph; isCore: (item: number) => boolean; isOwned: (item: number) => boolean; setSelected: React.Dispatch>; emptySelection?: boolean; } function ToolbarGraphSelection({ className, graph, isCore, isOwned, setSelected, emptySelection, ...restProps }: ToolbarGraphSelectionProps) { const handleSelectCore = useCallback(() => { const core = [...graph.nodes.keys()].filter(isCore); setSelected([...core, ...graph.expandInputs(core)]); }, [setSelected, graph, isCore]); const handleSelectOwned = useCallback( () => setSelected([...graph.nodes.keys()].filter(isOwned)), [setSelected, graph, isOwned] ); const handleInvertSelection = useCallback( () => setSelected(prev => [...graph.nodes.keys()].filter(item => !prev.includes(item))), [setSelected, graph] ); return (
} onClick={() => setSelected([])} disabled={emptySelection} /> } onClick={() => setSelected(prev => [...prev, ...graph.expandAllInputs(prev)])} disabled={emptySelection} /> } onClick={() => setSelected(prev => [...prev, ...graph.expandAllOutputs(prev)])} disabled={emptySelection} /> } onClick={() => setSelected(prev => graph.maximizePart(prev))} disabled={emptySelection} /> } onClick={() => setSelected(prev => [...prev, ...graph.expandInputs(prev)])} disabled={emptySelection} /> } onClick={() => setSelected(prev => [...prev, ...graph.expandOutputs(prev)])} disabled={emptySelection} /> } onClick={handleInvertSelection} /> } onClick={handleSelectCore} /> } onClick={handleSelectOwned} />
); } export default ToolbarGraphSelection;