diff options
author | florent <florent.pigout@gmail.com> | 2011-03-21 12:00:32 (GMT) |
---|---|---|
committer | florent <florent.pigout@gmail.com> | 2011-03-21 12:00:32 (GMT) |
commit | f45dffee8dffb0f04f750deab838451c6b470a4a (patch) | |
tree | 614b303656a9cb4dda650f94902ebdbe5c31840c | |
parent | 9b4ddead3f4dfd0b3f7fa8565ca3d4ea25907bb8 (diff) |
fix errors in sound preview | manage sound duration and loop editing | some refactoring
-rw-r--r-- | activity.py | 6 | ||||
-rw-r--r-- | atoidejouer/story/keys.py | 32 | ||||
-rw-r--r-- | atoidejouer/ui/panel.py | 89 | ||||
-rw-r--r-- | atoidejouer/ui/preview.py | 45 | ||||
-rw-r--r-- | atoidejouer/ui/timeline.py | 6 | ||||
-rw-r--r-- | static/sequences/graphics/blank | 0 | ||||
-rw-r--r-- | static/sequences/sounds/blank | 0 |
7 files changed, 131 insertions, 47 deletions
diff --git a/activity.py b/activity.py index 16bc7a3..ec4b547 100644 --- a/activity.py +++ b/activity.py @@ -77,6 +77,12 @@ class ThreadAnim(threading.Thread): _s.timeline.refresh() else: pass + # update panel + if hasattr(_s, 'panel'): + # .. + _s.panel.refresh() + else: + pass # update slider _s.toolbar.refresh(self._time) diff --git a/atoidejouer/story/keys.py b/atoidejouer/story/keys.py index bb3d7d8..8e22a1b 100644 --- a/atoidejouer/story/keys.py +++ b/atoidejouer/story/keys.py @@ -52,6 +52,7 @@ class StoryKeys(object): _seq_dict[_f] = { '__align': [0, 0], '__duration': 0, + '__loop': False, '__file_type': None, '__key_type': None } @@ -202,6 +203,7 @@ class StoryKeys(object): dict_ = { '__align': [0, 0], '__duration': 0, + '__loop': False, '__file_type': None, '__key_type': None } @@ -337,11 +339,40 @@ class StoryKeys(object): _d = self.get_duration(sequence_name, frame, filename) # inc _d += value + if _d < 0: + _d = 0 + else: + pass # update self.set_duration(sequence_name, frame, filename, _d) # return current pos return _d + def set_loop(self, sequence_name, frame, filename, loop): + # .. get the dict + _f_dict = self.get_filename_dict(sequence_name, frame, filename) + # little check + if _f_dict is None: + return + else: + self.__keys[sequence_name][frame][filename]['__loop'] = loop + + def get_loop(self, sequence_name, frame, filename): + # .. get the dict + _f_dict = self.get_filename_dict(sequence_name, frame, filename) + # little check + if _f_dict is None: + return False + # ensure default + else: + if '__loop' in _f_dict: + return _f_dict['__loop'] + else: + # set default + _f_dict['__loop'] = False + # return default + return False + def set_current(self, sequence_name, frame, filename, file_type='lib', key_type='key'): """ @@ -404,6 +435,7 @@ class StoryKeys(object): self.__keys[sequence_name][_frame][_filename] = { '__align': [0, 0], '__duration': 0, + '__loop': False, '__file_type': None, '__key_type': None } diff --git a/atoidejouer/ui/panel.py b/atoidejouer/ui/panel.py index 4b20247..517d8ce 100644 --- a/atoidejouer/ui/panel.py +++ b/atoidejouer/ui/panel.py @@ -244,7 +244,7 @@ def _on_duration_clicked(widget, panel, value): panel._sequence_name, _activity._thread._time) # do nothing if panel._sequence_name is None: - panel.entry_x.set_text('') + panel.entry_duration.set_text('') elif _filename is None\ or _k_type != 'key'\ or _activity._thread._pause is False: @@ -259,10 +259,39 @@ def _on_duration_clicked(widget, panel, value): panel.screen.timeline.refresh_sequence() # update panel entries panel.entry_duration.set_text('%1d:%02d' % divmod(_d, 60)) + + +def _on_loop_click(toggle, panel, image): + # get current image path + if toggle.get_active() is True: + _path = os.path.join('static', 'icons', 'repeat_grey.png') + else: + _path = os.path.join('static', 'icons', 'repeat.png') + # update image + image.set_from_file(_path) + # shortcut + _activity = panel.screen.toolbar.activity + # get filename + _filename = _get_filename(panel) + # get current + _current, _f_type, _k_type = panel.story_keys.get_current( + panel._sequence_name, _activity._thread._time) + # do nothing + if panel._sequence_name is None: + panel.toggle_loop.set_active(False) + elif _filename is None\ + or _k_type != 'key'\ + or _activity._thread._pause is False: + pass + else: + _loop = toggle.get_active() + # update keys + panel.story_keys.set_loop(panel._sequence_name, + _activity._thread._time, _filename, _loop) # ... - panel.story_keys.ask_clear() - # refresh scene - panel.screen.scene.refresh() + panel.story_keys.refresh(panel._sequence_name) + # refresh timeline + panel.screen.timeline.refresh_sequence() class Panel(gtk.Frame): @@ -652,6 +681,8 @@ class PanelSounds(Panel): Panel.__init__(self, screen) # init commonf fields self.entry_duration = None + self.toggle_loop = None + self.image_loop = None # add specific self._add_frame_sound() # .. common @@ -663,6 +694,7 @@ class PanelSounds(Panel): Panel.clear(self) # .. self.entry_duration.set_text('') + self.toggle_loop.set_active(False) def _get_time(self, value): """Format the time value to display @@ -735,28 +767,19 @@ class PanelSounds(Panel): # return it return _duration_box - def _on_loop_click(self, toggle, event, image): - # get current image path - if toggle.get_active() is True: - _path = os.path.join('static', 'icons', 'repeat.png') - else: - _path = os.path.join('static', 'icons', 'repeat_grey.png') - # update image - image.set_from_file(_path) - - def _get_loop_box(self): + def _init_loop_box(self): # init row _loop_box = gtk.HBox(homogeneous=False, spacing=4) _loop_box.show() # create image - _image = gtk.Image() - _image.show() + self.image_loop = gtk.Image() + self.image_loop.show() # get img path _path = os.path.join('static', 'icons', 'repeat.png') - _image.set_from_file(_path) - _image.set_size_request(48, -1) + self.image_loop.set_from_file(_path) + self.image_loop.set_size_request(48, -1) # add image - _loop_box.pack_start(_image, expand=False, fill=True) + _loop_box.pack_start(self.image_loop, expand=False, fill=True) # create label _label = gtk.Label(_('Repeat')) _label.set_alignment(0, 0.5) @@ -764,13 +787,12 @@ class PanelSounds(Panel): # add label _loop_box.pack_start(_label, expand=True, fill=True) # create checkbox - _button = gtk.ToggleButton() - _button.show() - _button.add(_loop_box) + self.toggle_loop = gtk.ToggleButton() + self.toggle_loop.show() + self.toggle_loop.add(_loop_box) # set cb - _button.connect('button-press-event', self._on_loop_click, _image) - # return it - return _button + self.toggle_loop.connect('toggled', _on_loop_click, self, + self.image_loop) def _add_frame_sound(self): # init frame @@ -793,7 +815,8 @@ class PanelSounds(Panel): # add duration box _in_vbox.pack_start(self._get_duration_box(), expand=False, fill=True) # add loop button - _in_vbox.pack_start(self._get_loop_box(), expand=False, fill=True) + self._init_loop_box() + _in_vbox.pack_start(self.toggle_loop, expand=False, fill=True) def refresh(self, sequence_name=None, update_store=False): # update parent @@ -807,6 +830,18 @@ class PanelSounds(Panel): _d = self.story_keys.get_duration(self._sequence_name, _activity._thread._time, _current) # update panel x y - self.entry_duration.set_text(str(_d)) + self.entry_duration.set_text('%1d:%02d' % divmod(_d, 60)) + # ... + _l = self.story_keys.get_loop(self._sequence_name, + _activity._thread._time, _current) + # ... + self.toggle_loop.set_active(_l) + # get current image path + if _l is True: + _path = os.path.join('static', 'icons', 'repeat_grey.png') + else: + _path = os.path.join('static', 'icons', 'repeat.png') + # update image + self.image_loop.set_from_file(_path) else: pass diff --git a/atoidejouer/ui/preview.py b/atoidejouer/ui/preview.py index 094a9c1..5f108b7 100644 --- a/atoidejouer/ui/preview.py +++ b/atoidejouer/ui/preview.py @@ -276,7 +276,7 @@ class ImagePreview(ItemPreview): def _on_stop(widget, sound_view, filename): # update playing flag - sound_view.playing = not sound_view.playing + sound_view.playing = False # thread update sound_view._thread.pause(stop=True) @@ -298,7 +298,6 @@ def _cb_slider(widget, event, sound_view): if event.type == gtk.gdk.BUTTON_PRESS: sound_view._thread._set_value = False elif event.type == gtk.gdk.BUTTON_RELEASE: - # toolbar.activity._thread.set_time(time_=widget.get_value()) # get time _time = widget.get_value() # udpate thread time @@ -346,14 +345,19 @@ class ThreadPlayer(threading.Thread): self._pause = True # .. self.sound_view.switch_button() + # .. + if self.sound_view._adjustment is None: + return # reset time on stop - if stop is True: + elif stop is True: # reset time self._time = 0 # update slider self.sound_view._adjustment.set_value(0) # stop player self.sound_view.player.stop() + # .. + self.sound_view._slider.set_property('sensitive', False) else: # pause player self.sound_view.player.pause() @@ -362,7 +366,12 @@ class ThreadPlayer(threading.Thread): self._pause = False # pause player self.sound_view.player.play() + # seek player + self.sound_view.player.seek(self._time) + # .. self.sound_view.switch_button() + # .. + self.sound_view._slider.set_property('sensitive', True) def kill(self): # stop player @@ -382,7 +391,10 @@ class ThreadPlayer(threading.Thread): # just in case self._time += self._rate # ... - if self._set_value is True: + if self.sound_view._adjustment is None: + pass + # ... + elif self._set_value is True: self.sound_view._adjustment.set_value(self._time) else: pass @@ -401,6 +413,7 @@ class SoundPreview(ItemPreview): self.player = sound.Player() # .. self._adjustment = None + self._slider = None self._button_play = None self._thread = ThreadPlayer(self) # set on destroy cb @@ -417,7 +430,10 @@ class SoundPreview(ItemPreview): # update image _img.set_from_file(_path) # update button - self._button_play.set_image(_img) + if self._button_play is None: + pass + else: + self._button_play.set_image(_img) def unset_item(self): # call parent @@ -458,18 +474,19 @@ class SoundPreview(ItemPreview): # udpate max self._thread.set_max(_timedelta.seconds) # .. - _hscale = gtk.HScale(self._adjustment) - _hscale.set_draw_value(True) - _hscale.set_digits(False) - _hscale.set_update_policy(gtk.UPDATE_CONTINUOUS) + self._slider = gtk.HScale(self._adjustment) + self._slider.set_draw_value(True) + self._slider.set_digits(False) + self._slider.set_update_policy(gtk.UPDATE_CONTINUOUS) + self._slider.set_property('sensitive', False) # manage cb - _hscale.connect('button-press-event', _cb_slider, self) - _hscale.connect('button-release-event', _cb_slider, self) - _hscale.connect('format-value', _cb_format_value, self) + self._slider.connect('button-press-event', _cb_slider, self) + self._slider.connect('button-release-event', _cb_slider, self) + self._slider.connect('format-value', _cb_format_value, self) # show - _hscale.show() + self._slider.show() # .. - _hbox.pack_start(_hscale, expand=True, fill=True) + _hbox.pack_start(self._slider, expand=True, fill=True) # ... self.pack_start(_ebox_player, expand=False, fill=True) diff --git a/atoidejouer/ui/timeline.py b/atoidejouer/ui/timeline.py index 74636b3..97879f8 100644 --- a/atoidejouer/ui/timeline.py +++ b/atoidejouer/ui/timeline.py @@ -304,16 +304,10 @@ class Timeline(gtk.Frame): # ... _t_children = self._titles_box.children() _k_children = self._keys_box.children() - # DEBUG - logger.debug('[timeline] refresh_sequence - ...') - # DEBUG # ... for _i, _r in enumerate(_t_children): # title row | row - eventbox - button - label _label = _r.children()[0].children()[0].children()[0].get_label() - # DEBUG - logger.debug('[timeline] refresh_sequence - _label: %s' % _label) - # DEBUG # ... for _frame, _c_key in enumerate(_k_children[_i].children()[0]): # ... diff --git a/static/sequences/graphics/blank b/static/sequences/graphics/blank new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/static/sequences/graphics/blank diff --git a/static/sequences/sounds/blank b/static/sequences/sounds/blank new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/static/sequences/sounds/blank |