import wx import wx.lib.buttonpanel as bp import images import random #---------------------------------------------------------------------- ID_BackgroundColour = wx.NewId() ID_GradientFrom = wx.NewId() ID_GradientTo = wx.NewId() ID_BorderColour = wx.NewId() ID_CaptionColour = wx.NewId() ID_ButtonTextColour = wx.NewId() ID_SelectionBrush = wx.NewId() ID_SelectionPen = wx.NewId() ID_SeparatorColour = wx.NewId() #---------------------------------------------------------------------- # Some icons for the demo #---------------------------------------------------------------------- def GetMondrianData(): return \ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\ \x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00qID\ ATX\x85\xed\xd6;\n\x800\x10E\xd1{\xc5\x8d\xb9r\x97\x16\x0b\xad$\x8a\x82:\x16\ o\xda\x84pB2\x1f\x81Fa\x8c\x9c\x08\x04Z{\xcf\xa72\xbcv\xfa\xc5\x08 \x80r\x80\ \xfc\xa2\x0e\x1c\xe4\xba\xfaX\x1d\xd0\xde]S\x07\x02\xd8>\xe1wa-`\x9fQ\xe9\ \x86\x01\x04\x10\x00\\(Dk\x1b-\x04\xdc\x1d\x07\x14\x98;\x0bS\x7f\x7f\xf9\x13\ \x04\x10@\xf9X\xbe\x00\xc9 \x14K\xc1<={\x00\x00\x00\x00IEND\xaeB`\x82' def GetMondrianBitmap(): return wx.BitmapFromImage(GetMondrianImage()) def GetMondrianImage(): import cStringIO stream = cStringIO.StringIO(GetMondrianData()) return wx.ImageFromStream(stream) def GetMondrianIcon(): icon = wx.EmptyIcon() icon.CopyFromBitmap(GetMondrianBitmap()) return icon #---------------------------------------------------------------------- class SettingsPanel(wx.MiniFrame): def __init__(self, parent, id=wx.ID_ANY, title="Settings Panel", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.FRAME_NO_TASKBAR | wx.FRAME_FLOAT_ON_PARENT | wx.CLIP_CHILDREN): wx.MiniFrame.__init__(self, parent, id, title, pos, size, style) self.targetTitleBar = parent.titleBar self.parent = parent self.panel = wx.Panel(self, -1) self.coloursizer_staticbox = wx.StaticBox(self.panel, -1, "Colour Options") self.bottomsizer_staticbox = wx.StaticBox(self.panel, -1, "Size Options") self.stylesizer_staticbox = wx.StaticBox(self.panel, -1, "ButtonPanel Styles") self.defaultstyle = wx.RadioButton(self.panel, -1, "Default Style", style=wx.RB_GROUP) self.gradientstyle = wx.RadioButton(self.panel, -1, "Gradient Style") self.verticalgradient = wx.RadioButton(self.panel, -1, "Vertical Gradient", style=wx.RB_GROUP) self.horizontalgradient = wx.RadioButton(self.panel, -1, "Horizontal Gradient") b = self.CreateColorBitmap(wx.BLACK) self.bakbrush = wx.BitmapButton(self.panel, ID_BackgroundColour, b, size=wx.Size(50,25)) self.gradientfrom = wx.BitmapButton(self.panel, ID_GradientFrom, b, size=wx.Size(50,25)) self.gradientto = wx.BitmapButton(self.panel, ID_GradientTo, b, size=wx.Size(50,25)) self.bordercolour = wx.BitmapButton(self.panel, ID_BorderColour, b, size=wx.Size(50,25)) self.captioncolour = wx.BitmapButton(self.panel, ID_CaptionColour, b, size=wx.Size(50,25)) self.textbuttoncolour = wx.BitmapButton(self.panel, ID_ButtonTextColour, b, size=wx.Size(50,25)) self.selectionbrush = wx.BitmapButton(self.panel, ID_SelectionBrush, b, size=wx.Size(50,25)) self.selectionpen = wx.BitmapButton(self.panel, ID_SelectionPen, b, size=wx.Size(50,25)) self.separatorcolour = wx.BitmapButton(self.panel, ID_SeparatorColour, b, size=wx.Size(50,25)) self.separatorspin = wx.SpinCtrl(self.panel, -1, "7", min=3, max=20, style=wx.SP_ARROW_KEYS) self.marginspin = wx.SpinCtrl(self.panel, -1, "6", min=3, max=20, style=wx.SP_ARROW_KEYS) self.paddingspin = wx.SpinCtrl(self.panel, -1, "6", min=3, max=20, style=wx.SP_ARROW_KEYS) self.borderspin = wx.SpinCtrl(self.panel, -1, "3", min=3, max=7, style=wx.SP_ARROW_KEYS) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_RADIOBUTTON, self.OnDefaultStyle, self.defaultstyle) self.Bind(wx.EVT_RADIOBUTTON, self.OnGradientStyle, self.gradientstyle) self.Bind(wx.EVT_RADIOBUTTON, self.OnVerticalGradient, self.verticalgradient) self.Bind(wx.EVT_RADIOBUTTON, self.OnHorizontalGradient, self.horizontalgradient) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_BackgroundColour) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_GradientFrom) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_GradientTo) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_BorderColour) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_CaptionColour) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_ButtonTextColour) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_SelectionBrush) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_SelectionPen) self.Bind(wx.EVT_BUTTON, self.OnSetColour, id=ID_SeparatorColour) self.Bind(wx.EVT_SPINCTRL, self.OnSeparator, self.separatorspin) self.Bind(wx.EVT_SPINCTRL, self.OnMargins, self.marginspin) self.Bind(wx.EVT_SPINCTRL, self.OnPadding, self.paddingspin) self.Bind(wx.EVT_SPINCTRL, self.OnBorder, self.borderspin) self.Bind(wx.EVT_CLOSE, self.OnClose) def __set_properties(self): self.defaultstyle.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.defaultstyle.SetValue(1) self.gradientstyle.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.verticalgradient.SetValue(1) if self.targetTitleBar.GetStyle() & bp.BP_DEFAULT_STYLE: self.verticalgradient.Enable(False) self.horizontalgradient.Enable(False) self.defaultstyle.SetValue(1) else: self.gradientstyle.SetValue(1) self.borderspin.SetValue(self.targetTitleBar.GetBPArt().GetMetric(bp.BP_BORDER_SIZE)) self.separatorspin.SetValue(self.targetTitleBar.GetBPArt().GetMetric(bp.BP_SEPARATOR_SIZE)) self.marginspin.SetValue(self.targetTitleBar.GetBPArt().GetMetric(bp.BP_MARGINS_SIZE).x) self.paddingspin.SetValue(self.targetTitleBar.GetBPArt().GetMetric(bp.BP_PADDING_SIZE).x) self.UpdateColors() def __do_layout(self): mainsizer = wx.BoxSizer(wx.VERTICAL) buttonsizer = wx.BoxSizer(wx.HORIZONTAL) bottomsizer = wx.StaticBoxSizer(self.bottomsizer_staticbox, wx.VERTICAL) sizer_13 = wx.BoxSizer(wx.HORIZONTAL) sizer_12 = wx.BoxSizer(wx.HORIZONTAL) sizer_11 = wx.BoxSizer(wx.HORIZONTAL) sizer_10 = wx.BoxSizer(wx.HORIZONTAL) coloursizer = wx.StaticBoxSizer(self.coloursizer_staticbox, wx.HORIZONTAL) rightsizer = wx.BoxSizer(wx.VERTICAL) sizer_9 = wx.BoxSizer(wx.HORIZONTAL) sizer_8 = wx.BoxSizer(wx.HORIZONTAL) sizer_7 = wx.BoxSizer(wx.HORIZONTAL) sizer_6 = wx.BoxSizer(wx.HORIZONTAL) leftsizer = wx.BoxSizer(wx.VERTICAL) sizer_5 = wx.BoxSizer(wx.HORIZONTAL) sizer_4 = wx.BoxSizer(wx.HORIZONTAL) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) sizer_2 = wx.BoxSizer(wx.HORIZONTAL) sizer_1 = wx.BoxSizer(wx.HORIZONTAL) stylesizer = wx.StaticBoxSizer(self.stylesizer_staticbox, wx.VERTICAL) tophsizer = wx.BoxSizer(wx.HORIZONTAL) tophsizer2 = wx.BoxSizer(wx.VERTICAL) stylesizer.Add(self.defaultstyle, 0, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 5) tophsizer.Add(self.gradientstyle, 0, wx.LEFT|wx.RIGHT|wx.EXPAND| wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) tophsizer2.Add(self.verticalgradient, 0, wx.BOTTOM|wx.ADJUST_MINSIZE, 3) tophsizer2.Add(self.horizontalgradient, 0, wx.ADJUST_MINSIZE, 0) tophsizer.Add(tophsizer2, 1, wx.LEFT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 10) stylesizer.Add(tophsizer, 1, wx.EXPAND, 0) mainsizer.Add(stylesizer, 0, wx.ALL|wx.EXPAND, 5) label_1 = wx.StaticText(self.panel, -1, "Background Brush Colour:") sizer_1.Add(label_1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_1.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_1.Add(self.bakbrush, 0, wx.ADJUST_MINSIZE, 0) leftsizer.Add(sizer_1, 1, wx.EXPAND, 0) label_2 = wx.StaticText(self.panel, -1, "Gradient Colour From:") sizer_2.Add(label_2, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_2.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_2.Add(self.gradientfrom, 0, wx.ADJUST_MINSIZE, 0) leftsizer.Add(sizer_2, 1, wx.EXPAND, 0) label_3 = wx.StaticText(self.panel, -1, "Gradient Colour To:") sizer_3.Add(label_3, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_3.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_3.Add(self.gradientto, 0, wx.ADJUST_MINSIZE, 0) leftsizer.Add(sizer_3, 1, wx.EXPAND, 0) label_4 = wx.StaticText(self.panel, -1, "Border Colour:") sizer_4.Add(label_4, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_4.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_4.Add(self.bordercolour, 0, wx.ADJUST_MINSIZE, 0) leftsizer.Add(sizer_4, 1, wx.EXPAND, 0) label_5 = wx.StaticText(self.panel, -1, "Main Caption Colour:") sizer_5.Add(label_5, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_5.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_5.Add(self.captioncolour, 0, wx.ADJUST_MINSIZE, 0) leftsizer.Add(sizer_5, 1, wx.EXPAND, 0) coloursizer.Add(leftsizer, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) coloursizer.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) label_6 = wx.StaticText(self.panel, -1, "Text Button Colour:") sizer_6.Add(label_6, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_6.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_6.Add(self.textbuttoncolour, 0, wx.ADJUST_MINSIZE, 0) rightsizer.Add(sizer_6, 1, wx.EXPAND, 0) label_7 = wx.StaticText(self.panel, -1, "Selection Brush Colour:") sizer_7.Add(label_7, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_7.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_7.Add(self.selectionbrush, 0, wx.ADJUST_MINSIZE, 0) rightsizer.Add(sizer_7, 1, wx.EXPAND, 0) label_8 = wx.StaticText(self.panel, -1, "Selection Pen Colour:") sizer_8.Add(label_8, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_8.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_8.Add(self.selectionpen, 0, wx.ADJUST_MINSIZE, 0) rightsizer.Add(sizer_8, 1, wx.EXPAND, 0) label_9 = wx.StaticText(self.panel, -1, "Separator Colour:") sizer_9.Add(label_9, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_9.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_9.Add(self.separatorcolour, 0, wx.ADJUST_MINSIZE, 0) rightsizer.Add(sizer_9, 1, wx.EXPAND, 0) coloursizer.Add(rightsizer, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) mainsizer.Add(coloursizer, 0, wx.ALL|wx.EXPAND, 5) label_10 = wx.StaticText(self.panel, -1, "Separator Size:") sizer_10.Add(label_10, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_10.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_10.Add(self.separatorspin, 0, wx.ALL|wx.ADJUST_MINSIZE, 5) bottomsizer.Add(sizer_10, 1, wx.EXPAND, 0) label_11 = wx.StaticText(self.panel, -1, "Margins Size:") sizer_11.Add(label_11, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_11.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_11.Add(self.marginspin, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ADJUST_MINSIZE, 5) bottomsizer.Add(sizer_11, 1, wx.EXPAND, 0) label_12 = wx.StaticText(self.panel, -1, "Padding Size:") sizer_12.Add(label_12, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_12.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_12.Add(self.paddingspin, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ADJUST_MINSIZE, 5) bottomsizer.Add(sizer_12, 1, wx.EXPAND, 0) label_13 = wx.StaticText(self.panel, -1, "Border Size:") sizer_13.Add(label_13, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) sizer_13.Add((0, 0), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_13.Add(self.borderspin, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ADJUST_MINSIZE, 5) bottomsizer.Add(sizer_13, 1, wx.EXPAND, 0) mainsizer.Add(bottomsizer, 0, wx.ALL|wx.EXPAND, 5) self.panel.SetSizer(mainsizer) sizer = wx.BoxSizer() sizer.Add(self.panel, 1, wx.EXPAND) self.SetSizer(sizer) self.Fit() def CreateColorBitmap(self, c): image = wx.EmptyImage(25, 14) for x in xrange(25): for y in xrange(14): pixcol = c if x == 0 or x == 24 or y == 0 or y == 13: pixcol = wx.BLACK image.SetRGB(x, y, pixcol.Red(), pixcol.Green(), pixcol.Blue()) return image.ConvertToBitmap() def UpdateColors(self): bk = self.targetTitleBar.GetBPArt().GetColor(bp.BP_BACKGROUND_COLOR) self.bakbrush.SetBitmapLabel(self.CreateColorBitmap(bk)) capfrom = self.targetTitleBar.GetBPArt().GetColor(bp.BP_GRADIENT_COLOR_FROM) self.gradientfrom.SetBitmapLabel(self.CreateColorBitmap(capfrom)) capto = self.targetTitleBar.GetBPArt().GetColor(bp.BP_GRADIENT_COLOR_TO) self.gradientto.SetBitmapLabel(self.CreateColorBitmap(capto)) captxt = self.targetTitleBar.GetBPArt().GetColor(bp.BP_TEXT_COLOR) self.captioncolour.SetBitmapLabel(self.CreateColorBitmap(captxt)) bor = self.targetTitleBar.GetBPArt().GetColor(bp.BP_BORDER_COLOR) self.bordercolour.SetBitmapLabel(self.CreateColorBitmap(bor)) btntext = self.targetTitleBar.GetBPArt().GetColor(bp.BP_BUTTONTEXT_COLOR) self.textbuttoncolour.SetBitmapLabel(self.CreateColorBitmap(btntext)) selb = self.targetTitleBar.GetBPArt().GetColor(bp.BP_SELECTION_BRUSH_COLOR) self.selectionbrush.SetBitmapLabel(self.CreateColorBitmap(selb)) selp = self.targetTitleBar.GetBPArt().GetColor(bp.BP_SELECTION_PEN_COLOR) self.selectionpen.SetBitmapLabel(self.CreateColorBitmap(selp)) sepc = self.targetTitleBar.GetBPArt().GetColor(bp.BP_SEPARATOR_COLOR) self.separatorcolour.SetBitmapLabel(self.CreateColorBitmap(sepc)) def OnDefaultStyle(self, event): self.verticalgradient.Enable(False) self.horizontalgradient.Enable(False) self.targetTitleBar.SetStyle(bp.BP_DEFAULT_STYLE) self.targetTitleBar.Refresh() event.Skip() def OnGradientStyle(self, event): self.verticalgradient.Enable(True) self.horizontalgradient.Enable(True) self.targetTitleBar.SetStyle(bp.BP_USE_GRADIENT) self.targetTitleBar.Refresh() event.Skip() def OnVerticalGradient(self, event): self.targetTitleBar.GetBPArt().SetGradientType(bp.BP_GRADIENT_VERTICAL) self.targetTitleBar.SetStyle(bp.BP_USE_GRADIENT) self.targetTitleBar.Refresh() event.Skip() def OnHorizontalGradient(self, event): self.targetTitleBar.GetBPArt().SetGradientType(bp.BP_GRADIENT_HORIZONTAL) self.targetTitleBar.SetStyle(bp.BP_USE_GRADIENT) self.targetTitleBar.Refresh() event.Skip() def OnSetColour(self, event): dlg = wx.ColourDialog(self.parent) dlg.SetTitle("Color Picker") if dlg.ShowModal() != wx.ID_OK: return var = 0 if event.GetId() == ID_BackgroundColour: var = bp.BP_BACKGROUND_COLOR elif event.GetId() == ID_GradientFrom: var = bp.BP_GRADIENT_COLOR_FROM elif event.GetId() == ID_GradientTo: var = bp.BP_GRADIENT_COLOR_TO elif event.GetId() == ID_BorderColour: var = bp.BP_BORDER_COLOR elif event.GetId() == ID_CaptionColour: var = bp.BP_TEXT_COLOR elif event.GetId() == ID_ButtonTextColour: var = bp.BP_BUTTONTEXT_COLOR elif event.GetId() == ID_SelectionBrush: var = bp.BP_SELECTION_BRUSH_COLOR elif event.GetId() == ID_SelectionPen: var = bp.BP_SELECTION_PEN_COLOR elif event.GetId() == ID_SeparatorColour: var = bp.BP_SEPARATOR_COLOR else: return self.targetTitleBar.GetBPArt().SetColor(var, dlg.GetColourData().GetColour()) self.targetTitleBar.Refresh() self.UpdateColors() self.parent.useredited = True def OnSeparator(self, event): self.targetTitleBar.GetBPArt().SetMetric(bp.BP_SEPARATOR_SIZE, event.GetInt()) self.targetTitleBar.DoLayout() self.parent.mainPanel.Layout() self.parent.useredited = True event.Skip() def OnMargins(self, event): self.targetTitleBar.GetBPArt().SetMetric(bp.BP_MARGINS_SIZE, wx.Size(event.GetInt(), event.GetInt())) self.targetTitleBar.DoLayout() self.parent.mainPanel.Layout() self.parent.useredited = True event.Skip() def OnPadding(self, event): self.targetTitleBar.GetBPArt().SetMetric(bp.BP_PADDING_SIZE, wx.Size(event.GetInt(), event.GetInt())) self.targetTitleBar.DoLayout() self.parent.mainPanel.Layout() self.parent.useredited = True event.Skip() def OnBorder(self, event): self.targetTitleBar.GetBPArt().SetMetric(bp.BP_BORDER_SIZE, event.GetInt()) self.targetTitleBar.DoLayout() self.parent.mainPanel.Layout() self.parent.useredited = True event.Skip() def OnClose(self, event): self.parent.hassettingpanel = False self.Destroy() #---------------------------------------------------------------------- class ButtonPanelDemo(wx.Frame): def __init__(self, parent, id=wx.ID_ANY, title="ButtonPanel wxPython Demo ;-)", pos=wx.DefaultPosition, size=(640, 400), style=wx.DEFAULT_FRAME_STYLE): wx.Frame.__init__(self, parent, id, title, pos, size, style) self.useredited = False self.hassettingpanel = False self.SetIcon(GetMondrianIcon()) self.CreateMenuBar() self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP) self.statusbar.SetStatusWidths([-2, -1]) # statusbar fields statusbar_fields = [("ButtonPanel wxPython Demo, Andrea Gavana @ 02 Oct 2006"), ("Welcome To wxPython!")] for i in range(len(statusbar_fields)): self.statusbar.SetStatusText(statusbar_fields[i], i) self.mainPanel = wx.Panel(self, -1) self.logtext = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY) vSizer = wx.BoxSizer(wx.VERTICAL) self.mainPanel.SetSizer(vSizer) self.alignments = [bp.BP_ALIGN_LEFT, bp.BP_ALIGN_RIGHT, bp.BP_ALIGN_TOP, bp.BP_ALIGN_BOTTOM] self.alignment = bp.BP_ALIGN_LEFT self.style = bp.BP_USE_GRADIENT self.titleBar = bp.ButtonPanel(self.mainPanel, -1, "A Simple Test & Demo", style=self.style, alignment=self.alignment) self.created = False self.pngs = [ (images.get_bp_btn1Bitmap(), 'label1'), (images.get_bp_btn2Bitmap(), 'label2'), (images.get_bp_btn3Bitmap(), 'label3'), (images.get_bp_btn4Bitmap(), 'label4'), ] self.CreateButtons() self.SetProperties() def CreateMenuBar(self): mb = wx.MenuBar() file_menu = wx.Menu() item = wx.MenuItem(file_menu, wx.ID_ANY, "&Quit") file_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnClose, item) edit_menu = wx.Menu() item = wx.MenuItem(edit_menu, wx.ID_ANY, "Set Bar Text") edit_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnSetBarText, item) edit_menu.AppendSeparator() submenu = wx.Menu() item = wx.MenuItem(submenu, wx.ID_ANY, "BP_ALIGN_LEFT", kind=wx.ITEM_RADIO) submenu.AppendItem(item) item.Check(True) self.Bind(wx.EVT_MENU, self.OnAlignment, item) item = wx.MenuItem(submenu, wx.ID_ANY, "BP_ALIGN_RIGHT", kind=wx.ITEM_RADIO) submenu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnAlignment, item) item = wx.MenuItem(submenu, wx.ID_ANY, "BP_ALIGN_TOP", kind=wx.ITEM_RADIO) submenu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnAlignment, item) item = wx.MenuItem(submenu, wx.ID_ANY, "BP_ALIGN_BOTTOM", kind=wx.ITEM_RADIO) submenu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnAlignment, item) edit_menu.AppendMenu(wx.ID_ANY, "&Alignment", submenu) submenu = wx.Menu() item = wx.MenuItem(submenu, wx.ID_ANY, "Default Style", kind=wx.ITEM_RADIO) submenu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnDefaultStyle, item) item = wx.MenuItem(submenu, wx.ID_ANY, "Gradient Style", kind=wx.ITEM_RADIO) submenu.AppendItem(item) item.Check(True) self.Bind(wx.EVT_MENU, self.OnGradientStyle, item) edit_menu.AppendMenu(wx.ID_ANY, "&Styles", submenu) edit_menu.AppendSeparator() item = wx.MenuItem(submenu, wx.ID_ANY, "Settings Panel") edit_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnSettingsPanel, item) demo_menu = wx.Menu() item = wx.MenuItem(demo_menu, wx.ID_ANY, "Default Demo", kind=wx.ITEM_RADIO) demo_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnDefaultDemo, item) item = wx.MenuItem(demo_menu, wx.ID_ANY, "Button Only Demo", kind=wx.ITEM_RADIO) demo_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnButtonOnly, item) help_menu = wx.Menu() item = wx.MenuItem(help_menu, wx.ID_ANY, "&About...") help_menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnAbout, item) mb.Append(file_menu, "&File") mb.Append(edit_menu, "&Edit") mb.Append(demo_menu, "&Demo") mb.Append(help_menu, "&Help") self.SetMenuBar(mb) def CreateButtons(self): # Here we (re)create the buttons for the default startup demo self.Freeze() if self.created: sizer = self.mainPanel.GetSizer() sizer.Detach(0) self.titleBar.Hide() wx.CallAfter(self.titleBar.Destroy) self.titleBar = bp.ButtonPanel(self.mainPanel, -1, "A Simple Test & Demo", style=self.style, alignment=self.alignment) self.SetProperties() self.indices = [] for count, png in enumerate(self.pngs): shortHelp = "Button %d"%(count+1) if count < 2: # First 2 buttons are togglebuttons kind = wx.ITEM_CHECK longHelp = "ButtonPanel Toggle Button No %d"%(count+1) else: kind = wx.ITEM_NORMAL longHelp = "Simple Button without label No %d"%(count+1) btn = bp.ButtonInfo(self.titleBar, wx.NewId(), png[0], kind=kind, shortHelp=shortHelp, longHelp=longHelp) self.titleBar.AddButton(btn) self.Bind(wx.EVT_BUTTON, self.OnButton, id=btn.GetId()) self.indices.append(btn.GetId()) if count < 2: # First 2 buttons have also a text btn.SetText(png[1]) if count == 2: # Append a separator after the second button self.titleBar.AddSeparator() if count == 1: # Add a wx.TextCtrl to ButtonPanel self.titleBar.AddControl(wx.TextCtrl(self.titleBar, -1, "Hello wxPython!")) btn.SetTextAlignment(bp.BP_BUTTONTEXT_ALIGN_RIGHT) # Add a wx.Choice to ButtonPanel self.titleBar.AddControl(wx.Choice(self.titleBar, -1, choices=["Hello", "From", "wxPython!"])) self.strings = ["First", "Second", "Third", "Fourth"] self.ChangeLayout() self.Thaw() self.titleBar.DoLayout() self.created = True def ButtonOnly(self): # Here we (re)create the buttons for the button-only demo self.Freeze() if self.created: sizer = self.mainPanel.GetSizer() sizer.Detach(0) self.titleBar.Hide() wx.CallAfter(self.titleBar.Destroy) self.titleBar = bp.ButtonPanel(self.mainPanel, -1, "A Simple Test & Demo", style=self.style, alignment=self.alignment) self.SetProperties() # Buttons are created completely random, with random images, toggle behavior # and text self.indices = [] for count in xrange(8): itemImage = random.randint(0, 3) hasText = random.randint(0, 1) itemKind = random.randint(0, 1) btn = bp.ButtonInfo(self.titleBar, wx.NewId(), self.pngs[itemImage][0], kind=itemKind) if hasText: btn.SetText(self.pngs[itemImage][1]) rightText = random.randint(0, 1) if rightText: btn.SetTextAlignment(bp.BP_BUTTONTEXT_ALIGN_RIGHT) self.titleBar.AddButton(btn) self.Bind(wx.EVT_BUTTON, self.OnButton, id=btn.GetId()) self.indices.append(btn.GetId()) if count in [0, 3, 5]: self.titleBar.AddSeparator() self.strings = ["First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth"] self.ChangeLayout() self.Thaw() self.titleBar.DoLayout() def ChangeLayout(self): # Change the layout after a switch in ButtonPanel alignment self.Freeze() if self.alignment in [bp.BP_ALIGN_LEFT, bp.BP_ALIGN_RIGHT]: vSizer = wx.BoxSizer(wx.VERTICAL) else: vSizer = wx.BoxSizer(wx.HORIZONTAL) self.mainPanel.SetSizer(vSizer) vSizer.Add(self.titleBar, 0, wx.EXPAND) vSizer.Add((20, 20)) vSizer.Add(self.logtext, 1, wx.EXPAND|wx.ALL, 5) vSizer.Layout() self.mainPanel.Layout() self.Thaw() def SetProperties(self): # No resetting if the user is using the Settings Panel if self.useredited: return # Sets the colours for the two demos: called only if the user didn't # modify the colours and sizes using the Settings Panel bpArt = self.titleBar.GetBPArt() if self.style & bp.BP_USE_GRADIENT: # set the color the text is drawn with bpArt.SetColor(bp.BP_TEXT_COLOR, wx.WHITE) # These default to white and whatever is set in the system # settings for the wx.SYS_COLOUR_ACTIVECAPTION. We'll use # some specific settings to ensure a consistent look for the # demo. bpArt.SetColor(bp.BP_BORDER_COLOR, wx.Colour(120,23,224)) bpArt.SetColor(bp.BP_GRADIENT_COLOR_FROM, wx.Colour(60,11,112)) bpArt.SetColor(bp.BP_GRADIENT_COLOR_TO, wx.Colour(120,23,224)) bpArt.SetColor(bp.BP_BUTTONTEXT_COLOR, wx.Colour(70,143,255)) bpArt.SetColor(bp.BP_SEPARATOR_COLOR, bp.BrightenColour(wx.Colour(60, 11, 112), 0.85)) bpArt.SetColor(bp.BP_SELECTION_BRUSH_COLOR, wx.Color(225, 225, 255)) bpArt.SetColor(bp.BP_SELECTION_PEN_COLOR, wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION)) else: background = self.titleBar.GetBackgroundColour() bpArt.SetColor(bp.BP_TEXT_COLOR, wx.BLUE) bpArt.SetColor(bp.BP_BORDER_COLOR, bp.BrightenColour(background, 0.85)) bpArt.SetColor(bp.BP_SEPARATOR_COLOR, bp.BrightenColour(background, 0.85)) bpArt.SetColor(bp.BP_BUTTONTEXT_COLOR, wx.BLACK) bpArt.SetColor(bp.BP_SELECTION_BRUSH_COLOR, wx.Colour(242, 242, 235)) bpArt.SetColor(bp.BP_SELECTION_PEN_COLOR, wx.Colour(206, 206, 195)) self.titleBar.SetStyle(self.style) def OnAlignment(self, event): # Here we change the alignment property of ButtonPanel current = event.GetId() edit_menu = self.GetMenuBar().FindMenu("Edit") edit_menu = self.GetMenuBar().GetMenu(edit_menu) menu = edit_menu.FindItem("BP_ALIGN_LEFT") alignment = self.alignments[current - menu] self.alignment = alignment self.ChangeLayout() self.titleBar.SetAlignment(alignment) self.mainPanel.Layout() event.Skip() def OnDefaultStyle(self, event): # Restore the ButtonPanel default style (no gradient) self.style = bp.BP_DEFAULT_STYLE self.SetProperties() event.Skip() def OnGradientStyle(self, event): # Use gradients to paint ButtonPanel background self.style = bp.BP_USE_GRADIENT self.SetProperties() event.Skip() def OnDefaultDemo(self, event): # Reload the default startup demo self.CreateButtons() event.Skip() def OnButtonOnly(self, event): # Reload the button-only demo self.ButtonOnly() event.Skip() def OnButton(self, event): btn = event.GetId() indx = self.indices.index(btn) self.logtext.AppendText("Event Fired From " + self.strings[indx] + " Button\n") event.Skip() def OnSetBarText(self, event): dlg = wx.TextEntryDialog(self, "Enter The Text You Wish To Display On The Bar (Clear If No Text):", "Set Text", self.titleBar.GetBarText()) if dlg.ShowModal() == wx.ID_OK: val = dlg.GetValue() self.titleBar.SetBarText(val) self.titleBar.DoLayout() self.mainPanel.Layout() def OnSettingsPanel(self, event): if self.hassettingpanel: self.settingspanel.Raise() return self.settingspanel = SettingsPanel(self, -1) self.settingspanel.Show() self.hassettingpanel = True def OnClose(self, event): self.Destroy() event.Skip() def OnAbout(self, event): msg = "This Is The About Dialog Of The ButtonPanel Demo.\n\n" + \ "Author: Andrea Gavana @ 02 Oct 2006\n\n" + \ "Please Report Any Bug/Requests Of Improvements\n" + \ "To Me At The Following Adresses:\n\n" + \ "andrea.gavana@gmail.com\n" + "gavana@kpo.kz\n\n" + \ "Based On Eran C++ Implementation (wxWidgets Forum).\n\n" + \ "Welcome To wxPython " + wx.VERSION_STRING + "!!" dlg = wx.MessageDialog(self, msg, "ButtonPanel wxPython Demo", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() #---------------------------------------------------------------------- class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1) b = wx.Button(self, -1, " Test ButtonPanel ", (50,50)) self.Bind(wx.EVT_BUTTON, self.OnButton, b) def OnButton(self, evt): self.win = ButtonPanelDemo(self) self.win.Show(True) #---------------------------------------------------------------------- def runTest(frame, nb, log): win = TestPanel(nb, log) return win #---------------------------------------------------------------------- overview = bp.__doc__ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])