
    ^h,                     Z   S r SSKrSSKrSSKrSSKrSSKJrJr  SSK	r	Sr
SrSrSrSrS	rS
rSr\
S\S\S\S\S\S\S\S0r " S S\R&                  R(                  5      r\" 5       r\R.                  R1                  S\5        S rS rS rS rS rS!S jrS rS r S r!S r"S r#S r$S  r%g)"aD  
This module contains factory functions that attempt
to return Qt submodules from the various python Qt bindings.

It also protects against double-importing Qt with different
bindings, which is unstable and likely to crash

This is used primarily by qt and qt_for_kernel, and shouldn't
be accessed directly from the outside
    N)partial	lru_cachepyqt6pyside6pyqt5pyside2pyqtpyqtv1pysidepyqtdefaultPyQt6PySide6PyQt5PySide2PySidePyQt4c                   .    \ rS rSrSrS rS rSS jrSrg)	ImportDenier3   z^Import Hook that will guard against bad Qt imports
once IPython commits to a specific binding
c                 "    [        5       U l        g N)set_ImportDenier__forbidden)selfs    U/home/james-whalen/.local/lib/python3.13/site-packages/IPython/external/qt_loaders.py__init__ImportDenier.__init__8   s    5    c                 z    [         R                  R                  US 5        U R                  R	                  U5        g r   )sysmodulespopr   add)r   module_names     r   forbidImportDenier.forbid;   s(    T*[)r   Nc                 j    U(       a  g XR                   ;   a  [        SU< S[        5       < S35      eg )Nz
    Importing zQ disabled by IPython, which has
    already imported an Incompatible QT Binding: 
    )r   ImportError
