PageRenderTime 32ms CodeModel.GetById 17ms app.highlight 13ms RepoModel.GetById 0ms app.codeStats 0ms

/GUI/Win32/ScrollableViews.py

https://bitbucket.org/alsh/pygui-mirror
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