
    {h2                         d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZmZmZ d dlmZ d dlmZ d dlmZ d dlm Z   G d de      Z!y)    N)ComposeResult)StaticFooter)Binding)on)reactive)Screen)Path)ListOptionalDictCallable)BORDER_STYLEPRIMARY_COLORMode)GenericList)NewItemInput)ConfirmationModal)Messagec                       e Zd ZU dZ G d de      Zde dZ edddd	
       eddd       eddd       edddd	d	       edddd	d	       edddd	
      gZ	 e
 ej                               Ze
e   ed<    e
d      Ze
e   ed<   dZee   ed<   i Zeeee   f   ed <   dd	d	ej,                  dd!fd"eee      d#ed$ed%ed&eeegdf      d'ef fd(Zd)efd*Zd+ Zd,efd-Zd. Zd/ Z  e!e"jF                        d0        Z$d1 Z%d,ed)efd2Z&d3e'd)efd4Z(d5e"jR                  fd6Z*d3e'fd7Z+d8 Z,d9 Z-d:efd;Z.d< Z/d= Z0d>efd?Z1d@ Z2d5e3jh                  fdAZ5d5e3jl                  fdBZ7dC Z8dD Z9dEedFe:e;dGf   d)edz  fdHZ< xZ=S )IFileExplorerScreenz+Screen for exploring files and directories.c                   ,     e Zd ZdZdeddf fdZ xZS )FileExplorerScreen.FileSelectedz(Message emitted when a file is selected.pathreturnNc                 0    || _         t        | 	          y N)r   super__init__)selfr   	__class__s     g/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/atomic_assembler/screens/file_explorer.pyr   z(FileExplorerScreen.FileSelected.__init__   s    DIG    )__name__
__module____qualname____doc__r
   r   __classcell__r!   s   @r"   FileSelectedr      s    6	 	$ 	 	r#   r*   z
    Screen {
        align: center middle;
    }

    #title {
        dock: top;
        padding: 1 2;
        color: $text;
        text-align: center;
        text-style: bold;
        border: solid a   ;
    }

    #current-path {
        padding: 1 2;
    }

    Footer {
        color: $text;
    }

    .modal-overlay {
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.5);
        layout: grid;
        grid-size: 1;
        align: center middle;
    }
    escapehandle_escapezExit/CancelT)shown
new_folderz
New Folderfnew_filezNew Fileleftgo_up_folderzGo Up)r-   priorityrightenter_folderzEnter Folderenteraction_selectzSelect Itemcurrent_pathFnew_item_modeNselected_filedirectory_selectionszFile Pickerallowed_extensionsenable_folder_creationenable_file_creationmodecallbacktitlec                 R   t        	|   |i | || _        || _        t	        |d      | _        t	        dd      | _        t        | j                        | _	        t        d      | _        t               | _        || _        || _        || _        t#        j$                  d       y)	z"Initialize the FileExplorerScreen.rB   )id zcurrent-path)item_rendererznew-item-inputzFileExplorerScreen initializedN)r   r   r@   rA   r   title_widgetcurrent_path_widgetr   _render_file_item	file_listr   new_item_inputr   footerr=   r>   r?   logginginfo)
r    r=   r>   r?   r@   rA   rB   argskwargsr!   s
            r"   r   zFileExplorerScreen.__init__K   s     	$)&)	 "5W5#)"#@ $43I3IJ*.>?h"4&<#$8!56r#   r   c              #      K   | j                    | j                   | j                   | j                   | j                   yw)z!Compose the layout of the screen.N)rG   rH   rJ   rK   rL   r    s    r"   composezFileExplorerScreen.composed   s>     &&&nn!!!kks   AA
c                     t        j                  d       | j                          t        j                         d   | _        y)z*Handler called when the screen is mounted.zFileExplorerScreen mountedN)rM   rN   refresh_file_listr   splitborder_colorrR   s    r"   on_mountzFileExplorerScreen.on_mountl   s1    12 (..04r#   r   c                 T    t        j                  d|        | j                          y)z%React to changes in the current_path.zCurrent path changed to: N)rM   rN   rV   )r    r   s     r"   watch_current_pathz%FileExplorerScreen.watch_current_pathr   s"    078 r#   c                    t        j                  d       | j                          | j                         }| j                  j                  |       | j                  j                  | j                        }|rTt        |      D ]*  \  }}|d   |k(  s| j                  j                  |        y | j                  j                  d       y| j                  j                  d       y)z:Refresh the file list and update the current path display.zRefreshing file listr   r   N)rM   debugupdate_current_path_display_get_file_itemsrJ   update_listr<   getr9   	enumerateset_highlighted_index)r    itemsselected_pathindexitems        r"   rV   z$FileExplorerScreen.refresh_file_listw   s    ,-((*$$&""5) 1155d6G6GH(/ 8t<=0NN88?8
 44Q7NN003r#   c           	      r    | j                   j                  dt         d| j                   dt         d       y)z'Update the display of the current path.Current directory: [bold ][/bold N)rH   updater   r9   rR   s    r"   r^   z.FileExplorerScreen.update_current_path_display   s9      ''*CM?RSTXTeTeSffmn{m||}(~r#   c           	          t        j                  d|j                          |j                  rE| j                  j	                  dt
         d|j                  j                  d    dt
         d       y y )NzHighlighted item: ri   rj   r   rk   )rM   rN   rg   rH   rl   r   	item_data)r    	list_views     r"   on_highlightedz!FileExplorerScreen.on_highlighted   sh    ))..)9:;>>$$+++M?!INN<T<TU[<\;]]derdsstu r#   c                 &   g }t        | j                  j                         d       D ]e  }| j                  t        j
                  k(  r|j                         r1| j                  |      sC|j                  ||j                         dd       g |S )z&Get the list of file items to display.c                 X    | j                          | j                  j                         fS r   )is_dirnamelower)xs    r"   <lambda>z4FileExplorerScreen._get_file_items.<locals>.<lambda>   s#    188:~WXW]W]WcWcWeFf r#   )keyF)r   rs   	is_parent)
