
    G@d{6                        d Z ddlZddlZddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z! ddl"m#Z# dd	l$m%Z% dd
l&m'Z' dZ(d)                    e(          Z* G d de          Z+ G d de          Z, G d de          Z- G d de          Z. G d de          Z/ G d de          Z0 G d de
          Z1d Z2e3dk    r e2             dS dS )z
Helper widgets.
    N)PYQT5)QPointQRegExpQSizeQSortFilterProxyModelQt)QAbstractTextDocumentLayoutQColorQFontMetricsQPainterQRegExpValidatorQTextDocument)QApplication	QCheckBox	QLineEditQMessageBoxQSpacerItemQStyleQStyledItemDelegateQStyleOptionFrameQStyleOptionViewItemQToolButtonQToolTipQVBoxLayout)_)ima)get_search_regex)QStylePaletteuS   ÁÉÍOÚáéíúóàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜñÑz[A-Za-z\s{0}]c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )HelperToolButtonzFSubclasses QToolButton, to provide a simple tooltip on mousedown.
    c                     t          j        |            |                     t          j        d                     d}|                     |           d S )NMessageBoxInformationzr
            QToolButton {
              padding:0px;
              border-radius: 2px;
            }
            )r   __init__setIconr   get_std_iconsetStyleSheet)selfstyles     <lib/python3.11/site-packages/spyder/widgets/helperwidgets.pyr#   zHelperToolButton.__init__'   sT    T"""S%&=>>??? 	5!!!!!    c                     || _         d S N	_tip_textr'   texts     r)   
setToolTipzHelperToolButton.setToolTip2   s    r*   c                     | j         S r,   r-   r'   s    r)   toolTipzHelperToolButton.toolTip5   s
    ~r*   c                 ,    t          j                     d S r,   )r   hideTextr'   events     r)   mousePressEventz HelperToolButton.mousePressEvent8   s    r*   c           	          t          j        |                     t          d|                                                     | j                   d S )Nr   )r   showTextmapToGlobalr   heightr.   r7   s     r)   mouseReleaseEventz"HelperToolButton.mouseReleaseEvent;   sH    $**6!T[[]]+C+CDD.	* 	* 	* 	* 	*r*   N)	__name__
__module____qualname____doc__r#   r1   r4   r9   r>    r*   r)   r    r    $   si         	" 	" 	"      * * * * *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 )	MessageCheckBoxz
    A QMessageBox derived widget that includes a QCheckBox aligned to the right
    under the message and on top of the buttons.
    c                 <    t          t          |           j        |i | |                     t          j                   t          |           | _        d}t                      }|	                    t          ||                     |                    | j        dt          j                   |	                    t          ||                     |                                 }t          r|                    |dd           d S |                    |dd           d S )N	   r         )superrE   r#   setWindowModalityr   NonModalr   	_checkboxr   addItemr   	addWidget
