+
    KiV  c                   s   R t ^ RIt^ RIHt ^ RIHtHtHtHtH	t	H
t
 ^ RIHtHtHtHt ^ RIHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIH t  ^ RI!H"t"H#t#H$t$H%t% ^ RI&H't' ^ RI(H)t) ^ RI*H+t+ ^ RI,H-t- ^ RI.H/t/ ^ RI0H1t1 ^ RI2H3t3 ^ RI4H5t5H6t6 ^ RI7H8t8 ^ RI9H:t: ^ RI;H<t< ^ RI=H>t>H?t?H@t@HAtAHBtB ^ RICHDtD ^ RIEHFtFHGtG ^ RIHHItI ^ RIJHKtK ^ tL^tM^tN^tO^tP]Q! ]<P                  ! 4       4       U Uu/ uF  w  rWbK	  	  upp tS ! R R]P                  4      tU ! R R ]U4      tV ! R! R"]V4      tW ! R# R$]U4      tX ! R% R&]U4      tY ! R' R(]U4      tZ ! R) R*]P                  4      t[ ! R+ R,4      t\ ! R- R.]P                  4      t^R# u upp i )/zSidebar for the main windowN)gettext)CallableListOptionalSetTupleUnion)GdkGObjectGtkPango)runnersservicessettings)LutrisConfig)
categories)games)saved_searches)CATEGORIES_UPDATED)SAVED_SEARCHES_UPDATED)
GAME_STARTGAME_STOPPEDGAME_UPDATEDGame)EditCategoryGamesDialog)EditSavedSearchDialog)RunnerConfigDialog)	RunnerBox)ServicesBox)display_error)RunnerInstallDialog)get_widget_childrenpick_stock_icon)ScriptInterpreter)InvalidRunnerError)SERVICES)SERVICE_GAMES_LOADEDSERVICE_GAMES_LOADINGSERVICE_LOGINSERVICE_LOGOUTAuthTokenExpiredError)schedule_at_idle)LOCAL_LIBRARY_SYNCEDLOCAL_LIBRARY_SYNCING)logger)get_natural_sort_keyc                   s   a a ] tR t^1t oRt^	t^tRV 3R llt]V3R lR l4       t	R t
R tR tR tR	 tR
 tRtVtV ;t# )
