ó
‹²,]c           @   sC  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 d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e	 f d „  ƒ  YZ  d „  Z! e" d k r?e! ƒ  n  d S(   s$   
Numpy Matrix/Array Builder Widget.
iÿÿÿÿ(   t   divisionN(   t   QEventt   QPointt   Qt(   t   QDialogt   QHBoxLayoutt	   QLineEditt   QTableWidgett   QTableWidgetItemt   QToolButtont   QToolTipt   QWidget(   t   _(   t   icon_manager(   t   HelperToolButtons   Ctrl+Ms
   Ctrl+Alt+Ms   , t   ;s   ], [t   nant   NANt   NaNt   Nat   NAt   nat   NumpyArrayInlinec           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s   t  j |  | ƒ | |  _ d  S(   N(   R   t   __init__t   _parent(   t   selft   parent(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR   *   s    c         C   sd   | j  ƒ  t j t j g k rP |  j j ƒ  |  j j ƒ  r` |  j j | ƒ q` n t j |  | ƒ d S(   s   
        Qt override.
        N(	   t   keyR   t	   Key_Entert
   Key_ReturnR   t   process_textt   is_validt   keyPressEventR   (   R   t   event(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR    .   s
    c         C   sð   | j  ƒ  t j k rà | j ƒ  t j k s? | j ƒ  t j k rà |  j ƒ  } |  j ƒ  } | d k r˜ | | d d k r˜ | | d  t	 d | | } n | |  d | | } |  j
 | ƒ |  j | ƒ |  j
 | d ƒ t Sn  t j |  | ƒ S(   sg   
        Qt override.

        This is needed to be able to intercept the Tab key press event.
        i    i   t    (   t   typeR   t   KeyPressR   R   t   Key_Tabt	   Key_Spacet   textt   cursorPositiont   ROW_SEPARATORt   setCursorPositiont   setTextt   FalseR   R!   (   R   R!   R'   t   cursor(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR!   :   s    * (   t   __name__t
   __module__R   R    R!   (    (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR   )   s   		t   NumpyArrayTablec           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sT   t  j |  | ƒ | |  _ |  j d ƒ |  j d ƒ |  j ƒ  |  j j |  j ƒ d  S(   Ni   (	   R   R   R   t   setRowCountt   setColumnCountt   reset_headerst   cellChangedt   connectt   cell_changed(   R   R   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR   R   s    	
c         C   so   | j  ƒ  t j t j g k r[ t j |  | ƒ |  j t ƒ |  j t ƒ |  j	 j | ƒ n t j |  | ƒ d S(   s   
        Qt override.
        N(
   R   R   R   R   R   R    t   setDisabledt   TrueR,   R   (   R   R!   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR    \   s    c         C   s¤   |  j  | | ƒ } d } | rE |  j ƒ  } |  j ƒ  } | j ƒ  } n  | r– | | d k ro |  j | d ƒ n  | | d k r– |  j | d ƒ q– n  |  j ƒ  d S(   s	   
        i   N(   t   itemt   Nonet   rowCountt   columnCountR'   R1   R2   R3   (   R   t   rowt   colR9   t   valuet   rowst   cols(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR6   i   s    c         C   s’   |  j  ƒ  } |  j ƒ  } x0 t | ƒ D]" } |  j | t t | ƒ ƒ ƒ q% Wx@ t | ƒ D]2 } |  j | t t | ƒ ƒ ƒ |  j | d ƒ qX Wd S(   sE   
        Update the column and row numbering in the headers.
        i(   N(   R;   R<   t   ranget   setVerticalHeaderItemR   t   strt   setHorizontalHeaderItemt   setColumnWidth(   R   R@   RA   t   rt   c(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR3   {   s     c         C   s  g  } |  j  ƒ  } |  j ƒ  } | d k r[ | d k r[ |  j d d ƒ } | d k r[ d Sn  x¢ t | d ƒ D] } xz t | d ƒ D]h } |  j | | ƒ } | d k	 r¶ | j ƒ  } n d } | j ƒ  sÑ d } n  | j d ƒ | j | ƒ qƒ W| j t ƒ ql Wd j	 | d  ƒ S(	   s?   
        Return the entered array in a parseable form.
        i   i    t    i   t   0R"   iÿÿÿÿN(
   R;   R<   R9   R:   RB   R'   t   stript   appendR)   t   join(   R   R'   R@   RA   R9   RG   RH   R?   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR'   ˆ   s&    	(   R.   R/   R   R    R6   R3   R'   (    (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR0   Q   s
   	
			t   NumpyArrayDialogc           B   se   e  Z d	 e d  e d „ Z d „  Z d „  Z e d „ Z d „  Z	 d „  Z
 d „  Z e d „  ƒ Z RS(
   i    c         C   só  t  j |  d | ƒ| |  _ d  |  _ d  |  _ | |  _ | |  _ t d ƒ |  _	 t d ƒ |  _
 t ƒ  |  _ t ƒ  |  _ |  j j t j d ƒ ƒ d } |  j j | ƒ | rÜ |  j j |  j	 ƒ t |  ƒ |  _ |  j |  _ n. |  j j |  j
 ƒ t |  ƒ |  _ |  j |  _ d } |  j | ƒ d } |  j j | ƒ |  j t j t j Bt j Bƒ |  j t ƒ |  j d ƒ |  j j  d	 ƒ t! ƒ  |  _" |  j" j# |  j ƒ |  j" j# |  j d
 t j$ ƒ |  j" j# |  j d
 t j$ ƒ |  j% |  j" ƒ |  j j& ƒ  d  S(   NR   sw  
           <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 ';'.
           sY  
           <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.
           t   MessageBoxInformations  
            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);
            }
            s¡   
            QDialog {
              margin:0px;
              border: 1px solid grey;
              padding:0px;
              border-radius: 2px;
            }s¥   
            QToolButton {
              margin:1px;
              border: 0px solid grey;
              padding:0px;
              border-radius: 0px;
            }gÍÌÌÌÌÌì?iÈ   i   ('   R   R   R   R:   t   _textt   _validt   _offsett   _force_floatR   t   _help_inlinet   _help_tableR	   t   _button_warningR   t   _button_helpt   setIcont   imat   icont   setStyleSheett
   setToolTipR   t   _widgetR0   t   _tablet   setWindowFlagsR   t   Windowt   Dialogt   FramelessWindowHintt   setModalR8   t   setWindowOpacityt   setMinimumWidthR   t   _layoutt	   addWidgett   AlignTopt	   setLayoutt   setFocus(   R   R   t   inlinet   offsett   force_floatt   style(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR   ©   sH    							
c         C   s…   t  j ƒ  | j ƒ  t j @} | j ƒ  t j t j g k rq | rT |  j d t	 ƒ n |  j d t
 ƒ |  j ƒ  n t j |  | ƒ d S(   s   
        Qt override.
        t   arrayN(   R
   t   hideTextt	   modifiersR   t   ControlModifierR   R   R   R   R,   R8   t   acceptR   R    (   R   R!   t   ctrl(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR      s    
c         C   s>   | j  ƒ  t j k r. | j ƒ  t j k r. t St j |  | ƒ S(   sG   
        Qt Override.

        Usefull when in line edit mode.
        (	   R#   R   R$   R   R   R%   R,   R   R!   (   R   R!   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR!     s    *c         C   sŒ  | r d } n d } d } |  j  j ƒ  j ƒ  } | d k rud t d } t j | t | ƒ } t j d d | ƒ } t j d d | ƒ } t j d	 d | ƒ } t j t d
 d | ƒ } | j d t ƒ } g  } | j t ƒ } t	 | ƒ } g  }	 x± | D]© }
 g  } |
 j t ƒ } |	 j
 t	 | ƒ ƒ xb | D]Z } | } | t k rMd } n  |  j ryy t t | ƒ ƒ } WqyqyXn  | j
 | ƒ q,W| j
 t j | ƒ ƒ q÷ Wt j | ƒ } | } t	 t |	 ƒ ƒ d k rÝt |  _ n	 t |  _ | d k r| d  } | j d d ƒ } n  |  j } t j d d d | t	 | ƒ d ƒ } | j t | ƒ } d j | | | ƒ } | |  _ n	 d |  _ |  j ƒ  d S(   sP   
        Construct the text based on the entered content in the widget.
        s   np.array([[s   np.matrix([[s   ]])RI   s   (\s*)s   \s+R"   s   ]$s   ^\[s   *$s   np.nani   iÿÿÿÿs   ])s   
s	   {0}{1}{2}N(   R]   R'   RK   R)   t   ret   subt   replacet   ELEMENT_SEPARATORt   splitt   lenRL   t
   NAN_VALUESRS   RD   t   floatRM   t   setR8   RQ   R,   RR   t   BRACESt   formatRP   t   update_warning(   R   Ro   t   prefixt   suffixt   valuest   expt
   new_valuesR@   t   nrowst   ncolsR=   t   new_rowt   elementst   et   numRl   t   bracesR'   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR     s^    				
	(	c         C   s€   |  j  } |  j ƒ  sl t d ƒ } | j t j d ƒ ƒ | j | ƒ t j |  j	 j
 t d d ƒ ƒ | ƒ n |  j  j d ƒ d S(   sV   
        Updates the icon and tip based on the validity of the array content.
        s   Array dimensions not validt   MessageBoxWarningi    i   RI   N(   RV   R   R   RX   RY   RZ   R\   R
   t   showTextR]   t   mapToGlobalR   (   R   t   widgett   tip(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR€   g  s    	(c         C   s   |  j  S(   s=   
        Return if the current array state is valid.
        (   RQ   (   R   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR   t  s    c         C   s   |  j  S(   s6   
        Return the parsed array/matrix text.
        (   RP   (   R   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyR'   z  s    c         C   s   |  j  S(   s2   
        Return the array builder widget.
        (   R]   (   R   (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyt   array_widget€  s    N(   R.   R/   R:   R8   R,   R   R    R!   R   R€   R   R'   t   propertyR’   (    (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyRN   ¨   s   Z		
J			c          C   s_   d d l  m }  |  ƒ  } t d  d t ƒ} t d  d t ƒ} | j ƒ  | j ƒ  | j ƒ  d  S(   Niÿÿÿÿ(   t   qapplicationRk   (   t   spyder.utils.qthelpersR”   RN   R:   R,   R8   t   showt   exec_(   R”   t   appt	   dlg_tablet
   dlg_inline(    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyt   testˆ  s    	

t   __main__(#   t   __doc__t
   __future__R    Ru   t   qtpy.QtCoreR   R   R   t   qtpy.QtWidgetsR   R   R   R   R   R	   R
   R   t   spyder.config.baseR   t   spyder.utilsR   RY   t   spyder.widgets.helperwidgetsR   t   SHORTCUT_TABLEt   SHORTCUT_INLINERx   R)   R~   R{   R   R0   RN   R›   R.   (    (    (    s:   lib/python2.7/site-packages/spyder/widgets/arraybuilder.pyt   <module>	   s&   :(Wà	
