]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/CustomDragAndDrop.py
fix text scrolling in GTK2 (patch 703988)
[wxWidgets.git] / wxPython / demo / CustomDragAndDrop.py
index eb33d57f3db0f7cbc97ea01f314f475b7decbd53..3fb49e5d02e20da6b86684f99f8ce199eb86a78e 100644 (file)
@@ -13,7 +13,7 @@ class DoodlePad(wxWindow):
         self.SetBackgroundColour(wxWHITE)
         self.lines = []
         self.x = self.y = 0
         self.SetBackgroundColour(wxWHITE)
         self.lines = []
         self.x = self.y = 0
-        self.SetCursor(wxStockCursor(wxCURSOR_PENCIL))
+        self.SetMode("Draw")
 
         EVT_LEFT_DOWN(self, self.OnLeftDown)
         EVT_LEFT_UP(self, self.OnLeftUp)
 
         EVT_LEFT_DOWN(self, self.OnLeftDown)
         EVT_LEFT_UP(self, self.OnLeftUp)
@@ -22,6 +22,14 @@ class DoodlePad(wxWindow):
         EVT_PAINT(self, self.OnPaint)
 
 
         EVT_PAINT(self, self.OnPaint)
 
 
+    def SetMode(self, mode):
+        self.mode = mode
+        if self.mode == "Draw":
+            self.SetCursor(wxStockCursor(wxCURSOR_PENCIL))
+        else:
+            self.SetCursor(wxSTANDARD_CURSOR)
+
+
     def OnPaint(self, event):
         dc = wxPaintDC(self)
         self.DrawSavedLines(dc)
     def OnPaint(self, event):
         dc = wxPaintDC(self)
         self.DrawSavedLines(dc)
@@ -36,12 +44,15 @@ class DoodlePad(wxWindow):
 
 
     def OnLeftDown(self, event):
 
 
     def OnLeftDown(self, event):
-        if event.ControlDown():
+        if self.mode == "Drag":
             self.StartDragOpperation()
             self.StartDragOpperation()
-        else:
+        elif self.mode == "Draw":
             self.curLine = []
             self.x, self.y = event.GetPositionTuple()
             self.CaptureMouse()
             self.curLine = []
             self.x, self.y = event.GetPositionTuple()
             self.CaptureMouse()
+        else:
+            wxBell()
+            self.log.write("unknown mode!\n")
 
 
     def OnLeftUp(self, event):
 
 
     def OnLeftUp(self, event):
@@ -54,7 +65,7 @@ class DoodlePad(wxWindow):
         self.Refresh()
 
     def OnMotion(self, event):
         self.Refresh()
 
     def OnMotion(self, event):
-        if event.Dragging() and not event.ControlDown():
+        if event.Dragging() and not self.mode == "Drag":
             dc = wxClientDC(self)
             dc.BeginDrawing()
             dc.SetPen(wxPen(wxBLUE, 3))
             dc = wxClientDC(self)
             dc.BeginDrawing()
             dc.SetPen(wxPen(wxBLUE, 3))
@@ -96,9 +107,11 @@ class DoodlePad(wxWindow):
         dropSource = wxDropSource(self)
         dropSource.SetData(data)
         self.log.WriteText("Begining DragDrop\n")
         dropSource = wxDropSource(self)
         dropSource.SetData(data)
         self.log.WriteText("Begining DragDrop\n")
-        result = dropSource.DoDragDrop()
+        result = dropSource.DoDragDrop(wxDrag_AllowMove)
         self.log.WriteText("DragDrop completed: %d\n" % result)
         self.log.WriteText("DragDrop completed: %d\n" % result)
-
+        if result == wxDragMove:
+            self.lines = []
+            self.Refresh()
 
 
 #----------------------------------------------------------------------
 
 
 #----------------------------------------------------------------------
@@ -111,36 +124,50 @@ class DoodleDropTarget(wxPyDropTarget):
         self.dv = window
 
         # specify the type of data we will accept
         self.dv = window
 
         # specify the type of data we will accept
