
    Je                     \    d Z ddlmZ ddlmZ ddlmZmZ  G d de      Z	 G d de      Z
y	)
z
A generic Emacs-style kill ring, as well as a Qt-specific version.

Adapted from qtconsole/kill_ring.py of the
`Jupyter QtConsole Project <https://github.com/jupyter/qtconsole>`_.
    )QObject)QTextCursor)	QTextEditQPlainTextEditc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)KillRingz& A generic Emacs-style kill ring.
    c                 $    | j                          y )N)clearselfs    G/usr/lib/python3/dist-packages/spyder/plugins/editor/utils/kill_ring.py__init__zKillRing.__init__   s    

    c                      d| _         g | _        y) Clears the kill ring.
        N_index_ringr   s    r   r
   zKillRing.clear"   s     
r   c                 :    | j                   j                  |       yz, Adds some killed text to the ring.
        N)r   appendr   texts     r   killzKillRing.kill(   s     	

$r   c                 V    t        | j                        | _        | j                         S )zr Yank back the most recently killed text.

        Returns
        -------
        A text string or None.
        )lenr   r   rotater   s    r   yankzKillRing.yank-   s     $**o{{}r   c                 ~    | xj                   dz  c_         | j                   dk\  r| j                  | j                      S y)z{ Rotate the kill ring, then yank back the new top.

        Returns
        -------
        A text string or None.
           r   Nr   r   s    r   r   zKillRing.rotate7   s4     	q;;!::dkk**r   N)	__name__
__module____qualname____doc__r   r
   r   r   r    r   r   r   r      s      

r   r   c                   F     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 xZS )	
QtKillRingz/ A kill ring attached to Q[Plain]TextEdit.
    c                     t        |t        t        f      sJ t        t        |           t               | _        d| _        d| _	        || _
        |j                  j                  | j                         y)zD Create a kill ring attached to the specified Qt text edit.
        NF)
isinstancer   r   superr(   r   r   r   
_prev_yank_skip_cursor
_text_editcursorPositionChangedconnect_cursor_position_changed)r   	text_edit	__class__s     r   r   zQtKillRing.__init__L   s`     )i%@AAAj$(*Z
!#''//0M0MNr   c                 F    | j                   j                          d| _        y)r   N)r   r
   r,   r   s    r   r
   zQtKillRing.clearY   s     	

r   c                 :    | j                   j                  |       yr   )r   r   r   s     r   r   zQtKillRing.kill_   s     	

r   c                 l    |j                         }|r"|j                          | j                  |       yy)z5 Kills the text selected by the give cursor.
        N)selectedTextremoveSelectedTextr   )r   cursorr   s      r   kill_cursorzQtKillRing.kill_cursord   s1     ""$%%'IIdO r   c                     | j                   j                         }|r:d| _        | j                  j	                         }|j                  |       || _        yy)z2 Yank back the most recently killed text.
        TN)r   r   r-   r.   
textCursor
insertTextr,   r   r   r9   s      r   r   zQtKillRing.yankl   sK     zz  $D__//1Fd#"DO	 r   c                 P   | j                   r| j                  j                         }|r}d| _        | j                  j                         }|j                  t        j                  t        j                  t        | j                                |j                  |       || _         yyy)z; Rotate the kill ring, then yank back the new top.
        T)nN)r,   r   r   r-   r.   r<   movePositionr   Left
KeepAnchorr   r=   r>   s      r   r   zQtKillRing.rotatev   s     ??::$$&D$(!335##K$4$4$/$:$:&)$//&: $ < !!$'"&  r   c                 :    | j                   rd| _         y d | _        y )NF)r-   r,   r   s    r   r1   z#QtKillRing._cursor_position_changed   s     %D"DOr   )r"   r#   r$   r%   r   r
   r   r:   r   r   r1   __classcell__)r3   s   @r   r(   r(   D   s,    O
#'(#r   r(   N)r%   qtpy.QtCorer   
qtpy.QtGuir   qtpy.QtWidgetsr   r   objectr   r(   r&   r   r   <module>rJ      s0      " 4&v &RJ# J#r   