AlignRightlayoutr   	addLayout)r'   argskwargssizecheck_layoutrQ   	__class__s         r)   r#   zMessageCheckBox.__init__E   s   -ot$$-t>v>>>r{+++"4 "}}[t44555t~q"-@@@[t44555  	1\1a00000\1a00000r*   c                 4    | j                                         S r,   )rM   	isCheckedr3   s    r)   
is_checkedzMessageCheckBox.is_checked[   s    ~'')))r*   c                 6    | j                             |          S r,   )rM   
setCheckedr'   values     r)   set_checkedzMessageCheckBox.set_checked^   s    ~((///r*   c                 :    | j                             |           d S r,   )rM   
setVisibler]   s     r)   set_check_visiblez!MessageCheckBox.set_check_visiblea   s    !!%(((((r*   c                 8    | j                                          d S r,   )rM   	isVisibler3   s    r)   is_check_visiblez MessageCheckBox.is_check_visibled   s      """""r*   c                 8    | j                                          d S r,   )rM   r0   r3   s    r)   checkbox_textzMessageCheckBox.checkbox_textg   s    r*   c                 :    | j                             |           d S r,   )rM   setTextr/   s     r)   set_checkbox_textz!MessageCheckBox.set_checkbox_textj   s    t$$$$$r*   )r?   r@   rA   rB   r#   rZ   r_   rb   re   rg   rj   __classcell__rW   s   @r)   rE   rE   @   s         1 1 1 1 1,* * *0 0 0) ) )# # #  % % % % % % %r*   rE   c                   6     e Zd ZdZd fd	Zd Zd Zd Z xZS )HTMLDelegatezWith this delegate, a QListWidgetItem or a QTableItem can render HTML.

    Taken from https://stackoverflow.com/a/5443112/2399799
    r   c                 f    t          t          |                               |           || _        d S r,   )rJ   rn   r#   _margin)r'   parentmarginrW   s      r)   r#   zHTMLDelegate.__init__t   s,    lD!!**6222r*   c                     t          |          }|                     ||           t                      }|                    | j                   |                    |j                   ||fS r,   )r   initStyleOptionr   setDocumentMarginrp   setHtmlr0   r'   optionindexoptionsdocs        r)   _prepare_text_documentz#HTMLDelegate._prepare_text_documentx   sb    &v..We,,,oodl+++GL!!!|r*   c                    |                      ||          \  }}|j        t          j                    n|j                                        }d|_        |                    t          j        |||j                   t          j	                    }|
                    t          j        |d           }|                                 t          |j        d          r|                                dv rm|j        j        r9|                    |                                t%          dd          z              n|                    |                                           n|j        j        r9|                    |                                t%          dd          z              nq|                    |                                t%          dd          z              n8|                    |                                t%          dd          z              |                                }	t)          |	          t          u r|	                    ||           |                                 d S )	N 
files_list)oxygenqtcurvebreeze   irI   r   )r|   widgetr   r(   r0   drawControlr   CE_ItemViewItemr	   PaintContextsubElementRectSE_ItemViewItemTextsavehasattr
objectNamer   	translatetopLeftr   documentLayouttypedrawrestore)
r'   painterrx   ry   rz   r{   r(   ctxtextRect	docLayouts
             r)   paintzHTMLDelegate.paint   s+   2265AA)0)?#%%%n**,, 	 	&0'7!.	* 	* 	* *688''(B(/7 7 7><00 	B!!%DDD>, :%%h&6&6&8&86!R==&HIIII%%h&6&6&8&89999>, I%%h&6&6&8&86!Q<<&GHHHH%%h&6&6&8&86!Q<<&GHHHHh..006!R==@AAA
 &&((		??999NN7C(((r*   c                     |                      ||          \  }}t          t          |                                          t          |                                                                dz
                      S )NrI   )r|   r   round
idealWidthrU   r=   )r'   rx   ry   __r{   s        r)   sizeHintzHTMLDelegate.sizeHint   s^    --fe<<CU3>>++,,eCHHJJ4E4E4G4G!4K.L.LMMMr*   )r   )	r?   r@   rA   rB   r#   r|   r   r   rk   rl   s   @r)   rn   rn   n   s|         
       * * *XN N N N N N Nr*   rn   c                        e Zd Zd Zd Zd ZdS )ItemDelegatec                 0    t          j        | |           d S r,   )r   r#   )r'   rq   s     r)   r#   zItemDelegate.__init__   s    $T622222r*   c                 L   t          |          }|                     ||           |j        t          j                    n|j                                        }t                      }|                    d           |                    |j                   d|_        |	                    t          j        ||           t          j                    }|                    t          j        |d           }|                                 |                    |                                           |                    |                    |                                                      |                                                    ||           |                                 d S )Nr   r~   )r   rt   r   r   r(   r   ru   rv   r0   r   r   r   r	   r   r   r   r   r   r   setClipRect
translatedr   r   r   )	r'   r   rx   ry   rz   r(   r{   r   r   s	            r)   r   zItemDelegate.paint   si   &v..We,,,)0)?#%%%n**,, 	 ooa   GL!!!&0'7CCC)688''(B(/7 7(**,,---H//1A1A1C1C0CDDEEE!!'3///r*   c                    t          |          }|                     ||           t                      }|                    |j                   |                    |j                                                   t          |	                                |
                                                                          S r,   )r   rt   r   rv   r0   setTextWidthrectwidthr   r   rU   r=   rw   s        r)   r   zItemDelegate.sizeHint   s    &v..We,,,ooGL!!!++--...S^^%%sxxzz'8'8':':;;;r*   N)r?   r@   rA   r#   r   r   rC   r*   r)   r   r      sA        3 3 3  2< < < < <r*   r   c                   h     e Zd ZdZdej        f fd	Zd Zd Zd Z	d Z
 fdZ fd	Z fd
Z xZS )IconLineEditzr
    Custom QLineEdit that includes an icon representing a validation for its
    text and can also elide it.
    Fc                 j   t                                          |           || _        || _        d| _        d| _        d| _        t          j        d          | _	        t          j        d          | _
        t          j        d          | _        |                                  d| _        d| _        d S )NTFtodowarning	todo_listr   )rJ   r#   
elide_textellipsis_place_status_status_set	_focus_inr   icon_valid_icon_invalid_icon	_set_icon_refresh_paint_count_icon_visible)r'   rq   r   r   rW   s       r)   r#   zIconLineEdit.__init__   s       $,8F++ Xi00+.."r*   c                 >   |                                  }| j        r	| j        sd}t          j                                        }|j                            d| d           |                     |	                                           | 
                                 dS )zm
        This makes space for the right validation icons after focus is given to
        the widget.
        r   nonepx)borderpaddingRightN)r=   r   r   	qstylizerr(   
StyleSheetr   	setValuesr&   toStringupdate)r'   paddingcsss      r)   r   zIconLineEdit._refresh   s    
 ++--? 	4> 	Go((**# 	  	
 	
 	

 	3<<>>***r*   c                 d    d| _         |                                  |                                  dS )zShow the status icon.FNr   repaintr   r3   s    r)   hide_status_iconzIconLineEdit.hide_status_icon  s(    "r*   c                 d    d| _         |                                  |                                  dS )zHide the status icon.TNr   r3   s    r)   show_status_iconzIconLineEdit.show_status_icon  s(    !r*   c                 r    || _         || _        |                                  |                                  dS )z@Update the status and set_status to update the icons to display.N)r   r   r   r   )r'   r^   	value_sets      r)   update_statuszIconLineEdit.update_status  s/    $r*   c                 P   | j         rO| j        sGt          |           }t                      }|                     |           |                                                     t          j        ||           }|	                    dddd           t          |                                           }|                    |                                 | j        |                                          }|                    t#          t$          j                             |                    |t+          t,          j        t,          j        z            |           dS t3                                          |           t          |           }|                                 }t+          |                                dz            }|                                |z
  }	|                                |	z
  }
| j        r| j        r#| j        r| j         !                    |	|	          }n>| j        r| j"        !                    |	|	          }n| j#        !                    |	|	          }|$                    |
d|           | j%        dk     r&| xj%        dz  c_%        | &                                 dS dS )zm
        Include a validation icon to the left of the line edit and elide text
        if requested.
        r   N   rI      rH   )'r   r   r   r   rt   r(   r   r   SE_LineEditContentsadjustr   font
elidedTextr0   r   r   setPenr
   r   COLOR_TEXT_1drawTextintr   	AlignLeftAlignVCenterrJ   
paintEventgeometryr=   r   r   r   r   pixmapr   r   
drawPixmapr   r   )r'   r8   r   rx   	text_rectfmr0   r   spacehwr   rW   s               r)   r   zIconLineEdit.paintEvent  sR    ? 	4> 	
 tnnG&((F  (((

33*FD: :IQ2q)))diikk**B==d.A!*!2!24 4DNN6-"<==>>>YBL2?,J(K(K!# # #F5!!!4..}}T[[]]A%&&KKMME!JJLL1 	-| 9 0 9..q!44 9)00A66+221a88q!V,,, q  "MMOOOOO ! r*   c                     d| _         |                                  t                                          |           dS )z:Reimplemented to know when this widget has received focus.TN)r   r   rJ   focusInEventr'   r8   rW   s     r)   r   zIconLineEdit.focusInEventE  s5    U#####r*   c                     d| _         |                                  t                                          |           dS )z6Reimplemented to know when this widget has lost focus.FN)r   r   rJ   focusOutEventr   s     r)   r   zIconLineEdit.focusOutEventK  s5    e$$$$$r*   )r?   r@   rA   rB   r   	ElideLeftr#   r   r   r   r   r   r   r   rk   rl   s   @r)   r   r      s         
 +0 # # # # # #  $      . . . . .`$ $ $ $ $% % % % % % % % %r*   r   c                   :     e Zd ZdZddef fd	Zd Z fdZ xZS )FinderLineEditz=QLineEdit for filtering listed elements in the parent widget.Nc                    t          t          |                               |           || _        || _        t          |dz             }|                     t          |                     |r| j        	                    |           d S d S )Nz{100})
rJ   r   r#   _parentmainr   setValidatorr   textChangedconnect)r'   rq   callbackr   
regex_baseregexrW   s         r)   r#   zFinderLineEdit.__init__U  s    nd##,,V444	 
W,--*511222  	/$$X.....	/ 	/r*   c                     |                                 }|                                 |z   }|                     |           dS )zSet the filter text.N)stripr0   ri   )r'   r0   new_texts      r)   set_textzFinderLineEdit.set_textc  s9    zz||99;;%Xr*   c                    |                                 }|t          j        fv r| j                                         dS |t          j        fv r| j                                         dS |t          j        t          j        fv r| j        	                                 dS t          t          |                               |           dS )z
        Qt Override.

        The parent needs to implement the methods to handle focus on the
        next/previous row and a action over the selected element.

        This should be override.
        N)keyr   Key_Upr   previous_rowKey_Downnext_row	Key_Enter
Key_Returnselected_elementrJ   r   keyPressEvent)r'   r8   r   rW   s      r)   r  zFinderLineEdit.keyPressEventi  s     iikk29+L%%'''''R[M!!L!!#####R\2=111L))+++++.$''55e<<<<<r*   )	r?   r@   rA   rB   VALID_FINDER_CHARSr#   r   r  rk   rl   s   @r)   r   r   R  ss        GG(,4./ / / / / /  = = = = = = = = =r*   r   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )CustomSortFilterProxyz$Custom column filter based on regex.Nc                     t          t          |                               |           || _        t	          j        d          | _        d S )Nr~   )rJ   r  r#   r   recompilepattern)r'   rq   rW   s     r)   r#   zCustomSortFilterProxy.__init__  s<    #T**33F;;;z#r*   c                     t          |          | _        | j        r|r| j                            d           n| j                            d           |                                  dS )z"Set regular expression for filter.FTN)r   r  r   setSortingEnabledinvalidateFilterr/   s     r)   
set_filterz CustomSortFilterProxy.set_filter  si    '--< 	1D 	1L**51111L**4000r*   c                     |                                  }|                    |          j        }t          j        | j        |          }|dS dS )zbQt override.

        Reimplemented from base class to allow the use of custom filtering.
        NFT)sourceModelrownamer	  searchr  )r'   row_numrq   modelr  rs         r)   filterAcceptsRowz&CustomSortFilterProxy.filterAcceptsRow  sK    
   ""yy!!&IdlD))954r*   r,   )r?   r@   rA   rB   r#   r  r  rk   rl   s   @r)   r  r  }  sa        ..' ' ' ' ' '
           r*   r  c                     ddl m}   |             }t                      }|                    t	          d                     |                    d           |                    d           |                    t          j	                   |
                    t          j	                   |                    t          j                   |                                 d S )Nr   )qapplicationzSpyder updateszTesting checkboxzCheck for updates on startup?)spyder.utils.qthelpersr  rE   setWindowTitler   ri   rj   setStandardButtonsr   OksetDefaultButtonr$   Informationexec_)r  appboxs      r)   test_msgcheckboxr$    s    333333
,..C


Cq)**+++KK"###9:::;>***(((KK'(((IIKKKKKr*   __main__)4rB   r	  qstylizer.styler   qtpyr   qtpy.QtCorer   r   r   r   r   
qtpy.QtGuir	   r
   r   r   r   r   qtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   r   spyder.config.baser   spyder.utils.icon_managerr   spyder.utils.stringmatchingr   spyder.utils.paletter   VALID_ACCENT_CHARSformatr  r    rE   rn   r   r   r   r  r$  r?   rC   r*   r)   <module>r1     sT   
 
			           I I I I I I I I I I I I I IE E E E E E E E E E E E E E E E@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ !           ) ) ) ) ) ) 8 8 8 8 8 8 . . . . . . k %,,-?@@ * * * * *{ * * *8+% +% +% +% +%k +% +% +%\BN BN BN BN BN& BN BN BNJ%< %< %< %< %<& %< %< %<Pt% t% t% t% t%9 t% t% t%n(= (= (= (= (=Y (= (= (=V    1   @
 
 
 z r*   