1 let get_name (s : String) (items : obs/List<FileItem>) = 2 let are_equal (t : String) (u : String) = 3 if t == u 4 then true 5 else t.ends_with ".kd" && t.drop_last 3 == u 6 7 if not items.as_slice.any { are_equal _.name s } then 8 return s 9 else 10 let mut index = 1 11 repeat 12 let name = "${s}_$index" 13 if not items.as_slice.any { are_equal _.name name } then 14 return name 15 16 index += 1 17 18 type Editor 19 def create self (directory : bool) = 20 let tree = self.tree 21 let (parent, index) = case tree.selected_item.map { _ as FileItem } of 22 None -> (self.data, tree.data.items.size) 23 Some selected_item -> 24 if selected_item.is_crate then 25 let index = selected_item.items.size 26 (selected_item, index) 27 else 28 let parent = selected_item.parent.unwrap 29 let index = parent.items.index_of selected_item + 1 30 (parent, index) 31 32 let s = if directory then "directory" else "file" 33 let mut name = get_name s parent.items.as_readonly 34 if not directory then 35 name += ".kd" 36 37 assert parent.path.is_not_empty 38 let directory_path = parent.path 39 let path = "$directory_path/$name" 40 let item = FileItem 41 is_root = false 42 =parent =name =path =directory_path 43 is_directory = directory 44 is_open = directory 45 foreground = Colors.tree_foreground 46 47 parent.items.add index item 48 if not parent.is_open then 49 parent.is_open = true 50 51 tree.selected_item = item 52 self.changed.add item 53 add parent 54