17 import sys |
17 import sys |
18 import logging |
18 import logging |
19 |
19 |
20 from PyQt5.QtCore import pyqtSlot, QTimer, QFile, QFileInfo, pyqtSignal, \ |
20 from PyQt5.QtCore import pyqtSlot, QTimer, QFile, QFileInfo, pyqtSignal, \ |
21 PYQT_VERSION_STR, QDate, QIODevice, qVersion, QProcess, QSize, QUrl, \ |
21 PYQT_VERSION_STR, QDate, QIODevice, qVersion, QProcess, QSize, QUrl, \ |
22 QObject, Qt |
22 QObject, Qt, QUuid, QThread |
23 from PyQt5.QtGui import QKeySequence, QDesktopServices |
23 from PyQt5.QtGui import QKeySequence, QDesktopServices |
24 from PyQt5.QtWidgets import QSizePolicy, QWidget, QWhatsThis, QToolBar, \ |
24 from PyQt5.QtWidgets import QSizePolicy, QWidget, QWhatsThis, QToolBar, \ |
25 QDialog, QSplitter, QApplication, QMenu, QVBoxLayout, QDockWidget, \ |
25 QDialog, QSplitter, QApplication, QMenu, QVBoxLayout, QDockWidget, \ |
26 QAction, QLabel |
26 QAction, QLabel |
27 from PyQt5.Qsci import QSCINTILLA_VERSION_STR |
27 from PyQt5.Qsci import QSCINTILLA_VERSION_STR |
279 self.irc = None |
279 self.irc = None |
280 self.symbolsViewer = None |
280 self.symbolsViewer = None |
281 self.browser = None |
281 self.browser = None |
282 self.templateViewer = None |
282 self.templateViewer = None |
283 self.numbersViewer = None |
283 self.numbersViewer = None |
|
284 |
|
285 self.__webBrowserProcess = None |
|
286 self.__webBrowserClient = None |
|
287 self.__webBrowserSAName = QUuid.createUuid().toString()[1:-1] |
284 |
288 |
285 # Create the main window now so that we can connect QActions to it. |
289 # Create the main window now so that we can connect QActions to it. |
286 logging.debug("Creating Layout...") |
290 logging.debug("Creating Layout...") |
287 self.__createLayout(debugServer) |
291 self.__createLayout(debugServer) |
288 self.__currentRightWidget = None |
292 self.__currentRightWidget = None |
570 self.toolGroups, self.currentToolGroup = Preferences.readToolGroups() |
574 self.toolGroups, self.currentToolGroup = Preferences.readToolGroups() |
571 self.toolProcs = [] |
575 self.toolProcs = [] |
572 self.__initExternalToolsActions() |
576 self.__initExternalToolsActions() |
573 |
577 |
574 # create a dummy help window for shortcuts handling |
578 # create a dummy help window for shortcuts handling |
575 if WEBENGINE_AVAILABLE: |
579 # TODO: remove this in favour of standalone web browser |
576 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
580 if WEBKIT_AVAILABLE: |
577 self.dummyHelpViewer = \ |
|
578 WebBrowserWindow(None, '.', None, 'web_browser', True, True) |
|
579 elif WEBKIT_AVAILABLE: |
|
580 from Helpviewer.HelpWindow import HelpWindow |
581 from Helpviewer.HelpWindow import HelpWindow |
581 self.dummyHelpViewer = \ |
582 self.dummyHelpViewer = \ |
582 HelpWindow(None, '.', None, 'help viewer', True, True) |
583 HelpWindow(None, '.', None, 'help viewer', True, True) |
583 else: |
584 else: |
584 self.dummyHelpViewer = None |
585 self.dummyHelpViewer = None |
5652 if len(home) > 0: |
5653 if len(home) > 0: |
5653 homeUrl = QUrl(home) |
5654 homeUrl = QUrl(home) |
5654 if not homeUrl.scheme(): |
5655 if not homeUrl.scheme(): |
5655 home = QUrl.fromLocalFile(home).toString() |
5656 home = QUrl.fromLocalFile(home).toString() |
5656 |
5657 |
5657 if WEBENGINE_AVAILABLE or WEBKIT_AVAILABLE: |
5658 if WEBENGINE_AVAILABLE: |
|
5659 self.__launchExternalWebBrowser(home, searchWord=searchWord) |
|
5660 |
|
5661 elif WEBKIT_AVAILABLE: |
|
5662 # TODO: change to use external web browser in single mode |
5658 single = useSingle |
5663 single = useSingle |
5659 if WEBENGINE_AVAILABLE: |
5664 if WEBKIT_AVAILABLE: |
5660 single = single or \ |
|
5661 Preferences.getWebBrowser("SingleWebBrowserWindow") |
|
5662 elif WEBKIT_AVAILABLE: |
|
5663 single = single or Preferences.getHelp("SingleHelpWindow") |
5665 single = single or Preferences.getHelp("SingleHelpWindow") |
5664 if not single or self.helpWindow is None: |
5666 if not single or self.helpWindow is None: |
5665 if WEBENGINE_AVAILABLE: |
5667 if WEBKIT_AVAILABLE: |
5666 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
|
5667 browser = WebBrowserWindow(home, '.', None, 'web_browser', |
|
5668 True, searchWord=searchWord) |
|
5669 elif WEBKIT_AVAILABLE: |
|
5670 from Helpviewer.HelpWindow import HelpWindow |
5668 from Helpviewer.HelpWindow import HelpWindow |
5671 browser = HelpWindow(home, '.', None, 'help viewer', True, |
5669 browser = HelpWindow(home, '.', None, 'help viewer', True, |
5672 searchWord=searchWord) |
5670 searchWord=searchWord) |
5673 |
5671 |
5674 if QApplication.desktop().width() > 400 and \ |
5672 if QApplication.desktop().width() > 400 and \ |
5692 self.helpWindow.search(searchWord) |
5690 self.helpWindow.search(searchWord) |
5693 self.helpWindow.raise_() |
5691 self.helpWindow.raise_() |
5694 else: |
5692 else: |
5695 self.helpWindow.newTab(home) |
5693 self.helpWindow.newTab(home) |
5696 self.helpWindow.raise_() |
5694 self.helpWindow.raise_() |
|
5695 |
5697 else: |
5696 else: |
5698 self.__webBrowser(home) |
5697 self.__webBrowser(home) |
|
5698 |
|
5699 def __launchExternalWebBrowser(self, home, searchWord=None): |
|
5700 """ |
|
5701 Private method to start an external web browser and communicate with |
|
5702 it. |
|
5703 |
|
5704 @param home filename of file to be shown or URL to be opened |
|
5705 @type str |
|
5706 @keyparam searchWord word to search for |
|
5707 @type str |
|
5708 """ |
|
5709 from WebBrowser.WebBrowserSingleApplication import \ |
|
5710 WebBrowserSingleApplicationClient |
|
5711 |
|
5712 clientArgs = [] |
|
5713 if searchWord: |
|
5714 clientArgs.append("--search={0}".format(searchWord)) |
|
5715 |
|
5716 if self.__webBrowserProcess is None: |
|
5717 process = QProcess() |
|
5718 args = [ |
|
5719 os.path.join( |
|
5720 os.path.dirname(__file__), "..", "eric6_browser.py"), |
|
5721 "--qthelp", |
|
5722 "--single", |
|
5723 "--name={0}".format(self.__webBrowserSAName) |
|
5724 ] |
|
5725 process.start(sys.executable, args) |
|
5726 if not process.waitForStarted(): |
|
5727 E5MessageBox.warning( |
|
5728 self, |
|
5729 self.tr("Start Web Browser"), |
|
5730 self.tr("""The eric6 web browser could not be started.""")) |
|
5731 return |
|
5732 |
|
5733 process.finished.connect(self.__webBrowserFinished) |
|
5734 self.__webBrowserProcess = process |
|
5735 |
|
5736 self.__webBrowserClient = WebBrowserSingleApplicationClient( |
|
5737 self.__webBrowserSAName) |
|
5738 connectCount = 30 |
|
5739 while connectCount: |
|
5740 res = self.__webBrowserClient.connect() |
|
5741 if res != 0: |
|
5742 break |
|
5743 else: |
|
5744 connectCount -= 1 |
|
5745 QThread.msleep(1000) |
|
5746 if res <= 0: |
|
5747 E5MessageBox.warning( |
|
5748 self, |
|
5749 self.tr("Start Web Browser"), |
|
5750 self.tr("""<p>The eric6 web browser is not started.</p>""" |
|
5751 """<p>Reason: {0}</p>""").format( |
|
5752 self.__webBrowserClient.errstr()) |
|
5753 ) |
|
5754 return |
|
5755 |
|
5756 if home: |
|
5757 clientArgs.append(home) |
|
5758 else: |
|
5759 clientArgs.append("--newtab={0}".format(home)) |
|
5760 |
|
5761 if clientArgs: |
|
5762 self.__webBrowserClient.processArgs(clientArgs, disconnect=False) |
|
5763 |
|
5764 def __webBrowserFinished(self): |
|
5765 """ |
|
5766 Private slot handling the end of the external web browser process. |
|
5767 """ |
|
5768 self.__webBrowserProcess.deleteLater() |
|
5769 |
|
5770 self.__webBrowserProcess = None |
|
5771 self.__webBrowserClient = None |
|
5772 |
|
5773 def __webBrowserShutdown(self): |
|
5774 """ |
|
5775 Private method to shut down the web browser. |
|
5776 """ |
|
5777 self.__webBrowserClient.processArgs(["--shutdown"], disconnect=False) |
5699 |
5778 |
5700 def __helpClosed(self): |
5779 def __helpClosed(self): |
5701 """ |
5780 """ |
5702 Private slot to handle the helpClosed signal of the help window. |
5781 Private slot to handle the helpClosed signal of the help window. |
5703 """ |
5782 """ |
5741 |
5820 |
5742 @keyparam preview flag indicating to get a help window for preview |
5821 @keyparam preview flag indicating to get a help window for preview |
5743 (boolean) |
5822 (boolean) |
5744 @return reference to the help window instance (HelpWindow) |
5823 @return reference to the help window instance (HelpWindow) |
5745 """ |
5824 """ |
|
5825 # TODO: check if this method is used somewhere |
5746 if WEBENGINE_AVAILABLE or WEBKIT_AVAILABLE: |
5826 if WEBENGINE_AVAILABLE or WEBKIT_AVAILABLE: |
5747 if self.helpWindow is None: |
5827 if self.helpWindow is None: |
5748 self.launchHelpViewer("", useSingle=True) |
5828 self.launchHelpViewer("", useSingle=True) |
5749 self.helpWindow.raise_() |
5829 self.helpWindow.raise_() |
5750 return self.helpWindow |
5830 return self.helpWindow |
5935 """ |
6015 """ |
5936 Private slot to configure the keyboard shortcuts. |
6016 Private slot to configure the keyboard shortcuts. |
5937 """ |
6017 """ |
5938 if self.shortcutsDialog is None: |
6018 if self.shortcutsDialog is None: |
5939 from Preferences.ShortcutsDialog import ShortcutsDialog |
6019 from Preferences.ShortcutsDialog import ShortcutsDialog |
5940 self.shortcutsDialog = ShortcutsDialog(self, 'Shortcuts') |
6020 self.shortcutsDialog = ShortcutsDialog(self) |
5941 self.shortcutsDialog.populate() |
6021 self.shortcutsDialog.populate() |
5942 self.shortcutsDialog.show() |
6022 self.shortcutsDialog.show() |
5943 |
6023 |
5944 def __exportShortcuts(self): |
6024 def __exportShortcuts(self): |
5945 """ |
6025 """ |