]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/CustomDragAndDrop.py
A patch from Frame Niessink which adds an additional style that
[wxWidgets.git] / wxPython / demo / CustomDragAndDrop.py
index fd416a29b7c816b3024fa3fc4efcc4586a7bfa33..f5404cd4db509897e0e546c87a72a6f30a59f790 100644 (file)
@@ -1,45 +1,44 @@
 
-from wxPython.wx import *
-
-import cPickle
+import  cPickle
+import  wx
 
 #----------------------------------------------------------------------
 
 
-class DoodlePad(wxWindow):
+class DoodlePad(wx.Window):
     def __init__(self, parent, log):
-        wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
+        wx.Window.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
         self.log = log
-        self.SetBackgroundColour(wxWHITE)
+        self.SetBackgroundColour(wx.WHITE)
         self.lines = []
         self.x = self.y = 0
         self.SetMode("Draw")
 
-        EVT_LEFT_DOWN(self, self.OnLeftDown)
-        EVT_LEFT_UP(self, self.OnLeftUp)
-        EVT_RIGHT_UP(self, self.OnRightUp)
-        EVT_MOTION(self, self.OnMotion)
-        EVT_PAINT(self, self.OnPaint)
+        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
+        self.Bind(wx.EVT_LEFT_UP,  self.OnLeftUp)
+        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
+        self.Bind(wx.EVT_MOTION, self.OnMotion)
+        self.Bind(wx.EVT_PAINT, self.OnPaint)
 
 
     def SetMode(self, mode):
         self.mode = mode
         if self.mode == "Draw":
-            self.SetCursor(wxStockCursor(wxCURSOR_PENCIL))
+            self.SetCursor(wx.StockCursor(wx.CURSOR_PENCIL))
         else:
-            self.SetCursor(wxSTANDARD_CURSOR)
+            self.SetCursor(wx.STANDARD_CURSOR)
 
 
     def OnPaint(self, event):
-        dc = wxPaintDC(self)
+        dc = wx.PaintDC(self)
         self.DrawSavedLines(dc)
 
     def DrawSavedLines(self, dc):
         dc.BeginDrawing()
-        dc.SetPen(wxPen(wxBLUE, 3))
+        dc.SetPen(wx.Pen(wx.BLUE, 3))
         for line in self.lines:
             for coords in line:
-                apply(dc.DrawLine, coords)
+                dc.DrawLine(*coords)
         dc.EndDrawing()
 
 
@@ -51,27 +50,28 @@ class DoodlePad(wxWindow):
             self.x, self.y = event.GetPositionTuple()
             self.CaptureMouse()
         else:
-            wxBell()
+            wx.Bell()
             self.log.write("unknown mode!\n")
 
 
     def OnLeftUp(self, event):
-        self.lines.append(self.curLine)
-        self.curLine = []
-        self.ReleaseMouse()
+        if self.HasCapture():
+            self.lines.append(self.curLine)
+            self.curLine = []
+            self.ReleaseMouse()
 
     def OnRightUp(self, event):
         self.lines = []
         self.Refresh()
 
     def OnMotion(self, event):
-        if event.Dragging() and not self.mode == "Drag":
-            dc = wxClientDC(self)
+        if self.HasCapture() and event.Dragging() and not self.mode == "Drag":
+            dc = wx.ClientDC(self)
             dc.BeginDrawing()
-            dc.SetPen(wxPen(wxBLUE, 3))
+            dc.SetPen(wx.Pen(wx.BLUE, 3))
             coords = (self.x, self.y) + event.GetPositionTuple()
             self.curLine.append(coords)
-            apply(dc.DrawLine, coords)
+            dc.DrawLine(*coords)
             self.x, self.y = event.GetPositionTuple()
             dc.EndDrawing()
 
@@ -82,34 +82,35 @@ class DoodlePad(wxWindow):
 
         # create our own data format and use it in a
         # custom data object
-        ldata = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
+        ldata = wx.CustomDataObject("DoodleLines")
         ldata.SetData(linesdata)
 
         # Also create a Bitmap version of the drawing
         size = self.GetSize()
