QScintilla/Lexers/SubstyledLexer.py

branch
sub_styles
changeset 6855
4d80c8cc99a1
parent 6846
6ca9ef2c0907
child 6856
cdf13841603c
equal deleted inserted replaced
6854:f4dd76230eea 6855:4d80c8cc99a1
26 """ 26 """
27 Constructor 27 Constructor
28 """ 28 """
29 super(SubstyledLexer, self).__init__() 29 super(SubstyledLexer, self).__init__()
30 30
31 self.baseStyles = [] # list of style numbers, that support 31 self.baseStyles = []
32 # sub-styling 32 # list of style numbers, that support 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 : list of dict with 35 # main key: base style number, value : dict with
36 # 'Description': string containing a short description 36 # key: sub-style number, value: dict with
37 # 'Words': string of whitespace separated words to be styled 37 # 'Description': string containing a short description
38 # 'Style': dictionary with styling data (only difference to the 38 # 'Words': string of whitespace separated words to be styled
39 # base style is required 39 # 'Style': dictionary with styling data (only difference to
40 # 'fore': foreground color (int containing RGB values) 40 # the base style is required
41 # 'paper': background color (int containing RGB values) 41 # 'fore': foreground color (int containing RGB values)
42 # 'eolfill': fill to eol (bool) 42 # 'paper': background color (int containing RGB values)
43 # 'font_family': font family (str) 43 # 'eolfill': fill to eol (bool)
44 # 'font_size: point size (int) 44 # 'font_family': font family (str)
45 # 'font_bold: bold font (bool) 45 # 'font_size: point size (int)
46 # 'font_italic: italic font (bool) 46 # 'font_bold: bold font (bool)
47 # 'font_underline: underlined font (bool) 47 # 'font_italic: italic font (bool)
48 48 # 'font_underline: underlined font (bool)
49 self.subStyles = {} 49
50 self.__subStyles = {}
50 self.__subStylesInitialized = False 51 self.__subStylesInitialized = False
51 52
52 def loadSubstyles(self): 53 def loadSubstyles(self):
53 """ 54 """
54 Public method to load the sub-styles from the settings file 55 Public method to load the sub-styles from the settings file
60 for baseStyle in self.baseStyles: 61 for baseStyle in self.baseStyles:
61 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 62 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
62 self.language(), baseStyle) 63 self.language(), baseStyle)
63 if settings.contains(key): 64 if settings.contains(key):
64 subStyleLength = int(settings.value(key), 0) 65 subStyleLength = int(settings.value(key), 0)
65 self.subStyles[baseStyle] = {} 66 self.__subStyles[baseStyle] = {}
66 if subStyleLength: 67 if subStyleLength:
67 self.subStyles[baseStyle] = [] 68 self.__subStyles[baseStyle] = []
68 for subStyle in range(subStyleLength): 69 for subStyle in range(subStyleLength):
69 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format( 70 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
70 self.language(), baseStyle, subStyle) 71 self.language(), baseStyle, subStyle)
71 if settings.contains(baseKey): 72 if settings.contains(baseKey):
72 subStyleData = {} 73 subStyleData = {}
105 style["font_underline"] = Preferences.toBool( 106 style["font_underline"] = Preferences.toBool(
106 settings.value(key)) 107 settings.value(key))
107 108
108 subStyleData["Style"] = style 109 subStyleData["Style"] = style
109 110
110 self.subStyles[baseStyle].append(subStyleData) 111 self.__subStyles[baseStyle][subStyle] = \
112 subStyleData
111 113
112 self.__subStylesInitialized = True 114 self.__subStylesInitialized = True
113 115
114 def loadDefaultSubStyles(self): 116 def loadDefaultSubStyles(self):
115 """ 117 """
116 Public method to load the default sub-style definitions. 118 Public method to load the default sub-style definitions.
117 """ 119 """
118 self.subStyles = copy.deepcopy(self.defaultSubStyles) 120 self.__subStyles = copy.deepcopy(self.defaultSubStyles)
119 121
120 def readSubstyles(self, editor): 122 def readSubstyles(self, editor):
121 """ 123 """
122 Public method to load the sub-styles and configure the editor. 124 Public method to load the sub-styles and configure the editor.
123 125
142 subStyleBases = [b for b in bytearray(subStyleBases[:-1])] 144 subStyleBases = [b for b in bytearray(subStyleBases[:-1])]
143 if distanceToSecondary: 145 if distanceToSecondary:
144 subStyleBases.extend(b + distanceToSecondary 146 subStyleBases.extend(b + distanceToSecondary
145 for b in subStyleBases[:]) 147 for b in subStyleBases[:])
146 for baseStyleNo in subStyleBases: 148 for baseStyleNo in subStyleBases:
147 if baseStyleNo in self.subStyles: 149 if baseStyleNo in self.__subStyles:
148 subStylesData = self.subStyles[baseStyleNo] 150 subStylesData = self.__subStyles[baseStyleNo]
149 subStyleLength = len(subStylesData) 151 subStyleLength = len(subStylesData)
150 subStyleStart = editor.SendScintilla( 152 subStyleStart = editor.SendScintilla(
151 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength) 153 editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength)
152 if subStyleStart < 0: 154 if subStyleStart < 0:
153 subStyleLength = 0 155 subStyleLength = 0
181 else: 183 else:
182 color = self.paper(baseStyleNo) 184 color = self.paper(baseStyleNo)
183 self.setPaper(color, styleNo) 185 self.setPaper(color, styleNo)
184 186
185 if "eolfill" in style: 187 if "eolfill" in style:
186 eolFill = style["eolFill"] 188 eolFill = style["eolfill"]
187 else: 189 else:
188 eolFill = self.eolFill(baseStyleNo) 190 eolFill = self.eolFill(baseStyleNo)
189 self.setEolFill(eolFill, styleNo) 191 self.setEolFill(eolFill, styleNo)
190 192
191 font = self.font(baseStyleNo) 193 font = self.font(baseStyleNo)
212 settings = Preferences.Prefs.settings 214 settings = Preferences.Prefs.settings
213 215
214 for baseStyle in self.baseStyles: 216 for baseStyle in self.baseStyles:
215 key = "Scintilla/{0}/style{1}/SubStyleLength".format( 217 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
216 self.language(), baseStyle) 218 self.language(), baseStyle)
217 settings.setValue(key, len(self.subStyles[baseStyle])) 219 settings.setValue(key, len(self.__subStyles[baseStyle]))
218 for subStyle in range(len(self.subStyles[baseStyle])): 220 for subStyle in self.__subStyles[baseStyle]:
219 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format( 221 baseKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
220 self.language(), baseStyle, subStyle) 222 self.language(), baseStyle, subStyle)
221 subStyleData = self.subStyles[baseStyle][subStyle] 223 subStyleData = self.__subStyles[baseStyle][subStyle]
222 224
223 settings.setValue(baseKey + "Description", 225 settings.setValue(baseKey + "Description",
224 subStyleData["Description"]) 226 subStyleData["Description"])
225 settings.setValue(baseKey + "Words", 227 settings.setValue(baseKey + "Words",
226 subStyleData["Words"]) 228 subStyleData["Words"])
277 @return flag indicating sub-styling support 279 @return flag indicating sub-styling support
278 @rtype bool 280 @rtype bool
279 """ 281 """
280 return True 282 return True
281 283
284 def getBaseStyles(self):
285 """
286 Public method to get the list of supported base styles.
287
288 @return list of base styles
289 @rtype list of int
290 """
291 return self.baseStyles[:]
292
293 def substylesCount(self, style):
294 """
295 Public method to get the number of defined sub-styles.
296
297 @return number of defined sub-styles
298 @rtype int
299 """
300 if style in self.__subStyles:
301 count = len(self.__subStyles[style])
302 else:
303 count = 0
304
305 return count
306
282 def setSubstyleDescription(self, description, style, substyle): 307 def setSubstyleDescription(self, description, style, substyle):
283 """ 308 """
284 309 Public method to set the description for a sub-style.
285 """ 310
311 @param description description to be set
312 @type str
313 @param style base style number
314 @type int
315 @param substyle sub-style number
316 @type int
317 """
318 if style in self.__subStyles and substyle in self.__subStyles[style]:
319 self.__subStyles[style][substyle]["Description"] = description
286 320
287 def substyleDescription(self, style, substyle): 321 def substyleDescription(self, style, substyle):
288 """ 322 """
289 323 Public method to get the description of a sub-style.
290 """ 324
325 @param style base style number
326 @type int
327 @param substyle sub-style number
328 @type int
329 @return sub-style description
330 @rtype str
331 """
332 if style in self.__subStyles and substyle in self.__subStyles[style]:
333 desc = self.__subStyles[style][substyle]["Description"]
334 else:
335 desc = ""
336
337 return desc
338
339 def setSubstyleWords(self, words, style, substyle):
340 """
341 Public method to set the words for a sub-style.
342
343 @param words words to be set separated by white-space
344 @type str
345 @param style base style number
346 @type int
347 @param substyle sub-style number
348 @type int
349 """
350 if style in self.__subStyles and substyle in self.__subStyles[style]:
351 self.__subStyles[style][substyle]["Words"] = words
352
353 def substyleWords(self, style, substyle):
354 """
355 Public method to get the words of a sub-style.
356
357 @param style base style number
358 @type int
359 @param substyle sub-style number
360 @type int
361 @return white-space separated word list
362 @rtype str
363 """
364 if style in self.__subStyles and substyle in self.__subStyles[style]:
365 words = self.__subStyles[style][substyle]["Words"]
366 else:
367 words = ""
368
369 return words
291 370
292 def setSubstyleColor(self, color, style, substyle): 371 def setSubstyleColor(self, color, style, substyle):
293 """ 372 """
294 373 Public method to set the foreground color of a sub-style.
295 """ 374
375 @param color foreground color to be set
376 @type QColor
377 @param style base style number
378 @type int
379 @param substyle sub-style number
380 @type int
381 """
382 if style in self.__subStyles and substyle in self.__subStyles[style]:
383 self.__subStyles[style][substyle]["Style"]["fore"] = \
384 color.red() << 16 | color.green() << 8 | color.blue()
296 385
297 def substyleColor(self, style, substyle): 386 def substyleColor(self, style, substyle):
298 """ 387 """
299 388 Public method to get the sub-style foreground color.
300 """ 389
390 @param style base style number
391 @type int
392 @param substyle sub-style number
393 @type int
394 @return foreground color
395 @rtype QColor
396 """
397 color = self.color(style)
398
399 if style in self.__subStyles and substyle in self.__subStyles[style]:
400 styleData = self.__subStyles[style][substyle]["Style"]
401 if "fore" in styleData:
402 color = QColor(
403 styleData["fore"] >> 16 & 0xff,
404 styleData["fore"] >> 8 & 0xff,
405 styleData["fore"] & 0xff,
406 )
407
408 return color
301 409
302 def setSubstylePaper(self, color, style, substyle): 410 def setSubstylePaper(self, color, style, substyle):
303 """ 411 """
304 412 Public method to set the background color of a sub-style.
305 """ 413
414 @param color background color to be set
415 @type QColor
416 @param style base style number
417 @type int
418 @param substyle sub-style number
419 @type int
420 """
421 if style in self.__subStyles and substyle in self.__subStyles[style]:
422 self.__subStyles[style][substyle]["Style"]["paper"] = \
423 color.red() << 16 | color.green() << 8 | color.blue()
306 424
307 def substylePaper(self, style, substyle): 425 def substylePaper(self, style, substyle):
308 """ 426 """
309 427 Public method to get the sub-style background color.
310 """ 428
429 @param style base style number
430 @type int
431 @param substyle sub-style number
432 @type int
433 @return background color
434 @rtype QColor
435 """
436 color = self.paper(style)
437
438 if style in self.__subStyles and substyle in self.__subStyles[style]:
439 styleData = self.__subStyles[style][substyle]["Style"]
440 if "paper" in styleData:
441 color = QColor(
442 styleData["paper"] >> 16 & 0xff,
443 styleData["paper"] >> 8 & 0xff,
444 styleData["paper"] & 0xff,
445 )
446
447 return color
311 448
312 def setSubstyleEolFill(self, eolFill, style, substyle): 449 def setSubstyleEolFill(self, eolFill, style, substyle):
313 """ 450 """
314 451 Public method to set the eolfill flag of a sub-style.
315 """ 452
453 @param eolFill eolfill flag to be set
454 @type bool
455 @param style base style number
456 @type int
457 @param substyle sub-style number
458 @type int
459 """
460 if style in self.__subStyles and substyle in self.__subStyles[style]:
461 self.__subStyles[style][substyle]["Style"]["eolfill"] = \
462 eolFill
316 463
317 def substyleEolFill(self, style, substyle): 464 def substyleEolFill(self, style, substyle):
318 """ 465 """
319 466 Public method to get the eolfill flag.
320 """ 467
468 @param style base style number
469 @type int
470 @param substyle sub-style number
471 @type int
472 @return eolfill flag
473 @rtype bool
474 """
475 eolFill = self.eolFill(style)
476
477 if style in self.__subStyles and substyle in self.__subStyles[style]:
478 styleData = self.__subStyles[style][substyle]["Style"]
479 if "eolfill" in styleData:
480 eolFill = styleData["eolfill"]
481
482 return eolFill
321 483
322 def setSubstyleFont(self, font, style, substyle): 484 def setSubstyleFont(self, font, style, substyle):
323 """ 485 """
324 486 Public method to set the font of a sub-style.
325 """ 487
488 @param font font to be set
489 @type QFont
490 @param style base style number
491 @type int
492 @param substyle sub-style number
493 @type int
494 """
495 if style in self.__subStyles and substyle in self.__subStyles[style]:
496 self.__subStyles[style][substyle]["Style"]["font_family"] = \
497 font.family()
498 self.__subStyles[style][substyle]["Style"]["font_size"] = \
499 font.pointSize()
500 self.__subStyles[style][substyle]["Style"]["font_bold"] = \
501 font.bold()
502 self.__subStyles[style][substyle]["Style"]["font_italic"] = \
503 font.italic()
504 self.__subStyles[style][substyle]["Style"]["font_underline"] = \
505 font.underline()
326 506
327 def substyleFont(self, style, substyle): 507 def substyleFont(self, style, substyle):
328 """ 508 """
329 509 Public method to get the sub-style font.
330 """ 510
511 @param style base style number
512 @type int
513 @param substyle sub-style number
514 @type int
515 @return font
516 @rtype QFont
517 """
518 font = self.font(style)
519
520 if style in self.__subStyles and substyle in self.__subStyles[style]:
521 styleData = self.__subStyles[style][substyle]["Style"]
522 if "font_family" in styleData:
523 font.setFamily(styleData["font_family"])
524 if "font_size" in styleData:
525 font.setPointSize(styleData["font_size"])
526 if "font_bold" in styleData:
527 font.setBold(styleData["font_bold"])
528 if "font_italic" in styleData:
529 font.setItalic(styleData["font_italic"])
530 if "font_underline" in styleData:
531 font.setUnderline(styleData["font_underline"])
532
533 return font
331 534
332 def substyleDefaultDescription(self, style, substyle): 535 def substyleDefaultDescription(self, style, substyle):
333 """ 536 """
334 537 Public method to get the default description of a sub-style.
335 """ 538
539 @param style base style number
540 @type int
541 @param substyle sub-style number
542 @type int
543 @return sub-style default description
544 @rtype str
545 """
546 description = ""
547
548 if style in self.defaultSubStyles and \
549 substyle in self.defaultSubStyles[style]:
550 styleData = self.defaultSubStyles[style][substyle]["Style"]
551 description = styleData["Description"]
552
553 return description
554
555 def substyleDefaultWords(self, style, substyle):
556 """
557 Public method to get the default words of a sub-style.
558
559 @param style base style number
560 @type int
561 @param substyle sub-style number
562 @type int
563 @return white-space separated default word list
564 @rtype str
565 """
566 words = ""
567
568 if style in self.defaultSubStyles and \
569 substyle in self.defaultSubStyles[style]:
570 styleData = self.defaultSubStyles[style][substyle]["Style"]
571 words = styleData["Words"]
572
573 return words
336 574
337 def substyleDefaultColor(self, style, substyle): 575 def substyleDefaultColor(self, style, substyle):
338 """ 576 """
339 577 Public method to get the sub-style default foreground color.
340 """ 578
579 @param style base style number
580 @type int
581 @param substyle sub-style number
582 @type int
583 @return default foreground color
584 @rtype QColor
585 """
586 color = self.defaultColor(style)
587
588 if style in self.defaultSubStyles and \
589 substyle in self.defaultSubStyles[style]:
590 styleData = self.defaultSubStyles[style][substyle]["Style"]
591 if "fore" in styleData:
592 color = QColor(
593 styleData["fore"] >> 16 & 0xff,
594 styleData["fore"] >> 8 & 0xff,
595 styleData["fore"] & 0xff,
596 )
597
598 return color
341 599
342 def substyleDefaultPaper(self, style, substyle): 600 def substyleDefaultPaper(self, style, substyle):
343 """ 601 """
344 602 Public method to get the sub-style default background color.
345 """ 603
604 @param style base style number
605 @type int
606 @param substyle sub-style number
607 @type int
608 @return default background color
609 @rtype QColor
610 """
611 color = self.defaultPaper(style)
612
613 if style in self.defaultSubStyles and \
614 substyle in self.defaultSubStyles[style]:
615 styleData = self.defaultSubStyles[style][substyle]["Style"]
616 if "paper" in styleData:
617 color = QColor(
618 styleData["paper"] >> 16 & 0xff,
619 styleData["paper"] >> 8 & 0xff,
620 styleData["paper"] & 0xff,
621 )
622
623 return color
346 624
347 def substyleDefaultEolFill(self, style, substyle): 625 def substyleDefaultEolFill(self, style, substyle):
348 """ 626 """
349 627 Public method to get the default eolfill flag.
350 """ 628
629 @param style base style number
630 @type int
631 @param substyle sub-style number
632 @type int
633 @return default eolfill flag
634 @rtype bool
635 """
636 eolFill = self.defaultEolFill(style)
637
638 if style in self.defaultSubStyles and \
639 substyle in self.defaultSubStyles[style]:
640 styleData = self.defaultSubStyles[style][substyle]["Style"]
641 if "eolfill" in styleData:
642 eolFill = styleData["eolfill"]
643
644 return eolFill
351 645
352 def substyleDefaultFont(self, style, substyle): 646 def substyleDefaultFont(self, style, substyle):
353 """ 647 """
354 648 Public method to get the default sub-style font.
355 """ 649
650 @param style base style number
651 @type int
652 @param substyle sub-style number
653 @type int
654 @return default font
655 @rtype QFont
656 """
657 font = self.defaultFont(style)
658
659 if style in self.defaultSubStyles and \
660 substyle in self.defaultSubStyles[style]:
661 styleData = self.defaultSubStyles[style][substyle]["Style"]
662 if "font_family" in styleData:
663 font.setFamily(styleData["font_family"])
664 if "font_size" in styleData:
665 font.setPointSize(styleData["font_size"])
666 if "font_bold" in styleData:
667 font.setBold(styleData["font_bold"])
668 if "font_italic" in styleData:
669 font.setItalic(styleData["font_italic"])
670 if "font_underline" in styleData:
671 font.setUnderline(styleData["font_underline"])
672
673 return font
674
675 def addSubstyle(self, style):
676 """
677 Public method to add a sub-style to a given base style.
678
679 @param style base style number
680 @type int
681 @return allocated sub-style number
682 @rtype int
683 """
684 # TODO: implement this
685 # add empty sub-style definition
686
687 def delSubstyle(self, style, substyle):
688 """
689 Public method to delet a given sub-style definition.
690
691 @param style base style number
692 @type int
693 @param substyle sub-style number
694 @type int
695 @return flag indicating successful deletion
696 @rtype bool
697 """
698 ok = False
699
700 if style in self.__subStyles and substyle in self.__subStyles[style]:
701 del self.__subStyles[style][substyle]
702 ok = True
703
704 return ok

eric ide

mercurial