Newer
Older
Import / projects / LGN-IP3870 / t / orig / richtextview.py
import uiconfig
import runtime
import utils

from widget import Widget
from richtext import RichText

class RichTextScrollView(Widget):
	def __init__(self, pos=(0,0), size = (200,200), margin = 5, text_font=uiconfig.richtext_font, text_color=uiconfig.richtext_color):
		self.children = []

		self.background = runtime.evas.rectangle()
		self.background.color = uiconfig.richtext_bgcolor
		self.background.pos = pos
		self.background.size = size
		self.children.append(self.background)

		textarea_pos = (pos[0] + margin, pos[1] + margin)
		textarea_size = (size[0] - margin*2, size[1] - margin*2)

		self.clip = runtime.evas.rectangle()
		self.clip.pos = textarea_pos
		self.clip.size = textarea_size
		self.children.append(self.clip)

		self._richtext = RichText(pos=textarea_pos, size=textarea_size, text_font=text_font, text_color=text_color)
		self._richtext.clip = self.clip
		self.children.append(self._richtext)

		self._vscroll_offset = 0
		self._vscroll_tag = None

		self._scroll = False

		self.show_up_arrow = False
		self.show_down_arrow = False

	def need_scroll(self):
		return self._scroll

	def width(self):
		return self.background.geometry_get()[2]

	def height(self):
		return self.background.geometry_get()[3]

	def textarea_width(self):
		return self.clip.size[0]

	def textarea_height(self):
		return self.clip.size[1]

	def set_text(self, text):
		self._richtext.set_text(text)
		self.check_scroll_mode()

	def check_scroll_mode(self):
		if self._richtext.get_height() > self.textarea_height():
			self._scroll = True
			self.show_up_arrow = False
			self.show_down_arrow = True
		else:
			self._scroll = False
			self.show_up_arrow = False
			self.show_down_arrow = False
		
	def get_text(self):
		return self._richtext.get_text()

	def get_data(self):
		return self._richtext.get_data()

	def length(self):
		return self._richtext.length()

	def queue_scroll_update(self):
		def scroll_update():
			self._vscroll_tag = 0
			x,y = self.clip.geometry_get()[:2]
			self._richtext.move(x, y - self._vscroll_offset)
			return False

		self._vscroll_tag = utils.Idle(scroll_update)

	def scroll_down(self, off):
		if not self._scroll: return None

		vscroll_max = (self._richtext.get_height() - self.textarea_height())
		assert self._vscroll_offset <= vscroll_max
		self.show_up_arrow = True
		if self._vscroll_offset == vscroll_max:
			self.show_down_arrow = False
			return
		self._vscroll_offset += off
		if self._vscroll_offset > vscroll_max:
			self._vscroll_offset = vscroll_max

		if self._vscroll_offset == vscroll_max:
			self.show_down_arrow = False
			
		self.queue_scroll_update()

	def scroll_up(self, off):
		if not self._scroll: return None
		self.show_down_arrow = True
		if self._vscroll_offset == 0:
			self.show_up_arrow = False
			return
		self._vscroll_offset -= off
		if self._vscroll_offset < 0:
			self._vscroll_offset = 0

		if self._vscroll_offset == 0:
			self.show_up_arrow = False

		self.queue_scroll_update()

	def handle_key(self, keyname):
		if keyname == 'Up':
			self.scroll_up(20)
			return True
		elif keyname == 'Down':
			self.scroll_down(20)
			return True
			
		return False