diff options
author | Walter 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) |
commit | 21992f3cc5cbd27a87d85ecf55eb181760bb2d16 (patch) | |
tree | 06c6687d86146aa1795430ac28e88a137a5fabf2 /PortfolioActivity.py | |
parent | fc5153e84281a179a0a2881f945d73f96abbe577 (diff) |
cleaning up save code
Diffstat (limited to 'PortfolioActivity.py')
-rw-r--r-- | PortfolioActivity.py | 276 |
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 |