
    eQ                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlZd dlmZmZmZmZ  ej&                         Zej*                  j-                  ej*                  j/                  e            Zej*                  j3                  d e       d dlZd dlZej:                  Zej<                  Zej>                  Zej@                  Z ejB                  Z!ddZ" G d d      Z# G d	 d
      Z$ e"e#jJ                  d       e"e#jL                  d       e"e#jN                         e"e#jP                  d       e"e#jR                         e"e#jT                         e"e#jV                  d       e"e#jJ                  d       e"e#jX                        d	Z- e"e$jJ                  d       e"e$jL                  d       e"e$jN                         e"e$jP                  d       e"e$jR                         e"e$jT                         e"e$jV                  d       e"e$jJ                  d       e"e$jX                        d	Z. G d de!      Z/d Z0 G d dejb                        Z2d Z3e4dk(  r e3        yy)    N)	Namespace)OrderedDict)	lru_cache)QT_LIBQtCoreQtGui	QtWidgetsc                 J   t         j                  j                  |       }t               }|j	                  |       d|v r)|j                  t        j                  j                         d|v r|j                  d       |$|j                  t        j                  |             |S )z=
    Return a QTextCharFormat with the given attributes.
    bolditalicT)pg	functionsmkColorQTextCharFormatsetForegroundsetFontWeightQFontWeightBoldsetFontItalicsetBackground)colorstyle
background_color_formats        ?/usr/lib/python3/dist-packages/pyqtgraph/examples/ExampleApp.py
charFormatr   !   s     \\!!%(FG&!ell//05d#bjj45N    c                   X    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dZdZdZdZdZy)LightThemeColorsz#B71C1Cz#FCE4ECz#4A148Cz#311B92z#1A237Ez#0D47A1z#01579Bz#006064z#004D40z#1B5E20z#33691Ez#827717z#F57F17z#FF6F00z#E65100z#BF360Cz#3E2723z#212121z#263238N__name__
__module____qualname__RedPinkPurple
DeepPurpleIndigoBlue	LightBlueCyanTealGreen
LightGreenLimeYellowAmberOrange
DeepOrangeBrownGreyBlueGrey r   r   r!   r!   3   a    
CDFJFDIDDEJDFEFJEDHr   r!   c                   X    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dZdZdZdZdZy)DarkThemeColorsz#F44336z#F48FB1z#CE93D8z#B39DDBz#9FA8DAz#90CAF9z#81D4FAz#80DEEAz#80CBC4z#A5D6A7z#C5E1A5z#E6EE9Cz#FFF59Dz#FFE082z#FFCC80z#FFAB91z#BCAAA4z#EEEEEEz#B0BEC5Nr"   r9   r   r   r<   r<   J   r:   r   r<   r   r   )	keywordoperatorbracedefclassstringstring2commentselfnumbersc                   l     e Zd ZdZej
                  Zg dZg dZ fdZ	e
d        Zd Zd Zd Z xZS )	PythonHighlighterz0Syntax highlighter for the Python language.
    )=z==z!=<z<=>z>=z\+-z\*/z//%z\*\*z\+=z-=z\*=z/=z\%=z\^z\|&~z>>z<<)z\{z\}z\(z\)z\[z\]c                    t         |   |       t        d      ddf| _        t        d      ddf| _        g }|t
        j                  D cg c]
  }d|z  ddf c}z  }|t
        j                  D cg c]  }|dd	f	 c}z  }|t
        j                  D cg c]  }|dd