-        self.data = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
+        self.df = wxCustomDataFormat("DoodleLines")
+        self.data = wxCustomDataObject(self.df)
         self.SetDataObject(self.data)
 
 
     # some virtual methods that track the progress of the drag
     def OnEnter(self, x, y, d):
         self.log.WriteText("OnEnter: %d, %d, %d\n" % (x, y, d))
         self.SetDataObject(self.data)
 
 
     # some virtual methods that track the progress of the drag
     def OnEnter(self, x, y, d):
         self.log.WriteText("OnEnter: %d, %d, %d\n" % (x, y, d))
-        return wxDragCopy
+        return d
+
     def OnLeave(self):
         self.log.WriteText("OnLeave\n")
     def OnLeave(self):
         self.log.WriteText("OnLeave\n")
+
     def OnDrop(self, x, y):
         self.log.WriteText("OnDrop: %d %d\n" % (x, y))
     def OnDrop(self, x, y):
         self.log.WriteText("OnDrop: %d %d\n" % (x, y))
-        return true
-    #def OnDragOver(self, x, y, d):
-    #    self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
-    #    return wxDragCopy
+        return True
 
 
+    def OnDragOver(self, x, y, d):
+        #self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
 
 
-    # Called when OnDrop returns true.  We need to get the data and
+        # The value returned here tells the source what kind of visual
+        # feedback to give.  For example, if wxDragCopy is returned then
+        # only the copy cursor will be shown, even if the source allows
+        # moves.  You can use the passed in (x,y) to determine what kind
+        # of feedback to give.  In this case we return the suggested value
+        # which is based on whether the Ctrl key is pressed.
+        return d
+
+
+
+    # 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))
 
     # do something with it.
     def OnData(self, x, y, d):
         self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d))
 
-        # copy the data from the drag source to out data object
+        # copy the data from the drag source to our data object
         if self.GetData():
             # convert it back to a list of lines and give it to the viewer
             linesdata = self.data.GetData()
             lines = cPickle.loads(linesdata)
             self.dv.SetLines(lines)
         if self.GetData():
             # convert it back to a list of lines and give it to the viewer
             linesdata = self.data.GetData()
             lines = cPickle.loads(linesdata)
             self.dv.SetLines(lines)
-        return d
+        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.
 
 
 
 
 
 
@@ -156,6 +183,7 @@ class DoodleViewer(wxWindow):
         self.SetDropTarget(dt)
         EVT_PAINT(self, self.OnPaint)
 
         self.SetDropTarget(dt)
         EVT_PAINT(self, self.OnPaint)
 
+
     def SetLines(self, lines):
         self.lines = lines
         self.Refresh()
     def SetLines(self, lines):
         self.lines = lines
         self.Refresh()
@@ -178,28 +206,61 @@ class CustomDnDPanel(wxPanel):
     def __init__(self, parent, log):
         wxPanel.__init__(self, parent, -1)
 
     def __init__(self, parent, log):
         wxPanel.__init__(self, parent, -1)
 
-        self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
+        self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, False))
 
 
-        sizer = wxBoxSizer(wxHORIZONTAL)
-        text = wxStaticText(self, -1,
+        # Make the controls
+        text1 = wxStaticText(self, -1,
                             "Draw a little picture in this window\n"
                             "Draw a little picture in this window\n"
-                            "then Ctrl-Drag it to the lower \n"
-                            "window or to another application\n"
-                            "that accepts BMP's as a drop target.\n\n"
-                            "The lower window is accepting a\n"
-                            "custom data type that is a pickled\n"
-                            "Python list of lines data.")
-        sizer.Add(text, 1, wxALL, 10)
-
-        insizer = wxBoxSizer(wxVERTICAL)
-        insizer.Add(DoodlePad(self, log), 1, wxEXPAND|wxALL, 5)
-        insizer.Add(DoodleViewer(self, log), 1, wxEXPAND|wxALL, 5)
-
-        sizer.Add(insizer, 1, wxEXPAND)
-        self.SetAutoLayout(true)
+                            "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"
+                            )
+
+        rb1 = wxRadioButton(self, -1, "Draw", style=wxRB_GROUP)
+        rb1.SetValue(True)
+        rb2 = wxRadioButton(self, -1, "Drag")
+        rb2.SetValue(False)
+
+        text2 = wxStaticText(self, -1,
+                             "The lower window is accepting a\n"
+                             "custom data type that is a pickled\n"
+                             "Python list of lines data.")
+
+        self.pad = DoodlePad(self, log)
+        view = DoodleViewer(self, log)
+
+        # put them in sizers
+        sizer = wxBoxSizer(wxHORIZONTAL)
+        box = wxBoxSizer(wxVERTICAL)
+        rbox = wxBoxSizer(wxHORIZONTAL)
+
+        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)
+
+        sizer.Add(box)
+
+        dndsizer = wxBoxSizer(wxVERTICAL)
+        dndsizer.Add(self.pad, 1, wxEXPAND|wxALL, 5)
+        dndsizer.Add(view, 1, wxEXPAND|wxALL, 5)
+
+        sizer.Add(dndsizer, 1, wxEXPAND)
+
+        self.SetAutoLayout(True)
         self.SetSizer(sizer)
 
         self.SetSizer(sizer)
 
