3 from naja.constants import FONT, FONT_SIZE
4 from naja.widgets.base import Widget
5 from naja.resources import resources
6 from naja.utils import convert_colour
9 class TextWidget(Widget):
10 def __init__(self, pos, text, size=None, fontname=None, fontsize=None,
12 super(TextWidget, self).__init__(pos, size)
15 self.fontname = fontname or FONT
16 self.fontsize = (fontsize or FONT_SIZE) // 4
17 self.colour = convert_colour(colour or (0, 0, 0))
20 self.font = resources.get_font(self.fontname, self.fontsize)
21 text = self.font.render(self.text, True, self.colour)
22 text_rect = text.get_rect()
23 self.surface = pygame.transform.scale(text, (text_rect.width * 4,
24 text_rect.height * 4))
25 self.size = self.surface.get_rect().size
27 def draw(self, surface):
28 surface.blit(self.surface, self.pos)
31 class TextBoxWidget(TextWidget):
32 def __init__(self, *args, **kwargs):
33 self.padding = kwargs.pop('padding', 5)
34 self.border = kwargs.pop('border', 2)
35 self.bg_colour = convert_colour(kwargs.pop('bg_colour',
36 (255, 255, 255, 192)))
37 self.border_colour = convert_colour(kwargs.pop('border_colour',
39 self.box_width = kwargs.pop('box_width', 0)
41 super(TextBoxWidget, self).__init__(*args, **kwargs)
44 self.font = resources.get_font(self.fontname, self.fontsize)
48 for line in self.text.split('\n'):
49 if self.box_width is not 0:
51 current_line_rendered = None
52 for word in line.split(' '):
53 if len(current_line) > 0:
54 current_line += ' ' + word
57 line = self.font.render(current_line, True, self.colour)
58 if line.get_rect().width <= self.box_width:
59 current_line_rendered = line
60 width = max(width, line.get_rect().width)
61 height += line.get_rect().height
62 elif current_line_rendered is not None:
63 line_rect = current_line_rendered.get_rect()
64 self.lines.append(pygame.transform.scale(
65 current_line_rendered, (line_rect.width * 2,
66 line_rect.height * 2)))
68 current_line_rendered = self.font.render(
69 word, True, self.colour)
72 'Line too long. Please resize or rephrase')
73 if current_line_rendered is not None:
74 line_rect = current_line_rendered.get_rect()
75 self.lines.append(pygame.transform.scale(
76 current_line_rendered, (line_rect.width * 2,
77 line_rect.height * 2)))
79 line = self.font.render(line, True, self.colour)
80 line_rect = line.get_rect()
81 width = max(width, line.get_rect().width)
82 height += line.get_rect().height
83 self.lines.append(pygame.transform.scale(
84 line, (line_rect.width * 2, line_rect.height * 2)))
86 width += 2 + self.padding
87 height += 2 + self.padding
88 self.surface = pygame.surface.Surface((width, height),
89 pygame.locals.SRCALPHA)
91 def draw(self, surface):
92 self.surface.fill(self.bg_colour)
94 for line in self.lines:
95 surface.blit(line, (self.pos[0] + self.padding, y + self.padding))
96 y += line.get_rect().height
97 self.text_rect = surface.get_rect()
99 self.rect.size = self.text_rect.size