SidebarRowz7A row in the sidebar containing possible action buttonsc           	     sN  < \         SV `  4        WPn        W n        Wn        W0n        RV n        / V n        \        P                  ! V P                  V P                  V P                  R7      V n        V P                  RV P                  4       V P                  V P                  4       V'       g8   \        P                  ! V P                  V P                  V P                  R7      pV P                  P                  V4       \        P                   ! V\        P"                  P$                  RV P                  V P                  \&        P(                  P*                  R7      pV P                  P-                  VRR^ 4       \        P                  ! ^R\        P"                  P.                  RR7      V n        V P                  P3                  V P0                  RR^ 4       \        P4                  ! RRR7      V n        V P                  P3                  V P6                  RR^ 4       R# )	a  Initialize the row

Parameters:
    id_: identifier of the row
    type: type of row to display (still used?)
    name (str): Text displayed on the row
    icon (GtkImage): icon displayed next to the label
    application (GtkApplication): reference to the running application
F)spacingmargin_start
margin_endZrealizeT)labelhalignhexpand
margin_topmargin_bottomZ	ellipsize)r/   no_show_allZvalignZhomogeneous)visibler7   N)super__init__applicationtypeidnameis_updatingbuttonsr	   BoxSPACINGMARGINboxconnect
on_realizeaddLabelAlignSTARTr
   ZEllipsizeModeZEND
pack_startZCENTERbtn_boxZpack_endZSpinnerspinner)selfZid_Ztype_r>   iconr;   r2   	__class__s   &&&&&& ?/usr/lib/python3.14/site-packages/lutris/gui/widgets/sidebar.pyr:   ZSidebarRow.__init__7   sn    	&		 774<<dkkVZVaVabY0774<<dkkVZVaVabDT		99??||,,))--
 	E4q1wwqd399CSCSaef$,,ua8{{5dC$,,ua8    c                6   < V ^8  d   QhRS[ S[S[3,          /#    returnr   intstrformat__classdict__   "rQ   __annotate__ZSidebarRow.__annotate__^   s      %S/ rR   c                    ^ # )zAn index indicate the place this row has within its type. The id is used
as a tie-breaker. Can be int or str depending on row type. rN      &rQ   sort_keyZSidebarRow.sort_key]   s     rR   c                s    . # Nr`   ra   rb   rQ   get_actionsZSidebarRow.get_actionsc   s    	rR   c                s    V P                  4       pV\        P                  P                  ,          ;'       g"    V\        P                  P                  ,          # )z8Return true if the row is hovered or is the one selected)Zget_state_flagsr	   Z
StateFlagsZPRELIGHTZSELECTED)rN   Zflags   & rQ   is_row_activeZSidebarRow.is_row_activef   s<    $$&s~~...QQ%#..:Q:Q2QQrR   c                s    V P                   '       d   V P                  4        \        P                  P	                  W4       R # rd   )r=   update_buttonsr	   
ListBoxRowdo_state_flags_changed)rN   Zprevious_flags   &&rQ   rj   Z!SidebarRow.do_state_flags_changedl   s)    777!--dCrR   c                s   V P                   '       dQ   V P                  P                  4        V P                  P	                  4        V P                  P                  4        R # V P                  P                  4        V P                  P                  4        V P                  4       '       d   V P                  P	                  4        R # V P                  P                  4       '       d   V P                  P                  4        R # R # rd   )	r?   rL   hiderM   showZstartZstoprg   get_visiblera   rb   rQ   rh   ZSidebarRow.update_buttonsq   s    LLLLLL LL\\%%''LL (rR   c                s@   V P                   P                  4        F  pVP                  4        K  	  V P                  4        F  w  r#rE\	        VRR7      p\
        P                  ! V\
        P                  P                  RR7      p\
        P                  P                  V\
        P                  P                  4      pVP                  4        VP                  V4       VP                  RV4       W`P                   V&   V P                   P                  V4       K  	  R# )z9Adds buttons in the button box based on the row's actionszpreferences-system-symbolicZfallback_nameT)Ztooltip_textZreliefr8   clickedN)rL   Zget_childrendestroyre   r    r	   ZButtonZReliefStyleZNONEImagenew_from_icon_nameIconSizeMENUrm   rG   rE   r@   )rN   Zchild	icon_nameZtextrp   ZkeyZbtnZimages   &       rQ   create_button_boxZSidebarRow.create_button_box~   s    \\..0EMMO 1-1-=-=-?)IW'	A^_I**$s7K7KUYZCII00CLL<M<MNEJJLGGENKK	7+ #LLLLS! .@rR   c                s&    V P                  4        R # rd   )rw   )rN   widgetrk   rQ   rF   ZSidebarRow.on_realize   s     rR   )	r;   rD   rL   r@   r=   r?   r>   rM   r<   rd   )__name__
__module____qualname____firstlineno____doc__rC   rB   r:   propertyrc   re   rg   rj   rh   rw   rF   __static_attributes____classdictcell____classcell__rP   r\      @@rQ   r.   r.   1   sQ     AFG$9L  
RD
 "! !rR   r.   c                   sl   a a ] tR t^t oV 3R lt]R 4       tR tR tR t	R t
V3R lR ltR	tVtV ;t# )
ServiceSidebarRowc                s   < \         SV `  VP                  R VP                  \        P                  VP                  4      4       Wn        R# )serviceN)r9   r:   r=   r>   LutrisSidebarget_sidebar_iconrO   r   )rN   r   rP   s   &&rQ   r:   ZServiceSidebarRow.__init__   s5    Ym>\>\]d]i]i>jkrR   c                s0    \         V P                  ,          # rd   )SERVICE_INDICESr=   ra   rb   rQ   rc   ZServiceSidebarRow.sort_key   s    tww''rR   c                s    . pV P                   P                  4       '       d)   VP                  R\        R4      V P                  R34       VP                  R\        R4      V P
                  R34       V# )7Return the definition of buttons to be added to the rowmedia-playback-start-symbolicRunrunview-refresh-symbolicReloadrefresh)r   is_launchableappend_on_service_runon_refresh_clicked)rN   displayed_buttonsrf   rQ   re   ZServiceSidebarRow.get_actions   sh    <<%%''$$&EqxQUQdQdfk%lm  "91X;H_H_aj!kl  rR   c                sX    V P                   P                  V P                  4       4       R# )z(Run a launcher associated with a serviceN)r   r   get_toplevelrN   buttonrk   rQ   r   Z ServiceSidebarRow.on_service_run   s    **,-rR   c                sv   VP                  R4       V P                  P                  '       dg   V P                  P                  4       '       gG   V P                  P	                  4        V P                  P                  V P                  4       R7       R# V P                  P                  V P                  4       R# )zReload the service gamesFparentN)	set_sensitiver   onlineZis_connectedlogoutloginr   Zstart_reloadservice_reloaded_cbr   rk   rQ   r   Z$ServiceSidebarRow.on_refresh_clicked   s{    U#<<t||'@'@'B'BLL!LLd&7&7&9:!!$":":;rR   c                s.   V'       dv   \        V\        4      '       dF   V P                  P                  4        V P                  P	                  V P                  4       R 7       M\        WP                  4       R 7       \        V P                  RR7       R# )r   g       @)Zdelay_secondsN)	
isinstancer(   r   r   r   r   r   r)   enable_refresh_button)rN   Zerrorrk   rQ   r   Z%ServiceSidebarRow.service_reloaded_cb   sb    %!677##%""$*;*;*=">e,=,=,?@333GrR   c                   < V ^8  d   QhRR/# rU   rV   Nr`   rZ   r]   rQ   r^   ZServiceSidebarRow.__annotate__   s     4 4t 4rR   c                sJ    V P                   R ,          P                  R4       R# )r   TN)r@   r   ra   rb   rQ   r   Z'ServiceSidebarRow.enable_refresh_button   s    Y--d3rR   )r   )ry   rz   r{   r|   r:   r~   rc   re   r   r   r   r   r   r   r   r   r   rQ   r   r      sB      ( (!.<H4 4 4rR   r   c                   s2   a  ] tR t^t o R tR tR tRtV tR# )OnlineServiceSidebarRowc                s    R R\        R4      V P                  R 3RR\        R4      V P                  R3RR\        R4      V P                  R3R	R
\        R4      V P                  R	3/# )r   r   r   r   r   r   
disconnectzsystem-log-out-symbolicZ
DisconnectrE   zavatar-default-symbolicZConnect)r   r   r   on_connect_clickedra   rb   rQ   get_buttonsZ#OnlineServiceSidebarRow.get_buttons   st    4ah@S@SUZ[/8d>U>UW`a4aotG^G^`lm11Y<AXAXZcd	
 	
