Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/atoidejouer/ui/screens.py
diff options
context:
space:
mode:
Diffstat (limited to 'atoidejouer/ui/screens.py')
-rw-r--r--atoidejouer/ui/screens.py295
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