diff options
author | Simon Schampijer <simon@schampijer.de> | 2007-09-03 21:28:59 (GMT) |
---|---|---|
committer | Simon Schampijer <simon@schampijer.de> | 2007-09-03 21:28:59 (GMT) |
commit | 4aace42d6d19e928daa666c5264203eb525f0b96 (patch) | |
tree | 2e26e78a403be338ad789628d77ae938dfca3eed /sugar | |
parent | 6c43e80c452d27947fb141477a02204c7f9bdf02 (diff) | |
parent | b104f1e11ebb711869dbe55a374c96f7b2cd0a5f (diff) |
Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar
Diffstat (limited to 'sugar')
-rw-r--r-- | sugar/Makefile.am | 1 | ||||
-rw-r--r-- | sugar/activity/activityfactoryservice.py | 2 | ||||
-rw-r--r-- | sugar/activity/bundle.py | 27 | ||||
-rw-r--r-- | sugar/date.py | 57 | ||||
-rw-r--r-- | sugar/graphics/objectchooser.py | 43 |
5 files changed, 57 insertions, 73 deletions
diff --git a/sugar/Makefile.am b/sugar/Makefile.am index dffca33..4b94ff1 100644 --- a/sugar/Makefile.am +++ b/sugar/Makefile.am @@ -3,7 +3,6 @@ SUBDIRS = activity clipboard graphics objects presence datastore sugardir = $(pythondir)/sugar sugar_PYTHON = \ __init__.py \ - date.py \ env.py \ logger.py \ ltihooks.py \ diff --git a/sugar/activity/activityfactoryservice.py b/sugar/activity/activityfactoryservice.py index 63265a1..682abaa 100644 --- a/sugar/activity/activityfactoryservice.py +++ b/sugar/activity/activityfactoryservice.py @@ -163,4 +163,4 @@ def run(bundle_path): _sugarext.set_application_name(bundle.get_name()) factory = ActivityFactoryService(bundle.get_service_name(), - bundle.get_class()) + bundle.activity_class) diff --git a/sugar/activity/bundle.py b/sugar/activity/bundle.py index 8bf3386..cccff5a 100644 --- a/sugar/activity/bundle.py +++ b/sugar/activity/bundle.py @@ -59,6 +59,9 @@ class Bundle: self._init_with_path(path) def _init_with_path(self, path): + self.activity_class = None + self.bundle_exec = None + self._name = None self._icon = None self._service_name = None @@ -116,18 +119,10 @@ class Bundle: logging.error('%s must specify a name' % self._path) if cp.has_option(section, 'class'): - self._class = cp.get(section, 'class') - self._exec = '%s --bundle-path="%s"' % ( - env.get_bin_path(_PYTHON_FACTORY), self._path) + self.activity_class = cp.get(section, 'class') elif cp.has_option(section, 'exec'): - self._class = None - cmdline = cp.get(section, 'exec') - cmdline = os.path.join(self._path, cmdline) - cmdline = cmdline.replace('$SUGAR_BUNDLE_PATH', self._path) - cmdline = os.path.expandvars(cmdline) - self._exec = cmdline + self.bundle_exec = cp.get(section, 'exec') else: - self._exec = None self._valid = False logging.error('%s must specify exec or class' % self._path) @@ -232,9 +227,17 @@ class Bundle: """Get the activity version""" return self._activity_version - def get_exec(self): + def get_command(self): """Get the command to execute to launch the activity factory""" - return self._exec + if self.bundle_exec: + command = os.path.join(self._path, self.bundle_exec) + command = command.replace('$SUGAR_BUNDLE_PATH', self._path) + command = os.path.expandvars(command) + else: + command = '%s --bundle-path="%s"' % ( + env.get_bin_path(_PYTHON_FACTORY), self._path) + + return command def get_class(self): """Get the main Activity class""" diff --git a/sugar/date.py b/sugar/date.py deleted file mode 100644 index 3f4dcc2..0000000 --- a/sugar/date.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Simple date-representation model""" - -# Copyright (C) 2006-2007, Red Hat, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -import datetime - -class Date(object): - """Date-object storing a simple time.time() float - - Useful to display dates in the UI in an - abbreviated and easy to read format. - """ - def __init__(self, timestamp): - """Initialise via a timestamp (floating point value)""" - self._today = datetime.date.today() - self._timestamp = timestamp - - def __str__(self): - """Produce a formatted date representation - - Eventually this should produce a localised version - of the date. At the moment it always produces English - dates in long form with Today and Yesterday - special-cased and dates from this year not presenting - the year in the date. - """ - date = datetime.date.fromtimestamp(self._timestamp) - - # FIXME localization - if date == self._today: - result = 'Today' - elif date == self._today - datetime.timedelta(1): - result = 'Yesterday' - elif date.year == self._today.year: - result = date.strftime('%B %d') - else: - result = date.strftime('%B %d, %Y') - - time = datetime.datetime.fromtimestamp(self._timestamp) - result = result + ', ' + time.strftime('%I:%M %p') - - return result diff --git a/sugar/graphics/objectchooser.py b/sugar/graphics/objectchooser.py index 4128cf3..1c0dd3a 100644 --- a/sugar/graphics/objectchooser.py +++ b/sugar/graphics/objectchooser.py @@ -17,6 +17,7 @@ import logging import time +from gettext import gettext as _ import gtk import hippo @@ -31,6 +32,9 @@ from sugar.datastore import datastore from sugar import activity from sugar.objects import objecttype +# TODO: Activities should request the Journal to open objectchooser dialogs. In +# that way, we'll be able to reuse most of this code inside the Journal. + class ObjectChooser(gtk.Dialog): def __init__(self, title=None, parent=None, flags=0): gtk.Dialog.__init__(self, title, parent, flags, (gtk.STOCK_CANCEL, @@ -156,8 +160,7 @@ class CollapsedEntry(CanvasRoundBox): def _format_date(self): """ Convert from a string in iso format to a more human-like format. """ - ti = time.strptime(self.jobject.metadata['mtime'], "%Y-%m-%dT%H:%M:%S") - return str(Date(time.mktime(ti))) + return _get_elapsed_string(self.jobject.metadata['mtime']) def _format_title(self): return '"%s"' % self.jobject.metadata['title'] @@ -169,3 +172,39 @@ class CollapsedEntry(CanvasRoundBox): else: self.props.border_color = style.COLOR_BLACK.get_int() self.props.background_color = style.COLOR_PANEL_GREY.get_int() + +def _get_elapsed_string(date_string, max_levels=2): + ti = time.strptime(date_string, "%Y-%m-%dT%H:%M:%S") + + units = [[_('%d year'), _('%d years'), 356 * 24 * 60 * 60], + [_('%d month'), _('%d months'), 30 * 24 * 60 * 60], + [_('%d week'), _('%d weeks'), 7 * 24 * 60 * 60], + [_('%d day'), _('%d days'), 24 * 60 * 60], + [_('%d hour'), _('%d hours'), 60 * 60], + [_('%d minute'), _('%d minutes'), 60], + [_('%d second'), _('%d seconds'), 1]] + levels = 0 + result = '' + elapsed_seconds = int(time.time() - time.mktime(ti)) + for name_singular, name_plural, factor in units: + elapsed_units = elapsed_seconds / factor + if elapsed_units > 0: + + if levels > 0: + if max_levels - levels == 1: + result += _(' and ') + else: + result += _(', ') + + if elapsed_units == 1: + result += name_singular % elapsed_units + else: + result += name_plural % elapsed_units + elapsed_seconds -= elapsed_units * factor + levels += 1 + + if levels == max_levels: + break + + return result + |