a
     ³Ša«5  ã                   @   sø   d Z ddlmZ ddlZddlmZmZmZ ddl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ZG dd„ dƒZG dd„ deƒZdeiZG dd„ deƒZG dd„ deƒZG dd„ de	ƒZdd„ Z e!dkrôe ƒ  dS )zArray Builder Widget.é    )ÚdivisionN)ÚQEventÚQPointÚQt)ÚQDialogÚQHBoxLayoutÚ	QLineEditÚQTableWidgetÚQTableWidgetItemÚQToolButtonÚQToolTip)Ú_)Úima)ÚQStylePalette)ÚHelperToolButtonzCtrl+Mz
Ctrl+Alt+Mc                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dd„ Z
dS )ÚArrayBuilderTypeNc                 C   s   d S ©N© ©Úselfr   r   ú:lib/python3.9/site-packages/spyder/widgets/arraybuilder.pyÚcheck_values-   s    zArrayBuilderType.check_values)Ú__name__Ú
__module__Ú__qualname__ZLANGUAGEÚELEMENT_SEPARATORÚROW_SEPARATORÚBRACESÚEXTRA_VALUESÚARRAY_PREFIXÚMATRIX_PREFIXr   r   r   r   r   r   $   s   r   c                   @   s2   e Zd ZdZdZdZg d¢ddgdœZdZd	Zd
S )ÚArrayBuilderPythonz, ú;z], [)ÚnanZNANZNaNZNaZNAZnaÚinfZINF)znp.nanznp.infznp.array([[znp.matrix([[N)	r   r   r   r   r   r   r   r   r    r   r   r   r   r!   1   s   þr!   Úpythonc                       s6   e Zd Zd‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡  ZS )	ÚArrayInlineNc                    s    t t| ƒ |¡ || _|| _d S r   )Úsuperr&   Ú__init__Ú_parentÚ_options©r   ÚparentÚoptions©Ú	__class__r   r   r(   C   s    zArrayInline.__init__c                    sJ   |  ¡ tjtjfv r6| j ¡  | j ¡ rF| j |¡ ntt	| ƒ |¡ dS )úOverride Qt method.N)
Úkeyr   Ú	Key_EnterÚ
Key_Returnr)   Úprocess_textÚis_validÚkeyPressEventr'   r&   ©r   Úeventr.   r   r   r6   H   s
    

zArrayInline.keyPressEventc                    sÎ   |  ¡ tjkr¾| ¡ tjks*| ¡ tjkr¾|  ¡ }|  ¡ }|dkr|||d  dkr||d|d … | j	j
 d ||d…  }n|d|… d ||d…  }|  |¡ |  |¡ |  |d ¡ dS tt| ƒ |¡S )zn
        Override Qt method.

        This is needed to be able to intercept the Tab key press event.
        r   é   ú NF)Útyper   ÚKeyPressr1   r   ÚKey_TabZ	Key_SpaceÚtextZcursorPositionr*   r   ZsetCursorPositionZsetTextr'   r&   r8   )r   r8   r>   Zcursorr.   r   r   r8   R   s     ÿ
ÿ

zArrayInline.event)N)r   r   r   r(   r6   r8   Ú__classcell__r   r   r.   r   r&   B   s   
r&   c                       sB   e Zd Zd‡ fdd„	Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Z‡  ZS )Ú
ArrayTableNc                    sJ   t t| ƒ |¡ || _|| _|  d¡ |  d¡ |  ¡  | j 	| j
¡ d S )Né   )r'   r@   r(   r)   r*   ÚsetRowCountÚsetColumnCountÚreset_headersZcellChangedZconnectÚcell_changedr+   r.   r   r   r(   m   s    

zArrayTable.__init__c                    sH   t t| ƒ |¡ | ¡ tjtjfv rD|  d¡ |  d¡ | j |¡ dS )r0   TFN)	r'   r@   r6   r1   r   r2   r3   ZsetDisabledr)   r7   r.   r   r   r6   x   s
    

