Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/atoidejouerbeta/ui/timeline.py
diff options
context:
space:
mode:
Diffstat (limited to 'atoidejouerbeta/ui/timeline.py')
-rw-r--r--atoidejouerbeta/ui/timeline.py404
1 files changed, 404 insertions, 0 deletions
diff --git a/atoidejouerbeta/ui/timeline.py b/atoidejouerbeta/ui/timeline.py
new file mode 100644
index 0000000..d8fbb81
--- /dev/null
+++ b/atoidejouerbeta/ui/timeline.py
@@ -0,0 +1,404 @@
+
+# python import
+import logging, os
+# ..
+from functools import partial
+from gettext import gettext as _
+
+# gtk import
+import gtk, glib
+
+# atoidejouerbeta import
+from atoidejouerbeta.tools import storage, ui
+
+# get application logger
+logger = logging.getLogger('atoidejouerbeta')
+
+
+def _on_title_clicked(widget, timeline, sequence_name):
+ # .. do update
+ timeline.set_active_sequence(sequence_name)
+
+
+def _on_key_clicked(widget, timeline, sequence_name, frame):
+ # shortcut
+ # timeline.story_keys.ask_clear()
+ # update time and scene
+ timeline.screen.toolbar.activity._thread.set_time(time_=frame)
+ # do timeline update
+ if timeline.screen.panel.sequence_name == sequence_name:
+ pass
+ else:
+ timeline.set_active_sequence(sequence_name)
+
+
+class Timeline(gtk.Frame):
+
+ def __init__(self, screen):
+ # init parent
+ gtk.Frame.__init__(self)
+ self.set_shadow_type(gtk.SHADOW_NONE)
+ self.set_size_request(-1, 236)
+ # do show
+ self.show()
+ # keep the screen
+ self.screen = screen
+ self.hadjustment = None
+ self.vadjustment = gtk.Adjustment(0, 0, 1, 1)
+ # tmp
+ _s = self.screen
+ self._viewport_width = _s.scene._screen_width - 120
+ self._current_keys = dict()
+ self._number_of_keys = self._get_number_of_keys()
+ # prepare scrolled window
+ self.scrolled_window = gtk.ScrolledWindow(vadjustment=self.vadjustment)
+ self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
+ self.scrolled_window.show()
+ # ..
+ self.add(self.scrolled_window)
+ # ..
+ if self.screen.toolbar.name == 'graphics':
+ self.story_keys = self.screen.toolbar.activity.graphic_keys
+ else:
+ self.story_keys = self.screen.toolbar.activity.sound_keys
+ # ..
+ self._main_hbox = None
+ self._titles_box = None
+ self._keys_box = None
+ # ..
+ self.__init_rows()
+
+ def __init_rows(self):
+ # ..
+ if self._main_hbox is None:
+ pass
+ else:
+ self._main_hbox.destroy()
+ # a box
+ self._main_hbox = gtk.HBox(homogeneous=False, spacing=0)
+ # show it
+ self._main_hbox.show()
+ # ..
+ self.scrolled_window.add_with_viewport(self._main_hbox)
+ # init main vars
+ if self._titles_box is None:
+ pass
+ else:
+ self._titles_box.destroy()
+ # init main vars
+ if self._keys_box is None:
+ pass
+ else:
+ self._keys_box.destroy()
+ # ..
+ self._titles_box = None
+ self._init_titles_box()
+ # ..
+ self._keys_box = None
+ self._init_keys_box()
+
+ def set_active_sequence(self, sequence_name):
+ # get viewport
+ _t_rows = self._titles_box.get_children()
+ # get viewport
+ _k_rows = self._keys_box.get_children()
+ # ..
+ _c1 = ui.get_color(0.92, 0.92, 0.92)
+ _c2 = ui.get_color(0.8, 0.8, 0.8)
+ # ...
+ for _i, _r in enumerate(_t_rows):
+ # title row | row - eventbox - button - label
+ _label = _r.get_children()[0].get_children()[0].get_children()[1]
+ # prepare color
+ _c = _c1 if _label.get_label() == sequence_name else _c2
+ # update row color
+ _r.modify_bg(gtk.STATE_NORMAL, _c)
+ _k_rows[_i].modify_bg(gtk.STATE_NORMAL, _c)
+ # update panel at the end
+ self.screen.panel.refresh(sequence_name=sequence_name,
+ update_store=True)
+
+ def _get_number_of_keys(self):
+ """shortcut ..
+ """
+ return self.screen.toolbar.activity._number_of_keys
+
+ def _get_number_of_rows(self):
+ """shortcut ..
+ """
+ return len(self._titles_box.get_children())
+
+ def _add_title(self, sequence_name):
+ # screen name
+ _screen_name = self.screen.toolbar.name.replace('_add', '')
+ # get first image name
+ _img_name = storage.get_sequence_first_graphic_name(_screen_name,
+ sequence_name)
+ # get button
+ _title = ui.get_button(label=sequence_name, img_name=_img_name,
+ width=0, padding=(4, 0), img_size=(16, 16))
+ # _title.set_size_request(-1, 28)
+ # set color
+ _title.modify_bg(gtk.STATE_NORMAL, ui.get_color(0.3, 0.5, 0.6)) # TODO manage common colors like a theme
+ # _title.modify_bg(gtk.STATE_PRELIGHT, ui.get_color(0.5, 0.7, 0.8)) # TODO manage common colors like a theme
+ # get row number
+ _row_number = self._get_number_of_rows()
+ # add simple cb
+ _title.connect('released', _on_title_clicked, self, sequence_name)
+ # to manage color
+ _e_box = gtk.EventBox()
+ # show
+ _e_box.show()
+ # ..
+ _e_box.modify_bg(gtk.STATE_NORMAL, ui.get_color(0.8, 0.8, 0.8)) # TODO manage common colors like a theme
+ # add it
+ _e_box.add(_title)
+ # add it
+ self._titles_box.pack_start(_e_box, expand=False, fill=True)
+
+ def _add_keys(self, sequence_name):
+ # default row color
+ _c = ui.get_color(0.8, 0.8, 0.8)
+ # to manage color
+ _e_box = gtk.EventBox()
+ # show
+ _e_box.show()
+ # ..
+ _e_box.modify_bg(gtk.STATE_NORMAL, _c)
+ # init row
+ _row = gtk.HBox(homogeneous=False, spacing=1)
+ # show
+ _row.show()
+ # add it
+ _e_box.add(_row)
+ # ..
+ for _x in range(self._get_number_of_keys()):
+ # to manage color
+ _e = gtk.EventBox()
+ # show
+ _e.show()
+ # ..
+ _e.set_visible_window(False)
+ # get button
+ _b = ui.get_button(label='', width=24) # label='%s' % _x
+ # add simple cb
+ _b.connect('released', _on_key_clicked, self, sequence_name, _x)
+ # add to event box
+ _e.add(_b)
+ # set color
+ _b.modify_bg(gtk.STATE_NORMAL, _c)
+ # add to the row
+ _row.pack_start(_e, expand=False, fill=True)
+ # add it
+ self._keys_box.pack_start(_e_box, expand=False, fill=True)
+
+ def _refresh_row_keys(self, row, time_, color):
+ #
+ _r_e_box = row.get_children()[0]
+ # get cells
+ _cells = _r_e_box.get_children()
+ _c_idx = int(time_)
+ # ..
+ for _i, _c in enumerate(_cells):
+ if _i == _c_idx:
+ pass
+ else:
+ # update row color
+ _c.modify_bg(gtk.STATE_NORMAL, color)
+
+ def _init_titles_box(self):
+ # prepare scrolled window
+ _viewport = gtk.Viewport()
+ _viewport.set_size_request(100, -1)
+ _viewport.show()
+ # init row
+ self._titles_box = gtk.VBox(homogeneous=False, spacing=1)
+ # show
+ self._titles_box.show()
+ # ..
+ _viewport.add(self._titles_box)
+ # update main box
+ self._main_hbox.pack_start(_viewport, expand=False, fill=True)
+
+ def _init_keys_box(self):
+ # init horizontal adjustment
+ self.hadjustment = gtk.Adjustment(0, 0, self._number_of_keys, 1)
+ # prepare scrolled window
+ _viewport = gtk.Viewport(hadjustment=self.hadjustment)
+ _viewport.set_size_request(self._viewport_width, -1)
+ _viewport.show()
+ # init row
+ self._keys_box = gtk.VBox(homogeneous=False, spacing=1)
+ # show
+ self._keys_box.show()
+ # ..
+ _viewport.add(self._keys_box)
+ # ..
+ self._main_hbox.pack_start(_viewport, expand=False, fill=True)
+
+ def _refresh_keys(self, time_):
+ # ...
+ _t_children = self._titles_box.get_children()
+ _k_children = self._keys_box.get_children()
+ # ..
+ _color = ui.get_color(1.0, 1.0, 0.5)
+ # for each row
+ for _i, _r in enumerate(_k_children):
+ #
+ _r_e_box = _r.get_children()[0]
+ # get cells
+ _cells = _r_e_box.get_children()
+ _c_idx = int(time_)
+ # ..
+ if _c_idx < len(_cells):
+ # ...
+ _c = _cells[_c_idx]
+ # update row color
+ _c.modify_bg(gtk.STATE_NORMAL, _color)
+ _c.set_visible_window(True)
+ #
+ self._current_keys[_i] = _c
+ else:
+ continue
+
+ def reorder(self):
+ # get new order
+ _names = [_n for _n in self.story_keys.get_names()]
+ # ...
+ _t_children = self._titles_box.get_children()
+ _k_children = self._keys_box.get_children()
+ # ...
+ for _i, _r in enumerate(_t_children):
+ # title row | row - eventbox - button - label
+ _label = _r.get_children()[0].get_children()[0].get_children()[1]
+ # ...
+ if _label.get_label() in _names:
+ _index = _names.index(_label.get_label())
+ else:
+ continue
+ # do reorder
+ self._titles_box.reorder_child(_r, _index)
+ self._keys_box.reorder_child(_k_children[_i], _index)
+
+ def add_sequence(self, sequence_name):
+ """Need to rebuild all on each add to ensure valid scrollwindow ??
+ """
+ # ..
+ self.__init_rows()
+ # ..
+ _seq_names = self.story_keys.get_names()
+ # restore all
+ for _n in _seq_names:
+ # first add title
+ self._add_title(_n)
+ # second add new keys
+ self._add_keys(_n)
+
+ def remove_sequence(self, sequence_name):
+ # ...
+ _t_children = self._titles_box.get_children()
+ _k_children = self._keys_box.get_children()
+ # ...
+ for _i, _r in enumerate(_t_children):
+ # title row | row - eventbox - button - label
+ _label = _r.get_children()[0].get_children()[0].get_children()[1]
+ # ...
+ if _label.get_label() == sequence_name:
+ _r.destroy()
+ _k_children[_i].destroy()
+ else:
+ continue
+
+ def refresh_sequence(self):
+ # ...
+ _t_children = self._titles_box.get_children()
+ _k_children = self._keys_box.get_children()
+ # sequence to remove
+ _seq_to_remove = list()
+ # ...
+ for _i, _r in enumerate(_t_children):
+ # title row | row - eventbox - button - label
+ _label_wid = _r.get_children()[0].get_children()[0].get_children()[1]
+ _seq_name = _label_wid.get_label()
+ # seq check
+ if _seq_name in self.story_keys._names:
+ pass
+ else:
+ _seq_to_remove.append(_seq_name)
+ continue
+ # ...
+ for _frame, _c_key in enumerate(_k_children[_i].get_children()[0]):
+ # ...
+ _current, _f_type, _k_type = self.story_keys.get_current(
+ _seq_name, _frame)
+ # get button
+ _button = _c_key.get_children()[0]
+ # ...
+ if _current is None:
+ # _button.set_image(None)
+ _button.set_label("")
+ elif _k_type == 'transition':
+ # _button.set_image(None)
+ _button.set_label("-")
+ else:
+ # _button.set_image(None)
+ _button.set_label("0")
+ # remove non-exisitng sequences
+ for _s_name in _seq_to_remove:
+ self.remove_sequence(_s_name)
+
+
+ def __reset(self):
+ # ..
+ _seq_names = self.story_keys.get_names()
+ # remove all
+ for _n in _seq_names:
+ self.remove_sequence(_n)
+ # ??
+ _seq_names = self.story_keys.get_names()
+ # restore all
+ for _n in _seq_names:
+ # first add title
+ self._add_title(_n)
+ # second add new keys
+ self._add_keys(_n)
+
+ def refresh_adjustment(self, time=None):
+ # ensure time
+ if time is None:
+ time = 0 if self.screen.toolbar.activity._thread is None\
+ else self.screen.toolbar.activity._thread._time
+ else:
+ pass
+ # compute new adjustment
+ _keys_width = self._number_of_keys * 26
+ if self._viewport_width < _keys_width:
+ _new_value = (_keys_width - self._viewport_width) * time
+ _new_value /= float(self._number_of_keys)
+ else:
+ _new_value = 0
+ # ..
+ self.hadjustment.set_value(_new_value)
+
+ def refresh(self):
+ # ..
+ _time = 0 if self.screen.toolbar.activity._thread is None\
+ else self.screen.toolbar.activity._thread._time
+ # ..
+ _activity_nb_of_keys = self._get_number_of_keys()
+ # check reset
+ if self._number_of_keys != _activity_nb_of_keys:
+ # update number of keys
+ self._number_of_keys = _activity_nb_of_keys
+ # reset
+ self.__reset()
+ else:
+ pass
+ self.refresh_adjustment(time=_time)
+ # first avoid current keys colors
+ for _c in self._current_keys.values():
+ _c.set_visible_window(False)
+ # change cell colors
+ self._refresh_keys(_time)
+ # udpate sequences
+ self.refresh_sequence()