diff options
author | Sai Vineet <saivineet89@gmail.com> | 2013-12-12 18:22:33 (GMT) |
---|---|---|
committer | Sai Vineet <saivineet89@gmail.com> | 2013-12-12 19:58:20 (GMT) |
commit | ff78ca3953a25b31db0c633c1a96bbe6c7131e7f (patch) | |
tree | e3495ed376d8df8916e1b3811e8e974fa1a9ba86 | |
parent | ac756b85b64222ee5b9fd0fe5cfad0d4d16f5542 (diff) |
Add Erase Trace Points button
Also refactored the tracing code.
-rw-r--r-- | activity.py | 26 | ||||
-rw-r--r-- | icons/clear-trace.svg | 18 | ||||
-rw-r--r-- | physics.py | 71 | ||||
-rw-r--r-- | tools.py | 21 |
4 files changed, 101 insertions, 35 deletions
diff --git a/activity.py b/activity.py index 79e32bd..2d34eee 100644 --- a/activity.py +++ b/activity.py @@ -130,6 +130,15 @@ class PhysicsActivity(activity.Activity): toolbar_box.toolbar.insert(separator, -1) separator.show() + clear_trace = ToolButton("clear-trace") + clear_trace.set_tooltip(_("Clear Trace Marks")) + clear_trace.set_accelerator(_("<ctrl>x")) + clear_trace.connect("clicked", self.clear_trace_cb) + clear_trace.set_sensitive(False) + toolbar_box.toolbar.insert(clear_trace, -1) + clear_trace.show() + self.clear_trace = clear_trace + self._insert_clear_all_button(toolbar_box.toolbar) separator = gtk.SeparatorToolItem() @@ -184,6 +193,7 @@ class PhysicsActivity(activity.Activity): self.clear_all.set_accelerator(_('<ctrl>a')) self.clear_all.connect('clicked', self.clear_all_cb) toolbar.insert(self.clear_all, -1) + self.clear_all.set_sensitive(False) self.clear_all.show() def _insert_create_tools(self, create_toolbar): @@ -212,12 +222,26 @@ class PhysicsActivity(activity.Activity): separator.show() button.set_tooltip(c.toolTip) - # button.set_accelerator(c.toolAccelerator) + button.set_accelerator(c.toolAccelerator) button.connect('clicked', self.radioClicked) _insert_item(create_toolbar, button, -1) button.show() self.radioList[button] = c.name + def clear_trace_alert_cb(self, alert, response): + self.remove_alert(alert) + if response is gtk.RESPONSE_OK: + self.game.full_pos_list = [[] for _ in self.game.full_pos_list] + self.game.tracked_bodies = 0 + + def clear_trace_cb(self, button): + clear_trace_alert = ConfirmationAlert() + clear_trace_alert.props.title = _('Are You Sure?') + clear_trace_alert.props.msg = \ + _('All trace points will be erased. This cannot be undone!') + clear_trace_alert.connect('response', self.clear_trace_alert_cb) + self.add_alert(clear_trace_alert) + def stop_play_cb(self, button): pygame.event.post(pygame.event.Event(pygame.USEREVENT, action="stop_start_toggle")) diff --git a/icons/clear-trace.svg b/icons/clear-trace.svg new file mode 100644 index 0000000..41fc143 --- /dev/null +++ b/icons/clear-trace.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="55px"
+ height="55px" viewBox="0 0 55 55" enable-background="new 0 0 55 55" xml:space="preserve">
+
+<g id="Eraser" >
+ <g display="inline">
+ <path fill="#FFFFFF" d="M15.621,33.853c-1.1,0-1.424-0.691-0.721-1.536l14.249-17.109c0.704-0.845,2.18-1.537,3.28-1.537h7.805
+ c1.1,0,1.424,0.691,0.721,1.537L26.706,32.316c-0.704,0.845-2.18,1.536-3.28,1.536H15.621z"/>
+ <path fill="#FFFFFF" d="M24.709,41.155c-0.166,1.088-1.2,1.978-2.301,1.978h-8.525c-1.1,0-1.865-0.89-1.7-1.978l0.549-3.62
+ c0.165-1.088,1.2-1.978,2.3-1.978h8.525c1.101,0,1.865,0.89,1.701,1.978L24.709,41.155z"/>
+ <path fill="#FFFFFF" d="M40.446,23.333c-0.189,1.083-0.921,2.662-1.625,3.507L27.471,40.467c-0.705,0.846-1.125,0.65-0.936-0.434
+ l0.646-3.688c0.19-1.083,0.921-2.661,1.626-3.506l11.35-13.627c0.705-0.845,1.125-0.65,0.936,0.434L40.446,23.333z"/>
+ </g>
+</g>
+
+</svg>
@@ -50,6 +50,7 @@ from helpers import * class PhysicsGame: def __init__(self, activity): + self.activity = activity # Get everything set up self.clock = pygame.time.Clock() self.canvas = activity.canvas @@ -69,8 +70,9 @@ class PhysicsGame: self.pygame_started = False self.full_pos_list = [] - self.tracked_bodies = [] - self.body_colors = [] + self.tracked_bodies = 0 + + self.trackinfo = {} def switch_off_fake_pygame_cursor_cb(self, panel, event): self.show_fake_cursor = False @@ -135,31 +137,50 @@ class PhysicsGame: if self.in_focus: # Drive motors if self.world.run_physics: + bodies_present = len(self.world.world.GetBodyList()) + clear_all_active = self.activity.clear_all.get_sensitive() + if (bodies_present > 1) and clear_all_active is False: + self.activity.clear_all.set_sensitive(True) + elif (bodies_present > 1) is False and \ + clear_all_active is True: + self.activity.clear_all.set_sensitive(False) + + poslist = self.full_pos_list + clear_trace_active = self.activity.clear_trace.get_sensitive() + if poslist: + if not poslist[0]: + if clear_trace_active: + self.activity.clear_trace.set_sensitive(False) + else: + if clear_trace_active is False: + self.activity.clear_trace.set_sensitive(True) + + + for key, info in self.trackinfo.iteritems(): + body = info[1] # Format - [host_body, tracker, color] + trackdex = body.userData['track_index'] + def to_screen(pos): + px = self.world.meter_to_screen( + pos[0]) + py = self.world.meter_to_screen( + pos[1]) + py = self.world.renderer.get_surface() \ + .get_height() - py + return (px, py) + + x = body.position.x + y = body.position.y + tupled_pos = to_screen((x, y)) + posx = tupled_pos[0] + posy = tupled_pos[1] + try: + self.full_pos_list[trackdex].append(posx) + self.full_pos_list[trackdex].append(posy) + except IndexError: + self.full_pos_list.append([posx, posy]) + for body in self.world.world.GetBodyList(): if type(body.userData) == type({}): - if body.userData.has_key('track_index'): - trackdex = body.userData['track_index'] - - def to_screen(pos): - px = self.world.meter_to_screen( - pos[0]) - py = self.world.meter_to_screen( - pos[1]) - py = self.world.renderer.get_surface() \ - .get_height() - py - return (px, py) - - x = body.position.x - y = body.position.y - tupled_pos = to_screen((x, y)) - posx = tupled_pos[0] - posy = tupled_pos[1] - try: - self.full_pos_list[trackdex].append(posx) - self.full_pos_list[trackdex].append(posy) - except IndexError: - self.full_pos_list.append([posx, posy]) - if body.userData.has_key('rollMotor'): diff = body.userData['rollMotor'] \ ['targetVelocity'] \ @@ -88,10 +88,9 @@ class Tool(object): full_pos_list = self.game.full_pos_list surface = self.game.world.renderer.get_surface() for i, pos_list in enumerate(full_pos_list): - if len(self.game.body_colors) > i: - color = self.game.body_colors[i] - else: - color = 0 + dictkey = "pen{0}".format(i) + color = self.game.trackinfo[dictkey][2] + for i in range(0, len(pos_list), 2): posx = int(pos_list[i]) posy = int(pos_list[i+1]) @@ -690,13 +689,17 @@ class TrackTool(Tool): track_circle = self.game.world.add.ball( point_pos, self.radius, dynamic=True, density=0.001, restitution=0.16, friction=0.1) - track_circle.userData['track_index'] = \ - len(self.game.tracked_bodies) - + trackdex = self.game.tracked_bodies + track_circle.userData['track_index'] = trackdex + dictkey = "pen{0}".format(trackdex) self.game.world.add.joint( track_circle, current_body, point_pos, point_pos, False) - self.game.tracked_bodies.append(track_circle) - self.game.body_colors.append(color) + + self.game.trackinfo[dictkey] = [0, 1, 2] + self.game.trackinfo[dictkey][0] = current_body + self.game.trackinfo[dictkey][1] = track_circle + self.game.trackinfo[dictkey][2] = color + self.game.tracked_bodies += 1 # counter of tracked bodies. def getAllTools(): |