1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/// Synchronisation utilities between recursive navigation state and recursive render state
impl crate::titlebar::main::TitleBar {
/// Synchronize navigation state from render state
/// Call this after any direct render state manipulation
pub fn sync_navigation_from_render(&mut self) {
let depth = self.render_state.get_current_depth();
// Clear navigation state
self.recursive_state.reset();
// Copy render path to navigation state
for d in 0..depth {
if let Some(_menu_index) = self.render_state.get_open_menu_at_depth(d) {
if let Some(selection) = self.render_state.get_selection_at_depth(d) {
self.recursive_state.set_selection_at_depth(d, selection);
}
}
}
}
/// Open menu at specific depth using recursive system
pub fn open_menu_recursive(&mut self, depth: usize, menu_index: usize, selection: usize) {
self.render_state
.open_menu_at_depth(depth, menu_index, selection);
self.sync_navigation_from_render();
}
/// Close menu from specific depth using recursive system
pub fn close_menu_from_depth(&mut self, depth: usize) {
self.render_state.close_menus_from_depth(depth);
self.sync_navigation_from_render();
}
/// Go deeper in menu hierarchy using recursive system
pub fn go_deeper_recursive(&mut self, item_index: usize) {
// Get current depth to determine what we're opening
let current_depth = self.render_state.get_current_depth();
if current_depth == 0 {
// We're at main menu level, open submenu
if let Some(menu_item) = self.menu_items_with_submenus.get(item_index) {
if !menu_item.subitems.is_empty() {
self.render_state.go_deeper(item_index);
}
}
} else {
// We're in a submenu, need to navigate through the hierarchy
// Start from the root menu
if let Some(root_menu_index) = self.render_state.get_open_menu_at_depth(0) {
if let Some(root_menu) = self.menu_items_with_submenus.get(root_menu_index) {
let mut current_items = &root_menu.subitems;
// Navigate through intermediate levels
for depth in 1..current_depth {
if let Some(selection) = self.render_state.get_selection_at_depth(depth) {
if let Some(item) = current_items.get(selection) {
current_items = &item.children;
} else {
return;
}
}
}
// Now try to open the child submenu at current level
if let Some(selected_item) = current_items.get(item_index) {
if !selected_item.children.is_empty() {
// Open child submenu at this level
self.render_state.go_deeper(item_index);
}
}
}
}
}
self.sync_navigation_from_render();
}
/// Go up in menu hierarchy using recursive system
pub fn go_up_recursive(&mut self) -> bool {
let result = self.render_state.go_up();
self.sync_navigation_from_render();
result
}
/// Update selection at specific depth using recursive system
pub fn update_selection_recursive(&mut self, depth: usize, selection: usize) {
self.render_state
.update_selection_at_depth(depth, selection);
self.sync_navigation_from_render();
}
/// Reset all menu states using recursive system
pub fn reset_all_menu_states(&mut self) {
self.render_state.reset();
self.recursive_state.reset();
}
}