
    G@d,                     r    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dS )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           
      f   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                   d S # t,          $ r5 |                                j                            | j                   Y d S 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     Dlib/python3.11/site-packages/spyder/plugins/editor/panels/manager.pyr   zPanelsManager.__init__&   s   mT""++F333"*)>@@	@DJ@t|NNN "N!2N#R
	/$,,T-JKKK ((66666 	/ 	/ 	/OO/77-/ / / / / /	/s   1>C1 1;D0/D0c           
          |J t           j        j        dt           j        j        dt           j        j        dt           j        j        dt           j        j        di}t                              d|j	        d||                    t          | j        |                   |_        || j        |         |j	        <   ||_        |                    | j                   t                              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
        N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        N!8NN 'NN#Z
 	


0=h0G0GI 	J 	J 	J!$,x"899-2Xuz*!%%%)EJ6777    c                 6   t                               d|z             |                     |          }|                                 |                                 |                    d           | 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   s     	(=8999''

|EN+//
DAAAr4   c                 d   t          d          D ]}t          | j        |                   rt          t	          | j        |                                                             d         }|                     |          }|                    d           t          | j        |                   dS )z'Removes all panels from the CodeEditor.   r   N)ranger-   r   sortedlistkeysr<   r9   )r    ikeyr1   s       r#   clearzPanelsManager.cleara   s    q 	& 	&Adl1o&& &T$,q/"6"6"8"899::1=C((%%% dl1o&& &	& 	&r4   c                     t          |          s|j        }t          d          D ])}	 | j        |         |         }|c S # t          $ r Y &w xY wt	          |          )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   s     m,, 	3)2M!HH 	 	DT*=9      }%%%s   A  
AAc                     g }| j                                         D ]4\  }}|                                D ]\  }}|                    |           5t          |          S N)r   itemsappenditerr    lst__	zone_dictr1   s        r#   __iter__zPanelsManager.__iter__{   sk    !\//11 	" 	"MB	&__.. " "	E

5!!!!"Cyyr4   c                     g }| j                                         D ]4\  }}|                                D ]\  }}|                    |           5t          |          S rK   )r   rL   rM   r-   rO   s        r#   __len__zPanelsManager.__len__   sj    !\//11 	" 	"MB	&__.. " "	E

5!!!!"3xxr4   c                 Z    t          | 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%     DL&--//000r4   c                     |                                   |                     | j                                        dd           dS )z8Refreshes the editor panels (resize and update margins).r   T)force_update_marginsN)resizer   r!   contentsRect)r    s    r#   refreshzPanelsManager.refresh   sI    T[--//*. 	 	0 	0 	0 	0 	0r4   c                 t	   | j                                         }| j                                                                         }|                                 \  }}}}||z   }||z   }|                                |                                |z   z
  }	|                                |                                |z   z
  }
d}|                     t          j        j	                  }|
                    d d           |D ]}|                                s|                                 |                                }|                    |                                |z   |                                |z   |                                |                                |z
  |z
  |
z
             ||                                z  }d}|                     t          j        j                  }|
                    d d           |D ]}|                                s|                                }|                    |                                |z
  |                                z
  |	z
  |                                |z   |                                |                                |z
  |z
  |
z
             ||                                z  }d}|                     t          j        j                  }|
                    d            |D ]}|                                s|                                }|                    |                                |                                |z   |                                |	z
  |                                           ||                                z  }d}|                     t          j        j                  }|
                    d            |D ]}|                                s|                                }|                    |                                |                                |z
  |                                z
  |
z
  |                                |	z
  |                                           ||                                z  }d	S )
zResizes panels.r   c                     | j         S rK   r.   r1   s    r#   <lambda>z&PanelsManager.resize.<locals>.<lambda>   	    e&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   sY   ((**[))++88::
+/+D+D+F+F(&'5g;;==J$4$4$6$6$;<<<>>Z%6%6%8%82%=>%%en&9::994HHH 		& 		&E??$$ ((IejjllT1#iikkE1'oo//#llnnx7%?(JL L L IOO%%%DD%%en&:;;994HHH 		' 		'E??$$ ((I%	(9(99HD		e#!!)E1H<	> > >
 Y__&&&EE%%en&89999::: 	& 	&E??$$ ((Iejjll#iikkC/#kkmmh6'..002 2 2 9##%%%CC%%en&;<<99::: 		) 		)E??$$ ((I

')*:*:*<*<<xG(  ""	$ $ $
 i&&(((FF		) 		)r4   c                     | j                                         }|                     t          j        j                  }|D ],}|                                s|                    |           -dS )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   sr    ((**%%en&=>> 	& 	&E??$$ u%%%%	& 	&r4   Fc           	         | sdS | j                                         \  }}| j        \  }}| j                                        D ]\  }}	|t
          j        j        k    s|t
          j        j        k    r0t          |	
                                          }
|
D ]}|j        r|r|                    d|           ||k    s||k    s|j        rN|                    d|                                |                                |                                           ||f| _        |                    | j                                                                                   s|r|                                  |                                  dS )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   s    	FK6688	c-t"l0022 		L 		LNHd5>---5>000$++--((F L L# - -LLG,,,5==C4KK53CKLLDFFHHekkmmT[[]]KKK	L
 #')MM$+..00557788 	,$	,))+++##%%%%%r4   c                    d}d}d}d}|                      t          j        j                  D ]A}|                                r+|                                                                }||z  }B|                      t          j        j                  D ]A}|                                r+|                                                                }||z  }B|                      t          j        j                  D ]A}|                                r+|                                	                                }||z  }B|                      t          j        j
                  D ]A}|                                r+|                                	                                }||z  }B||||f}|| j        k    r&|| _        | j                            ||||           dS dS )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0))%.*>?? 	 	E   ((..00))%.*<== 	 	E   ))0022v))%.*?@@ 	! 	!E   !))0022& uf-t)))!)DK**4eVDDDD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                    d}|                      t          j        j                  D ]B}|                                s|                                }||                                z  }Cd}|                      t          j        j                  D ]B}|                                s|                                }||                                z  }Cd}|                      t          j        j                  D ]B}|                                s|                                }||	                                z  }Cd}|                      t          j        j
                  D ]B}|                                s|                                }||	                                z  }C||||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%%%DD))%.*>?? 	' 	'E??$$ ((IY__&&&EE))%.*<== 	& 	&E??$$ ((I9##%%%CC))%.*?@@ 	) 	)E??$$ ((Ii&&(((FF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   !   s>        / / / / /( (-~':    2B B B& & && & &$    1 1 10 0 0;) ;) ;)z& & && & & &,E E E6 $)>#6 	, 	, 	, 	, (  (  (  (  (  (  (r4   r   )r   loggingspyder.api.managerr   spyder.api.panelr   spyder.py3compatr   	getLoggerrG   r*   r    r4   r#   <module>r      s   	 	  ' & & & & & " " " " " " + + + + + + 
	8	$	$Z( Z( Z( Z( Z(G Z( Z( Z( Z( Z(r4   