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)