Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2012-06-25 13:21:46 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2012-06-25 13:21:46 (GMT)
commit104bcfb0dfd817bf059bcc07848d566884ab6e02 (patch)
treecdec78986663bd5a05c66b3acfb4215eec92a62b
parent1b590314d9dd01871d6cd640d1e1c1a079132409 (diff)
Use directories and separated image files to create the animations
Loading a animated gif is slow, and the activity does not reply if a user press a few times the buttons. To avoid that, we save the images in directories, the dots used to display the advance, show the number of directories, the buttons change to the next/previous animation, and the timer load the next image available, or change to the next animation if is the last image in the directory. Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
-rw-r--r--activity.py87
1 files changed, 59 insertions, 28 deletions
diff --git a/activity.py b/activity.py
index 8189aee..9e7de94 100644
--- a/activity.py
+++ b/activity.py
@@ -32,7 +32,7 @@ from sugar.graphics import style
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.icon import Icon
-DEFAULT_CHANGE_IMAGE_TIME = 15
+DEFAULT_CHANGE_IMAGE_TIME = 2
POWERD_INHIBIT_DIR = '/var/run/powerd-inhibit-suspend'
@@ -57,12 +57,12 @@ class WelcomeActivity(activity.Activity):
self.image_viewer = ImageCollectionViewer(False)
prev_bt = ToolButton("go-previous-paired")
- prev_bt.connect("clicked", self.image_viewer.prev_image_clicked_cb,
+ prev_bt.connect("clicked", self.image_viewer.prev_anim_clicked_cb,
None)
toolbar_box.toolbar.insert(prev_bt, -1)
next_bt = ToolButton("go-next-paired")
- next_bt.connect("clicked", self.image_viewer.next_image_clicked_cb,
+ next_bt.connect("clicked", self.image_viewer.next_anim_clicked_cb,
None)
toolbar_box.toolbar.insert(next_bt, -1)
@@ -114,21 +114,32 @@ class ImageCollectionViewer(gtk.VBox):
images_path = \
os.path.expanduser('~/Activities/Welcome.activity/images/')
+ self.anim_order = 0
self.image_order = 0
- self.image_files_list = []
+ self.auto_change_anim = True
+ self.animation_list = []
for fname in sorted(os.listdir(images_path)):
- self.image_files_list.append(images_path + fname)
- logging.error('Image file: %s', fname)
+ if os.path.isdir(images_path + fname):
+ anim_path = images_path + fname
+ logging.error('Animation dir file: %s', anim_path)
+ animation_images_list = []
+ for imagefname in sorted(os.listdir(anim_path)):
+ image_path = os.path.join(anim_path, imagefname)
+ animation_images_list.append(image_path)
+ logging.error('Image file: %s', image_path)
+ self.animation_list.append(animation_images_list)
+ else:
+ self.animation_list.append([images_path + fname])
- if self.image_files_list:
- self.image.set_from_file(self.image_files_list[self.image_order])
+ if self.animation_list:
+ self._update_image()
if start_window:
# Create bottom controls
center_align = gtk.Alignment(0.5, 0, 0, 0)
self.pack_start(center_align, False, padding=2)
- self.sequence_view = SequenceView(len(self.image_files_list))
+ self.sequence_view = SequenceView(len(self.animation_list))
center_align.add(self.sequence_view)
bottom_toolbar = gtk.HBox()
@@ -164,11 +175,11 @@ class ImageCollectionViewer(gtk.VBox):
prev_bt = CustomButton('go-previous-paired-grey', bt_height)
center_box.pack_start(prev_bt, False, False, 5)
- prev_bt.connect('button-press-event', self.prev_image_clicked_cb)
+ prev_bt.connect('button-press-event', self.prev_anim_clicked_cb)
next_bt = CustomButton('go-next-paired-grey', bt_height)
center_box.pack_start(next_bt, False, False, 5)
- next_bt.connect('button-press-event', self.next_image_clicked_cb)
+ next_bt.connect('button-press-event', self.next_anim_clicked_cb)
# do the right_box and left_box have the same size
width = int(gtk.gdk.screen_width() / 4)
@@ -194,28 +205,48 @@ class ImageCollectionViewer(gtk.VBox):
gtk.main_quit()
def auto_change_image(self):
- self.next_image_clicked_cb(None, None)
+ # Change to the next image in the animation,
+ # if is the last, change to the next animation
+ if self.image_order < len(self.animation_list[self.anim_order]) - 1:
+ self.image_order += 1
+ self._update_image()
+ else:
+ if self.auto_change_anim:
+ self.next_anim_clicked_cb(None, None)
+ else:
+ self.image_order = 0
+ self._update_image()
+
self.timer_id = gobject.timeout_add_seconds(DEFAULT_CHANGE_IMAGE_TIME,
self.auto_change_image)
- return True
+ return False
- def next_image_clicked_cb(self, button, event):
- gobject.source_remove(self.timer_id)
- self.image_order += 1
- if self.image_order == len(self.image_files_list):
- self.image_order = 0
+ def next_anim_clicked_cb(self, button, event):
+ if button is not None:
+ self.auto_change_anim = False
+ self.image_order = 0
+ self.anim_order += 1
+ if self.anim_order == len(self.animation_list):
+ self.anim_order = 0
if self.sequence_view is not None:
- self.sequence_view.set_value(self.image_order + 1)
- self.image.set_from_file(self.image_files_list[self.image_order])
-
- def prev_image_clicked_cb(self, button, event):
- gobject.source_remove(self.timer_id)
- self.image_order -= 1
- if self.image_order < 0:
- self.image_order = len(self.image_files_list) - 1
+ self.sequence_view.set_value(self.anim_order + 1)
+ self._update_image()
+
+ def prev_anim_clicked_cb(self, button, event):
+ if button is not None:
+ self.auto_change_anim = False
+ self.image_order = 0
+ self.anim_order -= 1
+ if self.anim_order < 0:
+ self.anim_order = len(self.animation_list) - 1
if self.sequence_view is not None:
- self.sequence_view.set_value(self.image_order + 1)
- self.image.set_from_file(self.image_files_list[self.image_order])
+ self.sequence_view.set_value(self.anim_order + 1)
+ self._update_image()
+
+ def _update_image(self):
+ image_file_name = \
+ self.animation_list[self.anim_order][self.image_order]
+ self.image.set_from_file(image_file_name)
def finish(self):
self._allow_suspend()