
    geC                        d Z ddlZddlZddlZddlmZ ddlmZ ej                  dk(  r@ej                  Z
d Zed        Zee_	        	 ddlmZ ej                  j!                  d	       dd
lmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 dZ6 e7e.      Z8ddddiidfiZ9e9ju                   edddd             e9ju                  e3       e8ju                  e9        e7e/      Z; e7d d!d"d#$      Z<e<ju                  e2       e<ju                  d%d&i       e;ju                  e<        e=e<j}                               Z< e=e9j}                               Z9 G d' de-e1      Z? G d( d)e?      Z@d* ZAeBd+k(  r eA        yy# e$ r Y Yw xY w),z A minimal application using the Qt console-style Jupyter frontend.

This is not a complete console app, as subprocess will not be able to receive
input, there is no real readline support, among other limitations.
    N)warn)parsentc                     | S N )funcs    6lib/python3.12/site-packages/qtconsole/qtconsoleapp.py<lambda>r   &   s        c                     	 dd l }dd l}d}d}dj                  |j                  | ||            }|j                  j
                  j                  d|||       t        | ||       y # t        | ||       w xY w)Nr      zError starting QtConsole )ctypes	tracebackjoinformat_exceptionwindlluser32MessageBoxWold_excepthook)exctypevaluetbr   r   MB_ICONERRORtitlemsgs           r
   gui_excepthookr   (   sj    		/$%L.E'')44WeRHICMM  ,,QULI 7E2.N7E2.s   AA& &A5)r   zJupyter.Qtconsole)QtCoreQtGui	QtWidgets
QT_VERSION)boolean_flag)catch_config_error)JupyterWidget)RichJupyterWidget)styles__version__)
MainWindow)QtKernelClient)QtKernelManager)DictUnicodeCBoolAny)
JupyterApp
base_flagsbase_aliases)JupyterConsoleAppapp_aliases	app_flags)is_local_ipz>
jupyter qtconsole                      # start the qtconsole
plainJupyterQtConsoleAppTzDisable rich text support.bannerz"JupyterQtConsoleApp.display_bannerz-Display a banner upon starting the QtConsole.z3Don't display a banner upon starting the QtConsole.JupyterWidget.syntax_stylezJupyterQtConsoleApp.stylesheetzJupyterWidget.editorzConsoleWidget.paging)style
stylesheeteditorpagingzgui-completionzConsoleWidget.gui_completionc                   r    e Zd ZdZeZdZeZe	ge
j                  z   Z ee      Z ee      Z ee      Z ee      ZeZeZ eddd      Z eddd      Z eddd	      Z eddd
      Z eddd      Zd Z ee       Z!d fd	Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+e,d fd	       Z- fdZ. xZ/S )r8   jupyter-qtconsolez
        The Jupyter QtConsole.

        This launches a Console-style application using Qt.  It is not a full
        console, in that launched terminal subprocesses will not be able to accept
        input.

    r   Tzpath to a custom CSS stylesheet)confighelpFz2Start the console window with the menu bar hidden.z#Start the console window maximized.zEUse a plaintext widget instead of rich text (plain can't print/save).z8Whether to display a banner upon starting the QtConsole.c                 x    |rdnd}|| j                   j                  _        |rt        | _        y t
        | _        y )Nr7   rich)rA   ConsoleWidgetkindr%   widget_factoryr&   )selfnameoldnewrF   s        r
   _plain_changedz"JupyterQtConsoleApp._plain_changed   s0    w6)-!!&"/D"3Dr   c                 Z    t         |   |       | j                  | j                         y r   )superparse_command_linebuild_kernel_argv
