
    G@d;                         d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	m
Z
mZ ddl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 G d de          ZdS )z,
This module contains the Scroll Flag panel
    N)ceil)QSizeQtQTimer)QPainterQColorQCursor)QStyleQStyleOptionSliderQApplication)Panel)DiagnosticSeverity)is_block_safei  c                        e Zd ZdZej        dk    rdndZdZdZd Z	 fdZ
ed	             Z fd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z# xZ$S )!ScrollFlagAreaz%Source code editor's scroll flag areadarwin            c                 `   t          j        |            |                     t          j                   d| _        |                     d           d| _        d| _        d| _	        t          t          j                  | _        | j                            d           t          t          j                  | _        | j                            d           t          |           | _        | j                            d           | j        j                            | j                   i | _        d S )NTFg333333?      ?)r   __init__setAttributer   WA_OpaquePaintEvent
scrollablesetMouseTracking_unit_testing_range_indicator_is_visible_alt_key_is_downr   gray_slider_range_color	setAlphaF_slider_range_brushr   _update_list_timersetSingleShottimeoutconnectupdate_flags_dict_flag_listselfs    Glib/python3.11/site-packages/spyder/plugins/editor/panels/scrollflag.pyr   zScrollFlagArea.__init__%   s    t"0111d### #+0( %#)"'??  **3///#)"'??  **2..."(,,--d333'//0ABBB  "    c                 ~   t                                          |           t          |j                  t          |j                  t          |j                  t          |j                  t          |j                  t          |j                  d| _	        d | j	        
                                D             | _        |j                            | j                   |j                            | j                   |j                            | j                   |j                            | j                   |j                            | j                   |j                            | j                   |j                            | j                   |j                            | j                   dS )z"Manages install setup of the pane.)warningerrortodo
