Newer
Older
Import / projects / LGN-IP3870 / t / new / entry.py
# -*- encoding: UTF-8 -*-

import uiconfig
from richtext import RichTextBase, pop, TAG_TEXT
from richtextedit import EditBase

class EntryRichText(RichTextBase):
	def __init__(self, pos=(0,0), hiddenset=0):
		RichTextBase.__init__(self, pos, (1000,1000), True)
		self.hiddenset = hiddenset
		self._text_font = uiconfig.entry_font
		self._text_color = uiconfig.entry_color

		self.width = 0

	def formatting(self):
		import status
		xpos = self.x

		objs = self.objs[:]
		objs.reverse()
		while objs:
			o = pop(objs)
			o2 = pop(objs)
			while o2 and o.join(o2):
				self.handle_join(o, o2)
				o2 = pop(objs)
			if o2: objs.append(o2)

		last_o = None

		for o in self.objs:
			o.move(xpos, self.y)
			if not status.password_style:
				o.show()

			o.dirty = False
			xpos += o.width()

		if status.password_style:
			xpos = self.x

			obj = []
			import copy
			for o in self.objs:
				obj.append(copy.copy(o))

			for o in obj:
				if not o._ul:
					o.set_text(len(o.get_text())*'*')
				o.move(xpos, self.y)
				o.show()
				o.dirty = False
				xpos += o.width()

		self.width = xpos
		self.set_clip(self.clip)


class Entry(EditBase):
	def __init__(self, pos, size, bgcolor=None):
		EditBase.__init__(self, pos, size, bgcolor)

		self.richtext = EntryRichText(pos)
		self.richtext.set_clip(self.clip)
		self.children.append(self.richtext)
		self._hscroll_offset = 2
		self._scroll = False

	def free(self):
		EditBase.free(self)
		self.richtext = None

	def backspace(self, count=1):
		EditBase.backspace(self, count=count)
		self.check_hscroll_offset()

	def cursor_backward(self):
		EditBase.cursor_backward(self)
		self.check_hscroll_offset()

	def cursor_forward(self):
		EditBase.cursor_forward(self)
		self.check_hscroll_offset()

	def cursor_start(self):
		EditBase.cursor_start(self)
		self.check_hscroll_offset()

	def cursor_end(self):
		EditBase.cursor_end(self)
		self.check_hscroll_offset()

	def is_cursor_end(self):
		if EditBase.cursor_end_pos(self) > 0:
			return True
		return False
		
	def is_cursor_show(self):
		if self.richtext.cursor_hidden:
			return False
		else:
			return True
		
	def set_text(self, text):
		EditBase.set_text(self, text)
		self.check_hscroll_offset()

	def insert_unicode_text(self, text, ul=False):
		if text == '\n':
			return

		EditBase.insert_unicode_text(self, text, ul=ul)
		self.check_hscroll_offset()

	def check_hscroll_offset(self):
		cx, cy, ch = self.richtext.cursor_pos_height()
		w = self.richtext.width

		clip_pos = self.clip.geometry_get()
		if cx < clip_pos[0] + 2:
			self._hscroll_offset += clip_pos[0] - cx + 20 -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -((abs(self._hscroll_offset)/11)*11 + 11)
				else:
					self._hscroll_offset = (abs(self._hscroll_offset)/11)*11 + 11
			self._hscroll_offset += 2
			if self._hscroll_offset > 2:
				self._hscroll_offset = 2
		elif cx  > clip_pos[0] + clip_pos[2]:
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0])+2
			if self._hscroll_offset <= 0:
				self._hscroll_offset = -(int(float(abs(self._hscroll_offset)/14)*14) + 14)
			else:
				self._hscroll_offset = int(float(abs(self._hscroll_offset)/14)*14) + 14

		'''
		elif cx  > clip_pos[0] + 2 + clip_pos[2]:
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -(int(float(abs(self._hscroll_offset)/11)*11) + 11)
				else:
					self._hscroll_offset = int(float(abs(self._hscroll_offset)/11)*11) + 11
			self._hscroll_offset += 2
		'''


		self.richtext.move(clip_pos[0] + self._hscroll_offset, clip_pos[1])
		self.richtext.cursor.queue_update()

# KA: [20080311] phonebook UI
class SearchEntry(EditBase):
	def __init__(self, pos, size):
		EditBase.__init__(self, pos, size)

		self.richtext = EntryRichText(pos)
		self.richtext.set_clip(self.clip)
		self.children.append(self.richtext)
		self._hscroll_offset = 2
		self._scroll = False

	def free(self):
		EditBase.free(self)
		self.richtext = None

	def backspace(self, count=1):
		EditBase.backspace(self, count=count)
		self.check_hscroll_offset()

	def cursor_backward(self):
		EditBase.cursor_backward(self)
		self.check_hscroll_offset()

	def cursor_forward(self):
		EditBase.cursor_forward(self)
		self.check_hscroll_offset()

	def cursor_start(self):
		EditBase.cursor_start(self)
		self.check_hscroll_offset()

	def cursor_end(self):
		EditBase.cursor_end(self)
		self.check_hscroll_offset()

	def set_text(self, text):
		EditBase.set_text(self, text)
		self.check_hscroll_offset()

	def insert_unicode_text(self, text, ul=False):
		if text == '\n':
			return

		EditBase.insert_unicode_text(self, text, ul=ul)
		self.check_hscroll_offset()

	def check_hscroll_offset(self):
		cx, cy, ch = self.richtext.cursor_pos_height()
		w = self.richtext.width

		clip_pos = self.clip.geometry_get()
		if cx < clip_pos[0] + 2:
			self._hscroll_offset += clip_pos[0] - cx + 20 -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -((abs(self._hscroll_offset)/11)*11 + 11)
				else:
					self._hscroll_offset = (abs(self._hscroll_offset)/11)*11 + 11
			self._hscroll_offset += 2
			if self._hscroll_offset > 2:
				self._hscroll_offset = 2
		elif cx  > clip_pos[0] + clip_pos[2]:
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) +2
			if self._hscroll_offset < 0:
				self._hscroll_offset = -(int(float(abs(self._hscroll_offset)/14)*14) + 14)
			else:
				self._hscroll_offset = int(float(abs(self._hscroll_offset)/14)*14) + 14
		'''
		elif cx  > clip_pos[0] + 2 + clip_pos[2]:
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -((abs(self._hscroll_offset)/11)*11 + 11)
				else:
					self._hscroll_offset = (abs(self._hscroll_offset)/11)*11 + 11
			self._hscroll_offset += 2
		'''
		self.richtext.move(clip_pos[0] + self._hscroll_offset, clip_pos[1])
		self.richtext.cursor.queue_update()

	def showFocus(self):
		self.background.color = uiconfig.color_select
		self.clip.color = uiconfig.color_select
		self.richtext.set_clip(self.clip)
		EditBase.cursor_show(self)
		
	def lostFocus(self):
		self.background.color = uiconfig.color_white
		self.clip.color = uiconfig.color_white
		self.richtext.set_clip(self.clip)
		EditBase.cursor_hide(self)

# KA: [20080311] phonebook UI ==