diff engine/extensions/pychan/widgets.py @ 228:756b895e1dab

Merged unicode-support back into trunk. Now all GUI/visible strings should be unicode. Internal strings unchanged. Remember to use a font that actually has the desired codepoints. Current default unicode policiy is 'ignore'.
author phoku@33b003aa-7bff-0310-803a-e67f0ece8222
date Sat, 21 Mar 2009 10:38:11 +0000
parents 724f3a5f3e96
children 2959ed343fde
line wrap: on
line diff
--- a/engine/extensions/pychan/widgets.py	Fri Mar 20 15:17:28 2009 +0000
+++ b/engine/extensions/pychan/widgets.py	Sat Mar 21 10:38:11 2009 +0000
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-# coding: utf-8
 ### Widget/Container Base Classes ###
 
 """
@@ -12,17 +11,30 @@
 import tools
 import events
 from exceptions import *
-from attrs import Attr,PointAttr,ColorAttr,BoolAttr,IntAttr,FloatAttr
+from attrs import Attr,UnicodeAttr, PointAttr,ColorAttr,BoolAttr,IntAttr,FloatAttr
 
 def get_manager():
 	import pychan
 	return pychan.manager
 
-def _mungeText(text):
+def _text2gui(text):
+	"""
+	This function is applied to all text set on widgets.
+	It replaces tabs by four spaces.
+	It assumes the text to be a unicode object.
 	"""
-	This function is applied to all text set on widgets, currently only replacing tabs with four spaces.
+	if not isinstance(text,unicode):
+		print "Widget text needs to be set from an unicode object. Got: '%s'" % repr(text)
+		text = unicode(text,"utf8")
+	return text.encode("utf8",*get_manager().unicodePolicy).replace("\t"," "*4).replace("[br]","\n")
+
+def _gui2text(text):
 	"""
-	return text.replace('\t'," "*4).replace('[br]','\n')
+	This function is applied to all text get from widgets.
+	Translates the encoded string into a unicode object.
+	"""
+	return unicode(text,"utf8",*get_manager().unicodePolicy)
+
 
 def isLayouted(widget):
 	return isinstance(widget,LayoutBase)
@@ -989,9 +1001,9 @@
 	  - titlebar_height: The height of the window title bar
 	"""
 
-	ATTRIBUTES = Container.ATTRIBUTES + [ Attr('title'), IntAttr('titlebar_height') ]
+	ATTRIBUTES = Container.ATTRIBUTES + [ UnicodeAttr('title'), IntAttr('titlebar_height') ]
 
-	def __init__(self,title="title",titlebar_height=0,**kwargs):
+	def __init__(self,title=u"title",titlebar_height=0,**kwargs):
 		super(Window,self).__init__(_real_widget = fife.Window(), **kwargs)
 		if titlebar_height == 0:
 			titlebar_height = self.real_font.getHeight() + 4
@@ -1002,8 +1014,8 @@
 		self.position_technique = "automatic"
 
 
-	def _getTitle(self): return self.real_widget.getCaption()
-	def _setTitle(self,text): self.real_widget.setCaption(text)
+	def _getTitle(self): return _gui2text(self.real_widget.getCaption())
+	def _setTitle(self,text): self.real_widget.setCaption(_text2gui(text))
 	title = property(_getTitle,_setTitle)
 
 	def _getTitleBarHeight(self): return self.real_widget.getTitleBarHeight()
@@ -1037,9 +1049,9 @@
 	The text can be set via the L{distributeInitialData} method.
 	"""
 
-	ATTRIBUTES = Widget.ATTRIBUTES + [Attr('text')]
+	ATTRIBUTES = Widget.ATTRIBUTES + [UnicodeAttr('text')]
 
-	def __init__(self, text = "",**kwargs):
+	def __init__(self, text = u"",**kwargs):
 		self.margins = (5,5)
 		self.text = text
 		super(BasicTextWidget,self).__init__(**kwargs)
@@ -1048,13 +1060,13 @@
 		self.accepts_initial_data = True
 		self._realSetInitialData = self._setText
 
-	def _getText(self): return self.real_widget.getCaption()
-	def _setText(self,text): self.real_widget.setCaption(_mungeText(text))
+	def _getText(self): return _gui2text(self.real_widget.getCaption())
+	def _setText(self,text): self.real_widget.setCaption(_text2gui(text))
 	text = property(_getText,_setText)
 
 	def resizeToContent(self, recurse = True):
 		self.height = self.real_font.getHeight() + self.margins[1]*2
-		self.width = self.real_font.getWidth(self.text) + self.margins[0]*2
+		self.width = self.real_font.getWidth(_text2gui(self.text)) + self.margins[0]*2
 
 class Icon(Widget):
 	"""
