Mercurial > mamba
annotate mamba/widgets/text.py @ 532:f2f7a91aae95
Red died text
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sun, 18 Sep 2011 01:14:50 +0200 |
parents | bbb2e246d0ad |
children |
rev | line source |
---|---|
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
1 import pygame |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
2 from pygame.constants import (SRCALPHA, KEYDOWN, K_ESCAPE, K_RETURN, K_UP, |
418
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
3 K_DOWN, K_SPACE, K_KP_ENTER) |
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
4 |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
5 from mamba.constants import COLOR, FONT_SIZE, FOCUS_COLOR, DELETE_KEYS |
115
d5aa5f805f00
Add Button class that buttons inherit from. It implements a 'clicked' callback
Stefano Rivera <stefano@rivera.za.net>
parents:
91
diff
changeset
|
6 from mamba.widgets.base import Widget, Button |
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
7 from mamba.data import filepath |
75
ac6688820528
Move font name to constants, for future configurablity
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
8 from mamba.constants import DEFAULT_FONT |
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
9 |
137
7fbeeb402685
PEP8 tidy mamba.widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
115
diff
changeset
|
10 |
38 | 11 class TextWidget(Widget): |
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
12 fontcache = {} |
38 | 13 |
155
9afea431af36
Move common widget defauts (mainly colours) to constants
Stefano Rivera <stefano@rivera.za.net>
parents:
142
diff
changeset
|
14 def __init__(self, rect, text, fontsize=FONT_SIZE, color=COLOR): |
38 | 15 super(TextWidget, self).__init__(rect) |
10
771db7d6e862
Basic widget layout (won't work
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
16 self.text = text |
18 | 17 self.fontsize = fontsize |
18 self.color = color | |
19 self.prepare() | |
20 | |
21 def prepare(self): | |
75
ac6688820528
Move font name to constants, for future configurablity
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
22 self.fontname = DEFAULT_FONT |
18 | 23 font = (self.fontname, self.fontsize) |
38 | 24 if font not in TextWidget.fontcache: |
18 | 25 fontfn = filepath('fonts/' + self.fontname) |
142 | 26 TextWidget.fontcache[font] = pygame.font.Font(fontfn, |
27 self.fontsize) | |
38 | 28 self.font = TextWidget.fontcache[font] |
18 | 29 if not isinstance(self.color, pygame.Color): |
30 self.color = pygame.Color(self.color) | |
31 self.surface = self.font.render(self.text, True, self.color) | |
518
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
32 self.text_rect = self.surface.get_rect() |
479 | 33 width, height = self.surface.get_rect().size |
34 self.rect.width = max(self.rect.width, width) | |
35 self.rect.height = max(self.rect.height, height) | |
18 | 36 |
38 | 37 def draw(self, surface): |
38 surface.blit(self.surface, self.rect) | |
91 | 39 |
40 | |
115
d5aa5f805f00
Add Button class that buttons inherit from. It implements a 'clicked' callback
Stefano Rivera <stefano@rivera.za.net>
parents:
91
diff
changeset
|
41 class TextButton(Button, TextWidget): |
91 | 42 def __init__(self, *args, **kwargs): |
155
9afea431af36
Move common widget defauts (mainly colours) to constants
Stefano Rivera <stefano@rivera.za.net>
parents:
142
diff
changeset
|
43 self.focus_color = kwargs.pop('focus_color', FOCUS_COLOR) |
91 | 44 self.padding = kwargs.pop('padding', 10) |
45 self.border = kwargs.pop('border', 3) | |
46 super(TextButton, self).__init__(*args, **kwargs) | |
47 if not isinstance(self.focus_color, pygame.Color): | |
48 self.focus_color = pygame.Color(self.focus_color) | |
49 self.focussable = True | |
50 | |
51 def prepare(self): | |
52 super(TextButton, self).prepare() | |
53 text = self.surface | |
518
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
54 text_rect = self.text_rect |
91 | 55 self._focussed = self.focussed |
440
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
56 if self.disabled: |
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
57 color = pygame.Color('#666666') |
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
58 elif self.focussed: |
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
59 color = self.focus_color |
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
60 else: |
93ba8c966cb9
Disableable text buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
418
diff
changeset
|
61 color = self.color |
91 | 62 |
479 | 63 width = text_rect.width + self.padding * 2 |
64 height = text_rect.height + self.padding * 2 | |
65 self.rect.width = max(self.rect.width, width) | |
66 self.rect.height = max(self.rect.height, height) | |
156 | 67 self.surface = pygame.Surface(self.rect.size, SRCALPHA) |
68 self.surface.fill(0) | |
91 | 69 self.surface.blit(text, text.get_rect().move(self.padding, |
70 self.padding)) | |
71 pygame.draw.rect(self.surface, color, self.surface.get_rect(), | |
72 self.border) | |
73 | |
74 def draw(self, surface): | |
75 if self._focussed != self.focussed: | |
76 self.prepare() | |
77 super(TextButton, self).draw(surface) | |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
78 |
418
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
79 def event(self, ev): |
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
80 if ev.type == KEYDOWN and ev.key == K_SPACE: |
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
81 return self.forced_click() |
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
82 return super(TextButton, self).event(ev) |
546b68aedf0c
Space bar can click buttons
Stefano Rivera <stefano@rivera.za.net>
parents:
417
diff
changeset
|
83 |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
84 |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
85 class EntryTextWidget(TextWidget): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
86 def __init__(self, rect, text, **kwargs): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
87 self.focus_color = kwargs.pop('focus_color', FOCUS_COLOR) |
289
a44eabb108a5
Make prompt text a parameter
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
88 self.prompt = kwargs.pop('prompt', 'Entry:') |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
89 self.value = text |
289
a44eabb108a5
Make prompt text a parameter
Neil Muller <drnlmuller@gmail.com>
parents:
245
diff
changeset
|
90 text = '%s %s' % (self.prompt, text) |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
91 self.base_color = COLOR |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
92 self.update_func = kwargs.pop('update', None) |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
93 super(EntryTextWidget, self).__init__(rect, text, **kwargs) |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
94 if not isinstance(self.focus_color, pygame.Color): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
95 self.focus_color = pygame.Color(self.focus_color) |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
96 self.focussable = True |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
97 self.base_color = self.color |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
98 self.add_callback(KEYDOWN, self.update) |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
99 |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
100 def update(self, ev, widget): |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
101 old_value = self.value |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
102 if ev.key in DELETE_KEYS: |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
103 if self.value: |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
104 self.value = self.value[:-1] |
417 | 105 elif ev.key in (K_ESCAPE, K_RETURN, K_KP_ENTER, K_UP, K_DOWN): |
292
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
106 return False # ignore these |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
107 else: |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
108 self.value += ev.unicode |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
109 if old_value != self.value: |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
110 self.text = '%s %s' % (self.prompt, self.value) |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
111 self.prepare() |
feca52afc109
Move editing code around
Neil Muller <drnlmuller@gmail.com>
parents:
289
diff
changeset
|
112 return True |
245
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
113 |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
114 def prepare(self): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
115 self.color = self.focus_color if self.focussed else self.base_color |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
116 super(EntryTextWidget, self).prepare() |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
117 self._focussed = self.focussed |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
118 |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
119 def draw(self, surface): |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
120 if self._focussed != self.focussed: |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
121 self.prepare() |
0975a995113b
Factor out entry widget a bit
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
122 super(EntryTextWidget, self).draw(surface) |
518
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
123 if self.focussed: |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
124 text_rect = self.text_rect |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
125 # Warning, 00:30 AM code on the last Saturday |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
126 cur_start = text_rect.move( |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
127 (self.rect.left + 2, self.rect.top + 3)).topright |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
128 cur_end = text_rect.move( |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
129 (self.rect.left + 2, self.rect.top - 3)).bottomright |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
130 pygame.draw.line(surface, self.focus_color, |
bbb2e246d0ad
Add cursor'ish thingy thing
Neil Muller <drnlmuller@gmail.com>
parents:
479
diff
changeset
|
131 cur_start, cur_end, 2) |