
    &i%3                       d Z ddlmZ ddlZddlZddlZddlZddlmZ 	 ddl	Z	 e	j
        dd           ddlmZmZ n# e$ rZ edez            dZ[ww xY wd	Z	  e	j
        d
d           ddlmZ n# e$ r dZY nw xY w ee                                          j        Zedz  Z G d d          Z G d dej                  Z G d dej                  Zd Zedk    r e             dS dS )a  
Simple GTK desktop wrapper for the existing try.py script.

Features:
- Runs the repository's try.py and shows the textual output
- Manual refresh button and auto-refresh interval
- Optional AppIndicator tray (if libayatana-appindicator is available)

This is intended as a minimal cross-distribution desktop app. For
packaging across distros prefer creating a Flatpak or a distro package.
    )annotationsN)PathGtkz3.0)r   GLibz?PyGObject (python3-gi) and GTK3 are required to run the GUI: %sTAppIndicator3z0.1)r   Fztry.pyc                       e Zd ZddZdddZdS )	TryRunnerscript_pathr   c                    || _         d S N)r
   )selfr
   s     gui.py__init__zTryRunner.__init__*   s    &    N   envdict | Nonetimeoutintreturntuple[str, str, int]c                @   	 t           j                                        }|r9|                                D ]$\  }}t	          |          |t	          |          <   %t          j        ddt	          | j                  gt
          j        t
          j        d|          }|	                    |          \  }}|||j
        fS # t
          j        $ r* 	 |                                 n# t          $ r Y nw xY wY dS t          $ r}	dt	          |	          dfcY d	}	~	S d	}	~	ww xY w)
zRun the script and return (stdout, stderr, returncode).

        env: an optional dict of environment variables to set for the child process.
        z/usr/bin/envpython3T)stdoutstderrtextr   )r   ) z	Timed out|   r      N)osenvironcopyitemsstr
subprocessPopenr
   PIPEcommunicate
returncodeTimeoutExpiredkill	Exception)
r   r   r   	child_envkvprocouterres
             r   run_oncezTryRunner.run_once-   sL   
	!
))I /IIKK / /DAq(+AIc!ff%%#^YDDT@U@U$V+5?+5?)-(1	3 3 3D '''88HCT_,,( 	( 	( 	(		   ''' 	! 	! 	!s1vvq=      	!sH   B=C   DC%$D%
C2/D1C22D8	DDDD)r
   r   )Nr   )r   r   r   r   r   r   )__name__
__module____qualname__r   r4    r   r   r	   r	   )   sA        ' ' ' '! ! ! ! ! ! !r   r	   c                  R     e Zd Zdd fdZddZddZddZddZddZddZ	 xZ
S )TriangleWindowr   appGtk.Applicationrunnerr	   refresh_secondsr   c                    t                                          |d                                dd           | _        | _        t          j        d          }|                    d                                |           t          j	        d	          }|
                    d
 fd           |                    |           t          j        d	           _         j                            d           |                     j                   t          j        t
          j        j        d          }                     |           t          j                     _        |                     j        ddd           i  _        dD ]}t          j                    }|                    d           |                    t
          j        j                   t          j                    }	|	                    t
          j        j        t
          j        j                   |	                    |           t          j        |	          }
 j                             |	|
           | j        |<   t          j!        ddd          }|                    |ddd           |"                    t          j        dd          dddd           t          j#                     _$         j$        %                    d            j$        %                    d            j$        %                    d            j$        &                    d           |"                     j$        dddd           |"                    t          j        dd          dddd           t          j'        d           _(        |"                     j(        dddd           |"                    t          j        d d          d!ddd           t          j'        d"           _)        |"                     j)        dddd           |"                    t          j        d#d          dddd           t          j'        d$           _*        |"                     j*        dddd           |"                    t          j        d%d          dddd           t          j'        d&           _+        |"                     j+        dddd           |"                    t          j        d'd          d!ddd           t          j'        d(           _,        |"                     j,        dddd           |                    t          j-        t
          j        j.        d)          ddd            /                                 d  _0        tb          r<	 td          j3        4                    d*d+td          j5        j6                   _0         j0        7                    td          j8        j9                   t          j:                    }t          j;        d,	          }t          j;        d-	          }|
                    d. fd/           |
                    d.d0            |<                    |           |<                    |           |/                                  j0        =                    |           n# t|          $ r
 d  _0        Y nw xY wt          j@                     _A         j        r, j        dk    r#t          jC         j         jD                   d S d S d S )1Nu   Triangle — Moon & Sun Report)applicationtitlei  i  Triangle)rA   TRun)labelclickedc                 ,                                     S r   )refresh_r   s    r   <lambda>z)TriangleWindow.__init__.<locals>.<lambda>W   s    $,,.. r   Idler      )orientationspacing)SunMoonPhasesSubpointAllF
      )column_spacingrow_spacingmarginzMode:   )rD   xalignAUTOCOORDSADDRESSz	Latitude:r   z46.7313)r      z
