From a0368054cc38c46c343499aebe38050d69df2cd3 Mon Sep 17 00:00:00 2001 From: Simon Poirier Date: Sat, 24 Oct 2009 21:25:46 +0000 Subject: merge creator Conflicts: tutorius/core.py --- diff --git a/addons/gtkwidgeteventfilter.py b/addons/gtkwidgeteventfilter.py index 6f8d797..5811744 100644 --- a/addons/gtkwidgeteventfilter.py +++ b/addons/gtkwidgeteventfilter.py @@ -14,7 +14,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from sugar.tutorius.filters import EventFilter -from sugar.tutorius.properties import TUAMProperty, TStringProperty +from sugar.tutorius.properties import TUAMProperty, TGtkSignal from sugar.tutorius.gtkutils import find_widget class GtkWidgetEventFilter(EventFilter): diff --git a/data/icons/clock.svg b/data/icons/clock.svg index 8adb898..dc73bbb 100644 --- a/data/icons/clock.svg +++ b/data/icons/clock.svg @@ -1,6 +1,6 @@ - + @@ -266,4 +266,4 @@ - \ No newline at end of file + diff --git a/tutorius/core.py b/tutorius/core.py index b24b80b..cf1d6b3 100644 --- a/tutorius/core.py +++ b/tutorius/core.py @@ -505,10 +505,9 @@ class FiniteStateMachine(State): #TODO : Move this code inside the State itself - we're breaking # encap :P - if st._transitions: - for event, state in st._transitions.items(): - if state == state_name: - del st._transitions[event] + for event in st._transitions: + if st._transitions[event] == state_name: + del st._transitions[event] # Remove the state from the dictionary del self._states[state_name] diff --git a/tutorius/creator.py b/tutorius/creator.py index d8f3d98..b322b69 100644 --- a/tutorius/creator.py +++ b/tutorius/creator.py @@ -34,7 +34,7 @@ from sugar.tutorius import overlayer, gtkutils, actions, bundler, properties, ad from sugar.tutorius import filters, __path__ from sugar.tutorius.services import ObjectStore from sugar.tutorius.linear_creator import LinearCreator -from sugar.tutorius.core import Tutorial +from sugar.tutorius.core import Tutorial, FiniteStateMachine, State from sugar.tutorius import viewer class Creator(object): @@ -97,6 +97,16 @@ class Creator(object): self._overview.win.move(0, gtk.gdk.screen_height()- \ self._overview.win.get_allocation().height) + self._transitions = dict() + + def _update_next_state(self, state, event, next_state): + self._transitions[event] = next_state + + evts = state.get_event_filter_list() + state.clear_event_filters() + for evt, next_state in evts: + state.add_event_filter(evt, self._transitions[evt]) + def delete_action(self, action): """ Removes the first instance of specified action from the tutorial. @@ -121,8 +131,7 @@ class Creator(object): ev_list = state.get_event_filter_list() if ev_list: - state = self._tutorial.get_state_by_name( - ev_list[0].get_next_state()) + state = self._tutorial.get_state_by_name(ev_list[0][1]) continue return False @@ -141,9 +150,8 @@ class Creator(object): state = self._tutorial.get_state_by_name("INIT") ev_list = state.get_event_filter_list() - if state == self._state: - next_state = self._tutorial.get_state_by_name( - ev_list[0].get_next_state()) + if state is self._state: + next_state = self._tutorial.get_state_by_name(ev_list[0][1]) self.set_insertion_point(next_state.name) self._tutorial.remove_state(state.name) self._tutorial.remove_state(next_state.name) @@ -153,20 +161,17 @@ class Creator(object): # loop to repair links from deleted state while ev_list: - next_state = self._tutorial.get_state_by_name( - ev_list[0].get_next_state()) + next_state = self._tutorial.get_state_by_name(ev_list[0][1]) if next_state is self._state: # the tutorial will flush the event filters. We'll need to # clear and re-add them. - ev_list = copy.copy(ev_list) self._tutorial.remove_state(self._state.name) state.clear_event_filters() - ev_list[0].set_next_state( - next_state.get_event_filter_list()[0].get_next_state()) - for ev in ev_list: - state.add_event_filter(ev) + self._update_next_state(state, ev_list[0][0], next_state.get_event_filter_list()[0][1]) + for ev, next_state in ev_list: + state.add_event_filter(ev, next_state) - self.set_insertion_point(ev_list[0].get_next_state()) + self.set_insertion_point(ev_list[0][1]) return True state = next_state @@ -285,18 +290,20 @@ class Creator(object): new_state = State(name=str(self._state_counter)) self._state_counter += 1 self._state.clear_event_filters() - for evt_filt in event_filters: - new_state.add_event_filter(evt_filt) - event.set_next_state(new_state.name) + for evt_filt, next_state in event_filters: + new_state.add_event_filter(evt_filt, next_state) + self._update_next_state(self._state, event, new_state.name) + next_state = new_state.name # blocks are shifted, full redraw is necessary self._overview.win.queue_draw() else: # append empty event only if edit not inserting between events - event.set_next_state(str(self._state_counter)) + self._update_next_state(self._state, event, str(self._state_counter)) + next_state = str(self._state_counter) new_state = State(name=str(self._state_counter)) self._state_counter += 1 - self._state.add_event_filter(event) + self._state.add_event_filter(event, next_state) self._tutorial.add_state(new_state) self._overview.win.queue_draw() diff --git a/tutorius/viewer.py b/tutorius/viewer.py index e0ae4a9..751e89a 100644 --- a/tutorius/viewer.py +++ b/tutorius/viewer.py @@ -179,7 +179,7 @@ class Viewer(object): if event_list: local_height = (block_max_height - BLOCK_PADDING)/len(event_list) - BLOCK_PADDING ctx.save() - for event in event_list: + for event, next_state in event_list: origin = tuple(ctx.get_matrix())[-2:] if self.click_pos and \ self.click_pos[0]-BLOCK_WIDTH