sortedr9   iterdirr@   r   DIRECTORY_MODEis_file_is_allowed_fileappendrs   )r    rd   rg   s      r"   r_   z"FileExplorerScreen._get_file_items   s{    4,,446<fg 	ZDyyD///DLLN$$T*ddkkmRWXY		Z
 r#   c                 8   |j                         ry| j                  y| j                  D cg c]  }|j                          }}|j                  j                         |v ry|j                  j                         |D cg c]  }d| 	 c}v ryyc c}w c c}w )z<Check if the file is allowed based on its extension or name.T.F)rs   r=   ru   stemsuffix)r    r   extallowed_extss       r"   r~   z#FileExplorerScreen._is_allowed_file   s    ;;=""* 04/F/FG		GG 99??, ;;"EQse9"EE H #Fs   B Brg   c                 L    |d   rdnd}|d   rdn|d   j                   }| | S )zRender a file item.rs   u   📁 u   📄 ry   z..r   )rt   )r    rg   iconrt   s       r"   rI   z$FileExplorerScreen._render_file_item   s5    x.wgK(td6l.?.?vr#   messagec                 >    |j                   }| j                  |       y)z'Handle item selection from GenericList.N)rg   handle_item_selection)r    r   rg   s      r"   on_generic_list_item_selectedz0FileExplorerScreen.on_generic_list_item_selected   s    ||""4(r#   c           	         | j                   t        j                  k(  r|d   s"| j                   t        j                  k(  r|d   s|d   | _        |d   rdnd}t        j                  |j                          d| j                          | j                  j                  t        d| d| j                  j                   d| j                               y
t        j                  d	       y
)z:Handle the selection of an item based on the current mode.rs   r   folderfilez selected: z%Are you sure you want to select this z: ?zNo valid selection made.N)r@   r   r|   	FILE_MODEr;   rM   rN   
capitalizeapppush_screenr   rt   handle_confirmation)r    rg   	item_types      r"   r   z(FileExplorerScreen.handle_item_selection   s    II,,,hTYYRVR`R`E`imnviw!%fD$(NILLI0023;t?Q?Q>RSTHH  !;I;bI[I[I`I`Haabc,, LL34r#   c                     | j                   j                  }|sy|j                  }|rO|d   rI|d   | j                  | j                  <   |d   | _        t        j                  d| j                          yyy)z$Action to enter the selected folder.Nrs   r   zEntered directory: )rJ   highlighted_childrn   r<   r9   rM   rN   )r    highlighted_itemselected_items      r"   action_enter_folderz&FileExplorerScreen.action_enter_folder   sw    >>;;(22]84;H;PD%%d&7&78 -f 5DLL.t/@/@.ABC	 5=r#   c                 l    | j                   j                  }|r| j                  |j                         yy)z5Override the select action to handle Enter key press.N)rJ   r   r   rn   r    r   s     r"   r8   z FileExplorerScreen.action_select   s/    >>;;&&'7'A'AB r#   	confirmedc                    t        j                  d|        |r| j                  rt        j                  d| j                          | j                  rXt        j                  d| j                          | j                  j                          | j                  | j                         yyt        j                  d       d| _        y)z,Handle the result of the confirmation modal.zConfirmation result: zSelection confirmed: z%Calling callback with selected file: zSelection cancelledN)rM   rN   r;   rA   r   
pop_screen)r    r   s     r"   r   z&FileExplorerScreen.handle_confirmation   s    ,YK89++LL01C1C0DEF}}DTEWEWDXYZ##%d001	  LL./!%Dr#   c                     t        j                  d       d| _        d| j                  _        d| j
                  _        d| j                  _        | j                  j                          y)z)Action to enter new folder creation mode.z!Entering new folder creation modeTEnter folder nameN	rM   rN   r:   rK   displayrJ   disabledplaceholderfocusrR   s    r"   action_new_folderz$FileExplorerScreen.action_new_folder   sQ    89!&*#"&*='!!#r#   c                     t        j                  d       d| _        d| j                  _        d| j
                  _        d| j                  _        | j                  j                          y)z'Action to enter new file creation mode.zEntering new file creation modeTzEnter file nameNr   rR   s    r"   action_new_filez"FileExplorerScreen.action_new_file   sQ    67!&*#"&*;'!!#r#   	item_namec                 2   t        j                  d|        |r| j                  |z  }	 | j                  j                  dk(  r,|j                  dd       t        j                  d|        n*|j                  d       t        j                  d|        | j                          d
