
    JeG.                         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 ddlmZ ddlmZ ddlmZ  G d	 d
e      Zy)z,
This module contains the Line Number panel
    )ceilN)QSizeQtQPointF)QColorQFontMetricsFQPainterQStaticTextQTextOption)ima)Panel)DiagnosticSeverityc                        e 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 fdZ fdZd ZddZd Zd Z xZS )LineNumberAreaz=Line number area (on the left side of the text editor widget)c                    t        j                  |        | j                  d       d| _        t	        t
        j                        | _        d| _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _        d| _        d| _        d| _        d | _        d | _        d | _        d | _        y )NTerrorwarninginformationhinttodo)r   __init__setMouseTracking
scrollabler   r   darkGraylinenumbers_color_markers_marginr   icon
error_iconwarning_icon	info_icon	hint_icon	todo_icon_margin_pressed	_released_width_cache_static_line_numbers_static_active_line_static_text_dpiselfs    I/usr/lib/python3/dist-packages/spyder/plugins/editor/panels/linenumber.pyr   zLineNumberArea.__init__!   s    td#!'!4  $ ((7+HHY/-0&)&)  ! %)!#'  !%    c                 6    t        | j                         d      S )Override Qt method.r   )r   compute_widthr+   s    r-   sizeHintzLineNumberArea.sizeHintA   s    T'')1--r.   c                 \   t        |       j                  |j                         | j                  j                         | j                  j                         j                         fd}| j                         dz
  }t        ||      }| j                  r| j                  j                         }t        |      }|j                         dk(  r=| j                  j                         t        j                  k(  r| j!                         n| j#                         | j                  j$                  D ]r  \  }}}	|	j'                         }
| j(                  s%|
s(|
j*                  rd}d}d}d}|
j*                  D ]_  \  }}}}||t,        j.                  k(  z  }||t,        j0                  k(  z  }||t,        j2                  k(  z  }||t,        j4                  k(  z  }a |r$ |d|| j6                  j9                  |             nq|r$ |d|| j:                  j9                  |             nK|r$ |d|| j<                  j9                  |             n%|r# |d|| j>                  j9                  |             |
j@                  sP |d|| jB                  j9                  |             u y)z?Override Qt method.

        Painting line number area
        c                     |j                         |j                         z  }j                  | t        ||z
  dz  z         |       y )N   )heightdevicePixelRatio