Longitude:   z	-117.1796zCity:MoscowzState:IdahozCountry:USA)rM   rX   ztriangle-indicatorzutilities-terminalShowQuitactivatec                 ,                                     S r   )presentrH   s    r   rJ   z)TriangleWindow.__init__.<locals>.<lambda>   s     r   c                 (    t          j                    S r   )r   	main_quit)rI   s    r   rJ   z)TriangleWindow.__init__.<locals>.<lambda>   s     r   )Esuperr   set_default_sizer=   r>   r   	HeaderBarset_show_close_buttonset_titlebarButtonconnectpack_endLabelsummary_label
set_xalign
pack_startBoxOrientationVERTICALaddNotebooknotebooktabsTextViewset_editableset_wrap_modeWrapModeNONEScrolledWindow
set_policy
PolicyType	AUTOMATICappend_pageGridattachComboBoxText
mode_comboappend_text
set_activeEntry	lat_entry	lon_entry
city_entrystate_entrycountry_entry	Separator
HORIZONTALshow_all	indicatorUSE_APPINDICATORr   	IndicatornewIndicatorCategoryAPPLICATION_STATUS
set_statusIndicatorStatusACTIVEMenuMenuItemappendset_menur,   	threadingLock_running_lockr   timeout_add_seconds_scheduled_refresh)r   r;   r=   r>   hbrefresh_btnvboxnametvscrolledrD   settings_gridmenu	item_show	item_quit	__class__s   `              r   r   zTriangleWindow.__init__L   s   S0PQQQc3'''.],,,
  &&&"ju---I'@'@'@'@AAA
K    YV444%%a(((
d()))w3?#;QGGG tT1555 	@ 		! 		!DBOOE"""S\.///)++H 8#.:RSSSLLID)))EM%%h666 DIdOO "MMMueQ777 	SYWQ???Aq!LLL*,,##F+++##H---##I...""1%%%T_aAq999 	SY[CCCQ1aPPP	222T^Q1a888SY\!DDDaAqQQQ444T^Q1a888 	SYWQ???Aq!LLL)222T_aAq999SYXa@@@!Q1MMM9'222T-q!Q:::SYZBBBAq!QOOO YE222T/Aq!<<< 	#/2LUVWWWY^`eghiii  	&&!.!8!<!<(*>@_@r" " ))-*G*NOOOxzzLv666	Lv666	!!*.G.G.G.GHHH!!*.H.HIIII&&&I&&&''---- & & &!%& '^--  	TD$81$<$<$T%94;RSSSSS	T 	T$<$<s   	D#[- -\ \r   boolc                    | j                                         r| j                            d           dS |                                 S )Nz*Skipped refresh: previous run still activeT)r   lockedrs   set_textrG   r   s    r   r   z!TriangleWindow._scheduled_refresh   sD    $$&& 	''(TUUU4||~~r   tab_namer$   r   c                    | j                             |          }|sd S |                                }|                    |           d S r   )r|   get
get_bufferr   )r   r   r   r   bufs        r   _set_tab_textzTriangleWindow._set_tab_text   sG    Y]]8$$ 	FmmooTr   c                    | j                             |          }|sd S |                                }|                                }|                    |dddd           d S )Ng        F)r|   r   r   get_start_iterscroll_to_iter)r   r   r   r   starts        r   _scroll_tab_to_topz!TriangleWindow._scroll_tab_to_top   sb    Y]]8$$ 	Fmmoo""$$
%eS#66666r   	full_textdictc                   g }g }g }g }g }|                                 D ]}|                                }|s|                                }	d|	v sd|	v sd|	v sd|	v sd|	v r|                    |           Wd|	v sd|	v sd|	v sd	|	v sd
|	v r|                    |           d|	v sd|	v sd|	v sd|	v sd|	v r|                    |           d|	v sd|	v sd|	v sd|	v r|                    |           |                    |           |}
d                    |          pd}d                    |          pd}d                    |          pd}d                    |          pd}d                    |          }|||||
|dS )Nsunsolarsunrisesunsetdhuhrmoonmoonrisemoonsetzenithascentphaselunationfullr   quartersubznearest citysublunarsubsolar
(no sun lines found)(no moon lines found)z(no phases lines found)z(no subpoint lines found))rO   rP   rQ   rR   rS   Other)
splitlinesstriplowerr   join)r   r   	sun_lines
moon_linesphases_linessubpoint_linesother_lineslnllowall_textsun_text	moon_textphases_textsubpoint_text
other_texts                   r   _parse_and_distributez$TriangleWindow._parse_and_distribute   s   	
&&(( 	' 	'B

A ''))C||w#~~c1A1AXQT__X_cfXfXf  $$$$3*"3"3yC7G7G8WZ??^fjm^m^m!!"%%%%C:#4#4#RUYbfiYiYi##B''''#3!6!6*:K:Kz]`O`O`%%b))))""2&&&& 99Y''A+AIIj))D-D	ii--J1J		.11P5PYY{++
 !%
 
 	