| j                  _        | j                          y# t        $ r+ t        j                  d	|        | j                          Y Uw xY w# d
| j                  _        w xY w)z%Create a new item based on the input.zAttempting to create new item: r   TF)parentsexist_okzNew directory created: )r   zNew file created: z'Failed to create item, already exists: rE   N)rM   rN   r9   rK   r   mkdirtouchrV   FileExistsErrorwarningbellvalueexit_new_item_mode)r    r   new_item_paths      r"   create_new_itemz"FileExplorerScreen.create_new_item  s    6ykBC --	9M/&&226II!''u'ELL#:=/!JK!'''7LL#5m_!EF&&(
 -/##)! # "I- YZ		 -/##)s$   A?C 1D =D ?D  D Dc                     t        j                  d       d| _        d| j                  _        d| j
                  _        | j
                  j                          | j                          y)z Exit the new item creation mode.zExiting new item modeFN)	rM   rN   r:   rK   r   rJ   r   r   refresh_bindingsrR   s    r"   r   z%FileExplorerScreen.exit_new_item_mode  sM    ,-"&+#"'r#   c                 >    |j                   }| j                  |       y)z,Handle the submission of the new item input.N)r   r   )r    r   r   s      r"   on_new_item_input_submittedz.FileExplorerScreen.on_new_item_input_submitted  s    MM	Y'r#   c                 $    | j                          y)z.Handle the cancellation of the new item input.N)r   )r    r   s     r"   on_new_item_input_cancelledz.FileExplorerScreen.on_new_item_input_cancelled$  s    !r#   c                     | j                   r&t        j                  d       | j                          yt        j                  d       | j                  j                          y)zHandle the escape key.z$Exiting new item mode via escape keyzPopping screen via escape keyN)r:   rM   rN   r   r   r   rR   s    r"   action_handle_escapez'FileExplorerScreen.action_handle_escape(  sA    LL?@##%LL89HH!r#   c                 B   | j                   | j                   j                  k7  r|| j                  j                  }|r&|j                  d   | j
                  | j                   <   | j                   j                  | _         t        j                  d| j                           yy)zAction to go up one folder.r   zMoved up to directory: N)	r9   rootrJ   r   rn   r<   parentrM   rN   r   s     r"   action_go_up_folderz&FileExplorerScreen.action_go_up_folder1  s     1 1 6 66#~~???O?Y?YZ`?a))$*;*;< $ 1 1 8 8DLL243D3D2EFG 7r#   action
parameters.c                    d}|dk(  r| j                   xr | j                   }|S |dk(  r<| j                  xr, | j                   xr | j                  t        j
                  k(  }|S |dk(  rd}|S |dv r| j                   }|S )zJ
        Check if an action may run / be displayed in the footer.
        Nr/   r1   r,   T)r3   r6   )r>   r:   r?   r@   r   r   )r    r   r   can_runs       r"   check_actionzFileExplorerScreen.check_action;  s     \!11L$:L:L6LG  z!//j8J8J4Jjtyy\`\j\jOjG  &G  77,,,Gr#   )>r$   r%   r&   r'   r   r*   r   CSSr   BINDINGSr   r
   cwdr9   __annotations__r:   boolr;   r   r<   r   r   r   r   strr   r   r   rS   rY   r[   rV   r^   r   r   Highlightedrp   r_   r~   dictrI   ItemSelectedr   r   r   r8   r   r   r   r   r   r   	Submittedr   	Cancelledr   r   r   tupleobjectr   r(   r)   s   @r"   r   r      sh   5w  %o &CB 	/=tD\<0Z,dTJdTR-dCH $,HDHHJ#7L(4.7$,UOM8D>3$(M8D>(79$tXd^349 37'+%)^^59"7$T#Y/7 !%7 #	7
 7 8TFDL127 72 5!t !
4&@   !T d *d s )[5M5M )
5$ 5
DC&T &$$" "( (<3I3I (
"<3I3I ""H3 E&#+4F 4RV; r#   r   )"rM   textual.appr   textual.widgetsr   r   textual.bindingr   textualr   textual.reactiver   textual.screenr	   pathlibr
   typingr   r   r   r   atomic_assembler.constantsr   r   r   %atomic_assembler.widgets.generic_listr   'atomic_assembler.widgets.new_item_inputr   +atomic_assembler.widgets.confirmation_modalr   textual.messager   r    r#   r"   <module>r      sC     % * #  % !  1 1 H H = @ I #w wr#   