1 local update_item_paths (directory : FileItem) : Unit = 2 assert directory.is_directory 3 let path = directory.path 4 assert path.is_not_empty 5 for item in directory.items do 6 let item_path = "$path/${item.name}" 7 item.path = item_path 8 directory_path = path 9 10 if item.is_directory then 11 update_item_paths item 12 13 type Editor 14 def move_vertical self (up : bool) = 15 let tree = self.tree 16 let maybe_selected_item = tree.selected_item 17 if maybe_selected_item.is_none then 18 return 19 20 let selected_item = maybe_selected_item.unwrap as FileItem 21 if selected_item.is_crate then 22 return 23 24 let parent = selected_item.parent.unwrap 25 let items = parent.items 26 let index = items.index_of selected_item 27 if up && index <> 0 || not up && index < items.size - 1 then 28 tree.selected_item = None 29 items.remove selected_item 30 let next_index = if up then index - 1 else index + 1 31 items.add next_index selected_item 32 tree.selected_item = selected_item 33 self.changed.add parent 34 35 def move_horizontal self (left : bool) = 36 let tree = self.tree 37 let maybe_selected_item = tree.selected_item 38 if maybe_selected_item.is_none then 39 return 40 41 let selected_item = maybe_selected_item.unwrap as FileItem 42 if selected_item.is_crate then 43 return 44 45 let parent = selected_item.parent.unwrap 46 let items = parent.items 47 let index = items.index_of selected_item 48 if left && parent.parent.is_some then 49 let parent_parent = parent.parent.unwrap 50 let parent_items = parent_parent.items 51 let parent_index = parent_items.index_of parent 52 tree.selected_item = None 53 items.remove selected_item 54 parent_items.add (parent_index + 1) selected_item 55 selected_item.parent = parent_parent 56 tree.selected_item = selected_item 57 let path = "${parent_parent.path}/${selected_item.name}" 58 selected_item.path = path 59 assert parent_parent.path.is_not_empty 60 selected_item.directory_path = parent_parent.path 61 if selected_item.is_directory then 62 update_item_paths selected_item 63 self.add_all_to_changed selected_item 64 else 65 self.changed.add selected_item 66 67 self.changed.add parent 68 add parent_parent 69 70 else if not left && index > 0 then 71 let maybe_directory_index = 72 let mut result = None 73 for i = index - 1 downto 0 do 74 if items[i].is_directory then 75 result = Some i 76 break 77 78 result 79 80 if maybe_directory_index ? Some directory_index then 81 let directory_item = items[directory_index] 82 tree.selected_item = None 83 items.remove selected_item 84 directory_item.items.add selected_item 85 selected_item.parent = directory_item 86 tree.selected_item = selected_item 87 let path = "${directory_item.path}/${selected_item.name}" 88 selected_item.path = path 89 assert directory_item.path.is_not_empty 90 selected_item.directory_path = directory_item.path 91 if selected_item.is_directory then 92 update_item_paths selected_item 93 self.add_all_to_changed selected_item 94 else 95 self.changed.add selected_item 96 97 self.changed.add parent 98 add directory_item 99 100 if not directory_item.is_open then 101 directory_item.is_open = true 102