def addList(self, descr, parent, sizer, items, doBtns, isFirst, pad=0): sizer.Add(wx.StaticText(parent, -1, descr), 0, wx.TOP, pad) if doBtns: hsizer = wx.BoxSizer(wx.HORIZONTAL) if isFirst: funcs = [self.OnSet1, self.OnClear1, self.OnToggle1] else: funcs = [self.OnSet2, self.OnClear2, self.OnToggle2] tmp = wx.Button(parent, -1, "Set") hsizer.Add(tmp) wx.EVT_BUTTON(self, tmp.GetId(), funcs[0]) tmp = wx.Button(parent, -1, "Clear") hsizer.Add(tmp, 0, wx.LEFT, 10) wx.EVT_BUTTON(self, tmp.GetId(), funcs[1]) tmp = wx.Button(parent, -1, "Toggle") hsizer.Add(tmp, 0, wx.LEFT, 10) wx.EVT_BUTTON(self, tmp.GetId(), funcs[2]) sizer.Add(hsizer, 0, wx.TOP | wx.BOTTOM, 5) tmp = wx.CheckListBox(parent, -1) longest = -1 for i in range(len(items)): it = items[i] tmp.Append(it.text) tmp.Check(i, it.selected) if isFirst: if longest != -1: if len(it.text) > len(items[longest].text): longest = i else: longest = 0 w = -1 if isFirst: h = len(items) if longest != -1: w = util.getTextExtent(tmp.GetFont(), "[x] " + items[longest].text)[0] + 15 else: h = min(10, len(items)) # don't know of a way to get the vertical spacing of items in a # wx.CheckListBox, so estimate it at font height + 5 pixels, which # is close enough on everything I've tested. h *= util.getFontHeight(tmp.GetFont()) + 5 h += 5 h = max(25, h) util.setWH(tmp, w, h) sizer.Add(tmp, 0, wx.EXPAND) return tmp
def __init__(self, parent): wx.ListCtrl.__init__(self, parent, -1, style = wx.LC_REPORT | wx.LC_VIRTUAL | wx.LC_SINGLE_SEL | wx.LC_HRULES | wx.LC_VRULES) self.sex = ["Female", "Male"] self.InsertColumn(0, "Name") self.InsertColumn(1, "Type") self.InsertColumn(2, "Sex") self.SetColumnWidth(0, 120) self.SetColumnWidth(1, 120) # we can't use wx.LIST_AUTOSIZE since this is a virtual control, # so calculate the size ourselves since we know the longest string # possible. w = util.getTextExtent(self.GetFont(), "Female")[0] + 15 self.SetColumnWidth(2, w) util.setWH(self, w = 120*2 + w + 25)
def __init__(self, parent): wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.LC_VIRTUAL | wx.LC_SINGLE_SEL | wx.LC_HRULES | wx.LC_VRULES) self.sex = ["Female", "Male"] self.InsertColumn(0, "Name") self.InsertColumn(1, "Type") self.InsertColumn(2, "Sex") self.SetColumnWidth(0, 120) self.SetColumnWidth(1, 120) # we can't use wx.LIST_AUTOSIZE since this is a virtual control, # so calculate the size ourselves since we know the longest string # possible. w = util.getTextExtent(self.GetFont(), "Female")[0] + 15 self.SetColumnWidth(2, w) util.setWH(self, w=120 * 2 + w + 25)
def updateFontLb(self): names = ["Normal", "Bold", "Italic", "Bold-Italic"] # keep track if all fonts have the same width widths = set() for i in range(len(names)): nfi = wx.NativeFontInfo() nfi.FromString(getattr(self.cfg, self.fontsLb.GetClientData(i))) ps = nfi.GetPointSize() s = nfi.GetFaceName() self.fontsLb.SetString(i, "%s: %s, %d" % (names[i], s, ps)) f = wx.FontFromNativeInfo(nfi) widths.add(util.getTextExtent(f, "iw")[0]) if len(widths) > 1: self.errText.SetLabel("Fonts have different widths") self.errText.SetForegroundColour((255, 0, 0)) else: self.errText.SetLabel("Fonts have matching widths") self.errText.SetForegroundColour(self.origColor)
def __init__(self, cfgGl): if not ConfigGui.constantsInited: ConfigGui.bluePen = wx.Pen(wx.Colour(0, 0, 255)) ConfigGui.redColor = wx.Colour(255, 0, 0) ConfigGui.blackColor = wx.Colour(0, 0, 0) ConfigGui.constantsInited = True # convert cfgGl.MyColor -> cfgGui.wx.Colour for it in cfgGl.cvars.color.itervalues(): c = getattr(cfgGl, it.name) tmp = wx.Colour(c.r, c.g, c.b) setattr(self, it.name, tmp) # key = line type, value = wx.Colour self._lt2textColor = {} for t in getTIs(): self._lt2textColor[t.lt] = getattr(self, "text%sColor" % t.name) self.textPen = wx.Pen(self.textColor) self.textHdrPen = wx.Pen(self.textHdrColor) self.workspaceBrush = wx.Brush(self.workspaceColor) self.workspacePen = wx.Pen(self.workspaceColor) self.textBgBrush = wx.Brush(self.textBgColor) self.textBgPen = wx.Pen(self.textBgColor) self.pageBorderPen = wx.Pen(self.pageBorderColor) self.pageShadowPen = wx.Pen(self.pageShadowColor) self.selectedBrush = wx.Brush(self.selectedColor) self.selectedPen = wx.Pen(self.selectedColor) self.cursorBrush = wx.Brush(self.cursorColor) self.cursorPen = wx.Pen(self.cursorColor) self.noteBrush = wx.Brush(self.noteColor) self.notePen = wx.Pen(self.noteColor) self.autoCompPen = wx.Pen(self.autoCompFgColor) self.autoCompBrush = wx.Brush(self.autoCompBgColor) self.autoCompRevPen = wx.Pen(self.autoCompBgColor) self.autoCompRevBrush = wx.Brush(self.autoCompFgColor) self.pagebreakPen = wx.Pen(self.pagebreakColor) self.pagebreakNoAdjustPen = wx.Pen(self.pagebreakNoAdjustColor, style = wx.DOT) self.tabTextPen = wx.Pen(self.tabTextColor) self.tabBorderPen = wx.Pen(self.tabBorderColor) self.tabBarBgBrush = wx.Brush(self.tabBarBgColor) self.tabBarBgPen = wx.Pen(self.tabBarBgColor) self.tabNonActiveBgBrush = wx.Brush(self.tabNonActiveBgColor) self.tabNonActiveBgPen = wx.Pen(self.tabNonActiveBgColor) # a 4-item list of FontInfo objects, indexed by the two lowest # bits of pml.TextOp.flags. self.fonts = [] for fname in ["fontNormal", "fontBold", "fontItalic", "fontBoldItalic"]: fi = FontInfo() s = getattr(cfgGl, fname) # evil users can set the font name to empty by modifying the # config file, and some wxWidgets ports crash hard when trying # to create a font from an empty string, so we must guard # against that. if s: nfi = wx.NativeFontInfo() nfi.FromString(s) nfi.SetEncoding(wx.FONTENCODING_ISO8859_1) # On Mac, a pointsize of 0 for nfi will result in a crash if nfi.GetPointSize() > 0: fi.font = wx.FontFromNativeInfo(nfi) # likewise, evil users can set the font name to "z" or # something equally silly, resulting in an # invalid/non-existent font. on wxGTK2 and wxMSW we can # detect this by checking the point size of the font. # wxGTK1 chooses some weird chinese font and I can't find # a way to detect that, but it's irrelevant since we'll # rip out support for it in a few months. if fi.font.GetPointSize() == 0: fi.font = None else: fi.font = None # if either of the above failures happened, create a dummy # font and use it. this sucks but is preferable to crashing or # displaying an empty screen. if not fi.font: fi.font = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, encoding = wx.FONTENCODING_ISO8859_1) setattr(cfgGl, fname, fi.font.GetNativeFontInfo().ToString()) # on Mac, the width of a fixed width font can be non-integer. # (points != pixels) In order to find out an appropriate # approximation, we get the length of a long string and divide it # by the number of characters. fx, fy = util.getTextExtent(fi.font, "".ljust(100, "O")) fx = float(fx) / 100.0 fi.fx = max(1, fx) fi.fy = max(1, fy) self.fonts.append(fi)
def __init__(self, cfgGl): if not ConfigGui.constantsInited: ConfigGui.bluePen = wx.Pen(wx.Colour(0, 0, 255)) ConfigGui.redColor = wx.Colour(255, 0, 0) ConfigGui.blackColor = wx.Colour(0, 0, 0) ConfigGui.constantsInited = True # convert cfgGl.MyColor -> cfgGui.wx.Colour for it in cfgGl.cvars.color.itervalues(): c = getattr(cfgGl, it.name) tmp = wx.Colour(c.r, c.g, c.b) setattr(self, it.name, tmp) # key = line type, value = wx.Colour self._lt2textColor = {} for t in getTIs(): self._lt2textColor[t.lt] = getattr(self, "text%sColor" % t.name) self.textPen = wx.Pen(self.textColor) self.textHdrPen = wx.Pen(self.textHdrColor) self.workspaceBrush = wx.Brush(self.workspaceColor) self.workspacePen = wx.Pen(self.workspaceColor) self.textBgBrush = wx.Brush(self.textBgColor) self.textBgPen = wx.Pen(self.textBgColor) self.pageBorderPen = wx.Pen(self.pageBorderColor) self.pageShadowPen = wx.Pen(self.pageShadowColor) self.selectedBrush = wx.Brush(self.selectedColor) self.selectedPen = wx.Pen(self.selectedColor) self.searchBrush = wx.Brush(self.searchColor) self.searchPen = wx.Pen(self.searchColor) self.cursorBrush = wx.Brush(self.cursorColor) self.cursorPen = wx.Pen(self.cursorColor) self.noteBrush = wx.Brush(self.noteColor) self.notePen = wx.Pen(self.noteColor) self.autoCompPen = wx.Pen(self.autoCompFgColor) self.autoCompBrush = wx.Brush(self.autoCompBgColor) self.autoCompRevPen = wx.Pen(self.autoCompBgColor) self.autoCompRevBrush = wx.Brush(self.autoCompFgColor) self.pagebreakPen = wx.Pen(self.pagebreakColor) self.pagebreakNoAdjustPen = wx.Pen(self.pagebreakNoAdjustColor, style=wx.DOT) self.tabTextPen = wx.Pen(self.tabTextColor) self.tabBorderPen = wx.Pen(self.tabBorderColor) self.tabBarBgBrush = wx.Brush(self.tabBarBgColor) self.tabBarBgPen = wx.Pen(self.tabBarBgColor) self.tabNonActiveBgBrush = wx.Brush(self.tabNonActiveBgColor) self.tabNonActiveBgPen = wx.Pen(self.tabNonActiveBgColor) # a 4-item list of FontInfo objects, indexed by the two lowest # bits of pml.TextOp.flags. self.fonts = [] for fname in [ "fontNormal", "fontBold", "fontItalic", "fontBoldItalic" ]: fi = FontInfo() s = getattr(cfgGl, fname) # evil users can set the font name to empty by modifying the # config file, and some wxWidgets ports crash hard when trying # to create a font from an empty string, so we must guard # against that. if s: nfi = wx.NativeFontInfo() nfi.FromString(s) nfi.SetEncoding(wx.FONTENCODING_ISO8859_1) fi.font = wx.FontFromNativeInfo(nfi) # likewise, evil users can set the font name to "z" or # something equally silly, resulting in an # invalid/non-existent font. on wxGTK2 and wxMSW we can # detect this by checking the point size of the font. # wxGTK1 chooses some weird chinese font and I can't find # a way to detect that, but it's irrelevant since we'll # rip out support for it in a few months. if fi.font.GetPointSize() == 0: fi.font = None # if either of the above failures happened, create a dummy # font and use it. this sucks but is preferable to crashing or # displaying an empty screen. if not fi.font: fi.font = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, encoding=wx.FONTENCODING_ISO8859_1) setattr(cfgGl, fname, fi.font.GetNativeFontInfo().ToString()) fx, fy = util.getTextExtent(fi.font, "O") fi.fx = max(1, fx) fi.fy = max(1, fy) self.fonts.append(fi)
def __init__(self, cfgGl): if not ConfigGui.constantsInited: ConfigGui.bluePen = wx.Pen(wx.Colour(0, 0, 255)) ConfigGui.redColor = wx.Colour(255, 0, 0) ConfigGui.blackColor = wx.Colour(0, 0, 0) ConfigGui.constantsInited = True # convert cfgGl.MyColor -> cfgGui.wx.Colour for it in cfgGl.cvars.color.itervalues(): c = getattr(cfgGl, it.name) tmp = wx.Colour(c.r, c.g, c.b) setattr(self, it.name, tmp) # key = line type, value = wx.Colour self._lt2textColor = {} for t in getTIs(): self._lt2textColor[t.lt] = getattr(self, "text%sColor" % t.name) self.textPen = wx.Pen(self.textColor) self.textHdrPen = wx.Pen(self.textHdrColor) self.workspaceBrush = wx.Brush(self.workspaceColor) self.workspacePen = wx.Pen(self.workspaceColor) self.textBgBrush = wx.Brush(self.textBgColor) self.textBgPen = wx.Pen(self.textBgColor) self.pageBorderPen = wx.Pen(self.pageBorderColor) self.pageShadowPen = wx.Pen(self.pageShadowColor) self.selectedBrush = wx.Brush(self.selectedColor) self.selectedPen = wx.Pen(self.selectedColor) self.cursorBrush = wx.Brush(self.cursorColor) self.cursorPen = wx.Pen(self.cursorColor) self.noteBrush = wx.Brush(self.noteColor) self.notePen = wx.Pen(self.noteColor) self.autoCompPen = wx.Pen(self.autoCompFgColor) self.autoCompBrush = wx.Brush(self.autoCompBgColor) self.autoCompRevPen = wx.Pen(self.autoCompBgColor) self.autoCompRevBrush = wx.Brush(self.autoCompFgColor) self.pagebreakPen = wx.Pen(self.pagebreakColor) self.pagebreakNoAdjustPen = wx.Pen(self.pagebreakNoAdjustColor, style = wx.DOT) self.tabTextPen = wx.Pen(self.tabTextColor) self.tabBorderPen = wx.Pen(self.tabBorderColor) self.tabBarBgBrush = wx.Brush(self.tabBarBgColor) self.tabBarBgPen = wx.Pen(self.tabBarBgColor) self.tabNonActiveBgBrush = wx.Brush(self.tabNonActiveBgColor) self.tabNonActiveBgPen = wx.Pen(self.tabNonActiveBgColor) # a 4-item list of FontInfo objects, indexed by the two lowest # bits of pml.TextOp.flags. self.fonts = [] for fname in ["fontNormal", "fontBold", "fontItalic", "fontBoldItalic"]: fi = FontInfo() s = getattr(cfgGl, fname) # evil users can set the font name to empty by modifying the # config file, and some wxWidgets ports crash hard when trying # to create a font from an empty string, so we must guard # against that. if s: nfi = wx.NativeFontInfo() nfi.FromString(s) fi.font = wx.FontFromNativeInfo(nfi) # likewise, evil users can set the font name to "z" or # something equally silly, resulting in an # invalid/non-existent font. on wxGTK2 and wxMSW we can # detect this by checking the point size of the font. if fi.font.GetPointSize() == 0: fi.font = None # if either of the above failures happened, create a dummy # font and use it. this sucks but is preferable to crashing or # displaying an empty screen. if not fi.font: fi.font = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL) setattr(cfgGl, fname, fi.font.GetNativeFontInfo().ToString()) fx, fy = util.getTextExtent(fi.font, "O") fi.fx = max(1, fx) fi.fy = max(1, fy) self.fonts.append(fi)
def __init__(self, parent, cfg, applyFunc, isGlobal): wx.Dialog.__init__(self, parent, -1, "", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) self.cfg = cfg self.applyFunc = applyFunc global cfgFrame cfgFrame = self vsizer = wx.BoxSizer(wx.VERTICAL) hsizer = wx.BoxSizer(wx.HORIZONTAL) self.listbook = MyListBook(self) w = util.getTextExtent(self.listbook.GetFont(), "Formatting")[0] util.setWH(self.listbook, w + 20, 200) hsizer.Add(self.listbook, 0, wx.EXPAND) self.panel = wx.Panel(self, -1) hsizer.Add(self.panel, 1, wx.EXPAND) if isGlobal: self.SetTitle("Settings dialog") self.AddPage(GlobalAboutPanel, "About") self.AddPage(ColorsPanel, "Colors") self.AddPage(DisplayPanel, "Display") self.AddPage(ElementsGlobalPanel, "Elements") self.AddPage(KeyboardPanel, "Keyboard") self.AddPage(MiscPanel, "Misc") else: self.SetTitle("Script settings dialog") self.AddPage(ScriptAboutPanel, "About") self.AddPage(ElementsPanel, "Elements") self.AddPage(FormattingPanel, "Formatting") self.AddPage(PaperPanel, "Paper") self.AddPage(PDFPanel, "PDF") self.AddPage(PDFFontsPanel, "PDF/Fonts") self.AddPage(StringsPanel, "Strings") size = self.listbook.GetContainingSize() hsizer.SetItemMinSize(self.panel, *size) self.listbook.SetPageSizes(*size) self.listbook.SetSelection(0) # it's unclear whether SetSelection sends an event on all # platforms or not, so force correct action. self.listbook.OnPageChange() vsizer.Add(hsizer, 1, wx.EXPAND) vsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5) hsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add((1, 1), 1) applyBtn = gutil.createStockButton(self, "Apply") hsizer.Add(applyBtn, 0, wx.ALL, 5) cancelBtn = gutil.createStockButton(self, "Cancel") hsizer.Add(cancelBtn, 0, wx.ALL, 5) okBtn = gutil.createStockButton(self, "OK") hsizer.Add(okBtn, 0, wx.ALL, 5) vsizer.Add(hsizer, 0, wx.EXPAND) self.SetSizerAndFit(vsizer) self.Layout() self.Center() wx.EVT_BUTTON(self, applyBtn.GetId(), self.OnApply) wx.EVT_BUTTON(self, cancelBtn.GetId(), self.OnCancel) wx.EVT_BUTTON(self, okBtn.GetId(), self.OnOK)