rR   c                s.   V P                  4       p. pV P                  P                  4       '       d   VP                  VR ,          4       V P                  P	                  4       '       d   W!R,          VR,          .,          pV# W!R,          .,          pV# )r   r   r   rE   )r   r   r   r   is_authenticated)rN   r@   r      &  rQ   re   Z#OnlineServiceSidebarRow.get_actions   s    ""$<<%%''$$WU^4<<((**)"4gl6K!LL !  )"4!55  rR   c                s   VP                  R 4       V P                  P                  4       '       d   V P                  P                  4        M*V P                  P	                  V P                  4       R7       V P                  4        R# )Fr   N)r   r   r   r   r   r   rw   r   rk   rQ   r   Z*OnlineServiceSidebarRow.on_connect_clicked   s]    U#<<((**LL!LLd&7&7&9: rR   r`   N)	ry   rz   r{   r|   r   re   r   r   r   r\      @rQ   r   r      s     
	!! !rR   r   c                   s>   a  ] tR t^t o R tR tR tR tR tRt	V t
R# )RunnerSidebarRowc                s   V P                   '       g   . # . p V P                  4       pTP                  '       d)   TP	                  R\        R4      T P                  R34       TP                  '       d)   TP	                  R\        R4      T P                  R34       TP	                  R\        R4      T P                  R	34       T#   \         d    Tu # i ; i)
r   z system-software-install-symboliczManage Versionszmanage-versionsr   r   r   zemblem-system-symbolicZ	ConfigureZ	configure)
r=   
get_runnerr"   Zmultiple_versionsr   r   on_manage_versionsZrunnable_aloneon_run_runneron_configure_runner)rN   Zentriesrunnerr   rQ   re   ZRunnerSidebarRow.get_actions   s    wwwI	__&F ###NN3Q7H5I4KbKbduv    NN;QuXtGYGY[`ab0!K.$BZBZ\ghi " 	N	s   C CCc                sL    \         P                  ! V P                  4      ! 4       # rd   )r   import_runnerr=   ra   rb   rQ   r   ZRunnerSidebarRow.get_runner   s    $$TWW-//rR   c                sd    V P                  4       pVP                  V P                  4       4       R# )z Runs the runner without no game.N)r   r   r   rN   _argsr      &* rQ   r   ZRunnerSidebarRow.on_run_runner   s#    "

4$$&'rR   c                s    V P                  4       pV P                  P                  \        W P	                  4       R7       R# )zShow runner configuration)r   r   N)r   r;   show_windowr   r   r   r   rQ   r   Z$RunnerSidebarRow.on_configure_runner   s1    "$$%7O`O`Ob$crR   c                s    V P                  4       p\        R4      VP                  ,          pV P                  P	                  \
        W2V P                  4       R7       R# )zManage runner versionszManage %s versions)Ztitler   r   N)r   r   
human_namer;   r   r   r   )rN   r   r   Z	dlg_titles   &*  rQ   r   Z#RunnerSidebarRow.on_manage_versions   sJ    "*+f.?.??	$$%8	aeararat$urR   r`   N)ry   rz   r{   r|   re   r   r   r   r   r   r   r   r   rQ   r   r      s&     ,0(
d
v vrR   r   c                   sZ   a a ] tR tRt oV 3R lt]R 4       tR tR tR t	R t
RtVtV ;t# )	CategorySidebarRowi  c                s   < \         SV `  VR ,          RVR ,          \        P                  R4      VR7       Wn        \
        P                  ! VR ,          4      V n        R# )r>   user_categoryzfolder-symbolicr;   N)r9   r:   r   r   categorylocalestrxfrm
_sort_name)rN   r   r;   rP      &&&rQ   r:   ZCategorySidebarRow.__init__  sV    VV**+<=# 	 	
 ! ..&)9:rR   c                ,    \        V P                  4      # rd   r-   r>   ra   rb   rQ   rc   ZCategorySidebarRow.sort_key      #DII..rR   c                6    R\        R4      V P                  R3.# r   zapplications-system-symbolicz
Edit Gameszmanage-category-games)r   on_category_clickedra   rb   rQ   re   ZCategorySidebarRow.get_actions  s    /<$BZBZ\stuurR   c                s    \         P                  ! V P                  R ,          4      ;'       g    V P                  pV P                  P	                  \
        W P                  4       R7       R# )r=   )r   r   T)categories_dbZget_category_by_idr   r;   r   r   r   )rN   r   r      && rQ   r   Z&CategorySidebarRow.on_category_clicked  sM     33DMM$4GHYYDMM$$%<xXiXiXk$lrR   c                    \        V\        4      '       g<   \        R V P                  P                  : RVP                  P                  : 24      hV P
                  VP
                  8  # zCannot compare z to r   r   
ValueErrorrP   ry   r   rN   Zotherrk   rQ   __lt__ZCategorySidebarRow.__lt__  L    %!344$..:Q:QSXSbSbSkSklmm!1!111rR   c                    \        V\        4      '       g<   \        R V P                  P                  : RVP                  P                  : 24      hV P
                  VP
                  8  # r   r   r   rk   rQ   __gt__ZCategorySidebarRow.__gt__#  r   rR   )r   r   )ry   rz   r{   r|   r:   r~   rc   re   r   r   r   r   r   r   r   r   rQ   r   r     s8     
