<reponame>gcewing/PyGUI
#
#   Python GUI - Scrollable Views - Gtk
#

import gtk
from GUI import export
from GUI import Scrollable
from GUI.GScrollableViews import ScrollableView as GScrollableView, \
	default_extent, default_line_scroll_amount, default_scrolling

class ScrollableView(GScrollableView, Scrollable):

	def __init__(self, extent = default_extent,
			line_scroll_amount = default_line_scroll_amount,
			scrolling = default_scrolling,
			**kwds):
		gtk_scrolled_window = gtk.ScrolledWindow()
		gtk_scrolled_window.show()
		GScrollableView.__init__(self, _gtk_outer = gtk_scrolled_window,
			extent = extent, line_scroll_amount = line_scroll_amount,
			scrolling = scrolling)
		self.set(**kwds)
	
	#
	#   Properties
	#
	
	def get_border(self):
		return self._gtk_outer_widget.get_shadow_type() <> gtk.SHADOW_NONE
	
	def set_border(self, x):
		if x:
			s = gtk.SHADOW_IN
		else:
			s = gtk.SHADOW_NONE
		self._gtk_outer_widget.set_shadow_type(s)
	
	def get_content_width(self):
		w = self._size[0]
		if self.hscrolling:
			w -= self.gtk_scrollbar_breadth
		if self.border:
			w -= 2 * self.gtk_border_thickness[0]
		return w
	
	def get_content_height(self):
		h = self._size[1]
		if self.vscrolling:
			h -= self.gtk_scrollbar_breadth
		if self.border:
			h -= 2 * self.gtk_border_thickness[1]
		return h
	
	def get_content_size(self):
		return self.content_width, self.content_height
	
	def set_content_size(self, size):
		w, h = size
		d = self.gtk_scrollbar_breadth
		if self.hscrolling:
			w += d
		if self.vscrolling:
			h += d
		if self.border:
			b = self.gtk_border_thickness
			w += 2 * b[0]
			h += 2 * b[1]
		self.size = (w, h)
	
	def get_extent(self):
		return self._gtk_inner_widget.get_size()
	
	def set_extent(self, (w, h)):
		self._gtk_inner_widget.set_size(int(round(w)), int(round(h)))

	def get_scroll_offset(self):
		hadj, vadj = self._gtk_adjustments()
		return int(hadj.value), int(vadj.value)
	
	def set_scroll_offset(self, (x, y)):
		hadj, vadj = self._gtk_adjustments()
		hadj.set_value(min(float(x), hadj.upper - hadj.page_size))
		vadj.set_value(min(float(y), vadj.upper - vadj.page_size))
	
	def get_line_scroll_amount(self):
		hadj, vadj = self._gtk_adjustments()
		return hadj.step_increment, vadj.step_increment
	
	def set_line_scroll_amount(self, (dx, dy)):
		hadj, vadj = self._gtk_adjustments()
		hadj.step_increment = float(dx) # Amazingly, ints are not
		vadj.step_increment = float(dy) # acceptable here.
	
	#
	#		Internal
	#

	def _gtk_adjustments(self):
		gtk_widget = self._gtk_inner_widget
		hadj = gtk_widget.get_hadjustment()
		vadj = gtk_widget.get_vadjustment()
		return hadj, vadj

export(ScrollableView)

#
#   Python GUI - Scrollable Views - Gtk
#

import gtk
from GUI import export
from GUI import Scrollable
from GUI.GScrollableViews import ScrollableView as GScrollableView, \
	default_extent, default_line_scroll_amount, default_scrolling

class ScrollableView(GScrollableView, Scrollable):

	def __init__(self, extent = default_extent,
			line_scroll_amount = default_line_scroll_amount,
			scrolling = default_scrolling,
			**kwds):
		gtk_scrolled_window = gtk.ScrolledWindow()
		gtk_scrolled_window.show()
		GScrollableView.__init__(self, _gtk_outer = gtk_scrolled_window,
			extent = extent, line_scroll_amount = line_scroll_amount,
			scrolling = scrolling)
		self.set(**kwds)
	
	#
	#   Properties
	#
	
	def get_border(self):
		return self._gtk_outer_widget.get_shadow_type() <> gtk.SHADOW_NONE
	
	def set_border(self, x):
		if x:
			s = gtk.SHADOW_IN
		else:
			s = gtk.SHADOW_NONE
		self._gtk_outer_widget.set_shadow_type(s)
	
	def get_content_width(self):
		w = self._size[0]
		if self.hscrolling:
			w -= self.gtk_scrollbar_breadth
		if self.border:
			w -= 2 * self.gtk_border_thickness[0]
		return w
	
	def get_content_height(self):
		h = self._size[1]
		if self.vscrolling:
			h -= self.gtk_scrollbar_breadth
		if self.border:
			h -= 2 * self.gtk_border_thickness[1]
		return h
	
	def get_content_size(self):
		return self.content_width, self.content_height
	
	def set_content_size(self, size):
		w, h = size
		d = self.gtk_scrollbar_breadth
		if self.hscrolling:
			w += d
		if self.vscrolling:
			h += d
		if self.border:
			b = self.gtk_border_thickness
			w += 2 * b[0]
			h += 2 * b[1]
		self.size = (w, h)
	
	def get_extent(self):
		return self._gtk_inner_widget.get_size()
	
	def set_extent(self, (w, h)):
		self._gtk_inner_widget.set_size(int(round(w)), int(round(h)))

	def get_scroll_offset(self):
		hadj, vadj = self._gtk_adjustments()
		return int(hadj.value), int(vadj.value)
	
	def set_scroll_offset(self, (x, y)):
		hadj, vadj = self._gtk_adjustments()
		hadj.set_value(min(float(x), hadj.upper - hadj.page_size))
		vadj.set_value(min(float(y), vadj.upper - vadj.page_size))
	
	def get_line_scroll_amount(self):
		hadj, vadj = self._gtk_adjustments()
		return hadj.step_increment, vadj.step_increment
	
	def set_line_scroll_amount(self, (dx, dy)):
		hadj, vadj = self._gtk_adjustments()
		hadj.step_increment = float(dx) # Amazingly, ints are not
		vadj.step_increment = float(dy) # acceptable here.
	
	#
	#		Internal
	#

	def _gtk_adjustments(self):
		gtk_widget = self._gtk_inner_widget
		hadj = gtk_widget.get_hadjustment()
		vadj = gtk_widget.get_vadjustment()
		return hadj, vadj

export(ScrollableView)
# #   Python GUI - Scrollable Views - Gtk # # #   Properties # # Amazingly, ints are not # acceptable here. # #		Internal #