@@ -208,13 +208,19 @@ pub enum FilePreviewerAction {
208208 Hide ,
209209}
210210
211+ /// Type alias for file data message sent through the channel.
212+ type FileLoadMessage = ( FilePreviewerMetaData , Vec < u8 > ) ;
213+
214+ /// Type alias for the receiver that gets file data.
215+ type FileLoadReceiver = std:: sync:: mpsc:: Receiver < FileLoadMessage > ;
216+
211217/// A widget that previews files by displaying metadata and content based on file type.
212218#[ derive( Live , Widget , LiveHook ) ]
213219pub struct FilePreviewer {
214220 #[ redraw] #[ deref] view : View ,
215221 #[ rust] file_type : FileType ,
216222 #[ rust] background_task_id : u32 ,
217- #[ rust] receiver : Option < ( u32 , std :: sync :: mpsc :: Receiver < ( FilePreviewerMetaData , Vec < u8 > ) > ) > ,
223+ #[ rust] receiver : Option < ( u32 , FileLoadReceiver ) > ,
218224 #[ rust] file_path : Option < PathBuf > ,
219225}
220226
@@ -304,50 +310,47 @@ impl MatchEvent for FilePreviewer {
304310 return ;
305311 }
306312 for action in actions {
307- match action. downcast_ref ( ) {
308- Some ( FilePreviewerAction :: Show { file_path } ) => {
309- self . view . button ( ids ! ( close_button) ) . reset_hover ( cx) ;
310- self . view . button ( ids ! ( close_button) ) . set_enabled ( cx, true ) ;
311- // Reset button states
312- self . view . button ( ids ! ( wrapper. buttons_view. cancel_button) ) . reset_hover ( cx) ;
313- self . view . button ( ids ! ( wrapper. buttons_view. cancel_button) ) . set_enabled ( cx, true ) ;
314- self . view . button ( ids ! ( wrapper. buttons_view. upload_button) ) . reset_hover ( cx) ;
315- self . view . button ( ids ! ( wrapper. buttons_view. upload_button) ) . set_enabled ( cx, true ) ;
316- // Store the context for later use when upload button is clicked
317- self . file_path = Some ( file_path. clone ( ) ) ;
318- let ( sender, receiver) = std:: sync:: mpsc:: channel ( ) ;
319- if let Some ( new_value) = self . background_task_id . checked_add ( 1 ) {
320- self . background_task_id = new_value;
321- }
322- self . receiver = Some ( ( self . background_task_id , receiver) ) ;
323- let file_path_clone = file_path. clone ( ) ;
324- let filename = file_path_clone
325- . file_name ( )
326- . and_then ( |n| n. to_str ( ) )
327- . unwrap_or ( "unknown" )
328- . to_string ( ) ;
329-
330- // Detect the mime type
331- let mime_str = mime_guess:: from_path ( & file_path_clone)
332- . first_or_octet_stream ( )
333- . to_string ( ) ;
334- use mime_guess:: mime;
335- let mime: mime:: Mime = mime_str. parse ( ) . unwrap_or ( mime:: APPLICATION_OCTET_STREAM ) ;
336-
337- cx. spawn_thread ( move || {
338- if let Ok ( file) = std:: fs:: read ( file_path_clone) {
339- let metadata = FilePreviewerMetaData {
340- filename,
341- mime,
342- file_size : file. len ( ) ,
343- } ;
344- let _ = sender. send ( ( metadata, file) ) ;
345- SignalToUI :: set_ui_signal ( ) ;
346- }
347- } ) ;
348- continue ;
313+ if let Some ( FilePreviewerAction :: Show { file_path } ) = action. downcast_ref ( ) {
314+ self . view . button ( ids ! ( close_button) ) . reset_hover ( cx) ;
315+ self . view . button ( ids ! ( close_button) ) . set_enabled ( cx, true ) ;
316+ // Reset button states
317+ self . view . button ( ids ! ( wrapper. buttons_view. cancel_button) ) . reset_hover ( cx) ;
318+ self . view . button ( ids ! ( wrapper. buttons_view. cancel_button) ) . set_enabled ( cx, true ) ;
319+ self . view . button ( ids ! ( wrapper. buttons_view. upload_button) ) . reset_hover ( cx) ;
320+ self . view . button ( ids ! ( wrapper. buttons_view. upload_button) ) . set_enabled ( cx, true ) ;
321+ // Store the context for later use when upload button is clicked
322+ self . file_path = Some ( file_path. clone ( ) ) ;
323+ let ( sender, receiver) = std:: sync:: mpsc:: channel ( ) ;
324+ if let Some ( new_value) = self . background_task_id . checked_add ( 1 ) {
325+ self . background_task_id = new_value;
349326 }
350- _ => { }
327+ self . receiver = Some ( ( self . background_task_id , receiver) ) ;
328+ let file_path_clone = file_path. clone ( ) ;
329+ let filename = file_path_clone
330+ . file_name ( )
331+ . and_then ( |n| n. to_str ( ) )
332+ . unwrap_or ( "unknown" )
333+ . to_string ( ) ;
334+
335+ // Detect the mime type
336+ let mime_str = mime_guess:: from_path ( & file_path_clone)
337+ . first_or_octet_stream ( )
338+ . to_string ( ) ;
339+ use mime_guess:: mime;
340+ let mime: mime:: Mime = mime_str. parse ( ) . unwrap_or ( mime:: APPLICATION_OCTET_STREAM ) ;
341+
342+ cx. spawn_thread ( move || {
343+ if let Ok ( file) = std:: fs:: read ( file_path_clone) {
344+ let metadata = FilePreviewerMetaData {
345+ filename,
346+ mime,
347+ file_size : file. len ( ) ,
348+ } ;
349+ let _ = sender. send ( ( metadata, file) ) ;
350+ SignalToUI :: set_ui_signal ( ) ;
351+ }
352+ } ) ;
353+ continue ;
351354 }
352355 }
353356 }
0 commit comments