Merge lp:~codeforger/simplegc/simplegc into lp:simplegc

Proposed by Sam Bull
Status: Merged
Merged at revision: 274
Proposed branch: lp:~codeforger/simplegc/simplegc
Merge into: lp:simplegc
Diff against target: 996 lines (+713/-62)
9 files modified
example/test_lists.py (+68/-0)
sgc/__init__.py (+6/-0)
sgc/widgets/base_widget.py (+3/-0)
sgc/widgets/button.py (+13/-16)
sgc/widgets/composite/dialogs.py (+98/-0)
sgc/widgets/lists.py (+383/-0)
sgc/widgets/menu.py (+19/-12)
sgc/widgets/opengl.py (+121/-32)
sgc/widgets/radio_button.py (+2/-2)
To merge this branch: bzr merge lp:~codeforger/simplegc/simplegc
Reviewer Review Type Date Requested Status
Sam Bull Needs Fixing
Review via email: mp+115960@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Sam Bull (dreamsorcerer) wrote :

Unresolved conflicts that should never have been committed.
Remove extra line breaks added into multiple files.
Remove matrix.py and revert opengl.py.

review: Needs Fixing
Revision history for this message
Sam Bull (dreamsorcerer) wrote :

My mistake, conflicts are with newer trunk. Resolve the conflicts, and also revert helloworld.py (this is for one of the tutorials, put you example code into test.py), _locals.py, base_widget.py, menu.py, radio_button.py.

Revision history for this message
Michael Rochester (codeforger) wrote :

This merge also contains the new button style I invented, would you like me to revert that too?

lp:~codeforger/simplegc/simplegc updated
273. By Michael Rochester

merge

274. By Michael Rochester

merge

275. By Michael Rochester

moved test code to test.py

276. By Michael Rochester

reverted /example/helloworld.py

277. By Michael Rochester

fixed my idiocy with test.py

278. By Michael Rochester

removed matrix.py as requested

Revision history for this message
Sam Bull (dreamsorcerer) wrote :

> This merge also contains the new button style I invented, would you like me to
> revert that too?

Yes please.

lp:~codeforger/simplegc/simplegc updated
279. By Michael Rochester

