import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' import { Resizable } from 're-resizable' import { useCallback, useMemo } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { SidebarType, sidebarPanes } from './ModelingPanes' import Tooltip from 'components/Tooltip' import { ActionIcon } from 'components/ActionIcon' import styles from './ModelingSidebar.module.css' import { ModelingPane } from './ModelingPane' import { isTauri } from 'lib/isTauri' import { useModelingContext } from 'hooks/useModelingContext' import { CustomIconName } from 'components/CustomIcon' import { useCommandsContext } from 'hooks/useCommandsContext' import { IconDefinition } from '@fortawesome/free-solid-svg-icons' interface ModelingSidebarProps { paneOpacity: '' | 'opacity-20' | 'opacity-40' } export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) { const { commandBarSend } = useCommandsContext() const { settings } = useSettingsAuthContext() const onboardingStatus = settings.context.app.onboardingStatus const { send, context } = useModelingContext() const pointerEventsCssClass = context.store?.buttonDownInStream || onboardingStatus.current === 'camera' || context.store?.openPanes.length === 0 ? 'pointer-events-none ' : 'pointer-events-auto ' const showDebugPanel = settings.context.modeling.showDebugPanel const sidebarActions: SidebarAction[] = [ { id: 'export', title: 'Export part', icon: 'floppyDiskArrow', iconClassName: '!p-0', keybinding: 'Ctrl + Shift + E', action: () => commandBarSend({ type: 'Find and select command', data: { name: 'Export', groupId: 'modeling' }, }), }, ] // // Filter out the debug panel if it's not supposed to be shown // // TODO: abstract out for allowing user to configure which panes to show const filteredPanes = useMemo( () => (showDebugPanel.current ? sidebarPanes : sidebarPanes.filter((pane) => pane.id !== 'debug') ).filter( (pane) => !pane.hideOnPlatform || (isTauri() ? pane.hideOnPlatform === 'web' : pane.hideOnPlatform === 'desktop') ), [sidebarPanes, showDebugPanel.current] ) const togglePane = useCallback( (newPane: SidebarType) => { send({ type: 'Set context', data: { openPanes: context.store?.openPanes.includes(newPane) ? context.store?.openPanes.filter((pane) => pane !== newPane) : [...context.store?.openPanes, newPane], }, }) }, [context.store?.openPanes, send] ) return (
) } interface ModelingPaneButtonProps extends React.HTMLAttributes { paneConfig: { id: string title: string icon: CustomIconName | IconDefinition keybinding: string iconClassName?: string iconSize?: 'sm' | 'md' | 'lg' } onClick: () => void paneIsOpen?: boolean } function ModelingPaneButton({ paneConfig, onClick, paneIsOpen, ...props }: ModelingPaneButtonProps) { useHotkeys(paneConfig.keybinding, onClick, { scopes: ['modeling'], }) return ( ) } export type SidebarAction = { id: string title: string icon: CustomIconName iconClassName?: string // Just until we get rid of FontAwesome icons keybinding: string action: () => void hideOnPlatform?: 'desktop' | 'web' }