; / /v
22 2rR   r   c                   sf   a a ] tR tRt oV3R lV 3R llt]R 4       tR tR tR t	R t
R	tVtV ;t# )
SavedSearchSidebarRowi*  c                s4   < V ^8  d   QhRS[ P                  /# )rU   saved_search)saved_search_dbZSavedSearchrZ   r]   rQ   r^   Z"SavedSearchSidebarRow.__annotate__+  s     
< 
<_%@%@ 
<rR   c                s   < \         SV `  VP                  R VP                  \        P	                  R4      VR7       Wn        \        P                  ! VP                  4      V n        R# )r   zfolder-saved-search-symbolicr   N)	r9   r:   r>   r   r   r   r   r   r   )rN   r   r;   rP   r   rQ   r:   ZSavedSearchSidebarRow.__init__+  sZ    **+IJ# 	 	
 ) ..):):;rR   c                r   rd   r   ra   rb   rQ   rc   ZSavedSearchSidebarRow.sort_key7  r   rR   c                r   r   )r   on_saved_search_clickedra   rb   rQ   re   Z!SavedSearchSidebarRow.get_actions;  s%     ,Q|_d>Z>Z\st
 	
rR   c                s    \         P                  ! V P                  P                  4      ;'       g    V P                  pV P                  P                  \        W P                  4       R 7       R# ))r   r   T)r   Zget_saved_search_by_idr   Zsaved_search_idr;   r   r   r   )rN   r   r   r   rQ   r   Z-SavedSearchSidebarRow.on_saved_search_clickedA  sS    &==d>O>O>_>_`uudhdudu$$%:^o^o^q$rrR   c                r   r   r   r   r   rP   ry   r   r   rk   rQ   r   ZSavedSearchSidebarRow.__lt__F  L    %!677$..:Q:QSXSbSbSkSklmm!1!111rR   c                r   r   r   r   rk   rQ   r   ZSavedSearchSidebarRow.__gt__L  r   rR   )r   r   )ry   rz   r{   r|   r:   r~   rc   re   r   r   r   r   r   r   r   r   rQ   r   r   *  s<     
< 
< / /

22 2rR   r   c                   s   a a ] tR tRt oRtRV3R lV 3R lllt]V3R lR l4       t]P                  V3R lR l4       tV3R	 lR
 lt	V3R lR lt
V3R lR lt]V3R lR l4       tRtVtV ;t# )SidebarHeaderiS  z@Header shown on top of each sidebar section, as a selectable rowc                sf   < V ^8  d   QhRS[ RS[RS[ RS[RS[S[S[ S[.R3,          ,          RR/# )rU   r>   header_index
section_idcollapsible	on_toggleNrV   )rY   rX   boolr   r   rZ   r]   rQ   r^   SidebarHeader.__annotate__V  sZ     0 00 0 	0
 0 Hc4[$%6780 
0rR   c                s  < \         S
V `  4        V P                  R 4       V P                  R 4       W n        W0n        RV n        W0n        W@n        WPn	        R V n
        \        P                  ! \        P                  P                  R7      p\        P                  ! \        P                   P"                  RRRP%                  V4      R7      p\        P&                  P)                  R\        P*                  P,                  4      V n        V P.                  P1                  ^4       \        P                  ! ^	^^^	R7      pV'       d   VP3                  V P.                  R R ^ 4       VP3                  VRR^ 4       V'       d   \        P4                  ! 4       p	V	P7                  V4       V	P9                  RV P:                  4       V	P9                  R	V P<                  4       V	P9                  R
V P>                  4       VP7                  V	4       MVP7                  V4       VP7                  \        P@                  ! 4       4       V P7                  V4       V PC                  4        R# )Fheader)ZorientationTz	<b>{}</b>)r3   r4   Z
use_markupr2   pan-down-symbolic)r0   r5   r6   r1   zbutton-press-eventzenter-notify-eventzleave-notify-eventN)"r9   r:   Zset_selectableZset_activatabler   r   r<   r=   r   r   
_collapsedr	   rA   ZOrientationZVERTICALrH   rI   rJ   r[   rr   rs   rt   ru   arrowZset_margin_endrK   EventBoxrG   rE   	_on_click	_on_enter	_on_leaveZ	Separatorshow_all)rN   r>   r   r   r   r   Z	outer_boxr2   rD   Z	event_boxrP   s   &&&&&&    rQ   r:   ZSidebarHeader.__init__V  s    	E"U#!-)!	!!,@I %GG(@(@A			99??$$T*	
 YY112Es||GXGXY


!!!$gg1!PQRNN4::ueQ7udD!,IMM#2DNNC2DNNC2DNNCMM)$MM#cmmo&rR   c                s    < V ^8  d   QhRS[ /# rT   r   rZ   r]   rQ   r^   r     s      4 rR   c                s    V P                   # rd   )r   ra   rb   rQ   	collapsedSidebarHeader.collapsed  s    rR   c                $   < V ^8  d   QhRS[ RR/# )rU   valuerV   Nr   rZ   r]   rQ   r^   r     s     H Ht H HrR   c                s    Wn         V P                  '       dC   V'       d   R MRpV P                  P                  V\        P
                  P                  4       R# R# )zpan-end-symbolicr   N)r   r   r   Zset_from_icon_namer	   rt   ru   )rN   r   rv   r   rQ   r   r     sA    .3*9LIJJ)))S\\5F5FG rR   c                sT   < V ^8  d   QhRS[ P                  RS[P                  RS[/# )rU   rx   eventrV   )r	   r   r   ZEventButtonr   rZ   r]   rQ   r^   r     s*       S__  rR   c                s    VP                   ^8X  dO   V P                  '       * V n        V P                  '       d'   V P                  V P                  V P                  4       R# )i   T)r   r   r   r   )rN   rx   r      &&&rQ   r   ZSidebarHeader._on_click  s>    <<1!%/DN~~~t?rR   c                R   < V ^8  d   QhRS[ P                  RS[P                  RR/# rU   rx   r   rV   Nr	   r   r   ZEventCrossingrZ   r]   rQ   r^   r     s1     Y Y YS5F5F Y4 YrR   c                s    VP                  4       pV'       d@   VP                  \        P                  P	                  VP                  4       R 4      4       R# R# )ZpointerN)
get_window
set_cursorr   ZCursorZnew_from_nameZget_displayrN   rx   r   Zwindow   &&& rQ   r   ZSidebarHeader._on_enter  s@    ""$cjj66v7I7I7KYWX rR   c                r   r   r   rZ   r]   rQ   r^   r     s,     $ $ $S5F5F $4 $rR   c                s\    VP                  4       pV'       d   VP                  R 4       R # R # rd   )r   r   r   r   rQ   r   ZSidebarHeader._on_leave  s&    ""$d# rR   c                rS   rT   rW   rZ   r]   rQ   r^   r     s      %S/ rR   c                r_   )    r`   ra   rb   rQ   rc   ZSidebarHeader.sort_key  s     rR   )	r   r   r   r   r   r=   r   r   r<   TN)ry   rz   r{   r|   r}   r:   r~   r   setterr   r   r   rc   r   r   r   r   r   rQ   r   r   S  s|     J0 0d   H H Y Y
$ $
   rR   r   c                   s0   a  ] tR tRt o RtR tR tRtV tR# )DummyRowi  z1Dummy class for rows that may not be initialized.c                    R# )z Dummy method for showing the rowNr`   ra   rb   rQ   rm   ZDummyRow.show      rR   c                r   )zDummy method for hiding the rowNr`   ra   rb   rQ   rl   ZDummyRow.hide  r   rR   r`   N)	ry   rz   r{   r|   r}   rm   rl   r   r   r   r   rQ   r   r     s     ;/. .rR   r   c                   s,  a a ] tR tRt oR tV 3R lt]RV3R lR ll4       tV3R lR ltV3R lR lt	V3R	 lR
 lt
