]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/wxDragImage.py
2 from wxPython
.wx
import *
6 #----------------------------------------------------------------------
9 def __init__(self
, bmp
):
11 self
.pos
= wxPoint(0,0)
14 self
.fullscreen
= false
17 def HitTest(self
, pt
):
19 return rect
.Inside(pt
.x
, pt
.y
)
23 return wxRect(self
.pos
.x
, self
.pos
.y
,
24 self
.bmp
.GetWidth(), self
.bmp
.GetHeight())
27 def Draw(self
, dc
, op
= wxCOPY
):
30 memDC
.SelectObject(self
.bmp
)
32 dc
.Blit(self
.pos
.x
, self
.pos
.y
,
33 self
.bmp
.GetWidth(), self
.bmp
.GetHeight(),
34 memDC
, 0, 0, op
, true
)
42 #----------------------------------------------------------------------
44 class DragCanvas(wxScrolledWindow
):
45 def __init__(self
, parent
, ID
):
46 wxScrolledWindow
.__init
__(self
, parent
, ID
)
50 self
.hiliteShape
= None
52 self
.SetCursor(wxStockCursor(wxCURSOR_ARROW
))
53 self
.bg_bmp
= images
.getBackgroundBitmap()
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
)
65 # Make a shape from some text
67 font
= wxFont(15, wxROMAN
, wxNORMAL
, wxBOLD
)
68 textExtent
= self
.GetFullTextExtent(text
, font
)
69 bmp
= wxEmptyBitmap(textExtent
[0], textExtent
[1])
73 dc
.SetTextForeground(wxRED
)
75 dc
.DrawText(text
, 0, 0)
76 dc
.SelectObject(wxNullBitmap
)
78 mask
= wxMaskColour(bmp
, wxWHITE
)
80 shape
= DragShape(bmp
)
81 shape
.pos
= wxPoint(5, 100)
82 shape
.text
= "Some dragging text"
83 self
.shapes
.append(shape
)
86 # Make some shapes from some playing card images.
88 for card
in ['_01c_', '_12h_', '_13d_', '_10s_']:
89 bmpFunc
= getattr(images
, "get%sBitmap" % card
)
91 shape
= DragShape(bmp
)
92 shape
.pos
= wxPoint(x
, 5)
93 self
.shapes
.append(shape
)
97 EVT_ERASE_BACKGROUND(self
, self
.OnEraseBackground
)
98 EVT_PAINT(self
, self
.OnPaint
)
99 EVT_LEFT_DOWN(self
, self
.OnLeftDown
)
100 EVT_LEFT_UP(self
, self
.OnLeftUp
)
101 EVT_MOTION(self
, self
.OnMotion
)
105 def TileBackground(self
, dc
):
106 # tile the background bitmap
107 sz
= self
.GetClientSize()
108 w
= self
.bg_bmp
.GetWidth()
109 h
= self
.bg_bmp
.GetHeight()
115 dc
.DrawBitmap(self
.bg_bmp
, x
, y
)
120 def DrawShapes(self
, dc
):
121 for shape
in self
.shapes
:
126 def FindShape(self
, pt
):
127 for shape
in self
.shapes
:
128 if shape
.HitTest(pt
):
133 def EraseShape(self
, shape
, dc
):
135 dc
.SetClippingRegion(r
.x
, r
.y
, r
.width
, r
.height
)
136 self
.TileBackground(dc
)
138 dc
.DestroyClippingRegion()
141 def OnEraseBackground(self
, evt
):
144 dc
= wxClientDC(self
)
145 rect
= self
.GetUpdateRegion().GetBox()
146 dc
.SetClippingRegion(rect
.x
, rect
.y
, rect
.width
, rect
.height
)
147 self
.TileBackground(dc
)
150 def OnPaint(self
, evt
):
156 def OnLeftDown(self
, evt
):
157 shape
= self
.FindShape(evt
.GetPosition())
159 # get ready to start dragging, but wait for the user to
160 # move it a bit first
161 self
.dragShape
= shape
162 self
.dragStartPos
= evt
.GetPosition()
165 def OnLeftUp(self
, evt
):
166 if not self
.dragImage
or not self
.dragShape
:
167 self
.dragImage
= None
168 self
.dragShape
= None
172 self
.dragImage
.Hide()
173 self
.dragImage
.EndDrag()
174 self
.dragImage
= None
176 dc
= wxClientDC(self
)
178 self
.hiliteShape
.Draw(dc
)
179 self
.hiliteShape
= None
181 # reposition and draw the shape
182 self
.dragShape
.pos
= self
.dragShape
.pos
+ evt
.GetPosition() - self
.dragStartPos
183 self
.dragShape
.shown
= true
184 self
.dragShape
.Draw(dc
)
185 self
.dragShape
= None
188 def OnMotion(self
, evt
):
189 if not self
.dragShape
or not evt
.Dragging() or not evt
.LeftIsDown():
192 # if we have a shape, but havn't started dragging yet
193 if self
.dragShape
and not self
.dragImage
:
195 # only start the drag after having moved a couple pixels
197 pt
= evt
.GetPosition()
198 dx
= abs(pt
.x
- self
.dragStartPos
.x
)
199 dy
= abs(pt
.y
- self
.dragStartPos
.y
)
200 if dx
<= tolerance
and dy
<= tolerance
:
203 # erase the shape since it will be drawn independently now
204 dc
= wxClientDC(self
)
205 self
.dragShape
.shown
= false
206 self
.EraseShape(self
.dragShape
, dc
)
209 if self
.dragShape
.text
:
210 self
.dragImage
= wxDragString(self
.dragShape
.text
,
211 wxStockCursor(wxCURSOR_HAND
))
213 self
.dragImage
= wxDragImage(self
.dragShape
.bmp
,
214 wxStockCursor(wxCURSOR_HAND
))
216 hotspot
= self
.dragStartPos
- self
.dragShape
.pos
217 self
.dragImage
.BeginDrag(hotspot
, self
, self
.dragShape
.fullscreen
)
219 self
.dragImage
.Move(pt
)
220 self
.dragImage
.Show()
223 # if we have shape and image then move it, posibly highlighting another shape.
224 elif self
.dragShape
and self
.dragImage
:
225 onShape
= self
.FindShape(evt
.GetPosition())
229 # figure out what to hilite and what to unhilite
231 if onShape
is None or self
.hiliteShape
is not onShape
:
234 if onShape
and onShape
is not self
.hiliteShape
and onShape
.shown
:
237 # if needed, hide the drag image so we can update the window
238 if unhiliteOld
or hiliteNew
:
239 self
.dragImage
.Hide()
242 dc
= wxClientDC(self
)
243 self
.hiliteShape
.Draw(dc
)
244 self
.hiliteShape
= None
247 dc
= wxClientDC(self
)
248 self
.hiliteShape
= onShape
249 self
.hiliteShape
.Draw(dc
, wxINVERT
)
251 # now move it and show it again if needed
252 self
.dragImage
.Move(evt
.GetPosition())
253 if unhiliteOld
or hiliteNew
:
254 self
.dragImage
.Show()
257 #----------------------------------------------------------------------
259 def runTest(frame
, nb
, log
):
260 win
= DragCanvas(nb
, -1)
263 #----------------------------------------------------------------------