From f4c6563a18015c4d6522aea5fd380e66dc3fa001 Mon Sep 17 00:00:00 2001 From: Florent Pigout Date: Tue, 08 Nov 2011 10:39:02 +0000 Subject: manage toolbar in another way - switching with button but keeping only one current toolbar --- diff --git a/activity.py b/activity.py index 6a14b11..e34067f 100644 --- a/activity.py +++ b/activity.py @@ -61,11 +61,11 @@ class ThreadAnim(threading.Thread): 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() + if self._activity._toolbar: + self._activity._toolbar.refresh(self._time) + # pause + if pause and not self._pause: + self._activity._toolbar.pause() # set pause self._pause = self._pause if pause is None else pause @@ -92,9 +92,7 @@ def _toolbar_changed(toolbox, page, activity_): """Catch toolbox activity tab focus to display settings screen. """ # is the activity tab? - if page == 0: - # remove first if exist - activity_.remove_screen('activity') + if page == 0 and activity_._updating is False: # show the activity screen activity_.change_screen('activity') else: @@ -128,21 +126,15 @@ class AToiDeJouerActivity(activity.Activity): self.max_time = 0 # show self._toolbox.show() - self.__toolbars = {'activity': None} - # init toolbars - for _n in ['story', 'edit', 'help']: - # init toolbar - self.__toolbars[_n] = toolbar.Toolbar(self, name=_n) + self._toolbar = None # set toolbox cb + self._updating = False self._toolbox.connect('current-toolbar-changed', _toolbar_changed, self) # do anim self._thread = ThreadAnim(self) # show the activity screen self.change_screen('activity') - def get_toolbox(self): - return self._toolbox - def update_max_time(self): self.max_time = story.DB().get_max('time') @@ -160,12 +152,12 @@ class AToiDeJouerActivity(activity.Activity): # little check self.add_screen(name, screen) - def _update_slider(self, toolbar): + def _update_slider(self): # sync time if self._thread is None: pass else: - toolbar.update_slider(self._thread._time, self._thread._pause) + self._toolbar.update_slider(self._thread._time, self._thread._pause) def add_screen(self, name, screen): if name in self._screens: @@ -190,63 +182,59 @@ class AToiDeJouerActivity(activity.Activity): return None def change_screen(self, name): - # get current toolbar - toolbar = self.__toolbars[name] if name in self.__toolbars else None + self._updating = True # update current screen name self._previous = self._current self._current = name # already exist if self._current == 'edit': if self._splash is None: - self._splash = screen.Splash(toolbar) + self._splash = screen.Splash(self) else: self._splash._show() - # ... - glib.idle_add(partial(self.__idle_change, toolbar)) - # .. default + glib.idle_add(self.__idle_change) else: - self.__idle_change(toolbar) - - def __idle_change(self, toolbar): + self.__idle_change() + + def __idle_change(self): + # init toolbar + if self._toolbar: + self._toolbar.pause() + self._toolbox.remove_toolbar(1) + if self._current != 'activity': + self._toolbar = toolbar.Toolbar(self, self._current) + self._toolbox.set_current_toolbar(1) + # help specific - need rebuild + if self._current == 'help': + if 'help' in self._screens: + del self._screens['help'] + _scr = screen.ScreenHelp(self) # already exist - if self._current in self._screens: - # show - self._screens[self._current]._show() - if toolbar is None: - pass - else: - # do pause - toolbar.pause() + elif self._current in self._screens: + _scr = self._screens[self._current] + # refresh + if self._current in ['story', 'edit']: # update all self._thread.set_time() - if self._current == 'help': - del self._screens[self._current] - self._screens[self._current] = screen.ScreenHelp(self) - else: - pass - # exit - return - # .. + # init screen elif self._current == 'activity': _scr = screen.ScreenActivity(self) - # update screens dict - self._screens[self._current] = _scr - # .. - return # screen factory elif self._current == 'edit': - _scr = screen.ScreenEdit(toolbar) + _scr = screen.ScreenEdit(self) elif self._current == 'story': - _scr = screen.ScreenStory(toolbar, set_canvas=True) - elif self._current == 'help': - _scr = screen.ScreenHelp(self) + _scr = screen.ScreenStory(self, set_canvas=True) else: - # ?? return + # update slider + if self._current in ['edit', 'story']: + self._update_slider() # update screens dict self._screens[self._current] = _scr - # update slider - self._update_slider(toolbar) + # show + _scr._show() + # .. + self._updating = False def read_file(self, file_path): if not file_path or not os.path.exists(file_path): diff --git a/atoidejouer/ui/panel/edit.py b/atoidejouer/ui/panel/edit.py index 5350f30..84e913c 100644 --- a/atoidejouer/ui/panel/edit.py +++ b/atoidejouer/ui/panel/edit.py @@ -36,7 +36,7 @@ def _set_bg(widget): def _on_position_clicked(widget, panel, move, value): # shortcut - _activity = panel.screen.toolbar.activity + _activity = panel.screen.activity if _activity._thread._pause is False\ or panel.key is None: pass @@ -60,7 +60,7 @@ def _on_position_clicked(widget, panel, move, value): def _on_layer_clicked(widget, panel, move): # shortcut - _activity = panel.screen.toolbar.activity + _activity = panel.screen.activity # get max _layer_max = story.DB().get_max('layer') # do nothing @@ -95,7 +95,7 @@ def _on_layer_clicked(widget, panel, move): def _on_duration_clicked(widget, panel, value): # shortcut - _activity = panel.screen.toolbar.activity + _activity = panel.screen.activity _duration_max = story.DB().get_max('duration') _duration = None # do nothing @@ -120,7 +120,7 @@ def _on_loop_click(toggle, panel, image): _stock_id = 'repeat_grey' if toggle.get_active() is True else 'repeat' image.set_from_file(storage.get_icon_path(_stock_id)) # shortcut - _activity = panel.screen.toolbar.activity + _activity = panel.screen.activity # do nothing if _activity._thread._pause is False\ or panel.key is None: @@ -132,22 +132,22 @@ def _on_loop_click(toggle, panel, image): def _get_next_time(panel, factor): # get the current frame - _time = 0.0 if panel.screen.toolbar.activity._thread is None\ - else panel.screen.toolbar.activity._thread._time + _time = 0.0 if panel.screen.activity._thread is None\ + else panel.screen.activity._thread._time # get rate _rate = config.Config().get_rate_value() # next time _next = _time + factor * _rate # get max - _max = panel.screen.toolbar.activity.max_time + _max = panel.screen.activity.max_time # little check return _next if _next < _max else _max def _get_previous_time(panel, factor): # get the current frame - _time = 0.0 if panel.screen.toolbar.activity._thread is None\ - else panel.screen.toolbar.activity._thread._time + _time = 0.0 if panel.screen.activity._thread is None\ + else panel.screen.activity._thread._time # get rate _rate = config.Config().get_rate_value() # previous time @@ -158,7 +158,7 @@ def _get_previous_time(panel, factor): def _on_remove_key_clicked(widget, panel): # shortcut - _activity = panel.screen.toolbar.activity + _activity = panel.screen.activity if _activity._thread._pause is False\ or panel.key is None: return @@ -179,10 +179,10 @@ def _on_key_press(widget, event, parent): _name = gtk.gdk.keyval_name(_keyval) _mod = gtk.accelerator_get_label(_keyval, event.state) # .. - if parent.screen != parent.screen.toolbar.activity.get_current_screen(): + if parent.screen != parent.screen.activity.get_current_screen(): return # key factory - elif parent.screen.toolbar.name == 'edit': + elif parent.screen.activity._current == 'edit': # POSITION if _name == 'Left' and _mod.startswith('Ctrl+'): # big left _on_position_clicked(widget, parent, 'x', -10) @@ -224,9 +224,9 @@ def _on_key_press(widget, event, parent): # IMAGE # TODO ... # IN EVERY CASE - if parent.screen.toolbar.name in ['edit', 'story']: + if parent.screen.activity._current in ['edit', 'story']: # shortcut - _thread = parent.screen.toolbar.activity._thread + _thread = parent.screen.activity._thread if _name == 'space': # play right _time = _get_next_time(parent, 1) _thread.set_time(time_=_time, pause=True) @@ -236,10 +236,10 @@ def _on_key_press(widget, event, parent): # PLAY elif _name == 'Return': if _thread._pause is True: - parent.screen.toolbar.play() + parent.screen.activity._toolbar.play() _thread.play() else: - parent.screen.toolbar.pause() + parent.screen.activity._toolbar.pause() _thread.pause() else: pass @@ -303,7 +303,7 @@ class PanelEdit(gtk.Frame): self._add_frame_remove() def __init_handler(self): - _activity = self.screen.toolbar.activity + _activity = self.screen.activity _handler_id = _activity._handler_id if _handler_id: _activity.disconnect(_handler_id) @@ -327,7 +327,7 @@ class PanelEdit(gtk.Frame): # hide frame sound self._frame_sound.hide() # shortcut - _activity = self.screen.toolbar.activity + _activity = self.screen.activity # set layer value self.entry_layer.set_text(str(self.key.layer)) # set x value diff --git a/atoidejouer/ui/panel/notebook.py b/atoidejouer/ui/panel/notebook.py index 5b06c86..6cd227b 100644 --- a/atoidejouer/ui/panel/notebook.py +++ b/atoidejouer/ui/panel/notebook.py @@ -54,7 +54,7 @@ def _cb_cursor_changed(treeview, notebook): # get iter _iter = _model.get_iter(_path) # shorcut - _activity = notebook.screen.toolbar.activity + _activity = notebook.screen.activity # prepare key _title = _model.get_value(_iter, 1) _info = _model.get_value(_iter, 2) @@ -202,7 +202,7 @@ class PanelNotebook(gtk.Frame): _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) + _scrolled_win.add_with_viewport(self._edit_panel) return _scrolled_win def _get_label(self, text): diff --git a/atoidejouer/ui/panel/sound.py b/atoidejouer/ui/panel/sound.py index cb94d9d..a614e69 100644 --- a/atoidejouer/ui/panel/sound.py +++ b/atoidejouer/ui/panel/sound.py @@ -102,8 +102,6 @@ class PanelSound(gtk.Frame): _children = self._scrolled_hbox.get_children() for _c in _children: _c.destroy() - # add box in viewport - self._scrolled_window.add_with_viewport(self._scrolled_hbox) def get_current_pos(self): # get children @@ -123,10 +121,10 @@ class PanelSound(gtk.Frame): # update current self._current = _children[_index] # update toolbar frame entry - if self.screen.toolbar._frame_entry is None: + if self.screen.activity._toolbar._frame_entry is None: pass else: - self.screen.toolbar._frame_entry.set_text(str(_index)) + self.screen.activity._toolbar._frame_entry.set_text(str(_index)) else: pass @@ -205,8 +203,8 @@ class PanelSound(gtk.Frame): def refresh(self): self.clear() # get the current frame - _time = 0.0 if self.screen.toolbar.activity._thread is None\ - else self.screen.toolbar.activity._thread._time + _time = 0.0 if self.screen.activity._thread is None\ + else self.screen.activity._thread._time # get the current rate for _k in story.DB().get(story.Key(mime_type='audio/ogg', time=_time)): self.add_key(_k) diff --git a/atoidejouer/ui/screen/activity.py b/atoidejouer/ui/screen/activity.py index 6e74f1d..b44f604 100644 --- a/atoidejouer/ui/screen/activity.py +++ b/atoidejouer/ui/screen/activity.py @@ -105,8 +105,6 @@ class ScreenActivity(gtk.ScrolledWindow): self.__main_box.pack_start(gtk.EventBox(), expand=False, fill=True) # add right menu self._add_right_part() - # do show - self._show() def _get_title(self, text): # init @@ -250,7 +248,7 @@ class ScreenActivity(gtk.ScrolledWindow): # add self.__main_box.pack_start(_vbox, expand=False, fill=True) # add export - _vbox.pack_start(self._get_export_part(), expand=False, fill=True) + # _vbox.pack_start(self._get_export_part(), expand=False, fill=True) # add recent part _vbox.pack_start(self._get_recent_part(), expand=False, fill=True) diff --git a/atoidejouer/ui/screen/edit.py b/atoidejouer/ui/screen/edit.py index 801f79f..acf4546 100644 --- a/atoidejouer/ui/screen/edit.py +++ b/atoidejouer/ui/screen/edit.py @@ -15,11 +15,11 @@ logger = logging.getLogger('atoidejouer') class ScreenEdit(gtk.HBox): - def __init__(self, toolbar): + def __init__(self, activity): # init parent gtk.HBox.__init__(self, homogeneous=False, spacing=2) - # keep toolbar - self.toolbar = toolbar + # keep activity + self.activity = activity # init main vars self.scene = None self.panel_sound = None @@ -32,11 +32,9 @@ class ScreenEdit(gtk.HBox): self.add_scene(_vbox) self.add_panel_sound(_vbox) self.add_panel_edit() - # and show - self._show() def add_scene(self, vbox): - self.scene = ScreenStory(self.toolbar, + self.scene = ScreenStory(self.activity, height_offset=148, width_offset=360) vbox.pack_start(self.scene, expand=True, fill=True) @@ -56,4 +54,4 @@ class ScreenEdit(gtk.HBox): def _show(self): self.show_all() self.refresh() - self.toolbar.activity.set_canvas(self) + self.activity.set_canvas(self) diff --git a/atoidejouer/ui/screen/help.py b/atoidejouer/ui/screen/help.py index 32f8a2a..f917544 100644 --- a/atoidejouer/ui/screen/help.py +++ b/atoidejouer/ui/screen/help.py @@ -21,14 +21,12 @@ class ScreenHelp(WebView): def __init__(self, activity_): WebView.__init__(self) # keep activity - self._activity = activity_ + self.activity = activity_ # load html content self.load_uri(storage.get_html_path('help')) - # do show - self._show() def _show(self): # show all self.show() - # update toolbar - self._activity.set_canvas(self) + # update activity + self.activity.set_canvas(self) diff --git a/atoidejouer/ui/screen/splash.py b/atoidejouer/ui/screen/splash.py index a822b74..77cacc7 100644 --- a/atoidejouer/ui/screen/splash.py +++ b/atoidejouer/ui/screen/splash.py @@ -20,19 +20,19 @@ logger = logging.getLogger('atoidejouer') class Splash(graphics.Scene): - def __init__(self, toolbar): + def __init__(self, activity): # .. graphics.Scene.__init__(self) # .. # self.background_color = "#ffffff" # .. self.__current = 0 - # toolbar keep - self.toolbar = toolbar + # activity keep + self.activity = activity # .. self._image = None # .. - if self.toolbar is None: + if self.activity is None: self._screen_height = None self._screen_width = None else: @@ -67,6 +67,6 @@ class Splash(graphics.Scene): self.add_child(self._image) # show self.show() - # update toolbar - self.toolbar.activity.set_canvas(self) + # update activity + self.activity.set_canvas(self) diff --git a/atoidejouer/ui/screen/story.py b/atoidejouer/ui/screen/story.py index 60aec88..4e66e82 100644 --- a/atoidejouer/ui/screen/story.py +++ b/atoidejouer/ui/screen/story.py @@ -27,7 +27,7 @@ def _on_drag_finish(image, event, scene, key, image_size): # logger.debug('[ui.screen.story] _on_drag_finish - rowcount: %s' % rowcount) # DEBUG # refresh - _scr = scene.toolbar.activity.get_current_screen() + _scr = scene.activity.get_current_screen() _scr.refresh(key=key) # set note edit page _scr.panel_edit._notebook.set_current_page(0) @@ -40,7 +40,7 @@ def _on_click(image, event, scene, key): # invalidate key key = None # refresh - _scr = scene.toolbar.activity.get_current_screen() + _scr = scene.activity.get_current_screen() _scr.refresh(key=key) # set note edit page _scr.panel_edit._notebook.set_current_page(0) @@ -48,13 +48,13 @@ def _on_click(image, event, scene, key): class ScreenStory(graphics.Scene): - def __init__(self, toolbar, height_offset=0, width_offset=0, + def __init__(self, activity, height_offset=0, width_offset=0, set_canvas=False, clear=False): # .. graphics.Scene.__init__(self) self.background_color = "#ffffff" - # keep toolbar - self.toolbar = toolbar + # keep activity + self.activity = activity # .. self._set_canvas = set_canvas self._clear = False @@ -72,10 +72,7 @@ class ScreenStory(graphics.Scene): # .. self._screen_height = None self._screen_width = None - # ... self._refresh_screen_size() - # and show - self._show() def set_fullscreen(self, fullscreen): # update fullscreen flag @@ -89,6 +86,8 @@ class ScreenStory(graphics.Scene): # keep some info self._screen_height = gtk.gdk.screen_height() - self._height_offset self._screen_width = gtk.gdk.screen_width() - self._width_offset + # update size request + self.set_size_request(self._screen_width, self._screen_height) def set_clear(self, clear): self._clear = clear @@ -116,8 +115,8 @@ class ScreenStory(graphics.Scene): # ensure valid screen size self._refresh_screen_size() # get the current frame - _time = 0.0 if self.toolbar.activity._thread is None\ - else self.toolbar.activity._thread._time + _time = 0.0 if self.activity._thread is None\ + else self.activity._thread._time # get the current rate _rate = config.Config().get_rate_value() # using DB @@ -139,9 +138,9 @@ class ScreenStory(graphics.Scene): else: pass # refresh sounds if playing - if self.toolbar.activity._thread is None: + if self.activity._thread is None: pass - elif self.toolbar.activity._thread._pause is False: + elif self.activity._thread._pause is False: """ # for each sound for _n in self._get_keys('sounds').get_names(): @@ -160,7 +159,7 @@ class ScreenStory(graphics.Scene): else: # stop all for _id, _sound in self.__sounds.items(): - if self.toolbar.activity._thread._time == 0: + if self.activity._thread._time == 0: _sound.stop() else: _sound.pause() @@ -246,7 +245,9 @@ class ScreenStory(graphics.Scene): else: _filename = '%s_default' % default_name _path = storage.get_image_path(_filename) - _key = story.Key(id=_code, path=_path, layer=0) + _layer = story.DB().get_max('layer') + 1\ + if default_name == 'mask' else 0 + _key = story.Key(id=_code, path=_path, layer=_layer) # .. _align = (0, 0) # get/update width and height @@ -261,8 +262,8 @@ class ScreenStory(graphics.Scene): # get align _x, _y = key.x, key.y # get the current frame - _time = 0.0 if self.toolbar.activity._thread is None\ - else self.toolbar.activity._thread._time + _time = 0.0 if self.activity._thread is None\ + else self.activity._thread._time # get transition ratio _ratio = _time - int(_time) if _ratio < rate: @@ -352,7 +353,7 @@ class ScreenStory(graphics.Scene): def __refresh_sound(self, sequence_name, frame): # get sequence file codes _seq_codes = self._get_keys('sounds').get_sequence_codes( - self.toolbar.name, sequence_name) + self.activity._current, sequence_name) # get sequence filename _current, _f_type, _k_type = self._get_keys('sounds').get_current( sequence_name, frame) @@ -393,7 +394,7 @@ class ScreenStory(graphics.Scene): # ensure/generate code _filecode = key.random_str() # update story key object - self._get_keys('sounds').set_code(self.toolbar.name, sequence_name, + self._get_keys('sounds').set_code(self.activity._current, sequence_name, current, _filecode) # ... _sound = sound.Player() @@ -409,10 +410,8 @@ class ScreenStory(graphics.Scene): self.refresh() # .. self.show() - # update size request - self.set_size_request(self._screen_width, self._screen_height) # update canvas if self._set_canvas is True: - self.toolbar.activity.set_canvas(self) + self.activity.set_canvas(self) else: pass diff --git a/atoidejouer/ui/toolbar.py b/atoidejouer/ui/toolbar.py index 80f156e..0ebcd5d 100644 --- a/atoidejouer/ui/toolbar.py +++ b/atoidejouer/ui/toolbar.py @@ -111,10 +111,13 @@ def _cb_import(widget, toolbar): def _cb_play(widget, toolbar): - # replace play button - toolbar._replace_button('play', 'pause') - # trigger playing - toolbar.activity._thread.play() + if toolbar.activity._current == 'story': + # replace play button + toolbar._replace_button('play', 'pause') + # trigger playing + toolbar.activity._thread.play() + else: + __switch(toolbar, 'story') def _cb_pause(widget, toolbar): @@ -202,22 +205,30 @@ def _cb_format_value(widget, value, toolbar): TOOLBAR_INDEXES = ['activity', 'story', 'edit', 'help'] -def _cb_help_back(widget, toolbar): - _previous = toolbar.activity._previous - # restore default tab - toolbar.activity._toolbox.set_current_toolbar( - TOOLBAR_INDEXES.index(_previous.replace('_add', ''))) - # restore previous - toolbar.activity.change_screen(_previous) + +def __switch(toolbar, scr): + # focus tab + toolbar.activity._toolbox.set_current_toolbar(TOOLBAR_INDEXES.index(scr)) + # do switch + toolbar.activity.change_screen(scr) + + +def _cb_help(widget, toolbar): + __switch(toolbar, 'help') + + +def _cb_edit(widget, toolbar): + __switch(toolbar, 'edit') BUTTONS = { 'add' : ['list-add', _cb_add], 'back' : ['edit-undo', _cb_back], 'backward' : ['media-seek-backward', _cb_backward], + 'edit': ['view-lastedit', _cb_edit], 'forward' : ['media-seek-forward', _cb_forward], 'frame_entry' : [None, None], - 'help_back' : ['edit-undo', _cb_help_back], + 'help': ['view-details', _cb_help], 'import' : ['insert-image', _cb_import], 'open' : ['media', _cb_open], 'pause' : ['media-playback-pause', _cb_pause], @@ -234,17 +245,17 @@ TOOLBARS = { ['stop', 'play', 'slider', # 'backward', 'forward' 'separator', 'view_fullscreen'], - [] + ['edit', 'help'] ], 'edit' : [ - ['stop', 'play', 'slider', 'backward', 'forward' + ['slider', 'backward', 'forward' # 'separator', 'add' ], - [] + ['play', 'help'] ], 'help' : [ [], - ['help_back'] + ['play', 'edit'] ] } @@ -255,6 +266,8 @@ TITLES = { # 'open': _('Open Story'), # 'backward': _('Seek Backward'), # 'forward': _('Seek Forward'), + 'edit': _('Edit Story'), + 'help': _('Help'), 'pause': _('Pause Story'), 'play': _('Play Story'), 'slider': _('Progress Bar'), @@ -268,6 +281,7 @@ TITLES = { 'buttons': { 'backward': _('Seek Backward'), 'forward': _('Seek Forward'), + 'help': _('Help'), 'pause': _('Pause Story'), 'play': _('Play Story'), 'slider': _('Progress Bar'), @@ -278,7 +292,8 @@ TITLES = { 'help' : { 'toolbox': _('Help'), 'buttons': { - 'help_back': _('Back') + 'play': _('Play Story'), + 'edit': _('Edit Story') } }, } @@ -286,7 +301,7 @@ TITLES = { class Toolbar(gtk.Toolbar): - def __init__(self, activity, name='player'): + def __init__(self, activity, name): # init parent gtk.Toolbar.__init__(self) # keep the name @@ -307,10 +322,9 @@ class Toolbar(gtk.Toolbar): if _toolbox_name is None: pass else: - _toolbox = self.activity.get_toolbox() - _toolbox.add_toolbar(_toolbox_name, self) + self.activity._toolbox.add_toolbar(_toolbox_name, self) # connect focus event - self.connect('focus', self._on_focus) + # self.connect('focus', self._on_focus) # show self.show() @@ -383,7 +397,8 @@ class Toolbar(gtk.Toolbar): # update adjustment # if hasattr(self._adjustment, 'set_upper'): ??? # self._adjustment.set_upper(_max) - self._adjustment.upper = self.activity.max_time + if self._adjustment: + self._adjustment.upper = self.activity.max_time # get slider _s = self.get_slider() # slider stuff -- cgit v0.9.1