PEP8 fixes.
[naja.git] / naja / widgets / text.py
1 import pygame
2
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
7
8
9 class TextWidget(Widget):
10     def __init__(self, pos, text, size=None, fontname=None, fontsize=None,
11                  colour=None):
12         super(TextWidget, self).__init__(pos, size)
13
14         self.text = text
15         self.fontname = fontname or FONT
16         self.fontsize = (fontsize or FONT_SIZE) / 2
17         self.colour = convert_colour(colour or (0, 0, 0))
18
19     def prepare(self):
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 * 2,
24                                                      text_rect.height * 2))
25         self.size = self.surface.get_rect().size
26
27     def draw(self, surface):
28         surface.blit(self.surface, self.rect)
29
30
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',
38                                                        (0, 0, 0)))
39         self.box_width = kwargs.pop('box_width', 0)
40
41         super(TextBoxWidget, self).__init__(*args, **kwargs)
42
43     def prepare(self):
44         self.font = resources.get_font(self.fontname, self.fontsize)
45         self.lines = []
46         height = 0
47         width = 0
48         for line in self.text.split('\n'):
49             if self.box_width is not 0:
50                 current_line = ''
51                 current_line_rendered = None
52                 for word in line.split(' '):
53                     if len(current_line) > 0:
54                         current_line += ' ' + word
55                     else:
56                         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)))
67                         current_line = word
68                         current_line_rendered = self.font.render(
69                             word, True, self.colour)
70                     else:
71                         raise Exception(
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)))
78             else:
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)))
85
86         width += 2 + self.padding
87         height += 2 + self.padding
88         self.surface = pygame.surface.Surface((width, height),
89                                               pygame.locals.SRCALPHA)
90
91     def draw(self, surface):
92         self.surface.fill(self.bg_colour)
93         y = 0
94         for line in self.lines:
95             surface.blit(line, (self.padding, y + self.padding))
96             y += line.get_rect().height
97         self.text_rect = surface.get_rect()
98         if not self.size:
99             self.rect.size = self.text_rect.size