
    Je,                     n    d Z ddlZddlmZ ddlmZ ddlmZ  ej                  e	      Z
 G d de      Zy)af  
Contains the panels controller, drawing the panel inside CodeEditor's margins.

Not all panels are using PanelsManager, but future panels should use it.

Adapted from pyqode/core/managers/panels.py of the
`PyQode project <https://github.com/pyQode/pyQode>`_.
Original file:
<https://github.com/pyQode/pyqode.core/blob/master/pyqode/core/managers/panels.py>
    N)Manager)Panel)is_text_stringc                        e Zd ZdZ fdZej                  j                  fdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd ZddZd Zej                  j                  fdZd Z xZS )PanelsManagerz_
    Manage the list of panels and draw them inside the margins of
    CodeEditor widgets.
    c           
         t         t        |   |       d| _        d| _        dx| _        x| _        x| _        | _        t        j                  j                  i t        j                  j                  i t        j                  j                  i t        j                  j                  i t        j                  j                  i i| _        	 |j"                  j%                  | j&                         |j(                  j%                  | j*                         y # t,        $ r6 |j/                         j"                  j%                  | j&                         Y y w xY w)N)r	   )r   r   r   r   r	   )superr   __init___cached_cursor_pos_margin_sizes_top_left_right_bottomr   PositionTOPLEFTRIGHTBOTTOMFLOATING_panelsblockCountChangedconnect_update_viewport_marginsupdateRequest_updateAttributeErrordocument)selfeditor	__class__s     F/usr/lib/python3/dist-packages/spyder/plugins/editor/panels/manager.pyr   zPanelsManager.__init__&   s    mT+F3"*)>@@	@DJ@t|NNNNNN  "NN!!2NN##R
	/$$,,T-J-JK  ((6 	/OO//77--/	/s   	A
D <EEc           
      `   |J t         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j
                  dt         j                  j                  di}t        j                  d|j                  d||          t        | j                  |         |_        || j                  |   |j                  <   ||_        |j                  | j                         t        j                  d|j                  z         |S )	z
        Installs a panel on the editor.

        :param panel: Panel to install
        :param position: Position where the panel must be installed.
        :return: The installed panel
        bottomleftrighttopfloatingzadding panel z at zpanel %s installed)r   r   r   r   r   r   r   loggerdebugnamelenr   order_in_zoneposition
on_installr!   )r    panelr/   pos_to_strings       r#   registerzPanelsManager.register:   s        NN!!8NNNN  'NNNN##Z
 	

0=h0GI 	J!$,,x"89-2Xuzz*!%)EJJ67    c                    t         j                  d|z         | j                  |      }|j                          |j	                          |j                  d       | j                  |j                     j                  |j                  d      S )z
        Removes the specified panel.

        :param name_or_class: Name or class of the panel to remove.
        :return: The removed panel
        zRemoving panel %sN)
r*   r+   geton_uninstallhide	setParentr   r/   popr,   )r    name_or_classr1   s      r#   removezPanelsManager.removeS   si     	(=89'

||ENN+//

DAAr4   c                 0   t        d      D ]  }t        | j                  |         st        t	        | j                  |   j                                     d   }| j                  |      }|j                  d       t        | j                  |         rm y)z'Removes all panels from the CodeEditor.   r   N)ranger-   r   sortedlistkeysr<   r9   )r    ikeyr1   s       r#   clearzPanelsManager.cleara   sv    q 	&Adll1o&T$,,q/"6"6"89:1=C(% dll1o&	&r4   c                     t        |      s|j                  }t        d      D ]  }	 | j                  |   |   }|c S  t	        |      # t        $ r Y 1w xY w)z
        Gets a specific panel instance.

        :param name_or_klass: Name or class of the panel to retrieve.
        :return: The specified panel instance.
        r>   )r   __name__r?   r   KeyError)r    r;   zoner1   s       r#   r6   zPanelsManager.geti   sj     m,)22M!H 	DT*=9 	 }%%	  s   A			AAc                     g }| j                   j                         D ].  \  }}|j                         D ]  \  }}|j                  |        0 t        |      S N)r   itemsappenditerr    lst__	zone_dictr1   s        r#   __iter__zPanelsManager.__iter__{   sY    !\\//1 	"MB	&__. "	E

5!"	" Cyr4   c                     g }| j                   j                         D ].  \  }}|j                         D ]  \  }}|j                  |        0 t        |      S rK   )r   rL   rM   r-   rO   s        r#   __len__zPanelsManager.__len__   sX    !\\//1 	"MB	&__. "	E

5!"	" 3xr4   c                 N    t        | j                  |   j                               S )z
        Gets the list of panels attached to the specified zone.

        :param zone: Panel position.

        :return: List of panels instances.
        )rA   r   values)r    rI   s     r#   panels_for_zonezPanelsManager.panels_for_zone   s!     DLL&--/00r4   c                 |    | j                          | j                  | j                  j                         dd       y)z8Refreshes the editor panels (resize and update margins).r   T)force_update_marginsN)resizer   r!   contentsRect)r    s    r#   refreshzPanelsManager.refresh   s0    T[[--/*. 	 	0r4   c                 F   | j                   j                         }| j                   j                         j                         }| j                         \  }}}}||z   }||z   }|j	                         |j	                         |z   z
  }	|j                         |j                         |z   z
  }
d}| j                  t        j                  j                        }|j                  d d       |D ]  }|j                         s|j                          |j                         }|j                  |j                         |z   |j!                         |z   |j	                         |j                         |z
  |z
  |
z
         ||j	                         z  } d}| j                  t        j                  j"                        }|j                  d d       |D ]  }|j                         s|j                         }|j                  |j%                         |z
  |j	                         z
  |	z
  |j!                         |z   |j	                         |j                         |z
  |z
  |
z
         ||j	                         z  } d}| j                  t        j                  j&                        }|j                  d        |D ]  }|j                         s|j                         }|j                  |j                         |j!                         |z   |j	                         |	z
  |j                                ||j                         z  } d}| j                  t        j                  j(                        }|j                  d        |D ]  }|j                         s|j                         }|j                  |j                         |j+                         |z
  |j                         z
  |
z
  |j	                         |	z
  |j                                ||j                         z  } y	)
zResizes panels.r   c                     | j                   S rK   r.   r1   s    r#   <lambda>z&PanelsManager.resize.<locals>.<lambda>       e&9&9 r4   T)rD   reversec                     | j                   S rK   r`   ra   s    r#   rb   z&PanelsManager.resize.<locals>.<lambda>   rc   r4   c                     | j                   S rK   r`   ra   s    r#   rb   z&PanelsManager.resize.<locals>.<lambda>   rc   r4   )rD   c                     | j                   S rK   r`   ra   s    r#   rb   z&PanelsManager.resize.<locals>.<lambda>   rc   r4   N)r!   r\   viewport_compute_zones_sizeswidthheightrX   r   r   r   sort	isVisible
adjustSizesizeHintsetGeometryr&   r(   r   r'   r   r   r%   )r    crect
view_crects_bottoms_lefts_rights_toptwthw_offseth_offsetr&   panelsr1   	size_hintr'   r(   r%   s                     r#   r[   zPanelsManager.resize   s   ((*[[))+88:
+/+D+D+F(&'5g;;=J$4$4$6$;<<<>Z%6%6%82%=>%%enn&9&9:94H 		&E??$(IejjlT1#iikE1'oo/#llnx7%?(JL IOO%%D		& %%enn&:&:;94H 		'E??$(I%	(99HD		e#!)E1H<	>
 Y__&&E		' %%enn&8&899: 	&E??$(Iejjl#iikC/#kkmh6'..02 9##%%C	& %%enn&;&;<9: 		)E??$(I

')*:*:*<<xG(  "	$
 i&&((F		)r4   c                     | j                   j                         }| j                  t        j                  j
                        }|D ]$  }|j                         s|j                  |       & y)zUpdate foating panels.N)r!   r\   rX   r   r   r   rm   set_geometry)r    rq   r{   r1   s       r#   update_floating_panelsz$PanelsManager.update_floating_panels   sX    ((*%%enn&=&=> 	&E??$u%	&r4   c           	      
   | sy| j                   j                         \  }}| j                  \  }}| j                  j	                         D ]  \  }}	|t
        j                  j                  k(  s|t
        j                  j                  k(  rAt        |	j                               }
|
D ]w  }|j                  r|r|j                  d|       ||k7  s||k7  s|j                  s:|j                  d|j                         |j                         |j!                                y  ||f| _        |j#                  | j                   j%                         j'                               s|r| j)                          | j+                          y)zUpdates panels.Nr   )r!   get_cursor_line_columnr   r   rL   r   r   r   r   rA   rW   
scrollablescrollupdateyrj   rk   containsrh   rectr   r   )r    r   delta_yrZ   linecololineocolzones_idrI   r{   r1   s               r#   r   zPanelsManager._update   s4   KK668	c--t"ll002 		LNHd5>>---5>>000$++-(F L##LLG,5=C4K53C3CLLDFFHekkmT[[]K	L		L #')MM$++..05578$))+##%r4   c                    d}d}d}d}| j                  t        j                  j                        D ]6  }|j	                         s|j                         j                         }||z  }8 | j                  t        j                  j                        D ]6  }|j	                         s|j                         j                         }||z  }8 | j                  t        j                  j                        D ]6  }|j	                         s|j                         j                         }||z  }8 | j                  t        j                  j                        D ]6  }|j	                         s|j                         j                         }||z  }8 ||||f}|| j                  k7  r&|| _        | j                  j                  ||||       yy)zUpdate viewport margins.r   N)rX   r   r   r   rm   ro   rj   r   r   rk   r   r   r!   setViewportMargins)	r    r(   r&   r'   r%   r1   rj   rk   new_sizes	            r#   r   z&PanelsManager._update_viewport_margins   s   ))%..*=*=> 	E (..0	 ))%..*>*>? 	E (..0	 ))%..*<*<= 	E )002v	 ))%..*?*?@ 	!E )002& 	! uf-t)))!)DKK**4eVD *r4   c                      | j                   |   S )z
        Gets the size of a specific margin.

        :param position: Margin position. See
            :class:`spyder.api.Panel.Position`
        :return: The size of the specified margin
        :rtype: float
        )r   )r    r/   s     r#   margin_sizezPanelsManager.margin_size  s     !!(++r4   c                 l   d}| j                  t        j                  j                        D ]6  }|j	                         s|j                         }||j                         z  }8 d}| j                  t        j                  j                        D ]6  }|j	                         s|j                         }||j                         z  }8 d}| j                  t        j                  j                        D ]6  }|j	                         s|j                         }||j                         z  }8 d}| j                  t        j                  j                        D ]6  }|j	                         s|j                         }||j                         z  }8 ||||f\  | _        | _        | _        | _        ||||fS )zCompute panel zone sizes.r   )rX   r   r   r   rm   ro   rj   r   r   rk   r   r   r   r   r   )r    r&   r1   r|   r'   r(   r%   s          r#   ri   z"PanelsManager._compute_zones_sizes  s    ))%..*=*=> 	&E??$(IIOO%%D		& ))%..*>*>? 	'E??$(IY__&&E		' ))%..*<*<= 	&E??$(I9##%%C		& ))%..*?*?@ 	)E??$(Ii&&((F		) uf<&8	4:t{DLtUC''r4   )F)rG   
__module____qualname____doc__r   r   r   r   r3   r<   rE   r6   rS   rU   rX   r]   r[   r   r   r   r   ri   __classcell__)r"   s   @r#   r   r   !   st    /( (-~~':': 2B&&$10;)z&&,E6 $)>>#6#6 	, (r4   r   )r   loggingspyder.api.managerr   spyder.api.panelr   spyder.py3compatr   	getLoggerrG   r*   r    r4   r#   <module>r      s<   	  ' " + 
		8	$Z(G Z(r4   