Changed the doodle sample to use the new wx namespace, also enhanced a

few things


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@20948 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2003-06-05 18:57:17 +00:00
parent c6afc57c82
commit 7b32730bab
3 changed files with 402 additions and 112 deletions

View File

@@ -6,11 +6,11 @@ can do simple drawings upon.
""" """
from wxPython.wx import * import wx
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class DoodleWindow(wxWindow): class DoodleWindow(wx.Window):
menuColours = { 100 : 'Black', menuColours = { 100 : 'Black',
101 : 'Yellow', 101 : 'Yellow',
102 : 'Red', 102 : 'Red',
@@ -32,7 +32,7 @@ class DoodleWindow(wxWindow):
def __init__(self, parent, ID): def __init__(self, parent, ID):
wxWindow.__init__(self, parent, ID, style=wxNO_FULL_REPAINT_ON_RESIZE) wx.Window.__init__(self, parent, ID, style=wx.NO_FULL_REPAINT_ON_RESIZE)
self.SetBackgroundColour("WHITE") self.SetBackgroundColour("WHITE")
self.listeners = [] self.listeners = []
self.thickness = 1 self.thickness = 1
@@ -44,20 +44,20 @@ class DoodleWindow(wxWindow):
self.InitBuffer() self.InitBuffer()
# hook some mouse events # hook some mouse events
EVT_LEFT_DOWN(self, self.OnLeftDown) wx.EVT_LEFT_DOWN(self, self.OnLeftDown)
EVT_LEFT_UP(self, self.OnLeftUp) wx.EVT_LEFT_UP(self, self.OnLeftUp)
EVT_RIGHT_UP(self, self.OnRightUp) wx.EVT_RIGHT_UP(self, self.OnRightUp)
EVT_MOTION(self, self.OnMotion) wx.EVT_MOTION(self, self.OnMotion)
# the window resize event and idle events for managing the buffer # the window resize event and idle events for managing the buffer
EVT_SIZE(self, self.OnSize) wx.EVT_SIZE(self, self.OnSize)
EVT_IDLE(self, self.OnIdle) wx.EVT_IDLE(self, self.OnIdle)
# and the refresh event # and the refresh event
EVT_PAINT(self, self.OnPaint) wx.EVT_PAINT(self, self.OnPaint)
# When the window is destroyed, clean up resources. # When the window is destroyed, clean up resources.
EVT_WINDOW_DESTROY(self, self.Cleanup) wx.EVT_WINDOW_DESTROY(self, self.Cleanup)
def Cleanup(self, evt): def Cleanup(self, evt):
@@ -69,9 +69,9 @@ class DoodleWindow(wxWindow):
def InitBuffer(self): def InitBuffer(self):
"""Initialize the bitmap used for buffering the display.""" """Initialize the bitmap used for buffering the display."""
size = self.GetClientSize() size = self.GetClientSize()
self.buffer = wxEmptyBitmap(size.width, size.height) self.buffer = wx.EmptyBitmap(size.width, size.height)
dc = wxBufferedDC(None, self.buffer) dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wxBrush(self.GetBackgroundColour())) dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear() dc.Clear()
self.DrawLines(dc) self.DrawLines(dc)
self.reInitBuffer = False self.reInitBuffer = False
@@ -80,14 +80,14 @@ class DoodleWindow(wxWindow):
def SetColour(self, colour): def SetColour(self, colour):
"""Set a new colour and make a matching pen""" """Set a new colour and make a matching pen"""
self.colour = colour self.colour = colour
self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID) self.pen = wx.Pen(self.colour, self.thickness, wx.SOLID)
self.Notify() self.Notify()
def SetThickness(self, num): def SetThickness(self, num):
"""Set a new line thickness and make a matching pen""" """Set a new line thickness and make a matching pen"""
self.thickness = num self.thickness = num
self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID) self.pen = wx.Pen(self.colour, self.thickness, wx.SOLID)
self.Notify() self.Notify()
@@ -103,20 +103,20 @@ class DoodleWindow(wxWindow):
def MakeMenu(self): def MakeMenu(self):
"""Make a menu that can be popped up later""" """Make a menu that can be popped up later"""
menu = wxMenu() menu = wx.Menu()
keys = self.menuColours.keys() keys = self.menuColours.keys()
keys.sort() keys.sort()
for k in keys: for k in keys:
text = self.menuColours[k] text = self.menuColours[k]
menu.Append(k, text, kind=wxITEM_CHECK) menu.Append(k, text, kind=wx.ITEM_CHECK)
EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour) wx.EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour)
EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours) wx.EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours)
menu.Break() menu.Break()
for x in range(1, self.maxThickness+1): for x in range(1, self.maxThickness+1):
menu.Append(x, str(x), kind=wxITEM_CHECK) menu.Append(x, str(x), kind=wx.ITEM_CHECK)
EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness) wx.EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness)
EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness) wx.EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness)
self.menu = menu self.menu = menu
@@ -167,7 +167,7 @@ class DoodleWindow(wxWindow):
current one. Save the coordinants for redraws. current one. Save the coordinants for redraws.
""" """
if event.Dragging() and event.LeftIsDown(): if event.Dragging() and event.LeftIsDown():
dc = wxBufferedDC(wxClientDC(self), self.buffer) dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
dc.BeginDrawing() dc.BeginDrawing()
dc.SetPen(self.pen) dc.SetPen(self.pen)
pos = event.GetPositionTuple() pos = event.GetPositionTuple()
@@ -203,10 +203,10 @@ class DoodleWindow(wxWindow):
Called when the window is exposed. Called when the window is exposed.
""" """
# Create a buffered paint DC. It will create the real # Create a buffered paint DC. It will create the real
# wxPaintDC and then blit the bitmap to it when dc is # wx.PaintDC and then blit the bitmap to it when dc is
# deleted. Since we don't need to draw anything else # deleted. Since we don't need to draw anything else
# here that's all there is to it. # here that's all there is to it.
dc = wxBufferedPaintDC(self, self.buffer) dc = wx.BufferedPaintDC(self, self.buffer)
def DrawLines(self, dc): def DrawLines(self, dc):
@@ -215,7 +215,7 @@ class DoodleWindow(wxWindow):
""" """
dc.BeginDrawing() dc.BeginDrawing()
for colour, thickness, line in self.lines: for colour, thickness, line in self.lines:
pen = wxPen(wxNamedColour(colour), thickness, wxSOLID) pen = wx.Pen(colour, thickness, wx.SOLID)
dc.SetPen(pen) dc.SetPen(pen)
for coords in line: for coords in line:
apply(dc.DrawLine, coords) apply(dc.DrawLine, coords)
@@ -243,16 +243,16 @@ class DoodleWindow(wxWindow):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class DoodleFrame(wxFrame): class DoodleFrame(wx.Frame):
def __init__(self, parent): def __init__(self, parent):
wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600), wx.Frame.__init__(self, parent, -1, "Doodle Frame", size=(800,600),
style=wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
doodle = DoodleWindow(self, -1) doodle = DoodleWindow(self, -1)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
if __name__ == '__main__': if __name__ == '__main__':
app = wxPySimpleApp() app = wx.PySimpleApp()
frame = DoodleFrame(None) frame = DoodleFrame(None)
frame.Show(True) frame.Show(True)
app.MainLoop() app.MainLoop()

View File

@@ -4008,4 +4008,261 @@ I472
I599 I599
I473 I473
tatp56 tatp56
a(S'Red'
p57
I4
(lp58
(I503
I412
I503
I411
ta(I503
I411
I504
I411
ta(I504
I411
I504
I410
ta(I504
I410
I505
I410
ta(I505
I410
I505
I409
ta(I505
I409
I506
I409
ta(I506
I409
I507
I409
ta(I507
I409
I507
I408
ta(I507
I408
I508
I408
ta(I508
I408
I509
I408
ta(I509
I408
I510
I408
ta(I510
I408
I511
I408
ta(I511
I408
I511
I409
ta(I511
I409
I511
I410
ta(I511
I410
I512
I410
ta(I512
I410
I512
I411
ta(I512
I411
I512
I412
ta(I512
I412
I512
I413
ta(I512
I413
I512
I414
ta(I512
I414
I512
I415
ta(I512
I415
I511
I415
ta(I511
I415
I511
I416
ta(I511
I416
I510
I416
ta(I510
I416
I510
I417
ta(I510
I417
I509
I417
ta(I509
I417
I508
I418
ta(I508
I418
I508
I419
ta(I508
I419
I507
I420
ta(I507
I420
I506
I421
ta(I506
I421
I505
I421
ta(I505
I421
I504
I422
ta(I504
I422
I503
I423
ta(I503
I423
I503
I424
ta(I503
I424
I502
I425
ta(I502
I425
I502
I426
tatp59
a(g57
I4
(lp60
(I503
I414
I502
I414
ta(I502
I414
I502
I413
ta(I502
I413
I501
I413
ta(I501
I413
I499
I412
ta(I499
I412
I498
I412
ta(I498
I412
I497
I412
ta(I497
I412
I496
I412
ta(I496
I412
I495
I412
ta(I495
I412
I494
I412
ta(I494
I412
I493
I413
ta(I493
I413
I493
I414
ta(I493
I414
I493
I415
ta(I493
I415
I493
I416
ta(I493
I416
I493
I417
ta(I493
I417
I493
I418
ta(I493
I418
I493
I419
ta(I493
I419
I493
I420
ta(I493
I420
I494
I421
ta(I494
I421
I495
I422
ta(I495
I422
I496
I422
ta(I496
I422
I497
I423
ta(I497
I423
I498
I423
ta(I498
I423
I498
I424
ta(I498
I424
I499
I424
ta(I499
I424
I500
I424
ta(I500
I424
I500
I425
ta(I500
I425
I501
I425
tatp61
a. a.

View File

@@ -7,10 +7,12 @@ intelligent Frame. This one has a menu and a statusbar, is able to
save and reload doodles, clear the workspace, and has a simple control save and reload doodles, clear the workspace, and has a simple control
panel for setting color and line thickness in addition to the popup panel for setting color and line thickness in addition to the popup
menu that DoodleWindow provides. There is also a nice About dialog menu that DoodleWindow provides. There is also a nice About dialog
implmented using an wxHtmlWindow. implmented using an wx.html.HtmlWindow.
""" """
from wxPython.wx import * import wx
import wx.html
from wx.lib import buttons # for generic button classes
from doodle import DoodleWindow from doodle import DoodleWindow
import os, cPickle import os, cPickle
@@ -18,25 +20,28 @@ import os, cPickle
#---------------------------------------------------------------------- #----------------------------------------------------------------------
idNEW = 11001 wx.RegisterId(5000) # Give a high starting value for the IDs, just for kicks
idOPEN = 11002
idSAVE = 11003 idNEW = wx.NewId()
idSAVEAS = 11004 idOPEN = wx.NewId()
idCLEAR = 11005 idSAVE = wx.NewId()
idEXIT = 11006 idSAVEAS = wx.NewId()
idABOUT = 11007 idCLEAR = wx.NewId()
idEXIT = wx.NewId()
idABOUT = wx.NewId()
class DoodleFrame(wxFrame):
class DoodleFrame(wx.Frame):
""" """
A DoodleFrame contains a DoodleWindow and a ControlPanel and manages A DoodleFrame contains a DoodleWindow and a ControlPanel and manages
their layout with a wxBoxSizer. A menu and associated event handlers their layout with a wx.BoxSizer. A menu and associated event handlers
provides for saving a doodle to a file, etc. provides for saving a doodle to a file, etc.
""" """
title = "Do a doodle" title = "Do a doodle"
def __init__(self, parent): def __init__(self, parent):
wxFrame.__init__(self, parent, -1, self.title, size=(800,600), wx.Frame.__init__(self, parent, -1, self.title, size=(800,600),
style=wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
self.CreateStatusBar() self.CreateStatusBar()
self.MakeMenu() self.MakeMenu()
self.filename = None self.filename = None
@@ -47,9 +52,9 @@ class DoodleFrame(wxFrame):
# Create a sizer to layout the two windows side-by-side. # Create a sizer to layout the two windows side-by-side.
# Both will grow vertically, the doodle window will grow # Both will grow vertically, the doodle window will grow
# horizontally as well. # horizontally as well.
box = wxBoxSizer(wxHORIZONTAL) box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(cPanel, 0, wxEXPAND) box.Add(cPanel, 0, wx.EXPAND)
box.Add(self.doodle, 1, wxEXPAND) box.Add(self.doodle, 1, wx.EXPAND)
# Tell the frame that it should layout itself in response to # Tell the frame that it should layout itself in response to
# size events. # size events.
@@ -73,15 +78,19 @@ class DoodleFrame(wxFrame):
f.close() f.close()
self.doodle.SetLinesData(data) self.doodle.SetLinesData(data)
except cPickle.UnpicklingError: except cPickle.UnpicklingError:
wxMessageBox("%s is not a doodle file." % self.filename, wx.MessageBox("%s is not a doodle file." % self.filename,
"oops!", style=wxOK|wxICON_EXCLAMATION) "oops!", style=wx.OK|wx.ICON_EXCLAMATION)
def MakeMenu(self): def MakeMenu(self):
# create the file menu # create the file menu
menu1 = wxMenu() menu1 = wx.Menu()
menu1.Append(idOPEN, "&Open", "Open a doodle file")
menu1.Append(idSAVE, "&Save", "Save the doodle") # Using the "\tKeyName" syntax automatically creates a
# wx.AcceleratorTable for this frame and binds the keys to
# the menu items.
menu1.Append(idOPEN, "&Open\tCtrl-O", "Open a doodle file")
menu1.Append(idSAVE, "&Save\tCtrl-S", "Save the doodle")
menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file") menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file")
menu1.AppendSeparator() menu1.AppendSeparator()
menu1.Append(idCLEAR, "&Clear", "Clear the current doodle") menu1.Append(idCLEAR, "&Clear", "Clear the current doodle")
@@ -89,30 +98,30 @@ class DoodleFrame(wxFrame):
menu1.Append(idEXIT, "E&xit", "Terminate the application") menu1.Append(idEXIT, "E&xit", "Terminate the application")
# and the help menu # and the help menu
menu2 = wxMenu() menu2 = wx.Menu()
menu2.Append(idABOUT, "&About", "Display the gratuitous 'about this app' thingamajig") menu2.Append(idABOUT, "&About\tCtrl-H", "Display the gratuitous 'about this app' thingamajig")
# and add them to a menubar # and add them to a menubar
menuBar = wxMenuBar() menuBar = wx.MenuBar()
menuBar.Append(menu1, "&File") menuBar.Append(menu1, "&File")
menuBar.Append(menu2, "&Help") menuBar.Append(menu2, "&Help")
self.SetMenuBar(menuBar) self.SetMenuBar(menuBar)
EVT_MENU(self, idOPEN, self.OnMenuOpen) wx.EVT_MENU(self, idOPEN, self.OnMenuOpen)
EVT_MENU(self, idSAVE, self.OnMenuSave) wx.EVT_MENU(self, idSAVE, self.OnMenuSave)
EVT_MENU(self, idSAVEAS, self.OnMenuSaveAs) wx.EVT_MENU(self, idSAVEAS, self.OnMenuSaveAs)
EVT_MENU(self, idCLEAR, self.OnMenuClear) wx.EVT_MENU(self, idCLEAR, self.OnMenuClear)
EVT_MENU(self, idEXIT, self.OnMenuExit) wx.EVT_MENU(self, idEXIT, self.OnMenuExit)
EVT_MENU(self, idABOUT, self.OnMenuAbout) wx.EVT_MENU(self, idABOUT, self.OnMenuAbout)
wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*" wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*"
def OnMenuOpen(self, event): def OnMenuOpen(self, event):
dlg = wxFileDialog(self, "Open doodle file...", os.getcwd(), dlg = wx.FileDialog(self, "Open doodle file...", os.getcwd(),
style=wxOPEN, wildcard = self.wildcard) style=wx.OPEN, wildcard = self.wildcard)
if dlg.ShowModal() == wxID_OK: if dlg.ShowModal() == wx.ID_OK:
self.filename = dlg.GetPath() self.filename = dlg.GetPath()
self.ReadFile() self.ReadFile()
self.SetTitle(self.title + ' -- ' + self.filename) self.SetTitle(self.title + ' -- ' + self.filename)
@@ -127,10 +136,10 @@ class DoodleFrame(wxFrame):
def OnMenuSaveAs(self, event): def OnMenuSaveAs(self, event):
dlg = wxFileDialog(self, "Save doodle as...", os.getcwd(), dlg = wx.FileDialog(self, "Save doodle as...", os.getcwd(),
style=wxSAVE | wxOVERWRITE_PROMPT, style=wx.SAVE | wx.OVERWRITE_PROMPT,
wildcard = self.wildcard) wildcard = self.wildcard)
if dlg.ShowModal() == wxID_OK: if dlg.ShowModal() == wx.ID_OK:
filename = dlg.GetPath() filename = dlg.GetPath()
if not os.path.splitext(filename)[1]: if not os.path.splitext(filename)[1]:
filename = filename + '.ddl' filename = filename + '.ddl'
@@ -159,7 +168,7 @@ class DoodleFrame(wxFrame):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class ControlPanel(wxPanel): class ControlPanel(wx.Panel):
""" """
This class implements a very simple control panel for the DoodleWindow. This class implements a very simple control panel for the DoodleWindow.
It creates buttons for each of the colours and thickneses supported by It creates buttons for each of the colours and thickneses supported by
@@ -167,36 +176,51 @@ class ControlPanel(wxPanel):
also a little window that shows an example doodleLine in the selected also a little window that shows an example doodleLine in the selected
values. Nested sizers are used for layout. values. Nested sizers are used for layout.
""" """
BMP_SIZE = 16
BMP_BORDER = 3
def __init__(self, parent, ID, doodle): def __init__(self, parent, ID, doodle):
wxPanel.__init__(self, parent, ID, style=wxRAISED_BORDER) wx.Panel.__init__(self, parent, ID, style=wx.RAISED_BORDER)
numCols = 4 numCols = 4
spacing = 4 spacing = 4
btnSize = wx.Size(self.BMP_SIZE + 2*self.BMP_BORDER,
self.BMP_SIZE + 2*self.BMP_BORDER)
# Make a grid of buttons for each colour. Attach each button # Make a grid of buttons for each colour. Attach each button
# event to self.OnSetColour. The button ID is the same as the # event to self.OnSetColour. The button ID is the same as the
# key in the colour dictionary. # key in the colour dictionary.
self.clrBtns = {}
colours = doodle.menuColours colours = doodle.menuColours
keys = colours.keys() keys = colours.keys()
keys.sort() keys.sort()
cGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2) cGrid = wx.GridSizer(cols=numCols, hgap=2, vgap=2)
for k in keys: for k in keys:
bmp = self.MakeBitmap(wxNamedColour(colours[k])) bmp = self.MakeBitmap(colours[k])
b = wxBitmapButton(self, k, bmp) b = buttons.GenBitmapToggleButton(self, k, bmp, size=btnSize )
EVT_BUTTON(self, k, self.OnSetColour) b.SetBezelWidth(1)
b.SetUseFocusIndicator(False)
wx.EVT_BUTTON(self, k, self.OnSetColour)
cGrid.Add(b, 0) cGrid.Add(b, 0)
self.clrBtns[colours[k]] = b
self.clrBtns[colours[keys[0]]].SetToggle(True)
# Save the button size so we can use it for the number buttons
btnSize = b.GetSize()
# Make a grid of buttons for the thicknesses. Attach each button # Make a grid of buttons for the thicknesses. Attach each button
# event to self.OnSetThickness. The button ID is the same as the # event to self.OnSetThickness. The button ID is the same as the
# thickness value. # thickness value.
tGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2) self.thknsBtns = {}
tGrid = wx.GridSizer(cols=numCols, hgap=2, vgap=2)
for x in range(1, doodle.maxThickness+1): for x in range(1, doodle.maxThickness+1):
b = wxButton(self, x, str(x), size=btnSize) b = buttons.GenToggleButton(self, x, str(x), size=btnSize)
EVT_BUTTON(self, x, self.OnSetThickness) b.SetBezelWidth(1)
b.SetUseFocusIndicator(False)
wx.EVT_BUTTON(self, x, self.OnSetThickness)
tGrid.Add(b, 0) tGrid.Add(b, 0)
self.thknsBtns[x] = b
self.thknsBtns[1].SetToggle(True)
# Make a colour indicator window, it is registerd as a listener # Make a colour indicator window, it is registerd as a listener
# with the doodle window so it will be notified when the settings # with the doodle window so it will be notified when the settings
@@ -208,10 +232,10 @@ class ControlPanel(wxPanel):
# Make a box sizer and put the two grids and the indicator # Make a box sizer and put the two grids and the indicator
# window in it. # window in it.
box = wxBoxSizer(wxVERTICAL) box = wx.BoxSizer(wx.VERTICAL)
box.Add(cGrid, 0, wxALL, spacing) box.Add(cGrid, 0, wx.ALL, spacing)
box.Add(tGrid, 0, wxALL, spacing) box.Add(tGrid, 0, wx.ALL, spacing)
box.Add(ci, 0, wxEXPAND|wxALL, spacing) box.Add(ci, 0, wx.EXPAND|wx.ALL, spacing)
self.SetSizer(box) self.SetSizer(box)
self.SetAutoLayout(True) self.SetAutoLayout(True)
@@ -224,15 +248,15 @@ class ControlPanel(wxPanel):
def MakeBitmap(self, colour): def MakeBitmap(self, colour):
""" """
We can create a bitmap of whatever we want by simply selecting We can create a bitmap of whatever we want by simply selecting
it into a wxMemoryDC and drawing on it. In this case we just set it into a wx.MemoryDC and drawing on it. In this case we just set
a background brush and clear the dc. a background brush and clear the dc.
""" """
bmp = wxEmptyBitmap(16,16) bmp = wx.EmptyBitmap(self.BMP_SIZE, self.BMP_SIZE)
dc = wxMemoryDC() dc = wx.MemoryDC()
dc.SelectObject(bmp) dc.SelectObject(bmp)
dc.SetBackground(wxBrush(colour)) dc.SetBackground(wx.Brush(colour))
dc.Clear() dc.Clear()
dc.SelectObject(wxNullBitmap) dc.SelectObject(wx.NullBitmap)
return bmp return bmp
@@ -241,6 +265,10 @@ class ControlPanel(wxPanel):
Use the event ID to get the colour, set that colour in the doodle. Use the event ID to get the colour, set that colour in the doodle.
""" """
colour = self.doodle.menuColours[event.GetId()] colour = self.doodle.menuColours[event.GetId()]
if colour != self.doodle.colour:
# untoggle the old colour button
self.clrBtns[self.doodle.colour].SetToggle(False)
# set the new colour
self.doodle.SetColour(colour) self.doodle.SetColour(colour)
@@ -248,22 +276,28 @@ class ControlPanel(wxPanel):
""" """
Use the event ID to set the thickness in the doodle. Use the event ID to set the thickness in the doodle.
""" """
self.doodle.SetThickness(event.GetId()) thickness = event.GetId()
if thickness != self.doodle.thickness:
# untoggle the old thickness button
self.thknsBtns[self.doodle.thickness].SetToggle(False)
# set the new colour
self.doodle.SetThickness(thickness)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class ColourIndicator(wxWindow): class ColourIndicator(wx.Window):
""" """
An instance of this class is used on the ControlPanel to show An instance of this class is used on the ControlPanel to show
a sample of what the current doodle line will look like. a sample of what the current doodle line will look like.
""" """
def __init__(self, parent): def __init__(self, parent):
wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER) wx.Window.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
self.SetBackgroundColour(wxWHITE) self.SetBackgroundColour(wx.WHITE)
self.SetSize(wxSize(-1, 45)) self.SetSize( (-1, 45) )
self.colour = self.thickness = None self.colour = self.thickness = None
EVT_PAINT(self, self.OnPaint) wx.EVT_PAINT(self, self.OnPaint)
def Update(self, colour, thickness): def Update(self, colour, thickness):
@@ -281,10 +315,10 @@ class ColourIndicator(wxWindow):
This method is called when all or part of the window needs to be This method is called when all or part of the window needs to be
redrawn. redrawn.
""" """
dc = wxPaintDC(self) dc = wx.PaintDC(self)
if self.colour: if self.colour:
sz = self.GetClientSize() sz = self.GetClientSize()
pen = wxPen(wxNamedColour(self.colour), self.thickness) pen = wx.Pen(self.colour, self.thickness)
dc.BeginDrawing() dc.BeginDrawing()
dc.SetPen(pen) dc.SetPen(pen)
dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2) dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2)
@@ -293,7 +327,7 @@ class ColourIndicator(wxWindow):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class DoodleAbout(wxDialog): class DoodleAbout(wx.Dialog):
""" An about box that uses an HTML window """ """ An about box that uses an HTML window """
text = ''' text = '''
@@ -318,44 +352,43 @@ instructions: </p>
<p><b>SuperDoodle</b> and <b>wxPython</b> are brought to you by <p><b>SuperDoodle</b> and <b>wxPython</b> are brought to you by
<b>Robin Dunn</b> and <b>Total Control Software</b>, Copyright <b>Robin Dunn</b> and <b>Total Control Software</b>, Copyright
&copy; 1997-2001.</p> &copy; 1997-2003.</p>
</body> </body>
</html> </html>
''' '''
def __init__(self, parent): def __init__(self, parent):
wxDialog.__init__(self, parent, -1, 'About SuperDoodle', wx.Dialog.__init__(self, parent, -1, 'About SuperDoodle',
size=wxSize(420, 380)) size=(420, 380) )
from wxPython.html import wxHtmlWindow
html = wxHtmlWindow(self, -1) html = wx.html.HtmlWindow(self, -1)
html.SetPage(self.text) html.SetPage(self.text)
button = wxButton(self, wxID_OK, "Okay") button = wx.Button(self, wx.ID_OK, "Okay")
# constraints for the html window # constraints for the html window
lc = wxLayoutConstraints() lc = wx.LayoutConstraints()
lc.top.SameAs(self, wxTop, 5) lc.top.SameAs(self, wx.Top, 5)
lc.left.SameAs(self, wxLeft, 5) lc.left.SameAs(self, wx.Left, 5)
lc.bottom.SameAs(button, wxTop, 5) lc.bottom.SameAs(button, wx.Top, 5)
lc.right.SameAs(self, wxRight, 5) lc.right.SameAs(self, wx.Right, 5)
html.SetConstraints(lc) html.SetConstraints(lc)
# constraints for the button # constraints for the button
lc = wxLayoutConstraints() lc = wx.LayoutConstraints()
lc.bottom.SameAs(self, wxBottom, 5) lc.bottom.SameAs(self, wx.Bottom, 5)
lc.centreX.SameAs(self, wxCentreX) lc.centreX.SameAs(self, wx.CentreX)
lc.width.AsIs() lc.width.AsIs()
lc.height.AsIs() lc.height.AsIs()
button.SetConstraints(lc) button.SetConstraints(lc)
self.SetAutoLayout(True) self.SetAutoLayout(True)
self.Layout() self.Layout()
self.CentreOnParent(wxBOTH) self.CentreOnParent(wx.BOTH)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class DoodleApp(wxApp): class DoodleApp(wx.App):
def OnInit(self): def OnInit(self):
frame = DoodleFrame(None) frame = DoodleFrame(None)
frame.Show(True) frame.Show(True)