+
    Ki  c                   s   R t ^ RI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Ht ^ RIHtHt ^ RIHtHtHtHt ^ R	I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) ^ RI*H+t+H,t, ^ RI-H.t.H/t/H0t0H1t1H2t2 ^ RI3H4t4 ^ RI5H6t6 ^ RI7H8t8 ^ RI9H:t: ^ RI;H<t<H=t=H>t>H?t?H@t@ ^ RIAHBtBHCtC ^ RIDHEtE ^ RIFHGtG ^ RIHHItIHJtJHKtKHLtLHMtMHNtNHOtOHPtPHQtQ ^ RIRHStS ^ RITHUtU ^ RIVHWtW ^ RIXHYtY ^ R IZH[t[ ^ R!I\H]t]H^t^ ^ R"I_H`t`HataHbtb ^ R#IcHdtdHete ^ R$IfHgtg ^ R%IhHiti ^ R&IjHktkHltlHmtm ^ R'InHotoHptp ^ R(IqHrtr ^ R)IsHttt ^ R*IuHvtvHwtw ^ R+IxHytyHztzH{t{ ^ R,I|H}t}H~t~ ^ R-IHt ^ R.IHt ^ R/IHtHt ^ R0IHt ^ R1IHt ^ R2IHt ][! ]EP                  EP                  ]tEP                  ! 4       R3R44      R57       ! R6 R7]EP                  ]C]B4      4       tR8 R9 lt]@! ]+]4       R# ):z%Main window for the Lutris interface.N)