f	 c}z  }|g dz  }|| _	        d | _
        y c c}w c c}w c c}w )Nz'''   rB   z"""   z\b%s\br   r=   r>   r?   )	)z\bself\br   rD   )z\bdef\b\s*(\w+)rQ   r@   )z\bclass\b\s*(\w+)rQ   r@   )z\b[+-]?[0-9]+[lL]?\br   rE   )z\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\br   rE   )z0\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\br   rE   )z"[^"\\]*(\\.[^"\\]*)*"r   rA   )z'[^'\\]*(\\.[^'\\]*)*'r   rA   )z#[^\n]*r   rC   )super__init__QRegularExpression
tri_single
tri_doublerG   keywords	operatorsbracesrules
searchText)rD   documentr[   wob	__class__s         r   rT   zPythonHighlighter.__init__   s    " .e4aC-e4aC 	,557 q=!Y/ 7 	7,668 a$ 8 	8,335 a/ 5 	5 	 
 	
, 
?785s   B>3CCc                 x    t         j                  j                         }|j                  d      rt        S t
        S )NdarkMode)r	   QApplicationinstancepropertyDARK_STYLESLIGHT_STYLES)rD   apps     r   styleszPythonHighlighter.styles   s,    $$--/!ll:6{HLHr   c                    | j                   j                         }|D ]x  \  }}}| j                  |   }t        t	        j
                  ||            D ]A  \  }}||k  r|j                         }|j                         |z
  }	| j                  ||	|       C z | j                  |       | j                  d        | j                  |g| j                   }
|
s | j                  |g| j                   }
yy)z>Apply syntax highlighting to the given block of text.
        r   N)r[   copyrj   	enumeraterefinditerstartend	setFormatapplySearchHighlightsetCurrentBlockStatematch_multilinerV   rW   )rD   textr[   
expressionnthformatnmatchrp   lengthin_multilines              r   highlightBlockz PythonHighlighter.highlightBlock   s     

!', 	6#JV[[(F%bkk*d&CD 65s7u,uff56	6 	!!$'!!!$ ,t++DC4??C/4//GtGL r   c                 n   | j                         |k(  rd}d}n1|j                  |      }|j                         }|j                         }|dk\  r|j                  |||z         }|j	                         }||k\  r+||z
  |z   |j                         z   }	| j                  d       n"| j                  |       t        |      |z
  |z   }	| j                  ||	| j                  |          |j                  |||	z         }|j                         }|dk\  r| j                  |       | j                         |k(  ryy)am  Do highlighting of multi-line strings. 
        
        =========== ==========================================================
        delimiter   (QRegularExpression) for triple-single-quotes or 
                    triple-double-quotes
        in_state    (int) to represent the corresponding state changes when 
                    inside those strings. Returns True if we're still inside a
                    multi-line string when this function is finished.
        style       (str) representation of the kind of style to use
        =========== ==========================================================
        r   TF)previousBlockStater{   capturedStartcapturedLengthcapturedEndrt   lenrr   rj   rs   currentBlockState)
rD   rv   	delimiterin_stater   rp   addr{   rq   r|   s
             r   ru   z!PythonHighlighter.match_multiline   s9    ""$0EC OOD)E'')E&&(C qjOOD%#+6E##%Cczus*U-A-A-CC))!, ))(3TU*S0NN5&$++e*<= OOD%&.9E'')E# qj& 	!!$' !!#x/r   c                    | j                   sy d| j                    }t        j                         }|j                         j	                         }|j	                  |j
                  j                  |j                  j                        j                         }t        ||j                               }t        j                  ||      D ]8  }|j                         }|j                         |z
  }	| j                  ||	|       : y )Nz(?i))r   )r\   ri   palette	highlightr   
ColorGroupCurrent	ColorRoleTextnamer   rn   ro   rp   rq   rr   )
rD   rv   exprr   r   	fgndColorr   r{   rp   r|   s
             r   rs   z&PythonHighlighter.applySearchHighlight  s    doo&'"%++-!!#))+MM'"4"4"<"<")"3"3"8"8::>$& 	9>[[t, 	1EKKMEYY[5(FNN5&%0	1r   )r#   r$   r%   __doc__r=   kwlistrX   rY   rZ   rT   rf   rj   r~   ru   rs   __classcell__ra   s   @r   rG   rG   {   sN     ~~H
IF)V I IH.1f1r   rG   c                     i }| j                         D ]5  \  }}t        |t              r|j                  t	        |             1|||<   7 |S )zJConverts a dict-of-dicts to a singly nested dict for non-recursive parsing)items
isinstancedictupdateunnestedDict)exDictoutkkvvs       r   r   r     sK    
C,,. Bb$JJ|B'(CG	
 Jr   c                        e Zd ZdddddZ ed  ej                         D              Zd Zd Z	d fd	Z
d
 Zd ZddZddZd Zd Zd Zd Zd ZdddZd Z ed      d        Zd Zd Z fdZ xZS )ExampleLoaderr   rQ   rR      )PyQt6PySide6PyQt5PySide2c              #   4   K   | ]  }|j                     y wN)r   ).0ms     r   	<genexpr>zExampleLoader.<genexpr>,  s     ;qAFF;s   c                 
    t         j                  j                          t        j                          _        t        j                          _         j                   j                          j
                  j                   j                          j                  d       t        j                  d       _        t        j                          _         j
                  j                  j!                   j                         t#         j
                  j                  j%                                _        t         j(                  j+                         }|j,                  j/                   j0                         t         j2                  j4                  j6                  } j                  j9                  t        j:                  dd||      dd        j                  j=                   j                  dd        j                  j?                           j
                  j@                  d  _!         j
                  j@                  jE                           j
                  jF                  jI                   jJ                  jM                                 j
                  jF                  jO                   jJ                  tP                   fd} j
                  jR                  jT                  j/                  |        | j
                  jR                  jW                                g  _,         j[                   j
                  j\                  j_                         t`        jb                          j
                  j\                  je                           jg                  dd        ji                           j
                  jj                  jm                  d	d
g        j
                  j                  jo                          _8         j
                  jr                  jt                  j/                   jv                          j
                  j\                  jx                  j/                   jz                          j
                  j\                  j|                  j/                   jv                          j
                  j                  j~                  j/                   j                          j                  jt                  j/                   j                          j                   j
                  j                  j                                y )NzPyQtGraph ExampleszRun Edited Coded   r   rQ   c                    j                   j                   j                          j                  _         j                  j                  j                  d       | dk(  r&j                   j                  j                         n6d j                  _	        j                   j                  j                         j                   j                  j                                y )N zContent Search)curListener
disconnecttextChangeduiexampleFiltersetStyleSheetconnectfilterByContenthlr\   filterByTitleemitrv   )
searchTyperD   textFils    r   onComboChangedz.ExampleLoader.__init__.<locals>.onComboChangedF  s    +  ++-&22D GG!!//3--  (()=)=>%)"  ((););<!!',,.1r   i  i     i  )Dr	   QMainWindowrT   ui_templateUi_Formr   QWidgetcwsetCentralWidgetsetupUisetWindowTitleQPushButtoncodeBtnQGridLayout
codeLayoutcodeView	setLayoutrG   r]   r   rd   re   paletteChangedr   updateThemeQSizePolicyPolicy	ExpandingaddItemQSpacerItem	addWidgethider   r   setFocus
qtLibComboaddItemsbindingskeyssetCurrentIndexr   searchFilescurrentTextChangedcurrentText	itemCachepopulateTreeexampleTreeinvisibleRootItemutils	examples_	expandAllresizeshowsplittersetSizestoPlainTextoldTextloadBtnclickedloadFilecurrentItemChangedshowFileitemDoubleClickedr   onTextChangerunEditedCodeupdateCodeViewTabWidthfont)rD   ri   policyr   r   s   `   @r   rT   zExampleLoader.__init__-  sm   &&t,%%'##%dgg& 01 ,,->?#//1""4??3#DGG$4$4$=$=$?@$$--/""4#3#34&&--77	 5 5c#vv NPQSTU!!$,,15''''&&(##DMM$6$6$89**4==+@A	2 	..66~Ftww**6689$''--??A5??S%%'D		!!3s),ww''335''6..66t}}E--55dmmD$$,,T->->?$$T%7%78##DGG$4$4$9$9$;<r   c                     t        j                  |      }|j                  d      }| j                  j                  j                  |       y)zg
        Change the codeView tabStopDistance to 4 spaces based on the size of the current font
        z    N)r   QFontMetricshorizontalAdvancer   r   setTabStopDistance)rD   r   fmtabWidths       r   r   z$ExampleLoader.updateCodeViewTabWidthh  s<     %''0++H5r   c                     t         t        |   |       t        t        j
                  j                  j                        }| j                  j                         D ]  \  }}|| j                  v}|s| j                  j                  j                         j                  |      }|j                  |t        j
                  j                   j"                         |j%                  d       |j'                  |j)                          d        y )NFz is not installed)rS   r   	showEventQColorr   QtGlobalColorredr   r   modulesr   r   modelitemsetDataItemDataRoleForegroundRole
