
    IiM                     v    S r SSKJr  \(       a  SSKJr  SSKJr  SSKJr  SSKJ	r	J
r
  SS	KJr   " S
 S5      rg)z8Mixin providing menu management functionality for games.    )TYPE_CHECKING   )Player)User   )ResolvedAction)MenuItemEscapeBehavior)Localizationc            	           \ rS rSrSrSS.SSS\S-  SS4S	 jjrSS
 jr  SSSS\S-  S\	SS4S jjr
SS jrSSS\\   SS4S jrSrg)MenuManagementMixin   a  Build and update turn menus and status boxes.

Expected Game attributes:
    _destroyed: bool.
    status: str.
    players: list[Player].
    _status_box_open: set[str].
    get_user(player) -> User | None.
    get_all_visible_actions(player) -> list[ResolvedAction].
N)positionplayerr   r   returnc          	      V   U R                   (       a  gU R                  S:X  a  gUR                  U R                  ;   a  gU R	                  U5      nU(       d  g/ nU R                  U5       H  nUR                  nUR                  (       dC  UR                  R                  (       a(  [        R                  " UR                  S5      nU SU 3nUR                  [        XeR                  R                  UR                  S95        M     UR!                  SUS["        R$                  US9  g)	a  Rebuild the turn menu for a player.

Args:
    player: The player whose menu to rebuild.
    position: Optional 1-based position to focus on. Use position=1
        to reset focus to the first item. When None, the client
        preserves focus on the previously selected item by ID. This
        causes a stuck-cursor bug when an always-visible action (like
        "view pipe") shifts position as turn actions appear/disappear.
        Pass position=1 in _start_turn for the current player to avoid
        this.
Nfinishedvisibility-unavailable; textidsound	turn_menuF)multiletterescape_behaviorr   )
_destroyedstatusr   _status_box_openget_userget_all_visible_actionslabelenabledactionshow_disabled_labelr   getlocaleappendr	   r   	show_menur
   KEYBIND)selfr   r   useritemsresolvedr"   unavailables           Fc:\Users\dbart\PlayPalace11\server\game_utils\menu_management_mixin.pyrebuild_player_menu'MenuManagementMixin.rebuild_player_menu   s     ??;;*$99---}}V$ "44V<HNNE##(K(K*..t{{<TU 'K=1LLu1C1C8>>Z[ = 	*22 	 	
    c                 p    U R                   (       a  gU R                   H  nU R                  U5        M     g)zRebuild menus for all players.N)r   playersr1   r+   r   s     r0   rebuild_all_menus%MenuManagementMixin.rebuild_all_menusA   s(    ??llF$$V, #r3   selection_idplay_selection_soundc           	      6   U R                   (       a  gU R                  S:X  a  gUR                  U R                  ;   a  gU R	                  U5      nU(       d  g/ nU R                  U5       H  nUR                  nUR                  (       dC  UR                  R                  (       a(  [        R                  " UR                  S5      nU SU 3nUR                  [        XvR                  R                  UR                  S95        M     UR!                  SXRUS9  g)z=Update the turn menu for a player, preserving focus position.Nr   r   r   r   r   )r9   r:   )r   r   r   r   r    r!   r"   r#   r$   r%   r   r&   r'   r(   r	   r   update_menu)	r+   r   r9   r:   r,   r-   r.   r"   r/   s	            r0   update_player_menu&MenuManagementMixin.update_player_menuH   s     ??;;*$99---}}V$ "44V<HNNE##(K(K*..t{{<TU 'K=1LLu1C1C8>>Z[ = 	Pd 	 	
r3   c                 p    U R                   (       a  gU R                   H  nU R                  U5        M     g)z8Update menus for all players, preserving focus position.N)r   r5   r=   r6   s     r0   update_all_menus$MenuManagementMixin.update_all_menuse   s(    ??llF##F+ #r3   linesc                     U R                  U5      nU(       a`  U Vs/ s H  n[        USS9PM     nnUR                  SUS[        R                  S9  U R
                  R                  UR                  5        ggs  snf )zShow a status box (menu with text items) to a player.

Press Enter on any item to close. No header or close button needed
since screen readers speak list items and Enter always closes.
status_line)r   r   
status_boxF)r   r   N)r    r	   r)   r
   SELECT_LASTr   addr   )r+   r   rB   r,   liner-   s         r0   rE   MenuManagementMixin.status_boxl   su     }}V$GLMutX4M:uEMNN! . : :	   !!%%fii0 Ms   A: )r   N)NF)__name__
__module____qualname____firstlineno____doc__intr1   r7   strboolr=   r@   listrE   __static_attributes__rJ   r3   r0   r   r      s    	 OS %
( %
t %
W[ %
N- $(%*	

 Dj
 #	

 

:,1 1$s) 1 1r3   r   N)rO   typingr   
games.baser   server.core.users.baser   actionsr   r	   r
   messages.localizationr   r   rJ   r3   r0   <module>rZ      s)    >  #+' ; 0m1 m1r3   