B
    nôb\ 1  ã               @   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mZ ddlmZ ddlmZ ddlmZ d	Zd
ZdZdZdZddddddg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$
Numpy Matrix/Array Builder Widget.
é    )ÚdivisionN)ÚQEventÚQPointÚQt)ÚQDialogÚQHBoxLayoutÚ	QLineEditÚQTableWidgetÚQTableWidgetItemÚQToolButtonÚQToolTipÚQWidget)Ú_)Úicon_manager)ÚHelperToolButtonzCtrl+Mz
Ctrl+Alt+Mz, ú;z], [ÚnanZNANZNaNZNaZNAZnac               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNumpyArrayInlinec             C   s   t  | |¡ || _d S )N)r   Ú__init__Ú_parent)ÚselfÚparent© r   ú:lib/python3.7/site-packages/spyder/widgets/arraybuilder.pyr   *   s    zNumpyArrayInline.__init__c             C   sF   |  ¡ tjtjgkr6| j ¡  | j ¡ rB| j |¡ nt | |¡ dS )z
        Qt override.
        N)	Úkeyr   Ú	Key_EnterÚ
Key_Returnr   Úprocess_textÚis_validÚkeyPressEventr   )r   Úeventr   r   r   r   .   s
    

zNumpyArrayInline.keyPressEventc             C   sÆ   |  ¡ tjkrº| ¡ tjks*| ¡ tjkrº|  ¡ }|  ¡ }|dkrx||d  dkrx|d|d … t	 d ||d…  }n|d|… d ||d…  }|  
|¡ |  |¡ |  
|d ¡ dS t | |¡S )zg
        Qt override.

        This is needed to be able to intercept the Tab key press event.
        r   é   ú NF)Útyper   ÚKeyPressr   r   ÚKey_TabZ	Key_SpaceÚtextZcursorPositionÚROW_SEPARATORZsetCursorPositionZsetTextr   r    )r   r    r&   Zcursorr   r   r   r    :   s    

zNumpyArrayInline.eventN)Ú__name__Ú
__module__Ú__qualname__r   r   r    r   r   r   r   r   )   s   r   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚNumpyArrayTablec             C   s@   t  | |¡ || _|  d¡ |  d¡ |  ¡  | j | j¡ d S )Né   )	r	   r   r   ÚsetRowCountÚsetColumnCountÚreset_headersZcellChangedZconnectÚcell_changed)r   r   r   r   r   r   R   s    

zNumpyArrayTable.__init__c             C   sR   |  ¡ tjtjgkrBt | |¡ |  d¡ |  d¡ | j |¡ nt | |¡ dS )z
        Qt override.
        TFN)r   r   r   r   r	   r   ZsetDisabledr   )r   r    r   r   r   r   \   s    

zNumpyArrayTable.keyPressEventc             C   sp   |   ||¡}d}|r,|  ¡ }|  ¡ }| ¡ }|rd||d krJ|  |d ¡ ||d krd|  |d ¡ |  ¡  dS )z	
        Nr!   )ÚitemÚrowCountÚcolumnCountr&   r-   r.   r/   )r   ÚrowÚcolr1   ÚvalueÚrowsÚcolsr   r   r   r0   i   s    zNumpyArrayTable.cell_changedc             C   sl   |   ¡ }|  ¡ }x$t|ƒD ]}|  |tt|ƒƒ¡ qW x0t|ƒD ]$}|  |tt|ƒƒ¡ |  |d¡ q@W dS )zE
        Update the column and row numbering in the headers.
        é(   N)r2   r3   ÚrangeZsetVerticalHeaderItemr
   ÚstrZsetHorizontalHeaderItemZsetColumnWidth)r   r7   r8   ÚrÚcr   r   r   r/   {   s    zNumpyArrayTable.reset_headersc             C   sÆ   g }|   ¡ }|  ¡ }|dkr<|dkr<|  dd¡}|dkr<dS xvt|d ƒD ]f}xVt|d ƒD ]F}|  ||¡}|dk	r~| ¡ }nd}| ¡ sŽd}| d¡ | |¡ q\W | t¡ qJW d |dd… ¡S )	z?
        Return the entered array in a parseable form.
        r,   r   NÚ r!   Ú0r"   éÿÿÿÿ)	r2   r3   r1   r:   r&   ÚstripÚappendr'   Újoin)r   r&   r7   r8   r1   r<   r=   r6   r   r   r   r&   ˆ   s&    

zNumpyArrayTable.textN)r(   r)   r*   r   r   r0   r/   r&   r   r   r   r   r+   Q   s
   