setEnabled
setToolTiprv   )rD   eventdisabledColorr   idxdisableBindingr  ra   s          r   r   zExampleLoader.showEventq  s    mT,U3vyy44889,,. 	CID#!5Nww))//166s;]FII,B,B,Q,QR&499;-/@ AB	Cr   c                     | j                   j                  j                         }|| j                  k7  r|| _        | j	                          yy)z
        textChanged fires when the highlighter is reassigned the same document.
        Prevent this from showing "run edited code" by checking for actual
        content change
        N)r   r   r   r   
codeEdited)rD   newTexts     r   r   zExampleLoader.onTextChange|  s>     ''""..0dll""DLOO #r   c                     | j                  | j                  |             | j                  j                  | j                  j
                  j                                y r   )showExamplesByTitlegetMatchingTitlesr   setDocumentr   r   r]   )rD   rv   s     r   r   zExampleLoader.filterByTitle  s@      !7!7!=>DGG,,5578r   c                    d}	 t        j                  |       | j                  j                  j	                  d       |sy t        t         j"                        }|| j$                  _        | j$                  j)                  | j                  j*                  j-                                g }|j/                         }|j1                         D ]z  \  }}t3        |t4              r|j6                  }t8        j:                  j=                  t:        |      }	| j?                  |	      j/                         }
