U
    ©²F_`?  ã                   @   sŽ   d dl mZ d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ G dd	„ d	ej	ƒZ
G d
d„ dejƒZG dd„ dejƒZdS )é    )ÚCoverLocale)ÚGSetting)ÚGLib)ÚGObject)ÚGdk)ÚGio)ÚGtkc                   @   sR   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dd„ Zdd„ ZdS )ÚRepeatzn
    Object handling song repeating, with an additional feature of
    repeating one song, one song only.
    r   é   c              	   C   sÐ   t j | ¡ d| _|| _| j| _|jj}|jj	 
d| j¡ | 
d| j¡ z<ztj |¡}W n tk
rv   t|ƒ}Y nX | d¡ W 5 t||ƒ}| |¡ X | 
d| j||¡ | 
d| j¡ |  || ¡ ¡ dS )zy
        :param shell: the plugin object
        :param toggle_button: button that controls the repeat functions
        FZeoszplaying-song-changedÚtoggledúrepeat-type-changedN)r   ÚObjectÚ__init__Úrepeat_songÚtoggle_buttonÚSONG_CHANGED_MANUALÚsong_changedÚpropsZshell_playerÚplayerÚconnectÚon_gst_player_eosÚon_song_changeÚRepeatPopContainerÚaddr   ZPopoverÚnewÚAttributeErrorÚCustomPopoverZ	set_modalÚ
_on_toggleÚ_on_repeat_type_changedÚget_repeat_type)ÚselfÚshellr   r   ÚpopoverÚrepeat© r$   úC/usr/lib/rhythmbox/plugins/alternative-toolbar/alttoolbar_repeat.pyr   &   s"    
zRepeat.__init__c                 C   sJ   |  ¡ r"| ¡  | ¡ tjk| _n| ¡  d| _|  |¡ td| jƒ d S )NFz	on toggle)	Ú
get_activeÚshow_allr   r   ÚONE_SONGr   ÚhideÚ_set_toggle_tooltipÚprint)r    Ztoggler"   r#   r$   r$   r%   r   M   s    ÿ
zRepeat._on_togglec                 C   sb   t ƒ }| |jj¡ | j ¡ rJ| ¡ tjkr6t	dƒ}nt	dƒ}| j 
|¡ t ƒ }| |jj¡ d S )NúRepeat all tracksúRepeat the current track)r   Úswitch_localeÚLocaleÚLOCALE_DOMAINr   Úget_has_tooltipr   r   Ú	ALL_SONGSÚ_Úset_tooltip_textZRB)r    r#   ÚclÚmessager$   r$   r%   r*   Z   s    

zRepeat._set_toggle_tooltipc                 C   sD   | j  ¡ r$|tjkrd| _q*d| _nd| _|  |¡ td| jƒ d S )NTFzrepeat type changed)r   r&   r   r(   r   r*   r+   )r    r#   Úrepeat_typer$   r$   r%   r   g   s    


zRepeat._on_repeat_type_changedc                 C   s   | j r| j| _dS )zs
        Set song_changed to SONG_CHANGED_EOS so that on_song_change will
        know to repeat the song.
        N)r   ÚSONG_CHANGED_EOSr   )r    Z
gst_playerZstream_dataZearlyr$   r$   r%   r   t   s    zRepeat.on_gst_player_eosc                 C   s    | j | jkr| j| _ | ¡  dS )zd
        Repeat song that has just been played
        (when called on song change signal).
        N)r   r8   r   Zdo_previous)r    r   Útimer$   r$   r%   r   |   s    zRepeat.on_song_changec                 C   s0   | j r,| ¡ }|dkr,||d kr,| d¡ dS )zs
        This is a old method to 'repeat' the current song as soon as
        it reaches the last seconds.
        r   é   N)r   Zget_playing_song_durationZset_playing_time)r    r   r9   Zdurationr$   r$   r%   Úon_elapsed_changeŠ   s
    zRepeat.on_elapsed_changeN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   r   r   r*   r   r   r   r;   r$   r$   r$   r%   r	      s   '
r	   c                       sN   e Zd ZdejdeffiZdZdZ‡ fdd„Z	dd„ Z
d	d
„ Zdd„ Z‡  ZS )r   r   Nr
   r:   c                    s¨  t t| ƒj||Ž |  tjj¡ |  tjj	¡ d| j
_|  ¡ }| d¡ d}tj d ¡}| d¡ d}tj |¡}	t ¡ }
|
 |	|¡ d|
j
_| |
¡ | d| j¡ | d| j¡ | d| j¡ tƒ }| |jj¡ | ¡ rì| t d	ƒ¡ || _!|  "|¡ |  #|d
d¡ | $¡  t ¡ | _%| j% |	|¡ d| j%j
_tj &|¡}| d¡ d}tj |¡}t ¡ }| ||¡ d|j
_| |¡ | ¡ r˜| t dƒ¡ t ¡ | _'| j' ||¡ d| j'j
_| d| j¡ | d| j¡ | d| j¡ | $¡  || _(|  "|¡ |  #|d
d¡ d| _)| d| j¡ | d| j¡ | d| j¡ | d| j¡ | | j%¡ || _*|| _+t,ƒ | _-| j- .| j-j/j0¡| _1| j1| j-j2j3 }|tj4kr¤| j( 5d¡ d S )Né   Zlinkedé   Fzmedia-playlist-repeat-symboliczleave-notify-eventzenter-notify-eventr   r,   znon-homogeneousTz#media-playlist-repeat-song-symbolicr-   r   )6Úsuperr   r   Zset_orientationr   ZOrientationZ
HORIZONTALZ
set_layoutZButtonBoxStyleZSTARTr   ZmarginZget_style_contextZ	add_classZRadioButtonr   Zset_moder   Z
ThemedIconZnew_with_default_fallbacksZImageZset_from_giconÚ	set_imager   Ú_on_popover_mouse_overÚ_on_popover_button_toggledr   r.   r/   r0   r1   r4   r3   Ú_repeat_buttonr   Zchild_set_propertyr'   Ú_repeat_imageZnew_from_widgetÚ_repeat_song_imageÚ_repeat_song_buttonÚ_popover_inprogressÚ_parent_containerÚ_parent_buttonr   ÚgsZget_settingÚPathZPLUGINÚplugin_settingsÚ	PluginKeyÚREPEAT_TYPEr(   Z
set_active)r    Zparent_containerÚparent_buttonÚargsÚkwargsÚcontextZ	icon_sizeZtoggle1ZfallbackZiconZimager5   Ztoggle2ZsymZicon2Zimage2r7   ©Ú	__class__r$   r%   r   ¥   sŒ    











ÿÿÿÿzRepeatPopContainer.__init__c                 G   s|   t dƒ | ¡ rx|| jkrJ| j | j¡ |  dtj¡ tj| j	| j
jj< n.| j | j¡ |  dtj¡ tj| j	| j
jj< d S )Nzpopover toggler   )r+   r&   rF   rL   rC   rG   Úemitr   r2   rO   rM   rP   rQ   rH   r(   )r    ZbuttonrS   r$   r$   r%   rE   ý   s    
ÿÿz-RepeatPopContainer._on_popover_button_toggledc                 C   s   t j}| j ¡ rt j}|S ©N)r   r2   rI   r&   r(   )r    r7   r$   r$   r%   r     s    
z"RepeatPopContainer.get_repeat_typec                    s²   |j tjjkrpˆ jdkr(dˆ _tdƒ ndˆ _tdƒ dˆ _t |ƒtjkr~tdƒ | 	¡ r~tˆ j
ƒ ˆ j
 ¡  ntdƒ dˆ _‡ fd	d
„}ˆ jdkr®tdƒ dˆ _t d|¡ d S )Nr   r
   Zenter1r:   Zenter2ÚhereÚexité   c                     sJ   ˆ j dkrBˆ  jd7  _ˆ jdk r&dS ˆ j ¡  dˆ _ tdƒ dS dS d S )Nr\   r
   r@   Tr   zexit timeoutF)rJ   Ú_popover_inprogress_countrK   r)   r+   )rS   ©r    r$   r%   Údelayed%  s    


z:RepeatPopContainer._on_popover_mouse_over.<locals>.delayedzadding timeoutéd   )Útyper   Z	EventTypeZENTER_NOTIFYrJ   r+   r]   r   ZToggleButtonr&   rK   r'   r   Ztimeout_add)r    ÚwidgetZeventcrossingr_   r$   r^   r%   rD     s&    



z)RepeatPopContainer._on_popover_mouse_over)r<   r=   r>   r   ZSIGNAL_RUN_LASTÚintZ__gsignals__r(   r2   r   rE   r   rD   Ú__classcell__r$   r$   rV   r%   r   œ   s    ÿXr   c                       s@   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Z‡  ZS )r   c                    sn   t t| ƒj|dtjji|—Ž |  d¡ |  d¡ |  t	j
j¡ |  ¡  || _|  d| j¡ |  d| j¡ d S )Nra   FZshowzconfigure-event)rB   r   r   r   Z
WindowTypeZPOPUPZset_decoratedZset_resizableZset_type_hintr   ZWindowTypeHintZDOCKZstickrL   Zconnect_afterÚ_on_showr   Úon_window_config)r    rR   rS   rT   rV   r$   r%   r   :  s    ÿ

zCustomPopover.__init__c                    s6   t  ¡ | _| j |¡ tt| ƒ | j¡ | j ¡  d S rY   )r   ZFrameZ_framer   rB   r   r'   )r    rb   rV   r$   r%   r   G  s    
zCustomPopover.addc                 C   s`   | j  ¡ }| j  ¡ }| ¡  ¡ \}}}||j }||j |j }|  ||¡\}	}
|  	|	|
¡ d S rY   )
rL   Úget_allocationÚget_toplevelÚ
get_windowÚ
get_originÚxÚyÚheightÚapply_screen_coord_correctionÚmove)r    rb   ÚrectÚmain_windowÚvalÚwin_xÚwin_yÚcal_xÚcal_yrk   rl   r$   r$   r%   re   g  s    


