
    Je>                         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y)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                 l   t        j                  |        | j                  t        j                         d| _        | j                  d       d| _        d| _        d| _	        t        t        j                        | _        | j                  j                  d       t        t        j                        | _        | j                  j                  d       t        |       | _        | j                   j#                  d       | j                   j$                  j'                  | j(                         i | _        y )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    I/usr/lib/python3/dist-packages/spyder/plugins/editor/panels/scrollflag.pyr   zScrollFlagArea.__init__%   s    t"001d# #+0( %#)"''?   **3/#)"''?   **2."(,--d3''//0A0AB  "    c                    t         |   |       t        |j                        t        |j                        t        |j
                        t        |j                        t        |j                        t        |j                        d| _	        | j                  j                         D ci c]  \  }}||j                  d       c}}| _        |j                  j                  | j                         |j                   j                  | j"                         |j$                  j                  | j&                         |j(                  j                  | j*                         |j,                  j                  | j.                         |j0                  j                  | j                         |j2                  j                  | j4                         |j6                  j                  | j8                         yc c}}w )z"Manages install setup of the pane.)warningerrortodo
breakpoint
occurrencefound_resultsx   N)super
on_installr   warning_colorerror_color
todo_colorbreakpoint_coloroccurrence_colorfound_results_color_facecolorsitemsdarker_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keycolor	__class__s       r-   r8   zScrollFlagArea.on_install<   s   6" f223F../6,,- !8!89 !8!89#F$>$>? +/*:*:*@*@*BD&C  c!22 D 	  ((5&&t'9'9:''(<(<=))11$2F2FG""**4+>+>?$$T[[1  (()B)BC''//0G0GHDs   .G<c                 R    | j                   j                         j                         S )z>This property holds whether the vertical scrollbar is visible.)rR   verticalScrollBar	isVisibler+   s    r-   sliderzScrollFlagArea.sliderV   s      {{,,.88::r.   c                 X    | j                   j                          t        |   |       y )N)r%   stopr7   
closeEvent)r,   eventrU   s     r-   r\   zScrollFlagArea.closeEvent[   s"    $$&5!r.   c                 .    t        | j                  d      S )Override Qt methodr   )r   WIDTHr+   s    r-   sizeHintzScrollFlagArea.sizeHint_   s    TZZ##r.   c                     |j                         D ]H  \  }}t        |      | j                  |<   | j                  |   j                  d      | j                  |<   J y)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.
        r6   N)r@   r   r?   rA   rB   )r,   
color_dictnamerT   s       r-   rQ   z!ScrollFlagArea.update_flag_colorsc   s\    
 &++- 	HKD%%+E]DT"%)%5%5d%;%B%B3%GDT"	Hr.   c                 x    | j                   j                         ry| j                   j                  t               y)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-   rO   z#ScrollFlagArea.delayed_update_flagsl   s-     ""++-%%l3r.   c                    g g g g d| _         | j                  }|j                         j                         }|j	                         r|j                         }|r||j                  r0|j                  D ]  \  }}}}|t        j                  k(  sd} n$ d}n |j                  rd}n|j                  rd}nd}|| j                   |   j                  |       |j                         }|j	                         r| j                          y)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*   rR   document
firstBlockisValiduserDatacode_analysisr   ERRORr2   r3   appendnextrD   )r,   rR   blockdata_severity	flag_types          r-   r)   zScrollFlagArea.update_flagsw   s     	 
 !,,.mmo>>#D%%-1-?-? .)1h#'9'?'??(/I!.
 %.	YY &I__ ,I $I(((3::5AJJLE- mmo0 	r.   c                 ,	   | j                         }	 |j                         | j                         z  }|j	                         }t        | j                  dz        }| j                  | j                  z
  }| j                  }t        |       }|j                  |j                         | j                  j                         | j                  }	|	j                         j                         j!                         }
| j#                  d||      | j                  dz  z
  }| j#                  |
dz   ||      | j                  dz  z
  }||z
  }|dkD  r	||
z  |z  }nd}|	j$                  |	j&                  d}|j)                  | j*                         t,        j.                  dd dkD  rt1        |      }n|}|D ]  }|j3                  | j4                  |          |j7                  | j8                  |          |	j;                         j=                         dk(  ro||   D ]f  }t?        |      s|	jA                  |      }t        |j	                         |j                         dz  z   |dz  z         }|jC                  ||||       h |
dk(  r7||   D ]-  }t?        |      st        |      }|jC                  ||||       / tE        ||         tF        k  s#d}||   D ]V  }t?        |      s|j!                         }||k  r%||dz  z   }||
z  }t        |||z  z         }|jC                  ||||       X  | jH                  s&tK        jL                         tN        jP                  z  }n| jR                  }| jT                  r| jW                  tY               j[                               }| j                         j]                  |      }|	j                         j]                  |	jW                  tY               j[                                     }|s|rm|rk|j7                  | j^                         |j3                  | j`                         | jc                  ||||      \  }}}}|jC                  ||||       d| _2        yd	| _2        yy# t        $ r d}Y _w xY w)
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   N)      TF)3get_scrollbar_groove_rectheightget_scrollbar_value_heightZeroDivisionErroryr   FLAGS_DXr`   FLAGS_DYr   fillRectrectrR   sideareas_colorrj   	lastBlockfirstLineNumbervalue_to_positionoccurrencesr5   rD   r*   sysversion_inforeversedsetBrushr?   setPenrB   rW   maximumr   blockBoundingGeometrydrawRectlen	MAX_FLAGSr   r   queryKeyboardModifiersr   AltModifierr    rY   mapFromGlobalr	   poscontainsr"   r$   make_slider_ranger   ) r,   r]   groove_rectscale_factoroffsetrect_xrect_wrect_hpainterrR   	last_linefirst_y_pos
last_y_posline_heightflag_height_linesdict_flag_listsdict_flag_lists_iterrv   rr   geometryrect_y	next_line
block_linefracalt
cursor_posis_over_selfis_over_editorxr   widthr|   s                                    r-   
paintEventzScrollFlagArea.paintEvent   sw    446
	 ""$t'F'F'HH  
 dmma'(dmm+ 4.t{{'B'BC OO%//1AAC	 ,,v')-):;++O\6359]]Q5FG
 !;.? & 2[ @ ! !,,#11
 	t334 BQ&( $,O#< #2 - &	IIT--i89NN4++I67'')113q8,Y7 	EE(/ %;;EBH! 

 )A-.
#F
 $$VVVVD	E a,Y7 EE(/ !+.F$$VVVVD	E y12Y> !I!0!; I,U3$%*%:%:%<
%	1$$.1BQ1F$F	)I5!%kD;4F&F!G((HI7&	IR !!557"..HC''C;;++GIMMO<J99;//
;L#[[]33$$WY]]_57N t778  !9!9:&*&<&<fk'C#1eV  Auf5370380# I ! 	L	s   !R RRc                 $    | j                          yr_   NrD   r,   r]   s     r-   
enterEventzScrollFlagArea.enterEvent/      r.   c                 $    | j                          yr   r   r   s     r-   
leaveEventzScrollFlagArea.leaveEvent3  r   r.   c                 $    | j                          yr   r   r   s     r-   rL   zScrollFlagArea.mouseMoveEvent7  r   r.   c                 L   | j                   r|j                         t        j                  k(  rv| j                  j                         }| j                  |j                         j                               }|j                  t        ||j                         dz  z
               yyy)r_   r   N)rY   buttonr   
