
    Ii &              
      (   % S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	J
r
  SS	KJrJr  \(       a  SS
KJr  0 rS\S'   0 rS\S'   SSSS.             SS jjr   SSSSSSSSSS.                         SS jjjrS rSS jrg)u  Reusable menu flows shared across server features.

Usage examples::

    # Switching locale (options menu) — all languages, native names shown
    show_language_menu(
        user, include_native_names=True,
        on_select=self._apply_locale_change,
        on_back=lambda u: self._show_options_menu(u),
    )

    # Filtered subset with status labels
    counts = {code: f"({n} users)" for code, n in transcriber_counts.items()}
    show_language_menu(
        user, highlight_active_locale=False,
        status_labels=counts,
        on_select=self._show_transcribers_for_language,
    )

    # Multi-select with done/cancel — menu manages toggle state internally
    show_language_menu(
        user, highlight_active_locale=False, multi_select=True,
        selected=set(user.fluent_languages),
        on_done=lambda u, sel: apply_selection(u, sel),
        on_cancel=lambda u: go_back(u),
    )
    )annotationsN)	AwaitableCallable)TYPE_CHECKING   )Localization   )MenuItemEscapeBehavior)NetworkUserzwdict[str, tuple[Callable[[NetworkUser, str], Awaitable[None]] | None, Callable[[NetworkUser], Awaitable[None]] | None]]_language_menu_callbackszdict[str, dict]_language_menu_multiFyesT)include_cancelinitial_focusallow_escapec                  [        USS9[        [        R                  " U R                  S5      SS9[        [        R                  " U R                  S5      SS9/nU(       a8  UR	                  [        [        R                  " U R                  S5      SS95        [        U[        5      (       a  SSSS.nUR                  US5      n[        US	S
9 VV	s0 s H  u  pU	R                  U_M     n
nn	U
R                  US5      nUS	:w  a  U R                  U5        U(       a  [        R                  O[        R                  nU R                  UUSUUS9  gs  sn	nf )a  Show a yes/no confirmation menu.

The first item is a static label displaying *question*.  Focus is placed
on *initial_focus* (``"yes"`` by default) so the label is skipped.

*initial_focus* accepts an item id string (``"yes"``, ``"no"``,
``"cancel"``, ``"question"``) **or** an integer shorthand:
``1`` = yes, ``2`` = no, ``3`` = cancel, anything else = question label.

Callers are responsible for setting ``_user_states`` themselves, since they
often need to store extra context (e.g. ``target_username``).
questiontextidzconfirm-yesr   z
confirm-nonocancel)   r	   r   r   startr	   Tmultiletterescape_behaviorpositionN)r
   r   getlocaleappend
isinstanceint	enumerater   speakr   SELECT_LASTKEYBIND	show_menu)usermenu_idr   r   r   r   items	int_to_idiitemfocus_positionsr    escapes                :c:\Users\dbart\PlayPalace11\server\core\ui\common_flows.pyshow_yes_no_menur4   6   s&   , 	h:.l&&t{{MBuMl&&t{{LAdKE
 X<#3#3DKK#JxXY -%%$84	!mZ@1:51JK1Jgatwwz1JOK""=!4H1}

8+7^''^=S=SFNN   Ls   E)
lang_codesselectedstatus_labels
focus_lang	on_selecton_backon_done	on_cancelc                  [         R                  " 5       (       a  U R                  SSS9  gU=(       d    U R                  nU(       au  Ubr  [         R                  " U R                  S5      n[         R                  " U R                  S5      n[         R
                  " 5       nU Vs0 s H  nUUU;   a  UOU_M     nn[         R                  " U R                  S9n[         R                  " U R                  U R                  S9nUb9  [        U5      nUR                  5        VVs0 s H  u  nnUU;   d  M  UU_M     nnn/ nS	n[        UR                  5       S	S
9 H  u  nu  nnU=(       a    UU R                  :H  nU(       a  SOSnUR	                  UU5      nU U 3nU(       a  UU:w  a  U(       d  U SU S3nU(       a  UU;   a
  U SUU    3nUR                  [        USU 3S95        UU:X  d  M  UnM     U(       aq  UR                  [        [         R                  " U R                  S5      SS95        UR                  [        [         R                  " U R                  S5      SS95        O8UR                  [        [         R                  " U R                  S5      SS95        U(       a>  Ub;  UU
UUUUS.[        U R                  '   [        R                  U R                  S5        O4X4[        U R                  '   [        R                  U R                  S5        U R!                  SUS["        R$                  US9  gs  snf s  snnf )a|  Show a language selection menu.

*focus_lang* sets which language code receives initial focus.  When
``None`` (the default), the user's current locale is focused.

When *multi_select* is ``True``, the menu shows Done and Cancel items
instead of Back.  Escape selects Cancel (last item).  Pass *selected*
to let the menu manage toggle state internally:

- *selected* is a mutable ``set[str]`` of language codes that are
  currently "on".  The menu modifies it in-place on each toggle and
  auto-generates on/off status labels.  Pass ``set(original)`` if the
  original collection must remain untouched.
- *on_done(user, selected)* is called when Done is pressed.
- *on_cancel(user)* is called when Cancel is pressed.
- *on_select* and *on_back* are ignored in this mode.

Returns ``True`` if the menu was displayed, ``False`` if it could not be
shown (e.g. localization warmup still running).
z"localization-in-progress-try-againmisc)bufferFNz	option-onz
option-off)fallbackr   r   z*  z () lang_r   doner   back)r6   r;   r<   highlight_active_localeinclude_native_namesr5   language_menuTr   )r   is_warmup_activespeak_lr"   r!   get_available_locale_codesget_available_languagessetr-   r&   r#   r
   r   usernamer   popr*   r   r(   )r+   rG   rH   multi_selectr5   r6   r7   r8   r9   r:   r;   r<   focus_targeton_label	off_label	all_codescodenative_nameslocalized_names	codes_setcnr-   selected_positionindex	lang_codenative	is_activeprefix	localizeddisplays                                  r3   show_language_menurd   g   s   F $$&&9&I,L ,##DKK= $$T[[,?	 ;;=	W`aW`t48+;xJW`a  77ML"::4;;QUQ\Q\]O 
O	)5););)=P)=Ai1)=PE&/0B0B0DA&N""	6+H	T[[0H	"#''	6:	HYK(Fi$7	 	F81-GY-7 	=#;"<=GX7yk/BCD$ % 'O X<#3#3DKK#HVTUX<#3#3DKK#JxXYX<#3#3DKK#HVTU , "'>$8$/
T]]+ 	!$$T]]D93<2F /  5NN&22"   s b Qs   &M%M6Mc                n   #    U b,  U " U6 n[         R                  " U5      (       a  UI Sh  vN   ggg N7f)zACall *callback* with *args*, awaiting if the result is awaitable.N)inspectisawaitable)callbackargsresults      r3   _invokerk      s;     4v&&LL '  s   )535c                  #    [         R                  U R                  S5      nUb  US   nUR                  S5      (       ap  USS nXC;   a#  UR	                  U5        U R                  S5        O"UR                  U5        U R                  S5        [        U US   US   S	US
   UUUS   US   S9	  gUS:X  a  [        US   X5      I Sh  vN   gUS:X  a  [        US   U 5      I Sh  vN   g[        R                  U R                  S5      u  pVUR                  S5      (       a  USS n[        XPU5      I Sh  vN   g[        X`5      I Sh  vN   g N Nm N N7f)z;Dispatch a language-menu selection to the stored callbacks.Nr6   rD      zcheckbox_list_off.wavzcheckbox_list_on.wavrG   rH   Tr5   r;   r<   )r5   r6   r8   r;   r<   rE   r   )NN)
r   rP   rO   
startswithdiscard
play_soundaddrd   rk   r   )r+   selection_idmultir6   r^   r9   r:   s          r3   handle_language_menu_selectionrt      so     $$T]]D9E":.""7++$QR(I$  + 78Y' 67/0,- .!$i(,
 		 V#%	*D;;; 	 X%%,d333155dmm\RIw'' $	iy111g$$$ <3 	2$sI   CE	E
E'E(AE9E:EEEEEE)r+   r   r,   strr   ru   r   boolr   z	str | intr   rv   returnNone)TFF)r+   r   rG   rv   rH   rv   rQ   rv   r5   zlist[str] | Noner6   zset[str] | Noner7   zdict[str, str] | Noner8   z
str | Noner9   z4Callable[[NetworkUser, str], Awaitable[None]] | Noner:   /Callable[[NetworkUser], Awaitable[None]] | Noner;   z%Callable[..., Awaitable[None]] | Noner<   ry   rw   rv   )r+   r   rr   ru   rw   rx   )__doc__
__future__r   rf   collections.abcr   r   typingr   messages.localizationr   
users.baser
   r   users.network_userr   r   __annotations__r   r4   rd   rk   rt        r3   <module>r      s`  8 #  /   1 10     )+ o * !$.
.. .
 . . . 
.f %)!&	g $( $+/!FJ?C59AEg
g!g g 	g !g g )g g Dg =g 3g ?g 
gT$%r   