X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c12bc4de5887421242de7f619b3c5e265bf631ac..c5750ccb5f8092e23e353b3923d5a78af17e672f:/wxPython/samples/doodle/doodle.py diff --git a/wxPython/samples/doodle/doodle.py b/wxPython/samples/doodle/doodle.py index 7756834b09..8fefcd0416 100644 --- a/wxPython/samples/doodle/doodle.py +++ b/wxPython/samples/doodle/doodle.py @@ -32,8 +32,8 @@ class DoodleWindow(wxWindow): def __init__(self, parent, ID): - wxWindow.__init__(self, parent, ID) - self.SetBackgroundColour(wxWHITE) + wxWindow.__init__(self, parent, ID, style=wxNO_FULL_REPAINT_ON_RESIZE) + self.SetBackgroundColour("WHITE") self.listeners = [] self.thickness = 1 self.SetColour("Black") @@ -41,18 +41,40 @@ class DoodleWindow(wxWindow): self.x = self.y = 0 self.MakeMenu() + self.InitBuffer() + # hook some mouse events EVT_LEFT_DOWN(self, self.OnLeftDown) EVT_LEFT_UP(self, self.OnLeftUp) EVT_RIGHT_UP(self, self.OnRightUp) EVT_MOTION(self, self.OnMotion) + # the window resize event and idle events for managing the buffer + EVT_SIZE(self, self.OnSize) + EVT_IDLE(self, self.OnIdle) + # and the refresh event EVT_PAINT(self, self.OnPaint) + # When the window is destroyed, clean up resources. + EVT_WINDOW_DESTROY(self, self.Cleanup) + - def __del__(self): - self.menu.Destroy() + def Cleanup(self, evt): + if hasattr(self, "menu"): + self.menu.Destroy() + del self.menu + + + def InitBuffer(self): + """Initialize the bitmap used for buffering the display.""" + size = self.GetClientSize() + self.buffer = wxEmptyBitmap(size.width, size.height) + dc = wxBufferedDC(None, self.buffer) + dc.SetBackground(wxBrush(self.GetBackgroundColour())) + dc.Clear() + self.DrawLines(dc) + self.reInitBuffer = false def SetColour(self, colour): @@ -75,6 +97,7 @@ class DoodleWindow(wxWindow): def SetLinesData(self, lines): self.lines = lines[:] + self.InitBuffer() self.Refresh() @@ -85,13 +108,13 @@ class DoodleWindow(wxWindow): keys.sort() for k in keys: text = self.menuColours[k] - menu.Append(k, text, checkable=true) + menu.Append(k, text, kind=wxITEM_CHECK) EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour) EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours) menu.Break() for x in range(1, self.maxThickness+1): - menu.Append(x, str(x), checkable=true) + menu.Append(x, str(x), kind=wxITEM_CHECK) EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness) EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness) self.menu = menu @@ -121,9 +144,10 @@ class DoodleWindow(wxWindow): def OnLeftUp(self, event): """called when the left mouse button is released""" - self.lines.append( (self.colour, self.thickness, self.curLine) ) - self.curLine = [] - self.ReleaseMouse() + if self.HasCapture(): + self.lines.append( (self.colour, self.thickness, self.curLine) ) + self.curLine = [] + self.ReleaseMouse() def OnRightUp(self, event): @@ -140,7 +164,7 @@ class DoodleWindow(wxWindow): current one. Save the coordinants for redraws. """ if event.Dragging() and event.LeftIsDown(): - dc = wxClientDC(self) + dc = wxBufferedDC(wxClientDC(self), self.buffer) dc.BeginDrawing() dc.SetPen(self.pen) pos = event.GetPositionTuple() @@ -151,12 +175,41 @@ class DoodleWindow(wxWindow): dc.EndDrawing() + def OnSize(self, event): + """ + Called when the window is resized. We set a flag so the idle + handler will resize the buffer. + """ + self.reInitBuffer = true + + + def OnIdle(self, event): + """ + If the size was changed then resize the bitmap used for double + buffering to match the window size. We do it in Idle time so + there is only one refresh after resizing is done, not lots while + it is happening. + """ + if self.reInitBuffer: + self.InitBuffer() + self.Refresh(FALSE) + + def OnPaint(self, event): """ - Called when the window is exposed. Redraws all the lines that have - been drawn already. + Called when the window is exposed. + """ + # Create a buffered paint DC. It will create the real + # wxPaintDC and then blit the bitmap to it when dc is + # deleted. Since we don't need to draw anything else + # here that's all there is to it. + dc = wxBufferedPaintDC(self, self.buffer) + + + def DrawLines(self, dc): + """ + Redraws all the lines that have been drawn already. """ - dc = wxPaintDC(self) dc.BeginDrawing() for colour, thickness, line in self.lines: pen = wxPen(wxNamedColour(colour), thickness, wxSOLID) @@ -189,24 +242,15 @@ class DoodleWindow(wxWindow): class DoodleFrame(wxFrame): def __init__(self, parent): - wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600)) - self.doodle = DoodleWindow(self, -1) - - -#---------------------------------------------------------------------- - - -class DoodleApp(wxApp): - def OnInit(self): - frame = DoodleFrame(None) - frame.Show(true) - self.SetTopWindow(frame) - return true - + wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600), + style=wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) + doodle = DoodleWindow(self, -1) #---------------------------------------------------------------------- if __name__ == '__main__': - app = DoodleApp(0) + app = wxPySimpleApp() + frame = DoodleFrame(None) + frame.Show(true) app.MainLoop()