r+   c               @   sT   e Zd Zddd„Zdd„ Zd	d
„ Zddd„Zdd„ Zdd„ Zdd„ Z	e
dd„ ƒZdS )ÚNumpyArrayDialogNTr   Fc             C   sf  t j| |d || _d | _d | _|| _|| _tdƒ| _tdƒ| _	t
ƒ | _tƒ | _| j t d¡¡ d}| j |¡ |r˜| j | j¡ t| ƒ| _| j| _n | j | j	¡ t| ƒ| _| 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   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: 0, y1: 0, x2: 0, y2: 1,
                  stop: 0 #f6f7fa, stop: 1 #dadbde);
            }
            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ÍÌÌÌÌÌì?éÈ   r!   )%r   r   r   Ú_textÚ_validÚ_offsetÚ_force_floatr   Z_help_inlineZ_help_tabler   Ú_button_warningr   Z_button_helpÚsetIconÚimaÚiconZ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styler   r   r   r   ©   sH    		






zNumpyArrayDialog.__init__c             C   sb   t  ¡  | ¡ tj@ }| ¡ tjtjgkrR|r<| jdd n| jdd |  	¡  nt
 | |¡ dS )z
        Qt override.
        F)ÚarrayTN)r   ZhideTextZ	modifiersr   ZControlModifierr   r   r   r   Zacceptr   r   )r   r    Zctrlr   r   r   r     s    
zNumpyArrayDialog.keyPressEventc             C   s,   |  ¡ tjkr | ¡ tjkr dS t | |¡S )zG
        Qt Override.

        Usefull when in line edit mode.
        F)r#   r   r$   r   r   r%   r   r    )r   r    r   r   r   r      s    zNumpyArrayDialog.eventc             C   sØ  |r
d}nd}d}| j  ¡  ¡ }|dkrÆdt d }t |t|¡}t dd|¡}t dd|¡}t d	d|¡}t td
 d|¡}| dt¡}g }| t¡}t	|ƒ}g }	x†|D ]~}
g }|
 t¡}|	 
t	|ƒ¡ xL|D ]D}|}|tkræd}| jrytt|ƒƒ}W n   Y nX | 
|¡ qÒW | 
t |¡¡ q¬W t |¡}|}t	t|	ƒƒdkrVd| _nd| _|dkr~|dd… }| dd¡}| j}t ddd|t	|ƒ d   ¡}| t|¡}d |||¡}|| _nd| _|  ¡  dS )zP
        Construct the text based on the entered content in the widget.
        znp.array([[znp.matrix([[z]])r>   z(\s*)z\s+r"   z]$z^\[z*$znp.nanr!   TFNr@   z])Ú
z	{0}{1}{2})rO   r&   rA   r'   ÚreÚsubÚreplaceÚELEMENT_SEPARATORÚsplitÚlenrB   Ú
NAN_VALUESrI   r;   ÚfloatrC   ÚsetrG   rH   ÚBRACESÚformatrF   Úupdate_warning)r   rR   ÚprefixÚsuffixÚvaluesZexpZ
new_valuesr7   ZnrowsZncolsr4   Znew_rowÚelementsÚeZnumrQ   Zbracesr&   r   r   r   r     s^    






 zNumpyArrayDialog.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   é   r>   N)rJ   r   r   rK   rL   rM   rN   r   ZshowTextrO   ZmapToGlobalr   )r   ZwidgetZtipr   r   r   r_   g  s    
zNumpyArrayDialog.update_warningc             C   s   | j S )z=
        Return if the current array state is valid.
        )rG   )r   r   r   r   r   t  s    zNumpyArrayDialog.is_validc             C   s   | j S )z6
        Return the parsed array/matrix text.
        )rF   )r   r   r   r   r&   z  s    zNumpyArrayDialog.textc             C   s   | j S )z2
        Return the array builder widget.
        )rO   )r   r   r   r   Úarray_widget€  s    zNumpyArrayDialog.array_widget)NTr   F)T)r(   r)   r*   r   r   r    r   r_   r   r&   Úpropertyrf   r   r   r   r   rD   ¨   s   
Z

JrD   c              C   sF   ddl m}  | ƒ }td dd}td dd}| ¡  | ¡  | ¡  d S )Nr   )ÚqapplicationF)rP   T)Zspyder.utils.qthelpersrh   rD   ZshowZexec_)rh   ZappZ	dlg_tableZ
dlg_inliner   r   r   Útestˆ  s    ri   Ú__main__)#Ú__doc__Z
__future__r   rT   Zqtpy.QtCorer   r   r   Zqtpy.QtWidgetsr   r   r   r	   r
   r   r   r   Zspyder.config.baser   Zspyder.utilsr   rL   Zspyder.widgets.helperwidgetsr   ZSHORTCUT_TABLEZSHORTCUT_INLINErW   r'   r]   rZ   r   r+   rD   ri   r(   r   r   r   r   Ú<module>	   s(   ((W a