V3R lR ltR t]R 4       t]P                  R 4       tR tR tR tV3R lR ltV3R lR ltR tR tR tR tR tRtVtV ;t# )r   i  c                s  < \         SV `  4        V P                  ^R4       Wn        RV n        V P                  4       P                  R4       . V n        / V n        \        4       V n
        \        4       V n        / V n        . V n        / V n        / V n        / V n        / V n        / V n        \'        4       V n        \'        4       V n        \'        4       V n        \'        4       V n        V P1                  4       V n        R\5        \7        R4      ^ RRR7      R\5        \7        R4      ^RV P8                  R	7      R
\5        \7        R4      ^R
V P8                  R	7      R\5        \7        R4      ^RV P8                  R	7      R\5        \7        R4      ^RV P8                  R	7      R\5        \7        R4      ^RV P8                  R	7      /V n        V P:                  P=                  4        F  w  r#W P2                  9   g   K  RVn        K   	  \@        PB                  ! \D        RV PF                  4       \@        PB                  ! \D        RV PF                  4       \@        PB                  ! \H        RV PJ                  4       \@        PB                  ! \L        RV PF                  4       \@        PB                  ! \N        RV PF                  4       \P        PR                  ! V PT                  4       \V        PR                  ! V PX                  4       \Z        PR                  ! V PF                  4       \\        PR                  ! V PF                  4       \^        PR                  ! V PF                  4       \`        PR                  ! V Pb                  4       \d        PR                  ! V Pb                  4       \f        PR                  ! V Ph                  4       \j        PR                  ! V Pl                  4       \n        PR                  ! V Pp                  4       \r        PR                  ! V Pt                  4       V Pw                  V Px                  4       V P{                  4        R# )i   Nzlutris-sidebarlibraryZLibraryF)r   r   r   r   Z
Categories)r   r   r   r   zSaved Searchesr   ZSourcesr   ZRunnersplatformZ	PlatformsTzrunner-installedzrunner-removedzrunner-updatedzrunners-installedzservices-changedi)>r9   r:   Zset_size_requestr;   previous_categoryZget_style_contextZ	add_classinstalled_runnersrunner_visibility_cachesetused_categoriesr   active_servicesactive_platformsservice_rowsrunner_rowsplatform_rowscategory_rowssaved_search_rowsr   	games_rowrunning_row
hidden_rowmissing_row_load_collapsed_sectionscollapsed_sectionsr   r   _on_section_togglerow_headersitemsr   r   Zadd_emission_hookr   update_rowsr   update_runner_rowsr!   r   r   Zregisteron_game_startr   on_game_stoppedr   r   r   r&   on_service_auth_changedr'   r%   on_service_games_loadingr$   on_service_games_loadedr+   on_local_library_syncingr*   on_local_library_syncedZset_filter_func_filter_funcr   )rN   r;   r   r   rP   s   &&  rQ   r:   ZLutrisSidebar.__init__  sF   c2&&!% **+;< "$')$"u!e! "!#!#:"*#: #'"?"?"A }Qy\iejk],aOW[WnWn M"#!Z^ZqZq })1dNeNe m)1TMdMd +Q:QUQhQh
( #'"2"2"8"8":J444#'  #; 	!!)-?AQAQR!!)-=t?O?OP!!"46FH_H_`!!"35H$JZJZ[!!+/A4CSCSTD../d223d../##D$4$45''(8(89t;;< < <=&&t'D'DE%%d&B&BC&&t'D'DE%%d&B&BCT../rR   c                sP   < V ^8  d   QhRS[ RS[S[ ,          RS[P                  /# )rU   rv   fallback_icon_namesrV   )rY   r   r	   rr   rZ   r]   rQ   r^   LutrisSidebar.__annotate__   s-      C d3i SVS\S\ rR   c                st   V .T;'       g    . ,           p\        VR R7      p \        P                  P                  V \        P                  P
                  4      p\        P                  P                  \        P                  P
                  4      pV^ ,          '       d   VP                  V^,          4       V# )zpackage-x-generic-symbolicro   )r    r	   rr   rs   rt   ru   ZlookupZset_pixel_size)rv   r  Zcandidate_namesrO   Z	icon_sizes   &&   rQ   r   ZLutrisSidebar.get_sidebar_icon  s    $+)<)B)BC#OC_`	yy++Is||7H7HI LL''(9(9:	Q<<	!-rR   c                s0   < V ^8  d   QhRS[ S[,          /# rT   )r   rY   rZ   r]   rQ   r^   r    s      #c( rR   c                s    \         P                  ! RRR7      pV'       d   \        VP                  R4      4      # \        4       # )z,Load collapsed sections state from settings.sidebar_collapsed_sections )Zdefault,)r   Zread_settingr   ZsplitrN   Zcollapsed_strrf   rQ   r  Z&LutrisSidebar._load_collapsed_sections  s6     --.JTVW}**3/00urR   c                r   r   r`   rZ   r]   rQ   r^   r    s     L L$ LrR   c                s|    RP                  \        V P                  4      4      p\        P                  ! RV4       R# )z*Save collapsed sections state to settings.r   r  N)ZjoinZsortedr  r   Zwrite_settingr!  rf   rQ   _save_collapsed_sectionsZ&LutrisSidebar._save_collapsed_sections  s,    (?(?!@A;]KrR   c                s*   < V ^8  d   QhRS[ RS[RR/# )rU   r   r   rV   NrY   r   rZ   r]   rQ   r^   r    s"     ! !S !T !d !rR   c                s    V'       d   V P                   P                  V4       MV P                   P                  V4       V P                  4        V P	                  4        R# )z&Handle section collapse/expand toggle.N)r  rG   Zdiscardr"  invalidate_filter)rN   r   r   r   rQ   r  Z LutrisSidebar._on_section_toggle  sE    ##''
3##++J7%%' rR   c                s&   < V ^8  d   QhRS[ RS[/# )rU   section_typerV   r#  rZ   r]   rQ   r^   r  "  s     7 7 7 7rR   c                s    WP                   9   # )z Check if a section is collapsed.)r  )rN   r%  rk   rQ   is_section_collapsedZ"LutrisSidebar.is_section_collapsed"  s    6666rR   c                s   V P                  V P                  R,          4       \        RR\        R4      V P	                  R4      4      V n        V P                  V P
                  4       V P                  \        RR\        R4      V P	                  R	4      4      4       V P                  \        R
R\        R4      V P	                  R4      4      4       V P                  \        RR\        R4      V P	                  RRR.4      4      4       \        RR\        R4      V P	                  R4      4      V n        V P                  V P                  4       \        RR\        R4      V P	                  R4      4      V n        V P                  V P                  4       \        RR\        R4      V P	                  R4      4      V n        V P                  V P                  4       V P                  4        V P                  P                  4        V P                  P                  4        V P                  P                  4        V P                  4        R# )z
Select the initial row; this triggers the initialization of the game view,
so we must do this even if this sidebar is never realized, but only after
the sidebar's signals are connected.
r   allr   ZGameszapplications-games-symbolicZrecentdynamic_categoryZRecentzdocument-open-recent-symbolicZfavoriteZ	Favoriteszfavorite-symbolicz.uncategorizedZUncategorizedztag-symbolicz
poi-markerz.hiddenZHiddenzaction-unavailable-symbolicZmissingZMissingzdialog-warning-symbolicZrunningZRunningr   N)rG   r  r.   r   r   r	  r  r  r
  r   rl   r  ra   rb   rQ   initialize_rowsZLutrisSidebar.initialize_rows&  s    	!!),- $gJ!!"?@	
 	 "(%%&EF		
 	+%%&9:		
 	 "/"%%n|EX6YZ		
 %hK!!"?@	
 	!%iL!!";<	
 	!!"%iL!!"AB	
 	!!" 	rR   c                sf    V P                  4       pV'       d   VP                  VP                  3# R# )zeThe selected sidebar row, as a tuple of category type and category value,