namedtuple)datetime)gettext)ngettext)DictIterableListSetcast)unquoteurlparse)GdkGioGLibGtk)servicessettings)LUTRIS_ACCOUNT_CONNECTEDLUTRIS_ACCOUNT_DISCONNECTEDget_runtime_versions)
categories)games)saved_searches)CATEGORIES_UPDATED)SAVED_SEARCHES_UPDATED)ServiceGameCollection)EsyncLimitErrorInvalidSearchTermError)GAME_INSTALLEDGAME_STOPPEDGAME_UNHANDLED_ERRORGAME_UPDATEDGame)dialogs)AddGamesWindow)SearchFiltersBox)PreferencesDialog)ClientLoginDialogErrorDialogQuestionDialogget_error_handlerregister_error_handler)DialogInstallUIDelegateDialogLaunchUIDelegate)ImportGameDialogDownloadQueue)	COL_INSTALLED_ATCOL_INSTALLED_AT_TEXTCOL_LASTPLAYEDCOL_LASTPLAYED_TEXTCOL_NAMECOL_PLAYTIMECOL_PLAYTIME_TEXTCOL_SORTNAMECOL_YEAR)GameGridView)GameListView)	GameStore)GameBar)GtkTemplate)LutrisSidebar
SidebarRow)load_icon_themeopen_uripick_stock_icon)ComponentUpdaterRuntimeUpdater)
GameSearch)NotPredicate)SERVICE_GAMES_LOADEDSERVICE_LOGINSERVICE_LOGOUT)LutrisService
sync_media)THEME_CHANGED)datapath)BUSY_STARTEDBUSY_STOPPED)COMPLETED_IDLE_TASK	AsyncCallschedule_at_idle)LOCAL_LIBRARY_UPDATEDLibrarySyncer)LINUX_SYSTEM)logger)MISSING_GAMESadd_to_path_cache)get_natural_sort_key)update_desktop_icons)clear_wine_version_cacheuizlutris-window.ui)r[   c                   s   a a ] tR t^Jt oRtRtRtRtR t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       t]	P                  ! 4       tRV3R lV 3R llltR tR tR	 tRV3R
 lR llt R t!]"R 4       t#]"R 4       t$RR lt%RR lt&R t'R t(]"V3R lR l4       t)R t*R t+]"R 4       t,]"R 4       t-]"R 4       t.]"R 4       t/]"R 4       t0]"R 4       t1]"R 4       t2]"R 4       t3]"R 4       t4V3R  lR! lt5R" 3R# lt6R$ t7R% t8V3R& lR' lt9R( t:R) t;RV3R* lR+ llt<R, t=]>R- 4       t?R. t@R/ tAV3R0 lR1 ltBR2 tCRR3 ltDR4 tER5 tFV3R6 lR7 ltG]>V3R8 lR9 l4       tHR: tIR; tJR< tKR= tLR> tMR? tNR@ tO]PP                  P                  ]PP                  P                  3RA ltSRB tT]"RC 4       tURD tVRE tWRF tXRG tYRH tZRI t[RJ t\RK t]RL t^]	P                  RM 4       t`RN taRO tbRP tcRQ tdRR teRS tfRT tgRU thRV tiRW tjRX tk]	P                  RY 4       tlRZ tmR[ tnR\ to]	P                  R] 4       tp]	P                  R^ 4       tq]	P                  R_ 4       tr]	P                  R` 4       tsRa tt]	P                  Rb 4       tu]	P                  Rc 4       tv]	P                  Rd 4       twV3Re lRf ltx]	P                  Rg 4       tyRh tzRi t{Rj t|Rk t}Rl t~Rm tRn tRo tRp tRq tRr tRs tV3Rt lRu ltRv tRw tRx t]"V3Ry lRz l4       tV3R{ lR| ltRV3R} lR~ lltV3R ltRtVtV ;t# )LutrisWindowz&Handler class for main window signals.grid   X  c                   < V ^8  d   QhRR/#    returnN format__classdict__   "</usr/lib/python3.14/site-packages/lutris/gui/lutriswindow.py__annotate__LutrisWindow.__annotate__e   s     q? q?d q?    c                s  < \        \        P                  ! R 4      ;'       g    V P                  4      p\        \        P                  ! R4      ;'       g    V P                  4      p\
        SV `  ! R&RVRVR\        P                  P                  RRRRR	V/VB  \        4        \        4        V P                  RR4       Wn        V P                  4       w  V n        V n        V P#                  4        . V n        W43V n        \        P                  ! R
4      R8H  V n        RV n        \,        V n        V P1                  4       V n        RV n        V P7                  V P2                  P9                  R4      4       V P;                  4       V n        \?        V P*                  V P@                  4      V n!        ^ V n"        \        PF                  ! 4       V n$        / V n%        RV PL                  RV PN                  RV PP                  /V n)        \T        PV                   FK  pVPY                  4       V PR                  9  g   K$  VPZ                  V PR                  VPY                  4       &   KM  	  \        P\                  ! 4       V n/        V Pa                  V P^                  4       V Pc                  RV Pd                  4       V Pc                  RV Pf                  4       V Pc                  RV Ph                  4       V Pc                  RV Pj                  4       V Pc                  RV Pl                  4       V P(                  '       d   V Po                  4        V Pq                  4        V Ps                  4        RR.p\u        VRR7      pV Pv                  Py                  4       pVP{                  V\        P|                  P~                  4       RV n@        V P                  \        P                  P                  . \        P                  P                  4       V P                  4        V P                  V P                  4       \        P                  P                  R\        P|                  P                  4      p	V	P                  ^4       \        V P                  4      V nO        V P                  Pc                  RV P                  4       V P                  Pc                  RV P                  4       V P                  P                  V P                  4       V P                  P                  4        V P                  P                  V P                  4       V P                  P                  R4       RV nY        \        P                  ! RR7      V n[        V P                  P                  V P                  4       V P                  4        V P                  4        \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  P                  V P                  4       \        P                  P                  V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       \        P                  ! V P                  4       E\         P                  ! V EP                  4       \        P                  ! RR R!7      p
V
'       d   V
EP                  R"^R#7      MRV P                  n        E\	        V EP
                  R$R%7       R# )'widthheightdefault_widthdefault_heightZwindow_positionnamelutris	icon_nameznet.lutris.Lutrisapplication	maximizedTrueNservicerecentmissingrunningzdelete-eventzconfigure-eventZrealizezdrag-data-receivedznotify::visiblezfilter-symboliczedit-find-replace-symboliczsystem-search-symbolic)Zfallback_name zselected-rows-changedi,  Tvisibleselected_categoryz
runner:alldefaultZ:)Zmaxsplitg      ?Zdelay_secondsrd   )intr   read_settingro   rp   Zsuper__init__r   ZWindowPositionZNONErY   r?   Zset_wmclassrt   get_positionwindow_xwindow_yrestore_window_positionthreads_stopperswindow_sizeru   rw   rO   search_timer_taskload_filtersfiltersgame_searchset_servicegetload_icon_type	icon_typer:   service_media
game_store_game_store_generationBoxcurrent_viewviewsget_recent_gamesget_missing_gamesget_running_games!dynamic_categories_game_factoriesr   Z_SMART_CATEGORIESZget_name	get_gamesZ
AccelGroupacceleratorsZadd_accel_groupconnecton_window_deleteon_window_configureon_loadon_drag_data_receivedon_visible_changedZmaximizeZinit_template_init_actionsrA   search_filters_button	get_childset_from_icon_nameIconSizeBUTTONfilter_box_search_nameZdrag_dest_setZDestDefaultsZALLr   Z
DragActionZCOPYZdrag_dest_add_uri_targetsset_viewtype_iconcurrent_view_typeImageZnew_from_icon_nameZMENUZset_margin_rightr=   sidebaron_sidebar_changedon_sidebar_realizesidebar_scrolledaddZinitialize_rowssidebar_revealerset_reveal_childside_panel_visibleZset_transition_durationgame_barHBoxrevealer_boxgame_revealerupdate_action_stateupdate_notificationrM   Zregisteron_busy_startedrN   on_busy_stoppedrG   on_service_loginrH   on_service_logoutrF   on_service_games_loadedr   on_categories_updatedr   r   on_game_updatedr   on_game_stoppedr   on_game_installedr   on_game_unhandled_errorZSETTINGS_CHANGEDon_settings_changedrV   Zupdated update_missing_games_sidebar_rowr   on_lutris_account_connectedr   on_lutris_account_disconnectedrR   on_local_library_updatedrK   on_theme_changedZsplitr~   rQ   sync_library)selfrt   Zkwargsrm   rn   Zsmart_categoryZfallback_filter_icons_namesrs   Zfilter_button_imageZlutris_iconr~   	__class__s   &&,        ri   r   ZLutrisWindow.__init__e   s%   H))'2HHd6H6HIX**84KK8K8KL 	
	
!	
  ..33	
 		

 *	
 $	
 	
 	,.AB&'+'8'8':$t}$$& "!?!..{;vE!4((*)))45,,.#DLL$2D2DE&'#GGI
 d++t--t--2
. )::N&&(0V0VVTbTlTl66~7N7N7PQ ;  NN,T../^T%:%:;&(@(@AY-)4+E+EF&(?(?@>>>MMO (9:V&W##$?Ogh	)-)C)C)M)M)O..y#,,:M:MN&(# 	3++//S^^5H5HI&&(t556ii223FHYHYZ$$Q'$T%5%564d6M6MNY(?(?@!!$,,/ 	$$&..t/F/FG55c:HHT2t001  "  "d223d223t445 6 67%%d&B&BC##D$>$>?''(B(BCd223d223 6 67%%d&B&BC!!**4+C+CD&&t'L'LM ))$*J*JK#,,T-P-PQ&&t'D'DEt445 %112E|\Uf):)@)@q)@)Qlp&**#>rl   c                s    \         P                  P                  4       pV P                  4       P	                  \         P
                  P                  VR 4      4       R# )ZprogressN)r   ZDisplayZget_default
get_window
set_cursorZCursorZnew_from_name)r   Zdisplay   & ri   r   ZLutrisWindow.on_busy_started   s:    ++))+$$SZZ%=%=gz%RSrl   c                sD    V P                  4       P                  R 4       R # N)r   r   r      &ri   r   ZLutrisWindow.on_busy_stopped   s    $$T*rl   c           	     s  a  \        R R(4      pR)VP                  n        / RV! S P                  4      bRV! S P                  4      bRV! S P
                  4      bRV! S P                  RS P                  RR7      bR	V! S P                  4      bR
V! S P                  R\        P                  ! R4      RR7      bRV! S P                  RS P                  R7      bRV! S P                  RS P                  V 3R lR7      bRV! S P                   RS P"                  V 3R lR7      bRV! S P$                  RS P&                  V 3R lR7      bRV! S P(                  RS P*                  RR7      bRV! S P,                  V 3R lRR7      bRV! S P.                  4      bRV! R 4      bR V! R! 4      bR"V! R# 4      bp/ S n        . S n        S P4                  P6                  pVP9                  4        EFy  w  rEVP:                  '       g=   \<        P>                  PA                  V4      pVPC                  R$VPD                  4       MRpRpVPF                  e,   \H        PJ                  ! VP:                  VPF                  4      pVP:                  R8w  d   VPM                  4       p\<        P>                  PO                  WHV4      pVPC                  R%VPD                  4       VS P0                  V&   VPP                  '       d"   We3R& lp	S P2                  PS                  V	4       S PU                  V4       VPV                  '       g   EKV  VPY                  VPV                  R'V,           4       EK|  	  R# )*ActionNzadd-gameZpreferencesZaboutzshow-installed-onlyZbz
<Primary>i)typer   accelztoggle-viewtypeztoggle-badgeshide_badges_on_iconsz
<Primary>pz	icon-types)r   r   view-sortingc                     < S P                   # r   is_view_sort_sensitiver      ri   <lambda>,LutrisWindow._init_actions.<locals>.<lambda>        ; ;rl   )r   r   enabledview-sorting-installed-firstc                  r   r   r   r   r   ri   r   r      r   rl   view-reverse-orderc                  r   r   r   r   r   ri   r   r     r   rl   zshow-side-panelZF9zshow-hidden-gamesc                  r   r   )is_show_hidden_sensitiver   r   ri   r   r     s     = =rl   z
<Primary>h)r   r   zopen-search-filterszopen-forumsc                      \        R 4      # )zhttps://forums.lutris.net/r@   Zx   *ri   r   r     s
    X6R-Srl   zopen-discordc                  r   )zhttps://discord.gg/Pnt5CuYr   r   r   ri   r   r     s
    h7S.Trl   Zdonatec                  r   )zhttps://lutris.net/donater   r   r   ri   r   r     s
    1L(Mrl   Zactivatezchange-statec                 sD    VP                  4       V P                  n         R # r   )r   props)actionvalue   &&ri   updaterZ+LutrisWindow._init_actions.<locals>.updater+  s    +0==?FLL(rl   zwin.)callbackr   r   r   r   )NNNNN)-r    Z__new__Z__defaults__on_add_game_button_clickedon_preferences_activateon_about_clickedon_show_installed_state_changefilter_installedon_toggle_viewtypeon_toggle_badgesr   r   on_icontype_state_changer   on_view_sorting_state_changeview_sorting&on_view_sorting_installed_first_changeview_sorting_installed_first on_view_sorting_direction_changeview_reverse_orderon_side_panel_state_changer   on_show_hidden_clickedon_open_search_filtersactionsaction_state_updatersr   rt   itemsr   r   ZSimpleActionZnewr   r   r   r   ZVariantZget_typeZnew_statefulr   appendZ
add_actionr   Zadd_accelerator)
r   r   r  apprq   r   r   Zdefault_valueZ
param_typer   s
   f         ri   r   ZLutrisWindow._init_actions   sH   H&YZ&D#3
t>>?3
6$">">?3
 VD1123
 "633--"	$	3
 vd&=&=>3
 V%% --.DE"	3
"  = =CQUQ_Q_`#3
$ F11));	%3
0 +F;;99;	-13
< !&55//;	#=3
H v////	 I3
T  ++=""U3
^ "6$*E*E#F_3
` 6"STa3
b F#TUc3
d fMNe3
j %'"jj$$"==?KD:::))--d3z5>>: $!
==,$(LLU]]$KM::$!.!7!7!9J))66tW~u~~>!'DLL}}}#) ; **11':OOF#{{{##EKK$?- +rl   c                $   < V ^8  d   QhRS[ RR/# )rb   forcerc   Nboolre   rh   ri   rj   rk   3  s     	m 	m$ 	m4 	mrl   c                s    R p\         P                  ! RR4      '       d-   \        \        4       P                  V'       d   TMRVR7       R# R# )z8Tasks that can be run after the UI has been initialized.c                s:    V'       g   \        \        R4       R# R# )z&Sync media after the library is loadedN)rP   rJ   )Z_resulterrorr   ri   on_library_syncedZ4LutrisWindow.sync_library.<locals>.on_library_synced6  s    *d+ rl   Zlibrary_sync_enabledTNr  )r   read_bool_settingrP   rS   Zsync_local_library)r   r  r     && ri   r   ZLutrisWindow.sync_library3  s>    	,
 %%&<dCCmo88u:KZ^fkl Drl   c                s:    V P                    F
  pV! 4        K  	  R# )zaThis invokes the functions to update the enabled states of all the actions
which can be disabled.N)r  )r   r   r   ri   r   Z LutrisWindow.update_action_state>  s     11GI 2rl   c                s@    V P                  V P                  4       4      # r   )get_service_mediar   r   r   ri   r   ZLutrisWindow.service_mediaD  s    %%d&9&9&;<<rl   c                s.    V P                   P                  # r   )r   r~   r   r   ri   r~   ZLutrisWindow.selected_categoryH  s    ||---rl   c                sZ    V P                  4        V P                  P                  4        R# )zFinish initializing the viewN)_bind_zoom_adjustmentr   
grab_focusr   widgetdata   &&&ri   r   ZLutrisWindow.on_loadL  s     ""$$$&rl   c                s:    V P                   P                  4        R# )zOGrab the initial focus after the sidebar is initialized - so the view is ready.N)r   r  r  r  ri   r   ZLutrisWindow.on_sidebar_realizeQ  s    $$&rl   c                s    VP                  4        Uu. uF!  p\        \        V4      P                  4      NK#  	  p	p\	        WR7      p
V
P                  4        R# u upi )zHandler for drop eventparentN)Zget_urisr	   r
   pathr,   show)r   _widgetZ_drag_contextZ_xZ_yr  Z_infoZ_timeZuriZ
file_pathsdialogs   &&&&&&&&   ri   r   Z"LutrisWindow.on_drag_data_receivedU  sD    =A]]_M_cghsm001_
M!*: Ns   'Ac                s    RV P                   /# )z/Load the initial filters when creating the view	installed)r   r   r   ri   r   ZLutrisWindow.load_filters[  s     T2233rl   c                    < V ^8  d   QhRS[ /# rb   rc   r	  re   rh   ri   rj   rk   a  s     
 
$ 
rl   c                s    \        V P                  P                  R8H  ;'       g    \        P                  ! R.4      4      # )z+True if there are any hidden games to show..hiddencategoryr   )r
  r   r~   categories_dbget_game_ids_for_categoriesr   r   ri   r   Z%LutrisWindow.is_show_hidden_sensitive`  s@     LL**.EE F F88)E
 	
rl   c                s2   RpV P                   P                  V8X  dF   V P                   P                  '       d(   V P                   P                  V P                   n        R# R# V P                   P                  P	                  4        W0P                   n        R# )zHides or shows the hidden gamesNr!  )r   r~   Zprevious_category
hidden_rowr  )r   r   r   Zhidden_category   &&& ri   r   Z#LutrisWindow.on_show_hidden_clickedh  sf    /<<))_<||---151O1O. . LL##((*-<LL*rl   c                s4  a aa VV 3R  lpVV 3R lpS P                   P                  4       '       d   S P                  4       p\        P                  ! ^ R\        V4      4      p\        VS P                  R7      oSP                  RR
4       S P                  '       d   S P                  Sn
        SP                  RV4       SP                  4        \        P                  ! SRS P                   R7      oSP                  RV4       SP                  4        R	# R	# )c                 s`   < SP                   Sn        SP                  P                  R 4       R# )FN)search_namer   r   Z