zArrayTable.keyPressEventc                 C   sp   |   ||¡}d }|r,|  ¡ }|  ¡ }| ¡ }|rd||d krJ|  |d ¡ ||d krd|  |d ¡ |  ¡  d S )Nr9   )ÚitemÚrowCountÚcolumnCountr>   rB   rC   rD   )r   ÚrowÚcolrF   ÚvalueÚrowsÚcolsr   r   r   rE      s    zArrayTable.cell_changedc                 C   sd   |   ¡ }|  ¡ }t|ƒD ]}|  |tt|ƒƒ¡ qt|ƒD ]$}|  |tt|ƒƒ¡ |  |d¡ q:dS )z3Update the column and row numbering in the headers.é(   N)rG   rH   ÚrangeZsetVerticalHeaderItemr
   ÚstrZsetHorizontalHeaderItemZsetColumnWidth)r   rL   rM   ÚrÚcr   r   r   rD   ‘   s    zArrayTable.reset_headersc                 C   sÂ   g }|   ¡ }|  ¡ }|dkr<|dkr<|  dd¡}|du r<dS t|d ƒD ]f}t|d ƒD ]F}|  ||¡}|durz| ¡ }nd}| ¡ sŠd}| d¡ | |¡ qX| | jj¡ qHd 	|dd… ¡S )	z-Return the entered array in a parseable form.rA   r   NÚ r9   Ú0r:   éÿÿÿÿ)
rG   rH   rF   rO   r>   ÚstripÚappendr*   r   Újoin)r   r>   rL   rM   rF   rQ   rR   rK   r   r   r   r>   œ   s&    

zArrayTable.text)N)	r   r   r   r(   r6   rE   rD   r>   r?   r   r   r.   r   r@   l   s
   	r@   c                       sd   e Zd Zd‡ fdd„	Z‡ fdd	„Z‡ fd
d„Zddd„Zdd„ Zdd„ Zdd„ Z	e
dd„ ƒZ‡  ZS )ÚArrayBuilderDialogNTr   Fr%   c                    s˜  t t| ƒj|d || _t dd ¡| _|| _d | _d | _	|| _
|| _tdƒ| _tdƒ| _tƒ | _tƒ | _| j t d¡¡ djtjtjd}| j |¡ |rÄ| j | j¡ t| | jd| _| j| _n&| j | j¡ t| | jd| _| j| _d	}|  |¡ d
}| j |¡ |   t!j"t!j#B t!j$B ¡ |  %d¡ |  &d¡ | j 'd¡ t(ƒ | _)| j) *| j¡ | j) *| jdt!j+¡ | j) *| jdt!j+¡ |  ,| j)¡ | j -¡  d S )N)r,   r%   aw  
           <b>Numpy Array/Matrix Helper</b><br>
           Type an array in Matlab    : <code>[1 2;3 4]</code><br>
           or Spyder simplified syntax : <code>1 2;3 4</code>
           <br><br>
           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.
           <br><br>
           <b>Hint:</b><br>
           Use two spaces or two tabs to generate a ';'.
           aY  
           <b>Numpy Array/Matrix Helper</b><br>
           Enter an array in the table. <br>
           Use Tab to move between cells.
           <br><br>
           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.
           <br><br>
           <b>Hint:</b><br>
           Use two tabs at the end of a row to move to the next row.
           ZMessageBoxInformationa  
            QToolButton {{
              border: 1px solid grey;
              padding:0px;
              border-radius: 2px;
              background-color: qlineargradient(x1: 1, y1: 1, x2: 1, y2: 1,
                  stop: 0 {stop_0}, stop: 1 {stop_1});
            }}
            )Zstop_0Zstop_1)r-   z¡
            QDialog {
              margin:0px;
              border: 1px solid grey;
              padding:0px;
              border-radius: 2px;
            }z¥
            QToolButton {
              margin:1px;
              border: 0px solid grey;
              padding:0px;
              border-radius: 0px;
            }TgÍÌÌÌÌÌì?éÈ   r9   ).r'   rY   r(   Z	_languageÚ_REGISTERED_ARRAY_BUILDERSÚgetr*   r)   Ú_textÚ_validÚ_offsetÚ_force_floatr   Z_help_inlineZ_help_tabler   Ú_button_warningr   Z_button_helpÚsetIconr   ÚiconÚformatr   ZCOLOR_BACKGROUND_4ZCOLOR_BACKGROUND_2ZsetStyleSheetÚ