like ('service', 'lutris').r   r'  )get_selected_rowr<   r=   )rN   rowrf   rQ   selected_categoryLutrisSidebar.selected_categoryu  s-     ##%%(#&&!A.AArR   c                s|   V P                   V n        T;'       g    Rw  r#\        V \        4      pV FS  pVP                  V8X  g   K  VP
                  V8X  g   K)  VP                  4       '       d   V P                  V4        R#  M	  V F-  pVP                  4       '       g   K  V P                  V4        R# 	  R# )zZSelects the row for the category indicated by a category tuple,
like ('service', 'lutris')Nr*  )r-  r   r   r.   r<   r=   rn   
select_row)rN   r   Zselected_row_typeZselected_row_idZchildrenr,  s   &&    rQ   r-  r.  |  s     "&!7!7-2-I-I6I*&tZ8Cxx,,?1J??$$OOC(  C  $ rR   c                s  a a VV 3R  lpSP                   R8X  d   SP                  pVR8X  d   R# VR8X  d   \        S P                  4      # VR8X  d   \        S P                  4      # VR8X  d   \        S P
                  4      # VR8X  d   \        S P                  4      # VR8X  d   \        S P                  4      # R# S'       d$   SP                  '       d   SP                   R
9   d   R# S P                  SP                   4      '       d   R	# SP                   R8X  dD   SP                  f   R# SP                  S P                  9   ;'       d    V! SP                  4      # SP                   R8X  d   S P                  pMHSP                   R8X  d   S P                  pM*SP                   R8X  d   S P
                  pMS P                  pSP                  V9   # )c                 s   < V SP                   9  dB   \        SP                  R 0R7      pVP                  P	                  R R4      SP                   V &   SP                   V ,          # )Zvisible_in_side_panel)Zrunner_slugZoptions_supportedT)r   r   r=   runner_configget)runner_namer0  r,  rN   s   & rQ   is_runner_visibleZ5LutrisSidebar._filter_func.<locals>.is_runner_visible  s^    $">">> ,TkSl m<I<W<W<[<[+T=,,[9 //<<rR   r   r   Tr   r   r   r   r   F)r   r(  )
