]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/ScrolledWindow.py
Patch from Joe "shmengie" Brown joebrown@podiatryfl.com
[wxWidgets.git] / wxPython / demo / ScrolledWindow.py
CommitLineData
cf694132 1
8fa876ca 2import wx
8fa876ca 3import images
96bfd053 4
d3bfec74
RD
5BUFFERED = 1
6
cf694132
RD
7#---------------------------------------------------------------------------
8
8fa876ca 9class MyCanvas(wx.ScrolledWindow):
372bde9b 10 def __init__(self, parent, id = -1, size = wx.DefaultSize):
8fa876ca 11 wx.ScrolledWindow.__init__(self, parent, id, (0, 0), size=size, style=wx.SUNKEN_BORDER)
cf694132
RD
12
13 self.lines = []
bb0054cd
RD
14 self.maxWidth = 1000
15 self.maxHeight = 1000
d3bfec74
RD
16 self.x = self.y = 0
17 self.curLine = []
1e4a197e 18 self.drawing = False
cf694132 19
d43d449b 20 self.SetBackgroundColour("WHITE")
8fa876ca 21 self.SetCursor(wx.StockCursor(wx.CURSOR_PENCIL))
96bfd053 22 bmp = images.getTest2Bitmap()
d7403ad2 23 mask = wx.Mask(bmp, wx.BLUE)
5ed3dab2 24 bmp.SetMask(mask)
bb0054cd 25 self.bmp = bmp
cf694132 26
8793725c
RD
27 self.SetVirtualSize((self.maxWidth, self.maxHeight))
28 self.SetScrollRate(20,20)
bb0054cd 29
d3bfec74
RD
30 if BUFFERED:
31 # Initialize the buffer bitmap. No real DC is needed at this point.
8fa876ca
RD
32 self.buffer = wx.EmptyBitmap(self.maxWidth, self.maxHeight)
33 dc = wx.BufferedDC(None, self.buffer)
34 dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
d3bfec74
RD
35 dc.Clear()
36 self.DoDrawing(dc)
37
8fa876ca
RD
38 self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftButtonEvent)
39 self.Bind(wx.EVT_LEFT_UP, self.OnLeftButtonEvent)
40 self.Bind(wx.EVT_MOTION, self.OnLeftButtonEvent)
41 self.Bind(wx.EVT_PAINT, self.OnPaint)
0af45411 42
a3015b16 43
bb0054cd
RD
44 def getWidth(self):
45 return self.maxWidth
46
47 def getHeight(self):
48 return self.maxHeight
cf694132
RD
49
50
51 def OnPaint(self, event):
d3bfec74
RD
52 if BUFFERED:
53 # Create a buffered paint DC. It will create the real
8fa876ca 54 # wx.PaintDC and then blit the bitmap to it when dc is
d3bfec74
RD
55 # deleted. Since we don't need to draw anything else
56 # here that's all there is to it.
67a5217c 57 dc = wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA)
d3bfec74 58 else:
8fa876ca 59 dc = wx.PaintDC(self)
d3bfec74
RD
60 self.PrepareDC(dc)
61 # since we're not buffering in this case, we have to
62 # paint the whole window, potentially very time consuming.
63 self.DoDrawing(dc)
cf694132
RD
64
65
1fded56b 66 def DoDrawing(self, dc, printing=False):
cf694132 67 dc.BeginDrawing()
8fa876ca 68 dc.SetPen(wx.Pen('RED'))
d7403ad2 69 dc.DrawRectangle(5, 5, 50, 50)
cf694132 70
8fa876ca
RD
71 dc.SetBrush(wx.LIGHT_GREY_BRUSH)
72 dc.SetPen(wx.Pen('BLUE', 4))
d7403ad2 73 dc.DrawRectangle(15, 15, 50, 50)
cf694132 74
8fa876ca
RD
75 dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL))
76 dc.SetTextForeground(wx.Colour(0xFF, 0x20, 0xFF))
cf694132 77 te = dc.GetTextExtent("Hello World")
d7403ad2 78 dc.DrawText("Hello World", 60, 65)
cf694132 79
8fa876ca 80 dc.SetPen(wx.Pen('VIOLET', 4))
d7403ad2 81 dc.DrawLine(5, 65+te[1], 60+te[0], 65+te[1])
cf694132
RD
82
83 lst = [(100,110), (150,110), (150,160), (100,160)]
84 dc.DrawLines(lst, -60)
8fa876ca 85 dc.SetPen(wx.GREY_PEN)
cf694132 86 dc.DrawPolygon(lst, 75)
8fa876ca 87 dc.SetPen(wx.GREEN_PEN)
cf694132
RD
88 dc.DrawSpline(lst+[(100,100)])
89
d7403ad2 90 dc.DrawBitmap(self.bmp, 200, 20, True)
8fa876ca 91 dc.SetTextForeground(wx.Colour(0, 0xFF, 0x80))
d7403ad2 92 dc.DrawText("a bitmap", 200, 85)
cf694132 93
8fa876ca 94## dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL))
1fded56b 95## dc.SetTextForeground("BLACK")
d7403ad2 96## dc.DrawText("TEST this STRING", 10, 200)
1fded56b
RD
97## print dc.GetFullTextExtent("TEST this STRING")
98
8fa876ca 99 font = wx.Font(20, wx.SWISS, wx.NORMAL, wx.NORMAL)
6999b0d8 100 dc.SetFont(font)
8fa876ca
RD
101 dc.SetTextForeground(wx.BLACK)
102
6999b0d8 103 for a in range(0, 360, 45):
d7403ad2 104 dc.DrawRotatedText("Rotated text...", 300, 300, a)
6999b0d8 105
8fa876ca
RD
106 dc.SetPen(wx.TRANSPARENT_PEN)
107 dc.SetBrush(wx.BLUE_BRUSH)
d7403ad2
RD
108 dc.DrawRectangle(50,500, 50,50)
109 dc.DrawRectangle(100,500, 50,50)
eec92d76 110
8fa876ca 111 dc.SetPen(wx.Pen('RED'))
d7403ad2 112 dc.DrawEllipticArc(200,500, 50,75, 0, 90)
c368d904 113
1fded56b
RD
114 if not printing:
115 # This has troubles when used on a print preview in wxGTK,
116 # probably something to do with the pen styles and the scaling
117 # it does...
118 y = 20
8fa876ca
RD
119
120 for style in [wx.DOT, wx.LONG_DASH, wx.SHORT_DASH, wx.DOT_DASH, wx.USER_DASH]:
121 pen = wx.Pen("DARK ORCHID", 1, style)
122 if style == wx.USER_DASH:
123 pen.SetCap(wx.CAP_BUTT)
1fded56b
RD
124 pen.SetDashes([1,2])
125 pen.SetColour("RED")
126 dc.SetPen(pen)
d7403ad2 127 dc.DrawLine(300,y, 400,y)
1fded56b 128 y = y + 10
217cb2fa 129
8fa876ca
RD
130 dc.SetBrush(wx.TRANSPARENT_BRUSH)
131 dc.SetPen(wx.Pen(wx.Colour(0xFF, 0x20, 0xFF), 1, wx.SOLID))
d7403ad2 132 dc.DrawRectangle(450,50, 100,100)
c5943253 133 old_pen = dc.GetPen()
8fa876ca 134 new_pen = wx.Pen("BLACK", 5)
c5943253 135 dc.SetPen(new_pen)
d7403ad2 136 dc.DrawRectangle(470,70, 60,60)
c5943253 137 dc.SetPen(old_pen)
d7403ad2 138 dc.DrawRectangle(490,90, 20,20)
c5943253 139
cf694132
RD
140 self.DrawSavedLines(dc)
141 dc.EndDrawing()
142
143
144 def DrawSavedLines(self, dc):
8fa876ca
RD
145 dc.SetPen(wx.Pen('MEDIUM FOREST GREEN', 4))
146
cf694132
RD
147 for line in self.lines:
148 for coords in line:
8fa876ca 149 apply(dc.DrawLine, coords)
cf694132
RD
150
151
152 def SetXY(self, event):
153 self.x, self.y = self.ConvertEventCoords(event)
154
155 def ConvertEventCoords(self, event):
3ca6a5f0 156 xView, yView = self.GetViewStart()
cf694132
RD
157 xDelta, yDelta = self.GetScrollPixelsPerUnit()
158 return (event.GetX() + (xView * xDelta),
159 event.GetY() + (yView * yDelta))
160
161 def OnLeftButtonEvent(self, event):
162 if event.LeftDown():
1e4a197e 163 self.SetFocus()
cf694132
RD
164 self.SetXY(event)
165 self.curLine = []
714d23b4 166 self.CaptureMouse()
1e4a197e 167 self.drawing = True
d3bfec74
RD
168
169 elif event.Dragging() and self.drawing:
170 if BUFFERED:
171 # If doing buffered drawing, create the buffered DC, giving it
172 # it a real DC to blit to when done.
8fa876ca 173 cdc = wx.ClientDC(self)
d3bfec74 174 self.PrepareDC(cdc)
8fa876ca 175 dc = wx.BufferedDC(cdc, self.buffer)
d3bfec74 176 else:
8fa876ca 177 dc = wx.ClientDC(self)
d3bfec74 178 self.PrepareDC(dc)
cf694132 179
cf694132 180 dc.BeginDrawing()
8fa876ca 181 dc.SetPen(wx.Pen('MEDIUM FOREST GREEN', 4))
d7403ad2 182 coords = (self.x, self.y) + self.ConvertEventCoords(event)
cf694132 183 self.curLine.append(coords)
d7403ad2 184 dc.DrawLine(*coords)
cf694132
RD
185 self.SetXY(event)
186 dc.EndDrawing()
187
d3bfec74
RD
188
189 elif event.LeftUp() and self.drawing:
cf694132
RD
190 self.lines.append(self.curLine)
191 self.curLine = []
714d23b4 192 self.ReleaseMouse()
1e4a197e 193 self.drawing = False
cf694132 194
d1679124
RD
195
196## This is an example of what to do for the EVT_MOUSEWHEEL event,
299647ac 197## but since wx.ScrolledWindow does this already it's not
8fa876ca
RD
198## necessary to do it ourselves. You would need to add an event table
199## entry to __init__() to direct wheelmouse events to this handler.
d1679124
RD
200
201## wheelScroll = 0
202## def OnWheel(self, evt):
203## delta = evt.GetWheelDelta()
204## rot = evt.GetWheelRotation()
205## linesPer = evt.GetLinesPerAction()
3b5ccda1 206## print delta, rot, linesPer
d1679124
RD
207## ws = self.wheelScroll
208## ws = ws + rot
209## lines = ws / delta
210## ws = ws - lines * delta
211## self.wheelScroll = ws
212## if lines != 0:
213## lines = lines * linesPer
214## vsx, vsy = self.GetViewStart()
215## scrollTo = vsy - lines
216## self.Scroll(-1, scrollTo)
217
cf694132
RD
218#---------------------------------------------------------------------------
219
220def runTest(frame, nb, log):
221 win = MyCanvas(nb)
222 return win
223
224#---------------------------------------------------------------------------
225
226
227
8fa876ca
RD
228overview = """
229<html>
230<body>
231The wx.ScrolledWindow class manages scrolling for its client area, transforming the
232coordinates according to the scrollbar positions, and setting the scroll positions,
233thumb sizes and ranges according to the area in view.
234</body>
235</html>
f9b24f07 236"""
cf694132
RD
237
238
f9b24f07
RD
239if __name__ == '__main__':
240 import sys,os
241 import run
8eca4fef 242 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
cf694132 243