extra_args)rH   argv	__class__s     r
   rO   z&JupyterQtConsoleApp.parse_command_line   s"    "4(t/r   c                    | j                  | j                         | d      }i }| j                  r%| j                  j                  r| j                  |d<    |j
                  di | | j                  |_        |j                         }|j                  dd       | j                  | j                  d      }| j                  |       ||_        ||_        d|_        d|_        | j                   |_        | j$                  |_        |S )zW Create and return new frontend attached to new kernel, launched on localhost.
        T)connection_fileparentautorestartextra_arguments)shelliopubrA   local_kernelFr   )kernel_manager_class_new_connection_filekernel_manager	ipykernelkernel_argvstart_kernelkernel_client_classclient_factoryclientstart_channelsrG   rA   init_colorskernel_client	_existing
_may_closeconfirm_exit_confirm_exitdisplay_banner_display_banner)rH   r_   kwargsrh   widgets        r
   new_frontend_masterz'JupyterQtConsoleApp.new_frontend_master   s	    22040I0I0K'+,0 3 
 4#6#6#@#@(,(8(8F$%###-f-(,(@(@%&--/$$4t$<$$DKK26 % 8  .,  #00!%!4!4r   c                 D   | j                  || j                        }|j                          |j                          | j	                  | j                  d      }| j                  |       d|_        d|_        d|_        | j                  |_
        ||_        d|_        |S )zCreate and return a new frontend attached to an existing kernel.

        Parameters
        ----------
        connection_file : str
            The connection_file path this frontend is to connect to
        rU   rA   Fr[   TN)rc   rA   load_connection_filerf   rG   rg   ri   rj   rl   rm   rn   rh   r_   )rH   rU   rh   rp   s       r
   new_frontend_connectionz+JupyterQtConsoleApp.new_frontend_connection   s     00+;; 1 
 	**,$$&$$DKK27 % 9 !$!%!4!4, $r   c                    | j                  |j                  j                  | j                        }|j	                          |j                          | j                  | j                  d      }| j                  |       d|_        d|_	        d|_
        | j                  |_        ||_        |j                  |_        |S )zCreate and return a new frontend attached to an existing kernel.

        Parameters
        ----------
        current_widget : JupyterWidget
            The JupyterWidget whose kernel this frontend is to share
        rs   Fr[   T)rc   rh   rU   rA   rt   rf   rG   rg   ri   rj   rl   rm   rn   r_   )rH   current_widgetrh   rp   s       r
   new_frontend_slavez&JupyterQtConsoleApp.new_frontend_slave   s     000>0L0L0\0\)- 1 
 	**,$$&$$DKK-2 % 4 !$!%!4!4, . = =r   c                     t         j                  j                         7t        j                  dg      | _        | j                  j	                  d       y t         j                  j                         | _        y )Nr@   )r!   QApplicationinstanceappsetApplicationName)rH   s    r
   init_qt_appzJupyterQtConsoleApp.init_qt_app  sV    !!**,4 --/B.CDDHHH''(;< --668DHr   c                    t         j                  j                  t         j                  j                  t                    }t         j                  j                  |ddd      }t        j                  |      | j                  _	        t        j                  j                  | j                  j                         | j                  }| j                   xs t        |      }| j!                  | j"                  |      | _        | j'                  | j$                         | j                  | j$                  _        | j                   | j$                  _        | j,                  | j$                  _        | j0                  | j$                  _        | j4                  | j$                  _        | j6                  | j$                  _        t9        | j                  | j,                  | j:                  | j<                  | j>                        | _         | jB                  | j@                  _!        | j@                  jE                  | j$                         | j@                  jG                          tH        jJ                  dk7  r5| jL                  r)| j@                  jO                         jQ                  d       | j@                  jS                  d       y )	N	resourcesiconzJupyterConsole.svgr[   )rk   new_frontend_factoryslave_frontend_factoryconnection_frontend_factorydarwinFzJupyter QtConsole)*ospathabspathdirname__file__r   r    QIconr|   r   r!   rz   setWindowIconipexistingr6   rG   rA   rp   rg   ri   rj   rk   rl   rm   rn   r_   rh   r)   rq   rx   ru   windowlogadd_tab_with_frontendinit_menu_barsysplatformhide_menubarmenuBar
