]>
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
)
51 self
.SetCursor(wxStockCursor(wxCURSOR_ARROW
))
52 self
.bg_bmp
= images
.getBackgroundBitmap()
55 # Make a shape from an image and mask. This one will demo
56 # dragging outside the window
57 bmp
= images
.getTestStarBitmap()
58 #mask = wxMaskColour(bmp, wxWHITE)
60 shape
= DragShape(bmp
)
61 shape
.pos
= wxPoint(5, 5)
62 shape
.fullscreen
= true
63 self
.shapes
.append(shape
)
66 # Make a shape from some text
68 font
= wxFont(15, wxROMAN
, wxNORMAL
, wxBOLD
)
69 textExtent
= self
.GetFullTextExtent(text
, font
)
70 bmp
= wxEmptyBitmap(textExtent
[0], textExtent
[1])
74 dc
.SetTextForeground(wxRED
)
76 dc
.DrawText(text
, 0, 0)
77 dc
.SelectObject(wxNullBitmap
)
79 mask
= wxMaskColour(bmp
, wxWHITE
)
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()
144 def OnEraseBackground(self
, evt
):
147 dc
= wxClientDC(self
)
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 # reposition and draw the shape
178 pt
= evt
.GetPosition()
179 newPos
= wxPoint(self
.dragShape
.pos
.x
+ (pt
.x
- self
.dragStartPos
.x
),
180 self
.dragShape
.pos
.y
+ (pt
.y
- self
.dragStartPos
.y
))
182 dc
= wxClientDC(self
)
183 self
.dragShape
.pos
= newPos
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 if self
.dragShape
.text
:
205 self
.dragImage
= wxDragString(self
.dragShape
.text
,
206 wxStockCursor(wxCURSOR_HAND
))
208 self
.dragImage
= wxDragImage(self
.dragShape
.bmp
,
209 wxStockCursor(wxCURSOR_HAND
))
211 newPos
= wxPoint(self
.dragShape
.pos
.x
+ (pt
.x
- self
.dragStartPos
.x
),
212 self
.dragShape
.pos
.y
+ (pt
.y
- self
.dragStartPos
.y
))
214 if self
.dragShape
.fullscreen
:
215 newPos
= self
.ClientToScreen(newPos
)
216 self
.dragImage
.BeginDrag((0,0), self
, true
)
218 self
.dragImage
.BeginDrag((0,0), self
)
221 # erase the shape since it will be drawn independently now
222 dc
= wxClientDC(self
)
223 self
.dragShape
.shown
= false
224 self
.EraseShape(self
.dragShape
, dc
)
226 self
.dragImage
.Move(newPos
)
227 self
.dragImage
.Show()
230 # if we have shape and image then move it.
231 elif self
.dragShape
and self
.dragImage
:
232 pt
= evt
.GetPosition()
233 newPos
= wxPoint(self
.dragShape
.pos
.x
+ (pt
.x
- self
.dragStartPos
.x
),
234 self
.dragShape
.pos
.y
+ (pt
.y
- self
.dragStartPos
.y
))
235 if self
.dragShape
.fullscreen
:
236 newPos
= self
.ClientToScreen(newPos
)
238 self
.dragImage
.Move(newPos
)
241 #----------------------------------------------------------------------
243 def runTest(frame
, nb
, log
):
244 win
= DragCanvas(nb
, -1)
247 #----------------------------------------------------------------------