]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/wxDragImage.py
A few little tweaks
[wxWidgets.git] / wxPython / demo / wxDragImage.py
1
2 from wxPython.wx import *
3
4 import images
5
6 #----------------------------------------------------------------------
7
8 class DragShape:
9 def __init__(self, bmp):
10 self.bmp = bmp
11 self.pos = wxPoint(0,0)
12 self.shown = true
13 self.text = None
14 self.fullscreen = false
15
16
17 def HitTest(self, pt):
18 rect = self.GetRect()
19 return rect.Inside(pt.x, pt.y)
20
21
22 def GetRect(self):
23 return wxRect(self.pos.x, self.pos.y,
24 self.bmp.GetWidth(), self.bmp.GetHeight())
25
26
27 def Draw(self, dc, op = wxCOPY):
28 if self.bmp.Ok():
29 memDC = wxMemoryDC()
30 memDC.SelectObject(self.bmp)
31
32 dc.Blit(self.pos.x, self.pos.y,
33 self.bmp.GetWidth(), self.bmp.GetHeight(),
34 memDC, 0, 0, op, true)
35
36 return true
37 else:
38 return false
39
40
41
42 #----------------------------------------------------------------------
43
44 class DragCanvas(wxScrolledWindow):
45 def __init__(self, parent, ID):
46 wxScrolledWindow.__init__(self, parent, ID)
47 self.shapes = []
48 self.dragImage = None
49 self.dragShape = None
50 self.hiliteShape = None
51
52 self.SetCursor(wxStockCursor(wxCURSOR_ARROW))
53 self.bg_bmp = images.getBackgroundBitmap()
54
55
56 # Make a shape from an image and mask. This one will demo
57 # dragging outside the window
58 bmp = images.getTestStarBitmap()
59 shape = DragShape(bmp)
60 shape.pos = wxPoint(5, 5)
61 shape.fullscreen = true
62 self.shapes.append(shape)
63
64
65 # Make a shape from some text
66 text = "Some Text"
67 bg_colour = wxColour(57, 115, 57) # matches the bg image
68 font = wxFont(15, wxROMAN, wxNORMAL, wxBOLD)
69 textExtent = self.GetFullTextExtent(text, font)
70 bmp = wxEmptyBitmap(textExtent[0], textExtent[1])
71 dc = wxMemoryDC()
72 dc.SelectObject(bmp)
73 dc.SetBackground(wxBrush(bg_colour, wxSOLID))
74 dc.Clear()
75 dc.SetTextForeground(wxRED)
76 dc.SetFont(font)
77 dc.DrawText(text, 0, 0)
78 dc.SelectObject(wxNullBitmap)
79 mask = wxMaskColour(bmp, bg_colour)
80 bmp.SetMask(mask)
81 shape = DragShape(bmp)
82 shape.pos = wxPoint(5, 100)
83 shape.text = "Some dragging text"
84 self.shapes.append(shape)
85
86
87 # Make some shapes from some playing card images.
88 x = 200
89 for card in ['_01c_', '_12h_', '_13d_', '_10s_']:
90 bmpFunc = getattr(images, "get%sBitmap" % card)
91 bmp = bmpFunc()
92 shape = DragShape(bmp)
93 shape.pos = wxPoint(x, 5)
94 self.shapes.append(shape)
95 x = x + 80
96
97
98 EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
99 EVT_PAINT(self, self.OnPaint)
100 EVT_LEFT_DOWN(self, self.OnLeftDown)
101 EVT_LEFT_UP(self, self.OnLeftUp)
102 EVT_MOTION(self, self.OnMotion)
103
104
105
106 def TileBackground(self, dc):
107 # tile the background bitmap
108 sz = self.GetClientSize()
109 w = self.bg_bmp.GetWidth()
110 h = self.bg_bmp.GetHeight()
111
112 x = 0
113 while x < sz.width:
114 y = 0
115 while y < sz.height:
116 dc.DrawBitmap(self.bg_bmp, x, y)
117 y = y + h
118 x = x + w
119
120
121 def DrawShapes(self, dc):
122 for shape in self.shapes:
123 if shape.shown:
124 shape.Draw(dc)
125
126
127 def FindShape(self, pt):
128 for shape in self.shapes:
129 if shape.HitTest(pt):
130 return shape
131 return None
132
133
134 def EraseShape(self, shape, dc):
135 r = shape.GetRect()
136 dc.SetClippingRegion(r.x, r.y, r.width, r.height)
137 self.TileBackground(dc)
138 self.DrawShapes(dc)
139 dc.DestroyClippingRegion()
140
141
142 def OnEraseBackground(self, evt):
143 dc = evt.GetDC()
144 if not dc:
145 dc = wxClientDC(self)
146 rect = self.GetUpdateRegion().GetBox()
147 dc.SetClippingRegion(rect.x, rect.y, rect.width, rect.height)
148 self.TileBackground(dc)
149
150
151 def OnPaint(self, evt):
152 dc = wxPaintDC(self)
153 self.PrepareDC(dc)
154 self.DrawShapes(dc)
155
156
157 def OnLeftDown(self, evt):
158 shape = self.FindShape(evt.GetPosition())
159 if shape:
160 # get ready to start dragging, but wait for the user to
161 # move it a bit first
162 self.dragShape = shape
163 self.dragStartPos = evt.GetPosition()
164
165
166 def OnLeftUp(self, evt):
167 if not self.dragImage or not self.dragShape:
168 self.dragImage = None
169 self.dragShape = None
170 return
171
172 # end the dragging
173 self.dragImage.Hide()
174 self.dragImage.EndDrag()
175 self.dragImage = None
176
177 dc = wxClientDC(self)
178 if self.hiliteShape:
179 self.hiliteShape.Draw(dc)
180 self.hiliteShape = None
181
182 # reposition and draw the shape
183 self.dragShape.pos = self.dragShape.pos + evt.GetPosition() - self.dragStartPos
184 self.dragShape.shown = true
185 self.dragShape.Draw(dc)
186 self.dragShape = None
187
188
189 def OnMotion(self, evt):
190 if not self.dragShape or not evt.Dragging() or not evt.LeftIsDown():
191 return
192
193 # if we have a shape, but havn't started dragging yet
194 if self.dragShape and not self.dragImage:
195
196 # only start the drag after having moved a couple pixels
197 tolerance = 2
198 pt = evt.GetPosition()
199 dx = abs(pt.x - self.dragStartPos.x)
200 dy = abs(pt.y - self.dragStartPos.y)
201 if dx <= tolerance and dy <= tolerance:
202 return
203
204 # erase the shape since it will be drawn independently now
205 dc = wxClientDC(self)
206 self.dragShape.shown = false
207 self.EraseShape(self.dragShape, dc)
208
209
210 if self.dragShape.text:
211 self.dragImage = wxDragString(self.dragShape.text,
212 wxStockCursor(wxCURSOR_HAND))
213 else:
214 self.dragImage = wxDragImage(self.dragShape.bmp,
215 wxStockCursor(wxCURSOR_HAND))
216
217 hotspot = self.dragStartPos - self.dragShape.pos
218 self.dragImage.BeginDrag(hotspot, self, self.dragShape.fullscreen)
219
220 self.dragImage.Move(pt)
221 self.dragImage.Show()
222
223
224 # if we have shape and image then move it, posibly highlighting another shape.
225 elif self.dragShape and self.dragImage:
226 onShape = self.FindShape(evt.GetPosition())
227 unhiliteOld = false
228 hiliteNew = false
229
230 # figure out what to hilite and what to unhilite
231 if self.hiliteShape:
232 if onShape is None or self.hiliteShape is not onShape:
233 unhiliteOld = true
234
235 if onShape and onShape is not self.hiliteShape and onShape.shown:
236 hiliteNew = TRUE
237
238 # if needed, hide the drag image so we can update the window
239 if unhiliteOld or hiliteNew:
240 self.dragImage.Hide()
241
242 if unhiliteOld:
243 dc = wxClientDC(self)
244 self.hiliteShape.Draw(dc)
245 self.hiliteShape = None
246
247 if hiliteNew:
248 dc = wxClientDC(self)
249 self.hiliteShape = onShape
250 self.hiliteShape.Draw(dc, wxINVERT)
251
252 # now move it and show it again if needed
253 self.dragImage.Move(evt.GetPosition())
254 if unhiliteOld or hiliteNew:
255 self.dragImage.Show()
256
257
258 #----------------------------------------------------------------------
259
260 def runTest(frame, nb, log):
261 win = DragCanvas(nb, -1)
262 return win
263
264 #----------------------------------------------------------------------
265
266
267
268 overview = """\
269 """