drawPixmapr   )xleftytoppixmappixmap_heightfont_heightpainters       r-   draw_pixmapz.LineNumberArea.paintEvent.<locals>.draw_pixmapN   sG    "MMOf.E.E.GGMT[6!;;<r.   r5   r      N)"r	   fillRectrecteditorsideareas_colorfontMetricsr6   get_markers_marginr   r$   fontr   leadinglineWrapModer   NoWrapdraw_linenumbersdraw_linenumbers_slowvisible_blocksuserDatar   code_analysisr   ERRORWARNINGINFORMATIONHINTr   r;   r    r!   r"   r   r#   )r,   eventr?   size	icon_sizerG   fmtopline_numberblockdataerrorswarningsinfoshints_sevr=   r>   s                    @@r-   
paintEventzLineNumberArea.paintEventE   sH   
 4.t{{'B'BCkk--/668	 &&(1,$%	<<;;##%Dt$B

!KK,,.+2D2DD%%g. **73'+{{'A'A 	J#Ce>>#D##%%F HEE(,(:(: @1c1#);)A)A"AA C+=+E+E$EE(:(F(F!FF(:(?(?!??	@ #AsDOO,B,B9,MN!#sD$5$5$<$<Y$GI#AsDNN,A,A),LM#AsDNN,A,A),LM993(=(=i(HI3	Jr.   c           	         t        | j                  j                        dk(  ry| j                  j                         j	                         dz   }| j                         }| j                         }| j                  j                  D cg c]  \  }}}|
 }}}	 |j                  |      }| j                  j                  |   d   }	|D cg c]	  }|| d }
}dj                  |
      j                  dd      }| j                  j                         }|j                  |j                         |j                  |       |j                  | j                          | j#                         | j$                  k7  r#| j#                         | _        d| _        d| _        | j&                  r9|| j&                  j+                         k7  rH| j&                  j-                  |       n,t/        |      | _        | j&                  j1                  |       | j                  j                  d   d   }|| j&                  j3                         j                         z
  }|j5                  t7        ||      | j&                         |	|j                  |j8                         |j                  |       |j                  | j                  j:                         t=        |      }| j(                  r9|| j(                  j+                         k7  rq| j(                  j-                  |       nUt/        |      | _        | j(                  j?                  t@        jB                         | j(                  j1                  |       | j(                  j3                         }||j                         z
  }|jE                  tG        |      |	tG        |j                               tG        |jI                               | j                  jJ                         |j5                  t7        ||	      | j(                         yyc c}}w # t        $ r d}	Y vw xY wc c}w )	zDraw line numbers.r   Nr@   dz<br> z&nbsp;)rG   )&lenrC   rM   
textCursorblockNumbercompute_width_digitswidthindex
ValueErrorjoinreplacerG   	setWeightNormalsetFontsetPenr   logicalDpiXr*   r(   r)   textsetTextr
   preparerU   drawStaticTextr   Boldnormal_colorstrsetTextFormatr   	PlainTextrA   intr6   rD   )r,   r>   active_line_numbernumber_digitsrj   r`   lnvisible_linesidx
active_topline_numberslinesrG   rX   leftrt   rU   s                    r-   rK   zLineNumberArea.draw_linenumbers   sz   t{{))*a/![[335AACaG113

,0KK,F,FG2qGG	%%&89C33C8;J
 <IIR2}oQ./0II L)11#x@
 {{!t{{#t--.!6!66$($4$4$6D!(,D%'+D$$$116688))11%8(3E(:D%%%--4-8kk((+A.t00557==??D# 9 9	; !NN499%OOD!NN4;;334)*D''43388::,,44T:+6t+<(((66r||D((00d0;++002D4::<'D D	:s4::<'8#dkkm:L++ ""j)4+C+CE1 "Q H
  	J	 Js   P(-P. 
Q .P=<P=c                 @   | j                   j                         }| j                   j                         j                         }| j                   j	                         j                         }|j                         dz   }| j                   j                  D ]  \  }}}| j                  s||k(  rR|j                  |j                         |j                  |       |j                  | j                   j                         nG|j                  |j                         |j                  |       |j                  | j                         |j!                  d|| j#                         |t%        t&        j(                  t&        j*                  z        t-        |             
 y)z
        Slower way (2x) to draw line numbers.

        This is necessary for some fonts and when the wrap lines option
        is active.
        r@   r   N)rC   rG   rE   r6   rg   rZ   rh   rM   r$   ro   rx   rq   rr   ry   rp   r   drawTextrj   r}   r   
AlignRightAlignBottomrz   )	r,   r>   rG   r=   active_blockr~   rX   rY   rZ   s	            r-   rL   z$LineNumberArea.draw_linenumbers_slow   s*    {{!kk--/668{{--/557)557!;'+{{'A'A 	3#Ce||"44NN499-OOD)NN4;;#;#;<NN4;;/OOD)NN4#9#9:  C!,!$R]]R^^%C!D!$[!13	3r.   c                 8    | j                   j                          yr0   N)rC   hide_tooltipr,   rT   s     r-   
leaveEventzLineNumberArea.leaveEvent   s      "r.   c                    | j                   j                  |      }| j                   j                         j                  |dz
        }|j	                         }| j
                  dk(  }|r+|j                  r|r| j                   j                  ||       n| j                   j                          |j                         t        j                  k(  r8|| _        | j                   j                  | j                  | j
                         yy)z^Override Qt method.

        Show code analisis, if left button pressed select lines.
        r@   r   N)rC   get_linenumber_from_mouse_eventdocumentfindBlockByNumberrN   r&   rO   show_code_analysis_resultsr   buttonsr   
LeftButtonselect_linesr%   )r,   rT   rY   rZ   r[   checks         r-   mouseMoveEventzLineNumberArea.mouseMoveEvent   s    
 kkAA%H$$&88QG~~ "$D&&5KK22;379 KK$$&==?bmm+(DNKK$$T]]DNNC ,r.   c                     | j                   j                  |      }|| _        || _        | j                   j	                  | j                  | j                         y)zFOverride Qt method

        Select line, and starts selection
        N)rC   r   r%   r&   r   )r,   rT   rY   s      r-   mousePressEventzLineNumberArea.mousePressEvent  sE    
 kkAA%H#$  !%	1r.   c                      d| _         d| _        y)r0   r   N)r&   r%   r   s     r-   mouseReleaseEventz LineNumberArea.mouseReleaseEvent  s    r.   c                 :    | j                   j                  |       yr   )rC   
wheelEventr   s     r-   r   zLineNumberArea.wheelEvent  s    u%r.   c           	          | j                   j                         }t        dt        j                  t        j
                  |dz                     S )z4Compute and return line number area width in digits.r@   )rC   
blockCountmaxmathr   log10)r,   number_liness     r-   ri   z#LineNumberArea.compute_width_digits  sA    {{--/1dii

A!   ! 	!r.   c                 N   | j                   sy| j                         }| j                  !| j                  d   |k(  r| j                  d   S | j                  r0d| j                  j                         j                  d|z        z   }nd}|| j                         z   }||f| _        |S )z*Compute and return line number area width.r   r@      9)_enabledri   r'   r$   rC   rE   rj   rF   )r,   r   marginrj   s       r-   r1   zLineNumberArea.compute_width  s    }}113)!!!$5$$Q''<<00288}9LMMFF0022*E2r.   c                     d| _         y)zClear width cache.N)r'   r+   s    r-   _clear_width_cachez!LineNumberArea._clear_width_cache0  s
     r.   c                 v    t         t        |   |       |j                  j	                  | j
                         y)z!Clear width cache on font change.N)superr   
on_installsig_font_changedconnectr   )r,   rC   	__class__s     r-   r   zLineNumberArea.on_install4  s,    nd.v6''(?(?@r.   c                     | j                   j                  j                  | j                         t        t
        |           y)zDisconnect signal.N)rC   r   
disconnectr   r   r   on_uninstall)r,   r   s    r-   r   zLineNumberArea.on_uninstall9  s.    $$//0G0GHnd02r.   c                 v    | j                   r-| j                  j                         j                         dz   }|S y)zGet marker margins.r5   r   )r   rC   rE   r6   )r,   r=   s     r-   rF   z!LineNumberArea.get_markers_margin>  s4    ++113::<q@Kr.   c                 X    d| _         || _        || _        | j                  |xs |       y)zY
        Setup margin settings
        (except font, now set in editor.set_font)
        N)r'   r$   r   set_enabled)r,   linenumbersmarkerss      r-   setup_marginszLineNumberArea.setup_marginsF  s.    
 !"&/0r.   c                 4    || _         | j                  |       y )N)r   
setVisible)r,   states     r-   r   zLineNumberArea.set_enabledP  s    r.   c                 >    | j                         j                         S )z%Return current line number area width)contentsRectrj   r+   s    r-   	get_widthzLineNumberArea.get_widthT  s      "((**r.   )TT)__name__
__module____qualname____doc__r   r2   rb   rK   rL   r   r   r   r   r   ri   r1   r   r   r   rF   r   r   r   __classcell__)r   s   @r-   r   r      sm    G
%@.;JzIEV36#D,	1
&!"!A
3
1+r.   r   )r   r   r   qtpy.QtCorer   r   r   
qtpy.QtGuir   r   r	   r
   r   spyder.utils.icon_managerr   spyder.api.panelr   spyder.plugins.completion.apir   r    r.   r-   <module>r      s=   
   + * 
 * " <{+U {+r.   