r   c                    | j         sd S 	 | j                             |d d         d           d S # t          $ r Y d S w xY w)N@   r   )r   	set_labelr,   )r   r   s     r   _update_indicatorz TriangleWindow._update_indicator   s^    ~ 	F	N$$T#2#Y33333 	 	 	DD	s   #0 
>>c                     j                                          j                                         j                                         j                                         j                                         j                                        d fd}t          j	        |d          
                                 dS )zBTrigger a background refresh. Returns True to keep timeout active.)LOCATION_MODELATITUDE	LONGITUDECITYSTATECOUNTRYc                 t   j                             d          } | s!t          j        j        j        d           d S 	 t          j                    }t          j        j        j        d           t          j        j        dd           t          j        j        dd           t          j        j        dd           t          j        j        d	d           t          j        j        d
d           j        	                    
          \  }}}t          j                    |z
  }dt          j
        d           d| d|dd}|dk    r|sd}|}|r|d|z   z  }                    |          }t          j        j        d|d                    t          j        j        d|d                    t          j        j        d	|d	                    t          j        j        d
|d
                    t          j        j        d|d                    t          j        j        d           t          j        j        j        |           d }	|d         r-|d         dk    r!|d                                         d         }	n7|d         r-|d         dk    r!|d                                         d         }	n|}	t          j        j        |	           	 j                                          d S # t           $ r Y d S w xY w# 	 j                                          w # t           $ r Y w w xY wxY w)NFzSkipped: another run is activez
Running...rS   zRunning...
rO   r   rP   rQ   rR   )r   z	Updated: z%Y-%m-%d %H:%M:%Sz (rc=z, z.1fzs)r   z(no stdout)z
--- STDERR ---
r   r   )r   acquirer   idle_addrs   r   timer   r=   r4   strftimer   r   r   r   releaseRuntimeError)acquiredr   r1   r2   rcelapsedsummaryr   parsedcompactr   r   s             r   workerz&TriangleWindow.refresh.<locals>.worker	  sA   )11%88H d09;[\\\)	d09<HHHd0%HHHd0%<<<d0&"===d0(B???d0*bAAA#{333<<S")++-ddm4G&H&HddrddU\dddd7737'C 70366D33D99d0%GGGd0&&.IIId0(F8<LMMMd0*fZ>PQQQd0%GGGd5u===d097CCC &> &fVn8O&O&O$Vn7799!<GGE] &ve}8N'N'N$Um6688;GG%Gd4g>>>&..00000#   DD&..0000#   DsC    JL K: :
LLL7L'&L7'
L41L73L44L7T)targetdaemon)r   get_active_textr   get_textr   r   r   r   r   Threadr   )r   r  r   s   ` @r   rG   zTriangleWindow.refresh   s     "_<<>>//110022O,,..%..00)2244
 
/	 /	 /	 /	 /	 /	b 	t444::<<<tr   )r   )r;   r<   r=   r	   r>   r   )r   r   )r   r$   r   r$   )r   r$   )r   r$   r   r   )r   r$   )r5   r6   r7   r   r   r   r   r   r   rG   __classcell__r   s   @r   r:   r:   K   s        eT eT eT eT eT eT eTN      7 7 7 7'
 '
 '
 '
R   > > > > > > > >r   r:   c                  &     e Zd Zd fdZd Z xZS )TriangleAppr=   r	   c                V     t                      j        |ddi || _        d | _        d S )Napplication_idzorg.htmlfarmer.triangle)rj   r   r=   window)r   r=   argskwargsr   s       r   r   zTriangleApp.__init__?  s2    $I/HIIIr   c                z    | j         st          | | j                  | _         | j                                          d S r   )r  r:   r=   rg   r   s    r   do_activatezTriangleApp.do_activateD  s9    { 	<(t{;;DKr   )r=   r	   )r5   r6   r7   r   r  r  r  s   @r   r  r  >  sL             
      r   r  c                 v    t          t                    } t          |           }|                    d            d S r   )r	   TRY_PYr  run)r=   r;   s     r   mainr  J  s/    vF
f

CGGDMMMMMr   __main__)__doc__
__future__r   r    r%   r   r   pathlibr   girequire_versiongi.repositoryr   r   r,   exc
SystemExitr   r   __file__resolveparent	REPO_ROOTr  r	   ApplicationWindowr:   Applicationr  r  r5   r8   r   r   <module>r*     s  
 
 # " " " " " 				               ^IIIBue$$$''''''''' ^ ^ ^
*VY\\
]
]]^  B...+++++++    DNN""$$+		X	! ! ! ! ! ! ! !Dp p p p pS* p p pf	 	 	 	 	#/ 	 	 	   zDFFFFF s'   > AAAA4 4A>=A>