
    
8d                     D    d Z ddlmZmZmZ  G d dej                  ZdS )z9 Provides bracket matching for Q[Plain]TextEdit widgets.
    )QtCoreQtGui	QtWidgetsc                   L     e Zd ZdZddddZdddd	Z fd
Zd Zd Zd Z	 xZ
S )BracketMatcherzX Matches square brackets, braces, and parentheses based on cursor
        position.
    )}])({[r   r   r   )r   r	   r
   c                 l   t          |t          j        t          j        f          sJ t	                                                       t          j                    | _        | j        	                    t          j
        d                     || _        |j                            | j                   dS )zf Create a call tip manager that is attached to the specified Qt
            text edit widget.
        silverN)
isinstancer   	QTextEditQPlainTextEditsuper__init__r   QTextCharFormatformatsetBackgroundQColor
_text_editcursorPositionChangedconnect_cursor_position_changed)self	text_edit	__class__s     9lib/python3.11/site-packages/qtconsole/bracket_matcher.pyr   zBracketMatcher.__init__   s     )i&99;S%TUUUUU +--!!%,x"8"8999#'//0MNNNNN    c                    | j                                         }|                    |          }| j                            |          }|rd}n!| j                            |          }|rd}ndS |}d}|dk    rn||                                k     rV||k    r|dz  }n||k    r|dz  }|dk    rn:||z  }|                    |          }|dk    r||                                k     Vd}|S )z Given a valid position in the text document, try to find the
            position of the matching bracket. Returns -1 if unsuccessful.
           r   )r   documentcharacterAt_opening_mapget_closing_mapcharacterCount)r   positionr%   
start_charsearch_char	incrementchardepths           r    _find_matchzBracketMatcher._find_match'   s$   
 ?++--))(33
'++J77 	II+//
;;K 		r !mm8+B+B+D+D D Dz!!
$$
zz	!H''11D !mm8+B+B+D+D D D Hr!   c                 ,   t           j                                        }| j                                        }|                    |           |                    t          j        j	        t          j        j
                   ||_        | j        |_        |S )z7 Convenience method for selecting a character.
        )r   r   ExtraSelectionr   
textCursorsetPositionmovePositionr   QTextCursorNextCharacter
KeepAnchorcursorr   )r   r+   	selectionr:   s       r    _selection_for_characterz'BracketMatcher._selection_for_characterH   s     '6688	++--8$$$E-;!-8	: 	: 	:!	;	r!   c                 V     j                             g             j                                         }|                                s^|                                dz
  }                     |          }|dk    r. fd||fD             } j                             |           dS dS dS )zK Updates the document formatting based on the new cursor position.
        r#   r$   c                 :    g | ]}                     |          S  )r<   ).0posr   s     r    
<listcomp>z;BracketMatcher._cursor_position_changed.<locals>.<listcomp>b   s=     $M $M $M), &*%B%B3%G%G $M $M $Mr!   N)r   setExtraSelectionsr4   hasSelectionr+   r1   )r   r:   r+   match_positionextra_selectionss   `    r    r   z'BracketMatcher._cursor_position_changedV   s     	**2... ++--""$$ 	E((1,H!--h77N##$M $M $M $M19>0J$M $M $M 223CDDDDD	E 	E $#r!   )__name__
__module____qualname____doc__r'   r)   r   r1   r<   r   __classcell__)r   s   @r    r   r      s         
 #300L#300LO O O O O$  B
 
 
E E E E E E Er!   r   N)rJ   qtpyr   r   r   QObjectr   r?   r!   r    <module>rN      sy     * ) ) ) ) ) ) ) ) )\E \E \E \E \EV^ \E \E \E \E \Er!   