Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2012-08-02 18:07:10 (GMT)
committer Walter Bender <walter.bender@gmail.com>2012-08-02 18:07:10 (GMT)
commitf2f8dbbedb83d1147d56e2e9d68ecd471e6c2841 (patch)
treef0a2888a0ef83651aa31ec15c00f0b1e99c7d05b
parent1931f37f4743c10d0becab18c15ee7de60042495 (diff)
refactoring to make it easier to maintain shared Portfolio
-rw-r--r--PortfolioActivity.py569
1 files changed, 302 insertions, 267 deletions
diff --git a/PortfolioActivity.py b/PortfolioActivity.py
index 1fc19c0..a076feb 100644
--- a/PortfolioActivity.py
+++ b/PortfolioActivity.py
@@ -138,12 +138,30 @@ WHITE_SPACE = ['space', 'Tab']
CURSOR = '█'
NEWLINE = '\n'
-TITLE = 0
-PREVIEW = 1
-DESCRIPTION = 2
-THUMB = 3
-FAV = 4
-DIRTY = 5
+
+class Slide():
+ ''' A container for a slide '''
+
+ def __init__(self, owner, uid, colors, title, preview, desc):
+ self.active = True
+ self.owner = owner
+ self.uid = uid
+ self.colors = colors
+ self.title = title
+ self.preview = preview # pixbuf
+ self.description = desc
+ self.sound = None
+ self.dirty = False
+ self.fav = True
+ self.thumb = None
+ self.star = None
+
+ def hide(self):
+ if self.star is not None:
+ self.star.hide()
+ if self.thumb is not None:
+ self.thumb.hide()
+
class PortfolioActivity(activity.Activity):
''' Make a slideshow from starred Journal entries. '''
@@ -172,15 +190,7 @@ class PortfolioActivity(activity.Activity):
self._setup_toolbars()
self._setup_canvas()
- self._uids = []
- # self._slides = [] # TODO: replace individual arrays???
-
- self._dirty = []
- self._titles = []
- self._previews = []
- self._descriptions = []
- self._favs = []
- self._thumbs = []
+ self._slides = []
self._thumbnail_mode = False
self._find_starred()
@@ -194,6 +204,8 @@ class PortfolioActivity(activity.Activity):
self._selected_spr = None
self._dead_key = ''
self._saved_string = ''
+ self._startpos = [0, 0]
+ self._dragpos = [0, 0]
self._setup_presence_service()
@@ -248,7 +260,6 @@ class PortfolioActivity(activity.Activity):
self._unfav_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
os.path.join(activity.get_bundle_path(), 'icons',
'favorite-off.svg'), star_size, star_size)
- self._make_stars()
self.prev_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
os.path.join(activity.get_bundle_path(), 'icons',
@@ -442,56 +453,92 @@ class PortfolioActivity(activity.Activity):
''' Clean up on the way out. '''
gtk.main_quit()
- def _make_stars(self):
- ''' Make stars to include with thumbnails '''
- self._favs = []
- self._stars = []
- for i in range(self._nobjects):
- self._favs.append(True)
- self._stars.append(Sprite(self._sprites, 0, 0,
- self._fav_pixbuf))
- self._stars[-1].type = 'star'
- self._stars[-1].set_layer(STAR)
+ def _thumb_to_slide(self, spr):
+ for slide in self._slides:
+ if slide.thumb == spr:
+ return slide
+ return None
+
+ def _star_to_slide(self, spr):
+ for slide in self._slides:
+ if slide.star == spr:
+ return slide
+ return None
+
+ def _uid_to_slide(self, uid):
+ for slide in self._slides:
+ if slide.uid == uid:
+ return slide
+ return None
+
+ def _make_star(self, slide):
+ slide.star = Sprite(self._sprites, 0, 0, self._fav_pixbuf)
+ slide.star.type = 'star'
+ slide.star.set_layer(STAR)
+ slide.fav = True
def _find_starred(self):
''' Find all the _stars in the Journal. '''
- self._uids = []
- self._dirty = []
- self._titles = []
- self._previews = []
- self._descriptions = []
- self._thumbs = []
- self._favs = []
- self._stars = []
+ for slide in self._slides:
+ slide.active = False
self.dsobjects, self._nobjects = datastore.find({'keep': '1'})
_logger.debug('found %d starred items', self._nobjects)
for dsobj in self.dsobjects:
- self._uids.append(dsobj.object_id)
- self._dirty.append(False)
- self._favs.append(True)
+ slide = self._uid_to_slide(dsobj.object_id)
+ owner = self._buddies[0]
+ title = ''
+ desc = ''
+ preview = None
if hasattr(dsobj, 'metadata'):
if 'title' in dsobj.metadata:
- self._titles.append(dsobj.metadata['title'])
- else:
- self._titles.append('')
+ title = dsobj.metadata['title']
if 'description' in dsobj.metadata:
- self._descriptions.append(dsobj.metadata['description'])
- else:
- self._descriptions.append('')
+ desc = dsobj.metadata['description']
if 'mime_type' in dsobj.metadata and \
dsobj.metadata['mime_type'][0:5] == 'image':
- self._previews.append(
- get_pixbuf_from_file(dsobj.file_path,
- int(PREVIEWW * self._scale),
- int(PREVIEWH * self._scale)))
+ preview = get_pixbuf_from_file(dsobj.file_path,
+ int(PREVIEWW * self._scale),
+ int(PREVIEWH * self._scale))
elif 'preview' in dsobj.metadata:
- self._previews.append(
- get_pixbuf_from_journal(dsobj, 300, 225))
- else:
- self._previews.append(None)
+ preview = get_pixbuf_from_journal(dsobj, 300, 225)
else:
_logger.debug('dsobj has no metadata')
+ if slide is None:
+ self._slides.append(Slide(owner,
+ dsobj.object_id,
+ self._colors,
+ title,
+ preview,
+ desc))
+ else:
+ slide.title = title
+ slide.preview = preview
+ slide.description = desc
+ slide.active = True
+ slide.fav = True
+ if slide.star is not None:
+ slide.star.hide()
+ if slide.thumb is not None:
+ slide.thumb.hide()
+
+ def _rescan_cb(self, button=None):
+ ''' Rescan the Journal for changes in starred items. '''
+ if self.initiating is not None and not self.initiating:
+ return
+ if self.initiating:
+ self._send_event('R:rescanning')
+ self._help.hide()
+ self._find_starred()
+ self.i = 0
+ if self.initiating:
+ self._share_slides()
+ if self._thumbnail_mode:
+ self._thumbnail_mode = False
+ self._thumbs_cb()
+ else:
+ self._show_slide()
+
def _first_cb(self, button=None):
self.i = 0
self._show_slide(direction=-1)
@@ -512,27 +559,6 @@ class PortfolioActivity(activity.Activity):
self.i = self._nobjects - 1
self._show_slide()
- def _rescan_cb(self, button=None):
- ''' Rescan the Journal for changes in starred items. '''
- if self.initiating is not None and not self.initiating:
- return
- self._help.hide()
- for thumbnail in self._thumbs:
- thumbnail[0].hide()
- for star in self._stars:
- star.hide()
- self._thumbs = []
- self._find_starred()
- self._make_stars()
- self.i = 0
- if self.initiating:
- self._share_slides()
- if self._thumbnail_mode:
- self._thumbnail_mode = False
- self._thumbs_cb()
- else:
- self._show_slide()
-
def _autoplay_cb(self, button=None):
''' The autoplay button has been clicked; step through slides. '''
if self._playing:
@@ -573,8 +599,8 @@ class PortfolioActivity(activity.Activity):
tmp_file = save_pdf(self, profile.get_nick_name())
dsobject = datastore.create()
- dsobject.metadata['title'] = profile.get_nick_name() + ' ' + \
- _('Portfolio')
+ dsobject.metadata['title'] = '%s %s' % (profile.get_nick_name(),
+ _('Portfolio'))
dsobject.metadata['icon-color'] = profile.get_color().to_string()
dsobject.metadata['mime_type'] = 'application/pdf'
dsobject.set_file_path(tmp_file)
@@ -585,14 +611,11 @@ class PortfolioActivity(activity.Activity):
def _clear_screen(self):
''' Clear the screen to the darker of the two XO colors. '''
+ for slide in self._slides:
+ slide.hide()
self._title.hide()
self._preview.hide()
self._description.hide()
- if hasattr(self, '_thumbs'):
- for thumbnail in self._thumbs:
- thumbnail[0].hide()
- for stars in self._stars:
- stars.hide()
self.invalt(0, 0, self._width, self._height)
# Reset drag settings
@@ -608,7 +631,7 @@ class PortfolioActivity(activity.Activity):
object. '''
self._clear_screen()
- if self._nobjects == 0:
+ if len(self._slides) == 0:
self._prev.set_image(self.prev_off_pixbuf)
self._next.set_image(self.next_off_pixbuf)
self._description.set_label(
@@ -617,31 +640,32 @@ class PortfolioActivity(activity.Activity):
self._description.set_layer(MIDDLE)
return
- # Skip slide if unstarred
- if self.initiating is None or self.initiating and \
- not self._favs[self.i]:
+ slide = self._slides[self.i]
+ # Skip slide if unstarred or inactive
+ if not slide.active or not slide.fav:
counter = 0
- while not self._favs[self.i]:
+ while not slide.active or not slide.fav:
self.i += direction
if self.i < 0:
- self.i = self._nobjects - 1
- elif self.i > self._nobjects - 1:
+ self.i = len(self._slides) - 1
+ elif self.i > len(self._slides) - 1:
self.i = 0
counter += 1
- if counter == self._nobjects:
+ if counter == len(self._slides):
_logger.debug('No _stars: nothing to show')
return
+ slide = self._slides[self.i]
if self.i == 0:
self._prev.set_image(self.prev_off_pixbuf)
else:
self._prev.set_image(self.prev_pixbuf)
- if self.i == self._nobjects - 1:
+ if self.i == len(self._slides) - 1:
self._next.set_image(self.next_off_pixbuf)
else:
self._next.set_image(self.next_pixbuf)
- pixbuf = self._previews[self.i]
+ pixbuf = slide.preview
if pixbuf is not None:
self._preview.set_shape(pixbuf.scale_simple(
@@ -653,23 +677,24 @@ class PortfolioActivity(activity.Activity):
if self._preview is not None:
self._preview.hide()
- # self._title.set_label(self.dsobjects[self.i].metadata['title'])
- self._title.set_label(self._titles[self.i])
+ self._title.set_label(slide.title)
self._title.set_layer(MIDDLE)
- self._description.set_label(self._descriptions[self.i])
+ self._description.set_label(slide.description)
self._description.set_layer(MIDDLE)
- audio_obj = self._search_for_audio_note(
- self.dsobjects[self.i].object_id)
- if audio_obj is not None:
- _logger.debug('Playing audio note')
- gobject.idle_add(play_audio_from_file, audio_obj.file_path)
- self._playback_button.set_icon('media-playback-start')
- self._playback_button.set_tooltip(_('Play recording'))
- else:
- self._playback_button.set_icon('media-playback-start-insensitive')
- self._playback_button.set_tooltip(_('Nothing to play'))
+ if self.initiating is None or self.initiating:
+ if slide.sound is None:
+ slide.sound = self._search_for_audio_note(slide.uid)
+ if slide.sound is not None:
+ _logger.debug('Playing audio note')
+ gobject.idle_add(play_audio_from_file, slide.sound.file_path)
+ self._playback_button.set_icon('media-playback-start')
+ self._playback_button.set_tooltip(_('Play recording'))
+ else:
+ self._playback_button.set_icon(
+ 'media-playback-start-insensitive')
+ self._playback_button.set_tooltip(_('Nothing to play'))
def _slides_cb(self, button=None):
if self._thumbnail_mode:
@@ -686,6 +711,13 @@ class PortfolioActivity(activity.Activity):
self._next.set_layer(DRAG)
return False
+ def _count_active(self):
+ count = 0
+ for slide in self._slides:
+ if slide.active:
+ count += 1
+ return count
+
def _show_thumbs(self):
self._stop_autoplay()
self._current_slide = self.i
@@ -695,7 +727,7 @@ class PortfolioActivity(activity.Activity):
self._prev.hide()
self._next.hide()
- n = int(ceil(sqrt(self._nobjects)))
+ n = int(ceil(sqrt(self._count_active())))
if n > 0:
w = int(self._width / n)
else:
@@ -704,35 +736,43 @@ class PortfolioActivity(activity.Activity):
x_off = int((self._width - n * w) / 2)
x = x_off
y = 0
- for i in range(self._nobjects):
- self.i = i
- self._show_thumb(x, y, w, h)
- if self.initiating is None or self.initiating:
- self._stars[i].set_layer(STAR)
- self._stars[i].move((x, y))
+ for slide in self._slides:
+ if not slide.active:
+ continue
+ self._show_thumb(slide, x, y, w, h)
x += w
if x + w > self._width:
x = x_off
y += h
self.i = 0 # Reset position in slideshow to the beginning
- def _show_thumb(self, x, y, w, h):
+ def _show_thumb(self, slide, x, y, w, h):
''' Display a preview image and title as a thumbnail. '''
- if len(self._thumbs) < self.i + 1:
- # Create a Sprite for this thumbnail
- if self._previews[self.i] is not None:
- pixbuf_thumb = self._previews[self.i].scale_simple(
- int(w), int(h), gtk.gdk.INTERP_TILES)
+ # Is size has changed, regenerate the thumbnail
+ if slide.thumb is not None:
+ sw, sh = slide.thumb.get_dimensions()
+ if sw == w and sh == h:
+ slide.thumb.move((x, y))
+ else:
+ slide.thumb.hide()
+ slide.thumb = None
+ if slide.thumb is None:
+ if slide.preview is not None:
+ pixbuf_thumb = slide.preview.scale_simple(int(w), int(h),
+ gtk.gdk.INTERP_TILES)
else:
pixbuf_thumb = svg_str_to_pixbuf(genblank(int(w), int(h),
self._colors))
- self._thumbs.append([Sprite(self._sprites, x, y, pixbuf_thumb),
- x, y, self.i])
- self._thumbs[-1][0].set_image(svg_str_to_pixbuf(
- svg_rectangle(int(w), int(h), self._colors)), i=1)
- self._thumbs[-1][0].set_label(str(self.i + 1))
- self._thumbs[self.i][0].set_layer(TOP)
+ slide.thumb = Sprite(self._sprites, x, y, pixbuf_thumb)
+ # Add a border
+ slide.thumb.set_image(svg_str_to_pixbuf(
+ svg_rectangle(int(w), int(h), slide.colors)), i=1)
+ slide.thumb.set_layer(TOP)
+ if slide.star is None:
+ self._make_star(slide)
+ slide.star.set_layer(STAR)
+ slide.star.move((x, y))
def _expose_cb(self, win, event):
''' Callback to handle window expose events '''
@@ -759,8 +799,7 @@ class PortfolioActivity(activity.Activity):
_logger.debug('I am a joiner, so I am not saving.')
return
- if True in self._dirty:
- self._save_changes_cb()
+ self._save_changes_cb()
if os.path.exists(os.path.join(self.datapath, 'output.ogg')):
os.remove(os.path.join(self.datapath, 'output.ogg'))
@@ -773,20 +812,6 @@ class PortfolioActivity(activity.Activity):
self._canvas.window.invalidate_rect(
gtk.gdk.Rectangle(int(x), int(y), int(w), int(h)), False)
- def _spr_to_thumb(self, spr):
- ''' Find which entry in the thumbnails table matches spr. '''
- for i, thumb in enumerate(self._thumbs):
- if spr == thumb[0]:
- return i
- return -1
-
- def _spr_is_thumbnail(self, spr):
- ''' Does spr match an entry in the thumbnails table? '''
- if self._spr_to_thumb(spr) == -1:
- return False
- else:
- return True
-
def _button_press_cb(self, win, event):
''' The mouse button was pressed. Is it on a thumbnail sprite? '''
x, y = map(int, event.get_coords())
@@ -795,6 +820,8 @@ class PortfolioActivity(activity.Activity):
self._total_drag = [0, 0]
spr = self._sprites.find_sprite((x, y))
+ if spr is not None:
+ self._startpos = spr.get_xy()
self._press = None
self._release = None
@@ -834,27 +861,27 @@ class PortfolioActivity(activity.Activity):
if spr.type == 'star':
spr.set_shape(self._unfav_pixbuf)
spr.type = 'unstar'
- i = self._stars.index(spr)
- self._favs[i] = False
+ slide = self._star_to_slide(spr)
+ slide.fav = False
if self.initiating:
- self.send_star(i, False)
+ self._send_star(slide.uid, False)
elif spr.type == 'unstar':
spr.set_shape(self._fav_pixbuf)
spr.type = 'star'
- i = self._stars.index(spr)
- self._favs[i] = True
+ slide = self._star_to_slide(spr)
+ slide.fav = True
if self.initiating:
- self.send_star(i, True)
+ self._send_star(slide.uid, True)
# Are we clicking on a thumbnail?
- if not self._spr_is_thumbnail(spr):
+ slide = self._thumb_to_slide(spr)
+ if slide is None:
return False
self.last_spr_moved = spr
self._press = spr
self._press.set_layer(DRAG)
- if self.initiating is None or self.initiating:
- self._stars[self._spr_to_thumb(self._press)].set_layer(DRAG+1)
+ slide.star.set_layer(DRAG+1)
return False
def _mouse_move_cb(self, win, event):
@@ -869,8 +896,9 @@ class PortfolioActivity(activity.Activity):
dy = y - self._dragpos[1]
spr.move_relative([dx, dy])
# Also move the star
- if self.initiating is None or self.initiating:
- self._stars[self._spr_to_thumb(spr)].move_relative([dx, dy])
+ slide = self._thumb_to_slide(spr)
+ if slide is not None:
+ slide.star.move_relative([dx, dy])
self._dragpos = [x, y]
self._total_drag[0] += dx
self._total_drag[1] += dy
@@ -886,57 +914,43 @@ class PortfolioActivity(activity.Activity):
return
if self._thumbnail_mode:
- i = self._spr_to_thumb(self._press)
+ press_slide = self._thumb_to_slide(self._press)
# Drop the dragged thumbnail below the other thumbnails so
# that you can find the thumbnail beneath it...
self._press.set_layer(UNDRAG)
- if self.initiating is None or self.initiating:
- self._stars[self._spr_to_thumb(self._press)].set_layer(STAR)
+ if press_slide is not None:
+ press_slide.star.set_layer(STAR)
spr = self._sprites.find_sprite((x, y))
self._press.set_layer(TOP) # and then restore press to top layer
- if self._spr_is_thumbnail(spr):
+ if press_slide is not None:
self._release = spr
# If we found a thumbnail
# ...and it is the one we dragged, jump to that slide.
if self._press == self._release:
if self._total_drag[0] * self._total_drag[0] + \
self._total_drag[1] * self._total_drag[1] < 200:
- self._current_slide = self._spr_to_thumb(self._release)
+ self._current_slide = self._slides.index(press_slide)
self._slide_button.set_active(True)
# ...and it is not the one we dragged, swap their positions.
else:
- j = self._spr_to_thumb(self._release)
- self._thumbs[i][0] = self._release
- self._thumbs[j][0] = self._press
- tmp = self.dsobjects[i]
- self.dsobjects[i] = self.dsobjects[j]
- self.dsobjects[j] = tmp
- if self.initiating is None or self.initiating:
- tmp = self._stars[i]
- self._stars[i] = self._stars[j]
- self._stars[j] = tmp
- tmp = self._uids[i]
- self._uids[i] = self._uids[j]
- self._uids[j] = tmp
- tmp = self._titles[i]
- self._titles[i] = self._titles[j]
- self._titles[j] = tmp
- tmp = self._previews[i]
- self._previews[i] = self._previews[j]
- self._previews[j] = tmp
- tmp = self._descriptions[i]
- self._descriptions[i] = self._descriptions[j]
- self._descriptions[j] = tmp
- self._thumbs[j][0].move((self._thumbs[j][1],
- self._thumbs[j][2]))
- if self.initiating is None or self.initiating:
- self._stars[j].move((self._thumbs[j][1],
- self._thumbs[j][2]))
- self._thumbs[i][0].move((self._thumbs[i][1], self._thumbs[i][2]))
- if self.initiating is None or self.initiating:
- self._stars[i].move((self._thumbs[i][1],
- self._thumbs[i][2]))
+ # Could have released on top of a star or a thumbnail
+ if self._release.type in ['star', 'unstar']:
+ release_slide = self._star_to_slide(self._release)
+ else:
+ release_slide = self._thumb_to_slide(self._release)
+ if release_slide is None: # Move to end of slide list
+ pass # TODO
+ else:
+ i = self._slides.index(press_slide)
+ j = self._slides.index(release_slide)
+ self._slides[i] = release_slide
+ self._slides[j] = press_slide
+ x, y = release_slide.thumb.get_xy()
+ press_slide.thumb.move((x, y))
+ press_slide.star.move((x, y))
+ release_slide.thumb.move(self._startpos)
+ release_slide.star.move(self._startpos)
self._press = None
self._release = None
return False
@@ -966,8 +980,8 @@ class PortfolioActivity(activity.Activity):
self._save_recording_button.set_icon('sound-save')
self._save_recording_button.set_tooltip(_('Save recording'))
# Autosave if there was not already a recording
- if self._search_for_audio_note(
- self.dsobjects[self.i].object_id) is None:
+ slide = self._slides[self.i]
+ if self._search_for_audio_note(slide.uid) is None:
_logger.debug('Autosaving recording')
self._notify_successful_save(title=_('Save recording'))
gobject.timeout_add(100, self._wait_for_transcoding_to_finish)
@@ -997,23 +1011,23 @@ class PortfolioActivity(activity.Activity):
def _save_recording(self):
if os.path.exists(os.path.join(self.datapath, 'output.ogg')):
_logger.debug('Saving recording to Journal...')
- obj_id = self.dsobjects[self.i].object_id
+ slide = self._slides[self.i]
copyfile(os.path.join(self.datapath, 'output.ogg'),
- os.path.join(self.datapath, '%s.ogg' % (obj_id)))
- dsobject = self._search_for_audio_note(obj_id)
+ os.path.join(self.datapath, '%s.ogg' % (slide.uid)))
+ dsobject = self._search_for_audio_note(slide.uid)
if dsobject is None:
dsobject = datastore.create()
if dsobject is not None:
- _logger.debug(self.dsobjects[self.i].metadata['title'])
+ _logger.debug(slide.title)
+ slide.sound = dsobject
dsobject.metadata['title'] = _('audio note for %s') % \
- (self.dsobjects[self.i].metadata['title'])
+ (slide.title)
dsobject.metadata['icon-color'] = \
profile.get_color().to_string()
- dsobject.metadata['tags'] = obj_id
+ dsobject.metadata['tags'] = slide.uid
dsobject.metadata['mime_type'] = 'audio/ogg'
dsobject.set_file_path(
- os.path.join(self.datapath, '%s.ogg' % (obj_id)))
- # os.path.join(self.datapath, 'output.ogg'))
+ os.path.join(self.datapath, '%s.ogg' % (slide.uid)))
datastore.write(dsobject)
dsobject.destroy()
else:
@@ -1040,14 +1054,14 @@ class PortfolioActivity(activity.Activity):
if self.initiating is not None and not self.initiating:
_logger.debug('skipping write (%s)' % (str(self.initiating)))
return
- for i, uid in enumerate(self._uids):
- if not self._dirty[i]:
- _logger.debug('%d is not dirty...' % (i))
+ for slide in self._slides:
+ if not slide.dirty:
continue
- _logger.debug('%d is dirty... writing' % (i))
- jobject = datastore.get(uid)
- jobject.metadata['description'] = self._descriptions[i]
- jobject.metadata['title'] = self._titles[i]
+ _logger.debug('%d is dirty... writing' % (
+ self._slides.index(slide)))
+ jobject = datastore.get(slide.uid)
+ jobject.metadata['description'] = slide.description
+ jobject.metadata['title'] = slide.title
datastore.write(jobject,
update_mtime=False,
reply_handler=self.datastore_write_cb,
@@ -1193,21 +1207,19 @@ class PortfolioActivity(activity.Activity):
if CURSOR in self._selected_spr.labels[0]:
parts = self._selected_spr.labels[0].split(CURSOR)
self._selected_spr.set_label(string.join(parts))
+ slide = self._slides[self.i]
if self._selected_spr.type == 'title':
- self._titles[self.i] = self._selected_spr.labels[0]
- if self.initiating is not None and \
- self.initiating:
+ slide.title = self._selected_spr.labels[0]
+ if self.initiating is not None and self.initiating:
self._send_event('t:%s' % (self._data_dumper(
- [self._uids[self.i],
- self._titles[self.i]])))
+ [slide.uid, slide.title])))
else:
- self._descriptions[self.i] = self._selected_spr.labels[0]
+ slide.description = self._selected_spr.labels[0]
if self.initiating is not None:
self._send_event('d:%s' % (self._data_dumper(
- [self._uids[self.i],
- self._descriptions[self.i]])))
+ [slide.uid, slide.description])))
_logger.debug('marking %d as dirty' % (self.i))
- self._dirty[self.i] = True
+ slide.dirty = True
self._selected_spr = None
self._saved_string = ''
@@ -1230,13 +1242,15 @@ class PortfolioActivity(activity.Activity):
# Serialize
- def _dump(self, uid, title, pixbuf, description):
+ def _dump(self, slide):
''' Dump data for sharing.'''
- _logger.debug('dumping %s' % (uid))
- if pixbuf is None:
- data = [uid, title, None, description]
+ _logger.debug('dumping %s' % (slide.uid))
+ if slide.preview is None:
+ data = [slide.uid, slide.title, None, slide.description]
else:
- data = [uid, title, pixbuf_to_base64(activity, pixbuf), description]
+ data = [slide.uid, slide.title,
+ pixbuf_to_base64(activity, slide.preview),
+ slide.description]
return self._data_dumper(data)
def _data_dumper(self, data):
@@ -1251,32 +1265,37 @@ class PortfolioActivity(activity.Activity):
''' Load game data from the journal. '''
self._restore_cursor()
uid, title, base64, description = self._data_loader(data)
- if not uid in self._uids:
+ if self._uid_to_slide(uid) is None:
_logger.debug('loading %s' % (uid))
- self._uids.append(uid)
- self._titles.append(title)
if base64 is None:
- self._previews.append(None)
- else:
- self._previews.append(base64_to_pixbuf(activity, base64))
- self._descriptions.append(description)
- self._nobjects += 1
- for thumbnail in self._thumbs:
- thumbnail[0].hide()
- self._thumbs = []
- if not self._thumbnail_mode:
- self._thumb_button.set_active(True)
+ preview = None
else:
- self._show_thumbs()
+ preview = base64_to_pixbuf(activity, base64)
+ self._slides.append(Slide(self._buddies[-1],
+ uid,
+ self._colors,
+ title,
+ preview,
+ description))
else:
_logger.debug('updating description for %s' % (uid))
- self._titles[self._uids.index(uid)] = title
+ slide = self._uid_to_slide(uid)
+ slide.title = title
if base64 is None:
- self._previews[self._uids.index(uid)] = None
+ slide.preview = None
else:
- self._previews[self._uids.index(uid)] = base64_to_pixbuf(
- activity, base64)
- self._descriptions[self._uids.index(uid)] = description
+ slide.preview = base64_to_pixbuf(activity, base64)
+ slide.description = description
+ slide.active = True
+ if not slide.fav:
+ slide.fav = True
+ if slide.star is not None:
+ slide.star.set_shape(self._fav_pixbuf)
+ slide.star.type = 'star'
+ if not self._thumbnail_mode:
+ self._thumb_button.set_active(True)
+ else:
+ self._show_thumbs()
def _data_loader(self, data):
if _OLD_SUGAR_SYSTEM:
@@ -1345,13 +1364,8 @@ class PortfolioActivity(activity.Activity):
self.waiting = True
# Since we are joining, clear out the slide list
- self._uids = []
- self._dirty = []
- self._titles = []
- self._previews = []
- self._descriptions = []
- self._thumbs = []
- self._nobjects = 0
+ for slide in self._slides:
+ slide.active = False
self._clear_screen()
self._help.hide()
self._description.set_layer(TOP)
@@ -1395,11 +1409,16 @@ class PortfolioActivity(activity.Activity):
'd': self._update_description,
't': self._update_title,
'S': self._update_star,
+ 'R': self._reset,
'j': self._new_join,
}
_logger.debug('<<< %s' % (text[0]))
dispatch_table[text[0]](text[2:])
+ def _reset(self, data):
+ for slide in self._slides:
+ slide.active = False
+
def _new_join(self, data):
if data not in self._buddies:
self._buddies.append(data)
@@ -1408,8 +1427,19 @@ class PortfolioActivity(activity.Activity):
self._share_slides()
def _update_star(self, data):
- i, status = self._data_loader(data)
- self._favs[i] = status
+ uid, status = self._data_loader(data)
+ slide = self._uid_to_slide(uid)
+ if slide is None:
+ _logger.debug('slide %s not found' % (uid))
+ return
+ slide.fav = status
+ if slide.star is not None:
+ if status:
+ slide.star.set_shape(self._fav_pixbuf)
+ slide.star.type = 'star'
+ else:
+ slide.star.set_shape(self._unfav_pixbuf)
+ slide.star.type = 'unstar'
def _update_colors(self, data):
colors = self._data_loader(data)
@@ -1429,39 +1459,44 @@ class PortfolioActivity(activity.Activity):
def _update_description(self, data):
uid, text = self._data_loader(data)
- if uid in self._uids:
- _logger.debug('updating description %s' % (uid))
- self._descriptions[self._uids.index(uid)] = text
- if self.i == self._uids.index(uid):
- self._description.set_label(text)
- if self.initiating:
- self._dirty[self._uids.index(uid)] = True
+ slide = self._uid_to_slide(uid)
+ if slide is None:
+ _logger.debug('slide %s not found' % (uid))
+ return
+ _logger.debug('updating description %s' % (uid))
+ slide.description = text
+ if self.i == self._slides.index(slide):
+ self._description.set_label(text)
+ if self.initiating:
+ slide.dirty = True
def _update_title(self, data):
uid, text = self._data_loader(data)
- if uid in self._uids:
- _logger.debug('updating title %s' % (uid))
- self._titles[self._uids.index(uid)] = text
- if self.i == self._uids.index(uid):
- self._title.set_label(text)
+ slide = self._uid_to_slide(uid)
+ if slide is None:
+ _logger.debug('slide %s not found' % (uid))
+ return
+ _logger.debug('updating title %s' % (uid))
+ slide.title = text
+ if self.i == self._slides.index(slide):
+ self._title.set_label(text)
+ if self.initiating:
+ slide.dirty = True
def _share_colors(self):
_logger.debug('sharing colors')
self._send_event('c:%s' % (self._data_dumper(self._colors)))
def _share_slides(self):
- for i in range(len(self._uids)):
- if self._favs[i]:
- _logger.debug('sharing %s' % (self._uids[i]))
- gobject.idle_add(self._send_event, 's:' + str(
- self._dump(self._uids[i],
- self._titles[i],
- self._previews[i],
- self._descriptions[i])))
-
- def _send_star(self, i, status):
- _logger.debug('sharing star for %s (%s)' % (self._uids[i], str(status)))
- self._send_event('S:%s' % (self._dump(self._uids[i], status)))
+ for slide in self._slides:
+ if slide.active and slide.fav:
+ _logger.debug('sharing %s' % (slide.uid))
+ gobject.idle_add(self._send_event, 's:%s' % (
+ str(self._dump(slide))))
+
+ def _send_star(self, uid, status):
+ _logger.debug('sharing star for %s (%s)' % (uid, str(status)))
+ self._send_event('S:%s' % (self._data_dumper([uid, status])))
def _send_event(self, text):
''' Send event through the tube. '''