src/eric7/UI/Previewer.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
18 class Previewer(QStackedWidget): 18 class Previewer(QStackedWidget):
19 """ 19 """
20 Class implementing a previewer widget containing a stack of 20 Class implementing a previewer widget containing a stack of
21 specialized previewers. 21 specialized previewers.
22 """ 22 """
23
23 def __init__(self, viewmanager, parent=None): 24 def __init__(self, viewmanager, parent=None):
24 """ 25 """
25 Constructor 26 Constructor
26 27
27 @param viewmanager reference to the viewmanager object 28 @param viewmanager reference to the viewmanager object
28 @type ViewManager 29 @type ViewManager
29 @param parent reference to the parent widget 30 @param parent reference to the parent widget
30 @type QWidget 31 @type QWidget
31 """ 32 """
32 super().__init__(parent) 33 super().__init__(parent)
33 34
34 self.__vm = viewmanager 35 self.__vm = viewmanager
35 36
36 self.__firstShow = True 37 self.__firstShow = True
37 38
38 self.__htmlPreviewer = None 39 self.__htmlPreviewer = None
39 self.__qssPreviewer = None 40 self.__qssPreviewer = None
40 41
41 # Don't update too often because the UI might become sluggish 42 # Don't update too often because the UI might become sluggish
42 self.__typingTimer = QTimer() 43 self.__typingTimer = QTimer()
43 self.__typingTimer.setInterval( 44 self.__typingTimer.setInterval(
44 Preferences.getEditor("PreviewRefreshWaitTimer")) # default 500ms 45 Preferences.getEditor("PreviewRefreshWaitTimer")
46 ) # default 500ms
45 self.__typingTimer.timeout.connect(self.__processEditor) 47 self.__typingTimer.timeout.connect(self.__processEditor)
46 48
47 self.__vm.editorChangedEd.connect(self.__editorChanged) 49 self.__vm.editorChangedEd.connect(self.__editorChanged)
48 self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged) 50 self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged)
49 self.__vm.editorTextChanged.connect(self.__editorTextChanged) 51 self.__vm.editorTextChanged.connect(self.__editorTextChanged)
50 52
51 self.__vm.previewStateChanged.connect(self.__previewStateChanged) 53 self.__vm.previewStateChanged.connect(self.__previewStateChanged)
52 54
53 self.hide() 55 self.hide()
54 56
55 def setSplitter(self, splitter): 57 def setSplitter(self, splitter):
56 """ 58 """
57 Public method to set the splitter. 59 Public method to set the splitter.
58 60
59 @param splitter reference to the embedding splitter 61 @param splitter reference to the embedding splitter
60 @type QSplitter 62 @type QSplitter
61 """ 63 """
62 self.__splitter = splitter 64 self.__splitter = splitter
63 self.__splitter.splitterMoved.connect(self.__splitterMoved) 65 self.__splitter.splitterMoved.connect(self.__splitterMoved)
64 66
65 @pyqtSlot() 67 @pyqtSlot()
66 def preferencesChanged(self): 68 def preferencesChanged(self):
67 """ 69 """
68 Public slot handling a change of preferences. 70 Public slot handling a change of preferences.
69 """ 71 """
70 self.__typingTimer.setInterval( 72 self.__typingTimer.setInterval(Preferences.getEditor("PreviewRefreshWaitTimer"))
71 Preferences.getEditor("PreviewRefreshWaitTimer")) 73
72
73 def show(self): 74 def show(self):
74 """ 75 """
75 Public method to show the preview widget. 76 Public method to show the preview widget.
76 """ 77 """
77 super().show() 78 super().show()
78 if self.__firstShow: 79 if self.__firstShow:
79 self.__splitter.restoreState( 80 self.__splitter.restoreState(Preferences.getUI("PreviewSplitterState"))
80 Preferences.getUI("PreviewSplitterState"))
81 self.__firstShow = False 81 self.__firstShow = False
82 self.__typingTimer.start() 82 self.__typingTimer.start()
83 83
84 def hide(self): 84 def hide(self):
85 """ 85 """
86 Public method to hide the preview widget. 86 Public method to hide the preview widget.
87 """ 87 """
88 super().hide() 88 super().hide()
89 self.__typingTimer.stop() 89 self.__typingTimer.stop()
90 90
91 def shutdown(self): 91 def shutdown(self):
92 """ 92 """
93 Public method to perform shutdown actions. 93 Public method to perform shutdown actions.
94 """ 94 """
95 self.__typingTimer.stop() 95 self.__typingTimer.stop()
96 self.__htmlPreviewer and self.__htmlPreviewer.shutdown() 96 self.__htmlPreviewer and self.__htmlPreviewer.shutdown()
97 97
98 def __splitterMoved(self): 98 def __splitterMoved(self):
99 """ 99 """
100 Private slot to handle the movement of the embedding splitter's handle. 100 Private slot to handle the movement of the embedding splitter's handle.
101 """ 101 """
102 state = self.__splitter.saveState() 102 state = self.__splitter.saveState()
103 Preferences.setUI("PreviewSplitterState", state) 103 Preferences.setUI("PreviewSplitterState", state)
104 104
105 def __editorChanged(self, editor): 105 def __editorChanged(self, editor):
106 """ 106 """
107 Private slot to handle a change of the current editor. 107 Private slot to handle a change of the current editor.
108 108
109 @param editor reference to the editor 109 @param editor reference to the editor
110 @type Editor 110 @type Editor
111 """ 111 """
112 if editor is None: 112 if editor is None:
113 self.hide() 113 self.hide()
114 return 114 return
115 115
116 if ( 116 if Preferences.getUI("ShowFilePreview") and self.__isPreviewable(editor):
117 Preferences.getUI("ShowFilePreview") and
118 self.__isPreviewable(editor)
119 ):
120 self.show() 117 self.show()
121 self.__processEditor() 118 self.__processEditor()
122 else: 119 else:
123 self.hide() 120 self.hide()
124 121
125 def __editorLanguageChanged(self, editor): 122 def __editorLanguageChanged(self, editor):
126 """ 123 """
127 Private slot to handle a change of the current editor's language. 124 Private slot to handle a change of the current editor's language.
128 125
129 @param editor reference to the editor 126 @param editor reference to the editor
130 @type Editor 127 @type Editor
131 """ 128 """
132 self.__editorChanged(editor) 129 self.__editorChanged(editor)
133 130
134 def __editorTextChanged(self, editor): 131 def __editorTextChanged(self, editor):
135 """ 132 """
136 Private slot to handle changes of an editor's text. 133 Private slot to handle changes of an editor's text.
137 134
138 @param editor reference to the editor 135 @param editor reference to the editor
139 @type Editor 136 @type Editor
140 """ 137 """
141 if self.isVisible(): 138 if self.isVisible():
142 self.__typingTimer.stop() 139 self.__typingTimer.stop()
143 self.__typingTimer.start() 140 self.__typingTimer.start()
144 141
145 def __previewStateChanged(self, on): 142 def __previewStateChanged(self, on):
146 """ 143 """
147 Private slot to toggle the display of the preview. 144 Private slot to toggle the display of the preview.
148 145
149 @param on flag indicating to show a preview 146 @param on flag indicating to show a preview
150 @type bool 147 @type bool
151 """ 148 """
152 editor = self.__vm.activeWindow() 149 editor = self.__vm.activeWindow()
153 if on and editor and self.__isPreviewable(editor): 150 if on and editor and self.__isPreviewable(editor):
154 self.show() 151 self.show()
155 else: 152 else:
156 self.hide() 153 self.hide()
157 154
158 def __isPreviewable(self, editor): 155 def __isPreviewable(self, editor):
159 """ 156 """
160 Private method to check, if a preview can be shown for the given 157 Private method to check, if a preview can be shown for the given
161 editor. 158 editor.
162 159
163 @param editor reference to an editor 160 @param editor reference to an editor
164 @type Editor 161 @type Editor
165 @return flag indicating if a preview can be shown 162 @return flag indicating if a preview can be shown
166 @rtype bool 163 @rtype bool
167 """ 164 """
168 if editor: 165 if editor:
169 if bool(editor.getFileName()): 166 if bool(editor.getFileName()):
170 extension = os.path.normcase( 167 extension = os.path.normcase(
171 os.path.splitext(editor.getFileName())[1][1:]) 168 os.path.splitext(editor.getFileName())[1][1:]
169 )
172 return extension in ( 170 return extension in (
173 Preferences.getEditor("PreviewHtmlFileNameExtensions") + 171 Preferences.getEditor("PreviewHtmlFileNameExtensions")
174 Preferences.getEditor( 172 + Preferences.getEditor("PreviewMarkdownFileNameExtensions")
175 "PreviewMarkdownFileNameExtensions") + 173 + Preferences.getEditor("PreviewRestFileNameExtensions")
176 Preferences.getEditor("PreviewRestFileNameExtensions") + 174 + Preferences.getEditor("PreviewQssFileNameExtensions")
177 Preferences.getEditor("PreviewQssFileNameExtensions")
178 ) 175 )
179 elif editor.getLanguage().lower() in [ 176 elif editor.getLanguage().lower() in [
180 "html", "markdown", "restructuredtext", "qss"]: 177 "html",
178 "markdown",
179 "restructuredtext",
180 "qss",
181 ]:
181 return True 182 return True
182 183
183 return False 184 return False
184 185
185 def __processEditor(self): 186 def __processEditor(self):
186 """ 187 """
187 Private slot to schedule the processing of the current editor's text. 188 Private slot to schedule the processing of the current editor's text.
188 """ 189 """
189 self.__typingTimer.stop() 190 self.__typingTimer.stop()
190 191
191 editor = self.__vm.activeWindow() 192 editor = self.__vm.activeWindow()
192 if editor is not None: 193 if editor is not None:
193 fn = editor.getFileName() 194 fn = editor.getFileName()
194 195
195 if fn: 196 if fn:
196 extension = os.path.normcase(os.path.splitext(fn)[1][1:]) 197 extension = os.path.normcase(os.path.splitext(fn)[1][1:])
197 else: 198 else:
198 extension = "" 199 extension = ""
199 if ( 200 if (
200 extension in Preferences.getEditor( 201 extension in Preferences.getEditor("PreviewHtmlFileNameExtensions")
201 "PreviewHtmlFileNameExtensions") or 202 or editor.getLanguage().lower() == "html"
202 editor.getLanguage().lower() == "html"
203 ): 203 ):
204 language = "HTML" 204 language = "HTML"
205 elif ( 205 elif (
206 extension in Preferences.getEditor( 206 extension in Preferences.getEditor("PreviewMarkdownFileNameExtensions")
207 "PreviewMarkdownFileNameExtensions") or 207 or editor.getLanguage().lower() == "markdown"
208 editor.getLanguage().lower() == "markdown"
209 ): 208 ):
210 language = "Markdown" 209 language = "Markdown"
211 elif ( 210 elif (
212 extension in Preferences.getEditor( 211 extension in Preferences.getEditor("PreviewRestFileNameExtensions")
213 "PreviewRestFileNameExtensions") or 212 or editor.getLanguage().lower() == "restructuredtext"
214 editor.getLanguage().lower() == "restructuredtext"
215 ): 213 ):
216 language = "ReST" 214 language = "ReST"
217 elif ( 215 elif (
218 extension in Preferences.getEditor( 216 extension in Preferences.getEditor("PreviewQssFileNameExtensions")
219 "PreviewQssFileNameExtensions") or 217 or editor.getLanguage().lower() == "qss"
220 editor.getLanguage().lower() == "qss"
221 ): 218 ):
222 language = "QSS" 219 language = "QSS"
223 else: 220 else:
224 language = "" 221 language = ""
225 222
226 if language in ["HTML", "Markdown", "ReST"]: 223 if language in ["HTML", "Markdown", "ReST"]:
227 if self.__htmlPreviewer is None: 224 if self.__htmlPreviewer is None:
228 from .Previewers.PreviewerHTML import PreviewerHTML 225 from .Previewers.PreviewerHTML import PreviewerHTML
226
229 self.__htmlPreviewer = PreviewerHTML() 227 self.__htmlPreviewer = PreviewerHTML()
230 self.addWidget(self.__htmlPreviewer) 228 self.addWidget(self.__htmlPreviewer)
231 self.setCurrentWidget(self.__htmlPreviewer) 229 self.setCurrentWidget(self.__htmlPreviewer)
232 self.__htmlPreviewer.processEditor(editor) 230 self.__htmlPreviewer.processEditor(editor)
233 elif language == "QSS": 231 elif language == "QSS":
234 if self.__qssPreviewer is None: 232 if self.__qssPreviewer is None:
235 from .Previewers.PreviewerQSS import PreviewerQSS 233 from .Previewers.PreviewerQSS import PreviewerQSS
234
236 self.__qssPreviewer = PreviewerQSS() 235 self.__qssPreviewer = PreviewerQSS()
237 self.addWidget(self.__qssPreviewer) 236 self.addWidget(self.__qssPreviewer)
238 self.setCurrentWidget(self.__qssPreviewer) 237 self.setCurrentWidget(self.__qssPreviewer)
239 self.__qssPreviewer.processEditor(editor) 238 self.__qssPreviewer.processEditor(editor)

eric ide

mercurial