||
v sj|jA                  |       | | jC                  |       y # t         j
                  $ r t        j                  d      rt        nt        }t        j                  |j                        }d}|j                  d       | j                  j                  j	                  d|j                                 Y w xY w)NTr   rc   Fr   zbackground: rgba)"rn   compiler   r   r   errorri   rf   r<   r!   r   r   r&   setAlphagetRgbr   r   r   r   r\   r  r   r]   lowerr   r   r   filenameospathjoingetExampleContentappendr  )rD   rv   
validRegexcolors
errorColor	checkDicttitlesr   r   r  contentss              r   r   zExampleLoader.filterByContent  s    
		ZJJtGG!!//3  1	!DGG,,5578zz|oo' 	"FB"i([[ww||D"-H--h7==?Hxb!	" 	  (- xx 	Z(+Z(@_FVFFJJ/JJ$GG!!//2B:CTCTCVBW0XY	Zs   :E BG98G9Fc                 :   |t         j                  }|j                         }g }|j                         D ]c  \  }}|xs ||j                         v }t	        |t
              r$|j                  | j                  |||             P|sS|j                  |       e |S )N)	acceptAll)	r   r   r  r   r   r   extendr  r"  )rD   rv   r   r*  r'  r   r   matcheds           r   r  zExampleLoader.getMatchingTitles  s    >__Fzz|lln 	"FB54288:#5G"d#d44T24QRb!	" r   c                    t         j                  }|j                  j                  } || j                  j
                  |      }|j                         }||j                         }|j                         xs |j                  d      |v }|j                  |        |rTd}t        |j                               D ]%  }	|j                  |	      j                         r#d} n |j                  |       |dz  }|j                         }|y y )Nr   TFrQ   )r	   QTreeWidgetItemIteratorIteratorFlag
NoChildrenr   r   valueparent
childCountrv   	setHiddenrangechildisHidden)
rD   r'  QTWIflagtreeIterr  r2  r   
hideParentiis
             r   r  z!ExampleLoader.showExamplesByTitle  s    00  ++++T2~~[[]FOO%?1)?DNNt8$ !
 1 1 34 B!<<+446%*
   ,MH>>#D r   c                 6   t        j                  d      }| j                  j                  j	                         }|j                  t         j                  j                  j                  t         j                  j                  j                  |       |j                  t         j                  j                  j                  t         j                  j                  j                  |       | j                  j                  j                  |       t        j                         }|j                  t        j                  d             | j                  j                  j                  |       t         j"                  j%                         }|j'                  dd       y)z
        used to simulate MacOS "black mode" on other platforms
        intended for debug only, as it manage only the QPlainTextEdit
        z#171717whiterc   TN)r   r   r   r   r   setColorQPaletter   Activer   BaseInactive
setPaletter   r   setCurrentCharFormatr	   rd   re   setProperty)rD   cpfri   s        r   simulate_black_modez!ExampleLoader.simulate_black_mode  s    LL#GG$$&	

5>>,,33U^^5M5M5R5RTUV	

5>>,,55u~~7O7O7T7TVWX##A&!!#	W-.--a0$$--/
D)r   c                 h    t        | j                  j                  j                               | _        y r   )rG   r   r   r]   r   rD   s    r   r   zExampleLoader.updateTheme  s!    #DGG$4$4$=$=$?@r   c                    d }|j                         D ]  \  }}t        j                  |g      }| j                  j	                  |       t        |t              r| j                  ||       nct        |t              rL|j                  |_
        d|v r>|"|j                  d      }|j                  d       |j                  d|       n||_
        |j                  |        y )Nrecommendedr   T)r   r	   QTreeWidgetItemr   r"  r   r   r   r   r  filer   setBoldsetFontaddChild)rD   rootexamples	bold_fontkeyvalr  s          r   r   zExampleLoader.populateTree  s    	 ( 	 HC,,cU3DNN!!$' #{+!!$,C+LL	 C' ($(IIaL	!))$/LLI.	MM$!	 r   c                     | j                   j                  j                         }t        |d      r.t        j
                  j                  t
        |j                        S y )NrP  )r   r   currentItemhasattrr  r  r   rP  )rD   r  s     r   currentFilezExampleLoader.currentFile  s@    ww""..04 77<<dii00r   editedc                @   | j                   j                  j                         }t        t        j
                  |      }t        j                  j                  t        j                  j                  t                    }t        j                  j                  t        j                  j                  |            }| |d<   |rt        j                  t        j                  dgt        j                  ||      }| j                   j                  j!                         j#                  d      }|j$                  j'                  |       |j$                  j)                          y | j+                         }|y t        j                  t        j                  |g||       y )N)PYQTGRAPH_QT_LIB
