2 A text label with autoscrolling.
5 from Widget import Widget
6 from Pixmap import Pixmap, pixmap_for_text
21 def __init__(self, text, font, color):
23 self.__text_pmap = None
25 self.__is_new_text = True
26 self.__alignment = self.LEFT
27 self.__render_timer = None
34 self.__create_text_pmap()
39 self.__is_new_text = True
41 #self.__create_text_pmap()
44 def set_size(self, w, h):
46 Widget.set_size(self, w, h)
47 self.__is_new_text = True
51 def __create_text_pmap(self):
53 if (not self.__is_new_text): return
55 self.__text_pmap = pixmap_for_text(self.__text or " ", self.__font)
58 def __acquire_background(self):
60 if (not self.__is_new_text): return
62 x, y = self.get_screen_pos()
63 w, h = self.get_size()
64 screen = self.get_screen()
65 text_w, text_h = self.__text_pmap.get_size()
67 if (w <= 0): w = text_w
68 if (h <= 0): h = text_h
70 self.__bg = Pixmap(None, w, text_h)
72 self.__bg.copy_buffer(screen, x, y, 0, 0, w, text_h)
75 def __restore_background(self):
77 if (not self.__is_new_text or not self.__bg): return
78 if (not self.may_render()): return
80 x, y = self.get_screen_pos()
81 w, h = self.get_size()
82 screen = self.get_screen()
83 text_w, text_h = self.__text_pmap.get_size()
85 if (not w): w = text_w
86 if (not h): h = text_h
88 bg_w, bg_h = self.__bg.get_size()
90 screen.copy_pixmap(self.__bg, 0, 0, x, y, bg_w, bg_h)
93 def __create_text(self):
95 if (not self.__is_new_text): return
97 x, y = self.get_screen_pos()
98 w, h = self.get_size()
99 screen = self.get_screen()
100 text_w, text_h = self.__text_pmap.get_size()
102 if (not w): w = text_w
103 if (not h): h = text_h
106 if (self.__alignment == self.LEFT): text_x = 0
107 elif (self.__alignment == self.CENTERED): text_x = (w - text_w) / 2
108 else: text_x = w - text_w
113 for i in range(0, text_w, w):
114 self.__text_pmap.copy_pixmap(self.__bg, 0, 0, i - text_x, 0,
118 self.__text_pmap.draw_text(self.__text, self.__font, 0, 0, self.__color)
121 def set_alignment(self, alignment):
123 self.__alignment = alignment
126 def get_physical_size(self):
128 w, h = self.get_size()
129 if (self.__text_pmap):
130 text_w, text_h = self.__text_pmap.get_size()
131 if (not w): w = text_w
132 if (not h): h = text_h
137 def set_text(self, text):
139 if (self.__text == text): return
141 self.__is_new_text = True
144 if (self.may_render()):
145 if (self.__render_timer):
146 gobject.source_remove(self.__render_timer)
147 self.__render_text(0, 1)
155 def render_this(self):
157 self.__is_new_text = True
158 self.__create_text_pmap()
159 self.__acquire_background()
161 self.__is_new_text = False
163 if (self.may_render()):
164 if (self.__render_timer):
165 gobject.source_remove(self.__render_timer)
166 self.__render_text(0, 1)
169 def __render_text(self, pos, direction, begin_time = 0):
171 if (not self.may_render()): return
173 if (not begin_time): begin_time = time.time()
175 if (self.__is_new_text):
176 self.__restore_background()
177 self.__create_text_pmap()
178 self.__acquire_background()
180 self.__is_new_text = False
185 text_w, text_h = self.__text_pmap.get_size()
186 x, y = self.get_screen_pos()
187 w, h = self.get_size()
188 screen = self.get_screen()
190 if (not w): w = text_w
191 if (not h): h = text_h
193 # render currently visible text portion
195 if (self.__alignment == self.LEFT): text_x = 0
196 elif (self.__alignment == self.CENTERED): text_x = (w - text_w) / 2
197 else: text_x = w - text_w
201 if (self.may_render()):
202 text_y = (h - text_h) / 2
203 #self.use_clipping(True)
204 screen.copy_pixmap(self.__text_pmap, pos, 0, x + text_x, y + text_y,
205 min(text_w, w), text_h)
206 #self.use_clipping(False)
209 # (only scroll for 10 minutes, then stop to save battery)
210 if (text_w > w and self.may_render() and begin_time + 600 > time.time()):
214 elif (pos == text_w - w):
225 self.__render_timer = \
226 gobject.timeout_add(delay, self.__render_text, pos, direction,
230 self.__render_timer = None