QScintilla/Lexers/SubstyledLexer.py

branch
sub_styles
changeset 6846
6ca9ef2c0907
parent 6845
4680adb641e0
child 6855
4d80c8cc99a1
equal deleted inserted replaced
6845:4680adb641e0 6846:6ca9ef2c0907
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

eric ide

mercurial