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