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) |