/GUI/Win32/ScrollableViews.py
Python | 90 lines | 55 code | 23 blank | 12 comment | 0 complexity | c85476e02319b3ac02621a8a96d4eaad MD5 | raw file
1#--------------------------------------------------------------------
2#
3# PyGUI - ScrollableView - Win32
4#
5#--------------------------------------------------------------------
6
7import win32con as wc, win32ui as ui
8from Components import win_none
9from Canvases import Canvas
10from GScrollableViews import ScrollableView as GScrollableView, \
11 default_extent, default_line_scroll_amount
12
13win_style = ui.AFX_WS_DEFAULT_VIEW
14
15#print "ScrollableViews: Creating dummy doc"
16# PyWin32 insists on being given a CDocument when creating a CScrollView,
17# and doesn't provide any way of creating a real one without using
18# a resource. The following hack creates something that looks enough
19# like a CDocument to keep it happy.
20win_dummy_doc = ui.CreateRichEditView().GetDocument()
21#print "ScrollableViews: Created dummy doc"
22
23class ScrollableView(GScrollableView):
24
25 _line_scroll_amount = default_line_scroll_amount
26
27 def __init__(self, **kwds):
28 kwds.setdefault('extent', default_extent)
29 win = ui.CreateView(win_dummy_doc)
30 win.CreateWindow(win_none, 0, win_style, (0, 0, 100, 100))
31 GScrollableView.__init__(self, _win = win)
32 self.set(**kwds)
33
34 def get_hscrolling(self):
35 return self._win.GetStyle() & wc.WS_HSCROLL != 0
36
37 def get_vscrolling(self):
38 return self._win.GetStyle() & wc.WS_VSCROLL != 0
39
40 def set_hscrolling(self, x):
41 self._win_set_flag(x, wc.WS_HSCROLL)
42
43 def set_vscrolling(self, x):
44 self._win_set_flag(x, wc.WS_VSCROLL)
45
46 def get_line_scroll_amount(self):
47 return self._line_scroll_amount
48
49 def get_extent(self):
50 return self._win.GetTotalSize()
51
52 def set_extent(self, extent):
53 self._win_update_scroll_sizes(extent)
54
55 def get_scroll_offset(self):
56 return self._win.GetScrollPosition()
57
58 def set_scroll_offset(self, p):
59 px, py = p
60 ex, ey = self.extent
61 vx, vy = self.content_size
62 xmax = max(0, ex - vx)
63 ymax = max(0, ey - vy)
64 x = max(0, min(px, xmax))
65 y = max(0, min(py, ymax))
66 self._win.ScrollToPosition((x, y))
67
68 def set_bounds(self, bounds):
69 GScrollableView.set_bounds(self, bounds)
70 extent = self._win.GetTotalSize()
71 self._win_update_scroll_sizes(extent)
72
73 def _win_update_scroll_sizes(self, extent):
74 ph = self.h_page_scroll_amount()
75 pv = self.v_page_scroll_amount()
76 ls = self.line_scroll_amount
77 self._win.SetScrollSizes(wc.MM_TEXT, extent, (ph, pv), ls)
78
79 def OnDraw(self, dc):
80 #print "ScrollableView.OnDraw" ###
81 update_rect = dc.GetClipBox()
82 canvas = Canvas._from_win_dc(dc)
83 self.draw(canvas, update_rect)
84
85 def _win_prepare_dc(self, dc, pinfo = None):
86 self._win.OnPrepareDC(dc, None)
87
88
89
90