From b9e4c79d12cb003e0e4a712d7be7ab9a4a06f7d6 Mon Sep 17 00:00:00 2001 From: Florent Pigout Date: Mon, 17 Oct 2011 20:58:17 +0000 Subject: implement duration management + restore all anim features --- diff --git a/activity.py b/activity.py index 65942f8..8ccacb9 100644 --- a/activity.py +++ b/activity.py @@ -15,8 +15,8 @@ gtk.gdk.threads_init() from sugar.activity import activity # atoidejouer import +from atoidejouer.db import story from atoidejouer.ui import screens, toolbar -# .. from atoidejouer.tools import config, storage # get application logger @@ -52,66 +52,41 @@ class ThreadAnim(threading.Thread): def kill(self): self._die = True - def set_time(self, time_=None, rate=0, pause=None): + def set_time(self, time_=None, rate=0, pause=None, key=None): # ensure time time_ = self._time if time_ is None else time_ # update time self._time = time_ + rate + # get current screen + _current_screen = self._activity.get_current_screen() + # update scene + if hasattr(_current_screen, 'refresh'): + _current_screen.refresh(key=key) + # update slider + if hasattr(_current_screen, 'toolbar'): + _current_screen.toolbar.refresh(self._time) + # pause + if pause and not self._pause: + _current_screen.toolbar.pause() # set pause self._pause = self._pause if pause is None else pause - # ... - _current_screen = self._activity.get_current_screen() - # ??? - if _current_screen is None: - # ERROR - logger.error('[activity] set_time - scene not found!') - # do pause on toolbar - elif pause is True: - if hasattr(_current_screen, 'toolbar'): - _current_screen.toolbar.pause() - else: - pass - else: - # update scene - if hasattr(_current_screen, 'scene'): - _current_screen.scene.refresh() - elif hasattr(_current_screen, 'refresh'): - _current_screen.refresh() - else: - pass - # update panel - if hasattr(_current_screen, 'panel'): - _current_screen.panel.refresh() - else: - pass - # update slider - if hasattr(_current_screen, 'toolbar'): - _current_screen.toolbar.refresh(self._time) - else: - pass def run(self): - # ... while self._die is False: # get current rate _rate = config.Config().get_rate_value() - # ... time.sleep(_rate) # do pause - if (self._time + 1) >= self._activity._number_of_keys\ + if self._time >= self._activity.max_time\ and self._pause is False: - # just in case - self._time = self._activity._number_of_keys - 1 - # ... + self._time = self._activity.max_time self.set_time(pause=True) - # .. continue # .. do nothing elif self._pause is True: continue # .. do something else: - # ... self.set_time(rate=_rate) @@ -135,6 +110,8 @@ class AToiDeJouerActivity(activity.Activity): def __init__(self, handle): # init parent activity.Activity.__init__(self, handle) + # .. first db init + story.DB(create=True) # init activity working folder storage.init_activity_files() # .. @@ -148,10 +125,9 @@ class AToiDeJouerActivity(activity.Activity): self._screens = dict() self._current = None self._previous = None + self._splash = None self._handler_id = None - self._number_of_keys = 1 - # .. - self.__splash = None + self.max_time = 0 # show self._toolbox.show() # tmp var @@ -171,15 +147,8 @@ class AToiDeJouerActivity(activity.Activity): def get_toolbox(self): return self._toolbox - """ - def update_number_of_keys(self): - # set max - _graphic_max = self.graphic_keys.get_max_frame() - _sound_max = self.sound_keys.get_max_frame() - _max = _graphic_max if _graphic_max > _sound_max else _sound_max - # update value - self._number_of_keys = _max + 1 - """ + def update_max_time(self): + self.max_time = story.DB().get_max('time') def get_current_screen(self): # little check @@ -234,10 +203,10 @@ class AToiDeJouerActivity(activity.Activity): self._current = toolbar.name if name is None else name # already exist if self._current == 'edit': - if self.__splash is None: - self.__splash = screens.Splash(toolbar) + if self._splash is None: + self._splash = screens.Splash(toolbar) else: - self.__splash._show() + self._splash._show() # ... glib.idle_add(partial(self.__idle_change, toolbar)) # .. default @@ -300,7 +269,7 @@ class AToiDeJouerActivity(activity.Activity): # self.graphic_keys.loads(_data) # self.sound_keys.loads(_data) # set activity new number of keys - # self.update_number_of_keys() + # self.update_max_time() # clear # self.graphic_keys.ask_clear() # switch to edit mode if no key diff --git a/atoidejouer/db/story.py b/atoidejouer/db/story.py index 515be85..d10cd87 100644 --- a/atoidejouer/db/story.py +++ b/atoidejouer/db/story.py @@ -169,7 +169,6 @@ class Key(object): "%s='%s'" % ("title", self.title), "%s='%s'" % ("mime_type", self.mime_type), "%s='%s'" % ("timestamp", self.timestamp), - "%s=%s" % ("layer", self.layer), "%s%s%s" % ("time", sign, time), ]), order) @@ -232,10 +231,12 @@ class Key(object): DB().update(key) # update previous end = self.time - _do_fresh(DB()._all(query=self._query_duration(end, sign='<', order='-'))) + _do_fresh(DB()._all( + query=self._query_duration(end, sign='<', order='-'))) # update next start = self.time + self.duration - _do_fresh(DB()._all(query=self._query_duration(start, sign='>', order='-'))) + _do_fresh(DB()._all( + query=self._query_duration(start, sign='>', order='-'))) def _del(self, refresh=True): # list next keys @@ -272,17 +273,19 @@ class Key(object): class DB(object): - class __Singleton: + class __Singleton(object): - def __init__(self, config=None, name="story", obj=Key): + def __init__(self, create=False, name="story", obj=Key): self.name, self.obj = name, obj db_path = storage.get_db_path('default') self.con = sqlite3.connect(db_path, - detect_types=sqlite3.PARSE_DECLTYPES) + detect_types=sqlite3.PARSE_DECLTYPES, + check_same_thread=False) self.con.row_factory = sqlite3.Row - self.__check() + if create is True: + self.__create() - def __check(self): + def __create(self): cur = self.con.cursor() # remove all first try: @@ -356,13 +359,13 @@ class DB(object): # singleton instance instance = None - def __new__(c, force=False): + def __new__(c, force=False, create=False): """Singleton new init. """ # if doesn't already initialized if not DB.instance\ or force is True: # create a new instance - DB.instance = DB.__Singleton() + DB.instance = DB.__Singleton(create=create) # return the manager object return DB.instance diff --git a/atoidejouer/tools/storage.py b/atoidejouer/tools/storage.py index 520c146..88eb294 100644 --- a/atoidejouer/tools/storage.py +++ b/atoidejouer/tools/storage.py @@ -475,6 +475,8 @@ def __merge_dir(project_name, dir_name, exist_list=None): def __import_keys(activity_, project_name): + pass + """ # .. _path_data = os.path.join(ROOT, 'tmp', project_name, 'story.keys') @@ -492,7 +494,7 @@ def __import_keys(activity_, project_name): _exist_graphic_keys = activity_.graphic_keys.loads(_data, clear=False) _exist_sound_keys = activity_.sound_keys.loads(_data, clear=False) # set activity new number of keys - activity_.update_number_of_keys() + activity_.update_max_time() # .. return { 'graphics': _exist_graphic_keys, @@ -501,9 +503,12 @@ def __import_keys(activity_, project_name): # ?? invalid archive else: return None + """ def import_project(activity_, file_path, msg_label): + pass + """ # clean tmp dir __remove_dir('tmp', parent=None) __check_dir('tmp', parent=None) @@ -575,6 +580,7 @@ def import_project(activity_, file_path, msg_label): __remove_dir('tmp', parent=None) # show result __show_in_out_result_message(msg_label, _msg) + """ def __remove_dir(dir_name, parent=None): @@ -604,6 +610,8 @@ def __remove_dir(dir_name, parent=None): def export_project(activity_, msg_label, media): + pass + """ # get the toolbar _toolbar = activity_._toolbox.get_activity_toolbar() # get the projet name @@ -657,3 +665,4 @@ def export_project(activity_, msg_label, media): __remove_dir('tmp', parent=None) # tmp message __show_in_out_result_message(msg_label, _msg) + """ diff --git a/atoidejouer/ui/panel/edit.py b/atoidejouer/ui/panel/edit.py index b2cacee..5350f30 100644 --- a/atoidejouer/ui/panel/edit.py +++ b/atoidejouer/ui/panel/edit.py @@ -50,7 +50,7 @@ def _on_position_clicked(widget, panel, move, value): # DB update rowcount = story.DB().update(panel.key) # DEBUG - logger.debug('[ui.panel.edit] _on_position_clicked - rowcount: %s' % rowcount) + # logger.debug('[ui.panel.edit] _on_position_clicked - rowcount: %s' % rowcount) # update panel entries panel.entry_x.set_text(str(panel.key.x)) panel.entry_y.set_text(str(-panel.key.y)) @@ -84,8 +84,8 @@ def _on_layer_clicked(widget, panel, move): # DB update rowcount = story.DB().update(panel.key) # DEBUG - # logger.debug('[ui.screen.story] _on_layer_clicked - key: %s' % panel.key) - # logger.debug('[ui.screen.story] _on_layer_clicked - rowcount: %s' % rowcount) + # logger.debug('[ui.panel.edit] _on_layer_clicked - key: %s' % panel.key) + # logger.debug('[ui.panel.edit] _on_layer_clicked - rowcount: %s' % rowcount) # DEBUG # update entry panel.entry_layer.set_text(str(panel.key.layer)) @@ -97,16 +97,19 @@ def _on_duration_clicked(widget, panel, value): # shortcut _activity = panel.screen.toolbar.activity _duration_max = story.DB().get_max('duration') + _duration = None # do nothing if _activity._thread._pause is False\ or panel.key is None: return elif panel.key.duration + value < 0: - panel.key.duration = 0 + _duration = 0 else: - panel.key.duration += value + _duration = panel.key.duration + value # DB update - story.DB().update(panel.key) + panel.key.update_duration(_duration) + # update max time + _activity.update_max_time() # update panel entries panel.entry_duration.set_text( '%1d:%02d' % divmod(panel.key.duration, 60)) @@ -124,7 +127,6 @@ def _on_loop_click(toggle, panel, image): return else: panel.key.loop = toggle.get_active() - # DB update story.DB().update(panel.key) @@ -137,13 +139,9 @@ def _get_next_time(panel, factor): # next time _next = _time + factor * _rate # get max - _max = panel.screen.toolbar.activity._number_of_keys - 1 - if _next < _max: - # ok! - return _next - else: - # return max + pause - return _max + _max = panel.screen.toolbar.activity.max_time + # little check + return _next if _next < _max else _max def _get_previous_time(panel, factor): @@ -154,13 +152,8 @@ def _get_previous_time(panel, factor): _rate = config.Config().get_rate_value() # previous time _previous = _time - factor * _rate - # .. - if _previous < 0: - # return min - return 0 - else: - # ok - return _previous + # little check + return 0 if _previous < 0 else _previous def _on_remove_key_clicked(widget, panel): @@ -174,6 +167,8 @@ def _on_remove_key_clicked(widget, panel): story.DB()._del(panel.key) # empty key panel.key = None + # update max time + _activity.update_max_time() # refresh screen panel.screen.refresh() @@ -357,7 +352,7 @@ class PanelEdit(gtk.Frame): def refresh(self, key=None): # DEBUG - logger.debug('[ui.panel.edit] refresh - key: %s' % key) + # logger.debug('[ui.panel.edit] refresh - key: %s' % key) # DEBUG self.key = key if not key: diff --git a/atoidejouer/ui/panel/notebook.py b/atoidejouer/ui/panel/notebook.py index 346e2f9..2b183b1 100644 --- a/atoidejouer/ui/panel/notebook.py +++ b/atoidejouer/ui/panel/notebook.py @@ -137,16 +137,13 @@ class PanelNotebook(gtk.Frame): if _info['preview'] is None or type_ == 'sounds': _pixbuf = image.get_pixbuf(_default_pix_path, 64, 48) else: - # prepare preview _pixbuf = storage.get_pixbuf_from_data( _info['preview'], size=(64, 48)) - # .. _add_path = storage.get_icon_path('more_small') # _pix_a = image.get_pixbuf(_add_path, 24, 24) # do update _row = [_pixbuf, _info['title'], _info] # , _pix_a, _info] _store.append(_row) - # .. return _store def _get_treeview(self, type_=None): @@ -194,20 +191,17 @@ class PanelNotebook(gtk.Frame): _treeview.append_column(_col_preview) _treeview.append_column(_col_description) # _treeview.append_column(_col_add) - # .. + # add all _scrolled_win.add(_treeview) # return it return _scrolled_win def _get_edit_panel(self): - # .. _scrolled_win = gtk.ScrolledWindow() _scrolled_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) _scrolled_win.show() - # .. self._edit_panel = PanelEdit(self.screen) _scrolled_win.add(self._edit_panel) - # .. return _scrolled_win def _get_label(self, text): @@ -215,7 +209,6 @@ class PanelNotebook(gtk.Frame): _label = gtk.Label(text) _label.modify_fg(gtk.STATE_ACTIVE, COLOR_WHITE) _label.show() - # .. return _label def _get_notebook(self): diff --git a/atoidejouer/ui/screens/story.py b/atoidejouer/ui/screens/story.py index 9086410..54181d5 100644 --- a/atoidejouer/ui/screens/story.py +++ b/atoidejouer/ui/screens/story.py @@ -104,7 +104,7 @@ class ScreenStory(graphics.Scene): else: return False - def refresh(self): + def refresh(self, **kargs): # ensure valid screen size self._refresh_screen_size() # get the current frame @@ -276,7 +276,7 @@ class ScreenStory(graphics.Scene): # ensure current image if key.id in self.__graphics: # DEBUG - logger.debug('[ui.screen.story] __refresh_image - key: %s' % key) + # logger.debug('[ui.screen.story] __refresh_image - key: %s' % key) # DEBUG _image = self.__graphics[key.id] # update x, y @@ -319,7 +319,7 @@ class ScreenStory(graphics.Scene): else: _scale = float(_new_w)/_w # DEBUG - logger.debug('[ui.screen.story] __update_drawing_area - key: %s' % key) + # logger.debug('[ui.screen.story] __update_drawing_area - key: %s' % key) # DEBUG # image _image = graphics.Image(key.get_path(), x=_x, y=_y, scale_x=_scale, diff --git a/atoidejouer/ui/toolbar.py b/atoidejouer/ui/toolbar.py index 88fdd51..fe33ef8 100644 --- a/atoidejouer/ui/toolbar.py +++ b/atoidejouer/ui/toolbar.py @@ -15,6 +15,7 @@ from sugar.activity import activity from sugar.graphics.toolbutton import ToolButton # atoidejouer import +from atoidejouer.db import story from atoidejouer.tools import config, storage from atoidejouer.ui import screens @@ -90,46 +91,6 @@ def _cb_add(widget, toolbar): logger.error('[toolbar] _cb_add - unknown: %s' % toolbar.name) -def _cb_frame_after(widget, toolbar): - if toolbar._frame_entry is None: - pass - else: - # get previous value - _value = int(toolbar._frame_entry.get_text()) - # inc it - _update_frame_entry(widget, toolbar, _value + 1) - - -def _cb_frame_before(widget, toolbar): - if toolbar._frame_entry is None: - pass - else: - # get previous value - _value = int(toolbar._frame_entry.get_text()) - # dec it - _update_frame_entry(widget, toolbar, _value - 1) - - -def _update_frame_entry(entry, toolbar, value): - # get screen - _screen = toolbar.activity.get_current_screen() - # get max value - _max = _screen.sequence_preview.number_of_items() - 1 - # prepare value - _new_val = None - if value > _max: - _new_val = _max - elif value < 0: - _new_val = 0 - # reset max just in case - else: - _new_val = value - # update entry - toolbar._frame_entry.set_text(str(_new_val)) - # update sequence - _screen.sequence_preview.move_current(_new_val) - - def _cb_open(widget, toolbar): pass @@ -145,14 +106,8 @@ def _cb_back(widget, toolbar): def _cb_import(widget, toolbar): - # get the current sequence name - _sequence_name = toolbar._sequence_entry.get_text() # get filenames _screen = toolbar.activity.get_current_screen() - # shortcut - _filenames = _screen.sequence_preview.items - # add sequence to the story keys - # toolbar.story_keys.add_sequence(_sequence_name, _filenames) def _cb_play(widget, toolbar): @@ -172,13 +127,11 @@ def _cb_pause(widget, toolbar): def _cb_stop(widget, toolbar): # replace pause button - if playing if toolbar._has_button('pause'): - # .. toolbar._replace_button('pause', 'play') else: pass # update main thread toolbar.activity._thread.pause(stop=True) - # .. toolbar.activity._thread.set_time() @@ -204,17 +157,40 @@ def _cb_view_return(widget, toolbar): _screen.set_fullscreen(False) +def __set_time(toolbar, time_): + _current_screen = toolbar.activity.get_current_screen() + if hasattr(_current_screen, 'panel_edit'): + _key = _current_screen.panel_edit._edit_panel.key + _key = story.DB().one( + story.Key( + title=_key.title, + mime_type=_key.mime_type, + timestamp=_key.timestamp, + time=time_ + ) + ) if _key is not None else None + toolbar.activity._thread.set_time(time_=time_, key=_key) + else: + toolbar.activity._thread.set_time(time_=time_) + def _cb_slider(widget, event, toolbar): """action = 'press' or 'release' """ - # ... - if event.type == gtk.gdk.BUTTON_PRESS: - pass - elif event.type == gtk.gdk.BUTTON_RELEASE: - toolbar.activity._thread.set_time(time_=widget.get_value()) - # ?? - else: - pass + if event.type == gtk.gdk.BUTTON_RELEASE: + __set_time(toolbar, widget.get_value()) + + +def _cb_backward(widget, toolbar): + _time = toolbar.activity._thread._time + _time = _time - 1 if _time > 0 else 0 + __set_time(toolbar, _time) + + +def _cb_forward(widget, toolbar): + _time = toolbar.activity._thread._time + _max = toolbar.activity.max_time + _time = _time + 1 if _time < _max else _max + __set_time(toolbar, _time) def _cb_format_value(widget, value, toolbar): @@ -223,6 +199,7 @@ def _cb_format_value(widget, value, toolbar): # return formated value return '%1d:%02d' % divmod(value, 60) + TOOLBAR_INDEXES = ['activity', 'story', 'edit', 'help'] def _cb_help_back(widget, toolbar): @@ -237,10 +214,8 @@ def _cb_help_back(widget, toolbar): BUTTONS = { 'add' : ['list-add', _cb_add], 'back' : ['edit-undo', _cb_back], - 'backward' : ['media-seek-backward', None], - 'forward' : ['media-seek-forward', None], - 'frame_after' : ['go-right', _cb_frame_after], - 'frame_before' : ['go-left', _cb_frame_before], + 'backward' : ['media-seek-backward', _cb_backward], + 'forward' : ['media-seek-forward', _cb_forward], 'frame_entry' : [None, None], 'help_back' : ['edit-undo', _cb_help_back], 'import' : ['insert-image', _cb_import], @@ -320,7 +295,6 @@ class Toolbar(gtk.Toolbar): self.activity = activity # adjustment self._adjustment = None - self._number_of_keys = self.activity._number_of_keys # keep components self._sequence_entry = None self._frame_entry = None @@ -400,25 +374,16 @@ class Toolbar(gtk.Toolbar): return None def play(self): - # do pause _cb_play(None, self) def pause(self): - # do pause _cb_pause(None, self) def refresh(self, value): - # ... - if self._number_of_keys != self.activity._number_of_keys: - # update nb of keys - self._number_of_keys = self.activity._number_of_keys - # update adjustment - if hasattr(self._adjustment, 'set_upper'): - self._adjustment.set_upper(self._number_of_keys-1) - else: - self._adjustment.upper = self._number_of_keys-1 - else: - pass + # update adjustment + # if hasattr(self._adjustment, 'set_upper'): ??? + # self._adjustment.set_upper(_max) + self._adjustment.upper = self.activity.max_time # get slider _s = self.get_slider() # slider stuff @@ -459,7 +424,7 @@ class Toolbar(gtk.Toolbar): # manage slider elif button_id == 'slider': # - self._adjustment = gtk.Adjustment(0, 0, self._number_of_keys-1, 1) + self._adjustment = gtk.Adjustment(0, 0, self.activity.max_time, 1) # .. _hscale = gtk.HScale(self._adjustment) _hscale.set_draw_value(True) -- cgit v0.9.1