loaded_api)r   fullnamepathtargets       r   	find_specImportDenier.find_spec?   s4    '''
 Z\	+  (r   )__forbiddenr   )	__name__
__module____qualname____firstlineno____doc__r   r%   r.   __static_attributes__ r   r   r   r   3   s    !*
r   r   c                     [        [        R                  5       5      nUR                  [        U    5        U H  n[        R                  U5        M     g)zTCommit to a particular API, and trigger ImportErrors on subsequent
dangerous importsN)r   api_to_modulevaluesremoveIDr%   )apir!   mods      r   
commit_apir?   P   s=     -&&()GNN=%&
		# r   c                  $   [         R                  R                  S5      (       a  [        $ [         R                  R                  S5      (       a  [        $ [         R                  R                  S5      (       a  [
        $ [         R                  R                  S5      (       a  [        $ [         R                  R                  S5      (       a  [        5       S:X  a  [        $ [        $ [         R                  R                  S5      (       a  [        $ g)	zReturn which API is loaded, if any

If this returns anything besides None,
importing any other Qt binding is unsafe.

Returns
-------
None, 'pyside6', 'pyqt6', 'pyside2', 'pyside', 'pyqt', 'pyqt5', 'pyqtv1'
zPyQt6.QtCorezPySide6.QtCorezPyQt5.QtCorezPySide2.QtCorezPyQt4.QtCore   zPySide.QtCoreN)r    r!   getQT_API_PYQT6QT_API_PYSIDE6QT_API_PYQT5QT_API_PYSIDE2qtapi_versionQT_API_PYQTQT_API_PYQTv1QT_API_PYSIDEr7   r   r   r*   r*   Z   s     {{~&&	)	*	*		(	(	)	*	*		(	(?a  		)	)r   c                    [         U    nSSKJn  / SQnU [        [        [
        [        4;   a  UR                  S5        U H  n U" U< SU< 35      nUc    gM     U [        :X  a  SSK
nUR                  S:  $ g	! [         a       gf = f)
a  Safely check for PyQt4/5, PySide or PySide2, without importing submodules

Parameters
----------
api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | 'pyqtdefault']
    Which module to check for

Returns
-------
True if the relevant module appears to be importable
r   )r.   )QtCoreQtGuiQtSvg	QtWidgets.NF)   r      T)r9   importlib.utilr.   rE   rF   rC   rD   appendr)   rJ   r   __version_info__)r=   r$   r.   requiredsubmodspecr   s          r   has_bindingrY   w   s      $K(+H
|^\>JJ$	V<=D
 |   m&&)33  		s   A;;
B	B	c                       SSK n  U R                  S5      $ ! [         a     SSKJ n    N%! [         a      gf = ff = f! [         a     gf = f)ztReturn which QString API has been set, if any

Returns
-------
The QString API version (1 or 2), or None if not set
r   NsipQString)r\   r)   r   getapi
ValueErrorr[   s    r   rG   rG      s\    zz)$$  	! 		  s-    A  
=+
9=9= 
AAc                 n    [        U 5      (       d  g[        5       nU [        :X  a  U[        S4;   $ XS4;   $ )z?Safely query whether an API is importable, without importing itFN)rY   r*   QT_API_PYQT_DEFAULTrC   )r=   currents     r   
can_importrc      s=    slG
!!<...+%%r   c                 N   SSK nU b$  UR                  SU 5        UR                  SU 5        SSKJnJnJn  UR                  S:  a  [        SUR                  -  5      eUR                  Ul
        UR                  Ul        UR                  S5      n U S:X  a  [        O[        nX2XE4$ )	z
Import PyQt4

Parameters
----------
version : 1, 2, or None
    Which QString/QVariant API to use. Set to None to use the system
    default
ImportErrors raised within this function are non-recoverable
r   Nr]   QVariantrM   rL   rN   i  z'IPython requires PyQt4 >= 4.7, found %srQ   )r\   setapir   rM   rL   rN   PYQT_VERSIONr)   PYQT_VERSION_STR
pyqtSignalSignalpyqtSlotSlotr^   rI   rH   )versionr\   rM   rL   rN   r=   s         r   import_pyqt4ro      s     

9g&

:w'**X%C 112 3 	3 %%FM//FK jj#G"a<-[C%$$r   c                  2   SSK Jn JnJnJn  U R
                  U l        U R                  U l        [        R                  " S5      nUR                  R                  UR                  5        UR                  R                  UR                  5        [        nXX4$ )zL
Import PyQt5

ImportErrors raised within this function are non-recoverable
r   rL   rN   rO   rM   QtGuiCompat)r   rL   rN   rO   rM   rj   rk   rl   rm   types
ModuleType__dict__updaterE   rL   rN   rO   rM   rr   r=   s         r   import_pyqt5rx      x     65 %%FM//FK ""=1K/	 2 23
C**r   c                  2   SSK Jn JnJnJn  U R
                  U l        U R                  U l        [        R                  " S5      nUR                  R                  UR                  5        UR                  R                  UR                  5        [        nXX4$ )zL
Import PyQt6

ImportErrors raised within this function are non-recoverable
r   rq   rr   )r   rL   rN   rO   rM   rj   rk   rl   rm   rs   rt   ru   rv   rC   rw   s         r   import_pyqt6r{      ry   r   c                  (    SSK Jn JnJn  XU[        4$ )zM
Import PySide

ImportErrors raised within this function are non-recoverable
r   rf   )r   rM   rL   rN   rJ   rf   s      r   import_pysider}     s     ,+%..r   c                  :   SSK Jn JnJnJnJn  [        R                  " S5      nUR                  R                  U R                  5        UR                  R                  UR                  5        UR                  R                  UR                  5        XU[        4$ )zN
Import PySide2

ImportErrors raised within this function are non-recoverable
r   rM   rL   rN   rO   QtPrintSupportrr   )r   rM   rL   rN   rO   r   rs   rt   ru   rv   rF   rM   rL   rN   rO   r   rr   s         r   import_pyside2r     v     HG ""=1K/	 2 23 7 78~55r   c                  :   SSK Jn JnJnJnJn  [        R                  " S5      nUR                  R                  U R                  5        UR                  R                  UR                  5        UR                  R                  UR                  5        XU[        4$ )zN
Import PySide6

ImportErrors raised within this function are non-recoverable
r   r   rr   )r   rM   rL   rN   rO   r   rs   rt   ru   rv   rD   r   s         r   import_pyside6r   +  r   r   c                    [         [        [        [        [        [
        [        [        [        [        [        [        [        [        [        SS9[        [        0nU  Hy  nX!;  aD  [        SU< SSR!                  UR#                  5        Vs/ s H  nSU-  PM
     sn5      < 35      e[%        U5      (       d  M^  X   " 5       nUS   n['        U5        Us  $    S[(        R*                  ;   a  [(        R*                  S	 [-        S	[/        5       < S
[1        [        5      < S[1        [         5      < S[1        [        5      < S[1        [        5      < SU < S35      es  snf )aq  
Attempt to import Qt, given a preference list
of permissible bindings

It is safe to call this function multiple times.

Parameters
----------
api_options : List of strings
    The order of APIs to try. Valid items are 'pyside', 'pyside2',
    'pyqt', 'pyqt5', 'pyqtv1' and 'pyqtdefault'

Returns
-------
A tuple of QtCore, QtGui, QtSvg, QT_API
The first three are the Qt modules. The last is the
string indicating which module was loaded.

Raises
------
ImportError, if it isn't possible to import any requested
bindings (either because they aren't installed, or because
an incompatible library has already been installed)
rQ   )rn   zInvalid Qt API z, valid values are: z, z%rQT_APIz
    Could not load requested Qt binding. Please ensure that
    PyQt4 >= 4.7, PyQt5, PyQt6, PySide >= 1.0.3, PySide2, or
    PySide6 is available, and only one is imported per session.

    Currently-imported Qt library:                              zA
    PyQt5 available (requires QtCore, QtGui, QtSvg, QtWidgets): zA
    PyQt6 available (requires QtCore, QtGui, QtSvg, QtWidgets): zA
    PySide2 installed:                                          zA
    PySide6 installed:                                          zA
    Tried to load:                                              r(   )rC   r{   rD   r   rE   rx   rF   r   rJ   r}   rH   ro   rI   r   ra   RuntimeErrorjoinkeysrc   r?   osenvironr)   r*   rY   )api_optionsloadersr=   kresults        r   load_qtr   <  s   6 	ll}\w|Q7\G dii7<<> B>a> BCEF F # Rj3 " rzz!

8$ L)L)N+N+%
 	
 !Cs   Ec                 4   ^ ^ [        S5      U U4S j5       nU$ )z@Construct an enum helper to account for PyQt5 <-> PyQt6 changes.Nc                    > [         R                  " T[        :X  a  U OU R                  S5      S   5      " [        R
                  TR                     5      $ )NrP   r   )operator
attrgetterrC   
rpartitionr    r!   __package__)namer   rL   s    r   _enumenum_factory.<locals>._enum  sI     ""l*D0DQ0G

++f((
)+ 	+r   )r   )r   rL   r   s   `` r   enum_factoryr     s"     t_+ + Lr   )rA   )&r5   importlib.abc	importlibr    r   rs   	functoolsr   r   r   rC   rD   rE   rF   rH   rI   rJ   ra   r9   abcMetaPathFinderr   r<   	meta_pathinsertr?   r*   rY   rG   rc   ro   rx   r{   r}   r   r   r   r   r7   r   r   <module>r      s   	  
 	  (    #  'I'I87 9==// 2 ^   Q :%P,	&!%H+,+,/6"6"Q
h
r   