set_active)Z_popover
filter_boxr   s   &ri   on_filter_popover_closedZELutrisWindow.on_open_search_filters.<locals>.on_filter_popover_closeds  s%    *4*@*@D'&&11%8rl   c                 sN   <a VV3R  lpSP                  4        \        V4       R# )c                  sd   < R S 3SP                   n        SP                  P                  R4       R# )saved_searchr{   N)r   r~   search_entryset_text)r'  r   s   ri   switch_to_saved_searchZULutrisWindow.on_open_search_filters.<locals>.on_saved.<locals>.switch_to_saved_searchx  s(    1?1L.!!**2.rl   N)ZpopdownrQ   )Z_boxr'  r-  filter_popoverr   s   &f ri   on_savedZ5LutrisWindow.on_open_search_filters.<locals>.on_savedw  s    / ""$34rl   r{   )r*  r+  r_   ZsavedF)childZ	can_focusZrelative_toZclosedN)r   Z
get_activeget_game_searchsaved_searches_dbZSavedSearchstrr#   r+  set_size_requestr   r'  r   r  r   ZPopoverZpopup)	r   Z_actionZ_valuer)  r/  searchZ
new_searchr(  r.  s	   f&&    @@ri   r  Z#LutrisWindow.on_open_search_filtersr  s    	9	5 %%0022))+F*66q"c&kJJ)zPTPaPabJ''R0***)-)D)D
&w1OO [[zUX\XrXrsN""8-EF  " 3rl   c                sB    \         P                  ! R4      ;'       g    R# )z@Returns which kind of view is currently presented (grid or list)	view_typer]   )r   r   r   r   ri   r   ZLutrisWindow.current_view_type  s     $$[1;;V;rl   c                0    \         P                  ! R R4      # )r   Fr   r  r   r   ri   r   ZLutrisWindow.filter_installed  s    ))*<eDDrl   c                r8  )r   Tr9  r   r   ri   r   ZLutrisWindow.side_panel_visible  s    ))*>EErl   c                s0    \         P                  ! RR4      # )z#Setting to hide or show status iconshow_tray_iconFr9  r   r   ri   r:  ZLutrisWindow.show_tray_icon  s     ))*:EBBrl   c                s~    \         P                  ! R 4      ;'       g    RpVP                  R4      '       d   VRR pV# )r   rq   Z_textNi)r   r   endswith)r   r   r   ri   r   ZLutrisWindow.view_sorting  s9    %%n5??>>'""#2JErl   c                r8  )r   Fr9  r   r   ri   r   ZLutrisWindow.view_reverse_order  s    ))*>FFrl   c                r8  )r   Tr9  r   r   ri   r   Z)LutrisWindow.view_sorting_installed_first  s    ))*H$OOrl   c                r8  )show_hidden_gamesFr9  r   r   ri   r<  ZLutrisWindow.show_hidden_games  s    ))*=uEErl   c                sR    V P                   P                  R4      V P                  9  # )zSTrue if the view sorting options will be effective; dynamic categories ignore them.dynamic_category)r   r   r   r   r   ri   r   Z#LutrisWindow.is_view_sort_sensitive  s%     || 234;a;aaarl   c                0   < V ^8  d   QhRS[ S[,          /# r  )r   r   re   rh   ri   rj   rk     s      CH rl   c                s   V P                   '       d   V P                  R 8X  d   \        \        \        .4      # V P                  R8X  d   \        \
        .4      # V P                  R8X  d   \        \        \        .4      # V P                  R8X  d   \        \        \        .4      # V P                  R8X  d   \        \        \        .4      # \        4       # )rq   year
lastplayedinstalled_atplaytime)r   r   setr3   r6   r7   r1   r2   r/   r0   r4   r5   r   r   ri   get_sort_sensitive_columnsZ'LutrisWindow.get_sort_sensitive_columns  s    &&&  F*Hl344""f,H:&""l2N,?@AA""n4,.CDEE""j0L*;<==url   c                s    V # r   rd   )Zir   ri   r   ZLutrisWindow.<lambda>  s    rl   c           
     s   a aaaaa RRR^ RRRRRR/oVV V3R loV 3R	 loV 3R
 loVVVVV 3R lpS P                   R8X  d   S P                  MS P                  '       * p\        WVR7      # )a  This sorts a list of items according to the view settings of this window;
the items can be anything, but you can provide a lambda that provides a
database game dictionary for each one; this dictionary carries the
data we sort on (though any field may be missing).

This sort always sorts installed games ahead of uninstalled ones, even when
the sort is set to descending.

This treats 'name' sorting specially, applying a natural sort so that
'Mega slap battler 20' comes after 'Mega slap battler 3'.rq   r{   r?  r@  g        rA  rB  c                s   < SP                   R8X  d@   SP                  '       d.   SP                  P                  V 4      pS! V4      pV'       d   V# SP                  SP                   R4      # )zjReturns the default value to use when the value is missing; we may be able
to extract this from the item..r?  r{   )r   rw   Zget_game_release_dater   )itemZservice_yearconvert_valuer   sort_defaults   & ri   get_sort_defaultZ6LutrisWindow.apply_view_sort.<locals>.get_sort_default  s]       F*t|||#||AA$G,\:'' !$$T%6%6;;rl   c                s  <  V '       g   R# SP                   R8X  d   \        V 4      # SP                   R8X  d8   \        V \        4      '       d   \	        V P
                  4      #  \	        V 4      # \        V 4      #   \         d9    \        P                  ! \        T 4      R4      p\	        TP
                  4      u # i ; i  \         d     R# i ; i)ziConverts 'value' to the type required for the sort that is in use. Returns None if this
can't be managed.Nrq   r?  z%Y-%m-%d)	r   r4  
isinstancer   r   r?  
ValueErrorZstrptimeZfloat)r   Zas_dater      & ri   rF  Z3LutrisWindow.apply_view_sort.<locals>.convert_value  s    $$.u:%$$.!%22"5::.5#&u:-
 !<'	  * 5&.&7&7E
J&OG#&w||#445
  s@   C C ;C &
A< 1
C <A B?<C >B??C CCc                s   < SP                   R8X  d   \        V 4      # SP                   R8X  d(   \        V 4      pSP                  '       d   V'       * pW3# V # )zIExpands the value to sort by to a more complex form, for smarter sorting.rq   r?  )r   rX   r
  r   )r   Zcontains_yearr   rL  ri   extend_valueZ2LutrisWindow.apply_view_sort.<locals>.extend_value  sU      F*+E22  F* $U***(5$5M$++Lrl   c                 s  < S! V 4      pV'       g   R pRpMq\        VP                  R4      4      pSP                  R8X  d,   VP                  R4      ;'       g    VP                  R4      pMVP                  SP                  4      pS! V4      ;'       g	    S! V 4      pS! V4      pSP                  '       d5   SP                  '       d   V'       * pSP                  R8X  d   V'       * pW#3# V# )FNr  rq   Zsortname)r
  r   r   r   r   )	rE  db_gameZinstallation_flagr   rF  rM  rI  resolverr   s	   &   ri   get_sort_valueZ4LutrisWindow.apply_view_sort.<locals>.get_sort_value  s    tnG$)!$([)A$B! $$.#KK
3JJw{{67JE#KK(9(9:E!%(BB,<T,BE 'E000 ***,=(=%$$.,=(=%(//Lrl   Zkeyreverse)r   r   sorted)	r   r  rO  rP  rR  rF  rM  rI  rG  s	   f&f  @@@@ri   apply_view_sortZLutrisWindow.apply_view_sort  sq     BA#C
	<	.			 	8 .2->->&-H$))RVRiRiNieAArl   c                s^    \         P                  ! V P                  P                  4       4      # )(Return a list of currently running games)games_dbget_games_by_idsrt   Zget_running_game_idsr   r   ri   r   ZLutrisWindow.get_running_games&  s"    (()9)9)N)N)PQQrl   c                sl    \         P                  ! \        P                  4      pV P	                  V4      # r   )rV  rW  rV   missing_game_idsfilter_gamesr   r   r   ri   r   ZLutrisWindow.get_missing_games*  s)    ))-*H*HI  ''rl   c                r`   ra   rd   re   rh   ri   rj   rk   .  s     
, 
,$ 
,rl   c                s   V P                  4       pV'       dJ   V P                  P                  P                  4        V P                  R8X  d   V P                  4        R# R# \        P                  pV'       d!   \        P                  ! R\        V4      4       V P                  P                  P                  4        R# )r=  z(Path cache out of date? (%s IDs missing)N)r=  ry   )r   r   Zmissing_rowr  r~   update_storerV   rX  rU   Zwarninglenhide)r   Zmissing_gamesZmissing_ids   &  ri   r   Z-LutrisWindow.update_missing_games_sidebar_row.  s    ..0LL$$))+%%)HH!!# I (88KI3{K[\LL$$))+rl   c                st    \         P                  ! RR/R7      pV P                  V4      p\        VR RR7      # )rU  r  1r   c                 s^    \        V R ,          ;'       g    ^ V R,          ;'       g    ^ 4      # )rA  r@  )max)gamer   ri   r   Z/LutrisWindow.get_recent_games.<locals>.<lambda>>  s'    c$~2F2K2K!TR^M_MdMdcd.erl   TrQ  )rV  r   rY  rS  rZ  r   ri   r   ZLutrisWindow.get_recent_games:  s8    ""K+=>!!%(e!eosttrl   c                s4   V P                   P                  R4      ;'       g    RpV P                  eA   V P                  P                  V P                  8w  g   V P                  P                  V8w  d   \        WP                  4      V n        V P                  # )zReturns a game-search object for the current view settings and search text; this object
is cached so that we need not re-parse the search if it has not changed.textr{   )r   r   r   rw   rc  rD   )r   rc  r   ri   r2  ZLutrisWindow.get_game_search@  su     ||'--2#t'7'7'?'?4<<'OSWScScShShlpSp)$=Drl   c                r>  )rb   searches)r   rD   re   rh   ri   rj   rk   H  s     9 9HZ,@ 9rl   c                sz  a Sf   V P                  4       pV P                  P                  R4      '       d9   VP                  R4      '       g"   VP	                  VP                  RR7      4      pV P                  P                  R4      ;'       g    RpVR8w  dA   VP                  R4      '       g*   VP	                  \        VP                  R4      4      4      pV.oS Uu. uF  q3P                  '       d   K  VNK  	  ppV'       g   V# V3R lpV Uu. uF  qv! V4      '       g   K  VNK  	  up# u upi u upi )	zFilters a list of games according to the 'installed' and 'text' filters, if those are
set. But if not, can just return games unchanged.r  T)r  r"  allr   hiddenc                 sN   < S F  pVP                  V 4      '       d   K   R # 	  R# )FT)matches)rb  r6  rd  rL  ri   rg  Z*LutrisWindow.filter_games.<locals>.matches^  s$    "~~d++  # rl   )	r2  r   r   has_componentZwith_predicateZget_installed_predicaterE   Zget_category_predicateZis_empty)r   r   rd  r6  r"  Zto_applyrg  rb  s   &&f     ri   rY  ZLutrisWindow.filter_gamesH  s
    ))+F||,,V5I5I+5V5V..v/M/MX\/M/]^||''
