]>
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 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])
73 dc
.SetBackground(wxBrush(bg_colour
, wxSOLID
))
75 dc
.SetTextForeground(wxRED
)
77 dc
.DrawText(text
, 0, 0)
78 dc
.SelectObject(wxNullBitmap
)
79 mask
= wxMaskColour(bmp
, bg_colour
)
81 shape
= DragShape(bmp
)
82 shape
.pos
= wxPoint(5, 100)
83 shape
.text
= "Some dragging text"
84 self
.shapes
.append(shape
)
87 # Make some shapes from some playing card images.
89 for card
in ['_01c_', '_12h_', '_13d_', '_10s_']:
90 bmpFunc
= getattr(images
, "get%sBitmap" % card
)
92 shape
= DragShape(bmp
)
93 shape
.pos
= wxPoint(x
, 5)
94 self
.shapes
.append(shape
)
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
)
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()
116 dc
.DrawBitmap(self
.bg_bmp
, x
, y
)
121 def DrawShapes(self
, dc
):
122 for shape
in self
.shapes
:
127 def FindShape(self
, pt
):
128 for shape
in self
.shapes
:
129 if shape
.HitTest(pt
):
134 def EraseShape(self
, shape
, dc
):
136 dc
.SetClippingRegion(r
.x
, r
.y
, r
.width
, r
.height
)
137 self
.TileBackground(dc
)
139 dc
.DestroyClippingRegion()
142 def OnEraseBackground(self
, evt
):
145 dc
= wxClientDC(self
)
146 rect
= self
.GetUpdateRegion().GetBox()
147 dc
.SetClippingRegion(rect
.x
, rect
.y
, rect
.width
, rect
.height
)
148 self
.TileBackground(dc
)
151 def OnPaint(self
, evt
):
157 def OnLeftDown(self
, evt
):
158 shape
= self
.FindShape(evt
.GetPosition())
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()
166 def OnLeftUp(self
, evt
):
167 if not self
.dragImage
or not self
.dragShape
:
168 self
.dragImage
= None
169 self
.dragShape
= None
173 self
.dragImage
.Hide()
174 self
.dragImage
.EndDrag()
175 self
.dragImage
= None
177 dc
= wxClientDC(self
)
179 self
.hiliteShape
.Draw(dc
)
180 self
.hiliteShape
= None
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
189 def OnMotion(self
, evt
):
190 if not self
.dragShape
or not evt
.Dragging() or not evt
.LeftIsDown():
193 # if we have a shape, but havn't started dragging yet
194 if self
.dragShape
and not self
.dragImage
:
196 # only start the drag after having moved a couple pixels
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
:
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
)
210 if self
.dragShape
.text
:
211 self
.dragImage
= wxDragString(self
.dragShape
.text
,
212 wxStockCursor(wxCURSOR_HAND
))
214 self
.dragImage
= wxDragImage(self
.dragShape
.bmp
,
215 wxStockCursor(wxCURSOR_HAND
))
217 hotspot
= self
.dragStartPos
- self
.dragShape
.pos
218 self
.dragImage
.BeginDrag(hotspot
, self
, self
.dragShape
.fullscreen
)
220 self
.dragImage
.Move(pt
)
221 self
.dragImage
.Show()
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())
230 # figure out what to hilite and what to unhilite
232 if onShape
is None or self
.hiliteShape
is not onShape
:
235 if onShape
and onShape
is not self
.hiliteShape
and onShape
.shown
:
238 # if needed, hide the drag image so we can update the window
239 if unhiliteOld
or hiliteNew
:
240 self
.dragImage
.Hide()
243 dc
= wxClientDC(self
)
244 self
.hiliteShape
.Draw(dc
)
245 self
.hiliteShape
= None
248 dc
= wxClientDC(self
)
249 self
.hiliteShape
= onShape
250 self
.hiliteShape
.Draw(dc
, wxINVERT
)
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()
258 #----------------------------------------------------------------------
260 def runTest(frame
, nb
, log
):
261 win
= DragCanvas(nb
, -1)
264 #----------------------------------------------------------------------