📄 stcstyleeditor.py
字号:
label='Italic', name='taItalicCb', parent=self.panel4,
pos=wx.Point(8, 48), size=wx.Size(80, 16), style=0)
self.taItalicCb.Bind(wx.EVT_CHECKBOX, self.OnTaitaliccbCheckbox,
id=wxID_STCSTYLEEDITDLGTAITALICCB)
self.taBoldCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTABOLDCB,
label='Bold', name='taBoldCb', parent=self.panel4, pos=wx.Point(8,
27), size=wx.Size(80, 16), style=0)
self.taBoldCb.Bind(wx.EVT_CHECKBOX, self.OnTaboldcbCheckbox,
id=wxID_STCSTYLEEDITDLGTABOLDCB)
self.bgColDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGBGCOLDEFCB,
label='checkBox1', name='bgColDefCb', parent=self.panel3,
pos=wx.Point(136, 79), size=wx.Size(16, 16), style=0)
self.staticBox1 = wx.StaticBox(id=wxID_STCSTYLEEDITDLGSTATICBOX1,
label='Colour', name='staticBox1', parent=self.panel3,
pos=wx.Point(0, 0), size=wx.Size(157, 112), style=0)
self.staticBox1.SetConstraints(LayoutAnchors(self.staticBox1, False,
True, True, False))
self.faceDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGFACEDEFCB,
label='checkBox1', name='faceDefCb', parent=self.panel1,
pos=wx.Point(117, 0), size=wx.Size(16, 16), style=0)
self.taSizeDefCb = wx.CheckBox(id=wxID_STCSTYLEEDITDLGTASIZEDEFCB,
label='checkBox1', name='taSizeDefCb', parent=self.panel2,
pos=wx.Point(80, 0), size=wx.Size(16, 16), style=0)
def __init__(self, parent, langTitle, lang, configFile, STCsToUpdate=()):
self.stc_title = 'wxStyledTextCtrl Style Editor'
self.stc_title = 'wxStyledTextCtrl Style Editor - %s' % langTitle
self.style_font_size = 8
self.style_font_size = platformSettings[wx.Platform][1]
self._init_ctrls(parent)
self.lang = lang
self.configFile = configFile
self.style = ''
self.styleNum = 0
self.names = []
self.values = {}
self.STCsToUpdate = STCsToUpdate
self._blockUpdate = False
global commonPropDefs
commonPropDefs = {'fore': '#888888', 'size': 8,
'face': wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT).GetFaceName()}
for combo, okBtn, evtRet, evtCB, evtRDC in (
(self.fgColCb, self.fgColOkBtn, self.OnfgColRet, self.OnfgColCombobox, self.OnGotoCommonDef),
(self.bgColCb, self.bgColOkBtn, self.OnbgColRet, self.OnbgColCombobox, self.OnGotoCommonDef),
(self.faceCb, self.faceOkBtn, self.OnfaceRet, self.OnfaceCombobox, self.OnGotoCommonDef),
(self.sizeCb, self.sizeOkBtn, self.OnsizeRet, self.OnsizeCombobox, self.OnGotoCommonDef)):
self.bindComboEvts(combo, okBtn, evtRet, evtCB, evtRDC)
(self.config, self.commonDefs, self.styleIdNames, self.styles,
self.styleGroupNames, self.predefStyleGroups,
self.otherLangStyleGroupNames, self.otherLangStyleGroups,
self.displaySrc, self.lexer, self.keywords, self.braceInfo) = \
initFromConfig(configFile, lang)
self.currSpeedSetting = 'style.%s'%self.lang
for grp in [self.currSpeedSetting]+self.styleGroupNames:
self.speedsettingCh.Append(grp)
self.speedsettingCh.SetSelection(0)
margin = 0
self.stc.SetMarginType(margin, wx.stc.STC_MARGIN_NUMBER)
self.stc.SetMarginWidth(margin, 25)
self.stc.SetMarginSensitive(margin, True)
self.stc.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnMarginClick, id=wxID_STCSTYLEEDITDLGSTC)
self.stc.SetUseTabs(False)
self.stc.SetTabWidth(4)
self.stc.SetIndentationGuides(True)
self.stc.SetEdgeMode(wx.stc.STC_EDGE_BACKGROUND)
self.stc.SetEdgeColumn(44)
self.setStyles()
self.populateStyleSelector()
self.defNames, self.defValues = parseProp(\
self.styleDict.get(wx.stc.STC_STYLE_DEFAULT, ''))
self.stc.SetText(self.displaySrc)
self.stc.EmptyUndoBuffer()
self.stc.SetCurrentPos(self.stc.GetTextLength())
self.stc.SetAnchor(self.stc.GetTextLength())
self.populateCombosWithCommonDefs()
# Logical grouping of controls and the property they edit
self.allCtrls = [((self.fgColBtn, self.fgColCb, self.fgColOkBtn), self.fgColDefCb,
'fore', wxID_STCSTYLEEDITDLGFGCOLDEFCB),
((self.bgColBtn, self.bgColCb, self.bgColOkBtn), self.bgColDefCb,
'back', wxID_STCSTYLEEDITDLGBGCOLDEFCB),
(self.taBoldCb, self.taBoldDefCb,
'bold', wxID_STCSTYLEEDITDLGTABOLDDEFCB),
(self.taItalicCb, self.taItalicDefCb,
'italic', wxID_STCSTYLEEDITDLGTAITALICDEFCB),
(self.taUnderlinedCb, self.taUnderlinedDefCb,
'underline', wxID_STCSTYLEEDITDLGTAUNDERLINEDDEFCB),
(self.taEOLfilledCb, self.taEOLfilledDefCb,
'eolfilled', wxID_STCSTYLEEDITDLGTAEOLFILLEDDEFCB),
((self.sizeCb, self.sizeOkBtn), self.taSizeDefCb,
'size', wxID_STCSTYLEEDITDLGTASIZEDEFCB),
((self.faceCb, self.faceOkBtn, self.fixedWidthChk), self.faceDefCb,
'face', wxID_STCSTYLEEDITDLGFACEDEFCB)]
self.clearCtrls(disableDefs=True)
# centralised default checkbox event handler
self.chbIdMap = {}
for ctrl, chb, prop, wid in self.allCtrls:
self.chbIdMap[wid] = ctrl, chb, prop, wid
chb.Bind(wx.EVT_CHECKBOX, self.OnDefaultCheckBox, id=wid)
chb.SetToolTipString('Toggle defaults')
self.Center(wx.BOTH)
#---Property methods------------------------------------------------------------
def getCtrlForProp(self, findprop):
for ctrl, chb, prop, wid in self.allCtrls:
if findprop == prop:
return ctrl, chb
raise Exception('PropNotFound', findprop)
def editProp(self, on, prop, val=''):
oldstyle = self.rememberStyles()
if on:
if not self.names.count(prop):
self.names.append(prop)
self.values[prop] = val
else:
try: self.names.remove(prop)
except ValueError: pass
try: del self.values[prop]
except KeyError: pass
try:
self.updateStyle()
return True
except KeyError, errkey:
wx.LogError('Name not found in Common definition, '\
'please enter valid reference. (%s)'%errkey)
self.restoreStyles(oldstyle)
return False
#---Control population methods--------------------------------------------------
def setStyles(self):
if self._blockUpdate: return
self.styles, self.styleDict, self.styleNumIdxMap = \
setSTCStyles(self.stc, self.styles, self.styleIdNames,
self.commonDefs, self.lang, self.lexer, self.keywords)
def updateStyle(self):
# called after a control edited self.names, self.values
# Special case for saving common defs settings
if self.styleNum == 'common':
#if not self.values:
# return
strVal = self.style[2] = self.values.values()[0]
if self.style[1] == 'size': self.style[2] = int(strVal)
self.commonDefs[self.style[0]] = self.style[2]
self.styleDefST.SetLabel(strVal)
else:
self.style = writePropVal(self.names, self.values)
styleDecl = writeProp(self.styleNum, self.style, self.lang)
self.styles[self.styleNumIdxMap[self.styleNum]] = styleDecl
self.styleDefST.SetLabel(self.style)
self.setStyles()
def findInStyles(self, txt, styles):
for style in styles:
if style.find(txt) != -1:
return True
return False
def rememberStyles(self):
return self.names[:], copy.copy(self.values)
def restoreStyles(self, style):
self.names, self.values = style
self.updateStyle()
def clearCtrls(self, isDefault=False, disableDefs=False):
self._blockUpdate = True
try:
for ctrl, chb, prop, wid in self.allCtrls:
if prop in ('fore', 'back'):
cbtn, txt, btn = ctrl
cbtn.SetBackgroundColour(\
wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
cbtn.SetForegroundColour(wx.Colour(255, 255, 255))
cbtn.Enable(isDefault)
txt.SetValue('')
txt.Enable(isDefault)
btn.Enable(isDefault)
elif prop == 'size':
cmb, btn = ctrl
cmb.SetValue('')
cmb.Enable(isDefault)
btn.Enable(isDefault)
elif prop == 'face':
cmb, btn, chk = ctrl
cmb.SetValue('')
cmb.Enable(isDefault)
btn.Enable(isDefault)
chk.Enable(isDefault)
chk.SetValue(False)
elif prop in ('bold', 'italic', 'underline', 'eolfilled'):
ctrl.SetValue(False)
ctrl.Enable(isDefault)
chb.Enable(not isDefault and not disableDefs)
chb.SetValue(True)
finally:
self._blockUpdate = False
def populateProp(self, items, default, forceDisable=False):
self._blockUpdate = True
try:
for name, val in items:
if name:
ctrl, chb = self.getCtrlForProp(name)
if name in ('fore', 'back'):
cbtn, txt, btn = ctrl
repval = val%self.commonDefs
cbtn.SetBackgroundColour(strToCol(repval))
cbtn.SetForegroundColour(wx.Colour(0, 0, 0))
cbtn.Enable(not forceDisable)
txt.SetValue(val)
txt.Enable(not forceDisable)
btn.Enable(not forceDisable)
chb.SetValue(default)
elif name == 'size':
cmb, btn = ctrl
cmb.SetValue(val)
cmb.Enable(not forceDisable)
btn.Enable(not forceDisable)
chb.SetValue(default)
elif name == 'face':
cmb, btn, chk = ctrl
cmb.SetValue(val)
cmb.Enable(not forceDisable)
btn.Enable(not forceDisable)
chk.Enable(not forceDisable)
chb.SetValue(default)
elif name in ('bold', 'italic', 'underline', 'eolfilled'):
ctrl.Enable(not forceDisable)
ctrl.SetValue(True)
chb.SetValue(default)
finally:
self._blockUpdate = False
def valIsCommonDef(self, val):
return len(val) >= 5 and val[:2] == '%('
def populateCtrls(self):
self.clearCtrls(self.styleNum == wx.stc.STC_STYLE_DEFAULT,
disableDefs=self.styleNum < 0)
# handle colour controls for settings
if self.styleNum < 0:
self.fgColDefCb.Enable(True)
if self.styleNum == -1:
self.bgColDefCb.Enable(True)
# populate with default style
self.populateProp(self.defValues.items(), True,
self.styleNum != wx.stc.STC_STYLE_DEFAULT)
# override with current settings
self.populateProp(self.values.items(), False)
def getCommonDefPropType(self, commonDefName):
val = self.commonDefs[commonDefName]
if type(val) == type(0): return 'size'
if len(val) == 7 and val[0] == '#': return 'fore'
return 'face'
def bindComboEvts(self, combo, btn, btnEvtMeth, comboEvtMeth, rdclickEvtMeth):
combo.Bind(wx.EVT_COMBOBOX, comboEvtMeth, id=combo.GetId())
btn.Bind(wx.EVT_BUTTON, btnEvtMeth, id=btn.GetId())
combo.Bind(wx.EVT_RIGHT_DCLICK, rdclickEvtMeth)
combo.SetToolTipString('Select from list or click "ok" button on the right to change a manual entry, right double-click \n'\
'the drop down button to select Common definition in the Style Editor (if applicable)')
btn.SetToolTipString('Accept value')
def populateCombosWithCommonDefs(self, fixedWidthOnly=None):
self._blockUpdate = True
try:
commonDefs = {'fore': [], 'face': [], 'size': []}
if self.elementLb.GetSelection() < self.commonDefsStartIdx:
for common in self.commonDefs.keys():
prop = self.getCommonDefPropType(common)
commonDefs[prop].append('%%(%s)%s'%(common,
prop=='size' and 'd' or 's'))
# Colours
currFg, currBg = self.fgColCb.GetValue(), self.bgColCb.GetValue()
self.fgColCb.Clear(); self.bgColCb.Clear()
for colCommonDef in commonDefs['fore']:
self.fgColCb.Append(colCommonDef)
self.bgColCb.Append(colCommonDef)
self.fgColCb.SetValue(currFg); self.bgColCb.SetValue(currBg)
# Font
if fixedWidthOnly is None:
fixedWidthOnly = self.fixedWidthChk.GetValue()
fontEnum = wx.FontEnumerator()
fontEnum.EnumerateFacenames(fixedWidthOnly=fixedWidthOnly)
fontNameList = fontEnum.GetFacenames()
fontNameList.sort()
currFace = self.faceCb.GetValue()
self.faceCb.Clear()
for colCommonDef in fontNameList+commonDefs['face']:
self.faceCb.Append(colCommonDef)
self.faceCb.SetValue(currFace)
# Size (XXX add std font sizes)
currSize = self.sizeCb.GetValue()
self.sizeCb.Clear()
for colCommonDef in commonDefs['size']:
self.sizeCb.Append(colCommonDef)
self.sizeCb.SetValue(currSize)
finally:
self._blockUpdate = False
def populateStyleSelector(self):
numStyles = self.styleIdNames.items()
numStyles.sort()
self.styleNumLookup = {}
stdStart = -1
stdOffset = 0
extrOffset = 0
# add styles
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -