eric6/UI/Previewer.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2013 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a previewer widget for HTML, Markdown and ReST files.
8 """
9
10 from __future__ import unicode_literals
11
12 import os
13
14 from PyQt5.QtCore import QTimer
15 from PyQt5.QtWidgets import QStackedWidget
16
17 import Preferences
18
19
20 class Previewer(QStackedWidget):
21 """
22 Class implementing a previewer widget containing a stack of
23 specialized previewers.
24 """
25 def __init__(self, viewmanager, splitter, parent=None):
26 """
27 Constructor
28
29 @param viewmanager reference to the viewmanager object (ViewManager)
30 @param splitter reference to the embedding splitter (QSplitter)
31 @param parent reference to the parent widget (QWidget)
32 """
33 super(Previewer, self).__init__(parent)
34
35 self.__vm = viewmanager
36 self.__splitter = splitter
37
38 self.__firstShow = True
39
40 self.__htmlPreviewer = None
41 self.__qssPreviewer = None
42
43 # Don't update too often because the UI might become sluggish
44 self.__typingTimer = QTimer()
45 self.__typingTimer.setInterval(500) # 500ms
46 self.__typingTimer.timeout.connect(self.__processEditor)
47
48 self.__vm.editorChangedEd.connect(self.__editorChanged)
49 self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged)
50 self.__vm.editorTextChanged.connect(self.__editorTextChanged)
51
52 self.__vm.previewStateChanged.connect(self.__previewStateChanged)
53
54 self.__splitter.splitterMoved.connect(self.__splitterMoved)
55
56 self.hide()
57
58 def show(self):
59 """
60 Public method to show the preview widget.
61 """
62 super(Previewer, self).show()
63 if self.__firstShow:
64 self.__splitter.restoreState(
65 Preferences.getUI("PreviewSplitterState"))
66 self.__firstShow = False
67 self.__typingTimer.start()
68
69 def hide(self):
70 """
71 Public method to hide the preview widget.
72 """
73 super(Previewer, self).hide()
74 self.__typingTimer.stop()
75
76 def shutdown(self):
77 """
78 Public method to perform shutdown actions.
79 """
80 self.__typingTimer.stop()
81 self.__htmlPreviewer and self.__htmlPreviewer.shutdown()
82
83 def __splitterMoved(self):
84 """
85 Private slot to handle the movement of the embedding splitter's handle.
86 """
87 state = self.__splitter.saveState()
88 Preferences.setUI("PreviewSplitterState", state)
89
90 def __editorChanged(self, editor):
91 """
92 Private slot to handle a change of the current editor.
93
94 @param editor reference to the editor (Editor)
95 """
96 if editor is None:
97 self.hide()
98 return
99
100 if Preferences.getUI("ShowFilePreview") and \
101 self.__isPreviewable(editor):
102 self.show()
103 self.__processEditor()
104 else:
105 self.hide()
106
107 def __editorLanguageChanged(self, editor):
108 """
109 Private slot to handle a change of the current editor's language.
110
111 @param editor reference to the editor (Editor)
112 """
113 self.__editorChanged(editor)
114
115 def __editorTextChanged(self, editor):
116 """
117 Private slot to handle changes of an editor's text.
118
119 @param editor reference to the editor (Editor)
120 """
121 if self.isVisible():
122 self.__typingTimer.stop()
123 self.__typingTimer.start()
124
125 def __previewStateChanged(self, on):
126 """
127 Private slot to toggle the display of the preview.
128
129 @param on flag indicating to show a preview (boolean)
130 """
131 editor = self.__vm.activeWindow()
132 if on and editor and self.__isPreviewable(editor):
133 self.show()
134 else:
135 self.hide()
136
137 def __isPreviewable(self, editor):
138 """
139 Private method to check, if a preview can be shown for the given
140 editor.
141
142 @param editor reference to an editor (Editor)
143 @return flag indicating if a preview can be shown (boolean)
144 """
145 if editor:
146 if bool(editor.getFileName()):
147 extension = os.path.normcase(
148 os.path.splitext(editor.getFileName())[1][1:])
149 return extension in \
150 Preferences.getEditor("PreviewHtmlFileNameExtensions") + \
151 Preferences.getEditor(
152 "PreviewMarkdownFileNameExtensions") + \
153 Preferences.getEditor("PreviewRestFileNameExtensions") + \
154 Preferences.getEditor("PreviewQssFileNameExtensions")
155 elif editor.getLanguage().lower() in [
156 "html", "markdown", "restructuredtext", "qss"]:
157 return True
158
159 return False
160
161 def __processEditor(self):
162 """
163 Private slot to schedule the processing of the current editor's text.
164 """
165 self.__typingTimer.stop()
166
167 editor = self.__vm.activeWindow()
168 if editor is not None:
169 fn = editor.getFileName()
170
171 if fn:
172 extension = os.path.normcase(os.path.splitext(fn)[1][1:])
173 else:
174 extension = ""
175 if extension in \
176 Preferences.getEditor("PreviewHtmlFileNameExtensions") or \
177 editor.getLanguage().lower() == "html":
178 language = "HTML"
179 elif extension in \
180 Preferences.getEditor("PreviewMarkdownFileNameExtensions") or \
181 editor.getLanguage().lower() == "markdown":
182 language = "Markdown"
183 elif extension in \
184 Preferences.getEditor("PreviewRestFileNameExtensions") or \
185 editor.getLanguage().lower() == "restructuredtext":
186 language = "ReST"
187 elif extension in \
188 Preferences.getEditor("PreviewQssFileNameExtensions") or \
189 editor.getLanguage().lower() == "qss":
190 language = "QSS"
191 else:
192 language = ""
193
194 if language in ["HTML", "Markdown", "ReST"]:
195 if self.__htmlPreviewer is None:
196 from .Previewers.PreviewerHTML import PreviewerHTML
197 self.__htmlPreviewer = PreviewerHTML()
198 self.addWidget(self.__htmlPreviewer)
199 self.setCurrentWidget(self.__htmlPreviewer)
200 self.__htmlPreviewer.processEditor(editor)
201 elif language == "QSS":
202 if self.__qssPreviewer is None:
203 from .Previewers.PreviewerQSS import PreviewerQSS
204 self.__qssPreviewer = PreviewerQSS()
205 self.addWidget(self.__qssPreviewer)
206 self.setCurrentWidget(self.__qssPreviewer)
207 self.__qssPreviewer.processEditor(editor)

eric ide

mercurial