Mercurial > pyntnclick
comparison tools/rect_drawer.py @ 200:7bedca2376f5
Image placement
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Thu, 26 Aug 2010 09:48:49 +0200 |
parents | 4821c290286d |
children | 20998c650ce1 |
comparison
equal
deleted
inserted
replaced
199:4821c290286d | 200:7bedca2376f5 |
---|---|
8 sys.path.append(script_path) | 8 sys.path.append(script_path) |
9 | 9 |
10 from albow.root import RootWidget | 10 from albow.root import RootWidget |
11 from albow.utils import frame_rect | 11 from albow.utils import frame_rect |
12 from albow.widget import Widget | 12 from albow.widget import Widget |
13 from albow.controls import Button | 13 from albow.controls import Button, Image |
14 from albow.palette_view import PaletteView | 14 from albow.palette_view import PaletteView |
15 from albow.file_dialogs import request_old_filename | 15 from albow.file_dialogs import request_old_filename |
16 from pygame.locals import SWSURFACE | 16 from pygame.locals import SWSURFACE |
17 import pygame | 17 import pygame |
18 from pygame.colordict import THECOLORS | 18 from pygame.colordict import THECOLORS |
55 | 55 |
56 def item_is_selected(self, item_no): | 56 def item_is_selected(self, item_no): |
57 return self.selection == item_no | 57 return self.selection == item_no |
58 | 58 |
59 | 59 |
60 | |
61 class AppImage(Widget): | 60 class AppImage(Widget): |
62 | 61 |
63 rect_thick = 3 | 62 rect_thick = 3 |
64 draw_thick = 1 | 63 draw_thick = 1 |
65 | 64 |
66 def __init__(self, state): | 65 def __init__(self, state): |
67 self.state = state | 66 self.state = state |
68 super(AppImage, self).__init__(pygame.rect.Rect(0, 0, 800, 600)) | 67 super(AppImage, self).__init__(pygame.rect.Rect(0, 0, 800, 600)) |
69 self.mode = 'draw' | 68 self.mode = 'draw' |
70 self.rects = [] | 69 self.rects = [] |
70 self.images = [] | |
71 self.start_pos = None | 71 self.start_pos = None |
72 self.end_pos = None | 72 self.end_pos = None |
73 self.draw_color = pygame.color.Color('white') | 73 self.draw_color = pygame.color.Color('white') |
74 self.rect_color = pygame.color.Color('white') | 74 self.rect_color = pygame.color.Color('white') |
75 self.curent_image = None | 75 self.current_image = None |
76 self.place_image_menu = None | 76 self.place_image_menu = None |
77 | 77 |
78 def draw_mode(self): | 78 def draw_mode(self): |
79 self.mode = 'draw' | 79 self.mode = 'draw' |
80 | 80 |
90 self.end_pos[0] - self.start_pos[0], | 90 self.end_pos[0] - self.start_pos[0], |
91 self.end_pos[1] - self.start_pos[1]) | 91 self.end_pos[1] - self.start_pos[1]) |
92 frame_rect(surface, self.draw_color, rect, self.draw_thick) | 92 frame_rect(surface, self.draw_color, rect, self.draw_thick) |
93 for (col, rect) in self.rects: | 93 for (col, rect) in self.rects: |
94 frame_rect(surface, col, rect, self.rect_thick) | 94 frame_rect(surface, col, rect, self.rect_thick) |
95 for image in self.images: | |
96 if image.rect.colliderect(surface.get_rect()): | |
97 cropped_rect = image.rect.clip(surface.get_rect()) | |
98 sub = surface.subsurface(cropped_rect) | |
99 image.draw(sub) | |
100 else: | |
101 print 'image outside surface', image | |
102 if self.current_image and self.mode == 'image': | |
103 if self.current_image.rect.colliderect(surface.get_rect()): | |
104 cropped_rect = self.current_image.rect.clip(surface.get_rect()) | |
105 sub = surface.subsurface(cropped_rect) | |
106 self.current_image.draw(sub) | |
95 | 107 |
96 def _make_dict(self): | 108 def _make_dict(self): |
97 d = {} | 109 d = {} |
98 for col, rect in self.rects: | 110 for col, rect in self.rects: |
99 d.setdefault(col, []) | 111 d.setdefault(col, []) |
105 for (num, col) in enumerate(d): | 117 for (num, col) in enumerate(d): |
106 print 'Rect %d : ' % num | 118 print 'Rect %d : ' % num |
107 for r in d[col]: | 119 for r in d[col]: |
108 print ' (%d, %d, %d, %d),' % (r.x, r.y, r.w, r.h) | 120 print ' (%d, %d, %d, %d),' % (r.x, r.y, r.w, r.h) |
109 print | 121 print |
122 for i, image in enumerate(self.images): | |
123 print 'Image %d' % i | |
124 r = image.rect | |
125 print ' (%d, %d, %d, %d),' % (r.x, r.y, r.w, r.h) | |
126 print | |
110 | 127 |
111 def image_load(self): | 128 def image_load(self): |
112 image_path= '%s/Resources/images/%s' % (script_path, self.state.current_scene.FOLDER) | 129 image_path= '%s/Resources/images/%s' % (script_path, self.state.current_scene.FOLDER) |
113 imagename = request_old_filename(directory=image_path) | 130 imagename = request_old_filename(directory=image_path) |
114 try: | 131 try: |
115 self.current_image = pygame.image.load(imagename) | 132 image_data = pygame.image.load(imagename) |
133 self.current_image = Image(image_data) | |
116 self.place_image_menu.enabled = True | 134 self.place_image_menu.enabled = True |
135 # ensure we're off screen to start | |
136 self.current_image.rect = image_data.get_rect().move(1000, 600) | |
117 except pygame.error, e: | 137 except pygame.error, e: |
118 print 'Unable to load image %s' % e | 138 print 'Unable to load image %s' % e |
119 | 139 |
120 def image_mode(self): | 140 def image_mode(self): |
121 self.mode = 'image' | 141 self.mode = 'image' |
122 self.start_pos = None | 142 self.start_pos = None |
123 self.end_pos = None | 143 self.end_pos = None |
124 | 144 |
145 def mouse_move(self, e): | |
146 if self.mode == 'image' and self.current_image: | |
147 self.current_image.rect.topleft = e.pos | |
148 self.invalidate() | |
149 | |
125 def mouse_down(self, e): | 150 def mouse_down(self, e): |
126 if self.mode == 'del': | 151 if self.mode == 'del': |
127 pos = e.pos | 152 pos = e.pos |
128 cand = None | 153 cand = None |
154 # Images are drawn above rectangles, so search those first | |
155 for image in self.images: | |
156 if image.rect.collidepoint(pos): | |
157 cand = image | |
158 break | |
159 if cand: | |
160 self.images.remove(cand) | |
161 self.invalidate() | |
162 return | |
129 for (col, rect) in self.rects: | 163 for (col, rect) in self.rects: |
130 if rect.collidepoint(pos): | 164 if rect.collidepoint(pos): |
131 cand = (col, rect) | 165 cand = (col, rect) |
132 break | 166 break |
133 if cand: | 167 if cand: |
134 self.rects.remove(cand) | 168 self.rects.remove(cand) |
135 self.invalidate() | 169 self.invalidate() |
136 elif self.mode == 'draw': | 170 elif self.mode == 'draw': |
137 self.start_pos = e.pos | 171 self.start_pos = e.pos |
138 self.end_pos = e.pos | 172 self.end_pos = e.pos |
173 elif self.mode == 'image': | |
174 if self.current_image: | |
175 self.images.append(self.current_image) | |
176 self.current_image = None | |
177 self.invalidate() | |
178 else: | |
179 cand = None | |
180 for image in self.images: | |
181 if image.rect.collidepoint(e.pos): | |
182 cand = image | |
183 break | |
184 if cand: | |
185 self.images.remove(cand) | |
186 self.current_image = cand | |
187 self.invalidate() | |
139 | 188 |
140 def mouse_up(self, e): | 189 def mouse_up(self, e): |
141 if self.mode == 'draw': | 190 if self.mode == 'draw': |
142 rect = pygame.rect.Rect(self.start_pos[0], self.start_pos[1], | 191 rect = pygame.rect.Rect(self.start_pos[0], self.start_pos[1], |
143 self.end_pos[0] - self.start_pos[0], | 192 self.end_pos[0] - self.start_pos[0], |
179 app.add(image) | 228 app.add(image) |
180 draw = make_button('Draw Rect', image.draw_mode, 0) | 229 draw = make_button('Draw Rect', image.draw_mode, 0) |
181 app.add(draw) | 230 app.add(draw) |
182 load_image = make_button("Load image", image.image_load, 40) | 231 load_image = make_button("Load image", image.image_load, 40) |
183 app.add(load_image) | 232 app.add(load_image) |
184 add_image = make_button("Place image", image.image_mode, 80) | 233 add_image = make_button("Place/Move images", image.image_mode, 80) |
185 add_image.enabled = False | 234 add_image.enabled = False |
186 app.add(add_image) | 235 app.add(add_image) |
187 image.place_image_menu = add_image | 236 image.place_image_menu = add_image |
188 delete = make_button('Delete Objects', image.del_mode, 120) | 237 delete = make_button('Delete Objects', image.del_mode, 120) |
189 app.add(delete) | 238 app.add(delete) |