11use crate :: app:: EguiApp ;
22use egui:: text:: LayoutJob ;
33use egui:: { ScrollArea , TextStyle } ;
4+ use java_asm:: StrRef ;
45use java_asm_server:: ui:: { AppContainer , FileEntry , FileInfo , OpenFileMessage , RawDirInfo , UIMessage } ;
56
67pub fn render_dir ( ui : & mut egui:: Ui , app : & mut EguiApp ) {
78 let server_app = & app. ui_app ;
89 let mut left = server_app. left ( ) . lock ( ) ;
9- let entries = & mut left. root_node . visible_items ( ) ;
10+ let offset_key = left. offset_key . clone ( ) ;
11+ let hint_key = left. hint_key . clone ( ) ;
12+ left. offset_key = None ; // set to none to avoid ui can't scrolling.
13+ let file_tree = & mut left. root_node . visible_items ( offset_key) ;
14+ let required_file_index = file_tree. required_file_index ;
15+ let entries = & mut file_tree. entries ;
1016 let server = app. server . lock ( ) ;
1117 if server. is_none ( ) { return ; }
1218 let row_height = ui. spacing ( ) . interact_size . y ;
13- let scroll_area = ScrollArea :: vertical ( ) . auto_shrink ( false ) ;
14- // scroll_area.vertical_scroll_offset();
19+ let mut scroll_area = ScrollArea :: vertical ( ) . auto_shrink ( false ) ;
20+
21+ if required_file_index > 0 {
22+ // scroll to the required file
23+ let required_file_index = required_file_index as f32 ;
24+ let row_height_with_spacing = row_height + ui. spacing ( ) . item_spacing . y ;
25+ let scroll_offset = row_height_with_spacing * required_file_index;
26+ let window_rect = ui. input ( |i : & egui:: InputState | i. screen_rect ( ) ) ;
27+ let window_height: f32 = window_rect. max [ 1 ] - window_rect. min [ 1 ] ;
28+ scroll_area = scroll_area. vertical_scroll_offset ( scroll_offset - window_height * 0.2 ) ;
29+ }
30+
1531 scroll_area. show_rows ( ui, row_height, entries. len ( ) , |ui, range| {
1632 for i in range {
1733 let entry = & mut entries[ i] ;
@@ -20,21 +36,27 @@ pub fn render_dir(ui: &mut egui::Ui, app: &mut EguiApp) {
2036 render_dir_raw ( ui, raw_dir, server_app) ;
2137 }
2238 FileEntry :: File ( file_info) => {
23- render_file ( ui, file_info, server_app) ;
39+ render_file ( ui, file_info, server_app, & hint_key ) ;
2440 }
2541 }
2642 }
2743 } ) ;
2844}
2945
3046fn render_file (
31- ui : & mut egui:: Ui , file_info : & mut FileInfo , app : & AppContainer ,
47+ ui : & mut egui:: Ui , file_info : & mut FileInfo , app : & AppContainer , hint : & Option < StrRef > ,
3248) {
3349 let FileInfo { title, file_key, level } = file_info;
3450 ui. horizontal ( |ui| {
3551 ui. add_space ( ( * level as f32 ) * 12.0 ) ;
3652 let layout_job = layout_string ( ui, title. to_string ( ) ) ;
37- let label = ui. selectable_label ( false , layout_job) ;
53+ let checked: bool ;
54+ if let Some ( hint) = hint {
55+ checked = hint == file_key;
56+ } else {
57+ checked = false ;
58+ }
59+ let label = ui. selectable_label ( checked, layout_job) ;
3860 if label. clicked ( ) {
3961 let message = UIMessage :: OpenFile (
4062 OpenFileMessage {
@@ -66,7 +88,8 @@ fn render_dir_raw(
6688 if new_opened {
6789 * opened = true ;
6890 } else {
69- // closed, close all child dir
91+ // need to close all child dir
92+ // so we passed a message to server
7093 app_container. send_message ( UIMessage :: CloseDir ( dir_info. dir_key . clone ( ) ) )
7194 }
7295 }
0 commit comments