LeftButtonrR   rW   position_to_valuer   r   setValueintpageStep)r,   r]   vsbvalues       r-   rJ   zScrollFlagArea.mousePressEvent;  sp    ;;5<<>R]]:++//1C**599;==?;ELLU3<<>!#3345 ;;r.   c                 v    |j                         t        j                  k(  rd| _        | j	                          yy)zOverride Qt method.FNrS   r   Key_Altr    rD   r   s     r-   rH   zScrollFlagArea.keyReleaseEventB  s*    99;"**$$)D!KKM %r.   c                 v    |j                         t        j                  k(  rd| _        | j	                          yy)r_   TNr   r   s     r-   rF   zScrollFlagArea.keyPressEventH  s*    99;"**$$(D!KKM %r.   c                 B    | j                         }|j                         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_offsetN  s    
 446}}r.   c                     t        j                         j                         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_heightV  s2    
 $$&,,.::((* 	*r.   c                    | j                   j                         }t        j                         j	                         }t               }|j                  |       |j                  t        j                  |t        j                  |       }|S )z4Return the area in which the slider handle may move.)rR   rW   r   r   r   r   initStyleOptionsubControlRectr
   CC_ScrollBarSC_ScrollBarGroove)r,   r   r   optr   s        r-   r{   z(ScrollFlagArea.get_scrollbar_groove_rect^  sq    kk++-%%'--/ "C  **f&?&?G r.   c                 T    | j                         }t        |j                               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_heightk  s&     446['')**r.   c                     | j                   j                         }|j                         |j                         z
  |j	                         z   S )z-Return the value span height of the scrollbar)rR   rW   r   minimumr   )r,   r   s     r-   r}   z)ScrollFlagArea.get_scrollbar_value_heightq  s6    kk++-{{}s{{},s||~==r.   c                 D    | j                         | j                         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_factorv  s&     224//12 	3r.   c                 z    | j                   j                         }t        ||j                         z
  |z  |z         S )z#Convert value to position in pixels)rR   rW   r   r   )r,   r   r   r   r   s        r-   r   z ScrollFlagArea.value_to_position|  s4    kk++-A%5>??r.   c                     | j                   j                         }| j                         }|j                         t	        d||z
  | j                         z  g      z   S )z#Convert position in pixels to valuer   )rR   rW   r   r   maxr   )r,   r   r   r   s       r-   r   z ScrollFlagArea.position_to_value  sO    kk++-))+{{}sAF
d6K6K6M'M#NOOOr.   c                 n   | j                   j                         }| j                  |j                         ||      |z
  }t	        || j                               }|}|j                         |z   |z
  }t	        |t        |t        |j                         |dz  z
                    }	d|	| j                  dz
  |fS )zV
        Return the slider x and y positions and the slider width and height.
        r   rx   )rR   rW   r   r   r   r   r|   minr   r   r`   )
r,   r   r   r   r   r   slider_heightmin_yposmax_yposslider_ys
             r-   r   z ScrollFlagArea.make_slider_range  s     kk++-..LLNL&24:;M4+E+E+GH
 %%'&0=@ xX%)*,,.q*H%I"K L (DJJNM99r.   c                 :    | j                   j                  |       yr   )rR   
wheelEventr   s     r-   r   zScrollFlagArea.wheelEvent  s    u%r.   c                 4    || _         | j                  |       y)z"Toggle scroll flag area visibilityN)enabled
setVisible)r,   states     r-   set_enabledzScrollFlagArea.set_enabled  s    r.   )%__name__
__module____qualname____doc__r   platformr`   r   r   r   r8   propertyrY   r\   ra   rQ   rO   r)   r   r   r   rL   rJ   rH   rF   r   r   r{   r   r}   r   r   r   r   r   r   __classcell__)rU   s   @r-   r   r      s    /,,(*BEHH".I4 ; ;"$H	4)VK9Z6*+>
3@
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   rh   r   r    r.   r-   <module>r      sM   
   * ) 0 0 E E # < <  	HU Hr.   