-        bmp = wxEmptyBitmap(size.width, size.height)
-        dc = wxMemoryDC()
+        bmp = wx.EmptyBitmap(size.width, size.height)
+        dc = wx.MemoryDC()
         dc.SelectObject(bmp)
-        dc.SetBackground(wxWHITE_BRUSH)
+        dc.SetBackground(wx.WHITE_BRUSH)
         dc.Clear()
         self.DrawSavedLines(dc)
-        dc.SelectObject(wxNullBitmap)
+        dc.SelectObject(wx.NullBitmap)
 
         # Now make a data object for the bitmap and also a composite
         # data object holding both of the others.
-        bdata = wxBitmapDataObject(bmp)
-        data = wxDataObjectComposite()
+        bdata = wx.BitmapDataObject(bmp)
+        data = wx.DataObjectComposite()
         data.Add(ldata)
         data.Add(bdata)
 
         # And finally, create the drop source and begin the drag
         # and drop opperation
-        dropSource = wxDropSource(self)
+        dropSource = wx.DropSource(self)
         dropSource.SetData(data)
         self.log.WriteText("Begining DragDrop\n")
-        result = dropSource.DoDragDrop(true)
+        result = dropSource.DoDragDrop(wx.Drag_AllowMove)
         self.log.WriteText("DragDrop completed: %d\n" % result)
-        if result == wxDragMove:
+
+        if result == wx.DragMove:
             self.lines = []
             self.Refresh()
 
@@ -117,14 +118,14 @@ class DoodlePad(wxWindow):
 #----------------------------------------------------------------------
 
 
-class DoodleDropTarget(wxPyDropTarget):
+class DoodleDropTarget(wx.PyDropTarget):
     def __init__(self, window, log):
-        wxPyDropTarget.__init__(self)
+        wx.PyDropTarget.__init__(self)
         self.log = log
         self.dv = window
 
         # specify the type of data we will accept
-        self.data = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
+        self.data = wx.CustomDataObject("DoodleLines")
         self.SetDataObject(self.data)
 
 
@@ -138,7 +139,7 @@ class DoodleDropTarget(wxPyDropTarget):
 
     def OnDrop(self, x, y):
         self.log.WriteText("OnDrop: %d %d\n" % (x, y))
-        return true
+        return True
 
     def OnDragOver(self, x, y, d):
         #self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
@@ -153,7 +154,7 @@ class DoodleDropTarget(wxPyDropTarget):
 
 
 
-    # Called when OnDrop returns true.  We need to get the data and
+    # Called when OnDrop returns True.  We need to get the data and
     # do something with it.
     def OnData(self, x, y, d):
         self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d))
@@ -164,23 +165,24 @@ class DoodleDropTarget(wxPyDropTarget):
             linesdata = self.data.GetData()
             lines = cPickle.loads(linesdata)
             self.dv.SetLines(lines)
-        return d  # what is returned signals the source what to do
-                  # with the original data (move, copy, etc.)  In this
-                  # case we just return the suggested value given to us.
-
-
+            
+        # what is returned signals the source what to do
+        # with the original data (move, copy, etc.)  In this
+        # case we just return the suggested value given to us.
+        return d  
+        
 
 
-class DoodleViewer(wxWindow):
+class DoodleViewer(wx.Window):
     def __init__(self, parent, log):
-        wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
+        wx.Window.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
         self.log = log
-        self.SetBackgroundColour(wxWHITE)
+        self.SetBackgroundColour(wx.WHITE)
         self.lines = []
         self.x = self.y = 0
         dt = DoodleDropTarget(self, log)
         self.SetDropTarget(dt)
-        EVT_PAINT(self, self.OnPaint)
+        self.Bind(wx.EVT_PAINT, self.OnPaint)
 
 
     def SetLines(self, lines):
@@ -188,40 +190,41 @@ class DoodleViewer(wxWindow):
         self.Refresh()
 
     def OnPaint(self, event):
