@@ -4,45 +4,83 @@ import styled from "@emotion/styled";
44import { TreeView } from "@editor-ui/editor" ;
55import { ListView } from "@editor-ui/listview" ;
66import { LayerRow } from "./editor-layer-hierarchy-item" ;
7+ import { useEditorState } from "core/states" ;
78
89export function EditorLayerHierarchy ( ) {
10+ const [ state ] = useEditorState ( ) ;
11+ const root = state . design ?. current ?. entry ;
12+ const layers = root ? flatten ( root ) : [ ] ;
13+ const [ selected , setSelected ] = useState < string | null > ( null ) ;
14+
915 const renderItem = useCallback (
10- ( { id, name, depth } , index : number , { isDragging } : ListView . ItemInfo ) => {
16+ ( { id, name, depth } ) => {
1117 return (
1218 < LayerRow
1319 name = { name }
1420 depth = { depth }
1521 id = { id }
22+ expanded = { haschildren ( id ) == true ? true : undefined }
1623 key = { id }
17- expanded = { false }
18- selected = { false }
24+ selected = { selected == id }
1925 onAddClick = { ( ) => { } }
2026 onMenuClick = { ( ) => { } }
2127 onDoubleClick = { ( ) => { } }
22- onPress = { ( ) => { } }
28+ onPress = { ( ) => {
29+ setSelected ( id ) ;
30+ } }
2331 onSelectMenuItem = { ( ) => { } }
2432 onContextMenu = { ( ) => { } }
2533 />
2634 ) ;
2735 } ,
28- [ ]
36+ [ selected ]
2937 ) ;
3038
31- const pageInfo = [
32- { id : "1" , name : "Screen" , depth : 0 } ,
33- { id : "2" , name : "Layer 1" , depth : 0 } ,
34- { id : "3" , name : "Layer 2" , depth : 0 } ,
35- { id : "4" , name : "Layer 3" , depth : 0 } ,
36- { id : "5" , name : "Layer 4" , depth : 0 } ,
37- ] ;
39+ const haschildren = useCallback ( ( id : string ) => {
40+ return layers . some ( ( layer ) => layer . parent === id ) ;
41+ } , [ ] ) ;
42+
3843 return (
3944 < TreeView . Root
40- sortable = { true }
41- data = { pageInfo }
45+ data = { layers }
4246 keyExtractor = { useCallback ( ( item : any ) => item . id , [ ] ) }
43- // onMoveItem={}
44- acceptsDrop = { ( ) => false }
4547 renderItem = { renderItem }
4648 />
4749 ) ;
4850}
51+
52+ interface ITreeNode {
53+ id : string ;
54+ name : string ;
55+ children ?: ITreeNode [ ] ;
56+ }
57+
58+ interface FlattenedNode {
59+ id : string ;
60+ name : string ;
61+ depth : number ;
62+ parent : string ;
63+ }
64+
65+ const flatten = (
66+ tree : ITreeNode ,
67+ parent ?: string ,
68+ depth : number = 0
69+ ) : FlattenedNode [ ] => {
70+ const convert = ( node : ITreeNode , depth : number , parent ?: string ) => {
71+ const result : FlattenedNode = {
72+ id : node . id ,
73+ name : node . name ,
74+ depth : depth ,
75+ parent,
76+ } ;
77+ return result ;
78+ } ;
79+
80+ const final = [ ] ;
81+ final . push ( convert ( tree , depth , parent ) ) ;
82+ for ( const child of tree . children || [ ] ) {
83+ final . push ( ...flatten ( child , tree . id , depth + 1 ) ) ;
84+ }
85+ return final ;
86+ } ;
0 commit comments