setVisiblesetWindowTitle)rH   	base_path	icon_pathr   r\   s        r
   init_qt_elementsz$JupyterQtConsoleApp.init_qt_elements  s    GGOOBGGOOH$=>	GGLLKAUV	I.,,TXX]];WW MM)=k"o))5A * C% $%)]]!2$($5$5!&*&9&9#%)%8%8"$($6$6! -1->->595M5M7;7N7N<@<X<X	" (())$++6!!# <<8#(9(9KK!,,U3""#67r   c                 N   | j                   }d|v r|j                  j                  nd}d|v r|j                  j                  nd}d|v r|j                  j
                  nd}|r!|j                         }|dv rd}n1|dv rd}n*d	}n'|r#|d
k(  rd	}nt        j                  |      rd}nd}nd}|rCt        j                  ||      |_        ||_        |j                          |j                          n|r|j                  |       | j                  rpt        j                  j!                  | j                        r/t#        | j                        5 }|j%                         }ddd       nt'        d| j                  z        |r||_        |j                          yy# 1 sw Y   $xY w)z$Configure the coloring of the widgetzZMQInteractiveShell.colorsNr:   zJupyterWidget.style_sheet)lightbglightr   )darklinuxr   nocolorbw)colorszStylesheet %r not found.)rA   ZMQInteractiveShellr   r%   syntax_stylestyle_sheetlowerr'   
dark_stylesheet_from_template_syntax_style_changed_style_sheet_changedset_default_styler<   r   r   isfileopenreadIOError)rH   rp   cfgr   r;   sheetfs          r
   rg   zJupyterQtConsoleApp.init_colors1  s    kk3OSV3V((//\`2NRU2U!!..[_1LPS1S!!--Y] <<>F-- ,, d{ ""5) F !'!;!;E6!JF"'F((*'')$$F$3??ww~~doo.$//*aFFHE +* 84??JKK!&F'') 	 +*s   FF$c                      t        j                   t         j                   fd       t        j                         }|j                  j                  d        |j                  d       | _        y)zallow clean shutdown on sigintc                 &    j                  d      S )N)exit)sigframerH   s     r
   r   z1JupyterQtConsoleApp.init_signal.<locals>.<lambda>g  s    		"r   c                       y r   r   r   r   r
   r   z1JupyterQtConsoleApp.init_signal.<locals>.<lambda>m  s    dr      N)signalSIGINTr   QTimertimeoutconnectstart_sigint_timer)rH   timers   ` r
   init_signalzJupyterQtConsoleApp.init_signale  sI    fmm%EF l+C"r   c           
         |v rz| j                   j                  d|dj                  fd| j                     j	                         D                     |j                         }||   j                  |          |S y)zWarn about deprecated config.z1Use %s in config, not %s. Outdated config:
    %sz
    c              3   L   K   | ]  \  }}d j                  ||        yw)z{name}.{key} = {value!r})keyr   rI   N)format).0r   r   old_names      r
   	<genexpr>z8JupyterQtConsoleApp._deprecate_config.<locals>.<genexpr>x  s8       'D
U /55#U;C 6 E&Cs   !$N)r   warningr   rA   itemscopymerge)rH   r   r   new_names     ` r
   _deprecate_configz%JupyterQtConsoleApp._deprecate_configr  s~    s?HHD(  '+kk(&;&A&A&C  ((*CMH.J r   c                    t         j                  j                  d      rTt         j                  dk\  r@ddl}	 ddlm}m} t        |j                               |u r|j                   |              yyyy# t        $ r Y yw xY w)a  
        Same workaround fix as https://github.com/ipython/ipykernel/pull/456

        Set default asyncio policy to be compatible with tornado
        Tornado 6 (at least) is not compatible with the default
        asyncio implementation on Windows
        Pick the older SelectorEventLoopPolicy on Windows
        if the known-incompatible default policy is in use.
        do this as early as possible to make it a low priority and overrideable
        ref: https://github.com/tornadoweb/tornado/issues/2608
        FIXME: if/when tornado supports the defaults in asyncio,
               remove and bump tornado requirement for py38
        win)      r   N)WindowsProactorEventLoopPolicyWindowsSelectorEventLoopPolicy)r   r   