-        dc = wxPaintDC(self)
+        dc = wx.PaintDC(self)
         self.DrawSavedLines(dc)
 
     def DrawSavedLines(self, dc):
         dc.BeginDrawing()
-        dc.SetPen(wxPen(wxRED, 3))
+        dc.SetPen(wx.Pen(wx.RED, 3))
+
         for line in self.lines:
             for coords in line:
-                apply(dc.DrawLine, coords)
+                dc.DrawLine(*coords)
         dc.EndDrawing()
 
 #----------------------------------------------------------------------
 
-class CustomDnDPanel(wxPanel):
+class CustomDnDPanel(wx.Panel):
     def __init__(self, parent, log):
-        wxPanel.__init__(self, parent, -1)
+        wx.Panel.__init__(self, parent, -1)
 
-        self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
+        self.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False))
 
         # Make the controls
-        text1 = wxStaticText(self, -1,
+        text1 = wx.StaticText(self, -1,
                             "Draw a little picture in this window\n"
                             "then switch the mode below and drag the\n"
                             "picture to the lower window or to another\n"
-                            "application that accepts BMP's as a drop\n"
-                             "target.\n"
+                            "application that accepts Bitmaps as a\n"
+                             "drop target.\n"
                             )
 
-        rb1 = wxRadioButton(self, -1, "Draw", style=wxRB_GROUP)
-        rb1.SetValue(true)
-        rb2 = wxRadioButton(self, -1, "Drag")
-        rb2.SetValue(false)
+        rb1 = wx.RadioButton(self, -1, "Draw", style=wx.RB_GROUP)
+        rb1.SetValue(True)
+        rb2 = wx.RadioButton(self, -1, "Drag")
+        rb2.SetValue(False)
 
-        text2 = wxStaticText(self, -1,
+        text2 = wx.StaticText(self, -1,
                              "The lower window is accepting a\n"
                              "custom data type that is a pickled\n"
                              "Python list of lines data.")
@@ -230,31 +233,31 @@ class CustomDnDPanel(wxPanel):
         view = DoodleViewer(self, log)
 
         # put them in sizers
-        sizer = wxBoxSizer(wxHORIZONTAL)
-        box = wxBoxSizer(wxVERTICAL)
-        rbox = wxBoxSizer(wxHORIZONTAL)
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        box = wx.BoxSizer(wx.VERTICAL)
+        rbox = wx.BoxSizer(wx.HORIZONTAL)
 
         rbox.Add(rb1)
         rbox.Add(rb2)
-        box.Add(text1, 0, wxALL, 10)
-        box.Add(rbox, 0, wxALIGN_CENTER)
-        box.Add(10,90)
-        box.Add(text2, 0, wxALL, 10)
+        box.Add(text1, 0, wx.ALL, 10)
+        box.Add(rbox, 0, wx.ALIGN_CENTER)
+        box.Add((10,90))
+        box.Add(text2, 0, wx.ALL, 10)
 
         sizer.Add(box)
 
-        dndsizer = wxBoxSizer(wxVERTICAL)
-        dndsizer.Add(self.pad, 1, wxEXPAND|wxALL, 5)
-        dndsizer.Add(view, 1, wxEXPAND|wxALL, 5)
+        dndsizer = wx.BoxSizer(wx.VERTICAL)
+        dndsizer.Add(self.pad, 1, wx.EXPAND|wx.ALL, 5)
+        dndsizer.Add(view, 1, wx.EXPAND|wx.ALL, 5)
 
-        sizer.Add(dndsizer, 1, wxEXPAND)
+        sizer.Add(dndsizer, 1, wx.EXPAND)
 
-        self.SetAutoLayout(true)
+        self.SetAutoLayout(True)
         self.SetSizer(sizer)
 
         # Events
-        EVT_RADIOBUTTON(self, rb1.GetId(), self.OnRadioButton)
-        EVT_RADIOBUTTON(self, rb2.GetId(), self.OnRadioButton)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadioButton, rb1)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadioButton, rb2)
 
 
     def OnRadioButton(self, evt):
