import { ArrowDownToLine, Check, Grid3X3, LockKeyhole, MapPinned, Move3d, Rotate3d, Scaling, Trash2, } from 'lucide-react'; import { Button, IconButton, Select, ToolbarToggleGroup, type ToolbarItem, } from '../../components/ui'; import { MAP_OBJECT_PLACEMENT_LABELS, type MapEditorTransformMode, type MapObjectPlacementMode, } from '../../map/editor/types'; const TRANSFORM_TOOLS: ToolbarItem[] = [ { value: 'translate', label: '移动工具 W', icon: Move3d }, { value: 'rotate', label: '旋转工具 E', icon: Rotate3d }, { value: 'scale', label: '缩放工具 R', icon: Scaling }, ]; export function MapViewportToolbar({ visible, interactionActive, mode, snapping, placementMode, hasSelectedObject, allowScale, loading, onActivate, onModeChange, onSnappingChange, onPlacementModeChange, onAlignToSurface, }: { visible: boolean; interactionActive: boolean; mode: MapEditorTransformMode; snapping: boolean; placementMode: MapObjectPlacementMode; hasSelectedObject: boolean; allowScale: boolean; loading: boolean; onActivate: () => void; onModeChange: (mode: MapEditorTransformMode) => void; onSnappingChange: (value: boolean) => void; onPlacementModeChange: (mode: MapObjectPlacementMode) => void; onAlignToSurface: () => void; }) { if (!visible) return null; return (
allowScale || item.value !== 'scale')} value={mode} onChange={onModeChange} label="地图变换模式" /> onSnappingChange(!snapping)} >
); } export function MapDraftStatusOverlay({ visible, changeCount, loading, onCommit, onDiscard, error, }: { visible: boolean; changeCount: number; loading: boolean; error?: string; onCommit: () => void; onDiscard: () => void; }) { const dirty = changeCount > 0; if (!visible || (!dirty && !loading && !error)) return null; return (
); } export interface MapAssetDropTarget { left: number; top: number; position: readonly [number, number, number] | null; } export function MapAssetDropIndicator({ target }: { target?: MapAssetDropTarget }) { if (!target) return null; const valid = Boolean(target.position); return (
{valid ? `释放放置 · ${target.position![0].toFixed(1)}, ${target.position![1].toFixed(1)}` : '请拖到 3D 地面'}
); }