src/eric7/QScintilla/Lexers/SubstyledLexer.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9278
36448ca469c2
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
18 18
19 class SubstyledLexer(Lexer): 19 class SubstyledLexer(Lexer):
20 """ 20 """
21 Class to implement the sub-styled lexer mixin class. 21 Class to implement the sub-styled lexer mixin class.
22 """ 22 """
23
23 def __init__(self): 24 def __init__(self):
24 """ 25 """
25 Constructor 26 Constructor
26 """ 27 """
27 super().__init__() 28 super().__init__()
28 29
29 self.baseStyles = [] 30 self.baseStyles = []
30 # list of style numbers, that support sub-styling 31 # list of style numbers, that support sub-styling
31 self.defaultSubStyles = {} 32 self.defaultSubStyles = {}
32 # dictionary with sub-styling data 33 # dictionary with sub-styling data
33 # main key: base style number, value : dict with 34 # main key: base style number, value : dict with
42 # 'font_family': font family (str) 43 # 'font_family': font family (str)
43 # 'font_size: point size (int) 44 # 'font_size: point size (int)
44 # 'font_bold: bold font (bool) 45 # 'font_bold: bold font (bool)
45 # 'font_italic: italic font (bool) 46 # 'font_italic: italic font (bool)
46 # 'font_underline: underlined font (bool) 47 # 'font_underline: underlined font (bool)
47 48
48 self.__subStyles = {} 49 self.__subStyles = {}
49 self.__subStylesInitialized = False 50 self.__subStylesInitialized = False
50 51
51 def loadAllDefaultSubStyles(self): 52 def loadAllDefaultSubStyles(self):
52 """ 53 """
53 Public method to load the default sub-style definitions. 54 Public method to load the default sub-style definitions.
54 """ 55 """
55 self.__subStyles = copy.deepcopy(self.defaultSubStyles) 56 self.__subStyles = copy.deepcopy(self.defaultSubStyles)
56 57
57 self.__subStylesInitialized = True 58 self.__subStylesInitialized = True
58 59
59 def loadDefaultSubStyles(self, style): 60 def loadDefaultSubStyles(self, style):
60 """ 61 """
61 Public method to load the default sub-styles for a given base style. 62 Public method to load the default sub-styles for a given base style.
62 63
63 @param style style number 64 @param style style number
64 @type int 65 @type int
65 """ 66 """
66 if style in self.defaultSubStyles: 67 if style in self.defaultSubStyles:
67 self.__subStyles[style] = copy.deepcopy( 68 self.__subStyles[style] = copy.deepcopy(self.defaultSubStyles[style])
68 self.defaultSubStyles[style]) 69
69
70 def loadSubstyles(self): 70 def loadSubstyles(self):
71 """ 71 """
72 Public method to load the sub-styles from the settings file. 72 Public method to load the sub-styles from the settings file.
73 """ 73 """
74 settings = Preferences.getSettings() 74 settings = Preferences.getSettings()
75 75
76 # Step 1: check if sub-styles were defined and saved 76 # Step 1: check if sub-styles were defined and saved
77 subStylesDefined = False 77 subStylesDefined = False
78 for baseStyle in self.baseStyles: 78 for baseStyle in self.baseStyles:
79 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 79 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
80 self.language(), baseStyle) 80 self.language(), baseStyle
81 )
81 subStylesDefined |= settings.contains(key) 82 subStylesDefined |= settings.contains(key)
82 # Step 2.1: load default sub-styles, if none were defined 83 # Step 2.1: load default sub-styles, if none were defined
83 if not subStylesDefined: 84 if not subStylesDefined:
84 self.loadAllDefaultSubStyles() 85 self.loadAllDefaultSubStyles()
85 86
86 # Step 2.2: load from settings file 87 # Step 2.2: load from settings file
87 else: 88 else:
88 self.__subStyles = {} 89 self.__subStyles = {}
89 for baseStyle in self.baseStyles: 90 for baseStyle in self.baseStyles:
90 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 91 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
91 self.language(), baseStyle) 92 self.language(), baseStyle
93 )
92 if settings.contains(key): 94 if settings.contains(key):
93 subStyleLength = int(settings.value(key)) 95 subStyleLength = int(settings.value(key))
94 if subStyleLength: 96 if subStyleLength:
95 self.__subStyles[baseStyle] = {} 97 self.__subStyles[baseStyle] = {}
96 for subStyle in range(subStyleLength): 98 for subStyle in range(subStyleLength):
98 "Scintilla/{0}/style{1}/substyle{2}/" 100 "Scintilla/{0}/style{1}/substyle{2}/"
99 ).format(self.language(), baseStyle, subStyle) 101 ).format(self.language(), baseStyle, subStyle)
100 if settings.contains(substyleKey + "Description"): 102 if settings.contains(substyleKey + "Description"):
101 subStyleData = {} 103 subStyleData = {}
102 subStyleData["Description"] = settings.value( 104 subStyleData["Description"] = settings.value(
103 substyleKey + "Description", "") 105 substyleKey + "Description", ""
106 )
104 subStyleData["Words"] = settings.value( 107 subStyleData["Words"] = settings.value(
105 substyleKey + "Words", "") 108 substyleKey + "Words", ""
109 )
106 style = {} 110 style = {}
107 111
108 key = substyleKey + "fore" 112 key = substyleKey + "fore"
109 if settings.contains(key): 113 if settings.contains(key):
110 style["fore"] = int(settings.value(key)) 114 style["fore"] = int(settings.value(key))
111 key = substyleKey + "paper" 115 key = substyleKey + "paper"
112 if settings.contains(key): 116 if settings.contains(key):
113 style["paper"] = int(settings.value(key)) 117 style["paper"] = int(settings.value(key))
114 key = substyleKey + "eolfill" 118 key = substyleKey + "eolfill"
115 if settings.contains(key): 119 if settings.contains(key):
116 style["eolfill"] = Preferences.toBool( 120 style["eolfill"] = Preferences.toBool(
117 settings.value(key)) 121 settings.value(key)
122 )
118 key = substyleKey + "font_family" 123 key = substyleKey + "font_family"
119 if settings.contains(key): 124 if settings.contains(key):
120 style["font_family"] = settings.value(key) 125 style["font_family"] = settings.value(key)
121 key = substyleKey + "font_size" 126 key = substyleKey + "font_size"
122 if settings.contains(key): 127 if settings.contains(key):
123 style["font_size"] = ( 128 style["font_size"] = int(settings.value(key))
124 int(settings.value(key))
125 )
126 key = substyleKey + "font_bold" 129 key = substyleKey + "font_bold"
127 if settings.contains(key): 130 if settings.contains(key):
128 style["font_bold"] = Preferences.toBool( 131 style["font_bold"] = Preferences.toBool(
129 settings.value(key)) 132 settings.value(key)
133 )
130 key = substyleKey + "font_italic" 134 key = substyleKey + "font_italic"
131 if settings.contains(key): 135 if settings.contains(key):
132 style["font_italic"] = Preferences.toBool( 136 style["font_italic"] = Preferences.toBool(
133 settings.value(key)) 137 settings.value(key)
138 )
134 key = substyleKey + "font_underline" 139 key = substyleKey + "font_underline"
135 if settings.contains(key): 140 if settings.contains(key):
136 style["font_underline"] = ( 141 style["font_underline"] = Preferences.toBool(
137 Preferences.toBool(settings.value(key)) 142 settings.value(key)
138 ) 143 )
139 144
140 subStyleData["Style"] = style 145 subStyleData["Style"] = style
141 146
142 self.__subStyles[baseStyle][subStyle] = ( 147 self.__subStyles[baseStyle][subStyle] = subStyleData
143 subStyleData 148
144 )
145
146 else: 149 else:
147 # initialize with default 150 # initialize with default
148 self.__subStyles[baseStyle][subStyle] = ( 151 self.__subStyles[baseStyle][subStyle] = copy.deepcopy(
149 copy.deepcopy(self.defaultSubStyles 152 self.defaultSubStyles[baseStyle][subStyle]
150 [baseStyle][subStyle])
151 ) 153 )
152 154
153 self.__subStylesInitialized = True 155 self.__subStylesInitialized = True
154 156
155 def readSubstyles(self, editor): 157 def readSubstyles(self, editor):
156 """ 158 """
157 Public method to load the sub-styles and configure the editor. 159 Public method to load the sub-styles and configure the editor.
158 160
159 @param editor reference to the editor object 161 @param editor reference to the editor object
160 @type QsciScintilla 162 @type QsciScintilla
161 """ 163 """
162 subStyleBasesLength = editor.SendScintilla( 164 subStyleBasesLength = editor.SendScintilla(editor.SCI_GETSUBSTYLEBASES, 0, None)
163 editor.SCI_GETSUBSTYLEBASES, 0, None)
164 if not subStyleBasesLength: 165 if not subStyleBasesLength:
165 # lexer does not support sub-styling 166 # lexer does not support sub-styling
166 return 167 return
167 168
168 self.loadSubstyles() 169 self.loadSubstyles()
169 170
170 # free existing sub-styles first 171 # free existing sub-styles first
171 editor.SendScintilla(editor.SCI_FREESUBSTYLES) 172 editor.SendScintilla(editor.SCI_FREESUBSTYLES)
172 subStyleBases = b"\00" * (subStyleBasesLength + 1) 173 subStyleBases = b"\00" * (subStyleBasesLength + 1)
173 editor.SendScintilla(editor.SCI_GETSUBSTYLEBASES, 0, subStyleBases) 174 editor.SendScintilla(editor.SCI_GETSUBSTYLEBASES, 0, subStyleBases)
174 distanceToSecondary = editor.SendScintilla( 175 distanceToSecondary = editor.SendScintilla(editor.SCI_DISTANCETOSECONDARYSTYLES)
175 editor.SCI_DISTANCETOSECONDARYSTYLES) 176
176
177 subStyleBases = [b for b in bytearray(subStyleBases[:-1])] 177 subStyleBases = [b for b in bytearray(subStyleBases[:-1])]
178 if distanceToSecondary: 178 if distanceToSecondary:
179 subStyleBases.extend(b + distanceToSecondary 179 subStyleBases.extend(b + distanceToSecondary for b in subStyleBases[:])
180 for b in subStyleBases[:])
181 for baseStyleNo in subStyleBases: 180 for baseStyleNo in subStyleBases:
182 if baseStyleNo in self.__subStyles: 181 if baseStyleNo in self.__subStyles:
183 subStylesData = self.__subStyles[baseStyleNo] 182 subStylesData = self.__subStyles[baseStyleNo]
184 subStyleLength = len(subStylesData) 183 subStyleLength = len(subStylesData)
185 subStyleStart = editor.SendScintilla( 184 subStyleStart = editor.SendScintilla(
186 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength) 185 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength
186 )
187 if subStyleStart < 0: 187 if subStyleStart < 0:
188 continue 188 continue
189 189
190 for subStyleIndex, subStyleKey in enumerate( 190 for subStyleIndex, subStyleKey in enumerate(
191 sorted(subStylesData.keys()) 191 sorted(subStylesData.keys())
192 ): 192 ):
193 styleNo = subStyleStart + subStyleIndex 193 styleNo = subStyleStart + subStyleIndex
194 subStyle = subStylesData[subStyleKey] 194 subStyle = subStylesData[subStyleKey]
195 # set the words 195 # set the words
196 editor.SendScintilla( 196 editor.SendScintilla(
197 editor.SCI_SETIDENTIFIERS, 197 editor.SCI_SETIDENTIFIERS, styleNo, subStyle["Words"].encode()
198 styleNo, 198 )
199 subStyle["Words"].encode()) 199
200
201 # set the style 200 # set the style
202 style = subStyle["Style"] 201 style = subStyle["Style"]
203 color = ( 202 color = (
204 QColor( 203 QColor(
205 style["fore"] >> 16 & 0xff, 204 style["fore"] >> 16 & 0xFF,
206 style["fore"] >> 8 & 0xff, 205 style["fore"] >> 8 & 0xFF,
207 style["fore"] & 0xff,) 206 style["fore"] & 0xFF,
208 if "fore" in style else 207 )
209 self.color(baseStyleNo) 208 if "fore" in style
209 else self.color(baseStyleNo)
210 ) 210 )
211 self.setColor(color, styleNo) 211 self.setColor(color, styleNo)
212 212
213 color = ( 213 color = (
214 QColor( 214 QColor(
215 style["paper"] >> 16 & 0xff, 215 style["paper"] >> 16 & 0xFF,
216 style["paper"] >> 8 & 0xff, 216 style["paper"] >> 8 & 0xFF,
217 style["paper"] & 0xff,) 217 style["paper"] & 0xFF,
218 if "paper" in style else 218 )
219 self.paper(baseStyleNo) 219 if "paper" in style
220 else self.paper(baseStyleNo)
220 ) 221 )
221 self.setPaper(color, styleNo) 222 self.setPaper(color, styleNo)
222 223
223 eolFill = ( 224 eolFill = (
224 style["eolfill"] 225 style["eolfill"]
225 if "eolfill" in style else 226 if "eolfill" in style
226 self.eolFill(baseStyleNo) 227 else self.eolFill(baseStyleNo)
227 ) 228 )
228 self.setEolFill(eolFill, styleNo) 229 self.setEolFill(eolFill, styleNo)
229 230
230 font = self.font(baseStyleNo) 231 font = self.font(baseStyleNo)
231 if "font_family" in style: 232 if "font_family" in style:
232 font.setFamily(style["font_family"]) 233 font.setFamily(style["font_family"])
233 if "font_size" in style: 234 if "font_size" in style:
234 font.setPointSize(style["font_size"]) 235 font.setPointSize(style["font_size"])
237 if "font_italic" in style: 238 if "font_italic" in style:
238 font.setItalic(style["font_italic"]) 239 font.setItalic(style["font_italic"])
239 if "font_underline" in style: 240 if "font_underline" in style:
240 font.setUnderline(style["font_underline"]) 241 font.setUnderline(style["font_underline"])
241 self.setFont(font, styleNo) 242 self.setFont(font, styleNo)
242 243
243 def writeSubstyles(self): 244 def writeSubstyles(self):
244 """ 245 """
245 Public method to save the sub-styles. 246 Public method to save the sub-styles.
246 """ 247 """
247 if not self.__subStylesInitialized: 248 if not self.__subStylesInitialized:
248 return 249 return
249 250
250 settings = Preferences.getSettings() 251 settings = Preferences.getSettings()
251 252
252 # Step 1: remove all sub-style definitions first 253 # Step 1: remove all sub-style definitions first
253 for baseStyle in self.baseStyles: 254 for baseStyle in self.baseStyles:
254 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 255 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
255 self.language(), baseStyle) 256 self.language(), baseStyle
257 )
256 if settings.contains(key): 258 if settings.contains(key):
257 subStyleLength = int(settings.value(key)) 259 subStyleLength = int(settings.value(key))
258 if subStyleLength: 260 if subStyleLength:
259 for subStyle in range(subStyleLength): 261 for subStyle in range(subStyleLength):
260 substyleKey = ( 262 substyleKey = ("Scintilla/{0}/style{1}/substyle{2}/").format(
261 "Scintilla/{0}/style{1}/substyle{2}/" 263 self.language(), baseStyle, subStyle
262 ).format(self.language(), baseStyle, subStyle) 264 )
263 settings.remove(substyleKey) 265 settings.remove(substyleKey)
264 266
265 # Step 2: save the defined sub-styles 267 # Step 2: save the defined sub-styles
266 for baseStyle in self.baseStyles: 268 for baseStyle in self.baseStyles:
267 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 269 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
268 self.language(), baseStyle) 270 self.language(), baseStyle
271 )
269 settings.setValue(key, len(self.__subStyles[baseStyle])) 272 settings.setValue(key, len(self.__subStyles[baseStyle]))
270 for subStyleIndex, subStyle in enumerate( 273 for subStyleIndex, subStyle in enumerate(
271 sorted(self.__subStyles[baseStyle].keys()) 274 sorted(self.__subStyles[baseStyle].keys())
272 ): 275 ):
273 substyleKey = "Scintilla/{0}/style{1}/substyle{2}/".format( 276 substyleKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
274 self.language(), baseStyle, subStyleIndex) 277 self.language(), baseStyle, subStyleIndex
278 )
275 subStyleData = self.__subStyles[baseStyle][subStyle] 279 subStyleData = self.__subStyles[baseStyle][subStyle]
276 280
277 if ( 281 if not subStyleData["Description"] and not subStyleData["Words"]:
278 not subStyleData["Description"] and
279 not subStyleData["Words"]
280 ):
281 # invalid or incomplete sub-style definition 282 # invalid or incomplete sub-style definition
282 continue 283 continue
283 284
284 settings.setValue(substyleKey + "Description", 285 settings.setValue(
285 subStyleData["Description"]) 286 substyleKey + "Description", subStyleData["Description"]
286 settings.setValue(substyleKey + "Words", 287 )
287 subStyleData["Words"]) 288 settings.setValue(substyleKey + "Words", subStyleData["Words"])
288 289
289 style = subStyleData["Style"] 290 style = subStyleData["Style"]
290 if "fore" in style: 291 if "fore" in style:
291 color = style["fore"] 292 color = style["fore"]
292 else: 293 else:
293 col = self.color(baseStyle) 294 col = self.color(baseStyle)
310 settings.setValue(substyleKey + "font_bold", bold) 311 settings.setValue(substyleKey + "font_bold", bold)
311 italic = style.get("font_italic", font.italic()) 312 italic = style.get("font_italic", font.italic())
312 settings.setValue(substyleKey + "font_italic", italic) 313 settings.setValue(substyleKey + "font_italic", italic)
313 underline = ( 314 underline = (
314 style["font_underline"] 315 style["font_underline"]
315 if "font_underline" in style else 316 if "font_underline" in style
316 font.underline() 317 else font.underline()
317 ) 318 )
318 settings.setValue(substyleKey + "font_underline", underline) 319 settings.setValue(substyleKey + "font_underline", underline)
319 320
320 def hasSubstyles(self): 321 def hasSubstyles(self):
321 """ 322 """
322 Public method to indicate the support of sub-styles. 323 Public method to indicate the support of sub-styles.
323 324
324 @return flag indicating sub-styling support 325 @return flag indicating sub-styling support
325 @rtype bool 326 @rtype bool
326 """ 327 """
327 return True 328 return True
328 329
329 def getBaseStyles(self): 330 def getBaseStyles(self):
330 """ 331 """
331 Public method to get the list of supported base styles. 332 Public method to get the list of supported base styles.
332 333
333 @return list of base styles 334 @return list of base styles
334 @rtype list of int 335 @rtype list of int
335 """ 336 """
336 return self.baseStyles[:] 337 return self.baseStyles[:]
337 338
338 def substylesCount(self, style): 339 def substylesCount(self, style):
339 """ 340 """
340 Public method to get the number of defined sub-styles. 341 Public method to get the number of defined sub-styles.
341 342
342 @param style base style number 343 @param style base style number
343 @type int 344 @type int
344 @return number of defined sub-styles 345 @return number of defined sub-styles
345 @rtype int 346 @rtype int
346 """ 347 """
347 count = (len(self.__subStyles[style]) if style in self.__subStyles 348 count = len(self.__subStyles[style]) if style in self.__subStyles else 0
348 else 0) 349
349
350 return count 350 return count
351 351
352 def setSubstyleDescription(self, description, style, substyle): 352 def setSubstyleDescription(self, description, style, substyle):
353 """ 353 """
354 Public method to set the description for a sub-style. 354 Public method to set the description for a sub-style.
355 355
356 @param description description to be set 356 @param description description to be set
357 @type str 357 @type str
358 @param style base style number 358 @param style base style number
359 @type int 359 @type int
360 @param substyle sub-style number 360 @param substyle sub-style number
361 @type int 361 @type int
362 """ 362 """
363 if style in self.__subStyles and substyle in self.__subStyles[style]: 363 if style in self.__subStyles and substyle in self.__subStyles[style]:
364 self.__subStyles[style][substyle]["Description"] = ( 364 self.__subStyles[style][substyle]["Description"] = description.strip()
365 description.strip() 365
366 )
367
368 def substyleDescription(self, style, substyle): 366 def substyleDescription(self, style, substyle):
369 """ 367 """
370 Public method to get the description of a sub-style. 368 Public method to get the description of a sub-style.
371 369
372 @param style base style number 370 @param style base style number
373 @type int 371 @type int
374 @param substyle sub-style number 372 @param substyle sub-style number
375 @type int 373 @type int
376 @return sub-style description 374 @return sub-style description
377 @rtype str 375 @rtype str
378 """ 376 """
379 desc = ( 377 desc = (
380 self.__subStyles[style][substyle]["Description"].strip() 378 self.__subStyles[style][substyle]["Description"].strip()
381 if (style in self.__subStyles and 379 if (style in self.__subStyles and substyle in self.__subStyles[style])
382 substyle in self.__subStyles[style]) else 380 else ""
383 ""
384 ) 381 )
385 382
386 return desc 383 return desc
387 384
388 def setSubstyleWords(self, words, style, substyle): 385 def setSubstyleWords(self, words, style, substyle):
389 """ 386 """
390 Public method to set the words for a sub-style. 387 Public method to set the words for a sub-style.
391 388
392 @param words words to be set separated by white-space 389 @param words words to be set separated by white-space
393 @type str 390 @type str
394 @param style base style number 391 @param style base style number
395 @type int 392 @type int
396 @param substyle sub-style number 393 @param substyle sub-style number
397 @type int 394 @type int
398 """ 395 """
399 if style in self.__subStyles and substyle in self.__subStyles[style]: 396 if style in self.__subStyles and substyle in self.__subStyles[style]:
400 self.__subStyles[style][substyle]["Words"] = words.strip() 397 self.__subStyles[style][substyle]["Words"] = words.strip()
401 398
402 def substyleWords(self, style, substyle): 399 def substyleWords(self, style, substyle):
403 """ 400 """
404 Public method to get the words of a sub-style. 401 Public method to get the words of a sub-style.
405 402
406 @param style base style number 403 @param style base style number
407 @type int 404 @type int
408 @param substyle sub-style number 405 @param substyle sub-style number
409 @type int 406 @type int
410 @return white-space separated word list 407 @return white-space separated word list
411 @rtype str 408 @rtype str
412 """ 409 """
413 words = ( 410 words = (
414 self.__subStyles[style][substyle]["Words"].strip() 411 self.__subStyles[style][substyle]["Words"].strip()
415 if (style in self.__subStyles and 412 if (style in self.__subStyles and substyle in self.__subStyles[style])
416 substyle in self.__subStyles[style]) else 413 else ""
417 ""
418 ) 414 )
419 415
420 return words 416 return words
421 417
422 def setSubstyleColor(self, color, style, substyle): 418 def setSubstyleColor(self, color, style, substyle):
423 """ 419 """
424 Public method to set the foreground color of a sub-style. 420 Public method to set the foreground color of a sub-style.
425 421
426 @param color foreground color to be set 422 @param color foreground color to be set
427 @type QColor 423 @type QColor
428 @param style base style number 424 @param style base style number
429 @type int 425 @type int
430 @param substyle sub-style number 426 @param substyle sub-style number
432 """ 428 """
433 if style in self.__subStyles and substyle in self.__subStyles[style]: 429 if style in self.__subStyles and substyle in self.__subStyles[style]:
434 self.__subStyles[style][substyle]["Style"]["fore"] = ( 430 self.__subStyles[style][substyle]["Style"]["fore"] = (
435 color.red() << 16 | color.green() << 8 | color.blue() 431 color.red() << 16 | color.green() << 8 | color.blue()
436 ) 432 )
437 433
438 def substyleColor(self, style, substyle): 434 def substyleColor(self, style, substyle):
439 """ 435 """
440 Public method to get the sub-style foreground color. 436 Public method to get the sub-style foreground color.
441 437
442 @param style base style number 438 @param style base style number
443 @type int 439 @type int
444 @param substyle sub-style number 440 @param substyle sub-style number
445 @type int 441 @type int
446 @return foreground color 442 @return foreground color
447 @rtype QColor 443 @rtype QColor
448 """ 444 """
449 color = self.color(style) 445 color = self.color(style)
450 446
451 if style in self.__subStyles and substyle in self.__subStyles[style]: 447 if style in self.__subStyles and substyle in self.__subStyles[style]:
452 styleData = self.__subStyles[style][substyle]["Style"] 448 styleData = self.__subStyles[style][substyle]["Style"]
453 if "fore" in styleData: 449 if "fore" in styleData:
454 color = QColor( 450 color = QColor(
455 styleData["fore"] >> 16 & 0xff, 451 styleData["fore"] >> 16 & 0xFF,
456 styleData["fore"] >> 8 & 0xff, 452 styleData["fore"] >> 8 & 0xFF,
457 styleData["fore"] & 0xff, 453 styleData["fore"] & 0xFF,
458 ) 454 )
459 455
460 return color 456 return color
461 457
462 def setSubstylePaper(self, color, style, substyle): 458 def setSubstylePaper(self, color, style, substyle):
463 """ 459 """
464 Public method to set the background color of a sub-style. 460 Public method to set the background color of a sub-style.
465 461
466 @param color background color to be set 462 @param color background color to be set
467 @type QColor 463 @type QColor
468 @param style base style number 464 @param style base style number
469 @type int 465 @type int
470 @param substyle sub-style number 466 @param substyle sub-style number
472 """ 468 """
473 if style in self.__subStyles and substyle in self.__subStyles[style]: 469 if style in self.__subStyles and substyle in self.__subStyles[style]:
474 self.__subStyles[style][substyle]["Style"]["paper"] = ( 470 self.__subStyles[style][substyle]["Style"]["paper"] = (
475 color.red() << 16 | color.green() << 8 | color.blue() 471 color.red() << 16 | color.green() << 8 | color.blue()
476 ) 472 )
477 473
478 def substylePaper(self, style, substyle): 474 def substylePaper(self, style, substyle):
479 """ 475 """
480 Public method to get the sub-style background color. 476 Public method to get the sub-style background color.
481 477
482 @param style base style number 478 @param style base style number
483 @type int 479 @type int
484 @param substyle sub-style number 480 @param substyle sub-style number
485 @type int 481 @type int
486 @return background color 482 @return background color
487 @rtype QColor 483 @rtype QColor
488 """ 484 """
489 color = self.paper(style) 485 color = self.paper(style)
490 486
491 if style in self.__subStyles and substyle in self.__subStyles[style]: 487 if style in self.__subStyles and substyle in self.__subStyles[style]:
492 styleData = self.__subStyles[style][substyle]["Style"] 488 styleData = self.__subStyles[style][substyle]["Style"]
493 if "paper" in styleData: 489 if "paper" in styleData:
494 color = QColor( 490 color = QColor(
495 styleData["paper"] >> 16 & 0xff, 491 styleData["paper"] >> 16 & 0xFF,
496 styleData["paper"] >> 8 & 0xff, 492 styleData["paper"] >> 8 & 0xFF,
497 styleData["paper"] & 0xff, 493 styleData["paper"] & 0xFF,
498 ) 494 )
499 495
500 return color 496 return color
501 497
502 def setSubstyleEolFill(self, eolFill, style, substyle): 498 def setSubstyleEolFill(self, eolFill, style, substyle):
503 """ 499 """
504 Public method to set the eolfill flag of a sub-style. 500 Public method to set the eolfill flag of a sub-style.
505 501
506 @param eolFill eolfill flag to be set 502 @param eolFill eolfill flag to be set
507 @type bool 503 @type bool
508 @param style base style number 504 @param style base style number
509 @type int 505 @type int
510 @param substyle sub-style number 506 @param substyle sub-style number
511 @type int 507 @type int
512 """ 508 """
513 if style in self.__subStyles and substyle in self.__subStyles[style]: 509 if style in self.__subStyles and substyle in self.__subStyles[style]:
514 self.__subStyles[style][substyle]["Style"]["eolfill"] = ( 510 self.__subStyles[style][substyle]["Style"]["eolfill"] = eolFill
515 eolFill 511
516 )
517
518 def substyleEolFill(self, style, substyle): 512 def substyleEolFill(self, style, substyle):
519 """ 513 """
520 Public method to get the eolfill flag. 514 Public method to get the eolfill flag.
521 515
522 @param style base style number 516 @param style base style number
523 @type int 517 @type int
524 @param substyle sub-style number 518 @param substyle sub-style number
525 @type int 519 @type int
526 @return eolfill flag 520 @return eolfill flag
527 @rtype bool 521 @rtype bool
528 """ 522 """
529 eolFill = self.eolFill(style) 523 eolFill = self.eolFill(style)
530 524
531 if style in self.__subStyles and substyle in self.__subStyles[style]: 525 if style in self.__subStyles and substyle in self.__subStyles[style]:
532 styleData = self.__subStyles[style][substyle]["Style"] 526 styleData = self.__subStyles[style][substyle]["Style"]
533 eolFill = styleData.get("eolfill", self.eolFill(style)) 527 eolFill = styleData.get("eolfill", self.eolFill(style))
534 528
535 return eolFill 529 return eolFill
536 530
537 def setSubstyleFont(self, font, style, substyle): 531 def setSubstyleFont(self, font, style, substyle):
538 """ 532 """
539 Public method to set the font of a sub-style. 533 Public method to set the font of a sub-style.
540 534
541 @param font font to be set 535 @param font font to be set
542 @type QFont 536 @type QFont
543 @param style base style number 537 @param style base style number
544 @type int 538 @type int
545 @param substyle sub-style number 539 @param substyle sub-style number
546 @type int 540 @type int
547 """ 541 """
548 if style in self.__subStyles and substyle in self.__subStyles[style]: 542 if style in self.__subStyles and substyle in self.__subStyles[style]:
549 self.__subStyles[style][substyle]["Style"]["font_family"] = ( 543 self.__subStyles[style][substyle]["Style"]["font_family"] = font.family()
550 font.family() 544 self.__subStyles[style][substyle]["Style"]["font_size"] = font.pointSize()
551 ) 545 self.__subStyles[style][substyle]["Style"]["font_bold"] = font.bold()
552 self.__subStyles[style][substyle]["Style"]["font_size"] = ( 546 self.__subStyles[style][substyle]["Style"]["font_italic"] = font.italic()
553 font.pointSize() 547 self.__subStyles[style][substyle]["Style"][
554 ) 548 "font_underline"
555 self.__subStyles[style][substyle]["Style"]["font_bold"] = ( 549 ] = font.underline()
556 font.bold() 550
557 )
558 self.__subStyles[style][substyle]["Style"]["font_italic"] = (
559 font.italic()
560 )
561 self.__subStyles[style][substyle]["Style"]["font_underline"] = (
562 font.underline()
563 )
564
565 def substyleFont(self, style, substyle): 551 def substyleFont(self, style, substyle):
566 """ 552 """
567 Public method to get the sub-style font. 553 Public method to get the sub-style font.
568 554
569 @param style base style number 555 @param style base style number
570 @type int 556 @type int
571 @param substyle sub-style number 557 @param substyle sub-style number
572 @type int 558 @type int
573 @return font 559 @return font
574 @rtype QFont 560 @rtype QFont
575 """ 561 """
576 font = self.font(style) 562 font = self.font(style)
577 563
578 if style in self.__subStyles and substyle in self.__subStyles[style]: 564 if style in self.__subStyles and substyle in self.__subStyles[style]:
579 styleData = self.__subStyles[style][substyle]["Style"] 565 styleData = self.__subStyles[style][substyle]["Style"]
580 if "font_family" in styleData: 566 if "font_family" in styleData:
581 font.setFamily(styleData["font_family"]) 567 font.setFamily(styleData["font_family"])
582 if "font_size" in styleData: 568 if "font_size" in styleData:
585 font.setBold(styleData["font_bold"]) 571 font.setBold(styleData["font_bold"])
586 if "font_italic" in styleData: 572 if "font_italic" in styleData:
587 font.setItalic(styleData["font_italic"]) 573 font.setItalic(styleData["font_italic"])
588 if "font_underline" in styleData: 574 if "font_underline" in styleData:
589 font.setUnderline(styleData["font_underline"]) 575 font.setUnderline(styleData["font_underline"])
590 576
591 return font 577 return font
592 578
593 def substyleDefaultDescription(self, style, substyle): 579 def substyleDefaultDescription(self, style, substyle):
594 """ 580 """
595 Public method to get the default description of a sub-style. 581 Public method to get the default description of a sub-style.
596 582
597 @param style base style number 583 @param style base style number
598 @type int 584 @type int
599 @param substyle sub-style number 585 @param substyle sub-style number
600 @type int 586 @type int
601 @return sub-style default description 587 @return sub-style default description
602 @rtype str 588 @rtype str
603 """ 589 """
604 description = "" 590 description = ""
605 591
606 if ( 592 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
607 style in self.defaultSubStyles and
608 substyle in self.defaultSubStyles[style]
609 ):
610 substyleData = self.defaultSubStyles[style][substyle] 593 substyleData = self.defaultSubStyles[style][substyle]
611 description = substyleData["Description"].strip() 594 description = substyleData["Description"].strip()
612 595
613 return description 596 return description
614 597
615 def substyleDefaultWords(self, style, substyle): 598 def substyleDefaultWords(self, style, substyle):
616 """ 599 """
617 Public method to get the default words of a sub-style. 600 Public method to get the default words of a sub-style.
618 601
619 @param style base style number 602 @param style base style number
620 @type int 603 @type int
621 @param substyle sub-style number 604 @param substyle sub-style number
622 @type int 605 @type int
623 @return white-space separated default word list 606 @return white-space separated default word list
624 @rtype str 607 @rtype str
625 """ 608 """
626 words = "" 609 words = ""
627 610
628 if ( 611 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
629 style in self.defaultSubStyles and
630 substyle in self.defaultSubStyles[style]
631 ):
632 substyleData = self.defaultSubStyles[style][substyle] 612 substyleData = self.defaultSubStyles[style][substyle]
633 words = substyleData["Words"].strip() 613 words = substyleData["Words"].strip()
634 614
635 return words 615 return words
636 616
637 def substyleDefaultColor(self, style, substyle): 617 def substyleDefaultColor(self, style, substyle):
638 """ 618 """
639 Public method to get the sub-style default foreground color. 619 Public method to get the sub-style default foreground color.
640 620
641 @param style base style number 621 @param style base style number
642 @type int 622 @type int
643 @param substyle sub-style number 623 @param substyle sub-style number
644 @type int 624 @type int
645 @return default foreground color 625 @return default foreground color
646 @rtype QColor 626 @rtype QColor
647 """ 627 """
648 color = self.defaultColor(style) 628 color = self.defaultColor(style)
649 629
650 if ( 630 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
651 style in self.defaultSubStyles and
652 substyle in self.defaultSubStyles[style]
653 ):
654 styleData = self.defaultSubStyles[style][substyle]["Style"] 631 styleData = self.defaultSubStyles[style][substyle]["Style"]
655 if "fore" in styleData: 632 if "fore" in styleData:
656 color = QColor( 633 color = QColor(
657 styleData["fore"] >> 16 & 0xff, 634 styleData["fore"] >> 16 & 0xFF,
658 styleData["fore"] >> 8 & 0xff, 635 styleData["fore"] >> 8 & 0xFF,
659 styleData["fore"] & 0xff, 636 styleData["fore"] & 0xFF,
660 ) 637 )
661 638
662 return color 639 return color
663 640
664 def substyleDefaultPaper(self, style, substyle): 641 def substyleDefaultPaper(self, style, substyle):
665 """ 642 """
666 Public method to get the sub-style default background color. 643 Public method to get the sub-style default background color.
667 644
668 @param style base style number 645 @param style base style number
669 @type int 646 @type int
670 @param substyle sub-style number 647 @param substyle sub-style number
671 @type int 648 @type int
672 @return default background color 649 @return default background color
673 @rtype QColor 650 @rtype QColor
674 """ 651 """
675 color = self.defaultPaper(style) 652 color = self.defaultPaper(style)
676 653
677 if ( 654 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
678 style in self.defaultSubStyles and
679 substyle in self.defaultSubStyles[style]
680 ):
681 styleData = self.defaultSubStyles[style][substyle]["Style"] 655 styleData = self.defaultSubStyles[style][substyle]["Style"]
682 if "paper" in styleData: 656 if "paper" in styleData:
683 color = QColor( 657 color = QColor(
684 styleData["paper"] >> 16 & 0xff, 658 styleData["paper"] >> 16 & 0xFF,
685 styleData["paper"] >> 8 & 0xff, 659 styleData["paper"] >> 8 & 0xFF,
686 styleData["paper"] & 0xff, 660 styleData["paper"] & 0xFF,
687 ) 661 )
688 662
689 return color 663 return color
690 664
691 def substyleDefaultEolFill(self, style, substyle): 665 def substyleDefaultEolFill(self, style, substyle):
692 """ 666 """
693 Public method to get the default eolfill flag. 667 Public method to get the default eolfill flag.
694 668
695 @param style base style number 669 @param style base style number
696 @type int 670 @type int
697 @param substyle sub-style number 671 @param substyle sub-style number
698 @type int 672 @type int
699 @return default eolfill flag 673 @return default eolfill flag
700 @rtype bool 674 @rtype bool
701 """ 675 """
702 eolFill = self.defaultEolFill(style) 676 eolFill = self.defaultEolFill(style)
703 677
704 if ( 678 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
705 style in self.defaultSubStyles and
706 substyle in self.defaultSubStyles[style]
707 ):
708 styleData = self.defaultSubStyles[style][substyle]["Style"] 679 styleData = self.defaultSubStyles[style][substyle]["Style"]
709 eolFill = styleData.get("eolfill", self.defaultEolFill(style)) 680 eolFill = styleData.get("eolfill", self.defaultEolFill(style))
710 681
711 return eolFill 682 return eolFill
712 683
713 def substyleDefaultFont(self, style, substyle): 684 def substyleDefaultFont(self, style, substyle):
714 """ 685 """
715 Public method to get the default sub-style font. 686 Public method to get the default sub-style font.
716 687
717 @param style base style number 688 @param style base style number
718 @type int 689 @type int
719 @param substyle sub-style number 690 @param substyle sub-style number
720 @type int 691 @type int
721 @return default font 692 @return default font
722 @rtype QFont 693 @rtype QFont
723 """ 694 """
724 font = self.defaultFont(style) 695 font = self.defaultFont(style)
725 696
726 if ( 697 if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
727 style in self.defaultSubStyles and
728 substyle in self.defaultSubStyles[style]
729 ):
730 styleData = self.defaultSubStyles[style][substyle]["Style"] 698 styleData = self.defaultSubStyles[style][substyle]["Style"]
731 if "font_family" in styleData: 699 if "font_family" in styleData:
732 font.setFamily(styleData["font_family"]) 700 font.setFamily(styleData["font_family"])
733 if "font_size" in styleData: 701 if "font_size" in styleData:
734 font.setPointSize(styleData["font_size"]) 702 font.setPointSize(styleData["font_size"])
736 font.setBold(styleData["font_bold"]) 704 font.setBold(styleData["font_bold"])
737 if "font_italic" in styleData: 705 if "font_italic" in styleData:
738 font.setItalic(styleData["font_italic"]) 706 font.setItalic(styleData["font_italic"])
739 if "font_underline" in styleData: 707 if "font_underline" in styleData:
740 font.setUnderline(styleData["font_underline"]) 708 font.setUnderline(styleData["font_underline"])
741 709
742 return font 710 return font
743 711
744 def addSubstyle(self, style): 712 def addSubstyle(self, style):
745 """ 713 """
746 Public method to add an empty sub-style to a given base style. 714 Public method to add an empty sub-style to a given base style.
747 715
748 @param style base style number 716 @param style base style number
749 @type int 717 @type int
750 @return allocated sub-style number or -1 to indicate an error 718 @return allocated sub-style number or -1 to indicate an error
751 @rtype int 719 @rtype int
752 """ 720 """
758 "Words": "", 726 "Words": "",
759 "Style": {}, 727 "Style": {},
760 } 728 }
761 else: 729 else:
762 subStyle = -1 730 subStyle = -1
763 731
764 return subStyle 732 return subStyle
765 733
766 def delSubstyle(self, style, substyle): 734 def delSubstyle(self, style, substyle):
767 """ 735 """
768 Public method to delete a given sub-style definition. 736 Public method to delete a given sub-style definition.
769 737
770 @param style base style number 738 @param style base style number
771 @type int 739 @type int
772 @param substyle sub-style number 740 @param substyle sub-style number
773 @type int 741 @type int
774 @return flag indicating successful deletion 742 @return flag indicating successful deletion
775 @rtype bool 743 @rtype bool
776 """ 744 """
777 ok = False 745 ok = False
778 746
779 if style in self.__subStyles and substyle in self.__subStyles[style]: 747 if style in self.__subStyles and substyle in self.__subStyles[style]:
780 del self.__subStyles[style][substyle] 748 del self.__subStyles[style][substyle]
781 ok = True 749 ok = True
782 750
783 return ok 751 return ok
784 752
785 def hasSubstyle(self, style, substyle): 753 def hasSubstyle(self, style, substyle):
786 """ 754 """
787 Public method to test for a given sub-style definition. 755 Public method to test for a given sub-style definition.
788 756
789 @param style base style number 757 @param style base style number
790 @type int 758 @type int
791 @param substyle sub-style number 759 @param substyle sub-style number
792 @type int 760 @type int
793 @return flag indicating the existence of a sub-style definition 761 @return flag indicating the existence of a sub-style definition
794 @rtype bool 762 @rtype bool
795 """ 763 """
796 return (style in self.__subStyles and 764 return style in self.__subStyles and substyle in self.__subStyles[style]
797 substyle in self.__subStyles[style]) 765
798
799 def isBaseStyle(self, style): 766 def isBaseStyle(self, style):
800 """ 767 """
801 Public method to test, if a given style may have sub-styles. 768 Public method to test, if a given style may have sub-styles.
802 769
803 @param style base style number 770 @param style base style number
804 @type int 771 @type int
805 @return flag indicating that the style may have sub-styles 772 @return flag indicating that the style may have sub-styles
806 @rtype bool 773 @rtype bool
807 """ 774 """

eric ide

mercurial