@@ -265,24 +268,24 @@ class CustomDnDPanel(wxPanel):
 #----------------------------------------------------------------------
 #----------------------------------------------------------------------
 
-class TestPanel(wxPanel):
+class TestPanel(wx.Panel):
     def __init__(self, parent, log):
-        wxPanel.__init__(self, parent, -1)
+        wx.Panel.__init__(self, parent, -1)
 
-        self.SetAutoLayout(true)
-        sizer = wxBoxSizer(wxVERTICAL)
+        self.SetAutoLayout(True)
+        sizer = wx.BoxSizer(wx.VERTICAL)
 
         msg = "Custom Drag-And-Drop"
-        text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
-        text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, false))
+        text = wx.StaticText(self, -1, "", style=wx.ALIGN_CENTRE)
+        text.SetFont(wx.Font(24, wx.SWISS, wx.NORMAL, wx.BOLD, False))
         text.SetLabel(msg)
         w,h = text.GetTextExtent(msg)
-        text.SetSize(wxSize(w,h+1))
-        text.SetForegroundColour(wxBLUE)
-        sizer.Add(text, 0, wxEXPAND|wxALL, 5)
-        sizer.Add(wxStaticLine(self, -1), 0, wxEXPAND)
+        text.SetSize(wx.Size(w,h+1))
+        text.SetForegroundColour(wx.BLUE)
+        sizer.Add(text, 0, wx.EXPAND|wx.ALL, 5)
+        sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND)
 
-        sizer.Add(CustomDnDPanel(self, log), 1, wxEXPAND)
+        sizer.Add(CustomDnDPanel(self, log), 1, wx.EXPAND)
 
         self.SetSizer(sizer)
 
@@ -297,28 +300,30 @@ def runTest(frame, nb, log):
 
 if __name__ == '__main__':
     import sys
+    
     class DummyLog:
         def WriteText(self, text):
             sys.stdout.write(text)
 
-    class TestApp(wxApp):
+    class TestApp(wx.App):
         def OnInit(self):
+            wx.InitAllImageHandlers()
             self.MakeFrame()
-            return true
+            return True
 
         def MakeFrame(self, event=None):
-            frame = wxFrame(None, -1, "Custom Drag and Drop", size=(550,400))
-            menu = wxMenu()
-            menu.Append(6543, "Window")
-            mb = wxMenuBar()
+            frame = wx.Frame(None, -1, "Custom Drag and Drop", size=(550,400))
+            menu = wx.Menu()
+            item = menu.Append(-1, "Window")
+            mb = wx.MenuBar()
             mb.Append(menu, "New")
             frame.SetMenuBar(mb)
-            EVT_MENU(frame, 6543, self.MakeFrame)
+            frame.Bind(wx.EVT_MENU, self.MakeFrame, item)
             panel = TestPanel(frame, DummyLog())
-            frame.Show(true)
+            frame.Show(True)
             self.SetTopWindow(frame)
 
-
+    #----------------------------------------------------------------------
 
     app = TestApp(0)
     app.MainLoop()
@@ -326,21 +331,18 @@ if __name__ == '__main__':
 #----------------------------------------------------------------------
 
 
+overview = """<html><body>
+This demo shows Drag and Drop using a custom data type and a custom
+data object.  A type called "DoodleLines" is created and a Python
+Pickle of a list is actually transfered in the drag and drop
+opperation.
 
+A second data object is also created containing a bitmap of the image
+and is made available to any drop target that accepts bitmaps, such as
+MS Word.
 
-
-
-
-
-
-
-
-
-overview = """\
-This demo shows Drag and Drop using a custom data type and a custom data object.  A type called "DoodleLines" is created and a Python Pickle of a list is actually transfered in the drag and drop opperation.
-
-A second data object is also created containing a bitmap of the image and is made available to any drop target that accepts bitmaps, such as MS Word.
-
-The two data objects are combined in a wxDataObjectComposite and the rest is handled by the framework.
+The two data objects are combined in a wx.DataObjectComposite and the
+rest is handled by the framework.
+</body></html>
 """