
    f,                     X   d Z ddlZddlZddlZddlZddlmZmZ ddl	Z	dZ
dZdZdZdZd	Zd
ZdZe
dededededededediZ G d dej&                  j(                        Z e       Zej.                  j1                  de       d Zd Zd Zd Zd Zd!dZd Zd Z d Z!d Z"d Z#d Z$d  Z%y)"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                   $    e Zd ZdZd Zd ZddZy)ImportDenierzfImport Hook that will guard against bad Qt imports
    once IPython commits to a specific binding
    c                 "    t               | _        y N)set_ImportDenier__forbidden)selfs    V/var/www/cvtools/html/venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py__init__zImportDenier.__init__8   s    5    c                 z    t         j                  j                  |d        | j                  j	                  |       y r   )sysmodulespopr   add)r   module_names     r   forbidzImportDenier.forbid;   s(    T*[)r   Nc                 Z    |ry || j                   v rt        d|dt               d      y )Nz
    Importing zQ disabled by IPython, which has
    already imported an Incompatible QT Binding: 
    )r   ImportError
loaded_api)r   fullnamepathtargets       r   	find_speczImportDenier.find_spec?   s6    t'''
 Z\	+  (r   r   )__name__
__module____qualname____doc__r   r#   r+    r   r   r   r   3   s    !*
r   r   c                     t        t        j                               }|j                  t        |           |D ]  }t        j                  |        y)zXCommit to a particular API, and trigger ImportErrors on subsequent
    dangerous importsN)r   api_to_modulevaluesremoveIDr#   )apir   mods      r   
commit_apir8   P   sB     -&&()GNN=%& 
		#r   c                     t         j                  j                  d      rt        S t         j                  j                  d      rt        S t         j                  j                  d      rt
        S t         j                  j                  d      rt        S t         j                  j                  d      rt               dk(  rt        S t        S t         j                  j                  d      rt        S y)	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_PYSIDEr0   r   r   r'   r'   Z   s     {{~&	)	*		(	)	*		(?a  		)r   c                    t         |    }ddlm} g d}| t        t        t
        t        fv r|j                  d       |D ]  }	  ||d|      }| y | t        k(  rddl
}|j                  dk\  S y	# t        $ r Y  yw xY w)
a5  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)r2   importlib.utilr+   r>   r?   r<   r=   appendr&   rC   r   __version_info__)r6   r"   r+   requiredsubmodspecr   s          r   has_bindingrR   w   s      $K(+H
|^\>JJ$ 		V<=D
 |	 m&&)33  		s   A33	B ?B c                      	 ddl } 	 | j                  d      S # t        $ r 	 ddlm }  n# t        $ r Y Y yw xY wY 5w xY w# t        $ r Y yw xY w)zReturn 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)rU   r&   r   getapi
ValueErrorrT   s    r   r@   r@      sa    zz)$$  	! 		 "	  s3    ? 	<)<	6<6<<	A
Ac                 `    t        |       syt               }| t        k(  r
|t        dfv S || dfv S )z?Safely query whether an API is importable, without importing itFN)rR   r'   QT_API_PYQT_DEFAULTr<   )r6   currents     r   
can_importr\      s<    slG
!!<...3+%%r   c                 L   ddl }| $|j                  d|        |j                  d|        ddlm}m}m} |j                  dk  rt        d|j                  z        |j                  |_
        |j                  |_        |j                  d      } | dk(  rt        nt        }||||fS )	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   NrV   QVariantrF   rE   rG   i  z'IPython requires PyQt4 >= 4.7, found %srJ   )rU   setapir   rF   rE   rG   PYQT_VERSIONr&   PYQT_VERSION_STR
pyqtSignalSignalpyqtSlotSlotrW   rB   rA   )versionrU   rF   rE   rG   r6   s         r   import_pyqt4rh      s     

9g&

:w'**X%C 112 3 	3 %%FM//FK jj#G"a<-[C5%$$r   c                  4   ddl m} m}m}m} | j
                  | _        | j                  | _        t        j                  d      }|j                  j                  |j                         |j                  j                  |j                         t        }| |||fS )zX
    Import PyQt5

    ImportErrors raised within this function are non-recoverable
    r   rE   rG   rH   rF   QtGuiCompat)r   rE   rG   rH   rF   rc   rd   re   rf   types
ModuleType__dict__updater>   rE   rG   rH   rF   rk   r6   s         r   import_pyqt5rq      |     65 %%FM//FK ""=1K/	 2 23
C;s**r   c                  4   ddl m} m}m}m} | j
                  | _        | j                  | _        t        j                  d      }|j                  j                  |j                         |j                  j                  |j                         t        }| |||fS )zX
    Import PyQt6

    ImportErrors raised within this function are non-recoverable
    r   rj   rk   )r   rE   rG   rH   rF   rc   rd   re   rf   rl   rm   rn   ro   r<   rp   s         r   import_pyqt6rt      rr   r   c                  *    ddl m} m}m} || |t        fS )zY
    Import PySide

    ImportErrors raised within this function are non-recoverable
    r   r_   )r   rF   rE   rG   rC   r_   s      r   import_pysiderv     s     ,+5%..r   c                  :   ddl m} m}m}m}m} t        j                  d      }|j                  j                  | j                         |j                  j                  |j                         |j                  j                  |j                         |||t        fS )zZ
    Import PySide2

    ImportErrors raised within this function are non-recoverable
    r   rF   rE   rG   rH   QtPrintSupportrk   )r   rF   rE   rG   rH   ry   rl   rm   rn   ro   r?   rF   rE   rG   rH   ry   rk   s         r   import_pyside2r{     x     HG ""=1K/	 2 23 7 78;~55r   c                  :   ddl m} m}m}m}m} t        j                  d      }|j                  j                  | j                         |j                  j                  |j                         |j                  j                  |j                         |||t        fS )zZ
    Import PySide6

    ImportErrors raised within this function are non-recoverable
    r   rx   rk   )r   rF   rE   rG   rH   ry   rl   rm   rn   ro   r=   rz   s         r   import_pyside6r~   +  r|   r   c                    t         t        t        t        t        t
        t        t        t        t        t        t        t        t        t        d      t        t        i}| D ]n  }||vr?t        d|ddj!                  |j#                         D cg c]  }d|z  	 c}            t%        |      sR ||          }|d   }t'        |       |c S  dt(        j*                  v rt(        j*                  d= t-        d	t/               d
t1        t              dt1        t               dt1        t              dt1        t              d| d      c c}w )a  
    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)
    rJ   )rg   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%   )r<   rt   r=   r~   r>   rq   r?   r{   rC   rv   rA   rh   rB   r   rZ   RuntimeErrorjoinkeysr\   r8   osenvironr&   r'   rR   )api_optionsloadersr6   kresults        r   load_qtr   <  s   6 	ll}\w|Q7\G  )
gdii7<<> Ba BCEF F # Rj3)
" rzz!

8$ L)L)N+N+%
 	
 !Cs   Ec                 2     t        d       fd       }|S )z@Construct an enum helper to account for PyQt5 <-> PyQt6 changes.Nc                      t        j                  t        k(  r| n| j                  d      d         t        j
                  j                           S )NrI   r   )operator
attrgetterr<   
rpartitionr   r   __package__)namer   rE   s    r   _enumzenum_factory.<locals>._enum  sK    
x""l*D0DQ0G

++f((
)+ 	+r   )r   )r   rE   r   s   `` r   enum_factoryr     s"     t_+ + Lr   )r:   )&r/   importlib.abc	importlibr   r   rl   	functoolsr   r   r   r<   r=   r>   r?   rA   rB   rC   rZ   r2   abcMetaPathFinderr   r5   	meta_pathinsertr8   r'   rR   r@   r\   rh   rq   rt   rv   r{   r~   r   r   r0   r   r   <module>r      s   	  
 	  (    #  'I'I87 9==// 2 ^   Q :%P,	&!%H+,+,/6"6"Q
h
r   