3<<uH9$V-A-A(-K-K..|F<Y<YZc<d/efxH)1IvFFIL	 "'8'$-88 J 9s   "D3:D3D8*D8c                sf   V P                   '       d(   V P                   P                  V8X  d   V P                   # V'       g
   R V n         R #  \        P                  V,          ! 4       V n         V P                   #   \         d-    \
        P                  ! RT4       R T n          T P                   # i ; i)NzNon existent service '%s')rw   idr   SERVICESZKeyErrorrU   r  )r   service_namer   ri   r   ZLutrisWindow.set_servicef  s    <<<DLLOO|;<<DL	 #,,\:<DL ||  	 LL4lCDL||	 s   !A9 9)B0/B0c                s    V'       dE   V R,          VR,          8X  d0   R F  pW,          W&   K  	  RV 9   d
   V R,          MVR,          V R&   V # )z2Inject lutris game information into a service gameappid
service_idr?  )platformrunnerrA  r@  rB  r  rd   )Zservice_gameZlutris_gameZfieldr  ri   combine_gamesZLutrisWindow.combine_gamess  sS     <0K4MMf&1&8# g;A\;Q<#7WbciWjL rl   c                sB  a \         P                  ! V4      pV F!  pV P                  P                  V4      VR&   K#  	  VR8X  d.   \        P
                  ! 4        Uu/ uF  qDR,          VbK  	  upoMD\        P
                  ! RV P                  P                  /R7       Uu/ uF  qDR,          VbK  	  upoT P                  V P                  VV3R l4       Uu. uF+  pV P                  VSP                  VR,          4      4      NK-  	  up4      # u upi u upi u upi )	z'Return games for the service indicated.r?  rr   Zslugrw   r`  rm  c                 sH   < SP                  V R ,          4      ;'       g    T # )rl  )r   )rb  lutris_gamess   &ri   r   Z0LutrisWindow.get_service_games.<locals>.<lambda>  s#    \M]M]^bcj^kMlMtMtptMtrl   rl  )r   Zget_for_servicerw   Zget_game_release_yearrV  r   ri  rY  rT  rp  r   )r   rm  Zservice_gamesrb  Zgrq  s   &&   @ri   get_service_gamesZLutrisWindow.get_service_games|  s   -==jI!D<<==dCDL " !2:2D2D2FG2FQfIqL2FGL8@8J8JT]_c_k_k_n_nSo8pq8p1lOQ.8pqL   !00@tuuD ""4)9)9$w-)HIu
 	
	 Hqs   D"D1Dc                s   V P                   P                  R 4      pV\        P                  9   d`   V P                  P
                  '       d3   V P                  P                  4       '       g   V P                  4        . # V P                  V4      # V P                   P                  R4      V P                  9   d*   V P                  V P                   R,          ,          ! 4       # V P                  4       pV P                   P                  R4      ;'       g    RpV.pV P                   P                  R4      pV'       dH   \        P                  ! V4      pV'       d*    VP                  \        VP                  RR7      4       RpVR8w  d   V.MRpVR8w  d>   \"        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      '       g   R.M. p\$        P&                  ! Wx4      p	V P)                  4       p
/ pV P                   P                  R4      R8X  dL   R V P                   9  d;   \+        R \        P                  P-                  4        4       4      pV'       d   WR &   \.        P0                  ! WR7      pT P3                  V Uu. uF  qR,          V	9   g   K  VNK  	  upVR7      pV P5                  V4      #   \          d     ELMi ; iu upi )rw   r=  r"  re  r*  N)rw   r   c              3   sV   "   T F  qP                  R 4      '       g   K  Vx  K!  	  R# 5i)rf  N)rh  .0r   r   ri   	<genexpr>6LutrisWindow.get_games_from_filters.<locals>.<genexpr>  s     <n1TcTcdlTmQQs   )
)TFc              3   s   "   T F=  p\         P                  ! VR ,           RRR7      '       d   K+  VP                  4       x  K?  	  R# 5i)_in_games_viewTr   )r   sectionN)r   r  Zcasefoldrs  r   ri   ru  rv    s>      $1A11!6F2FPT^hii 

1s
   (AA)r   excludesri  )rd  )r   r   r   rj  rw   onlineis_authenticatedshow_empty_labelrr  r   r2  r3  Zget_saved_search_by_namer  rD   r6  r   Zanyr#  r$  get_sql_filtersrC  keysrV  r   rY  rT  )r   rm  r6  r"  rd  r*  Zsaved_search_foundZincludedZexcludedZcategory_game_idsr   ry  Zexcluded_servicesr   rb  s   &              ri   get_games_from_filtersZ#LutrisWindow.get_games_from_filters  sR   \\%%i0