setToolTipr&   Ú_widgetr@   Z_tableZsetWindowFlagsr   ZWindowZDialogZFramelessWindowHintZsetModalZsetWindowOpacityZsetMinimumWidthr   Z_layoutZ	addWidgetZAlignTopZ	setLayoutZsetFocus)r   r,   ÚinlineÚoffsetZforce_floatZlanguageZstyler.   r   r   r(   »   sN    

÷



zArrayBuilderDialog.__init__c                    sf   t  ¡  | ¡ tj@ }| ¡ tjtjfv rR|r<| jdd n| jdd |  	¡  nt
t| ƒ |¡ dS )r0   F)ÚarrayTN)r   ZhideTextZ	modifiersr   ZControlModifierr1   r2   r3   r4   Zacceptr'   rY   r6   )r   r8   Zctrlr.   r   r   r6     s    
z ArrayBuilderDialog.keyPressEventc                    s0   |  ¡ tjkr | ¡ tjkr dS tt| ƒ |¡S )zM
        Override Qt method.

        Useful when in line edit mode.
        F)	r;   r   r<   r1   r   r=   r'   rY   r8   r7   r.   r   r   r8   (  s    zArrayBuilderDialog.eventc                 C   s  |r| j j}n| j j}d}| j ¡  ¡ }|dkrd| j j d }t || j j|¡}t dd|¡}t dd|¡}t dd|¡}t | j jd d|¡}| 	d| j j
¡}g }| | j j¡}t|ƒ}g }	|D ]œ}
g }|
 | j j
¡}|	 t|ƒ¡ |D ]^}|}| j j ¡ D ]\}}||v r|}q| jrBztt|ƒƒ}W n   Y n0 | |¡ qî| | j j
 |¡¡ qÆ| j j |¡}|}tt|	ƒƒd	krd
| _nd| _|d	kr¸|dd… }| 	dd¡}| j}| j j 	ddd|t|ƒ d	   ¡}| 	| j j|¡}d |||¡}|| _nd| _|  ¡  dS )zP
        Construct the text based on the entered content in the widget.
        z]])rS   z(\s*)z\s+r:   z]$z^\[z*$r9   TFNrU   z])Ú
z	{0}{1}{2})r*   r   r    rf   r>   rV   r   ÚreÚsubÚreplacer   ÚsplitÚlenrW   r   Úitemsr`   rP   ÚfloatrX   Úsetr^   r_   r   rd   r]   Úupdate_warning)r   ri   ÚprefixÚsuffixÚvaluesZexpZ
new_valuesrL   ZnrowsZncolsrI   Znew_rowÚelementsÚeZnumr1   rh   Zbracesr>   r   r   r   r4   3  sj    


ÿ
þzArrayBuilderDialog.process_textc                 C   s\   | j }|  ¡ sLtdƒ}| t d¡¡ | |¡ t | j	 
tddƒ¡|¡ n| j  d¡ dS )zV
        Updates the icon and tip based on the validity of the array content.
        zArray dimensions not validZMessageBoxWarningr   é   rS   N)ra   r5   r   rb   r   rc   re   r   ZshowTextrf   ZmapToGlobalr   )r   ZwidgetZtipr   r   r   rs     s    
z!ArrayBuilderDialog.update_warningc                 C   s   | j S )z+Return if the current array state is valid.)r^   r   r   r   r   r5   Ž  s    zArrayBuilderDialog.is_validc                 C   s   | j S )z$Return the parsed array/matrix text.)r]   r   r   r   r   r>   ’  s    zArrayBuilderDialog.textc                 C   s   | j S )z Return the array builder widget.)rf   r   r   r   r   Úarray_widget–  s    zArrayBuilderDialog.array_widget)NTr   Fr%   )T)r   r   r   r(   r6   r8   r4   rs   r5   r>   Úpropertyrz   r?   r   r   r.   r   rY   º   s     ÿ_
NrY   c                  C   sF   ddl m}  | ƒ }td dd}td dd}| ¡  | ¡  | ¡  d S )Nr   )ÚqapplicationF)rg   T)Zspyder.utils.qthelpersr|   rY   ZshowZexec_)r|   ZappZ	dlg_tableZ
dlg_inliner   r   r   Útestœ  s    r}   Ú__main__)"Ú__doc__Z
__future__r   rk   Zqtpy.QtCorer   r   r   Zqtpy.QtWidgetsr   r   r   r	   r
   r   r   Zspyder.config.baser   Zspyder.utils.icon_managerr   Zspyder.utils.paletter   Zspyder.widgets.helperwidgetsr   ZSHORTCUT_TABLEZSHORTCUT_INLINEr   r!   r[   r&   r@   rY   r}   r   r   r   r   r   Ú<module>   s*   
$ÿ*N c
