Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/thumbsview.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/journal/thumbsview.py')
-rw-r--r--src/jarabe/journal/thumbsview.py190
1 files changed, 182 insertions, 8 deletions
diff --git a/src/jarabe/journal/thumbsview.py b/src/jarabe/journal/thumbsview.py
index 920bf2c..3debb94 100644
--- a/src/jarabe/journal/thumbsview.py
+++ b/src/jarabe/journal/thumbsview.py
@@ -19,21 +19,195 @@ import gobject
import logging
import hippo
-from jarabe.journal.browse.lazymodel import Source
+from sugar.graphics import style
+from sugar.graphics.icon import CanvasIcon
+from sugar.graphics.xocolor import XoColor
+from sugar.graphics.palette import CanvasInvoker
+
+from jarabe.journal.keepicon import KeepIcon
+from jarabe.journal.objectmodel import Source
from jarabe.journal.browse.tableview import TableView, TableCell
-from jarabe.journal.browse.source import *
+from jarabe.journal.palettes import ObjectPalette
+from jarabe.journal import misc
+from jarabe.journal import model
+
+ROWS = 4
+COLUMNS = 5
+STAR_WIDTH = 30
class ThumbsCell(TableCell, hippo.CanvasBox):
def __init__(self):
TableCell.__init__(self)
- hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_VERTICAL)
- self.label = hippo.CanvasText(
+ hippo.CanvasBox.__init__(self,
+ orientation=hippo.ORIENTATION_VERTICAL,
+ padding_left=style.DEFAULT_SPACING,
+ padding_top=style.DEFAULT_SPACING,
+ spacing=style.DEFAULT_PADDING)
+
+ self.preview_box = hippo.CanvasBox(
+ spacing=style.DEFAULT_PADDING,
+ orientation=hippo.ORIENTATION_HORIZONTAL)
+ self.append(self.preview_box, hippo.PACK_EXPAND)
+
+ star_box = hippo.CanvasBox(
+ orientation=hippo.ORIENTATION_VERTICAL,
+ box_width=STAR_WIDTH)
+ self.preview_box.append(star_box)
+
+ self.keep = KeepIcon(False)
+ self.keep.props.size = style.SMALL_ICON_SIZE
+ self.keep.connect('activated', self.__star_activated_cb)
+ star_box.append(self.keep)
+
+ self.activity_box = hippo.CanvasBox()
+ self.preview_box.append(self.activity_box, hippo.PACK_EXPAND)
+
+ self.thumb = ThumbCanvas(
+ border=style.LINE_WIDTH,
+ border_color=style.COLOR_BUTTON_GREY.get_int(),
+ xalign=hippo.ALIGNMENT_CENTER,
+ yalign=hippo.ALIGNMENT_CENTER)
+ self.activity_box.append(self.thumb, hippo.PACK_EXPAND)
+
+ self.activity_icon = ActivityIcon(
+ border=style.LINE_WIDTH,
+ border_color=style.COLOR_BUTTON_GREY.get_int(),
+ xalign=hippo.ALIGNMENT_CENTER,
+ yalign=hippo.ALIGNMENT_CENTER)
+ self.activity_box.append(self.activity_icon, hippo.PACK_EXPAND)
+
+ title_box = hippo.CanvasBox(
+ orientation=hippo.ORIENTATION_HORIZONTAL)
+ self.append(title_box)
+
+ tool_box = hippo.CanvasBox(
+ orientation=hippo.ORIENTATION_VERTICAL,
+ box_width=STAR_WIDTH)
+ title_box.append(tool_box)
+
+ details = DetailsIcon(
+ size=style.SMALL_ICON_SIZE)
+ details.connect('activated', self.__detail_activated_cb)
+ tool_box.append(details)
+
+ text_box = hippo.CanvasBox(
+ orientation=hippo.ORIENTATION_VERTICAL)
+ title_box.append(text_box)
+
+ self.title = hippo.CanvasText(
+ xalign=hippo.ALIGNMENT_START,
size_mode=hippo.CANVAS_SIZE_ELLIPSIZE_END)
- self.append(self.label)
+ text_box.append(self.title)
+
+ self.date = hippo.CanvasText(
+ xalign=hippo.ALIGNMENT_START,
+ size_mode=hippo.CANVAS_SIZE_ELLIPSIZE_END)
+ text_box.append(self.date)
+
+ def do_fill_in(self):
+ self.title.props.text = self.row[Source.FIELD_TITLE] or ''
+ self.date.props.text = self.row[Source.FIELD_MODIFY_TIME] or ''
+ self.keep.props.keep = int(self.row[Source.FIELD_KEEP] or 0) == 1
+
+ thumb = self.row[Source.FIELD_THUMB]
+
+ w, h = self.activity_box.get_allocation()
+ if w / 4. * 3. > h:
+ w = int(h / 3. * 4.)
+ else:
+ h = int(w / 4. * 3.)
+
+ if thumb is None:
+ self.thumb.set_visible(False)
+ self.activity_icon.set_visible(True)
+ self.activity_icon.set_metadata(self.row.metadata)
+ self.activity_icon.allocate(w, h, True)
+ else:
+ self.activity_icon.set_visible(False)
+ self.thumb.set_visible(True)
+ self.thumb.props.scale_width = w
+ self.thumb.props.scale_height = h
+ self.thumb.props.image = thumb
+ self.thumb.set_metadata(self.row.metadata)
+ self.thumb.allocate(w, h, True)
+
+ def __star_activated_cb(self, keep_button):
+ self.row.metadata['keep'] = not keep_button.props.keep and 1 or 0
+ model.write(self.row.metadata, update_mtime=False)
+
+ def __detail_activated_cb(self, button):
+ self.tree.emit('detail-clicked', self.row[Source.FIELD_UID])
+
+class ActivityCanvas:
+ def __init__(self):
+ self._metadata = None
+ self.connect_after('button-release-event',
+ self.__button_release_event_cb)
+
+ def set_metadata(self, metadata):
+ self.palette = None
+ self._metadata = metadata
+
+ def create_palette(self):
+ if self._metadata is None:
+ return None
+
+ palette = ObjectPalette(self._metadata, detail=True)
+ palette.connect('detail-clicked',
+ self.__detail_clicked_cb)
+ return palette
+
+ def __detail_clicked_cb(self, palette, uid):
+ self.emit('detail-clicked', uid)
+
+ def __button_release_event_cb(self, button, foo):
+ misc.resume(self._metadata)
+ return True
+
+class ActivityIcon(ActivityCanvas, CanvasIcon):
+ def __init__(self, **kwargs):
+ CanvasIcon.__init__(self, **kwargs)
+ ActivityCanvas.__init__(self)
+
+ def set_metadata(self, metadata):
+ ActivityCanvas.set_metadata(self, metadata)
+
+ self.props.file_name = misc.get_icon_name(metadata)
+
+ if misc.is_activity_bundle(metadata):
+ self.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
+ self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ else:
+ if metadata.has_key('icon-color') and metadata['icon-color']:
+ self.props.xo_color = XoColor(self._metadata['icon-color'])
+
+class ThumbCanvas(ActivityCanvas, hippo.CanvasImage):
+ def __init__(self, **kwargs):
+ hippo.CanvasImage.__init__(self, **kwargs)
+ ActivityCanvas.__init__(self)
+
+ self._palette_invoker = CanvasInvoker()
+ self._palette_invoker.attach(self)
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
+class DetailsIcon(CanvasIcon):
+ def __init__(self, **kwargs):
+ CanvasIcon.__init__(self, **kwargs)
+ self.props.icon_name = 'go-right'
+ self.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.stroke_color = style.COLOR_TRANSPARENT.get_svg()
+ self.connect('motion-notify-event', self.__motion_notify_event_cb)
- def fillin(self):
- self.label.props.text = self.row[FIELD_TITLE] or ''
+ def __motion_notify_event_cb(self, icon, event):
+ if event.detail == hippo.MOTION_DETAIL_ENTER:
+ icon.props.fill_color = style.COLOR_BLACK.get_svg()
+ elif event.detail == hippo.MOTION_DETAIL_LEAVE:
+ icon.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
class ThumbsView(TableView):
__gsignals__ = {
@@ -43,4 +217,4 @@ class ThumbsView(TableView):
}
def __init__(self):
- TableView.__init__(self, ThumbsCell, 3, 3)
+ TableView.__init__(self, ThumbsCell, ROWS, COLUMNS)