***||"""4<<+H+H+J+J%%'	))*55<<./43Y3YY99$,,GY:Z[]]%%'<<##J/8858||''7!2!K!KL!Y!OOJ/A/H/HRV$WX$H "*U!2H:#y0<n<n<n<n9n9nYKtv 	 *EEhY&&(<<J'50Ydll5R # $!**//1$ !
 !&7#""7F!!E"]ED$ZK\=\44E"]hp!q##E**/ . , #^s   (K K$KKKc                s6   < V ^8  d   QhRS[ S[S[3,          /# r  )r   r4  re   rh   ri   rj   rk     s      c3h rl   c                s|   / pV P                   P                  R4      '       d   V P                   R,          VR&   V P                   P                  R4      '       d   V P                   R,          VR&   V P                   P                  R4      '       d+   V P                  4       P                  R4      '       g   RVR&   V# )z'Return the current filters for the viewro  rn  r  r_  )r   r   r2  rh  )r   Zsql_filtersr   ri   r}  ZLutrisWindow.get_sql_filters  s    <<H%%$(LL$:K!<<J''&*ll:&>K
#<<K((1E1E1G1U1UVa1b1b'*K$ rl   c                s    V P                   '       d   V P                   M\        pVP                  pW9   d   W1,          ! 4       # W2P                  ,          ! 4       # )z0Return the ServiceMedia class used for this view)rw   rI   mediasdefault_format)r   r   rw   r     &&  ri   r  ZLutrisWindow.get_service_media  sB    "&,,,$,,M$&&,,-//rl   c                s"   Ve   V P                   '       d   V P                   P                  4        \        V4      ^8X  d\   V^ ,          '       dM   \        V^ ,          V P                  V 4      V n         V P
                  P                  V P                   RR^ 4       MR V n         MV P                   '       d    V P
                  P                  4       '       d   V P                  P                  R4       R # V P                  P                  R4       R # )NTF)
r   destroyr\  r;   rt   r   
pack_startget_childrenr   r   rZ  r   ri   update_revealerZLutrisWindow.update_revealer  s    }}}%%'5zQ588 'a$2B2BD I!!,,T]]D$J $]]]
 ))++//5//6rl   c                sH   V P                   '       dt   V P                   P                  '       dX   V P                   P                  4       '       g8   V P                  \	        R4      V P                   P
                  ,          4       R# V P                  P                  R4      p\        P                  ! RR4      pV'       d   V P                  P                  R4      R8X  d$   V P                  \	        R4      V,          4       R# V P                  P                  R4      R	8X  d$   V P                  \	        R
4      V,          4       R# V P                  P                  R4      '       d,   V'       d$   V P                  \	        R4      V,          4       R# V P                  \	        R4      V,          4       R# V P                  P                  R4      R8X  d   V P                  \	        R4      4       R# V P                  P                  R4      R	8X  d   V P                  \	        R4      4       R# V P                  P                  R4      '       d%   V'       d   V P                  \	        R4      4       R# V P                  P                  R4      '       gv   V P                  P                  R4      '       gU   V P                  P                  R4      '       g4   V P                  P                  R4      '       g   V P                  4        R# V P                  \	        R4      4       R# )z&Display a label when the view is emptyz,Connect your %s account to access your gamesNrc  r  0r"  Zfavoritez:Add a game matching '%s' to your favorites to see it here.r   z$No hidden games matching '%s' found.zONo installed games matching '%s' found. Press Ctrl+I to show uninstalled games.zNo games matching '%s' found z-Add games to your favorites to see them here.zNo games are hidden.zANo installed games found. Press Ctrl+I to show uninstalled games.ro  rw   rn  r=  zNo games found)rw   rz  r{  
show_label_rq   r   r   rV  Zget_game_countshow_splash)r   Zfilter_textZhas_uninstalled_gamesr^  ri   r|  ZLutrisWindow.show_empty_label  s   <<<DLL///8U8U8W8WOOALMPTP\P\PaPaabll&&v. ( 7 7S I||
+z9"^ _bm mn!!*-:"H IK WX!!+..3Hghkvv "A B[ PQ||
+z9"Q RS!!*-:"8 9:!!+..3H"e fgLL$$X..((33((44(();<<  ""2 34rl   c                sz    V P                   P                  4        V P                  4        V P                  4        R # r   )r   Zupdate_rowsr   r[  r   r   ri   refresh_viewZLutrisWindow.refresh_view  s*      "--/rl   c                r`   ra   rd   re   rh   ri   rj   rk     s     @? @?d @?rl   c                s   a aaaaaa S P                   P                  R 4      oS P                  oS P                  oS ;P                  ^,          un        S P                  oVVV3R loVVVV 3R lpVV 3R lo\        S P                  V4       R# )rw   c                 sF   < \        SS4      pVP                  V S4       W3# r   )r:   Zadd_preloaded_games)r   r   rw   rm  r   rH  ri   make_game_storeZ2LutrisWindow.update_store.<locals>.make_game_store  s(    "7M:J**5*=$$rl   c                 s   < SSP                   8w  d   R # V'       d   Vh\        V 4      R8  d   SP                  4        \        SSV 4       R # )Ni   )r   r\  show_spinnerrP   )r   r  apply_store
generationr  r   s   &&ri   on_games_readyZ1LutrisWindow.update_store.<locals>.on_games_ready  sB    T888
 5zC!!#o{E:rl   c                 sr  < SSP                   8w  d   R # V'       d   VhV w  r#SP                  V4      pSP                  P                  V4       SP                  P                  4        F  pSP                  Vn        K  	  \        P                  ! SP                  4       SP                  V8w  d   VSn
        SP                  pVSP                  9   d   SP                  V,          pVSn        VP                  4        Uu. uF  quP                  V4      NK  	  ppVP                  SP                  4       V U	u. uF  qP!                  V	4      NK  	  p
p	VP#                  \%        R V
4      RR7       V'       d   SP'                  4        MSP)                  4        SP+                  4        R # u upi u up	i )NT)Zscroll_into_view)r   _get_search_placeholder_textr+  Zset_placeholder_textr   Zvaluesrw   r   idle_addr  r   r   r   Zget_selectedget_game_id_for_pathZset_game_storeZget_path_for_game_idZset_selectedZfilterhide_overlayr|  r   )resultr  r   r   Zplaceholder_textviewr7  ZpZselected_idsgame_idZnew_selectionr  r   s   &&         ri   r  Z.LutrisWindow.update_store.<locals>.apply_store,  sd   T888 &E#@@G223CD

))+#|| , MM$../*,", 22	

*::i0D(,D%JNJ[J[J]#^J]Q$=$=a$@J]L#^''8Wc$dWcG%>%>w%GWcM$d%%fT=&ATX%Y!!#%%'$$& $_$ds   F/<F4N)r   r   rw   r   r   rP   r  )r   r  r  r  r  rw   rm  r   s   f @@@@@@ri   r[  ZLutrisWindow.update_store  sn    \\%%i0
,,**##q(#00
	%
	; 	;#	'J 	$--~>rl   c                r  r  )r4  re   rh   ri   rj   rk   T  s     X Xs Xrl   c                sf    V '       g   \        R 4      # \        V 4      p\        RRV4      V,          # )zSearch gameszSearch %d gamezSearch %d games)r  r\  r   )r   Zgames_countr   ri   r  Z)LutrisWindow._get_search_placeholder_textS  s/    ^$$%j(*;[IKWWrl   c                sR   V P                   '       d   V P                   M\        pV P                  4       pV P                  P	                  ^ 4       V P                  P                  \        VP                  4      ^,
          4       W!P                  9  d   VP                  p \        VP                  P                  4       4      P                  V4      pW0P                  P                  n        V P                  P                  RV P                   4       R#   \         d    ^ p LQi ; i)z2Bind the zoom slider to the supported banner sizeszvalue-changedN)rw   rI   r   zoom_adjustmentZ	set_lowerZ	set_upperr\  r  r  listr~  indexrK  r   r   r   on_zoom_changed)r   rw   r   r   s   &   ri   r  Z"LutrisWindow._bind_zoom_adjustment[  s    "&,,,$,,M'')	&&q)&&s7>>':Q'>?NN*..I	,,./55i@E ,1""($$_d6J6JK	  	E	s   "2D D&%D&c                s   \        VP                  P                  4      pW!P                  n        V P                  '       d   V P                  M\        p\        VP                  P                  4       4      p\        V4      V8:  d   VP                  VP                  4      pWB,          pWPP                  8w  d$   \        P                  ! V P                  V4       R# R# )zHandler for zoom modificationN)Zroundr   r   rw   rI   r  r  r~  r\  r  r  r   r   r  save_icon_type)r   Z
adjustmentZmedia_indexrw   Zmedia_servicesr      &&    ri   r  ZLutrisWindow.on_zoom_changedm  s    J,,223!,"&,,,$,,Mgnn1134~+-(..w/E/EFK"/	&MM$--y9 'rl   c                sT    V P                  \        P                  ! VRR7      4       R# )z'Display a label in the middle of the UITr|   N)show_overlayr   Label)r   messager   ri   r  ZLutrisWindow.show_labely  s    #))GT:;rl   c                s0   V P                   P                  P                  '       d   R MRp\        P                  ! RR7      pVP                  \        P                  P                  \        P                  ! 4       RV,          4      4       VP                  ^ ^ 4       \        P                  ! RR7      pVP                  RR4       VP                  \        P                  P                  \        P                  ! 4       RV,          4      4       \        P                  ! R^R7      pVP                  VRR^4       VP                  V4       RVn        V P!                  V\        P"                  P$                  \        P"                  P$                  4       R	# )
ZdarkZlightTr|   zmedia/side-%s.svg      ?zmedia/splash-%s.svg)r}   Z
margin_topFN)rt   Zstyle_managerZis_darkr   r   Zset_from_fileosr  joinrL   r   Zset_alignmentr   r  Zset_center_widget	is_splashr  AlignFILL)r   ZthemeZside_splashZcenter_splashZ
splash_boxs   &    ri   r  ZLutrisWindow.show_splash}  s   **88@@@gii-!!"'',,x||~?RUZ?Z"[\!!!Q'		$/##C-##BGGLLAVY^A^$_`XXdr:
k5%<$$]3#
*ciinnciinnErl   c                s    V P                   P                  4       '       d7   V P                   P                  4        F  p\        VR 4      '       g   K   R# 	  R# )r  TF)blank_overlayZget_visibler  Zhasattr)r   Zchr   ri   is_showing_splashZLutrisWindow.is_showing_splash  sE    ))++((5572{++ 8 rl   c                sV    V P                  4       '       d   V P                  4        R # R # r   )r  r  r   r   ri   r   ZLutrisWindow.on_theme_changed  s"    !!## $rl   c                s    V P                   P                  4        V P                   P                  4        V P                  P	                  4        V P
                  P	                  4        R # r   )game_view_spinnerZstartr  games_stackr]  r  r   r   ri   r  ZLutrisWindow.show_spinner  sL    
 	$$&##%!rl   c                s   V P                   P                  4        F  pVP                  4        K  	  V P                   P                  V4       V P                   P	                  V4       V P                   P                  V4       V P                   P                  4        V P                  P                  4        V P                  P                  4        R# )z%Display a widget in the blank overlayN)
r  r  r  
set_halignZ
set_valignr   r  r  r]  r  )r   r  ZhalignZvalignr0  s   &&&& ri   r  ZLutrisWindow.show_overlay  s    ''446EMMO 7%%f-%%f-v&!##%rl   c                s   V P                   P                  4        V P                  P                  4        V P                  P	                  4        V P                   P                  4        F  pVP                  4        K  	  R # r   )r  r]  r  r  r  r  r  )r   r0  r   ri   r  ZLutrisWindow.hide_overlay  sZ    !##%''446EMMO 7rl   c                sX    \         P                  ! R4      pVR9   d   V# V P                  # )z)Return the type of view saved by the userr7  )r]   r  )r   r   default_view_typer   r7  r   ri   r7  ZLutrisWindow.view_type  s/     ))+6	((%%%rl   c                s   VP                   \        P                  8X  dU   V P                  P	                  R 4       V P
                  P                  4        \        P                  P                  W4      # \        P                  VP                   u;8:  d   \        P                  8:  d   M MVP                  \        P                  P                  ,          '       g   VP                  \        P                  P                  ,          '       g   VP                  \        P                  P                   ,          '       gR   VP                  \        P                  P"                  ,          '       g!   V P                  P%                  4       '       d    \        P                  P                  W4      # V P                  P                  4        V P                  P                  V P                  V4      # )r{   )keyvalr   Z
KEY_Escaper+  r,  r   r  r   ApplicationWindowdo_key_press_eventZKEY_0ZKEY_zstateZModifierTypeZCONTROL_MASKZ
SHIFT_MASKZ	META_MASKZ	MOD1_MASKZ	has_focus)r   eventr   ri   r  ZLutrisWindow.do_key_press_event  s5    <<3>>)&&r*((*((;;DHH 		U\\6SYY6{{S--::::{{S--8888{{S--7777{{S--7777  **,,((;;DHH$$&  33D4E4EuMMrl   c                sB   RR/pRV P                   ,          pV P                  '       d@   V P                  P                  R8w  d%   VRV P                  P                  ,          ,          p\        P                  ! W!P                  VR4      R7      V n        V P                  # )z4Return the icon style depending on the type of view.Zicon_type_gridZcoverart_medicon_type_%sviewrr   _%sr{   r   )r   rw   ri  r   r   r   r   )r   Zdefault_icon_typessetting_keyr^  ri   r   ZLutrisWindow.load_icon_type  s}     n
 )4+A+AA<<<DLLOOx754<<??22K!..{DZDZ[fhjDkl~~rl   c                s:   Wn         RV P                  ,          pV P                  '       d@   V P                  P                  R8w  d%   VRV P                  P                  ,          ,          p\        P
                  ! W P                   4       V P                  4        R# )zSave icon type to settingsr  rr   r  N)r   r   rw   ri  r   write_settingredraw_view)r   r   r  r  ri   r  ZLutrisWindow.save_icon_type  sd    "(4+A+AA<<<DLLOOx754<<??22K{NN;rl   c                s   V P                   '       g   \        P                  ! R4       R# V P                  pWP                  9  d   \        V P                  V P                  4      V n         VR8X  d2   \        V P                   \        P                  ! R4      R7      V n        M\        V P                   4      V n        V P                  P                  RV P                  4       V P                  P                  RV P                  4       V P                  V P                  V&   V P                   P#                  V4      pV'       g1   \$        P&                  ! 4       pV P                   P)                  W!4       VP+                  4       '       g,   VP-                  V P                  4       VP/                  4        V P1                  4        V P                   P3                  V4       V P5                  4        V P7                  4        R# )z$Completely reconstruct the main viewzNo game store yetNr]   hide_text_under_icons)Z	hide_textzgame-selectedzgame-activated)r   rU   r  r   r   r:   rw   r   r8   r   r  r   r9   r   on_game_selection_changedon_game_activatedr  get_child_by_namer   ScrolledWindowZ	add_namedr   r   Zshow_allupdate_view_settingsZset_visible_child_namer   r[  )r   r7  scrolledwindowr^  ri   r  ZLutrisWindow.redraw_view  st   LL,-**	JJ&'d6H6HIDOF"$0OOx/I/IJa/b%! %1$A!%%ot7U7UV%%&68N8NO$($5$5DJJy!));;IF //1N&&~A''))t001##%!!#//	:  "rl   c                s$   WP                   9   d   V P                   V,          pV P                  P                  V4      pVP                  V4       V P                   V V P                  V8X  d   V P                  4        VP                  4        R# R# )zDiscards the view named by 'view_type' and if it is the current view,
regenerates it. This is used to update view settings that can only be
set during view construction, and not updated later.N)r   r  r  Zremover   r  r  )r   r7  r  r  r  ri   rebuild_viewZLutrisWindow.rebuild_view  sv     

"::i(D!--??	JN!!$'

9%%%2  " LLN #rl   c                s
   V P                   '       dq   V P                  R 8X  d^   \        P                  ! R4      R8g  pT;'       d*    \	        V P
                  P                  R4      4      '       * V P                   n        R# R# R# )r]   r   rv   rn  N)r   r   r   r   r
  r   r   show_badges)r   r  r   ri   r  Z!LutrisWindow.update_view_settings  sh    !7!76!A"//0FG6QK,7,b,bT\\EUEUV`Ea@b<bD) "Brl   c                s|    V P                   P                  R V,          \        P                  P                  4       R# )zview-%s-symbolicN)viewtype_iconr   r   r   r   r  r   ri   r   ZLutrisWindow.set_viewtype_icon   s(    --.@9.LcllNaNabrl   c                sb    \         P                  ! R\        V4      4       WP                  R&   R# )zShows or hide uninstalled gamesr   r  N)r   r  r
  r   )r   r   r   ri   set_show_installed_stateZ%LutrisWindow.set_show_installed_state#  s%    148H3IJ$4[!rl   c                s    V P                  4       pV'       d   V P                  P                  4        V P                  P	                  V4       R # r   )r  lutris_log_in_labelr  login_notification_revealerr   )r   Zshow_notificationr   ri   r   Z LutrisWindow.update_notification(  s;     224$$))+((99:KLrl   c                s   a  V 3R  lpS P                   P                  R4       \        S R7      pVP                  RV4       R# )c                 s,   < SP                  R R7       R# Tr  Nr   )r  Z	_usernamer   s   &&ri   on_connect_successZMLutrisWindow.on_lutris_log_in_label_activate_link.<locals>.on_connect_success0  s    D)rl   Fr  Z	connectedN)r  r   r%   r   )r   Z_labelZ_urlr  Zlogin_dialogs   f&&  ri   $on_lutris_log_in_label_activate_linkZ1LutrisWindow.on_lutris_log_in_label_activate_link.  s9    	* 	((99%@(5[*<=rl   c                sd   \        R \        R4      R\        R4      RV /4      pVP                  \        P                  P
                  8X  dd   V P                  P                  R4       \        4       pV'       d5   VP                  R4      p\        P                  ! RT;'       g    R4       R	# R	# R	# )
ZtitlezUnsupported Lutris VersionZquestionzThis version of Lutris will no longer receive support on Github and Discord, and may not interoperate properly with Lutris.net. Do you want to use it anyway?r  Fclient_versionZ ignored_supported_lutris_verisonr{   N)r'   r  r  r   ZResponseTypeZYESversion_notification_revealerr   r   r   r   r  )r   Z_buttonr  Zruntime_versionsr     &&   ri   ,on_version_notification_close_button_clickedZ9LutrisWindow.on_version_notification_close_button_clicked7  s    78Ag $	
 ==C,,000..??F35!1!5!56F!G&&'I>K_K_]_`   1rl   c                s    V P                   '       d:   VP                  V P                   P                  8X  d   V P                  4        R# R# R# )z3Request a view update when service games are loadedN)rw   ri  r[  r   rw   r   ri   r   Z$LutrisWindow.on_service_games_loadedJ  s1    <<<GJJ$,,//9 :<rl   c                &    V P                  4        R # r   )r[  r   r   ri   r   Z"LutrisWindow.on_categories_updatedO      rl   c                s   V P                   w  r\        P                  ! RV4       \        P                  ! RV4       V P                  '       dU   V P                  '       dC   \        P                  ! RV P                  4       \        P                  ! RV P                  4       \        P                  ! RV P
                  4       R# )z7Saves the window's size position and state as settings.rm   rn   r   r   ru   N)r   r   r  r   r   ru   )r   rm   rn   r^  ri   save_window_stateZLutrisWindow.save_window_stateR  s|    ((w.x0===T]]]"":t}}="":t}}={DNN;rl   c                s2   \         P                  ! R4      V n        \         P                  ! R4      V n        V P                  '       dO   V P                  '       d;   V P	                  \        V P                  4      \        V P                  4      4       R# R# R# )z~Restores the window position only; we call this when showing
the window, but restore the other settings only when creating it.r   r   N)r   r   r   r   Zmover   r   r   ri   r   Z$LutrisWindow.restore_window_position\  s`     !--j9 --j9===T]]]IIc$--(#dmm*<= +=rl   c                s\    V P                  4        VP                  V P                  4       R # T)r   Zstart_reload_service_reloaded_cbr  r   ri   r   ZLutrisWindow.on_service_logind  s%      "T667rl   c                sH    V'       d   \         P                  ! WR 7       R# R# )r  N)r!   Zdisplay_error)r   r  r   ri   r  Z!LutrisWindow._service_reloaded_cbi  s    !!%5 rl   c                s    V P                  4        V P                  '       d6   VP                  V P                  P                  8X  d   V P                  4        R # r  )r   rw   ri  r[  r  r   ri   r   ZLutrisWindow.on_service_logoutm  s9      "<<<GJJ$,,//9rl   c                sJ    V P                  4        V P                  R R7       R# r  )r   r   r   r   ri   r   Z(LutrisWindow.on_lutris_account_connecteds  s      "%rl   c                r  r   )r   r   r   ri   r   Z+LutrisWindow.on_lutris_account_disconnectedw  s      "rl   c                r  r   )r  r   r   ri   r   Z%LutrisWindow.on_local_library_updatedz  s    rl   c           	     s,   VP                  4       '       g   R# VP                  4       V n        VP                  4       pV P                  '       g   W0n        V P
                  P                  \        \        ^2V^ ,          R,
          4      R4      R4       R# )zFSize-allocate signal.
Updates stored window size and maximized state.
Ni  r^   r1  )	r   Zis_maximizedru   Zget_sizer   r+  r5  Zminra  )r   r  _argsZsizes   &&* ri   	on_resizeZLutrisWindow.on_resize}  sm    
   "",,. ~~~#**3s2tAw}/Es+KRPrl   c                s    V P                   pVP                  '       d   V P                  4        R # VP                  4       '       d   V P                  4        R # R# )TN)rt   Zhas_running_gamesr]  Zhas_tray_icon)r   r  r     &* ri   r   ZLutrisWindow.on_window_delete  sE       IIKIIK rl   c                s    V P                   P                  '       d'   V P                   P                  P                  4        R # R # r   )rt   ZtrayZupdate_present_menu)r   ZwindowZparamr  ri   r   ZLutrisWindow.on_visible_changed  s1       !!557 !rl   c                s@    V P                  4       w  V n        V n        R# )z7Callback triggered when the window is moved, resized...N)r   r   r   r   r     &*ri   r   Z LutrisWindow.on_window_configure  s    '+'8'8':$t}rl   c                s:    V P                    F
  pV! 4        K  	  R# )zSignal for window close.N)r   )r   r  Zstopperr  ri   
on_destroyZLutrisWindow.on_destroy  s     ,,GI -rl   c                r  r   )r  r  r  ri   on_hideZLutrisWindow.on_hide  s     rl   c                r  r   )r   r  r  ri   on_showZLutrisWindow.on_show  s    $$&rl   c                H    V P                   P                  \        V R7       R# )z'Callback when preferences is activated.r  N)rt   show_windowr$   r  r  ri   r   Z$LutrisWindow.on_preferences_activate  s     	$$%6t$Drl   c                s    VP                  V4       V P                  VP                  4       4       V P                  4        R# )z1Callback to handle uninstalled game filter switchN)	set_stater  get_booleanr[  r   r   r   r  ri   r   Z+LutrisWindow.on_show_installed_state_change  s3    %%e&7&7&9:rl   c                s    V P                   P                  4        VP                  4       P                  4       V P                  R&   \        V P                  RR7      V n         R# )z(Callback for the search input keypressesrc  r  r   N)r   Z
unscheduleZget_textstripr   rQ   r[  )r   Zentryr   ri   on_search_entry_changedZ$LutrisWindow.on_search_entry_changed  sJ     	))+$~~/557V!1$2C2CSV!Wrl   c                s   VP                   \        P                  8X  d   V P                  R 8X  d\   V P                  P                  \        P                  ! R4      4       V P                  '       d   V P                  P                  4        V P                  P                  \        P                  ! R4      RR4       V P                  P                  4        R# R# )r]   r  NF)r  r   ZKEY_Downr   r   Zselect_pathr   ZTreePathr   r  r   r  )r   r  r  r  ri   on_search_entry_key_pressZ&LutrisWindow.on_search_entry_key_press  s    <<3<<'%%/!!--cll3.?@ ===MM))+((c):D%H((* (rl   c                s4    \         P                  ! V R7       R# )zOpen the about dialog.r  N)r!   ZAboutDialogr  r  ri   r   ZLutrisWindow.on_about_clicked  s     	4(rl   c                s*   < V ^8  d   QhRS[ RS[RR/# )rb   _gamer  rc   N)r    ZBaseExceptionre   rh   ri   rj   rk     s"     # #T #- #D #rl   c                s>    \        \        V4      4      pV! W 4       R# )z3Called when a game has sent the 'game-error' signalN)r(   r   )r   r  r  Zerror_handlerr&  ri   r   Z$LutrisWindow.on_game_unhandled_error  s     *$u+6e"rl   c                r  )z/Add a new game manually with the AddGameDialog.r  T)rt   r  r"   r  r  ri   r   Z'LutrisWindow.on_add_game_button_clicked  s      	$$^D$Arl   c                s    V P                   R 8X  d   RMR p\        P                  ! RV4       V P                  V4       \        P
                  ! RV4       V P                  4        V P                  4        R# )r]   r  zView type changed to %sr7  N)r   rU   debugr   r   r  r  r  )r   Zargsr7  r  ri   r   ZLutrisWindow.on_toggle_viewtype  s[    "44>FF	.	:y){I6""$rl   c                sf    VP                  V4       V P                  VP                  4       4       R # r   )r  Z_set_icon_typeZ
get_stringr  r  ri   r   Z%LutrisWindow.on_icontype_state_change  s'    E,,./rl   c                s    V P                   R ,          P                  V4       \        V4      P                  R4      p\        P
                  ! RV4       V P                  4        R# )r   Z'r   N)r  r  r4  r  r   r  r[  r  r  ri   r   Z)LutrisWindow.on_view_sorting_state_change  sI    ^$..u5E
  %~u5rl   c                    V P                   R ,          P                  V4       \        P                  ! R\	        V4      4       V P                  4        R# )r   r   Nr  r  r   r  r
  r[  r  r  ri   r   Z-LutrisWindow.on_view_sorting_direction_change  s;    )*44U;3T%[Arl   c                r  )r   r   Nr  r  r  ri   r   Z3LutrisWindow.on_view_sorting_installed_first_change  s;    34>>uE=tE{Krl   c                s    VP                  V4       VP                  4       p\        P                  ! R\	        V4      4       V P
                  P                  V4       R# )z$Callback to handle side panel toggler   N)r  r  r   r  r
  r   r   )r   r   r   r   r&  ri   r   Z'LutrisWindow.on_side_panel_state_change  sK    "..03T:L5MN../ABrl   c                sF   R
 F0  pW P                   9   g   K  V P                   P                  V4       K2  	  VP                  w  r4VR8X  d   RpW@P                   V&   V P                   P                  R4      pV P	                  V4       V P                  4        V P                  4        VR8w  g   VR8w  dJ   V P                  P                  P                  4        V P                  P                  \        R4      4       M$V P                  P                  \        R4      4       V P                  P                  4       P                  \        P                   P"                  4       \$        P&                  '       d   VR8X  d!   VR8X  d   \$        P(                  ! 4        R	# R	# R	# )z?Handler called when the selected element of the sidebar changesr"  r=  rw   user_categoryr   zShow Hidden GameszRehide Hidden Gamesry   N)r"  r=  r*  rw   ro  rn  )r   Zpopr~   r   r   r  r  r   r%  r]  show_hidden_games_button	set_labelr  r   r  r   r  ZSTARTrV   Zis_initializedZupdate_all_missing)r   r  Zfilter_typeZrow_typeZrow_idrk  r  ri   r   ZLutrisWindow.on_sidebar_changed  s?   lKll*  - m "33&!H!'X||''	2&""$z!Vy%8LL##((*))33A6I4JK))33A6K4LM 	%%//1<<SYY__M+++<N0NSY]fSf,,. Tg0Nrl   c                s   V Uu. uF  q1P                  V4      NK  	  pp. pV Fs  pV P                  '       d-   \        P                  ! V P                  P                  V4      pM\
        P                  ! VR 4      pV'       g   Kb  VP                  V4       Ku  	  \        P                  ! V P                  V4       R# u upi )ri  F)r  rw   r   Zget_gameri  rV  get_game_by_fieldr  r   r  r  )r   r  Z	selectionr  Zgame_idsr   r  rb  s   &&&     ri   r  Z&LutrisWindow.on_game_selection_changed  s    @IJ	--d3	JG|||,55dlloowO11'4@ tT"   	d**E2 Ks   B>c                s    \         P                  ! R4      P                  4       R8H  p\         P                  ! RV'       * 4       V P	                  RV'       * R4       R# )z(Event handler to toggle badge visibilityr   ZtrueN)r   r   Zlowerr  r   )r   r  Z_datar  r&  ri   r   ZLutrisWindow.on_toggle_badges+  sI    %%&<=CCEO55yA  5y2HIrl   c                s    VR 8X  d   VR8X  d   V P                  R4       M?VR8X  d)   VP                  R4      '       d   V P                  4        MV P                  4        V P	                  4        R# )rr   r  r]   r   rw  T)r  r;  r[  r  r   )r   r  Z	new_valuerx  s   &&&&ri   r   Z LutrisWindow.on_settings_changed1  s`    h;2I#If%
"{';';<L'M'M%%'  "rl   c                sj   V P                   P                  4       pV'       Ed   VP                  R8X  d/   VP                  R8X  d   VP                  VP
                  8X  d   R# V P                  4       pVP                  R4      '       * pVP                  R8X  d3   VP                  R9   d"   V'       d   RVP                  4       9   d   R# R# VP                  R	9   dW   VP                  4       pV'       d   VP                  R8w  d
   RV9   d   R# VP                  R8w  d   VP                  V9  d   R# R# )
z5Return whether a game should be displayed on the viewr=  rz   Frf  r   re  T)rx   ry   )r"  r  r*  )	r   get_selected_rowr   ri  r  ZSTATE_STOPPEDr2  rh  Zget_categories)r   rb  Zrowr6  Zenforce_hiddenr   r  ri   is_game_displayedZLutrisWindow.is_game_displayed;  s    ll++-3xx--#&&I2E$**X\XjXjJj ))+F!'!5!5h!??Nxx--#&&<Q2Q!i43F3F3H&H   JJ!002
!cff	&9i:>U 66U?svvZ'? rl   c                s*   \        V4       V P                  4        V P                  '       d   V P                  P                  V4      pMk\        P
                  ! VP                  R4      pV'       dC   V P                  V4      '       g,   RV9   d%   V P                  P                  VR,          4       R# V'       dW   V P                  P                  V4      pV P                  4       pVe   VP                  V4      '       g   V P                  4        R# )z>Updates an individual entry in the view when a game is updatedri  T)rW   r   rw   Zget_service_db_gamerV  r  ri  r  r   remove_gameZupdaterD  Z
isdisjointr[  )r   rb  rN  Zupdated_columnsZsensitive_columnsr  ri   r   ZLutrisWindow.on_game_updatedU  s    $  "<<<ll66t<G00$?Gt55d;;++GDM:"oo44W=O $ ? ? A&.?.J.J?.[.[!!#rl   c                r  )rb   rb  rc   N)r    re   rh   ri   rj   rk   k  s     1 1D 1T 1rl   c                s    V P                   P                  4       p\        V\        4      '       d;   VP                  R8X  d(   V P
                  P                  VP                  4       R# R# R# )zOUpdates the game list when a game stops; this keeps the 'running' page updated.rz   N)r   r  rJ  r>   ri  r   r  )r   rb  Zselected_rowr  ri   r   ZLutrisWindow.on_game_stoppedk  sM    ||446 lJ//LOOy4POO''0 5Q/rl   c                r  r   r  )r   rb  r   ri   r   ZLutrisWindow.on_game_installeds  r  rl   c                s&    V P                  4        R# )z&Simple method used to refresh the viewT)r  r   r   ri   on_game_removedZLutrisWindow.on_game_removedv  s    rl   c                s   V P                   '       d   \        P                  ! RV P                   P                  V4       \        P
                  ! V P                   P                  V4      pV'       d   VR,          '       d   VR,          pMV P                   P                  V4      pV'       dF   \        V4      pVP                  '       d   VP                  V R7       R# VP                  V R7       R# R# )z4Handles view activations (double click, enter press)zLooking up %s game %sr  ri  )Zlaunch_ui_delegateN)rw   rU   r  ri  rV  Zget_game_for_serviceZinstall_by_idr    Zis_installedZlaunchZinstall)r   Z_viewr  rN  rb  s   &&&  ri   r  ZLutrisWindow.on_game_activated{  s    <<<LL0$,,//7K33DLLOOWMG7;//!$-,,44W==D   t45 rl   c                r  r  r-   re   rh   ri   rj   rk     s       rl   c                s    \        \        V P                  P                  4       4      pV'       g1   \        V P                  4      pV P                  P	                  V4       V# r   )r   r.   download_revealerr   r   )r   queuer   ri   download_queueZLutrisWindow.download_queue  sI    ]D$:$:$D$D$FG!$"8"89E""&&u-rl   c                r  )rb   force_updatesrc   Nr	  re   rh   ri   rj   rk     s     !E !E4 !ED !Erl   c                s8   a a V3R lpV 3R lp\        W#4       R# )zStarts the process of applying runtime updates, asynchronously. No UI appears until
we can determine that there are updates to perform.c                 sd   < \        SR7      p V P                  4       pV P                  4       pWV3# )zThis function runs on a worker thread and decides what component updates are
required; we do this on a thread because it involves hitting the Lutris.net website,
which can easily block.r  )rC   Zcreate_component_updatersZcheck_client_versions)runtime_updatercomponent_updaterssupported_client_versionr  s      ri   create_runtime_updaterZBLutrisWindow.start_runtime_updates.<locals>.create_runtime_updater  s9     -=AO!0!J!J!L'6'L'L'N$%8PPPrl   c                s  < V'       d   \         P                  ! RV4       R# V w  r#pV'       d   \        P                  ! 4       '       gj   SP                  P                  4       pV\        P                  V3,          pSP                  P                  V4       SP                  P                  R4       V'       d   SP                  W#4       R# \         P                  ! R4       R# )zPicks up the component updates when we know what they are, and begins the installation.
This must be done on the main thread, since it updates the UI. This would be so much less
ugly with asyncio, but here we are.z,Failed to obtain updates from Lutris.net: %sTzRuntime up to dateN)rU   Z	exceptionrT   Z
is_flatpakversion_notification_labelZ	get_labelr   ZVERSIONr  r  r   !install_runtime_component_updatesr  )r  r  r  r  r  Zmarkupr   s   &&    ri   create_runtime_updater_cbZELutrisWindow.start_runtime_updates.<locals>.create_runtime_updater_cb  s       !OQVWPVM"5M+L4K4K4M4M!<<FFHF#x'7'79Q&RRF33==fE66GGM%::;M_LL!56rl   N)rP   )r   r  r  r  s   ff  ri   start_runtime_updatesZ"LutrisWindow.start_runtime_updates  s    	Q	7( 	(Drl   c          
      sp   < V ^8  d   QhRS[ S[,          RS[RS[P                  RS[P
                  RS[/# )rb   updatersr  completion_functionerror_functionrc   )r   rB   rC   r.   ZCompletionFunctionZErrorFunctionr
  re   rh   ri   rj   rk     sO     
 
'(
 (
 +==	

 &33
 

rl   c                s   aa V P                   pS Uu. uF  pRVP                   2NK  	  ppVV3R lpVP                  VR S 4       VVVR7      # u upi )zwInstalls a list of component updates. This displays progress bars
in the sidebar as it installs updates, one at a time.zcomponent_update:c                  s   < S F  p V P                  S4       K  	  S F  p V P                  4        K  	  \        4        R # r   )Zinstall_updater  rZ   )r   r  r  s    ri   install_updatesZGLutrisWindow.install_runtime_component_updates.<locals>.install_updates  s6    #&&7 $# $ %&rl   c              3   s8   "   T F  qP                   x  K  	  R # 5ir   )Zget_progress)rt  ur   ri   ru  ZALutrisWindow.install_runtime_component_updates.<locals>.<genexpr>  s     .X^^Xs   )r  r  operation_names)r  rq   Zstart_multiple)	r   r  r  r  r  r  r  r   r  s	   &ff&&    ri   r  Z.LutrisWindow.install_runtime_component_updates  si     ##AIJA.qvvh7J	' ##.X. 3)+ $ 
 	
 Ks   Ac                s:  < V ^8  d   Qh/ S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P
                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R	&   S[ P                  ;R
&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   # )rb   r  r   r   r   r+  r   
search_boxr  r  r  r  r  r  r  r  r  r  )r   ZStackZRevealerr  ZSearchEntryZ
MenuButtonr   Z
AdjustmentZ	Alignmentr   ZSpinnerr  ZModelButtonre   rh   ri   rj   rk   J   s(     0  ll8  ((>  <<5  //7  >>?  -   ^^9! " ==6# $ 992% & ||9' ( {{8) * "%C+ , 8- . $'<<E/ 0 !$B1 2 "ooC3 rl   )r   r   r  r  rt   r   r   r   r   r   r   r   r   ru   r   r   rw   r   r   r   r   r   r   r   )F)NN)Z__name__Z
__module__Z__qualname__Z__firstlineno____doc__r  ro   rp   Z__gtype_name__r<   ZChildr  r   r   r   r+  r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   r   Zpropertyr   r~   r   r   r   r   r   r   r  r   r   r   r:  r   r   r   r<  r   rD  rT  r   r   r   r   r2  rY  r   Zstaticmethodrp  rr  r  r}  r  r  r|  r  r[  r  r  r  r  r  r  r   r  r   r  r  r  r  r7  r  r   r  r  r  r  r   r  r   ZCallbackr  r  r   r   r  r   r   r  r   r   r   r   r  r   r   r   r  r  r  r   r   r  r  r   r   r   r   r   r   r   r   r   r   r  r   r   r  r   r   r   r  r  r  r  r  Z__annotate_func__Z__static_attributes__Z__classdictcell__Z__classcell__)r   rg   s   @@ri   r\   r\   J   s    0MN#N(..0K%0%6%6%8+6+<+<+>"-"3"3"5M$/$5$5$7L,7,=,=,?%++-J&1&7&7&9O#.#4#4#6M*002M&1&7&7&9%0%6%6%80;0A0A0C%0%6%6%82=2C2C2E!/:/@/@/B0;0A0A0Cq? q?fT+R@h	m 	m = = . .'
'4
 
 
=#4 < < E E F F C C   G G P P F F b b  /: _BBR(
, 
,u 9 9<  
$-+^ 07*"5H
@? @?D X XL$
:<F " +.)).. 	& & &N0	"Hc
c5
M > >a& 
<>
6&# 
Q 
Q8;   ! ! ' ' E E X X 
+ 
+ ) )# #  
%0

C/8$J4,1 1
6$  !E !EF
 
]+  rl   r\   c                sH    V ^8  d   QhR\         R\        P                  RR/# )rb   r  r  rc   N)r   r   ZWindow)rf   s   "ri   rj   rj     s%     > >? >CJJ >4 >rl   c                 s6    \        R 4      p\        WVR7       R# )zYour limits are not set correctly. Please increase them as described here: <a href='https://github.com/lutris/docs/blob/master/HowToEsync.md'>How-to:-Esync (https://github.com/lutris/docs/blob/master/HowToEsync.md)</a>)Zmessage_markupr  N)r  r&   )r  r  r  r  ri   _handle_esynclimiterrorr    s    	WG f=rl   )r  r  Zcollectionsr    r   r   r  r   Ztypingr   r   r   r   r   Zurllib.parser	   r
   Zgi.repositoryr   r   r   r   rr   r   r   Z
lutris.apir   r   r   Zlutris.databaser   r#  r   rV  r   r3  Zlutris.database.categoriesr   Zlutris.database.saved_searchesr   Zlutris.database.servicesr   Zlutris.exceptionsr   r   Zlutris.gamer   r   r   r   r    Z
lutris.guir!   Zlutris.gui.addgameswindowr"   Z#lutris.gui.config.edit_saved_searchr#   Z$lutris.gui.config.preferences_dialogr$   Zlutris.gui.dialogsr%   r&   r'   r(   r)   Zlutris.gui.dialogs.delegatesr*   r+   Zlutris.gui.dialogs.game_importr,   Zlutris.gui.download_queuer.   Zlutris.gui.viewsr/   r0   r1   r2   r3   r4   r5   r6   r7   Zlutris.gui.views.gridr8   Zlutris.gui.views.listr9   Zlutris.gui.views.storer:   Zlutris.gui.widgets.game_barr;   Z lutris.gui.widgets.gi_compositesr<   Zlutris.gui.widgets.sidebarr=   r>   Zlutris.gui.widgets.utilsr?   r@   rA   Zlutris.runtimerB   rC   Zlutris.searchrD   Zlutris.search_predicaterE   Zlutris.services.baserF   rG   rH   Zlutris.services.lutrisrI   rJ   Zlutris.style_managerrK   Zlutris.utilrL   Zlutris.util.busyrM   rN   Zlutris.util.jobsrO   rP   rQ   Zlutris.util.library_syncrR   rS   Zlutris.util.linuxrT   Zlutris.util.logrU   Zlutris.util.path_cacherV   rW   Zlutris.util.stringsrX   Zlutris.util.systemrY   Zlutris.util.wine.winerZ   r  r  r   r  r\   r  rd   rl   ri   <module>r     s*   + 
 "     2 2 * - - % 
 ' 7 - ? 9 A : E ^ ^  4 @ B x x X ; 3
 
 
 / . , / 8 @ O O ; $ 0 T T < .   7 M M I * " C 4 3 : X\\^T3EFGI
3((*@BY I
 HI
X,> (? @rl   