r<   r   r   r  r   r  r   r  r=   r&  )rN   r,  r3  r   Zallowed_idss   ff   rQ   r  ZLutrisSidebar._filter_func  s|   	= 88xJY&_,D0011^+D//00Y&D0011X%D2233Z'D1122#&&&CHH0P$P $$SXX..88xvv~66T333QQ8I#&&8QQ88&..KXX'--KXX"..K//Kvv$$rR   c                sZ    V P                   P                  4        V P                  4        R # )T)r   Zclearr  )rN   r   s   &*rQ   r  Z LutrisSidebar.update_runner_rows  s#    $$**,rR   c           	     s:
  a aa \         \        \        \        \        \        3,          \        3,          oV3R lV 3R lloR VV 3R llp\
        P                  ! 4        \
        P                  ! 4        Uu. uF*  p\
        P                  ! VR,          4      '       d   K(  VNK,  	  pp\        P                  ! 4       pV Uu0 uF  q3R,          kK  	  upS n        V Uu0 uF  qfP                  kK  	  upS n        \        P                  ! 4       S n        \"        P$                  ! 4        Uu. uF  qwP                  NK  	  upS n        \(        P*                  ! 4       S n        S P.                  P1                  4        F*  w  rVR8w  g   K  V	P3                  4       e   K"  V! V	4       K,  	  S P                   P1                  4        F]  w  rV
S P4                  9  g   K   V! 4       pVP6                  '       d   \8        M\:        pV! V4      pV! V4       VS P4                  V
&   K_  	  S P&                   F  pVS PB                  9  g   K   VPE                  4       PG                  R	R
4      R,           p\"        PH                  ! V4      ! 4       p\K        VRVPL                  S PO                  V4      S PP                  R7      pV! V4       VS PB                  V&   K  	  S P,                   F  pVS PR                  9  g   K  VPE                  4       PG                  R	R
4      PG                  RR4      R,           p\U        VRVS PO                  V4      S PP                  R7      pVS PR                  V&   V! V4       K  	  \W        S PX                  P[                  4       4      S P                  ,
          pV F.  pS PX                  P]                  V4      pVP_                  4        K0  	  V FR  pVR,          S PX                  9  g   K  \a        VS PP                  R7      pVS PX                  VR,          &   V! V4       KT  	  V FX  pVP                  S Pb                  9  g   K   \e        VS PP                  R7      pVS Pb                  VP                  &   V! V4       KZ  	  S Pg                  4        R# u upi u upi u upi u upi   \<         d$   p\>        P@                  ! RY4        Rp?EK  Rp?ii ; i  \<         d%   p\>        P@                  ! RX
T4        Rp?EK  Rp?ii ; i)zGenerates any missing rows that are now needed, and re-evaluate the filter to hide
any no longer needed. GTK has a lot of trouble dynamically updating and re-arranging
rows, so this will have to do. This keeps the total row count down reasonably well.c                s>   < V ^8  d   QhR\         P                  RS/# )rU   r,  rV   r	   ri   )r[   SortKeyr]   rQ   r^   /LutrisSidebar.update_rows.<locals>.__annotate__  s     	" 	"cnn 	" 	"rR   c                sR  < \        V \        4      '       d   V P                  R^ R3# \        V \        4      '       dj   V P                  '       d&   SP
                  P                  V P                  4      MRpV'       d   VP                  M^ pVRV P                  V P                  3# R# )zReturns a key used to sort the rows. This keeps rows for a header
together, and rows in a hopefully reasonable order as we insert them.
Returns (header_index, is_header, sort_key, id) where is_header ensures
headers sort before content rows.Fr  NT)r   Tr   r  )	r   r   r   r.   r<   r  r1  rc   r=   )r,  Z
header_rowr   rN   s   &  rQ   get_sort_keyZ/LutrisSidebar.update_rows.<locals>.get_sort_key  s    
 #}--''255#z**?BxxxT--11#((;T