@@ -1158,7 +1170,7 @@
 	  - hover_image: String: The source location of the Image for the B{unpressed hovered} state.
 	"""
 
-	ATTRIBUTES = BasicTextWidget.ATTRIBUTES + [Attr('up_image'),Attr('down_image'),PointAttr('offset'),Attr('helptext'),Attr('hover_image')]
+	ATTRIBUTES = BasicTextWidget.ATTRIBUTES + [Attr('up_image'),Attr('down_image'),PointAttr('offset'),UnicodeAttr('helptext'),Attr('hover_image')]
 
 	def __init__(self,up_image="",down_image="",hover_image="",offset=(0,0),**kwargs):
 		self.real_widget = fife.TwoButton()
@@ -1256,7 +1268,11 @@
 	  - toggled: Boolean: Whether the button is toggled or not.
 	"""
 
-	ATTRIBUTES = BasicTextWidget.ATTRIBUTES + [Attr('up_image'),Attr('down_image'),PointAttr('offset'),Attr('helptext'),Attr('hover_image'),Attr('group')]
+	ATTRIBUTES = BasicTextWidget.ATTRIBUTES + [
+		Attr('up_image'),Attr('down_image'),Attr('hover_image'),
+		PointAttr('offset'),
+		UnicodeAttr('helptext'),Attr('group')
+	]
 
 	def __init__(self,up_image="",down_image="",hover_image="",offset=(0,0),group="",**kwargs):
 
@@ -1323,9 +1339,9 @@
 	offset = property(_getOffset,_setOffset)
 
 	def _setHelpText(self, txt):
-		self.real_widget.setHelpText(txt)
+		self.real_widget.setHelpText(_text2gui(txt))
 	def _getHelpText(self):
-		return self.real_widget.getHelpText()
+		return _gui2text(self.real_widget.getHelpText())
 	helptext = property(_getHelpText,_setHelpText)
 
 	def resizeToContent(self):
@@ -1403,7 +1419,7 @@
 	group = property(_getGroup,_setGroup)
 
 	def resizeToContent(self,recurse=True):
-		self.width = self.real_font.getWidth(self.text) + 35# Size of the Checked box?
+		self.width = self.real_font.getWidth(_text2gui(self.text)) + 35# Size of the Checked box?
 		self.height = self.real_font.getHeight()
 
 class GenericListmodel(fife.ListModel,list):
@@ -1559,9 +1575,9 @@
 	The text can be read and set via L{distributeData} and L{collectData}.
 	"""
 
-	ATTRIBUTES = Widget.ATTRIBUTES + [Attr('text'),Attr('filename')]
+	ATTRIBUTES = Widget.ATTRIBUTES + [UnicodeAttr('text'),Attr('filename')]
 
-	def __init__(self,text="",filename = "", **kwargs):
+	def __init__(self,text=u"",filename = "", **kwargs):
 		self.real_widget = fife.TextBox()
 		self.text = text
 		self.filename = filename
@@ -1579,7 +1595,8 @@
 		self._filename = filename
 		if not filename: return
 		try:
-			self.text = open(filename).read()
+			# FIXME needs encoding detection.
+			self.text = unicode(open(filename).read(),"utf8")
 		except Exception, e:
 			self.text = str(e)
 	filename = property(_getFileName, _loadFromFile)
@@ -1590,8 +1607,8 @@
 		self.width = max_w
 		self.height = (self.real_font.getHeight() + 2) * self.real_widget.getNumberOfRows()
 
-	def _getText(self): return self.real_widget.getText()
-	def _setText(self,text): self.real_widget.setText(_mungeText(text))
+	def _getText(self): return _gui2text(self.real_widget.getText())
+	def _setText(self,text): self.real_widget.setText(_text2gui(text))
 	text = property(_getText,_setText)
 
 	def _setOpaque(self,opaque): self.real_widget.setOpaque(opaque)
@@ -1612,7 +1629,7 @@
 	The text can be read and set via L{distributeData} and L{collectData}.
 	"""
 
-	ATTRIBUTES = Widget.ATTRIBUTES + [Attr('text')]
+	ATTRIBUTES = Widget.ATTRIBUTES + [UnicodeAttr('text')]
 
 	def __init__(self,text="", **kwargs):
 		self.real_widget = fife.TextField()