UI/UserInterface.py

branch
maintenance
changeset 6319
df201b9fbad4
parent 6273
0daf79d65080
parent 6300
cfb21ace8d09
child 6395
613e37fabd96
equal deleted inserted replaced
6274:44249d49d892 6319:df201b9fbad4
278 278
279 # Generate the redirection helpers 279 # Generate the redirection helpers
280 self.stdout = Redirector(False) 280 self.stdout = Redirector(False)
281 self.stderr = Redirector(True) 281 self.stderr = Redirector(True)
282 282
283 # set a few dialog members for dialogs created on demand 283 # set a few dialog members for non-modal dialogs created on demand
284 self.programsDialog = None 284 self.programsDialog = None
285 self.shortcutsDialog = None 285 self.shortcutsDialog = None
286 self.unittestDialog = None 286 self.unittestDialog = None
287 self.findFileNameDialog = None 287 self.findFileNameDialog = None
288 self.diffDlg = None 288 self.diffDlg = None
289 self.compareDlg = None 289 self.compareDlg = None
290 self.findFilesDialog = None 290 self.findFilesDialog = None
291 self.replaceFilesDialog = None 291 self.replaceFilesDialog = None
292 self.__notification = None 292 self.__notification = None
293 self.__readingSession = False 293 self.__readingSession = False
294 self.__versionsDialog = None
294 295
295 # now setup the connections 296 # now setup the connections
296 splash.showMessage(self.tr("Setting up connections...")) 297 splash.showMessage(self.tr("Setting up connections..."))
297 self.browser.sourceFile[str].connect( 298 self.browser.sourceFile[str].connect(
298 self.viewmanager.openSourceFile) 299 self.viewmanager.openSourceFile)
538 self.dummyHelpViewer = \ 539 self.dummyHelpViewer = \
539 HelpWindow(None, '.', None, 'help viewer', True, True) 540 HelpWindow(None, '.', None, 'help viewer', True, True)
540 else: 541 else:
541 self.dummyHelpViewer = None 542 self.dummyHelpViewer = None
542 543
544 # redirect handling of http and https URLs to ourselves
545 if WEBENGINE_AVAILABLE or WEBKIT_AVAILABLE:
546 QDesktopServices.setUrlHandler("http", self.handleUrl)
547 QDesktopServices.setUrlHandler("https", self.handleUrl)
548
543 # register all relevant objects 549 # register all relevant objects
544 splash.showMessage(self.tr("Registering Objects...")) 550 splash.showMessage(self.tr("Registering Objects..."))
545 e5App().registerObject("UserInterface", self) 551 e5App().registerObject("UserInterface", self)
546 e5App().registerObject("DebugUI", self.debuggerUI) 552 e5App().registerObject("DebugUI", self.debuggerUI)
547 e5App().registerObject("DebugServer", debugServer) 553 e5App().registerObject("DebugServer", debugServer)
628 # restore toolbar manager state 634 # restore toolbar manager state
629 splash.showMessage(self.tr("Restoring Toolbarmanager...")) 635 splash.showMessage(self.tr("Restoring Toolbarmanager..."))
630 self.toolbarManager.restoreState( 636 self.toolbarManager.restoreState(
631 Preferences.getUI("ToolbarManagerState")) 637 Preferences.getUI("ToolbarManagerState"))
632 638
639 # finalize the initialization of the code documentation viewer
640 self.codeDocumentationViewer.finalizeSetup()
641
633 # now activate the initial view profile 642 # now activate the initial view profile
634 splash.showMessage(self.tr("Setting View Profile...")) 643 splash.showMessage(self.tr("Setting View Profile..."))
635 self.__setEditProfile() 644 self.__setEditProfile()
636 645
637 # now read the saved tasks 646 # now read the saved tasks
670 679
671 # set the keyboard input interval 680 # set the keyboard input interval
672 interval = Preferences.getUI("KeyboardInputInterval") 681 interval = Preferences.getUI("KeyboardInputInterval")
673 if interval > 0: 682 if interval > 0:
674 QApplication.setKeyboardInputInterval(interval) 683 QApplication.setKeyboardInputInterval(interval)
675
676 # finalize the initialization of the code documentation viewer
677 self.codeDocumentationViewer.finalizeSetup()
678 684
679 def __createLayout(self, debugServer): 685 def __createLayout(self, debugServer):
680 """ 686 """
681 Private method to create the layout of the various windows. 687 Private method to create the layout of the various windows.
682 688
1767 self.helpviewerAct = None 1773 self.helpviewerAct = None
1768 1774
1769 self.__initQtDocActions() 1775 self.__initQtDocActions()
1770 self.__initPythonDocActions() 1776 self.__initPythonDocActions()
1771 self.__initEricDocAction() 1777 self.__initEricDocAction()
1772 self.__initPySideDocAction() 1778 self.__initPySideDocActions()
1773 1779
1774 self.versionAct = E5Action( 1780 self.versionAct = E5Action(
1775 self.tr('Show Versions'), 1781 self.tr('Show Versions'),
1776 self.tr('Show &Versions'), 1782 self.tr('Show &Versions'),
1777 0, 0, self, 'show_versions') 1783 0, 0, self, 'show_versions')
2430 self.qt4DocAct.setStatusTip(self.tr('Open Qt4 Documentation')) 2436 self.qt4DocAct.setStatusTip(self.tr('Open Qt4 Documentation'))
2431 self.qt4DocAct.setWhatsThis(self.tr( 2437 self.qt4DocAct.setWhatsThis(self.tr(
2432 """<b>Qt4 Documentation</b>""" 2438 """<b>Qt4 Documentation</b>"""
2433 """<p>Display the Qt4 Documentation. Dependent upon your""" 2439 """<p>Display the Qt4 Documentation. Dependent upon your"""
2434 """ settings, this will either show the help in Eric's internal""" 2440 """ settings, this will either show the help in Eric's internal"""
2435 """ help viewer, or execute a web browser or Qt Assistant. </p>""" 2441 """ help viewer/web browser, or execute a web browser or Qt"""
2442 """ Assistant. </p>"""
2436 )) 2443 ))
2437 self.qt4DocAct.triggered.connect(self.__showQt4Doc) 2444 self.qt4DocAct.triggered.connect(self.__showQt4Doc)
2438 self.actions.append(self.qt4DocAct) 2445 self.actions.append(self.qt4DocAct)
2439 2446
2440 self.qt5DocAct = E5Action( 2447 self.qt5DocAct = E5Action(
2444 self.qt5DocAct.setStatusTip(self.tr('Open Qt5 Documentation')) 2451 self.qt5DocAct.setStatusTip(self.tr('Open Qt5 Documentation'))
2445 self.qt5DocAct.setWhatsThis(self.tr( 2452 self.qt5DocAct.setWhatsThis(self.tr(
2446 """<b>Qt5 Documentation</b>""" 2453 """<b>Qt5 Documentation</b>"""
2447 """<p>Display the Qt5 Documentation. Dependent upon your""" 2454 """<p>Display the Qt5 Documentation. Dependent upon your"""
2448 """ settings, this will either show the help in Eric's internal""" 2455 """ settings, this will either show the help in Eric's internal"""
2449 """ help viewer, or execute a web browser or Qt Assistant. </p>""" 2456 """ help viewer/web browser, or execute a web browser or Qt"""
2457 """ Assistant. </p>"""
2450 )) 2458 ))
2451 self.qt5DocAct.triggered.connect(self.__showQt5Doc) 2459 self.qt5DocAct.triggered.connect(self.__showQt5Doc)
2452 self.actions.append(self.qt5DocAct) 2460 self.actions.append(self.qt5DocAct)
2453 2461
2454 try: 2462 try:
2460 self.pyqt4DocAct.setStatusTip(self.tr('Open PyQt4 Documentation')) 2468 self.pyqt4DocAct.setStatusTip(self.tr('Open PyQt4 Documentation'))
2461 self.pyqt4DocAct.setWhatsThis(self.tr( 2469 self.pyqt4DocAct.setWhatsThis(self.tr(
2462 """<b>PyQt4 Documentation</b>""" 2470 """<b>PyQt4 Documentation</b>"""
2463 """<p>Display the PyQt4 Documentation. Dependent upon your""" 2471 """<p>Display the PyQt4 Documentation. Dependent upon your"""
2464 """ settings, this will either show the help in Eric's""" 2472 """ settings, this will either show the help in Eric's"""
2465 """ internal help viewer, or execute a web browser or""" 2473 """ internal help viewer/web browser, or execute a web"""
2466 """ Qt Assistant. </p>""" 2474 """ browser or Qt Assistant. </p>"""
2467 )) 2475 ))
2468 self.pyqt4DocAct.triggered.connect(self.__showPyQt4Doc) 2476 self.pyqt4DocAct.triggered.connect(self.__showPyQt4Doc)
2469 self.actions.append(self.pyqt4DocAct) 2477 self.actions.append(self.pyqt4DocAct)
2470 except ImportError: 2478 except ImportError:
2471 self.pyqt4DocAct = None 2479 self.pyqt4DocAct = None
2480 'Open PyQt5 Documentation')) 2488 'Open PyQt5 Documentation'))
2481 self.pyqt5DocAct.setWhatsThis(self.tr( 2489 self.pyqt5DocAct.setWhatsThis(self.tr(
2482 """<b>PyQt5 Documentation</b>""" 2490 """<b>PyQt5 Documentation</b>"""
2483 """<p>Display the PyQt5 Documentation. Dependent upon your""" 2491 """<p>Display the PyQt5 Documentation. Dependent upon your"""
2484 """ settings, this will either show the help in Eric's""" 2492 """ settings, this will either show the help in Eric's"""
2485 """ internal help viewer, or execute a web browser or""" 2493 """ internal help viewer/web browser, or execute a web"""
2486 """ Qt Assistant. </p>""" 2494 """ browser or Qt Assistant. </p>"""
2487 )) 2495 ))
2488 self.pyqt5DocAct.triggered.connect(self.__showPyQt5Doc) 2496 self.pyqt5DocAct.triggered.connect(self.__showPyQt5Doc)
2489 self.actions.append(self.pyqt5DocAct) 2497 self.actions.append(self.pyqt5DocAct)
2490 except ImportError: 2498 except ImportError:
2491 self.pyqt5DocAct = None 2499 self.pyqt5DocAct = None
2550 """ the eric6 installation directory.</p>""" 2558 """ the eric6 installation directory.</p>"""
2551 )) 2559 ))
2552 self.ericDocAct.triggered.connect(self.__showEricDoc) 2560 self.ericDocAct.triggered.connect(self.__showEricDoc)
2553 self.actions.append(self.ericDocAct) 2561 self.actions.append(self.ericDocAct)
2554 2562
2555 def __initPySideDocAction(self): 2563 def __initPySideDocActions(self):
2556 """ 2564 """
2557 Private slot to initialize the action to show the PySide documentation. 2565 Private slot to initialize the actions to show the PySide
2558 """ 2566 documentation.
2559 pyside2, pyside3 = Utilities.checkPyside() 2567 """
2560 if pyside2 or pyside3: 2568 pyside_py2, pyside_py3 = Utilities.checkPyside("1")
2569 if pyside_py2 or pyside_py3:
2561 self.pysideDocAct = E5Action( 2570 self.pysideDocAct = E5Action(
2562 self.tr('PySide Documentation'), 2571 self.tr('PySide Documentation'),
2563 self.tr('Py&Side Documentation'), 2572 self.tr('Py&Side Documentation'),
2564 0, 0, self, 'pyside_documentation') 2573 0, 0, self, 'pyside_documentation')
2565 self.pysideDocAct.setStatusTip(self.tr( 2574 self.pysideDocAct.setStatusTip(self.tr(
2566 'Open PySide Documentation')) 2575 'Open PySide Documentation'))
2567 self.pysideDocAct.setWhatsThis(self.tr( 2576 self.pysideDocAct.setWhatsThis(self.tr(
2568 """<b>PySide Documentation</b>""" 2577 """<b>PySide Documentation</b>"""
2569 """<p>Display the PySide Documentation. Dependent upon your""" 2578 """<p>Display the PySide Documentation. Dependent upon your"""
2570 """ settings, this will either show the help in Eric's""" 2579 """ settings, this will either show the help in Eric's"""
2571 """ internal help viewer, or execute a web browser or""" 2580 """ internal help viewer/web browser, or execute a web"""
2572 """ Qt Assistant. </p>""" 2581 """ browser or Qt Assistant. </p>"""
2573 )) 2582 ))
2574 self.pysideDocAct.triggered.connect(self.__showPySideDoc) 2583 self.pysideDocAct.triggered.connect(
2584 lambda: self.__showPySideDoc("1"))
2575 self.actions.append(self.pysideDocAct) 2585 self.actions.append(self.pysideDocAct)
2576 else: 2586 else:
2577 self.pysideDocAct = None 2587 self.pysideDocAct = None
2578 2588
2589 pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
2590 if pyside2_py2 or pyside2_py3:
2591 self.pyside2DocAct = E5Action(
2592 self.tr('PySide2 Documentation'),
2593 self.tr('PySide&2 Documentation'),
2594 0, 0, self, 'pyside2_documentation')
2595 self.pyside2DocAct.setStatusTip(self.tr(
2596 'Open PySide2 Documentation'))
2597 self.pyside2DocAct.setWhatsThis(self.tr(
2598 """<b>PySide2 Documentation</b>"""
2599 """<p>Display the PySide2 Documentation. Dependent upon your"""
2600 """ settings, this will either show the help in Eric's"""
2601 """ internal help viewer/web browser, or execute a web"""
2602 """ browser or Qt Assistant. </p>"""
2603 ))
2604 self.pyside2DocAct.triggered.connect(
2605 lambda: self.__showPySideDoc("2"))
2606 self.actions.append(self.pyside2DocAct)
2607 else:
2608 self.pyside2DocAct = None
2609
2579 def __initMenus(self): 2610 def __initMenus(self):
2580 """ 2611 """
2581 Private slot to create the menus. 2612 Private slot to create the menus.
2582 """ 2613 """
2583 self.__menus = {} 2614 self.__menus = {}
2737 self.__menus["help"].addAction(self.pyqt4DocAct) 2768 self.__menus["help"].addAction(self.pyqt4DocAct)
2738 if self.pyqt5DocAct is not None: 2769 if self.pyqt5DocAct is not None:
2739 self.__menus["help"].addAction(self.pyqt5DocAct) 2770 self.__menus["help"].addAction(self.pyqt5DocAct)
2740 if self.pysideDocAct is not None: 2771 if self.pysideDocAct is not None:
2741 self.__menus["help"].addAction(self.pysideDocAct) 2772 self.__menus["help"].addAction(self.pysideDocAct)
2773 if self.pyside2DocAct is not None:
2774 self.__menus["help"].addAction(self.pyside2DocAct)
2742 self.__menus["help"].addSeparator() 2775 self.__menus["help"].addSeparator()
2743 self.__menus["help"].addAction(self.versionAct) 2776 self.__menus["help"].addAction(self.versionAct)
2744 self.__menus["help"].addSeparator() 2777 self.__menus["help"].addSeparator()
2745 self.__menus["help"].addAction(self.checkUpdateAct) 2778 self.__menus["help"].addAction(self.checkUpdateAct)
2746 self.__menus["help"].addAction(self.showVersionsAct) 2779 self.__menus["help"].addAction(self.showVersionsAct)
5364 elif hvType == 3: 5397 elif hvType == 3:
5365 self.__webBrowser(home) 5398 self.__webBrowser(home)
5366 else: 5399 else:
5367 self.__customViewer(home) 5400 self.__customViewer(home)
5368 5401
5369 def __showPySideDoc(self): 5402 def __showPySideDoc(self, variant):
5370 """ 5403 """
5371 Private slot to show the PySide documentation. 5404 Private slot to show the PySide/PySide2 documentation.
5372 """ 5405
5373 pysideDocDir = Preferences.getHelp("PySideDocDir") 5406 @param variant PySide variant (1 or 2)
5374 if not pysideDocDir: 5407 @type str
5375 pysideDocDir = Utilities.getEnvironmentEntry("PYSIDEDOCDIR", None) 5408 """
5409 assert variant in ("1", "2")
5410
5411 if variant == "1":
5412 pysideDocDir = Preferences.getHelp("PySideDocDir")
5413 if not pysideDocDir:
5414 pysideDocDir = Utilities.getEnvironmentEntry(
5415 "PYSIDEDOCDIR", None)
5416 else:
5417 pysideDocDir = Preferences.getHelp("PySide2DocDir")
5418 if not pysideDocDir:
5419 pysideDocDir = Utilities.getEnvironmentEntry(
5420 "PYSIDE2DOCDIR", None)
5376 5421
5377 if not pysideDocDir: 5422 if not pysideDocDir:
5378 E5MessageBox.warning( 5423 E5MessageBox.warning(
5379 self, 5424 self,
5380 self.tr("Documentation"), 5425 self.tr("Documentation"),
5381 self.tr("""<p>The PySide documentation starting point""" 5426 self.tr("""<p>The PySide{0} documentation starting point"""
5382 """ has not been configured.</p>""")) 5427 """ has not been configured.</p>""").format(
5428 "" if variant == "1" else variant)
5429 )
5383 return 5430 return
5384 5431
5385 if not pysideDocDir.startswith(("http://", "https://", "qthelp://")): 5432 if not pysideDocDir.startswith(("http://", "https://", "qthelp://")):
5386 if pysideDocDir.startswith("file://"): 5433 if pysideDocDir.startswith("file://"):
5387 pysideDocDir = pysideDocDir[7:] 5434 pysideDocDir = pysideDocDir[7:]
5418 self.__webBrowser(home) 5465 self.__webBrowser(home)
5419 elif hvType == 3: 5466 elif hvType == 3:
5420 self.__webBrowser(home) 5467 self.__webBrowser(home)
5421 else: 5468 else:
5422 self.__customViewer(home) 5469 self.__customViewer(home)
5423 5470
5471 @pyqtSlot(QUrl)
5472 def handleUrl(self, url):
5473 """
5474 Public slot to handle opening a URL.
5475
5476 @param url URL to be shown
5477 @type QUrl
5478 """
5479 self.launchHelpViewer(url)
5480
5424 def launchHelpViewer(self, home, searchWord=None, useSingle=False): 5481 def launchHelpViewer(self, home, searchWord=None, useSingle=False):
5425 """ 5482 """
5426 Public slot to start the help viewer. 5483 Public slot to start the help viewer/web browser.
5427 5484
5428 @param home filename of file to be shown (string) 5485 @param home filename of file to be shown or URL to be opened
5429 @keyparam searchWord word to search for (string) 5486 @type str or QUrl
5487 @keyparam searchWord word to search for
5488 @type str
5430 @keyparam useSingle flag indicating to use a single browser window 5489 @keyparam useSingle flag indicating to use a single browser window
5431 (boolean) 5490 @type bool
5432 """ 5491 """
5492 if isinstance(home, QUrl):
5493 home = home.toString(QUrl.None_)
5494
5433 if len(home) > 0: 5495 if len(home) > 0:
5434 homeUrl = QUrl(home) 5496 homeUrl = QUrl(home)
5435 if not homeUrl.scheme(): 5497 if not homeUrl.scheme():
5436 home = QUrl.fromLocalFile(home).toString() 5498 home = QUrl.fromLocalFile(home).toString()
5437 5499
5493 self.helpWindow.masterPasswordChanged) 5555 self.helpWindow.masterPasswordChanged)
5494 self.helpWindow = None 5556 self.helpWindow = None
5495 5557
5496 def __helpViewer(self): 5558 def __helpViewer(self):
5497 """ 5559 """
5498 Private slot to start an empty help viewer. 5560 Private slot to start an empty help viewer/web browser.
5499 """ 5561 """
5500 searchWord = self.viewmanager.textForFind(False) 5562 searchWord = self.viewmanager.textForFind(False)
5501 if searchWord == "": 5563 if searchWord == "":
5502 searchWord = None 5564 searchWord = None
5503 5565
6689 'sourceforge' in versions[line + 1] and 6751 'sourceforge' in versions[line + 1] and
6690 "SourceForge" or versions[line + 1]) 6752 "SourceForge" or versions[line + 1])
6691 line += 2 6753 line += 2
6692 versionText += self.tr("""</table>""") 6754 versionText += self.tr("""</table>""")
6693 6755
6694 E5MessageBox.about(self, Program, versionText) 6756 self.__versionsDialog = E5MessageBox.E5MessageBox(
6757 E5MessageBox.NoIcon,
6758 Program,
6759 versionText,
6760 modal=False,
6761 buttons=E5MessageBox.Ok,
6762 parent=self
6763 )
6764 self.__versionsDialog.setIconPixmap(
6765 UI.PixmapCache.getPixmap("eric.png").scaled(64, 64))
6766 self.__versionsDialog.show()
6695 6767
6696 def __sslErrors(self, reply, errors): 6768 def __sslErrors(self, reply, errors):
6697 """ 6769 """
6698 Private slot to handle SSL errors. 6770 Private slot to handle SSL errors.
6699 6771

eric ide

mercurial