30 |
30 |
31 self.baseStyles = [] # list of style numbers, that support |
31 self.baseStyles = [] # list of style numbers, that support |
32 # sub-styling |
32 # sub-styling |
33 self.defaultSubStyles = {} |
33 self.defaultSubStyles = {} |
34 # dictionary with sub-styling data |
34 # dictionary with sub-styling data |
35 # main key: base style number, value : dictionary with |
35 # main key: base style number, value : list of dict with |
36 # 'SubStyleLength': int |
|
37 # 'SubStyles': list of dict with |
|
38 # 'Description': string containing a short description |
36 # 'Description': string containing a short description |
39 # 'Words': string of whitespace separated words to be styled |
37 # 'Words': string of whitespace separated words to be styled |
40 # 'Style': dictionary with styling data (only difference to the |
38 # 'Style': dictionary with styling data (only difference to the |
41 # base style is required |
39 # base style is required |
42 # 'fore': foreground color (int containing RGB values) |
40 # 'fore': foreground color (int containing RGB values) |
63 key = "Scintilla/{0}/style{1}/SubStyleLength".format( |
61 key = "Scintilla/{0}/style{1}/SubStyleLength".format( |
64 self.language(), baseStyle) |
62 self.language(), baseStyle) |
65 if settings.contains(key): |
63 if settings.contains(key): |
66 subStyleLength = int(settings.value(key), 0) |
64 subStyleLength = int(settings.value(key), 0) |
67 self.subStyles[baseStyle] = {} |
65 self.subStyles[baseStyle] = {} |
68 self.subStyles[baseStyle]["SubStyleLength"] = subStyleLength |
|
69 if subStyleLength: |
66 if subStyleLength: |
70 self.subStyles[baseStyle]["SubStyles"] = [] |
67 self.subStyles[baseStyle] = [] |
71 for subStyle in range(subStyleLength): |
68 for subStyle in range(subStyleLength): |
72 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format( |
69 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format( |
73 self.language(), baseStyle, subStyle) |
70 self.language(), baseStyle, subStyle) |
74 subStyleData = {} |
71 if settings.contains(baseKey): |
75 subStyleData["Description"] = settings.value( |
72 subStyleData = {} |
76 baseKey + "Description", "") |
73 subStyleData["Description"] = settings.value( |
77 subStyleData["Words"] = settings.value( |
74 baseKey + "Description", "") |
78 baseKey + "Words", "") |
75 subStyleData["Words"] = settings.value( |
79 style = {} |
76 baseKey + "Words", "") |
80 |
77 style = {} |
81 key = baseKey + "fore" |
78 |
82 if settings.contains(key): |
79 key = baseKey + "fore" |
83 style["fore"] = int(settings.value(key)) |
80 if settings.contains(key): |
84 key = baseKey + "paper" |
81 style["fore"] = int(settings.value(key)) |
85 if settings.contains(key): |
82 key = baseKey + "paper" |
86 style["paper"] = int(settings.value(key)) |
83 if settings.contains(key): |
87 key = baseKey + "eolfill" |
84 style["paper"] = int(settings.value(key)) |
88 if settings.contains(key): |
85 key = baseKey + "eolfill" |
89 style["eolfill"] = Preferences.toBool( |
86 if settings.contains(key): |
90 settings.value(key)) |
87 style["eolfill"] = Preferences.toBool( |
91 key = baseKey + "font_family" |
88 settings.value(key)) |
92 if settings.contains(key): |
89 key = baseKey + "font_family" |
93 style["font_family"] = settings.value(key) |
90 if settings.contains(key): |
94 key = baseKey + "font_size" |
91 style["font_family"] = settings.value(key) |
95 if settings.contains(key): |
92 key = baseKey + "font_size" |
96 style["font_size"] = int(settings.value(key)) |
93 if settings.contains(key): |
97 key = baseKey + "font_bold" |
94 style["font_size"] = int(settings.value(key)) |
98 if settings.contains(key): |
95 key = baseKey + "font_bold" |
99 style["font_bold"] = Preferences.toBool( |
96 if settings.contains(key): |
100 settings.value(key)) |
97 style["font_bold"] = Preferences.toBool( |
101 key = baseKey + "font_italic" |
98 settings.value(key)) |
102 if settings.contains(key): |
99 key = baseKey + "font_italic" |
103 style["font_italic"] = Preferences.toBool( |
100 if settings.contains(key): |
104 settings.value(key)) |
101 style["font_italic"] = Preferences.toBool( |
105 key = baseKey + "font_underline" |
102 settings.value(key)) |
106 if settings.contains(key): |
103 key = baseKey + "font_underline" |
107 style["font_underline"] = Preferences.toBool( |
104 if settings.contains(key): |
108 settings.value(key)) |
105 style["font_underline"] = Preferences.toBool( |
109 |
106 settings.value(key)) |
110 subStyleData["Style"] = style |
107 |
|
108 subStyleData["Style"] = style |
|
109 |
|
110 self.subStyles[baseStyle].append(subStyleData) |
|
111 |
|
112 self.__subStylesInitialized = True |
111 |
113 |
112 def loadDefaultSubStyles(self): |
114 def loadDefaultSubStyles(self): |
113 """ |
115 """ |
114 Public method to load the default sub-style definitions. |
116 Public method to load the default sub-style definitions. |
115 """ |
117 """ |
137 distanceToSecondary = editor.SendScintilla( |
139 distanceToSecondary = editor.SendScintilla( |
138 editor.SCI_DISTANCETOSECONDARYSTYLES) |
140 editor.SCI_DISTANCETOSECONDARYSTYLES) |
139 |
141 |
140 subStyleBases = [b for b in bytearray(subStyleBases[:-1])] |
142 subStyleBases = [b for b in bytearray(subStyleBases[:-1])] |
141 if distanceToSecondary: |
143 if distanceToSecondary: |
142 subStyleBases.extend(b + distanceToSecondary for b in subStyleBases[:]) |
144 subStyleBases.extend(b + distanceToSecondary |
|
145 for b in subStyleBases[:]) |
143 for baseStyleNo in subStyleBases: |
146 for baseStyleNo in subStyleBases: |
144 if baseStyleNo in self.subStyles: |
147 if baseStyleNo in self.subStyles: |
145 subStylesData = self.subStyles[baseStyleNo] |
148 subStylesData = self.subStyles[baseStyleNo] |
146 subStyleLength = subStylesData["SubStyleLength"] |
149 subStyleLength = len(subStylesData) |
147 subStyleStart = editor.SendScintilla( |
150 subStyleStart = editor.SendScintilla( |
148 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength) |
151 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength) |
149 if subStyleStart < 0: |
152 if subStyleStart < 0: |
150 subStyleLength = 0 |
153 subStyleLength = 0 |
151 for subStyleIndex in range(subStyleLength): |
154 for subStyleIndex in range(subStyleLength): |
152 subStyle = subStylesData["SubStyles"][subStyleIndex] |
155 styleNo = subStyleStart + subStyleIndex |
|
156 subStyle = subStylesData[subStyleIndex] |
153 # set the words |
157 # set the words |
154 editor.SendScintilla( |
158 editor.SendScintilla( |
155 editor.SCI_SETIDENTIFIERS, |
159 editor.SCI_SETIDENTIFIERS, |
156 subStyleStart + subStyleIndex, |
160 styleNo, |
157 subStyle["Words"].encode()) |
161 subStyle["Words"].encode()) |
158 |
162 |
159 # set the style |
163 # set the style |
160 styleNo = subStyleStart + subStyleIndex |
|
161 style = subStyle["Style"] |
164 style = subStyle["Style"] |
162 if "fore" in style: |
165 if "fore" in style: |
163 color = QColor( |
166 color = QColor( |
164 style["fore"] >> 16 & 0xff, |
167 style["fore"] >> 16 & 0xff, |
165 style["fore"] >> 8 & 0xff, |
168 style["fore"] >> 8 & 0xff, |
166 style["fore"] & 0xff, |
169 style["fore"] & 0xff, |
167 ) |
170 ) |
168 else: |
171 else: |
169 color = self.color(baseStyleNo) |
172 color = self.color(baseStyleNo) |
170 self.setColor(color, styleNo) |
173 self.setColor(color, styleNo) |
|
174 |
171 if "paper" in style: |
175 if "paper" in style: |
172 color = QColor( |
176 color = QColor( |
173 style["paper"] >> 16 & 0xff, |
177 style["paper"] >> 16 & 0xff, |
174 style["paper"] >> 8 & 0xff, |
178 style["paper"] >> 8 & 0xff, |
175 style["paper"] & 0xff, |
179 style["paper"] & 0xff, |
176 ) |
180 ) |
177 else: |
181 else: |
178 color = self.paper(baseStyleNo) |
182 color = self.paper(baseStyleNo) |
179 self.setPaper(color, styleNo) |
183 self.setPaper(color, styleNo) |
|
184 |
180 if "eolfill" in style: |
185 if "eolfill" in style: |
181 eolFill = style["eolFill"] |
186 eolFill = style["eolFill"] |
182 else: |
187 else: |
183 eolFill = self.eolFill(baseStyleNo) |
188 eolFill = self.eolFill(baseStyleNo) |
184 self.setEolFill(eolFill, styleNo) |
189 self.setEolFill(eolFill, styleNo) |
|
190 |
185 font = self.font(baseStyleNo) |
191 font = self.font(baseStyleNo) |
186 if "font_family" in style: |
192 if "font_family" in style: |
187 font.setFamily(style["font_family"]) |
193 font.setFamily(style["font_family"]) |
188 if "font_size" in style: |
194 if "font_size" in style: |
189 font.setPointSize(style["font_size"]) |
195 font.setPointSize(style["font_size"]) |
197 |
203 |
198 def writeSubstyles(self): |
204 def writeSubstyles(self): |
199 """ |
205 """ |
200 Public method to save the sub-styles. |
206 Public method to save the sub-styles. |
201 """ |
207 """ |
|
208 if not self.__subStylesInitialized: |
|
209 # make sure, the sub-styles have been initialized |
|
210 self.loadSubstyles() |
|
211 |
|
212 settings = Preferences.Prefs.settings |
|
213 |
|
214 for baseStyle in self.baseStyles: |
|
215 key = "Scintilla/{0}/style{1}/SubStyleLength".format( |
|
216 self.language(), baseStyle) |
|
217 settings.setValue(key, len(self.subStyles[baseStyle])) |
|
218 for subStyle in range(len(self.subStyles[baseStyle])): |
|
219 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format( |
|
220 self.language(), baseStyle, subStyle) |
|
221 subStyleData = self.subStyles[baseStyle][subStyle] |
|
222 |
|
223 settings.setValue(baseKey + "Description", |
|
224 subStyleData["Description"]) |
|
225 settings.setValue(baseKey + "Words", |
|
226 subStyleData["Words"]) |
|
227 |
|
228 style = subStyleData["Style"] |
|
229 if "fore" in style: |
|
230 color = style["fore"] |
|
231 else: |
|
232 col = self.color(baseStyle) |
|
233 color = col.red() << 16 | col.green() << 8 | col.blue() |
|
234 settings.setValue(baseKey + "fore", color) |
|
235 if "paper" in style: |
|
236 color = style["paper"] |
|
237 else: |
|
238 col = self.paper(baseStyle) |
|
239 color = col.red() << 16 | col.green() << 8 | col.blue() |
|
240 settings.setValue(baseKey + "paper", color) |
|
241 if "eolfill" in style: |
|
242 eolfill = style["eolfill"] |
|
243 else: |
|
244 eolfill = self.eolFill(baseStyle) |
|
245 settings.setValue(baseKey + "eolfill", eolfill) |
|
246 font = self.font(baseStyle) |
|
247 if "font_family" in style: |
|
248 family = style["font_family"] |
|
249 else: |
|
250 family = font.family() |
|
251 settings.setValue(baseKey + "font_family", family) |
|
252 if "font_size" in style: |
|
253 size = style["font_size"] |
|
254 else: |
|
255 size = font.pointSize() |
|
256 settings.setValue(baseKey + "font_size", size) |
|
257 if "font_bold" in style: |
|
258 bold = style["font_bold"] |
|
259 else: |
|
260 bold = font.bold() |
|
261 settings.setValue(baseKey + "font_bold", bold) |
|
262 if "font_italic" in style: |
|
263 italic = style["font_italic"] |
|
264 else: |
|
265 italic = font.italic() |
|
266 settings.setValue(baseKey + "font_italic", italic) |
|
267 if "font_underline" in style: |
|
268 underline = style["font_underline"] |
|
269 else: |
|
270 underline = font.underline() |
|
271 settings.setValue(baseKey + "font_underline", underline) |
202 |
272 |
203 def hasSubStyles(self): |
273 def hasSubStyles(self): |
204 """ |
274 """ |
205 Public method to indicate the support of sub-styles. |
275 Public method to indicate the support of sub-styles. |
206 |
276 |