diff options
Diffstat (limited to 'atoidejouer/ui/screens.py')
-rw-r--r-- | atoidejouer/ui/screens.py | 295 |
1 files changed, 173 insertions, 122 deletions
diff --git a/atoidejouer/ui/screens.py b/atoidejouer/ui/screens.py index f7ad2e5..044da17 100644 --- a/atoidejouer/ui/screens.py +++ b/atoidejouer/ui/screens.py @@ -9,6 +9,9 @@ from gettext import gettext as _ # gtk import import cairo, gobject, gtk, glib +# graphics import +from lib import graphics + # sugar import from sugar.activity import activity from sugar.graphics.objectchooser import ObjectChooser @@ -38,21 +41,39 @@ def _on_image_clicked(screen, widget, sequence_name): screen.timeline.set_active_sequence(sequence_name) -class ScreenStory(gtk.Frame): # gtk.Fixed +def _on_drag_finish(image, scene, keys, size): + # _align = self._get_keys('graphics').set_align(sequence_name, + # frame, _current) + # DEBUG + logger.debug('[screens] _on_drag_finish - image.x: %s' % image.x) + logger.debug('[screens] _on_drag_finish - image.y: %s' % image.y) + # DEBUG + # parse size + _w , _h = size + # compute align + _x = float(image.x) / _w + _y = float(image.x) / _h + # DEBUG + logger.debug('[screens] _on_drag_finish - _x: %s' % _x) + logger.debug('[screens] _on_drag_finish - _y: %s' % _y) + # DEBUG + # TODO - compute new align + + +class ScreenStory(graphics.Scene): def __init__(self, toolbar, height_offset=0, width_offset=0, set_canvas=False, frame=None): - # init parent - gtk.Frame.__init__(self) - self.set_shadow_type(gtk.SHADOW_NONE) + # .. + graphics.Scene.__init__(self) + self.background_color = "#ffffff" # keep toolbar self.toolbar = toolbar # .. self._set_canvas = set_canvas - # init frame dict - self.__frame_dict = dict() # init image dicts self.__sizes = dict() + self.__graphics = dict() self.__sounds = dict() # init fullscreen flag self.fullscreen = False @@ -68,15 +89,6 @@ class ScreenStory(gtk.Frame): # gtk.Fixed # and show self._show() - def __init_buffer(self): - # .. - _buffer = gtk.Fixed() - # set has window for bg color issue - _buffer.set_has_window(True) - _buffer.modify_bg(gtk.STATE_NORMAL, COLOR_WHITE) - # .. - return _buffer - def _get_keys(self, type_): # .. if type_ == 'graphics': @@ -100,11 +112,7 @@ class ScreenStory(gtk.Frame): # gtk.Fixed def _check_clear(self): # need clear if self._get_keys('graphics').get_clear(self.toolbar.name) is True: - # destroy all - for _d_area in self.__frame_dict.values(): - _d_area.destroy() - # ... - self.__frame_dict = dict() + # .. self.__sizes = dict() # done self._get_keys('graphics').set_clear(self.toolbar.name, False) @@ -115,14 +123,42 @@ class ScreenStory(gtk.Frame): # gtk.Fixed def refresh(self): # get the current frame - _frame = 0 if self.toolbar.activity._thread is None\ + _time = 0.0 if self.toolbar.activity._thread is None\ else self.toolbar.activity._thread._time + # get the current frame + _rate = 1.0 if self.toolbar.activity._thread is None\ + else self.toolbar.activity._thread._rate # clear ?? - if self._check_clear() is True\ - or _frame not in self.__frame_dict: - self.__buffer_update(_frame) - elif _frame in self.__frame_dict: - self.__set_child(self.__frame_dict[_frame]) + self._check_clear() + # .. + self._refresh_screen_size() + # .. + _currents = list() + # for each images + for _n in self._get_keys('graphics').get_names(): + # do move + _currents.append(self.__refresh_image(_n, _time, _rate)) + # draw mask + _currents.append(self.__refresh_default('mask')) + # DEBUG + logger.debug('[screens] refresh - _currents: %s' % _currents) + # DEBUG + # .. + # self.queue_draw() + # TODO - hide previous + for _code, _image in self.__graphics.items(): + if _code in _currents: + continue + else: + # DEBUG + logger.debug('[screens] refresh - not in _code: %s' % _code) + # DEBUG + _image.visible = False + self.queue_draw() + # show first + if self._fullscreen_changed is True: + # disable changed flag + self._fullscreen_changed = False else: pass # refresh sounds if playing @@ -132,7 +168,7 @@ class ScreenStory(gtk.Frame): # gtk.Fixed # for each sound for _n in self._get_keys('sounds').get_names(): # do move - self.__refresh_sound(_n, _frame) + self.__refresh_sound(_n, _time) else: # stop all for _code, _sound in self.__sounds.items(): @@ -141,64 +177,9 @@ class ScreenStory(gtk.Frame): # gtk.Fixed else: _sound.pause() - def __set_child(self, child): - # remove previous - _previous = self.get_child() - if _previous is None: - pass - else: - self.remove(_previous) - # do show - child.show() - # set new - self.add(child) - - def __expose(self, drawing_area, event, frame): - # .. - if drawing_area.window is None: - pass - else: - # .. - _context = drawing_area.window.cairo_create() - # init rec - _rec = self.get_allocation() - # paint it white - _context.rectangle(0, 0, _rec.width, _rec.height) - _context.set_source_rgb(1, 1, 1) - _context.paint() - # for each images - for _n in self._get_keys('graphics').get_names(): - # do move - self.__refresh_image(_n, frame, _context, _rec) - # draw mask - self.__refresh_default('mask', _context, _rec) - # clean - if frame in self.__frame_dict: - del self.__frame_dict[frame] - else: - pass - # update dict - self.__frame_dict[frame] = drawing_area - # show first - if self._fullscreen_changed is True: - # disable changed flag - self._fullscreen_changed = False - else: - pass - - def __buffer_update(self, frame): - # screen size first - self._refresh_screen_size() - # - _drawing_area = gtk.DrawingArea() - _drawing_area.connect("expose-event", self.__expose, frame) - # .. - self.__set_child(_drawing_area) - def _update_w_h(self, filename): if filename in self.__sizes: - # get image size - return self.__sizes[filename] + pass else: # get graphics path _path = storage.get_image_path(filename) @@ -214,11 +195,14 @@ class ScreenStory(gtk.Frame): # gtk.Fixed _new_w = _w _new_h = _h # update size - self.__sizes[filename] = _new_w, _new_h - # return new values - return _new_w, _new_h + self.__sizes[filename] = _new_w, _new_h, _w, _h + # return new values + return self.__sizes[filename] - def _update_x_y(self, width, height, x, y): + def _update_x_y(self, size, align): + # .. + _new_w, _new_h, _w, _h = size + _x, _y = align # if self.fullscreen is True\ or self._screen_width < 1024: @@ -228,55 +212,122 @@ class ScreenStory(gtk.Frame): # gtk.Fixed _scene_with = 1024 _scene_height = 516 # update x - _x = ((self._screen_width - width) / 2) - _x += int(x * _scene_with / 100.0) + _new_x = ((self._screen_width - _new_w) / 2) + _new_x += int(_x * _scene_with / 100.0) # update y - _y = ((self._screen_height - height - 88) / 2) - _y += int(y * _scene_height / 100.0) + _new_y = ((self._screen_height - _new_h - 88) / 2) + _new_y += int(_y * _scene_height / 100.0) # return it - return _x, _y + return _new_x, _new_y - def __refresh_default(self, default_name, context, rec): - # _code = '__%s' % default_name - _filename = '%s_default' % default_name - # get/update width and height - _w, _h = self._update_w_h(_filename) - # update x, y - _x, _y = self._update_x_y(_w, _h, 0, 0) - # .. - self.__update_drawing_area(context, rec, _filename, - (_w, _h), (_x, _y)) + def __refresh_default(self, default_name): + _code = '__%s' % default_name + # ensure current image + if _code in self.__graphics: + # .. + self.__graphics[_code].visible = True + else: + _filename = '%s_default' % default_name + # .. + _align = (0, 0) + # get/update width and height + _size = self._update_w_h(_filename) + # .. + self.__graphics[_code] =\ + self.__update_drawing_area(_filename, _size, _align) + # and return displayed code + return _code + + def __get_transition_align(self, sequence_name, filename, time, rate): + # get align + _x, _y = self._get_keys('graphics').get_align(sequence_name, + int(time), filename) + # get transition ratio + _ratio = time - int(time) + # DEBUG + logger.debug('[screens] __compute_transition_align - _ratio: %s' % _ratio) + # DEBUG + if _ratio < rate: + return _x, _y + else: + _next_x, _next_y = self._get_keys('graphics').get_align(sequence_name, + int(time) + 1, filename) + # .. + return _x + (_next_x - _x) * _ratio, _y + (_next_y - _y) * _ratio - def __refresh_image(self, sequence_name, frame, context, rec): + def __refresh_image(self, sequence_name, time, rate): # get sequence filename _current, _f_type, _k_type = self._get_keys('graphics').get_current( - sequence_name, frame) + sequence_name, int(time)) # need current if _current is None: - return + return None else: - # get align - _p_align = self._get_keys('graphics').get_align(sequence_name, - frame, _current) - # get/update width and height - _w, _h = self._update_w_h(_current) + pass + # get sequence file codes + _code = self._get_keys('graphics').get_code( + self.toolbar.name, sequence_name, _current) + # DEBUG + logger.debug('[screens] __refresh_image - _code: %s' % _code) + # DEBUG + # current file code + _code = key.random_str() if _code is None else _code + # get/update width and height + _size = self._update_w_h(_current) + # get align + _align = self.__get_transition_align(sequence_name, _current, + time, rate) + # ensure current image + if _code in self.__graphics: + # .. + _image = self.__graphics[_code] # update x, y - _x, _y = self._update_x_y(_w, _h, *_p_align) + _image.x, _image.y = self._update_x_y(_size, _align) + # get z_order + _image.z_order = self._get_keys('graphics').get_layout( + sequence_name) + # .. + _image.visible = True + else: + # .. + _image = self.__update_drawing_area(_current, _size, _align, + sequence_name=sequence_name, draggable=True) # .. - self.__update_drawing_area(context, rec, _current, - (_w, _h), (_x, _y)) + self.__graphics[_code] = _image + # .. + self._get_keys('graphics').set_code(self.toolbar.name, sequence_name, + _current, _code) + # and return displayed code + return _code - def __update_drawing_area(self, context, rec, filename, size, align): + def __update_drawing_area(self, filename, size, align, sequence_name=None, + draggable=False): # get path _path = storage.get_image_path(filename) - # split size - _w, _h = size - # init pixbuf - _pixbuf = image.get_pixbuf(_path, _w, _h, use_max=True) - # add source - context.set_source_pixbuf(_pixbuf, *align) - # paint context - context.paint_with_alpha(1) + # update x, y + _x, _y = self._update_x_y(size, align) + # scale + _new_w, _new_h, _w, _h = size + # .. + _scale = float(_new_w)/_w + # _scale_y = float(_new_h)/_h + # get z_order + if sequence_name is None: + _z_order = 1000 + else: + _z_order = self._get_keys('graphics').get_layout(sequence_name) + # image - TODO - draggable = True + _image = graphics.Image(_path, x=_x, y=_y, scale_x=_scale, + scale_y=_scale, z_order=_z_order, draggable=draggable) + # connect drag + if self._set_canvas is True: + pass + else: + _image.connect('on-drag-finish', _on_drag_finish, self, (_w, _h)) + # do add + self.add_child(_image) + # .. + return _image def __stop_unused_sounds(self, sequence_codes, current_code): # hide previous |