]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/wxDragImage.py
removed a wxPaintDC::Clear() fatal to wxGTK
[wxWidgets.git] / wxPython / demo / wxDragImage.py
CommitLineData
f6bcfd97
BP
1
2from wxPython.wx import *
3
96bfd053
RD
4import images
5
f6bcfd97
BP
6#----------------------------------------------------------------------
7
8class 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
44class 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
10e07c70 50 self.hiliteShape = None
f6bcfd97
BP
51
52 self.SetCursor(wxStockCursor(wxCURSOR_ARROW))
96bfd053 53 self.bg_bmp = images.getBackgroundBitmap()
f6bcfd97
BP
54
55
56 # Make a shape from an image and mask. This one will demo
57 # dragging outside the window
96bfd053 58 bmp = images.getTestStarBitmap()
f6bcfd97
BP
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"
f2a10cdc 67 bg_colour = wxColour(57, 115, 57) # matches the bg image
f6bcfd97
BP
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)
f2a10cdc 73 dc.SetBackground(wxBrush(bg_colour, wxSOLID))
f6bcfd97
BP
74 dc.Clear()
75 dc.SetTextForeground(wxRED)
76 dc.SetFont(font)
77 dc.DrawText(text, 0, 0)
78 dc.SelectObject(wxNullBitmap)
f2a10cdc 79 mask = wxMaskColour(bmp, bg_colour)
f6bcfd97
BP
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
96bfd053
RD
89 for card in ['_01c_', '_12h_', '_13d_', '_10s_']:
90 bmpFunc = getattr(images, "get%sBitmap" % card)
91 bmp = bmpFunc()
f6bcfd97
BP
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
f6bcfd97
BP
142 def OnEraseBackground(self, evt):
143 dc = evt.GetDC()
144 if not dc:
145 dc = wxClientDC(self)
b166c703
RD
146 rect = self.GetUpdateRegion().GetBox()
147 dc.SetClippingRegion(rect.x, rect.y, rect.width, rect.height)
f6bcfd97
BP
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
f6bcfd97 177 dc = wxClientDC(self)
10e07c70
RD
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
f6bcfd97
BP
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
10e07c70 197 tolerance = 2
f6bcfd97
BP
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
10e07c70
RD
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
f6bcfd97
BP
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
10e07c70
RD
217 hotspot = self.dragStartPos - self.dragShape.pos
218 self.dragImage.BeginDrag(hotspot, self, self.dragShape.fullscreen)
f6bcfd97 219
10e07c70 220 self.dragImage.Move(pt)
f6bcfd97
BP
221 self.dragImage.Show()
222
223
10e07c70 224 # if we have shape and image then move it, posibly highlighting another shape.
f6bcfd97 225 elif self.dragShape and self.dragImage:
10e07c70
RD
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()
f6bcfd97
BP
256
257
258#----------------------------------------------------------------------
259
260def runTest(frame, nb, log):
261 win = DragCanvas(nb, -1)
262 return win
263
264#----------------------------------------------------------------------
265
266
267
268overview = """\
269"""