+        # Events
+        EVT_RADIOBUTTON(self, rb1.GetId(), self.OnRadioButton)
+        EVT_RADIOBUTTON(self, rb2.GetId(), self.OnRadioButton)
+
 
 
+    def OnRadioButton(self, evt):
+        rb = self.FindWindowById(evt.GetId())
+        self.pad.SetMode(rb.GetLabel())
 
 
 #----------------------------------------------------------------------
 
 
 #----------------------------------------------------------------------
@@ -209,12 +270,12 @@ class TestPanel(wxPanel):
     def __init__(self, parent, log):
         wxPanel.__init__(self, parent, -1)
 
     def __init__(self, parent, log):
         wxPanel.__init__(self, parent, -1)
 
-        self.SetAutoLayout(true)
+        self.SetAutoLayout(True)
         sizer = wxBoxSizer(wxVERTICAL)
 
         msg = "Custom Drag-And-Drop"
         text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
         sizer = wxBoxSizer(wxVERTICAL)
 
         msg = "Custom Drag-And-Drop"
         text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
-        text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, false))
+        text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, False))
         text.SetLabel(msg)
         w,h = text.GetTextExtent(msg)
         text.SetSize(wxSize(w,h+1))
         text.SetLabel(msg)
         w,h = text.GetTextExtent(msg)
         text.SetSize(wxSize(w,h+1))
@@ -230,7 +291,8 @@ class TestPanel(wxPanel):
 #----------------------------------------------------------------------
 
 def runTest(frame, nb, log):
 #----------------------------------------------------------------------
 
 def runTest(frame, nb, log):
-    win = TestPanel(nb, log)
+    #win = TestPanel(nb, log)
+    win = CustomDnDPanel(nb, log)
     return win
 
 
     return win
 
 
@@ -242,8 +304,9 @@ if __name__ == '__main__':
 
     class TestApp(wxApp):
         def OnInit(self):
 
     class TestApp(wxApp):
         def OnInit(self):
+            wxInitAllImageHandlers()
             self.MakeFrame()
             self.MakeFrame()
-            return true
+            return True
 
         def MakeFrame(self, event=None):
             frame = wxFrame(None, -1, "Custom Drag and Drop", size=(550,400))
 
         def MakeFrame(self, event=None):
             frame = wxFrame(None, -1, "Custom Drag and Drop", size=(550,400))
@@ -254,7 +317,7 @@ if __name__ == '__main__':
             frame.SetMenuBar(mb)
             EVT_MENU(frame, 6543, self.MakeFrame)
             panel = TestPanel(frame, DummyLog())
             frame.SetMenuBar(mb)
             EVT_MENU(frame, 6543, self.MakeFrame)
             panel = TestPanel(frame, DummyLog())
-            frame.Show(true)
+            frame.Show(True)
             self.SetTopWindow(frame)
 
 
             self.SetTopWindow(frame)
 
 
@@ -265,21 +328,20 @@ 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.
 
 
+The two data objects are combined in a wxDataObjectComposite and the
+rest is handled by the framework.
+</body></html>
+"""
 
 
 
 
 
 
-
-
-
-
-
-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.
-"""
-