zCustomPopover._on_showc                 C   sÚ   |}|}|   ¡ }tj ¡ }tj ¡ }|||j  }|||j  }	|dk rX||7 }tdƒ |dk rdd}| j  ¡ }
| j ¡  ¡ \}}||
j	|
jd   }|	dk s¤|dk rÆ| j  ¡ j}||j | }tdƒ |dk rÒd}||gS )Nr   zat xr:   zat y)
rg   r   ZScreenÚwidthrm   r+   rL   rh   Zget_sizerl   )r    rk   rl   Zcorrected_yZcorrected_xrp   Zscreen_wZscreen_hZdelta_xZdelta_yZbutton_rectZwindow_widthZwindow_heightZcalcZbtn_hgtr$   r$   r%   rn   y  s.    


ÿz+CustomPopover.apply_screen_coord_correctionc                 C   sp   |   ¡ rl| j ¡ }| j ¡ }| ¡  ¡ \}}}||j }||j |j }	|  	¡  |  
||	¡\}
}|  |
|¡ d S rY   )Z
get_mappedrL   rg   rh   ri   rj   rk   rl   rm   r'   rn   ro   )r    rb   Zeventrp   rq   rr   rs   rt   ru   rv   rk   rl   r$   r$   r%   rf   ˜  s    


zCustomPopover.on_window_config)	r<   r=   r>   r   r   re   rn   rf   rd   r$   r$   rV   r%   r   9  s
    r   N)Zalttoolbar_preferencesr   r   Zgi.repositoryr   r   r   r   r   r   r	   Z	ButtonBoxr   ZWindowr   r$   r$   r$   r%   Ú<module>   s    