/GUI/Gtk/ScrollableViews.py

https://bitbucket.org/alsh/pygui-mirror · Python · 119 lines · 66 code · 26 blank · 27 comment · 4 complexity · 83f3ef7baa5d476df89e244ca6e56824 MD5 · raw file

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