src/eric7/UI/Previewer.py

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

eric ide

mercurial