Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorent Pigout <florent.pigout@gmail.com>2011-10-17 20:58:17 (GMT)
committer Florent Pigout <florent.pigout@gmail.com>2011-10-17 20:58:17 (GMT)
commitb9e4c79d12cb003e0e4a712d7be7ab9a4a06f7d6 (patch)
tree1289fa91d0fdcd18bb551ed38261971d67e5aac7
parent8620b880f8905698f73aad79395737ebf8234ba7 (diff)
implement duration management + restore all anim features
-rw-r--r--activity.py81
-rw-r--r--atoidejouer/db/story.py23
-rw-r--r--atoidejouer/tools/storage.py11
-rw-r--r--atoidejouer/ui/panel/edit.py39
-rw-r--r--atoidejouer/ui/panel/notebook.py9
-rw-r--r--atoidejouer/ui/screens/story.py6
-rw-r--r--atoidejouer/ui/toolbar.py115
7 files changed, 109 insertions, 175 deletions
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)