breakpoint
occurrencefound_resultsc                 @    i | ]\  }}||                     d           S )x   )darker).0keycolors      r-   
<dictcomp>z-ScrollFlagArea.on_install.<locals>.<dictcomp>I   s@     D D D&C  c!2!2 D D Dr.   N)super
on_installr   warning_colorerror_color
todo_colorbreakpoint_coloroccurrence_colorfound_results_color_facecolorsitems_edgecolorssig_focus_changedr(   updatesig_key_pressedkeyPressEventsig_key_releasedkeyReleaseEventsig_alt_left_mouse_pressedmousePressEventsig_alt_mouse_movedmouseMoveEventsig_leave_outsig_flags_changeddelayed_update_flagssig_theme_colors_changedupdate_flag_colors)r,   editor	__class__s     r-   r>   zScrollFlagArea.on_install<   s   6""" f233F.//6,-- !899 !899#F$>?? D D*.*:*@*@*B*BD D D 	 ((555&&t'9:::''(<===)11$2FGGG"**4+>???$$T[111 (()BCCC'//0GHHHHHr.   c                 X    | j                                                                         S )z>This property holds whether the vertical scrollbar is visible.)rW   verticalScrollBar	isVisibler+   s    r-   sliderzScrollFlagArea.sliderV   s$     {,,..88:::r.   c                 |    | j                                          t                                          |           d S )N)r%   stopr=   
closeEvent)r,   eventrX   s     r-   r_   zScrollFlagArea.closeEvent[   s6    $$&&&5!!!!!r.   c                 ,    t          | j        d          S )Override Qt methodr   )r   WIDTHr+   s    r-   sizeHintzScrollFlagArea.sizeHint_   s    TZ###r.   c                     |                                 D ]D\  }}t          |          | j        |<   | j        |                             d          | j        |<   EdS )z
        Update the permanent Qt colors that are used for painting the flags
        and the slider range with the new colors defined in the given dict.
        r7   N)rF   r   rE   r8   rG   )r,   
color_dictnamer;   s       r-   rV   z!ScrollFlagArea.update_flag_colorsc   sj    
 &++-- 	H 	HKD%%+E]]DT"%)%5d%;%B%B3%G%GDT""	H 	Hr.   c                 z    | j                                         rdS | j                             t                     dS )z
        This function is called every time a flag is changed.
        There is no need of updating the flags thousands of time by second,
        as it is quite resources-heavy. This limits the calls to REFRESH_RATE.
        N)r%   isActivestartREFRESH_RATEr+   s    r-   rT   z#ScrollFlagArea.delayed_update_flagsl   s=     "++-- 	F%%l33333r.   c                    g g g g d| _         | j        }|                                                                }|                                r|                                }|re|j        r&|j        D ]\  }}}}|t          j        k    rd} nd}n|j	        rd}n|j
        rd}nd}| | j         |                             |           |                                }|                                |                                  dS )z
        Update flags list.

        This parses the entire file, which can take a lot of time for
        large files. Save all the flags in lists for painting during
        paint events.
        )r1   r0   r2   r3   r1   r0   r2   r3   N)r*   rW   document
firstBlockisValiduserDatacode_analysisr   ERRORr2   r3   appendnextrI   )r,   rW   blockdata_severity	flag_types          r-   r)   zScrollFlagArea.update_flagsw   s3    	 
  
 !!,,..mmoo 	!>>##D B% %-1-? . .)1h#'9'???(/I!E @ %.	Y % &II_ % ,II $I((3::5AAAJJLLE- mmoo 	!0 	r.   c                 	   |                                  }|                                |                                 z  }|                                }t	          | j        dz            }| j        | j        z
  }| j        }t          |           }|	                    |
                                | j        j                   | j        }	|	                                                                                                }
|                     d||          | j        dz  z
  }|                     |
dz   ||          | j        dz  z
  }||z
  }|dk    r	||
z  |z  }nd}|	j        |	j        d}|                    | j                   |D ]}|                    | j        |                    |                    | j        |                    |	                                                                dk    r||         D ]~}t7          |          s|	                    |          }t	          |                                |                                dz  z   |dz  z             }|                    ||||           |
dk    rD||         D ]9}t7          |          st	          |          }|                    ||||           :?t=          ||                   t>          k     rrd}||         D ]g}t7          |          s|                                }||k     r-||dz  z   }||
z  }t	          |||z  z             }|                    ||||           h| j         s!tC          j"                    tF          j$        z  }n| j%        }| j&        r3| '                    tQ                      )                                          }| 
                                *                    |          }|	
                                *                    |	'                    tQ                      )                                                    }|s|rt|rr|                    | j+                   |                    | j,                   | -                    ||||          \  }}}}|                    ||||           d| _.        dS d| _.        dS dS )a  
        Override Qt method.
        Painting the scroll flag area

        There is two cases:
            - The scroll bar is moving, in which case paint all flags.
            - The scroll bar is not moving, only paint flags corresponding
              to visible lines.
        r   r   r   )r4   r5   TFN)/get_scrollbar_groove_rectheightget_scrollbar_value_heightyr   FLAGS_DXrc   FLAGS_DYr   fillRectrectrW   sideareas_colorrm   	lastBlockfirstLineNumbervalue_to_positionoccurrencesr5   rI   r*   setBrushrE   setPenrG   rZ   maximumr   blockBoundingGeometrydrawRectlen	MAX_FLAGSr   r   queryKeyboardModifiersr   AltModifierr    r\   mapFromGlobalr	   poscontainsr"   r$   make_slider_ranger   )r,   r`   groove_rectscale_factoroffsetrect_xrect_wrect_hpainterrW   	last_linefirst_y_pos
last_y_posline_heightflag_height_linesdict_flag_listsry   ru   geometryrect_y	next_line
block_linefracalt
cursor_posis_over_selfis_over_editorxr~   widthr|   s                                  r-   
paintEventzScrollFlagArea.paintEvent   s
    4466 #))++d.M.M.O.OO 
 dma'((dm+ 4..t{'BCCC OO%%//11AACC	 ,,v' ')-):;++O\63 359]Q5FG
 !;.?? & 2[ @ ! !,#1
 
 	t3444( &	I &	IIT-i8999NN4+I6777''))1133q88,Y7 	E 	EE(// ! %;;EBBH! 

 ))A-.
# F
 $$VVVVDDDD	E a,Y7 E EE(// ! !+..F$$VVVVDDDD	E y122Y>> !I!0!; I I,U33 %$%*%:%:%<%<
%	11$$.1BQ1F$F	)I5!%kD;4F&F!G!G((HHHH ! 	(577".HCC'C; 	9++GIIMMOO<<J99;;//
;;L#[[]]33$$WYY]]__557 7N  9 9 9t7888  !9:::&*&<&<fk'C 'C#1eV  Auf5553700038000#	9 	9r.   c                 .    |                                   dS rb   NrI   r,   r`   s     r-   
enterEventzScrollFlagArea.enterEvent      r.   c                 .    |                                   dS r   r   r   s     r-   
leaveEventzScrollFlagArea.leaveEvent  r   r.   c                 .    |                                   dS r   r   r   s     r-   rQ   zScrollFlagArea.mouseMoveEvent#  r   r.   c                 x   | j         r|                                t          j        k    r| j                                        }|                     |                                                                          }|	                    t          ||                                dz  z
                       dS dS dS )rb   r   N)r\   buttonr   
LeftButtonrW   rZ   position_to_valuer   r~   setValueintpageStep)r,   r`   vsbvalues       r-   rO   zScrollFlagArea.mousePressEvent'  s    ; 	65<<>>R]::+//11C**599;;==??;;ELLU3<<>>!#334455555	6 	6::r.   c                     |                                 t          j        k    rd| _        |                                  dS dS )zOverride Qt method.FNr:   r   Key_Altr    rI   r   s     r-   rM   zScrollFlagArea.keyReleaseEvent.  s8    99;;"*$$$)D!KKMMMMM %$r.   c                     |                                 t          j        k    rd| _        |                                  dS dS )rb   TNr   r   s     r-   rK   zScrollFlagArea.keyPressEvent4  s8    99;;"*$$$(D!KKMMMMM %$r.   c                 R    |                                  }|                                S )zt
        Return the vertical offset of the scroll flag area relative to the
        top of the text editor.
        )r{   r~   r,   r   s     r-   get_vertical_offsetz"ScrollFlagArea.get_vertical_offset:  s#    
 4466}}r.   c                     t          j                                                                        t          j                  S )zv
        Return the minimum height of the slider range based on that set for
        the scroll bar's slider.
        )r   instancestylepixelMetricr
   PM_ScrollBarSliderMinr+   s    r-   get_slider_min_heightz$ScrollFlagArea.get_slider_min_heightB  s7    
 $&&,,..::(* * 	*r.   c                     | j                                         }t          j                                                    }t                      }|                    |           |                    t          j	        |t          j
        |           }|S )z4Return the area in which the slider handle may move.)rW   rZ   r   r   r   r   initStyleOptionsubControlRectr
   CC_ScrollBarSC_ScrollBarGroove)r,   r   r   optr   s        r-   r{   z(ScrollFlagArea.get_scrollbar_groove_rectJ  s~    k++--%''--// ""C    **f&?G G r.   c                 l    |                                  }t          |                                          S )z^Return the pixel span height of the scrollbar area in which
        the slider handle may move)r{   floatr|   r   s     r-   get_scrollbar_position_heightz,ScrollFlagArea.get_scrollbar_position_heightW  s/     4466[''))***r.   c                     | j                                         }|                                |                                z
  |                                z   S )z-Return the value span height of the scrollbar)rW   rZ   r   minimumr   )r,   r   s     r-   r}   z)ScrollFlagArea.get_scrollbar_value_height]  s=    k++--{{}}s{{}},s||~~==r.   c                 T    |                                  |                                 z  S )z^Return scrollbar's scale factor:
        ratio between pixel span height and value span height)r   r}   r+   s    r-   get_scale_factorzScrollFlagArea.get_scale_factorb  s,     2244//112 	3r.   c                     | j                                         }t          ||                                z
  |z  |z             S )z#Convert value to position in pixels)rW   rZ   r   r   )r,   r~   r   r   r   s        r-   r   z ScrollFlagArea.value_to_positionh  s:    k++--A%5>???r.   c                     | j                                         }|                                 }|                                t	          d||z
  |                                 z  g          z   S )z#Convert position in pixels to valuer   )rW   rZ   r   r   maxr   )r,   r~   r   r   s       r-   r   z ScrollFlagArea.position_to_valuem  s[    k++--))++{{}}sAF
d6K6K6M6M'M#NOOOOr.   c                    | j                                         }|                     |                                ||          |z
  }t	          ||                                           }|}|                                |z   |z
  }t	          |t          |t          |	                                |dz  z
                                }	d|	| j
        dz
  |fS )zV
        Return the slider x and y positions and the slider width and height.
        r      )rW   rZ   r   r   r   r   r|   minr   r~   rc   )
r,   r   r   r   r   r   slider_heightmin_yposmax_yposslider_ys
             r-   r   z ScrollFlagArea.make_slider_ranges  s     k++--..LLNNL&2 24:;M4+E+E+G+GHH
 %%''&0=@ xX%)*,,..q*H%I%I"K "K L L (DJNM99r.   c                 :    | j                             |           dS r   )rW   
wheelEventr   s     r-   r   zScrollFlagArea.wheelEvent  s    u%%%%%r.   c                 >    || _         |                     |           dS )z"Toggle scroll flag area visibilityN)enabled
setVisible)r,   states     r-   set_enabledzScrollFlagArea.set_enabled  s!    r.   )%__name__
__module____qualname____doc__sysplatformrc   r   r   r   r>   propertyr\   r_   rd   rV   rT   r)   r   r   r   rQ   rO   rM   rK   r   r   r{   r   r}   r   r   r   r   r   r   __classcell__)rX   s   @r-   r   r      s       //,(**BBEHH" " ".I I I I I4 ; ; X;" " " " "$ $ $H H H	4 	4 	4) ) )Vw9 w9 w9r      6 6 6      * * *  + + +> > >
3 3 3@ @ @
P P P: : :2& & &      r.   r   )r   r   mathr   qtpy.QtCorer   r   r   
qtpy.QtGuir   r   r	   qtpy.QtWidgetsr
   r   r   spyder.api.panelr   spyder.plugins.completion.apir   "spyder.plugins.editor.utils.editorr   rk   r   r    r.   r-   <module>r      s   
 


       * ) ) ) ) ) ) ) ) ) 0 0 0 0 0 0 0 0 0 0 E E E E E E E E E E # " " " " " < < < < < < < < < < < <  	t t t t tU t t t t tr.   