Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/atoidejouerbeta/ui/panel.py
diff options
context:
space:
mode:
Diffstat (limited to 'atoidejouerbeta/ui/panel.py')
-rw-r--r--atoidejouerbeta/ui/panel.py1025
1 files changed, 1025 insertions, 0 deletions
diff --git a/atoidejouerbeta/ui/panel.py b/atoidejouerbeta/ui/panel.py
new file mode 100644
index 0000000..e124461
--- /dev/null
+++ b/atoidejouerbeta/ui/panel.py
@@ -0,0 +1,1025 @@
+
+# python import
+import logging, os
+# ..
+from functools import partial
+from gettext import gettext as _
+
+# gtk import
+import gobject, gtk, glib
+
+# sugar import
+from sugar.activity import activity
+
+# atoidejouerbeta import
+from atoidejouerbeta.tools import config, image, storage, ui
+
+# get application logger
+logger = logging.getLogger('atoidejouerbeta')
+
+
+def _get_filename(panel):
+ # get model
+ _model = panel.combo_box.get_model()
+ # get iter
+ _iter = panel.combo_box.get_active_iter()
+ # get filename
+ if isinstance(_iter, gtk.TreeIter):
+ return _model.get_value(_iter, 1)
+ else:
+ return None
+
+
+def _on_graphic_combo_changed(combobox, panel):
+ # 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 _filename is None\
+ or _k_type == 'transition'\
+ or _activity._thread._pause is False:
+ return
+ # ...
+ elif _filename == '':
+ # remove key
+ panel.story_keys.remove_filename(panel.sequence_name,
+ _activity._thread._time, _current)
+ # reset current
+ panel.story_keys.set_current(panel.sequence_name,
+ _activity._thread._time, None, file_type=None,
+ key_type=None)
+ elif _current != _filename:
+ # update keys
+ panel.story_keys.set_current(panel.sequence_name,
+ _activity._thread._time, _filename, file_type='lib',
+ key_type='key')
+ # ..
+ if panel.screen.toolbar.name == 'graphics':
+ # get previous align
+ _prev_align = panel.story_keys.get_previous_align(
+ panel.sequence_name, _activity._thread._time)
+ # set align
+ panel.story_keys.set_align(panel.sequence_name,
+ _activity._thread._time, _filename, _prev_align)
+ else:
+ pass
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+ # refresh scene
+ panel.screen.scene.refresh(sequence_name=panel.sequence_name)
+
+
+def _on_position_clicked(widget, panel, move, value):
+ # 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 _filename is None\
+ or _k_type != 'key'\
+ or _activity._thread._pause is False:
+ pass
+ else:
+ # update keys
+ _x, _y = panel.story_keys.inc_position(panel.sequence_name,
+ _activity._thread._time, _filename, move, value)
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+ # update panel entries
+ panel.entry_x.set_text(str(_x))
+ panel.entry_y.set_text(str(-_y))
+ # refresh scene
+ panel.screen.scene.refresh(sequence_name=panel.sequence_name)
+
+
+def _on_layout_clicked(widget, panel, move):
+ # shortcut
+ _activity = panel.screen.toolbar.activity
+ # get current layout
+ _layout = panel.story_keys.get_layout(panel.sequence_name)
+ _max_layout = panel.story_keys.get_max_layout()
+ # do nothing
+ if _activity._thread._pause is False:
+ return
+ # layout factory
+ elif move == 'move_up_up':
+ _layout = _max_layout
+ elif move == 'move_up':
+ _layout = (_layout + 1) if _layout < _max_layout else _max_layout
+ elif move == 'move_down':
+ _layout = (_layout - 1) if _layout > 0 else 0
+ elif move == 'move_down_down':
+ _layout = 0
+ else:
+ # ??
+ return
+ # ..
+ panel.story_keys.set_layout(panel.sequence_name, _layout)
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+ # update entry
+ panel.entry_layout.set_text(str(_layout))
+ # refresh scene
+ panel.screen.scene.refresh()
+ # reorder timeline
+ panel.screen.timeline.reorder()
+
+
+def _on_time_clicked(widget, panel, value):
+ # little check
+ if hasattr(panel, 'time_entry')\
+ or panel.time_entry is None:
+ pass
+ else:
+ return False
+ # shortcut
+ _activity = panel.screen.toolbar.activity
+ # get current
+ _current, _f_type, _k_type = panel.story_keys.get_current(
+ panel.sequence_name, _activity._thread._time)
+ # little check
+ if panel.sequence_name is None:
+ return panel.time_entry.set_text('')
+ # do nothing
+ elif _k_type == 'transition'\
+ or _activity._thread._pause is False:
+ return
+ else:
+ _previous_frame = _activity._thread._time
+ # time factory
+ _new_frame = _previous_frame + value
+ _new_frame = 0 if _new_frame < 0 else _new_frame
+ # entry update
+ panel.time_entry.set_text('%1d:%02d' % divmod(_new_frame, 60))
+ # update keys
+ panel.story_keys.set_frame(panel.sequence_name, _previous_frame,
+ _new_frame)
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+ # set activity new number of keys
+ _activity.update_number_of_keys()
+ # update thread time
+ _activity._thread.set_time(time_=_new_frame)
+ # restore current
+ panel.screen.timeline.set_active_sequence(panel.sequence_name)
+
+
+def _on_remove_sequence_clicked(widget, panel):
+ # shortcut
+ _activity = panel.screen.toolbar.activity
+ # clear keys
+ panel.story_keys.remove_sequence(panel.sequence_name)
+ # reorder timeline
+ panel.screen.timeline.remove_sequence(panel.sequence_name)
+ # ..
+ panel.clear()
+ # ...
+ panel.story_keys.ask_clear()
+ # refresh scene
+ panel.screen.scene.refresh()
+
+
+def _on_remove_key_clicked(widget, panel):
+ # shortcut
+ _activity = panel.screen.toolbar.activity
+ # get current
+ _current, _f_type, _k_type = panel.story_keys.get_current(
+ panel.sequence_name, _activity._thread._time)
+ # ..
+ if _k_type is None:
+ pass
+ elif _k_type != 'key':
+ return
+ # remove key
+ panel.story_keys.remove_filename(panel.sequence_name,
+ _activity._thread._time, _current)
+ # reset current
+ panel.story_keys.set_current(panel.sequence_name,
+ _activity._thread._time, None, file_type=None,
+ key_type=None)
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+ # ...
+ panel.story_keys.ask_clear()
+ # refresh scene
+ panel.screen.scene.refresh()
+ # .. and reset panel
+ panel.refresh()
+
+
+def _on_duration_clicked(widget, panel, value):
+ # 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.entry_duration.set_text('')
+ elif _filename is None\
+ or _k_type != 'key'\
+ or _activity._thread._pause is False:
+ pass
+ else:
+ # update keys
+ _d = panel.story_keys.inc_duration(panel.sequence_name,
+ _activity._thread._time, _filename, value)
+ # ...
+ panel.story_keys.refresh(panel.sequence_name)
+ # refresh timeline
+ 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):
+ # update 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
+ # 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.refresh(panel.sequence_name)
+ # refresh timeline
+ panel.screen.timeline.refresh_sequence()
+
+
+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
+ # get rate
+ _rate = config.Config().get_rate_value()
+ # 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
+
+
+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
+ # get rate
+ _rate = config.Config().get_rate_value()
+ # previous time
+ _previous = _time - factor * _rate
+ # ..
+ if _previous < 0:
+ # return min
+ return 0
+ else:
+ # ok
+ return _previous
+
+
+def _on_key_press(widget, event, panel):
+ # ..
+ if isinstance(panel, Panel):
+ # ..
+ _keyval = event.keyval
+ _name = gtk.gdk.keyval_name(_keyval)
+ _mod = gtk.accelerator_get_label(_keyval, event.state)
+ # ..
+ if panel.screen != panel.screen.toolbar.activity.get_current_screen():
+ return
+ # key factory
+ elif panel.screen.toolbar.name == 'graphics':
+ # POSITION
+ if _name == 'Left' and _mod.startswith('Ctrl+'): # big left
+ _on_position_clicked(widget, panel, 'x', -10)
+ elif _name == 'Left': # left
+ _on_position_clicked(widget, panel, 'x', -1)
+ elif _name == 'Right' and _mod.startswith('Ctrl+'): # big right
+ _on_position_clicked(widget, panel, 'x', 10)
+ elif _name == 'Right': # right
+ _on_position_clicked(widget, panel, 'x', 1)
+ elif _name == 'Up' and _mod.startswith('Ctrl+'): # big top
+ _on_position_clicked(widget, panel, 'y', -10)
+ elif _name == 'Up': # top
+ _on_position_clicked(widget, panel, 'y', -1)
+ elif _name == 'Down' and _mod.startswith('Ctrl+'): # big bottom
+ _on_position_clicked(widget, panel, 'y', 10)
+ elif _name == 'Down': # bottom
+ _on_position_clicked(widget, panel, 'y', 1)
+ # LAYOUT
+ elif _name == 'Page_Up' and _mod.startswith('Ctrl+'):
+ _on_layout_clicked(widget, panel, 'move_up_up')
+ elif _name == 'Page_Up':
+ _on_layout_clicked(widget, panel, 'move_up')
+ elif _name == 'Page_Down' and _mod.startswith('Ctrl+'):
+ _on_layout_clicked(widget, panel, 'move_down_down')
+ elif _name == 'Page_Down':
+ _on_layout_clicked(widget, panel, 'move_down')
+ # TIME
+ elif _name == 'plus' and _mod.startswith('Ctrl+'):
+ _on_time_clicked(widget, panel, 10)
+ elif _name == 'plus':
+ _on_time_clicked(widget, panel, 1)
+ elif _name == 'minus' and _mod.startswith('Ctrl+'):
+ _on_time_clicked(widget, panel, -10)
+ elif _name == 'minus':
+ _on_time_clicked(widget, panel, -1)
+ # DELETE
+ elif _name == 'BackSpace' and _mod.startswith('Ctrl+'):
+ _on_remove_sequence_clicked(widget, panel)
+ elif _name == 'BackSpace':
+ _on_remove_key_clicked(widget, panel)
+ # IMAGE
+ # TODO ...
+ elif panel.screen.toolbar.name == 'sounds':
+ pass
+ else:
+ pass
+ # IN EVERY CASE
+ if panel.screen.toolbar.name in ['graphics', 'sounds', 'story']:
+ # shortcut
+ _thread = panel.screen.toolbar.activity._thread
+ # ..
+ if _name == 'space': # play right
+ #
+ _time = _get_next_time(panel, 1)
+ #
+ _thread.set_time(time_=_time, pause=True)
+ elif _name == 'space' and _mod.startswith('Ctrl+'): # play left
+ #
+ _time = _get_previous_time(panel, 1)
+ #
+ _thread.set_time(time_=_time, pause=True)
+ # PLAY
+ elif _name == 'Return':
+ # ..
+ if _thread._pause is True:
+ panel.screen.toolbar.play()
+ _thread.play()
+ # ..
+ else:
+ panel.screen.toolbar.pause()
+ _thread.pause()
+ else:
+ pass
+ # avoid propagation for rendering issue
+ widget.emit_stop_by_name('key-press-event')
+ # ..
+ return False
+ else:
+ return False
+ else:
+ return False
+
+
+class Panel(gtk.Frame):
+
+ def __init__(self, screen):
+ # init parent
+ gtk.Frame.__init__(self)
+ self.set_shadow_type(gtk.SHADOW_NONE)
+ # set screen
+ self.screen = screen
+ # ..
+ if screen.toolbar.name == 'graphics':
+ self.story_keys = self.screen.toolbar.activity.graphic_keys
+ else:
+ self.story_keys = self.screen.toolbar.activity.sound_keys
+ # get mode
+ self._mode = config.Config().get('activity>mode')
+ self._conf = config.Config().get('mode>%s' % self._mode, type_=list)
+ # ...
+ self.set_size_request(298, screen.scene._screen_height)
+ # do show
+ self.show()
+ # init vars
+ self._store = None
+ self.sequence_name = None
+ # ..
+ self.combo_box = None
+ self.time_entry = None
+ # add vbox to the panel for sub frames
+ self.main_box = gtk.VBox(homogeneous=False, spacing=0)
+ # do show
+ self.main_box.show()
+ # add it to the panel
+ self.add(self.main_box)
+ # ..
+ self.__init_handler()
+
+ def __init_handler(self):
+ # shortcuts
+ _activity = self.screen.toolbar.activity
+ _handler_id = _activity._handler_id
+ if _handler_id is None:
+ pass
+ else:
+ _activity.disconnect(_handler_id)
+ # ..
+ _activity._handler_id = _activity.connect('key-press-event',
+ _on_key_press, self)
+
+ def _init_sequence_box(self):
+ # update store
+ self.update_store()
+ # init combo
+ self.combo_box = gtk.ComboBox(model=self._store)
+ # set tooltip
+ self.combo_box.set_tooltip_text(_('Choose a Sequence Item'))
+ # set renderers
+ _cell_pix = gtk.CellRendererPixbuf()
+ _cell_pix.set_property('width', 48)
+ _cell_pix.set_property('height', 36)
+ # ..
+ self.combo_box.pack_start(_cell_pix, expand=False)
+ self.combo_box.add_attribute(_cell_pix, 'pixbuf', 0)
+ # ..
+ _cell_text = gtk.CellRendererText()
+ _cell_text.set_property('xpad', 4)
+ _cell_text.set_property('yalign', 0.5)
+ # ..
+ self.combo_box.pack_start(_cell_text, expand=True)
+ self.combo_box.add_attribute(_cell_text, 'text', 1)
+
+ def clear(self):
+ self.sequence_name = None
+ self.time_entry.set_text('')
+ self.update_store()
+
+ def _get_pixbuf(self, graphic_name, dir_='graphics'):
+ # get the image path
+ _graphic_path = storage.get_image_path(graphic_name, dir_=dir_)
+ # return pix and path
+ return image.get_pixbuf(_graphic_path, 48, 36), _graphic_path
+
+ def update_store(self):
+ # init store
+ if self._store is None:
+ self._store = gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING,
+ gobject.TYPE_PYOBJECT)
+ else:
+ self._store.clear()
+
+ def refresh(self, sequence_name=None, update_store=False):
+ pass
+
+ def _refresh(self, type_, sequence_name=None, update_store=False):
+ # keep older if not specified
+ if sequence_name is None:
+ pass
+ else:
+ self.sequence_name = sequence_name
+ # update store
+ if update_store is True:
+ self.update_store()
+ else:
+ pass
+ # prepare dir path
+ _seq_path = os.path.join(activity.get_activity_root(), 'data',
+ 'sequences', type_, '%s.seq' % self.sequence_name)
+ # little check
+ if os.path.exists(_seq_path):
+ _activity = self.screen.toolbar.activity
+ # ..
+ _current, _f_type, _k_type = self.story_keys.get_current(
+ self.sequence_name, _activity._thread._time)
+ # get sound names
+ _items = storage.get_sequence_items(_seq_path)
+ # get combo box active
+ if _current in _items:
+ _active = _items.index(_current) + 1
+ else:
+ _active = 0
+ # update combobox
+ self.combo_box.set_active(_active)
+ else:
+ _current = None
+ # shortcut
+ _activity = self.screen.toolbar.activity
+ # time entry update
+ if self.time_entry is None:
+ pass
+ else:
+ self.time_entry.set_text(
+ '%1d:%02d' % divmod(_activity._thread._time, 60))
+ # ..
+ return _seq_path, _current
+
+ def __get_time_button(self, name, value, tooltip_text):
+ # init button
+ _button = ui.get_button(stock_id=name)
+ # set tooltip
+ _button.set_tooltip_text(tooltip_text)
+ # set cb
+ _button.connect('clicked', _on_time_clicked, self, value)
+ # ..
+ return _button
+
+ def add_frame_time(self):
+ # init frame
+ _frame_time = gtk.Frame(label=_('Time'))
+ _frame_time.set_border_width(1)
+ # do show
+ _frame_time.show()
+ # do add
+ self.main_box.pack_start(_frame_time, expand=False, fill=True)
+ # get over/under spin buttons
+ _time_box = gtk.HBox(homogeneous=False, spacing=4)
+ _time_box.set_border_width(4)
+ _time_box.show()
+ # before ..
+ _time_box.pack_start(self.__get_time_button('go_left', -10,
+ _('Play Before (10 Frames)')), expand=False, fill=True)
+ _time_box.pack_start(self.__get_time_button('go_left_small', -1,
+ _('Play Before (1 Frames)')), expand=False, fill=True)
+ # entry
+ self.time_entry = gtk.Entry()
+ # show
+ self.time_entry.show()
+ # set value - should be a string
+ self.time_entry.set_text('')
+ self.time_entry.set_alignment(1)
+ self.time_entry.set_property('editable', False)
+ # add entry
+ _time_box.pack_start(self.time_entry, expand=True, fill=True)
+ # .. after
+ _time_box.pack_start(self.__get_time_button('go_right_small', 1,
+ _('Play After (1 Frames)')), expand=False, fill=True)
+ _time_box.pack_start(self.__get_time_button('go_right', 10,
+ _('Play After (10 Frames)')), expand=False, fill=True)
+ # do add
+ _frame_time.add(_time_box)
+
+ def add_frame_remove(self):
+ # init frame
+ _frame_remove = gtk.Frame(label=_('Remove'))
+ _frame_remove.set_border_width(1)
+ # do show
+ _frame_remove.show()
+ # do add
+ self.main_box.pack_start(_frame_remove, expand=False, fill=True)
+ # init container
+ _in_vbox = gtk.HBox(homogeneous=True, spacing=4)
+ _in_vbox.set_border_width(4)
+ # show
+ _in_vbox.show()
+ # do add
+ _frame_remove.add(_in_vbox)
+ # prepare remove sequence button
+ _rm_seq_button = ui.get_button(label=_('Sequence'),
+ stock_id='remove_sequence', width=48, padding=(8, 0))
+ _rm_seq_button.set_tooltip_text(_('Remove Sequence'))
+ # set cb
+ _rm_seq_button.connect('clicked', _on_remove_sequence_clicked, self)
+ # get remove sequence button
+ _in_vbox.pack_start(_rm_seq_button, expand=False, fill=True)
+ # prepare remove sequence button
+ _rm_key_button = ui.get_button(label=_('Key'),
+ stock_id='remove_item', width=48, padding=(12, 0))
+ _rm_key_button.set_tooltip_text(_('Remove Key'))
+ # set cb
+ _rm_key_button.connect('clicked', _on_remove_key_clicked, self)
+ # get remove image button
+ _in_vbox.pack_start(_rm_key_button, expand=False, fill=True)
+
+
+class PanelGraphics(Panel):
+
+ def __init__(self, screen):
+ # init parent
+ Panel.__init__(self, screen)
+ # main vars
+ self.entry_layout = None
+ # ..
+ self.entry_x = None
+ self.entry_y = None
+ # add specific
+ if 'image' in self._conf:
+ self._add_frame_image()
+ else:
+ pass
+ if 'position' in self._conf:
+ self._add_frame_position()
+ else:
+ pass
+ # .. common
+ if 'time' in self._conf:
+ self.add_frame_time()
+ else:
+ pass
+ # ..
+ if 'remove' in self._conf:
+ self.add_frame_remove()
+ else:
+ pass
+
+ def clear(self):
+ # clear parent
+ Panel.clear(self)
+ # ..
+ self.entry_layout.set_text('')
+ self.entry_x.set_text('')
+ self.entry_y.set_text('')
+
+ def refresh(self, sequence_name=None, update_store=False):
+ # shortcut
+ _activity = self.screen.toolbar.activity
+ # update parent
+ _seq_path, _current = Panel._refresh(self, 'graphics',
+ sequence_name=sequence_name, update_store=update_store)
+ # little check
+ if os.path.exists(_seq_path):
+ # get current layout
+ _layout = self.story_keys.get_layout(self.sequence_name)
+ # update layout
+ self.entry_layout.set_text(str(_layout))
+ # get current x and y
+ _x, _y = self.story_keys.get_align(self.sequence_name,
+ _activity._thread._time, _current)
+ # update panel x
+ if self.entry_x is None:
+ pass
+ else:
+ self.entry_x.set_text(str(_x))
+ # update panel y
+ if self.entry_y is None:
+ pass
+ else:
+ self.entry_y.set_text(str(-_y))
+ else:
+ pass
+
+ def update_store(self):
+ # init parent
+ Panel.update_store(self)
+ # prepare dir path
+ _seq_path = os.path.join(activity.get_activity_root(), 'data',
+ 'sequences', 'graphics', '%s.seq' % self.sequence_name)
+ # little check
+ if os.path.exists(_seq_path):
+ # get graphic names
+ _items = storage.get_sequence_items(_seq_path)
+ # add dummy row
+ _dummy_pix, _path = self._get_pixbuf('blank', dir_='data')
+ self._store.append([_dummy_pix, '', None])
+ # for each graphics
+ for _filename in _items:
+ # prepare pixbuf
+ _pixbuf, _path = self._get_pixbuf(_filename)
+ # do update
+ self._store.append([_pixbuf, _filename, _path])
+ # not exist .. clear
+ else:
+ self._store.clear()
+
+ def _init_sequence_box(self):
+ # ..
+ Panel._init_sequence_box(self)
+ # set callback
+ self.combo_box.connect('changed', _on_graphic_combo_changed, self)
+
+ def __get_layout_button(self, name, tooltip_text):
+ # init button
+ _button = ui.get_button(stock_id=name)
+ # set tooltip
+ _button.set_tooltip_text(tooltip_text)
+ # set cb
+ _button.connect('clicked', _on_layout_clicked, self, name)
+ # ..
+ return _button
+
+ def _add_frame_image(self):
+ # init frame
+ _frame_sequence = gtk.Frame(label=_('Image'))
+ _frame_sequence.set_border_width(1)
+ # do show
+ _frame_sequence.show()
+ # do add
+ self.main_box.pack_start(_frame_sequence, expand=False, fill=True)
+ # vbox for the frame
+ _in_vbox = gtk.VBox(homogeneous=False, spacing=4)
+ _in_vbox.set_border_width(4)
+ # do show
+ _in_vbox.show()
+ # do add
+ _frame_sequence.add(_in_vbox)
+ # init
+ self._init_sequence_box()
+ # add row sequence
+ _in_vbox.pack_start(self.combo_box, expand=False, fill=True)
+ # get over/under spin buttons
+ _layer_box = gtk.HBox(homogeneous=True, spacing=4)
+ _layer_box.show()
+ # down ..
+ _layer_box.pack_start(self.__get_layout_button('move_down_down',
+ _('Layer to Bottom')), expand=False, fill=True)
+ _layer_box.pack_start(self.__get_layout_button('move_down',
+ _('Lower Layer')), expand=False, fill=True)
+ # entry
+ self.entry_layout = gtk.Entry()
+ # show
+ self.entry_layout.show()
+ # set value - should be a string
+ self.entry_layout.set_text("")
+ self.entry_layout.set_alignment(1)
+ self.entry_layout.set_property('editable', False)
+ # add entry
+ _layer_box.pack_start(self.entry_layout, expand=False, fill=True)
+ # .. up
+ _layer_box.pack_start(self.__get_layout_button('move_up',
+ _('Raise Layer')), expand=False, fill=True)
+ _layer_box.pack_start(self.__get_layout_button('move_up_up',
+ _('Layer to Top')), expand=False, fill=True)
+ # add row sequence
+ _in_vbox.pack_start(_layer_box, expand=True, fill=True)
+
+ def __get_position_button(self, name, move, value, tooltip_text):
+ # init button
+ _button = ui.get_button(stock_id=name)
+ # set tooltip
+ _button.set_tooltip_text(tooltip_text)
+ # set cb
+ _button.connect('clicked', _on_position_clicked, self, move, value)
+ # ..
+ return _button
+
+ def _add_frame_position(self):
+ # init frame
+ _frame_position = gtk.Frame(label=_('Position'))
+ _frame_position.set_border_width(1)
+ # do show
+ _frame_position.show()
+ # do add
+ self.main_box.pack_start(_frame_position, expand=False, fill=True)
+ # _vbox
+ _in_vbox = gtk.VBox(homogeneous=False, spacing=4)
+ _in_vbox.set_border_width(4)
+ _in_vbox.show()
+ # first _row
+ _in_vbox.pack_start(self.__get_position_button('y_up_up', 'y', -10,
+ _('Move Up by 10%')), expand=False, fill=False)
+ # second _row
+ _in_vbox.pack_start(self.__get_position_button('y_up', 'y', -1,
+ _('Move Up by 1%')), expand=False, fill=False)
+ # third _row
+ _row3 = gtk.HBox(homogeneous=False, spacing=4)
+ _row3.show()
+ _row3.pack_start(self.__get_position_button('x_left_left', 'x', -10,
+ _('Move Left by 10%')), expand=False, fill=True)
+ _row3.pack_start(self.__get_position_button('x_left', 'x', -1,
+ _('Move Left by 1%')), expand=False, fill=True)
+ # prepare middle box
+ _middle_box = gtk.VBox(homogeneous=True, spacing=4)
+ _middle_box.show()
+ # get entries
+ _entry_box_x = ui.get_entry(label='X')
+ _entry_box_y = ui.get_entry(label='Y')
+ # update main vars
+ self.entry_x = _entry_box_x.get_children()[1]
+ self.entry_y = _entry_box_y.get_children()[1]
+ # add entries to the box
+ _middle_box.pack_start(_entry_box_x, expand=False, fill=True)
+ _middle_box.pack_start(_entry_box_y, expand=False, fill=True)
+ _middle_box.set_size_request(64, -1)
+ # add the box to the row
+ _row3.pack_start(_middle_box, expand=True, fill=True)
+ # ..
+ _row3.pack_start(self.__get_position_button('x_right', 'x', 1,
+ _('Move Right by 1%')), expand=False, fill=True)
+ _row3.pack_start(self.__get_position_button('x_right_right', 'x', 10,
+ _('Move Right by 10%')), expand=False, fill=True)
+ # and add the third row
+ _in_vbox.pack_start(_row3, expand=False, fill=False)
+ # fourth _row
+ _in_vbox.pack_start(self.__get_position_button('y_down', 'y', 1,
+ _('Move Down by 1%')), expand=False, fill=False)
+ # fifth _row
+ _in_vbox.pack_start(self.__get_position_button('y_down_down', 'y', 10,
+ _('Move Down by 10%')), expand=False, fill=False)
+ # put it in
+ _frame_position.add(_in_vbox)
+
+
+class PanelSounds(Panel):
+
+ def __init__(self, screen):
+ # init parent
+ Panel.__init__(self, screen)
+ # init commonf fields
+ self.entry_duration = None
+ self.toggle_loop = None
+ self.image_loop = None
+ # add specific
+ if 'sound' in self._conf:
+ self._add_frame_sound()
+ else:
+ pass
+ # .. common
+ if 'time' in self._conf:
+ self.add_frame_time()
+ else:
+ pass
+ # ..
+ if 'remove' in self._conf:
+ self.add_frame_remove()
+ else:
+ pass
+
+
+ def clear(self):
+ # clear parent
+ 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
+ """
+ # return formated value
+ return '%1d:%02d' % divmod(value, 60)
+
+ def update_store(self):
+ # init parent
+ Panel.update_store(self)
+ # prepare dir path
+ _seq_path = os.path.join(activity.get_activity_root(), 'data',
+ 'sequences', 'sounds', '%s.seq' % self.sequence_name)
+ # little check
+ if os.path.exists(_seq_path):
+ # get graphic names
+ _items = storage.get_sequence_items(_seq_path)
+ # add dummy row
+ _dummy_pix, _path = self._get_pixbuf('blank', dir_='data')
+ self._store.append([_dummy_pix, '', None])
+ # for each graphics
+ for _filename in _items:
+ # prepare pixbuf
+ _pixbuf, _path = self._get_pixbuf('sound', dir_='data')
+ # do update
+ self._store.append([_pixbuf, _filename, _path])
+ # not exist .. clear
+ else:
+ self._store.clear()
+
+ def _init_sequence_box(self):
+ # ..
+ Panel._init_sequence_box(self)
+ # set callback
+ self.combo_box.connect('changed', _on_graphic_combo_changed, self)
+
+ def __get_duration_button(self, name, value, tooltip_text):
+ # init button
+ _button = ui.get_button(stock_id=name)
+ # ..
+ _button.set_tooltip_text(tooltip_text)
+ # set cb
+ _button.connect('clicked', _on_duration_clicked, self, value)
+ # ..
+ return _button
+
+ def _get_duration_box(self):
+ # get less/more spin buttons
+ _duration_box = gtk.HBox(homogeneous=True, spacing=4)
+ _duration_box.show()
+ # down ..
+ _duration_box.pack_start(self.__get_duration_button('less', -10,
+ _('Duration -10s')), expand=False, fill=True)
+ _duration_box.pack_start(self.__get_duration_button('less_small', -1,
+ _('Duration -1s')), expand=False, fill=True)
+ # entry
+ self.entry_duration = gtk.Entry()
+ # show
+ self.entry_duration.show()
+ # set value - should be a string
+ self.entry_duration.set_text('') # self._get_time(0)
+ self.entry_duration.set_alignment(1)
+ self.entry_duration.set_property('editable', False)
+ self.entry_duration.set_size_request(64, -1)
+ # add entry
+ _duration_box.pack_start(self.entry_duration, expand=False, fill=True)
+ # .. up
+ _duration_box.pack_start(self.__get_duration_button('more_small', 1,
+ _('Duration +1s')), expand=False, fill=True)
+ _duration_box.pack_start(self.__get_duration_button('more', 10,
+ _('Duration +10s')), expand=False, fill=True)
+ # return it
+ return _duration_box
+
+ def _init_loop_box(self):
+ # init row
+ _loop_box = gtk.HBox(homogeneous=False, spacing=4)
+ _loop_box.show()
+ # create image
+ self.image_loop = gtk.Image()
+ self.image_loop.show()
+ # get img path
+ self.image_loop.set_from_file(storage.get_icon_path('repeat'))
+ self.image_loop.set_size_request(48, -1)
+ # add image
+ _loop_box.pack_start(self.image_loop, expand=False, fill=True)
+ # create label
+ _label = gtk.Label(_('Repeat'))
+ _label.set_alignment(0, 0.5)
+ _label.show()
+ # add label
+ _loop_box.pack_start(_label, expand=True, fill=True)
+ # create checkbox
+ self.toggle_loop = gtk.ToggleButton()
+ # set tooltip
+ self.toggle_loop.set_tooltip_text(_('Loop (On/Off)'))
+ # ..
+ self.toggle_loop.show()
+ self.toggle_loop.add(_loop_box)
+ # set cb
+ self.toggle_loop.connect('toggled', _on_loop_click, self,
+ self.image_loop)
+
+ def _add_frame_sound(self):
+ # init frame
+ _frame_sound = gtk.Frame(label=_('Sound'))
+ _frame_sound.set_border_width(1)
+ # do show
+ _frame_sound.show()
+ # do add
+ self.main_box.pack_start(_frame_sound, expand=False, fill=True)
+ # vbox for the fram
+ _in_vbox = gtk.VBox(homogeneous=False, spacing=4)
+ _in_vbox.set_border_width(4)
+ # do show
+ _in_vbox.show()
+ # do add
+ _frame_sound.add(_in_vbox)
+ # add row sequence
+ self._init_sequence_box()
+ _in_vbox.pack_start(self.combo_box, expand=False, fill=True)
+ # add duration box
+ _in_vbox.pack_start(self._get_duration_box(), expand=False, fill=True)
+ # add loop button
+ 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
+ _seq_path, _current = Panel._refresh(self, 'sounds',
+ sequence_name=sequence_name, update_store=update_store)
+ # little check
+ if os.path.exists(_seq_path):
+ # shortcut
+ _activity = self.screen.toolbar.activity
+ if self.entry_duration is None:
+ pass
+ else:
+ # get current x and y
+ _d = self.story_keys.get_duration(self.sequence_name,
+ _activity._thread._time, _current)
+ # update panel x y
+ 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)
+ # update image
+ _stock_id = 'repeat_grey' if _l is True else 'repeat'
+ self.image_loop.set_from_file(storage.get_icon_path(_stock_id))
+ else:
+ pass