📄 stcstyleeditor.py
字号:
for num, name in numStyles:
if num == wx.stc.STC_STYLE_DEFAULT:
self.elementLb.InsertItems([name, '----Language----'], 0)
self.elementLb.Append('----Standard----')
stdStart = stdPos = self.elementLb.GetCount()
else:
# std styles
if num >= 33 and num < 40:
self.elementLb.InsertItems([name], stdStart + stdOffset)
stdOffset = stdOffset + 1
# extra styles
elif num >= 40:
self.elementLb.InsertItems([name], stdStart + extrOffset -1)
extrOffset = extrOffset + 1
# normal lang styles
else:
self.elementLb.Append(name)
self.styleNumLookup[name] = num
# add settings
self.elementLb.Append('----Settings----')
settings = settingsIdNames.items()
settings.sort();settings.reverse()
for num, name in settings:
self.elementLb.Append(name)
self.styleNumLookup[name] = num
# add definitions
self.elementLb.Append('----Common----')
self.commonDefsStartIdx = self.elementLb.GetCount()
for common in self.commonDefs.keys():
tpe = type(self.commonDefs[common])
self.elementLb.Append('%('+common+')'+(tpe is type('') and 's' or 'd'))
self.styleNumLookup[common] = num
#---Colour methods--------------------------------------------------------------
def getColourDlg(self, colour, title=''):
data = wx.ColourData()
data.SetColour(colour)
data.SetChooseFull(True)
dlg = wx.ColourDialog(self, data)
try:
dlg.SetTitle(title)
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetColourData()
return data.GetColour()
finally:
dlg.Destroy()
return None
colDlgTitles = {'fore': 'Foreground', 'back': 'Background'}
def editColProp(self, colBtn, colCb, prop):
col = self.getColourDlg(colBtn.GetBackgroundColour(),
self.colDlgTitles[prop]+ ' colour')
if col:
colBtn.SetForegroundColour(wx.Colour(0, 0, 0))
colBtn.SetBackgroundColour(col)
colStr = colToStr(col)
colCb.SetValue(colStr)
self.editProp(True, prop, colStr)
def OnFgcolbtnButton(self, event):
self.editColProp(self.fgColBtn, self.fgColCb, 'fore')
def OnBgcolbtnButton(self, event):
self.editColProp(self.bgColBtn, self.bgColCb, 'back')
def editColTCProp(self, colCb, colBtn, prop, val=None):
if val is None:
colStr = colCb.GetValue()
else:
colStr = val
if colStr:
col = strToCol(colStr%self.commonDefs)
if self.editProp(colStr!='', prop, colStr):
if colStr:
colBtn.SetForegroundColour(wx.Colour(0, 0, 0))
colBtn.SetBackgroundColour(col)
else:
colBtn.SetForegroundColour(wx.Colour(255, 255, 255))
colBtn.SetBackgroundColour(\
wxSystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
def OnfgColRet(self, event):
try: self.editColTCProp(self.fgColCb, self.fgColBtn, 'fore')
except AssertionError: wx.LogError('Not a valid colour value')
def OnfgColCombobox(self, event):
if self._blockUpdate: return
try: self.editColTCProp(self.fgColCb, self.fgColBtn, 'fore', event.GetString())
except AssertionError: wx.LogError('Not a valid colour value')
def OnbgColRet(self, event):
try: self.editColTCProp(self.bgColCb, self.bgColBtn, 'back')
except AssertionError: wx.LogError('Not a valid colour value')
def OnbgColCombobox(self, event):
if self._blockUpdate: return
try: self.editColTCProp(self.bgColCb, self.bgColBtn, 'back', event.GetString())
except AssertionError: wx.LogError('Not a valid colour value')
#---Text attribute events-------------------------------------------------------
def OnTaeoffilledcbCheckbox(self, event):
self.editProp(event.IsChecked(), 'eolfilled')
def OnTaitaliccbCheckbox(self, event):
self.editProp(event.IsChecked(), 'italic')
def OnTaboldcbCheckbox(self, event):
self.editProp(event.IsChecked(), 'bold')
def OnTaunderlinedcbCheckbox(self, event):
self.editProp(event.IsChecked(), 'underline')
def OnGotoCommonDef(self, event):
val = event.GetEventObject().GetValue()
if self.valIsCommonDef(val):
idx = self.elementLb.FindString(val)
if idx != -1:
self.elementLb.SetSelection(idx, True)
self.OnElementlbListbox(None)
def OnfaceRet(self, event):
self.setFace(self.faceCb.GetValue())
def OnfaceCombobox(self, event):
if self._blockUpdate: return
self.setFace(event.GetString())
def setFace(self, val):
try: val%self.commonDefs
except KeyError: wx.LogError('Invalid common definition')
else: self.editProp(val!='', 'face', val)
def OnsizeRet(self, event):
self.setSize(self.sizeCb.GetValue())
def OnsizeCombobox(self, event):
if self._blockUpdate: return
self.setSize(event.GetString())
def setSize(self, val):
try: int(val%self.commonDefs)
except ValueError: wx.LogError('Not a valid integer size value')
except KeyError: wx.LogError('Invalid common definition')
else: self.editProp(val!='', 'size', val)
#---Main GUI events-------------------------------------------------------------
def OnElementlbListbox(self, event):
isCommon = self.elementLb.GetSelection() >= self.commonDefsStartIdx
self.removeCommonItemBtn.Enable(isCommon)
styleIdent = self.elementLb.GetStringSelection()
# common definition selected
if isCommon:
common = styleIdent[2:-2]
prop = self.getCommonDefPropType(common)
self.clearCtrls(disableDefs=True)
if prop == 'fore':
self.fgColBtn.Enable(True)
self.fgColCb.Enable(True)
self.fgColOkBtn.Enable(True)
elif prop == 'face':
self.faceCb.Enable(True)
self.fixedWidthChk.Enable(True)
self.faceOkBtn.Enable(True)
elif prop == 'size':
self.sizeCb.Enable(True)
self.sizeOkBtn.Enable(True)
commonDefVal = str(self.commonDefs[common])
self.styleDefST.SetLabel(commonDefVal)
self.populateProp( [(prop, commonDefVal)], True)
self.styleNum = 'common'
self.style = [common, prop, commonDefVal]
self.names, self.values = [prop], {prop: commonDefVal}
# normal style element selected
elif len(styleIdent) >=2 and styleIdent[:2] != '--':
self.styleNum = self.styleNumLookup[styleIdent]
self.style = self.styleDict[self.styleNum]
self.names, self.values = parseProp(self.style)
if self.styleNum == wx.stc.STC_STYLE_DEFAULT:
self.defNames, self.defValues = \
self.names, self.values
self.checkBraces(self.styleNum)
self.styleDefST.SetLabel(self.style)
self.populateCtrls()
# separator selected
else:
self.clearCtrls(disableDefs=True)
if styleIdent:
self.styleDefST.SetLabel(styleCategoryDescriptions[styleIdent])
self.populateCombosWithCommonDefs()
def OnDefaultCheckBox(self, event):
if self.chbIdMap.has_key(event.GetId()):
ctrl, chb, prop, wid = self.chbIdMap[event.GetId()]
restore = not event.IsChecked()
if prop in ('fore', 'back'):
cbtn, cmb, btn = ctrl
cbtn.Enable(restore)
cmb.Enable(restore)
btn.Enable(restore)
if restore:
colStr = cmb.GetValue()
#if prop == 'fore': colStr = self.fgColCb.GetValue()
#else: colStr = self.bgColCb.GetValue()
if colStr: self.editProp(True, prop, colStr)
else:
self.editProp(False, prop)
elif prop == 'size':
cmb, btn = ctrl
val = cmb.GetValue()
if val: self.editProp(restore, prop, val)
cmb.Enable(restore)
btn.Enable(restore)
elif prop == 'face':
cmb, btn, chk = ctrl
val = cmb.GetStringSelection()
if val: self.editProp(restore, prop, val)
cmb.Enable(restore)
btn.Enable(restore)
chk.Enable(restore)
elif prop in ('bold', 'italic', 'underline', 'eolfilled'):
ctrl.Enable(restore)
if ctrl.GetValue(): self.editProp(restore, prop)
def OnOkbtnButton(self, event):
# write styles and common defs to the config
wx.BeginBusyCursor()
try:
writeStylesToConfig(self.config, 'style.%s'%self.lang, self.styles)
self.config.SetPath('')
self.config.Write(commonDefsFile, `self.commonDefs`)
self.config.Flush()
for stc in self.STCsToUpdate:
setSTCStyles(stc, self.styles, self.styleIdNames, self.commonDefs,
self.lang, self.lexer, self.keywords)
finally:
wx.EndBusyCursor()
self.EndModal(wx.ID_OK)
def OnCancelbtnButton(self, event):
self.EndModal(wx.ID_CANCEL)
def OnCommondefsbtnButton(self, event):
dlg = wx.TextEntryDialog(self, 'Edit common definitions dictionary',
'Common definitions', pprint.pformat(self.commonDefs),
style=wx.TE_MULTILINE | wx.OK | wx.CANCEL | wx.CENTRE)
try:
if dlg.ShowModal() == wx.ID_OK:
answer = eval(dlg.GetValue(), stc.__dict__)
assert type(answer) is type({}), 'Not a valid dictionary'
oldDefs = self.commonDefs
self.commonDefs = answer
try:
self.setStyles()
except KeyError, badkey:
wx.LogError(str(badkey)+' not defined but required, \n'\
'reverting to previous common definition')
self.commonDefs = oldDefs
self.setStyles()
self.populateCombosWithCommonDefs()
finally:
dlg.Destroy()
def OnSpeedsettingchChoice(self, event):
group = event.GetString()
if group:
userStyles = 'style.%s'%self.lang
if self.currSpeedSetting == userStyles:
self.predefStyleGroups[userStyles] = self.styles
self.styles = self.predefStyleGroups[group]
self.setStyles()
self.defNames, self.defValues = parseProp(\
self.styleDict.get(wx.stc.STC_STYLE_DEFAULT, ''))
self.OnElementlbListbox(None)
self.currSpeedSetting = group
def OnFixedwidthchkCheckbox(self, event):
self.populateCombosWithCommonDefs(event.IsChecked())
def OnAddsharebtnButton(self, event):
dlg = CommonDefDlg(self)
try:
if dlg.ShowModal() == wx.ID_OK:
prop, name = dlg.result
if not self.commonDefs.has_key(name):
self.commonDefs[name] = commonPropDefs[prop]
self.elementLb.Append('%('+name+')'+\
(type(commonPropDefs[prop]) is type('') and 's' or 'd'))
self.elementLb.SetSelection(self.elementLb.GetCount()-1, True)
self.populateCombosWithCommonDefs()
self.OnElementlbListbox(None)
finally:
dlg.Destroy()
def OnRemovesharebtnButton(self, event):
ownGroup = 'style.%s'%self.lang
comDef = self.elementLb.GetStringSelection()
# Search ALL styles before removing
srchDct = {ownGroup: self.styles}
srchDct.update(self.predefStyleGroups)
srchDct.update(self.otherLangStyleGroups)
matchList = []
for grpName, styles in srchDct.items():
if self.findInStyles(comDef, styles):
matchList.append(grpName)
if matchList:
wx.LogError('Aborted: '+comDef+' is still used in the styles of the \n'\
'following groups in the config file (stc-styles.rc.cfg):\n'+ \
'\n'.join(matchList))
else:
del self.commonDefs[comDef[2:-2]]
self.setStyles()
self.populateCombosWithCommonDefs()
selIdx = self.elementLb.GetSelection()
self.elementLb.Delete(selIdx)
if selIdx == self.elementLb.GetCount():
selIdx = selIdx - 1
self.elementLb.SetSelection(selIdx, True)
self.OnElementlbListbox(None)
#---STC events------------------------------------------------------------------
def OnUpdateUI(self, event):
styleBefore = self.stc.GetStyleAt(self.stc.GetCurrentPos())
if self.styleIdNames.has_key(styleBefore):
self.elementLb.SetStringSelection(self.styleIdNames[styleBefore],
True)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -