/GUI/Gtk/ScrollableViews.py
Python | 119 lines | 66 code | 26 blank | 27 comment | 4 complexity | 83f3ef7baa5d476df89e244ca6e56824 MD5 | raw file
1#
2# Python GUI - Scrollable Views - Gtk
3#
4
5import gtk
6from GScrollableViews import ScrollableView as GScrollableView, \
7 default_extent, default_line_scroll_amount
8
9gtk_scroll_policies = [gtk.POLICY_NEVER, gtk.POLICY_ALWAYS]
10
11gtk_dummybar = gtk.VScrollbar()
12gtk_scrollbar_breadth = gtk_dummybar.size_request()[0]
13del gtk_dummybar
14
15class ScrollableView(GScrollableView):
16
17 def __init__(self, extent = default_extent,
18 line_scroll_amount = default_line_scroll_amount,
19 **kwds):
20 gtk_scrolled_window = gtk.ScrolledWindow()
21 gtk_scrolled_window.show()
22 GScrollableView.__init__(self, _gtk_outer = gtk_scrolled_window,
23 extent = extent, line_scroll_amount = line_scroll_amount, **kwds)
24
25 #
26 # Properties
27 #
28
29 def get_content_width(self):
30 w = self._size[0]
31 if self.hscrolling:
32 w -= gtk_scrollbar_breadth
33 return w
34
35 def get_content_height(self):
36 h = self._size[1]
37 if self.vscrolling:
38 h -= gtk_scrollbar_breadth
39 return h
40
41 def get_content_size(self):
42 return self.content_width, self.content_height
43
44 def set_content_size(self, size):
45 w, h = size
46 d = gtk_scrollbar_breadth
47 if self.hscrolling:
48 w += d
49 if self.vscrolling:
50 h += d
51 self.size = (w, h)
52
53 def get_hscrolling(self):
54 return self._gtk_inner_widget.hscrollbar_policy <> gtk.POLICY_NEVER
55
56 def set_hscrolling(self, value):
57 self._gtk_inner_widget.hscrollbar_policy = gtk_scroll_policies[value]
58
59 def get_vscrolling(self):
60 return self._gtk_inner_widget.vscrollbar_policy <> gtk.POLICY_NEVER
61
62 def set_vscrolling(self, value):
63 self._gtk_inner_widget.vscrollbar_policy = gtk_scroll_policies[value]
64
65# def get_extent(self):
66# l, t = self._extent_origin
67# w, h = self._gtk_inner_widget.get_size()
68# return (l, t, l + w, t + h)
69
70 def get_extent(self):
71 return self._gtk_inner_widget.get_size()
72
73# def set_extent(self, (l, t, r, b)):
74# w = r - l
75# h = b - t
76# self._extent_origin = (l, t)
77# self._gtk_inner_widget.set_size(w, h)
78
79 def set_extent(self, (w, h)):
80 self._gtk_inner_widget.set_size(w, h)
81
82 def get_scroll_offset(self):
83 hadj, vadj = self._gtk_adjustments()
84 return int(hadj.value), int(vadj.value)
85
86# def set_scroll_offset(self, (x, y)):
87# x0, y0 = self._extent_origin
88# hadj, vadj = self._gtk_adjustments()
89# hadj.set_value(min(float(x - x0), hadj.upper - hadj.page_size))
90# vadj.set_value(min(float(y - y0), vadj.upper - vadj.page_size))
91
92 def set_scroll_offset(self, (x, y)):
93 hadj, vadj = self._gtk_adjustments()
94 hadj.set_value(min(float(x), hadj.upper - hadj.page_size))
95 vadj.set_value(min(float(y), vadj.upper - vadj.page_size))
96
97# def get_line_scroll_amount(self):
98# x0, y0 = self._extent_origin
99# hadj, vadj = self._gtk_adjustments()
100# return x0 + hadj.step_increment, y0 + vadj.step_increment
101
102 def get_line_scroll_amount(self):
103 hadj, vadj = self._gtk_adjustments()
104 return hadj.step_increment, vadj.step_increment
105
106 def set_line_scroll_amount(self, (dx, dy)):
107 hadj, vadj = self._gtk_adjustments()
108 hadj.step_increment = float(dx) # Amazingly, ints are not
109 vadj.step_increment = float(dy) # acceptable here.
110
111 #
112 # Internal
113 #
114
115 def _gtk_adjustments(self):
116 gtk_widget = self._gtk_inner_widget
117 hadj = gtk_widget.get_hadjustment()
118 vadj = gtk_widget.get_vadjustment()
119 return hadj, vadj