startswithversion_infoasyncior   r   typeget_event_loop_policyset_event_loop_policyImportError)rH   r   r   r   s       r
   _init_asyncio_patchz'JupyterQtConsoleApp._init_asyncio_patch  s     <<""5)c.>.>&.HT 5578<ZZ 112P2RS [ /I)  s   A5 5	B Bc                    t         j                  dk(  r2t        d      }t        t              }||k  rdt        j
                  d<   | j                          | j                          t        | %  |       | j                  ry dD ]6  \  }}| j                  | j                  ||      }|s&| j                  |       8 t        j                  | |       | j                          | j!                          y )Nr   z5.15.21QT_MAC_WANTS_LAYER))IPythonQtConsoleAppJupyterQtConsole)IPythonWidgetr%   )RichIPythonWidgetr&   )r   r   r   r"   r   environr   r~   rN   
initialize_dispatchingr   rA   update_configr3   r   r   )rH   rR   v_5_15_2	v_currentr   r   r   rS   s          r
   r   zJupyterQtConsoleApp.initialize  s     <<8#XHj)I8#36

/0  "4 #
Hh
 ((hIC""3'#
 	$$T$/r   c                    t         |           | j                  r| j                  j	                          n| j                  j                          | j                  j                          | j                  j                          y r   )	rN   r   maximizer   showMaximizedshowraise_r|   exec_)rH   rS   s    r
   r   zJupyterQtConsoleApp.start  sU     ==KK%%'KK 	r   r   )0__name__
__module____qualname__rI   r(   versiondescription	_examplesexamplesr%   r3   classesr,   flagsaliasesr/   qt_flagsfrontend_flags
qt_aliasesfrontend_aliasesr*   rc   r+   r]   r-   r<   r.   r   r   r7   rm   rL   r&   rG   rO   rq   ru   rx   r~   r   rg   r   r   r   r$   r   r   __classcell__rS   s   @r
   r8   r8      s#   DGK Ho 1 9 99GKE7mG]N:(*D.0J tACL U424H %TVE 4GN4 *+N0
8229"8H1*h# T<  4 r   c                        e Zd Z fdZ xZS )r   c                 D    t        dt               t        |   |i | y )Nz:IPythonQtConsoleApp is deprecated; use JupyterQtConsoleApp)r   DeprecationWarningrN   __init__)rH   akwrS   s      r
   r  zIPythonQtConsoleApp.__init__  s#    I	!!"r"r   )r   r   r   r  r  r  s   @r
   r   r     s    # #r   r   c                  ,    t         j                          y r   )r8   launch_instancer   r   r
   mainr    s    '')r   __main__)C__doc__r   r   r   warningsr   packaging.versionr   rI   
excepthookr   undocr   r   r   shell32'SetCurrentProcessExplicitAppUserModelIDAttributeErrorqtpyr   r    r!   r"   traitlets.config.applicationr#   r$   qtconsole.jupyter_widgetr%   qtconsole.rich_jupyter_widgetr&   	qtconsoler'   r(   qtconsole.mainwindowr)   qtconsole.clientr*   qtconsole.managerr+   	traitletsr,   r-   r.   r/   jupyter_core.applicationr0   r1   r2   jupyter_client.consoleappr3   r4   r5   jupyter_client.localinterfacesr6   r   dictr   r   updater   r   setkeysr8   r   r  r   r   r   r
   <module>r%     s   
  
  #$ 77d?^^N E

/ 
/ $CN!>>?RS 6 5 5 ; 2 ; ) + + -  J I 
 7	 	Z%4(89(* 	239  		  X  |
(1##
   +  
  #$BC D z  "#
x}}D*&7 DN
#- #* zF {  s   	!F; ;GG