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