PYTHONPATHrK   )stdincwdenvzUTF-8)rc  rd  )r   r   r   r   r  environr  abspathdirname__file__
subprocessPopensys
executablePIPEr   r   encoderb  writecloser\  )	rD   r^  qtLibrd  example_pathr  proccodefns	            r   r   zExampleLoader.loadFile  s    ""..02::6wwrwwx'@Awwrww|<=#fL##S^^S$9VbhklD77##//188ADJJT"JJ!!#Bzcnnb1tEr   c                    | j                         }| j                  |      }| j                  j                  j	                  |       | j                  j
                  j                  |       | j                  j                          y r   )	r\  r!  r   r   setPlainTextloadedFileLabelsetTextr   r   )rD   ru  rv   s      r   r   zExampleLoader.showFile  s`    %%b)%%d+''+r   r   c                 6   |%| j                   j                  j                          y t        j                  j                  |      r t        j                  j                  |d      }t        |d      5 }|j                         }d d d        |S # 1 sw Y   S xY w)Nz__main__.pyr)	r   r   clearr  r  isdirr   openread)rD   r  r\  rv   s       r   r!  zExampleLoader.getExampleContent  sy    GG""$77=="ww||Hm<H(C  	&K##%D	&	&s   3BBc                 8    | j                   j                          y r   )r   r   rL  s    r   r  zExampleLoader.codeEdited"  s    r   c                 (    | j                  d       y )NTr]  )r   rL  s    r   r   zExampleLoader.runEditedCode%  s    T"r   c                 0   t         |   |       |j                         t        j                  j
                  j                  z  sy |j                         }t        j                  j                  }||j                  k(  r5| j                  j                  j                          |j                          y ||j                  |j                  |j                   |j"                  |j$                  fvry | j                  j&                  j)                         }|j+                         }||j                  k(  s||j"                  k(  r"|j-                  |t/        |dz  d      z          nl||j                  k(  s||j                   k(  r.|t/        |dz  d      z
  }|j-                  t/        |d             n ||j$                  k(  r|j-                  d       | j                  j&                  j1                  |       | j3                  |       |j                          y )Ng333333?rQ   
   )rS   keyPressEvent	modifiersr   r  KeyboardModifierControlModifierrW  KeyKey_Fr   r   r   acceptKey_Plus	Key_MinusKey_Underscore	Key_EqualKey_0r   r   	pointSizesetPointSizemaxrR  r   )rD   r  rW  r  r   oldSizenewSizera   s          r   r  zExampleLoader.keyPressEvent(  s   e$!FII$>$>$N$NNiikiimm #))GG!!**,LLNs||S]]C4F4FWZW`W`aaww$$&.."#,,#"6gGCK(;;<CMM!SC,>,>%>GCK 33Gc'1o.CIIb!  &##D)r   )returnNr   )NF)r#   r$   r%   r   tuplepkgutiliter_modulesr  rT   r   r   r   r   r   r  r  rJ  r   r   r\  r   r   r   r!  r  r   r  r   r   s   @r   r   r   (  s     q1CH;$8G$8$8$:;;G9=v6	C	9)>$,*&A ( "' F& s^ # r   r   c                     t        j                         } t               }|j                  j                  j                  |j                  j                  j                         j                  dd             t        j                          y )Nr   )	r   mkQAppr   r   r   r   r  indexexec)ri   loaders     r   mainr  E  sZ    
))+C_F
II))		##%++Aa0 GGIr   __main__)r   N)5r=   r  r  rn   ri  rk  argparser   collectionsr   	functoolsr   	pyqtgraphr   pyqtgraph.Qtr   r   r   r	   r  ri   r  rf  rg  rh  insertexampleLoaderTemplate_genericr   r   rU   r   r   r   QSyntaxHighlighterr   r!   r<   r+   r&   r(   r*   r3   r)   r/   r.   rh   rg   rG   r   r   r   r  r#   r9   r   r   <module>r     s-    	  	  
  #   9 9biik 
wwrwwx01 4  3  .. 	''-- $ . 0 *//8+//8(//0+22F;)//0*556*00(;',,f5*//0
 /..7?..7../?116:..//445///:++V4/../
^1* ^1B[I)) [z zF r   