:Dz66!#T3<<??!!rR   c                s<    V ^8  d   QhR\         P                  RR/# )rU   r,  rV   Nr4  )r[   s   "rQ   r^   r6    s     	$ 	$CNN 	$t 	$rR   c                s   < ^ pS! V 4      p SP                  V4      pV'       d   S! V4      V8  d   MV^,          pK3  V P                  4        SP                  W4       R# )zOFind the best place to insert the row, to maintain order, and inserts it there.N)Zget_row_at_indexr   Zinsert)r,  indexZseqZrr7  rN   s   &   rQ   
insert_rowZ-LutrisSidebar.update_rows.<locals>.insert_row  sT    Es#C))%0LOc1
LLNKK#rR   r>   r   Nz,Sidebar row for '%s' could not be loaded: %sZ r  z	-symbolicr   r   Z/r   r   T)4r   rX   r   r   rY   r   Zremove_unused_categoriesZget_categoriesZis_reserved_categoryr   Zget_saved_searchesr  r>   r   r   Zget_enabled_servicesr  r   Zget_installedr   games_dbZget_used_platformsr  r  r  Z
get_parentr  r   r   r   Z	Exceptionr,   Z	exceptionr  ZlowerZreplacer   r   r   r   r;   r  r.   r   r  keysZpoprq   r   r  r   r$  )rN   r   r9  Zcr   r   Zsr   r   r   Zservice_nameZservice_classr   Z	row_classZservice_rowZexr2  rv   Z
runner_rowr   Zplatform_rowZstale_categoriesZ
stale_nameZ	stale_rowr   Znew_category_rowr   Znew_saved_search_rowr5  r7  s   f*                          @@rQ   r  ZLutrisSidebar.update_rows  sE    T5c?C78	" 	"	$ 	$ 	..0!.!=!=!?u!?A}GiGijklrjsGtaa!?
u(;;=3=>:a&		:>/=>~!vv~>'<<><C<Q<Q<S!T<S&++<S!T ( ; ; = #'"2"2"8"8":JY&6+<+<+>+F6" #; ,0+?+?+E+E+G'L4#4#44g+oG;B>>> 7O`I"+G"4K{+6AD%%l3 ,H  11K$"2"22g + 1 1 3 ; ;C D{ RI$22;?AF!1# ))--i8$($4$4"J z*4>D$$[1 2" --Ht111$NN,44S"=EEc3OR]]	)j(D4I4I)4Tbfbrbr  0<""8,<( . t116689D<P<PP*J**..z:I + #Ht'9'99#5hDL\L\#] 7G""8F#34+,	 # +L  (>(>>'<\W[WgWg'h$<P&&|'8'89/0	 + 	 M v  ?>!T  ! g$$%SUaffg" ! g$$%SUaceffgsU   8%R&"R&R+ R0-R5R:7+R:	BS+:S(S##S(+T6TTc                r   rU   _gamerV   Nr   rZ   r]   rQ   r^   r  3  s        4  D  rR   c                s:    V P                   P                  4        R# )z,Show the "running" section when a game startN)r
  rm   rN   r=  rk   rQ   r  ZLutrisSidebar.on_game_start3  s    rR   c                r   r<  r>  rZ   r]   rQ   r^   r  7  s     J JT Jd JrR   c                s   V P                   P                  '       gd   V P                  P                  4        V P	                  4       V P                  8X  d)   V P                  \        V \        4      ^ ,          4       R# R# R# )z4Hide the "running" section when no games are runningN)r;   Zhas_running_gamesr
  rl   r+  r/  r   r.   r?  rk   rQ   r  ZLutrisSidebar.on_game_stopped7  s`    111!!#$$&$*:*:: 3D* Ea HI ; 2rR   c                sp   \         P                  ! R VP                  4       VP                  V P                  9   dY   V P                  VP                  ,          P	                  4        V P                  VP                  ,          P                  4        R# \         P                  ! RVP                  4       R# )zService %s auth changedService %s is not foundT)r,   debugr=   r  rw   rh   warningrN   r   rk   rQ   r  Z%LutrisSidebar.on_service_auth_changed?  sz    .

;::***gjj);;=gjj)88:  NN4gjjArR   c                s^   \         P                  ! R VP                  4       VP                  V P                  9   dP   RV P                  VP                  ,          n        V P                  VP                  ,          P                  4        R# \         P                  ! RVP                  4       R# )zService %s games loadingTr@  r,   rA  r=   r  r?   rh   rB  rC  rk   rQ   r  Z&LutrisSidebar.on_service_games_loadingH  sv    /<::***8<Dgjj)5gjj)88:  NN4gjjArR   c                s^   \         P                  ! R VP                  4       VP                  V P                  9   dP   RV P                  VP                  ,          n        V P                  VP                  ,          P                  4        R# \         P                  ! RVP                  4       R# )zService %s games loadedFr@  TrD  rC  rk   rQ   r  Z%LutrisSidebar.on_service_games_loadedQ  sv    .

;::***8=Dgjj)5gjj)88:  NN4gjjArR   c                \    R V P                   n        V P                   P                  4        R# r   r	  r?   rh   ra   rb   rQ   r  Z&LutrisSidebar.on_local_library_syncingZ  s    %)"%%'rR   c                rE  )FNrF  ra   rb   rQ   r  Z%LutrisSidebar.on_local_library_synced^  s    %*"%%'rR   )r  r  r;   r  r  r	  r  r   r  r  r   r  r  r   r
  r  r   r  r  rd   )ry   rz   r{   r|   Z__gtype_name__r:   Zstaticmethodr   r  r"  r  r&  r)  r~   r-  r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   rQ   r   r     s     $NFP    L L
! !7 7M^ B B  &/%b
kZ   J J(( (rR   r   )_r}   r   r    r   Ztypingr   r   r   r   r   r   Zgi.repositoryr   r   r	   r
   Zlutrisr   r   r   Zlutris.configr   Zlutris.databaser   r   r   r:  r   r   Zlutris.database.categoriesr   Zlutris.database.saved_searchesr   Zlutris.gamer   r   r   r   Z%lutris.gui.config.edit_category_gamesr   Z#lutris.gui.config.edit_saved_searchr   Zlutris.gui.config.runnerr   Zlutris.gui.config.runner_boxr   Zlutris.gui.config.services_boxr   Zlutris.gui.dialogsr   Z!lutris.gui.dialogs.runner_installr   Zlutris.gui.widgets.utilsr   r    Zlutris.installer.interpreterr!   Zlutris.runnersr"   Zlutris.servicesr#   Zlutris.services.baser$   r%   r&   r'   r(   Zlutris.util.jobsr)   Zlutris.util.library_syncr*   r+   Zlutris.util.logr,   Zlutris.util.stringsr-   ZTYPEZSLUGZICONZLABELZ	GAMECOUNTZ	enumerater;  r   ri   r.   r   r   r   r   r   r   r   ZListBoxr   )r8  r>   s   00rQ   <module>rG     s;   !    > > 2 2 . . & 7 - = 9 A D D I E 7 2 6 , A I : - $  . P " 4		2;HMMO2LM2L;54;2LM\! \!~(4
 (4V!/ !:(vz (vV$2 $2N&2J &2RTCNN Tn. .l(CKK l(M Ns   3F