handle visible/invisible items

This commit is contained in:
wass08
2026-02-02 10:33:36 +09:00
parent f98ead4585
commit 549bfb3f29
10 changed files with 13 additions and 4 deletions
@@ -59,6 +59,7 @@ export function CeilingTreeNode({ node, depth }: CeilingTreeNodeProps) {
onMouseLeave={handleMouseLeave} onMouseLeave={handleMouseLeave}
isSelected={isSelected} isSelected={isSelected}
isHovered={isHovered} isHovered={isHovered}
isVisible={node.visible !== false}
actions={<TreeNodeActions node={node} />} actions={<TreeNodeActions node={node} />}
> >
{node.children.map((childId) => ( {node.children.map((childId) => (
@@ -67,6 +67,7 @@ export function ItemTreeNode({ node, depth }: ItemTreeNodeProps) {
onMouseLeave={handleMouseLeave} onMouseLeave={handleMouseLeave}
isSelected={isSelected} isSelected={isSelected}
isHovered={isHovered} isHovered={isHovered}
isVisible={node.visible !== false}
actions={<TreeNodeActions node={node} />} actions={<TreeNodeActions node={node} />}
/> />
</RenamePopover> </RenamePopover>
@@ -59,6 +59,7 @@ export function RoofTreeNode({ node, depth }: RoofTreeNodeProps) {
onMouseLeave={handleMouseLeave} onMouseLeave={handleMouseLeave}
isSelected={isSelected} isSelected={isSelected}
isHovered={isHovered} isHovered={isHovered}
isVisible={node.visible !== false}
actions={<TreeNodeActions node={node} />} actions={<TreeNodeActions node={node} />}
/> />
</RenamePopover> </RenamePopover>
@@ -58,6 +58,7 @@ export function SlabTreeNode({ node, depth }: SlabTreeNodeProps) {
onMouseLeave={handleMouseLeave} onMouseLeave={handleMouseLeave}
isSelected={isSelected} isSelected={isSelected}
isHovered={isHovered} isHovered={isHovered}
isVisible={node.visible !== false}
actions={<TreeNodeActions node={node} />} actions={<TreeNodeActions node={node} />}
/> />
</RenamePopover> </RenamePopover>
@@ -58,6 +58,7 @@ interface TreeNodeWrapperProps {
children?: React.ReactNode; children?: React.ReactNode;
isSelected?: boolean; isSelected?: boolean;
isHovered?: boolean; isHovered?: boolean;
isVisible?: boolean;
} }
export const TreeNodeWrapper = forwardRef<HTMLDivElement, TreeNodeWrapperProps>( export const TreeNodeWrapper = forwardRef<HTMLDivElement, TreeNodeWrapperProps>(
@@ -77,6 +78,7 @@ export const TreeNodeWrapper = forwardRef<HTMLDivElement, TreeNodeWrapperProps>(
children, children,
isSelected, isSelected,
isHovered, isHovered,
isVisible = true,
}, },
ref ref
) { ) {
@@ -89,7 +91,8 @@ export const TreeNodeWrapper = forwardRef<HTMLDivElement, TreeNodeWrapperProps>(
? "text-primary-foreground bg-primary/80 hover:bg-primary/90" ? "text-primary-foreground bg-primary/80 hover:bg-primary/90"
: isHovered : isHovered
? "bg-accent/70 text-foreground" ? "bg-accent/70 text-foreground"
: "text-muted-foreground hover:bg-accent/50" : "text-muted-foreground hover:bg-accent/50",
!isVisible && "opacity-50"
)} )}
style={{ paddingLeft: depth * 12 + 4 }} style={{ paddingLeft: depth * 12 + 4 }}
onMouseEnter={onMouseEnter} onMouseEnter={onMouseEnter}
@@ -62,6 +62,7 @@ export function WallTreeNode({ node, depth }: WallTreeNodeProps) {
onMouseLeave={handleMouseLeave} onMouseLeave={handleMouseLeave}
isSelected={isSelected} isSelected={isSelected}
isHovered={isHovered} isHovered={isHovered}
isVisible={node.visible !== false}
actions={<TreeNodeActions node={node} />} actions={<TreeNodeActions node={node} />}
> >
{node.children.map((childId) => ( {node.children.map((childId) => (
@@ -37,7 +37,7 @@ export const ItemRenderer = ({ node }: { node: ItemNode }) => {
useRegistry(node.id, node.type, ref) useRegistry(node.id, node.type, ref)
return ( return (
<group position={node.position} rotation={node.rotation} ref={ref}> <group position={node.position} rotation={node.rotation} ref={ref} visible={node.visible}>
<Suspense> <Suspense>
<ModelRenderer node={node} /> <ModelRenderer node={node} />
</Suspense> </Suspense>
@@ -17,6 +17,7 @@ export const RoofRenderer = ({ node }: { node: RoofNode }) => {
receiveShadow receiveShadow
position={node.position} position={node.position}
rotation-y={node.rotation} rotation-y={node.rotation}
visible={node.visible}
{...handlers} {...handlers}
> >
{/* RoofSystem will replace this geometry in the next frame */} {/* RoofSystem will replace this geometry in the next frame */}
@@ -11,7 +11,7 @@ export const SlabRenderer = ({ node }: { node: SlabNode }) => {
const handlers = useNodeEvents(node, 'slab') const handlers = useNodeEvents(node, 'slab')
return ( return (
<mesh ref={ref} castShadow receiveShadow {...handlers}> <mesh ref={ref} castShadow receiveShadow {...handlers} visible={node.visible}>
{/* SlabSystem will replace this geometry in the next frame */} {/* SlabSystem will replace this geometry in the next frame */}
<boxGeometry args={[0, 0, 0]} /> <boxGeometry args={[0, 0, 0]} />
<meshStandardMaterial color="#e5e5e5" /> <meshStandardMaterial color="#e5e5e5" />
@@ -12,7 +12,7 @@ export const WallRenderer = ({ node }: { node: WallNode }) => {
const handlers = useNodeEvents(node, 'wall') const handlers = useNodeEvents(node, 'wall')
return ( return (
<mesh ref={ref} castShadow receiveShadow> <mesh ref={ref} castShadow receiveShadow visible={node.visible}>
{/* WallSystem will replace this geometry in the next frame */} {/* WallSystem will replace this geometry in the next frame */}
<boxGeometry args={[0, 0, 0]} /> <boxGeometry args={[0, 0, 0]} />
<meshStandardMaterial color="lightgray" /> <meshStandardMaterial color="lightgray" />