reverted button.py to the old buttons style

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'example/test_lists.py'
--- example/test_lists.py 1970-01-01 00:00:00 +0000
+++ example/test_lists.py 2012-07-21 12:53:18 +0000
@@ -0,0 +1,68 @@
1import sgc
2from sgc.locals import *
3
4import pygame
5from pygame.locals import *
6
7pygame.display.init()
8pygame.font.init()
9
10screen = sgc.surface.Screen((640,480))
11
12clock = pygame.time.Clock()
13
14lst = sgc._List(width=(100),pos=(10,10),multi_selection=True,content=("hello","world","nice","to","meet","you"))
15lst.add(0)
16
17mullst = sgc._MultiList(pos=(10,150),columnwidth=(150,150),content=(["hello","world"],["nice","to"],["meet","you"]))
18mullst.add(0)
19
20listb = sgc.ListBox((100,100),pos=(150,10),multi_selection=True,content=("hello","world","nice","to","meet","you"))
21listb.add(0)
22
23list2 = sgc.ListBox((100,100),pos=(300,10),header="head",content=("hello","world","nice","to","meet","you"))
24list2.add(0)
25
26data = (["Hello","12Mb","30/06/2012"],
27 ["World","15Mb","30/06/2012"],
28 ["Nice","123Kb","19/06/2012"],
29 ["To","1.2Gb","29/06/2012"],
30 ["Meet","12Mb","25/06/2012"],
31 ["You","6Mb","30/06/2012"])
32
33
34mullist = sgc.MultiListBox((200,100), pos=(370,150), columnwidth=(150,50,100), content=data)
35mullist.add(0)
36
37head = ("Name","Size","Modified")
38
39mullist2 = sgc.MultiListBox((100,100), pos=(100,300), multi_selection=True, header=head, columnwidth=(150,150,150), content=data)
40mullist2.add(0)
41
42def print_attr():
43 x = mullist2.selected_text
44 print x
45
46def print_pos():
47 x = mullist2.selected_pos
48 print x
49
50btn = sgc.Button(pos=(300,400), label="get attr")
51btn.on_click = print_attr
52btn.add(0)
53
54btn2 = sgc.Button(pos=(300,300), label="get pos")
55btn2.on_click = print_pos
56btn2.add(0)
57
58while True:
59 time = clock.tick(30)
60
61 for event in pygame.event.get():
62 sgc.event(event)
63 if event.type == QUIT:
64 exit()
65
66 screen.fill((200,200,200))
67 sgc.update(time)
68 pygame.display.flip()
069
=== modified file 'sgc/__init__.py'
--- sgc/__init__.py 2012-07-19 13:33:13 +0000
+++ sgc/__init__.py 2012-07-21 12:53:18 +0000
@@ -21,12 +21,18 @@
21from widgets.boxes import VBox, HBox21from widgets.boxes import VBox, HBox
22from widgets.button import Button22from widgets.button import Button
23from widgets.container import Container23from widgets.container import Container
24from widgets.composite.dialogs import DialogSaveQuit
24from widgets.dialog import Dialog25from widgets.dialog import Dialog
25from widgets.fps_counter import FPSCounter26from widgets.fps_counter import FPSCounter
26from widgets.input_box import InputBox27from widgets.input_box import InputBox
27from widgets.label import Label28from widgets.label import Label
29from widgets.lists import MultiListBox
30from widgets.lists import ListBox
31from widgets.lists import _List
32from widgets.lists import _MultiList
28from widgets.menu import Menu33from widgets.menu import Menu
29from widgets.radio_button import Radio34from widgets.radio_button import Radio
30from widgets.scroll_box import ScrollBox35from widgets.scroll_box import ScrollBox
31from widgets.settings import Keys36from widgets.settings import Keys
32from widgets.switch import Switch37from widgets.switch import Switch
38
3339
=== modified file 'sgc/widgets/base_widget.py'
--- sgc/widgets/base_widget.py 2012-07-18 09:38:26 +0000
+++ sgc/widgets/base_widget.py 2012-07-21 12:53:18 +0000
@@ -237,6 +237,9 @@
237 return surf237 return surf
238 elif isinstance(surf, str):238 elif isinstance(surf, str):
239 return pygame.image.load(surf).convert_alpha()239 return pygame.image.load(surf).convert_alpha()
240 elif isinstance(surf, opengl.OpenGLImage):
241 self._custom_image = True
242 return surf
240243
241 # Create base images244 # Create base images
242 self._custom_image = False245 self._custom_image = False
243246
=== modified file 'sgc/widgets/button.py'
--- sgc/widgets/button.py 2012-06-16 11:01:51 +0000
+++ sgc/widgets/button.py 2012-07-21 12:53:18 +0000
@@ -58,16 +58,15 @@
58 # Clear previous renderings58 # Clear previous renderings
59 del self._settings["label"][1:]59 del self._settings["label"][1:]
60 label = self._settings["label"][0].split("\n")60 label = self._settings["label"][0].split("\n")
61 f = Font["widget"]
62 h = f.get_ascent()
63 for count, line in enumerate(label):61 for count, line in enumerate(label):
64 lbl = Simple(f.render(line, True, self._settings["label_col"]))62 lbl = Simple(Font["widget"].render(line, True,
63 self._settings["label_col"]))
65 self._settings["label"].append(lbl)64 self._settings["label"].append(lbl)
66 y = (self.rect.h - (h * len(label)) + f.get_descent()) / 2 + \65 y = (self.rect.h - (lbl.rect.h * len(label))) / 2 + \
67 (h * count)66 (lbl.rect.h * count)
68 lbl.rect.midtop = (self.rect.w/2, y)67 lbl.rect.midtop = (self.rect.w/2, y)
6968
70 def _draw_base(self, draw):69 def _draw(self, draw):
71 # Frames around edge of button70 # Frames around edge of button
72 x = min(self.image.get_size()) / 871 x = min(self.image.get_size()) / 8
73 self._frame_lt = ((0,0), (self.rect.w,0), (self.rect.w-x,x),72 self._frame_lt = ((0,0), (self.rect.w,0), (self.rect.w-x,x),
@@ -81,18 +80,16 @@
81 cols["over"] = [min(c*1.1, 255) for c in self._settings["col"]]80 cols["over"] = [min(c*1.1, 255) for c in self._settings["col"]]
82 cols["down"] = [c*0.8 for c in self._settings["col"]]81 cols["down"] = [c*0.8 for c in self._settings["col"]]
83 for img in cols:82 for img in cols:
84 self._images[img].fill(cols[img])83 if not self._custom_image:
85 # Draw a frame around the edges of the button84 self._images[img].fill(cols[img])
86 frame_lt_c = [min(c*1.3,255) for c in cols[img]]85 # Draw a frame around the edges of the button
87 frame_rb_c = [c*0.8 for c in cols[img]]86 frame_lt_c = [min(c*1.3,255) for c in cols[img]]
88 draw.polygon(self._images[img], frame_lt_c, self._frame_lt)87 frame_rb_c = [c*0.8 for c in cols[img]]
89 draw.polygon(self._images[img], frame_rb_c, self._frame_rb)88 draw.polygon(self._images[img], frame_lt_c, self._frame_lt)
9089 draw.polygon(self._images[img], frame_rb_c, self._frame_rb)
91 def _draw_final(self, draw):
92 for img in self._images.values():
93 # Blit label onto button90 # Blit label onto button
94 for line in self._settings["label"][1:]:91 for line in self._settings["label"][1:]:
95 img.blit(line.image, line.pos)92 self._images[img].blit(line.image, line.pos)
96 self._draw_button()93 self._draw_button()
9794
98 def on_click(self):95 def on_click(self):
9996
=== added directory 'sgc/widgets/composite'
=== added file 'sgc/widgets/composite/__init__.py'
=== added file 'sgc/widgets/composite/dialogs.py'
--- sgc/widgets/composite/dialogs.py 1970-01-01 00:00:00 +0000
+++ sgc/widgets/composite/dialogs.py 2012-07-21 12:53:18 +0000
@@ -0,0 +1,98 @@
1#!/usr/bin/env python
2
3# Copyright (C) 2012 Michael Rochester
4
5"""
6Dialog composite widgets. A list of predefined common dialogs
7
8"""
9import sgc
10from sgc.locals import *
11
12from ..dialog import *
13
14class DialogSaveQuit (Dialog):
15 """
16 This dialog is designed to be called when a user tries to quit without saving.
17 It will emmit 2 GUI events: 'quit' and 'save'.
18 If the final option 'cancel' is selected, the dialog will remove its self.
19 """
20 def _config(self, **kwargs):
21 """
22 doctitle: ``str`` The text that will be used as the documents Title.
23 """
24 if "init" in kwargs:
25 self.lbl = sgc.Label(pos=(10,10),text="The document has not been saved.\nWould you like to save the changes before quitting?", col=(20,20,20))
26 self.btn_save = sgc.Button(pos=(200,100), label="Save")
27 self.btn_save.on_click = self.send_save
28 self.btn_quit = sgc.Button((200,50), pos=(0,100), label="Close without saving")
29 self.btn_quit.on_click = self.send_quit
30 self.btn_cancel = sgc.Button(pos=(310,100), label="Cancel")
31 self.btn_cancel.on_click = self.send_cancel
32 contain = sgc.Container(pos=(0,0), widgets=[self.lbl,self.btn_quit,self.btn_cancel,self.btn_save] )
33
34 kwargs["widget"] = contain;
35 kwargs["title"]="Save changes?"
36 sgc.Dialog._config(self,**kwargs)
37 if "doctitle" in kwargs:
38 self.lbl.text = "The document \"" + kwargs["doctitle"] + "\" has not been saved.\nWould you like to save the changes before quitting?"
39 def send_quit(self):
40 ev = pygame.event.Event(GUI, {"gui_type": "quit",
41 "widget_type": self.__class__,
42 "widget":self})
43 pygame.event.post(ev)
44
45 def send_save(self):
46 ev = pygame.event.Event(GUI, {"gui_type": "save",
47 "widget_type": self.__class__,
48 "widget":self})
49 pygame.event.post(ev)
50 def send_cancel(self):
51 ev = pygame.event.Event(GUI, {"gui_type": "cancel",
52 "widget_type": self.__class__,
53 "widget":self})
54 pygame.event.post(ev)
55
56class DialogSave (Dialog):
57 """
58 This dialog is designed to be called when a user tries to quit without saving.
59 It will emmit 2 GUI events: 'quit' and 'save'.
60 If the final option 'cancel' is selected, the dialog will remove its self.
61 """
62 def _config(self, **kwargs):
63 """
64 doctitle: ``str`` The text that will be used as the documents Title.
65 """
66 if "init" in kwargs:
67 self.lbl = sgc.Label(pos=(10,10),text="The document has not been saved.\nWould you like to save the changes before quitting?", col=(20,20,20))
68 self.btn_save = sgc.Button(pos=(200,100), label="Save")
69 self.btn_save.on_click = self.send_save
70 self.btn_quit = sgc.Button((200,50), pos=(0,100), label="Close without saving")
71 self.btn_quit.on_click = self.send_quit
72 self.btn_cancel = sgc.Button(pos=(310,100), label="Cancel")
73 self.btn_cancel.on_click = self.send_cancel
74 contain = sgc.Container(pos=(0,0), widgets=[self.lbl,self.btn_quit,self.btn_cancel,self.btn_save] )
75
76 kwargs["widget"] = contain;
77 kwargs["title"]="Save changes?"
78 sgc.Dialog._config(self,**kwargs)
79 if "doctitle" in kwargs:
80 self.lbl.text = "The document \"" + kwargs["doctitle"] + "\" has not been saved.\nWould you like to save the changes before quitting?"
81 def send_quit(self):
82 ev = pygame.event.Event(GUI, {"gui_type": "quit",
83 "widget_type": self.__class__,
84 "widget":self})
85 pygame.event.post(ev)
86
87 def send_save(self):
88 ev = pygame.event.Event(GUI, {"gui_type": "save",
89 "widget_type": self.__class__,
90 "widget":self})
91 pygame.event.post(ev)
92 def send_cancel(self):
93 ev = pygame.event.Event(GUI, {"gui_type": "cancel",
94 "widget_type": self.__class__,
95 "widget":self})
96 pygame.event.post(ev)
97
98
099
=== added file 'sgc/widgets/lists.py'
--- sgc/widgets/lists.py 1970-01-01 00:00:00 +0000
+++ sgc/widgets/lists.py 2012-07-21 12:53:18 +0000
@@ -0,0 +1,383 @@
1#!/usr/bin/env python
2
3# Copyright (C) 2012 Michael Rochester
4
5import sgc
6from sgc.locals import *
7
8import pygame.mouse
9from pygame.locals import *
10
11from _locals import *
12from base_widget import Simple
13
14class _List(Simple):
15
16 _can_focus = True
17 _settings_default = {"col": (118, 45, 215),
18 "font": Font["widget"],
19 "padding": 3,"offset": 0,"width":None,
20 "mult": False}
21
22
23 def _config(self,**kwargs):
24 self.anchor = False
25 if "multi_selection" in kwargs:
26 self._settings["mult"] = kwargs["multi_selection"]
27 if "padding" in kwargs:
28 self._settings["padding"] = kwargs["padding"]
29 if "init" in kwargs:
30 self.color = (118, 45, 215)
31 self.contain = sgc.Container(border=self._settings["padding"])
32 self.lbls=[]
33 self.selected=[]
34 if "col" in kwargs:
35 self.color = kwargs["col"]
36 if "font" in kwargs:
37 self._settings["font"] = kwargs["font"]
38 if "width" in kwargs:
39 self._settings["width"] = kwargs["width"]
40 if "content" in kwargs:
41 self.content = kwargs["content"]
42 self.texth = self._settings["font"].get_ascent()+\
43 self._settings["font"].get_descent()+\
44 (self._settings["padding"]*2)
45 p=0
46 for string in kwargs["content"]:
47 lbl = sgc.Label(pos=(0,p),col=(10,10,10),text=string,
48 font=self._settings["font"])
49 p+=self.texth
50 self.lbls.append(lbl)
51 self.contain.config(widgets=self.lbls)
52 if not hasattr(self, "image"):
53 self._create_base_images((self.contain.image.get_width() if
54 self._settings["width"] == None else self._settings["width"]
55 ,self.contain.image.get_height()))
56
57 def _event(self, event):
58 if event.type == MOUSEBUTTONDOWN and event.button == 1:
59 sel = self.colide_item(event.pos)
60 if sel > 0 and sel < len(self.content)+1:
61 if (pygame.key.get_mods() & KMOD_CTRL and self._settings["mult"]):
62
63 if sel in self.selected:
64 self.selected.remove(sel)
65 else:
66 self.selected.append(sel)
67 elif (pygame.key.get_mods() & KMOD_SHIFT
68 and self._settings["mult"] and self.anchor):
69 self.selected=[]
70 for new in range(abs(self.anchor-sel)+1):
71 self.selected.append(new+(min(self.anchor,sel)))
72 else:
73 self.anchor = sel
74 self.selected = [sel]
75
76 def update(self, time):
77 draw = self.get_draw()
78
79 self.contain.update(time)
80 self.image.fill((255,255,255))
81
82 for sel in self.selected:
83 w = (self.image.get_width())
84 selection = Simple((w, self.texth))
85 selection.pos = (0,(sel-1)*self.texth+self._settings["padding"])
86 selection.image.fill(self.color)
87 selection.image.set_alpha(100)
88 self.image.blit(selection.image, selection.pos)
89 self.image.blit(self.contain.image,(0,0))
90 self.image.blit(self._images["image"],(0,0))
91
92 def colide_item(self,pos):
93 pos = pos[1]-self.rect_abs.y
94 return ((pos-self._settings["padding"])/self.texth)+1
95
96 def _focus_enter(self, focus):
97 self.color = self._settings["col"]
98
99 def _focus_exit(self):
100 self.color = (179,179,179)
101
102 @property
103 def selected_text(self):
104 return [self.content[x-1] for x in self.selected]
105
106 @property
107 def selected_pos(self):
108 return [x-1 for x in self.selected]
109
110class ListBox(Simple):
111
112 _can_focus = True
113 _default_size = (100,100)
114 _settings_default = {"headfont": Font["widget"],
115 "offset": 0}
116
117 def _config(self,**kwargs):
118 if "header" in kwargs:
119 self._settings["header"] = kwargs["header"]
120 self._settings["offset"] = self._settings["headfont"].get_ascent()+\
121 self._settings["headfont"].get_descent()+6
122 if "init" in kwargs:
123 self.list = _List(width=self.image.get_width())
124 self.scroll = sgc.ScrollBox((self.rect.w,self.rect.h-self._settings["offset"]),pos=(0,self._settings["offset"]),widget=self.list)
125 self.scroll._parent = self
126 self.list.config(**kwargs)
127 self.scroll.config(widget=self.list,**kwargs)
128
129 def _draw(self,draw):
130 if "header" in self._settings:
131 lbl = sgc.Label(pos=(0,0),col=(10,10,10),
132 text=self._settings["header"],
133 font=self._settings["headfont"])
134 self._images["image"].blit(lbl.image,(3,1))
135 draw.line(self._images["image"],(150,150,150),
136 (1,self._settings["offset"]),
137 (self.image.get_width()-2,self._settings["offset"]))
138
139 draw.line(self._images["image"],(150,150,150),
140 (1,0),(self.image.get_width()-2,0))
141 draw.line(self._images["image"],(150,150,150),
142 (1,self.image.get_height()-1),
143 (self.image.get_width()-2,self.image.get_height()-1))
144 draw.line(self._images["image"],(150,150,150),
145 (0,1),(0,self.image.get_height()-2))
146 draw.line(self._images["image"],(150,150,150),
147 (self.image.get_width()-1,1),
148 (self.image.get_width()-1,self.image.get_height()-2))
149
150 def _event(self, event):
151 self.scroll._event(event)
152
153 def update(self, time):
154 self.scroll.update(time)
155 self.image.fill((255,255,255))
156 self.image.blit(self.scroll.image,(0,self._settings["offset"]))
157 self.image.blit(self._images["image"],(0,0))
158
159 def _focus_enter(self, focus):
160 self.scroll._focus_enter(focus)
161
162 def _focus_exit(self):
163 self.scroll._focus_exit()
164
165 @property
166 def selected_text(self):
167 return [x for x in self.list.selected_text]
168
169 @property
170 def selected_pos(self):
171 return [x for x in self.list.selected]
172
173
174class _MultiList(_List):
175
176 _can_focus = True
177 _settings_default = {"col": (118, 45, 215),
178 "font": Font["widget"],
179 "padding": 3,"offset": 0,
180 "mult": False,"colwid":False}
181
182
183 def _config(self,**kwargs):
184 self.anchor = False
185 if "multi_selection" in kwargs:
186 self._settings["mult"] = kwargs["multi_selection"]
187 if "padding" in kwargs:
188 self._settings["padding"] = kwargs["padding"]
189 if "init" in kwargs:
190 self.color = (118, 45, 215)
191 self.lbls=[]
192 self.selected=[]
193 if "col" in kwargs:
194 self.color = kwargs["col"]
195 if "font" in kwargs:
196 self._settings["font"] = kwargs["font"]
197 if "columnwidth" in kwargs:
198 self._settings["colwid"] = kwargs["columnwidth"]
199 if "content" in kwargs:
200
201 self.columns = []
202 self.content = kwargs["content"]
203 self.texth = self._settings["font"].get_ascent()+\
204 self._settings["font"].get_descent()+\
205 (self._settings["padding"]*2)
206 w = []
207 for x in range(len(kwargs["content"][0])):
208 labels = []
209 p=0
210 for y in range(len(kwargs["content"])):
211 lbl = sgc.Label(pos=(0,p),col=(10,10,10),text=kwargs["content"][y][x],
212 font=self._settings["font"])
213 p+=self.texth
214 labels.append(lbl)
215 w.append(lbl)
216 self.lbls.append(labels)
217 if self._settings["colwid"]:
218 column = sgc.Container((self._settings["colwid"][x],len(kwargs["content"])*self.texth),widgets=labels)
219 else:
220 column = sgc.Container(widgets=labels)
221 self.columns.append(column)
222
223 self.contain = sgc.HBox(border=self._settings["padding"],widgets=self.columns)
224 self.rect.w = self.contain.rect.w
225 self.rect.h = self.contain.rect.h
226 if not hasattr(self, "image"):
227 self._create_base_images((self.contain.image.get_width()
228 ,self.contain.image.get_height()))
229
230 @property
231 def selected_text(self):
232 return [self.content[x-1] for x in self.selected]
233
234 @property
235 def selected_pos(self):
236 return [x-1 for x in self.selected]
237
238class MultiListBox(ListBox):
239
240 _can_focus = True
241 _default_size = (100,100)
242 _settings_default = {"headfont": Font["widget"],
243 "offset": 0,"colwid": 100,"header":None}
244
245
246 def _config(self,**kwargs):
247 if "content" in kwargs:
248 self.content = kwargs["content"]
249 if "columnwidth" in kwargs:
250 self.colpos=[0]
251 self._settings["colwid"] = [c for c in kwargs["columnwidth"]]
252 for x in range(len(kwargs["columnwidth"])):
253 self.colpos.append((self.colpos[x]+self._settings["colwid"][x]))
254 if "header" in kwargs:
255 self._settings["header"] = kwargs["header"]
256 self._settings["offset"] = self._settings["headfont"].get_ascent()+\
257 self._settings["headfont"].get_descent()+6
258
259
260 if "init" in kwargs:
261 strings = pygame.cursors.sizer_x_strings
262 cursor = pygame.cursors.compile(strings)
263 size = (len(strings[0]), len(strings))
264 hotspot = (size[0]/2, size[1]/2)
265 self._cursor = (size, hotspot) + cursor
266 self._cursor_set = False
267
268 self.move = False
269 self.mouse = False
270 self.resize = False
271 self.list = _MultiList()
272 self.scroll = sgc.ScrollBox((self.rect.w,self.rect.h-self._settings["offset"]),pos=(0,self._settings["offset"]),widget=self.list)
273 self.scroll._parent = self
274 if self._settings["colwid"] != 100:
275 kwargs["columnwidth"] = self._settings["colwid"]
276 if "content" not in kwargs:
277 kwargs["content"]=self.content
278 self.list.config(**kwargs)
279 if "init" in kwargs:
280 self.scroll.config(widget=self.list,**kwargs)
281
282 def _draw(self,draw):
283
284 if self._settings["header"]:
285 self.header = sgc.Simple((self.colpos[-1]+10,self._settings["offset"]))
286 for p, header in enumerate(self._settings["header"]):
287 lbl = sgc.Label((self._settings["colwid"][p],self._settings["offset"]),pos=(0,0),
288 text=header,
289 col=(10,10,10),
290
291 font=self._settings["headfont"])
292 draw.rect(self.header.image,(255,255,255),((self.colpos[p],0),(self.colpos[p]+self._settings["colwid"][p],self._settings["offset"])),0)
293 self.header.image.blit(lbl.image,(self.colpos[p]+6*p+3,1))
294 draw.line(self.header.image,(150,150,150),
295 (self.colpos[p]+6*(p),0),
296 (self.colpos[p]+6*(p),self._settings["offset"]))
297
298
299 draw.line(self._images["image"],(150,150,150),
300 (1,0),(self.image.get_width()-2,0))
301 draw.line(self._images["image"],(150,150,150),
302 (1,self.image.get_height()-1),
303 (self.image.get_width()-2,self.image.get_height()-1))
304 draw.line(self._images["image"],(150,150,150),
305 (0,1),(0,self.image.get_height()-2))
306 draw.line(self._images["image"],(150,150,150),
307 (self.image.get_width()-1,1),
308 (self.image.get_width()-1,self.image.get_height()-2))
309 self.image.fill((255,0,0))
310
311 def _event(self, event):
312 if (event.type == MOUSEBUTTONDOWN and event.button == 1
313 and (self.collidehead(event.pos)is not False)):
314 self.move = self.collidehead(event.pos)
315 self.mouse = event.pos[0]
316 elif event.type == MOUSEBUTTONUP:
317 if self.resize is not False and self.mouse is not False:
318 self.scroll = sgc.ScrollBox((self.rect.w,self.rect.h-self._settings["offset"]),pos=(0,self._settings["offset"]),widget=self.list)
319 self.scroll._parent = self
320 self.mouse = False
321 self.resize = False
322 elif event.type == MOUSEMOTION:
323 if self.collidehead(event.pos) is False and self._cursor_set==True:
324 self._remove_cursor()
325 self._cursor_set = False
326 elif self.collidehead(event.pos) is not False and self._cursor_set==False:
327 self._set_cursor(*self._cursor)
328 self._cursor_set = True
329 if self.resize is not False and self.mouse is not False:
330 dif = event.pos[0] - self.mouse
331 self.mouse = event.pos[0]
332 self._settings["colwid"][self.move]+=dif
333 if self._settings["colwid"][self.move] < 0:
334 self._settings["colwid"][self.move] = 0
335 self.config(columnwidth=self._settings["colwid"], content=self.content)
336 self.list._create_base_images((self.list.rect.w, self.list.rect.h))
337 elif self.mouse is not False:
338 if abs(event.pos[0] - self.mouse) > 4:
339 self.resize = True
340 self.scroll._event(event)
341
342 def collidehead(self,pos):
343 for p, x in enumerate(self.colpos[1:],1):
344 if (pos[0]-self.pos_abs[0]>=self.scroll._settings["widget"].pos[0]+x+6*p-2 and
345 pos[0]-self.pos_abs[0]<=self.scroll._settings["widget"].pos[0]+x+6*p+2 and
346 pos[1] < self.pos_abs[1]+self._settings["offset"] and
347 pos[1] > self.pos_abs[1]):
348 return p-1
349 return False
350
351 def update(self, time):
352 self.scroll.update(time)
353 self.image.fill((255,255,255))
354 self.image.blit(self.scroll.image,(0,self._settings["offset"]))
355 if self._settings["header"]:
356 self.image.blit(self.header.image,(self.scroll._settings["widget"].pos[0],0)) #MAYBE A HACK, PROBABLY
357 self.image.blit(self._images["image"],(0,0))
358
359 def _focus_enter(self, focus):
360 self.scroll._focus_enter(focus)
361
362 def _focus_exit(self):
363 self.scroll._focus_exit()
364
365 @property
366 def selected_text(self):
367 return [x for x in self.list.selected_text]
368
369 @property
370 def selected_pos(self):
371 return [x for x in self.list.selected]
372
373
374
375
376
377
378
379
380
381
382
383
0384
=== modified file 'sgc/widgets/menu.py'
--- sgc/widgets/menu.py 2012-07-18 11:56:10 +0000
+++ sgc/widgets/menu.py 2012-07-21 12:53:18 +0000
@@ -120,18 +120,24 @@
120 widgets.append(div)120 widgets.append(div)
121 # Widget121 # Widget
122 elif item[0].startswith("w:"):122 elif item[0].startswith("w:"):
123 args = item[1]123 args = self._get_args(item[1:])
124 name = args.pop("name", None)124 name = args.pop("name")
125 try:125 f = args.pop("func") if ("func" in args) else None
126 # Try to load existing widget126 if item[0].endswith("input_box"):
127 widget = eval(item[0][2:])127 widget = input_box.InputBox(**args)
128 except NameError:128 elif item[0].endswith("button"):
129 # Try to import custom widget129 if "surf" in args:
130 parts = item[0][2:].rpartition(".")130 args["surf"] = eval(args["surf"])
131 mod = __import__(parts[0])131 widget = button.Button(**args)
132 widget = getattr(mod, parts[2])132 elif item[0].endswith("radio"):
133 widget = widget(**args)133 if "surf" in args:
134 if name: self._dict[name] = widget134 args["surf"] = eval(args["surf"])
135 widget = radio_button.Radio(**args)
136 elif item[0].endswith("label"):
137 widget = label.Label(**args)
138 self._dict[name] = widget
139 if f: widget.on_click = self._funcs[f]
140 widget.name = name
135 widgets.append(widget)141 widgets.append(widget)
136 # Function142 # Function
137 elif item[0].startswith("f:"):143 elif item[0].startswith("f:"):
@@ -176,6 +182,7 @@
176 def update(self, time):182 def update(self, time):
177 menu = self._menus[self._curr_menu]183 menu = self._menus[self._curr_menu]
178 menu.update(time)184 menu.update(time)
185 self.image.fill(0) # Hack for OpenGL
179 if self._old_menu is not None:186 if self._old_menu is not None:
180 self.image.blit(self._menus[self._old_menu].image, (0,0))187 self.image.blit(self._menus[self._old_menu].image, (0,0))
181 menu.image.set_alpha(menu._fade)188 menu.image.set_alpha(menu._fade)
182189
=== modified file 'sgc/widgets/opengl.py'
--- sgc/widgets/opengl.py 2011-09-22 09:41:10 +0000
+++ sgc/widgets/opengl.py 2012-07-21 12:53:18 +0000
@@ -1,9 +1,9 @@
1#!/usr/bin/env python1#!/usr/bin/env python
22
3# Copyright (C) 2011 Sam Bull3# Copyright (C) 2011-2012 Sam Bull
44
5"""5"""
6Base widget, all widgets inherit from this.6OpenGL functions.
77
8"""8"""
99
@@ -11,10 +11,11 @@
11from OpenGL.GL import *11from OpenGL.GL import *
12import FTGL12import FTGL
1313
14from ..surface import SurfaceBase14from _locals import *
1515from matrix import Matrix
1616
17class OpenGLImage(SurfaceBase):17
18class OpenGLImage():
18 """19 """
19 Class used to emulate the interface of Surface for OpenGL drawing.20 Class used to emulate the interface of Surface for OpenGL drawing.
2021
@@ -28,39 +29,49 @@
28 self._lock = False29 self._lock = False
29 self.display_list = []30 self.display_list = []
30 self._children = []31 self._children = []
31 if parent:32 self.matrix = Matrix()
32 self._parent = parent # Parent surface used for _abs33 self._parent = parent # Parent surface used for _abs
33 else:
34 self._parent = self._default_screen
3534
36 self._rect = Rect((0,0), (0,0))35 self.rect = Rect((0,0), (0,0))
37 if isinstance(surf, (tuple,list)):36 if isinstance(surf, (tuple,list)):
38 self._rect.size = surf37 self.rect.size = surf
39 elif isinstance(surf, OpenGLFont):38 elif isinstance(surf, OpenGLFont):
40 self._rect.size = (surf.size)39 self.rect.size = (surf.size)
41 self.display_list.extend(surf.display_list)40 self.display_list.extend(surf.display_list)
42 elif isinstance(surf, OpenGLImage):41 elif isinstance(surf, OpenGLImage):
43 self._rect = surf._rect42 self.matrix = surf.matrix.copy()
43 self.rect = Rect(surf.rect)
44 self._a = surf._a44 self._a = surf._a
45 self.display_list = surf.display_list45 self.display_list = surf.display_list[:]
46 self._children = surf._children46 for child in surf._children:
47 self.blit(child.copy())
4748
48 def blit(self, surf, pos=None):49 def blit(self, surf, pos=None, area=None):
49 assert isinstance(surf, OpenGLImage)50 assert isinstance(surf, OpenGLImage)
50 if surf not in self._children:51 if surf not in self._children:
51 if pos is not None: surf.pos = pos52 if pos is not None: surf.pos = pos
53 surf.rect.topleft = surf.pos
52 surf._parent = self54 surf._parent = self
53 self._children.append(surf)55 self._children.append(surf)
5456
55 def draw(self):57 def draw(self):
56 glLoadIdentity()58 glLoadIdentity()
57 if self.rect.w <= self._parent.rect.w and \59 if self._parent:
58 self.rect.h <= self._parent.rect.h:60 r = self._parent.rect
61 else:
62 r = Rect(0,0,10000,10000)
63 if self.rect.w <= r.w and self.rect.h <= r.h:
59 # Mask the area, so nothing is drawn outside surface area.64 # Mask the area, so nothing is drawn outside surface area.
60 bottom = self._default_screen.h - self.rect_abs.bottom65 bottom = 480 - self.rect_abs.bottom # Screen height...
61 glScissor(self.rect_abs.x, bottom,66 glScissor(self.rect_abs.x, bottom,
62 self.rect.w+1, self.rect.h+1)67 self.rect.w+1, self.rect.h+1)
63 glTranslatef(self.pos_abs[0], self.pos_abs[1], 0)68 glTranslatef(self.pos_abs[0], self.pos_abs[1], 0)
69 if not isinstance(self.matrix, (list, tuple)):
70 glMultMatrixf(self.matrix.to_opengl())
71 else:
72 for m in self.matrix:
73 glMultMatrixf(m.to_opengl())
74
64 for dl,col in self.display_list:75 for dl,col in self.display_list:
65 if col is not None: glColor(col[0], col[1], col[2], self.a)76 if col is not None: glColor(col[0], col[1], col[2], self.a)
66 glCallList(dl)77 glCallList(dl)
@@ -73,7 +84,7 @@
73 # Clear the surface84 # Clear the surface
74 self.display_list = []85 self.display_list = []
75 self._children = []86 self._children = []
76 rect = Rect((0,0), self.size)87 rect = Rect((0,0), self.rect.size)
77 if col != 0:88 if col != 0:
78 col = [c/255. for c in col]89 col = [c/255. for c in col]
79 dl = glGenLists(1)90 dl = glGenLists(1)
@@ -86,7 +97,13 @@
86 return OpenGLImage(self)97 return OpenGLImage(self)
8798
88 def get_size(self):99 def get_size(self):
89 return self.size100 return self.rect.size
101
102 def get_height(self):
103 return self.rect.h
104
105 def get_width(self):
106 return self.rect.w
90107
91 def set_alpha(self, alpha):108 def set_alpha(self, alpha):
92 self._a = alpha/255.109 self._a = alpha/255.
@@ -127,7 +144,7 @@
127 self._lock = False144 self._lock = False
128145
129 def replace(self, surf, **kwargs):146 def replace(self, surf, **kwargs):
130 self._rect.size = surf.size147 self.rect.size = surf.size
131 self.display_list = surf.display_list[:]148 self.display_list = surf.display_list[:]
132 self._children = surf._children[:]149 self._children = surf._children[:]
133150
@@ -136,7 +153,33 @@
136 if self._a is not None:153 if self._a is not None:
137 return self._a154 return self._a
138 else:155 else:
139 return self._parent.a156 if self._parent:
157 return self._parent.a
158 else:
159 return 1
160
161 @property
162 def rect_abs(self):
163 if self._parent is None:
164 return self.rect
165 else:
166 p_abs = self._parent.pos_abs
167 p = (self.rect.x + p_abs[0], self.rect.y + p_abs[1])
168 return Rect(p, self.rect.size)
169
170 @property
171 def pos(self):
172 return self.rect.topleft
173 @pos.setter
174 def pos(self, value):
175 self.rect.topleft = value
176 @property
177 def pos_abs(self):
178 if self._parent is None:
179 return self.rect.topleft
180 else:
181 p_abs = self._parent.pos_abs
182 return (self.rect.x + p_abs[0], self.rect.y + p_abs[1])
140183
141 # --- Dummy methods. Ignore. ---184 # --- Dummy methods. Ignore. ---
142185
@@ -152,17 +195,27 @@
152 to an OpenGLImage object in the same manner as pygame.Font.195 to an OpenGLImage object in the same manner as pygame.Font.
153196
154 """197 """
155 def __init__(self, font, size):198 def __init__(self, font, size=16):
199 self.rect = Rect(0,0,0,0)
156 self._children = []200 self._children = []
157 self.font = FTGL.TextureFont(font)201 self.matrix = Matrix()
158 self.font.FaceSize(16)202 self.display_list = []
159 self.y_offset = self.font.line_height * .75203 if isinstance(font, OpenGLFont):
204 self.font = font.font
205 self.y_offset = font.y_offset
206 self.size = font.size
207 else:
208 self.font = FTGL.TextureFont(font) # BufferFont
209 self.font.FaceSize(size)
210 self.y_offset = self.font.line_height * .75
160211
161 def render(self, text, antialias, color, background=None):212 def render(self, text, antialias, color, background=None):
213 temp = OpenGLImage((self.font.Advance(text.encode()), self.font.line_height))
162 text = text.encode()214 text = text.encode()
163 col = [c/255. for c in color]215 col = [c/255. for c in color]
164 dl = glGenLists(1)216 dl = glGenLists(1)
165 self.size = (self.font.Advance(text), self.font.line_height)217 self.size = (self.font.Advance(text), self.font.line_height)
218 self.rect = Rect((0,0), self.size)
166 glNewList(dl, GL_COMPILE)219 glNewList(dl, GL_COMPILE)
167 glPushMatrix()220 glPushMatrix()
168 # Flip text right way up221 # Flip text right way up
@@ -173,16 +226,33 @@
173 self.font.Render(text)226 self.font.Render(text)
174 glPopMatrix()227 glPopMatrix()
175 glEndList()228 glEndList()
176 self.display_list = [(dl, col)]229 temp.display_list = [(dl, col)]
177 return self230 return temp
231
232 def get_linesize(self):
233 """TODO"""
234 return self.rect.h
235
236 def get_ascent(self):
237 """TODO"""
238 return self.rect.h-4
239
240 def get_descent(self):
241 """TODO"""
242 return -4
243
244 def metrics(self, text):
245 """TODO"""
246 return [(0,0,0,0,10) for c in text]
178247
179class Draw():248class Draw():
180 """249 """
181 Class to emulate the pygame.draw module.250 Class to emulate the pygame.draw module.
182 Functions should work in the same manner.251 Functions should work in the same manner, except where otherwise stated.
183252
184 """253 """
185 def rect(self, surf, col, rect, width=0):254 def rect(self, surf, col, rect, width=0):
255 rect = Rect(rect)
186 col = [c/255. for c in col]256 col = [c/255. for c in col]
187 dl = glGenLists(1)257 dl = glGenLists(1)
188 glNewList(dl, GL_COMPILE)258 glNewList(dl, GL_COMPILE)
@@ -220,6 +290,8 @@
220 for v in pointlist:290 for v in pointlist:
221 glVertex(v)291 glVertex(v)
222 glEnd()292 glEnd()
293 else:
294 raise NotImplementedError
223 glEndList()295 glEndList()
224 surf.display_list.append((dl, col))296 surf.display_list.append((dl, col))
225297
@@ -235,10 +307,18 @@
235 glVertex(pos)307 glVertex(pos)
236 glEnd()308 glEnd()
237 glDisable(GL_POINT_SMOOTH)309 glDisable(GL_POINT_SMOOTH)
238 glPointSize()310 #glPointSize()
311 else:
312 raise NotImplementedError
239 glEndList()313 glEndList()
240 surf.display_list.append((dl, col))314 surf.display_list.append((dl, col))
241315
316 def ellipse(self, surf, col, rect, width=0):
317 raise NotImplementedError
318
319 def arc(self, surf, col, rect, start_angle, stop_angle, width=1):
320 raise NotImplementedError
321
242 def line(self, surf, col, start_pos, end_pos, width=1):322 def line(self, surf, col, start_pos, end_pos, width=1):
243 col = [c/255. for c in col]323 col = [c/255. for c in col]
244 dl = glGenLists(1)324 dl = glGenLists(1)
@@ -251,5 +331,14 @@
251 glEndList()331 glEndList()
252 surf.display_list.append((dl, col))332 surf.display_list.append((dl, col))
253333
334 def lines(self, surf, col, closed, pointlist, width=1):
335 raise NotImplementedError
336
337 def aaline(self, surf, col, startpos, endpos, blend=1):
338 raise NotImplementedError
339
340 def aalines(self, surf, col, closed, pointlist, blend=1):
341 raise NotImplementedError
342
254# Export Draw functions343# Export Draw functions
255draw = Draw()344draw = Draw()
256345
=== modified file 'sgc/widgets/radio_button.py'
--- sgc/widgets/radio_button.py 2012-06-19 20:41:57 +0000
+++ sgc/widgets/radio_button.py 2012-07-21 12:53:18 +0000
@@ -73,8 +73,8 @@
73 draw.circle(self._images["image"], (255,255,255), pos, r)73 draw.circle(self._images["image"], (255,255,255), pos, r)
74 draw.circle(self._images["over"], self._settings["col"], pos, r)74 draw.circle(self._images["over"], self._settings["col"], pos, r)
75 # Border circles75 # Border circles
76 draw.circle(self._images["image"], (0,0,1), pos, r, 1)76 draw.circle(self._images["image"], (0,0,1), pos, r)
77 draw.circle(self._images["over"], (0,0,1), pos, r, 1)77 draw.circle(self._images["over"], (0,0,1), pos, r)
7878
79 def _draw_active(self, draw, image):79 def _draw_active(self, draw, image):
80 # Central dot for 'active' state80 # Central dot for 'active' state

Subscribers

People subscribed via source and target branches