handle visible/invisible items
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
Reference in New Issue
Block a user