Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/PortfolioActivity.py
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2011-05-11 19:02:39 (GMT)
committer Walter Bender <walter.bender@gmail.com>2011-05-11 19:02:39 (GMT)
commit21992f3cc5cbd27a87d85ecf55eb181760bb2d16 (patch)
tree06c6687d86146aa1795430ac28e88a137a5fabf2 /PortfolioActivity.py
parentfc5153e84281a179a0a2881f945d73f96abbe577 (diff)
cleaning up save code
Diffstat (limited to 'PortfolioActivity.py')
-rw-r--r--PortfolioActivity.py276
1 files changed, 52 insertions, 224 deletions
diff --git a/PortfolioActivity.py b/PortfolioActivity.py
index 3687fad..b55b31e 100644
--- a/PortfolioActivity.py
+++ b/PortfolioActivity.py
@@ -14,9 +14,6 @@
import gtk
import gobject
import os
-import gobject
-
-import pango
import sugar
from sugar.activity import activity
@@ -33,13 +30,16 @@ if _have_toolbox:
from sugar.activity.widgets import StopButton
from sugar.graphics.toolbarbox import ToolbarButton
-from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.menuitem import MenuItem
from sugar.datastore import datastore
from sugar import mime
from sugar import profile
from sprites import Sprites, Sprite
+from exporthtml import save_html
+from utils import get_path, lighter_color, svg_str_to_pixbuf, \
+ load_svg_from_file, button_factory, label_factory, separator_factory, \
+ slider_factory, get_pixbuf_from_journal, genblank, get_hardware
from gettext import gettext as _
@@ -68,92 +68,6 @@ SHORTX = 50
SHORTY = 700
-def _luminance(color):
- ''' Calculate luminance value '''
- return int(color[0:2], 16) * 0.3 + int(color[2:4], 16) * 0.6 + int(color[4:6]) * 0.1
-
-
-def _lighter_color(colors):
- ''' Which color is lighter? Use that one for the text background '''
- if _luminance(colors[0][1:6]) > _luminance(colors[1][1:6]):
- return 0
- return 1
-
-
-def _svg_str_to_pixbuf(svg_string):
- ''' Load pixbuf from SVG string '''
- pl = gtk.gdk.PixbufLoader('svg')
- pl.write(svg_string)
- pl.close()
- pixbuf = pl.get_pixbuf()
- return pixbuf
-
-
-def _load_svg_from_file(file_path, width, height):
- '''Create a pixbuf from SVG in a file. '''
- return gtk.gdk.pixbuf_new_from_file_at_size(file_path, width, height)
-
-
-def _button_factory(icon_name, tooltip, callback, toolbar, cb_arg=None,
- accelerator=None):
- '''Factory for making toolbar buttons'''
- my_button = ToolButton(icon_name)
- my_button.set_tooltip(tooltip)
- my_button.props.sensitive = True
- if accelerator is not None:
- my_button.props.accelerator = accelerator
- if cb_arg is not None:
- my_button.connect('clicked', callback, cb_arg)
- else:
- my_button.connect('clicked', callback)
- if hasattr(toolbar, 'insert'): # the main toolbar
- toolbar.insert(my_button, -1)
- else: # or a secondary toolbar
- toolbar.props.page.insert(my_button, -1)
- my_button.show()
- return my_button
-
-
-def _label_factory(label, toolbar):
- ''' Factory for adding a label to a toolbar '''
- my_label = gtk.Label(label)
- my_label.set_line_wrap(True)
- my_label.show()
- toolitem = gtk.ToolItem()
- toolitem.add(my_label)
- toolbar.insert(toolitem, -1)
- toolitem.show()
- return my_label
-
-
-def _separator_factory(toolbar, visible=True, expand=False):
- ''' Factory for adding a separator to a toolbar '''
- separator = gtk.SeparatorToolItem()
- separator.props.draw = visible
- separator.set_expand(expand)
- toolbar.insert(separator, -1)
- separator.show()
-
-
-LOWER = 1
-DEFAULT = 2
-UPPER = 30
-
-
-def _slider_factory(tooltip, callback, toolbar, cb_arg=None):
- ''' Factory for adding a slider to a toolbar '''
- _adjustment = gtk.Adjustment(DEFAULT, LOWER, UPPER,
- 1, 5, 0)
- _adjustment.connect('value_changed', callback)
- _range = gtk.HScale(_adjustment)
- _range.set_size_request(240, 15)
- _range_tool = gtk.ToolItem()
- _range_tool.add(_range)
-
- toolbar.insert(_range_tool, -1)
- return _adjustment
-
-
class PortfolioActivity(activity.Activity):
''' Make a slideshow from starred Journal entries. '''
@@ -161,6 +75,8 @@ class PortfolioActivity(activity.Activity):
''' Initialize the toolbars and the work surface '''
super(PortfolioActivity, self).__init__(handle)
+ self._tmp_path = get_path(activity, 'instance')
+
self._setup_toolbars(_have_toolbox)
self._setup_canvas()
self._setup_workspace()
@@ -186,7 +102,7 @@ class PortfolioActivity(activity.Activity):
self._colors = profile.get_color().to_string().split(',')
# Use the lighter color for the text background
- if _lighter_color(self._colors) == 0:
+ if lighter_color(self._colors) == 0:
tmp = self._colors[0]
self._colors[0] = self._colors[1]
self._colors[1] = tmp
@@ -205,28 +121,28 @@ class PortfolioActivity(activity.Activity):
# Generate the sprites we'll need...
self._sprites = Sprites(self._canvas)
- self._title = Sprite(self._sprites, 0, 0, _svg_str_to_pixbuf(
- _genblank(self._width, int(TITLEH * self._scale),
+ self._title = Sprite(self._sprites, 0, 0, svg_str_to_pixbuf(
+ genblank(self._width, int(TITLEH * self._scale),
self._colors)))
self._title.set_label_attributes(int(titlef * self._scale),
rescale=False)
self._preview = Sprite(self._sprites,
int((self._width - int(PREVIEWW * self._scale)) / 2),
- int(PREVIEWY * self._scale), _svg_str_to_pixbuf(_genblank(
+ int(PREVIEWY * self._scale), svg_str_to_pixbuf(genblank(
int(PREVIEWW * self._scale), int(PREVIEWH * self._scale),
self._colors)))
self._full_screen = Sprite(self._sprites,
int((self._width - int(FULLW * self._scale)) / 2),
- int(PREVIEWY * self._scale), _svg_str_to_pixbuf(
- _genblank(int(FULLW * self._scale), int(FULLH * self._scale),
+ int(PREVIEWY * self._scale), svg_str_to_pixbuf(
+ genblank(int(FULLW * self._scale), int(FULLH * self._scale),
self._colors)))
self._description = Sprite(self._sprites,
int(DESCRIPTIONX * self._scale),
int(DESCRIPTIONY * self._scale),
- _svg_str_to_pixbuf(
- _genblank(int(self._width - (2 * DESCRIPTIONX * self._scale)),
+ svg_str_to_pixbuf(
+ genblank(int(self._width - (2 * DESCRIPTIONX * self._scale)),
int(DESCRIPTIONH * self._scale),
self._colors)))
self._description.set_label_attributes(int(descriptionf * self._scale))
@@ -234,8 +150,8 @@ class PortfolioActivity(activity.Activity):
self._description2 = Sprite(self._sprites,
int(SHORTX * self._scale),
int(SHORTY * self._scale),
- _svg_str_to_pixbuf(
- _genblank(int(self._width - (2 * SHORTX * self._scale)),
+ svg_str_to_pixbuf(
+ genblank(int(self._width - (2 * SHORTX * self._scale)),
int(SHORTH * self._scale),
self._colors)))
self._description2.set_label_attributes(int(descriptionf * self._scale))
@@ -248,8 +164,6 @@ class PortfolioActivity(activity.Activity):
self._my_gc = self._my_canvas.images[0].new_gc()
self._my_canvas.set_layer(1)
- self._text_color = self._my_gc.get_colormap().alloc_color('#000000')
- self._fd = pango.FontDescription('Sans')
self._clear_screen()
@@ -258,7 +172,7 @@ class PortfolioActivity(activity.Activity):
self._show_slide(self.i)
self._playing = False
- self._rate = DEFAULT
+ self._rate = 2
def _setup_toolbars(self, have_toolbox):
''' Setup the toolbars. '''
@@ -288,25 +202,31 @@ class PortfolioActivity(activity.Activity):
toolbox.set_current_toolbar(1)
self.toolbar = primary_toolbar
- self._prev_button = _button_factory(
+ self._prev_button = button_factory(
'go-previous-inactive', _('Prev slide'), self._prev_cb,
self.toolbar)
- self._next_button = _button_factory(
+ self._next_button = button_factory(
'go-next', _('Next slide'), self._next_cb,
self.toolbar)
- _separator_factory(self.toolbar)
+ separator_factory(self.toolbar)
- self._auto_button = _button_factory(
+ self._auto_button = button_factory(
'media-playlist-repeat', _('Autoplay'), self._autoplay_cb,
self.toolbar)
- self._slider = _slider_factory(
+ self._slider = slider_factory(
_('Adjust playback speed'), self._speed_cb, self.toolbar)
+ separator_factory(self.toolbar)
+
+ self._save_button = button_factory(
+ 'transfer-from-text-uri-list', _('Save as HTML'),
+ self._save_as_html_cb, self.toolbar)
+
if _have_toolbox:
- _separator_factory(toolbox.toolbar, False, True)
+ separator_factory(toolbox.toolbar, False, True)
stop_button = StopButton(self)
stop_button.props.accelerator = '<Ctrl>q'
@@ -358,6 +278,29 @@ class PortfolioActivity(activity.Activity):
self._rate = self._slider.value
self._slider.set_value(int(self._rate + 0.5))
+ def _save_as_html_cb(self, button=None):
+ self._save_button.set_icon('save-in-progress')
+ results = save_html(self._dsobjects, profile.get_nick_name(),
+ self._tmp_path)
+ html_file = os.path.join(self._tmp_path, 'tmp.html')
+ f = open(html_file, 'w')
+ f.write(results)
+ f.close()
+
+ dsobject = datastore.create()
+ dsobject.metadata['title'] = profile.get_nick_name() + ' ' + \
+ _('Portfolio')
+ dsobject.metadata['icon-color'] = profile.get_color().to_string()
+ dsobject.metadata['mime_type'] = 'text/html'
+ dsobject.set_file_path(html_file)
+ dsobject.metadata['activity'] = 'org.laptop.WebActivity'
+ datastore.write(dsobject)
+ dsobject.destroy()
+
+ gobject.timeout_add(250, self._save_button.set_icon,
+ 'transfer-from-text-uri-list')
+ return
+
def _clear_screen(self):
self._my_gc.set_foreground(
self._my_gc.get_colormap().alloc_color(self._colors[0]))
@@ -442,118 +385,3 @@ class PortfolioActivity(activity.Activity):
''' Mark a region for refresh '''
self._canvas.window.invalidate_rect(
gtk.gdk.Rectangle(int(x), int(y), int(w), int(h)), False)
-
-
-def get_pixbuf_from_journal(dsobject, w, h):
- """ Load a pixbuf from a Journal object. """
- # _pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path,
- try:
- _pixbufloader = \
- gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- _pixbufloader.set_size(min(300, int(w)), min(225, int(h)))
- _pixbufloader.write(dsobject.metadata['preview'])
- _pixbufloader.close()
- _pixbuf = _pixbufloader.get_pixbuf()
- except:
- _pixbuf = None
- return _pixbuf
-
-
-def _genblank(w, h, colors):
- svg = SVG()
- svg.set_colors(colors)
- svg_string = svg.header(w, h)
- svg_string += svg.footer()
- return svg_string
-
-
-'''
-Are we on an OLPC XO?
-'''
-
-
-def get_hardware():
- """ Determine whether we are using XO 1.0, 1.5, or "unknown" hardware """
- if _get_dmi('product_name') != 'XO':
- return 'UNKNOWN'
- version = _get_dmi('product_version')
- if version == '1':
- return 'XO1'
- elif version == '1.5':
- return 'XO15'
- else:
- return 'UNKNOWN'
-
-
-def _get_dmi(node):
- path = os.path.join('/sys/class/dmi/id', node)
- try:
- return open(path).readline().strip()
- except:
- return None
-
-
-class SVG:
- ''' SVG generators '''
-
- def __init__(self):
- self._scale = 1
- self._stroke_width = 1
- self._fill = '#FFFFFF'
- self._stroke = '#FFFFFF'
-
- def _svg_style(self, extras=""):
- return "%s%s%s%s%s%f%s%s%s" % ("style=\"fill:", self._fill, ";stroke:",
- self._stroke, ";stroke-width:",
- self._stroke_width, ";", extras,
- "\" />\n")
-
- def _svg_rect(self, w, h, rx, ry, x, y):
- svg_string = " <rect\n"
- svg_string += " width=\"%f\"\n" % (w)
- svg_string += " height=\"%f\"\n" % (h)
- svg_string += " rx=\"%f\"\n" % (rx)
- svg_string += " ry=\"%f\"\n" % (ry)
- svg_string += " x=\"%f\"\n" % (x)
- svg_string += " y=\"%f\"\n" % (y)
- self.set_stroke_width(1.0)
- svg_string += self._svg_style()
- return svg_string
-
- def _background(self, w=80, h=60, scale=1):
- return self._svg_rect((w - 0.5) * scale, (h - 0.5) * scale,
- 1, 1, 0.25, 0.25)
-
- def header(self, w=80, h=60, scale=1, background=True):
- svg_string = "<?xml version=\"1.0\" encoding=\"UTF-8\""
- svg_string += " standalone=\"no\"?>\n"
- svg_string += "<!-- Created with Emacs -->\n"
- svg_string += "<svg\n"
- svg_string += " xmlns:svg=\"http://www.w3.org/2000/svg\"\n"
- svg_string += " xmlns=\"http://www.w3.org/2000/svg\"\n"
- svg_string += " version=\"1.0\"\n"
- svg_string += "%s%f%s" % (" width=\"", scale * w * self._scale,
- "\"\n")
- svg_string += "%s%f%s" % (" height=\"", scale * h * self._scale,
- "\">\n")
- svg_string += "%s%f%s%f%s" % ("<g\n transform=\"matrix(",
- self._scale, ",0,0,", self._scale,
- ",0,0)\">\n")
- if background:
- svg_string += self._background(w, h, scale)
- return svg_string
-
- def footer(self):
- svg_string = "</g>\n"
- svg_string += "</svg>\n"
- return svg_string
-
- def set_scale(self, scale=1.0):
- self._scale = scale
-
- def set_colors(self, colors):
- self._stroke = colors[0]
- self._fill = colors[1]
-
- def set_stroke_width(self, stroke_width=1.0):
- self._stroke_width = stroke_width