@@ -71,10 +71,45 @@ def _helpIntCounterWidget(self, item: Item) -> None:
7171 )
7272
7373 def _helpFileWidget (self , item : Item ) -> None :
74+ """Create a UI element with an input text field and a file picker."""
75+
76+ def file_picker_callback (_sender : str , app_data : dict [str , Any ]) -> None :
77+ """Update the input text field with the selected file path."""
78+
79+ file_path = ""
80+ # User may have selected and edited, or just written a name
81+ user_input_path = Path (app_data .get ("file_path_name" , "" ))
82+
83+ # Get the selection if possible
84+ selected_path = Path (next (iter (app_data .get ("selections" , {}).values ()), "" ))
85+
86+ if user_input_path .stem == selected_path .stem :
87+ file_path = selected_path
88+ # User may have selected and edited, or just written a name
89+ else :
90+ file_path = user_input_path .stem + Path (item .default or "" ).suffix
91+ dpg .set_value (item .dest , str (file_path ))
92+
7493 with dpg .group (horizontal = False ):
7594 self ._helpText (item )
95+
7696 dpg .add_input_text (tag = item .dest , default_value = (item .default or "" ))
7797
98+ dpg .add_button (
99+ label = "Browse" , callback = lambda : dpg .show_item (f"{ item .dest } _file_dialog" )
100+ )
101+
102+ with dpg .file_dialog (
103+ directory_selector = False ,
104+ show = False ,
105+ callback = file_picker_callback ,
106+ id = f"{ item .dest } _file_dialog" ,
107+ width = 650 ,
108+ height = 400 ,
109+ file_count = 1 ,
110+ ):
111+ dpg .add_file_extension (".*" , color = hex_to_rgb (self .base24Theme [13 ]))
112+
78113 def _helpDropdownWidget (self , item : Item ) -> None :
79114 with dpg .group (horizontal = False ):
80115 self ._helpText (item )
@@ -305,8 +340,17 @@ def main(
305340
306341 # Define "Run" and "Exit" buttons
307342 def _run_callback () -> None :
308- _items = [item for item in items if item .dest ]
309- myd = {f"{ item .dest } { SEP } { item .type } " : dpg .get_value (item .dest ) for item in _items }
343+ _items : list [Item ] = [item for item in items if item .dest ]
344+ myd = {}
345+ for item in _items :
346+ value = dpg .get_value (item .dest )
347+ key = f"{ item .dest } { SEP } { item .type } "
348+ if item .type in [ItemType .File , ItemType .FileWrite ]:
349+ prop = item .additional_properties
350+ key += f";{ prop .get ('file_mode' )} ;{ prop .get ('file_encoding' )} "
351+
352+ myd [key ] = value
353+
310354 run_callback (myd )
311355
312356 def close_dpg () -> None :
0 commit comments