Ticket #1915: 1915_all.patch

File 1915_all.patch, 12.8 KB (added by erikos, 14 years ago)

Patch against all Journal (pylint checked and with rename of the toolbar icon)

  • src/jarabe/journal/expandedentry.py

    diff --git a/src/jarabe/journal/expandedentry.py b/src/jarabe/journal/expandedentry.py
    index c8e40c1..725c0f9 100644
    a b class ExpandedEntry(hippo.CanvasBox): 
    260260        lines = [
    261261            _('Kind: %s') % (self._metadata.get('mime_type') or _('Unknown'),),
    262262            _('Date: %s') % (self._format_date(),),
    263             _('Size: %s') % (format_size(model.get_file_size(
    264                         self._metadata['uid'])),)]
     263            _('Size: %s') % (format_size(int(self._metadata.get('filesize',
     264                                model.get_file_size(self._metadata['uid']))))),
     265            ]
    265266
    266267        for line in lines:
    267268            text = hippo.CanvasText(text=line,
  • src/jarabe/journal/journaltoolbox.py

    diff --git a/src/jarabe/journal/journaltoolbox.py b/src/jarabe/journal/journaltoolbox.py
    index 61671bc..75c6de5 100644
    a b class SearchToolbar(gtk.Toolbar): 
    109109        self.insert(tool_item, -1)
    110110        tool_item.show()
    111111
     112        self._add_separator(expand=True)
     113
     114        self._sorting_button = SortingButton()
     115        self._sorting_button.connect('clicked', self.__sorting_button_clicked_cb)
     116        self.insert(self._sorting_button, -1)
     117        self._sorting_button.connect('sort-property-changed',
     118                                     self.__sort_changed_cb)
     119        self._sorting_button.show()
     120
    112121        # TODO: enable it when the DS supports saving the buddies.
    113122        #self._with_search_combo = self._get_with_search_combo()
    114123        #tool_item = ToolComboBox(self._with_search_combo)
    class SearchToolbar(gtk.Toolbar): 
    154163        with_search.connect('changed', self._combo_changed_cb)
    155164        return with_search
    156165
     166    def _add_separator(self, expand=False):
     167        separator = gtk.SeparatorToolItem()
     168        separator.props.draw = False
     169        if expand:
     170            separator.set_expand(True)
     171        else:
     172            separator.set_size_request(style.GRID_CELL_SIZE,
     173                                       style.GRID_CELL_SIZE)
     174        self.insert(separator, -1)
     175        separator.show()
     176
    157177    def _add_widget(self, widget, expand=False):
    158178        tool_item = gtk.ToolItem()
    159179        tool_item.set_expand(expand)
    class SearchToolbar(gtk.Toolbar): 
    191211            if text:
    192212                query['query'] = text
    193213
     214        property_, order = self._sorting_button.get_current_sort()
     215
     216        if order == gtk.SORT_ASCENDING:
     217            sign = '+'
     218        else:
     219            sign = '-'
     220        query['order_by'] = [sign + property_]
     221
    194222        return query
    195223
    196224    def _get_date_range(self):
    class SearchToolbar(gtk.Toolbar): 
    213241    def _combo_changed_cb(self, combo):
    214242        self._update_if_needed()
    215243
     244    def __sort_changed_cb(self, button):
     245        self._update_if_needed()
     246
     247    def __sorting_button_clicked_cb(self, button):
     248        self._sorting_button.palette.popup(immediate=True, state=1)
     249
    216250    def _update_if_needed(self):
    217251        new_query = self._build_query()
    218252        if self._query != new_query:
    class EntryToolbar(gtk.Toolbar): 
    456490                                activity_info.get_bundle_id())
    457491            palette.menu.append(menu_item)
    458492            menu_item.show()
     493
     494
     495class SortingButton(ToolButton):
     496    __gtype_name__ = 'JournalSortingButton'
     497
     498    __gsignals__ = {
     499        'sort-property-changed': (gobject.SIGNAL_RUN_FIRST,
     500                                  gobject.TYPE_NONE,
     501                                  ([])),
     502    }
     503
     504    _SORT_OPTIONS = [
     505        ('timestamp', 'view-lastedit', _('Sort by date modified')),
     506        ('creation_time', 'view-created', _('Sort by date created')),
     507        ('filesize', 'view-size', _('Sort by size')),
     508    ]
     509
     510    def __init__(self):
     511        ToolButton.__init__(self)
     512
     513        self._property = 'timestamp'
     514        self._order = gtk.SORT_ASCENDING
     515
     516        self.props.tooltip = _('Sort view')
     517        self.props.icon_name = 'view-lastedit'
     518
     519        for property_, icon, label in self._SORT_OPTIONS:
     520            button = MenuItem(icon_name=icon, text_label=label)
     521            button.connect('activate',
     522                           self.__sort_type_changed_cb,
     523                           property_,
     524                           icon)
     525            button.show()
     526            self.props.palette.menu.insert(button, -1)
     527
     528    def __sort_type_changed_cb(self, widget, property_, icon_name):
     529        self._property = property_
     530        #FIXME: Implement sorting order
     531        self._order = gtk.SORT_ASCENDING
     532        self.emit('sort-property-changed')
     533
     534        self.props.icon_name = icon_name
     535
     536    def get_current_sort(self):
     537        return (self._property, self._order)
  • src/jarabe/journal/listmodel.py

    diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
    index 07f8544..3378350 100644
    a b import logging 
    1919import simplejson
    2020import gobject
    2121import gtk
     22import time
     23from gettext import gettext as _
    2224
    2325from sugar.graphics.xocolor import XoColor
    2426from sugar.graphics import style
    class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource): 
    4850    COLUMN_ICON = 2
    4951    COLUMN_ICON_COLOR = 3
    5052    COLUMN_TITLE = 4
    51     COLUMN_DATE = 5
    52     COLUMN_PROGRESS = 6
    53     COLUMN_BUDDY_1 = 7
    54     COLUMN_BUDDY_2 = 8
    55     COLUMN_BUDDY_3 = 9
     53    COLUMN_TIMESTAMP = 5
     54    COLUMN_CREATION_TIME = 6
     55    COLUMN_FILESIZE = 7
     56    COLUMN_PROGRESS = 8
     57    COLUMN_BUDDY_1 = 9
     58    COLUMN_BUDDY_2 = 10
     59    COLUMN_BUDDY_3 = 11
    5660
    5761    _COLUMN_TYPES = {COLUMN_UID:            str,
    5862                     COLUMN_FAVORITE:       bool,
    5963                     COLUMN_ICON:           str,
    6064                     COLUMN_ICON_COLOR:     object,
    6165                     COLUMN_TITLE:          str,
    62                      COLUMN_DATE:           str,
     66                     COLUMN_TIMESTAMP:      str,
     67                     COLUMN_CREATION_TIME:  str,
     68                     COLUMN_FILESIZE:       str,
    6369                     COLUMN_PROGRESS:       int,
    6470                     COLUMN_BUDDY_1:        object,
    6571                     COLUMN_BUDDY_3:        object,
    class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource): 
    141147        timestamp = int(metadata.get('timestamp', 0))
    142148        self._cached_row.append(util.timestamp_to_elapsed_string(timestamp))
    143149
     150        try:
     151            creation_time = float(metadata.get('creation_time'))
     152        except (TypeError, ValueError):
     153            self._cached_row.append(_('Unknown'))
     154        else:
     155            self._cached_row.append(
     156                util.timestamp_to_elapsed_string(float(creation_time)))
     157
     158        try:
     159            size = int(metadata.get('filesize'))
     160        except (TypeError, ValueError):
     161            self._cached_row.append(_('Unknown'))
     162        else:
     163            self._cached_row.append(util.format_size(size))
     164
    144165        self._cached_row.append(int(metadata.get('progress', 100)))
    145166
    146167        if metadata.get('buddies', ''):
  • src/jarabe/journal/listview.py

    diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
    index 9e19f70..3d6281a 100644
    a b class BaseListView(gtk.Bin): 
    9797        self.cell_title = None
    9898        self.cell_icon = None
    9999        self._title_column = None
    100         self.date_column = None
     100        self.sort_column = None
    101101        self._add_columns()
    102102
    103103        self.tree_view.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
    class BaseListView(gtk.Bin): 
    190190        date = util.timestamp_to_elapsed_string(timestamp)
    191191        date_width = self._get_width_for_string(date)
    192192
    193         self.date_column = gtk.TreeViewColumn()
    194         self.date_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
    195         self.date_column.props.fixed_width = date_width
    196         self.date_column.set_alignment(1)
    197         self.date_column.props.resizable = True
    198         self.date_column.props.clickable = True
    199         self.date_column.pack_start(cell_text)
    200         self.date_column.add_attribute(cell_text, 'text', ListModel.COLUMN_DATE)
    201         self.tree_view.append_column(self.date_column)
     193        self.sort_column = gtk.TreeViewColumn()
     194        self.sort_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
     195        self.sort_column.props.fixed_width = date_width
     196        self.sort_column.set_alignment(1)
     197        self.sort_column.props.resizable = True
     198        self.sort_column.props.clickable = True
     199        self.sort_column.pack_start(cell_text)
     200        self.sort_column.add_attribute(cell_text, 'text', ListModel.COLUMN_TIMESTAMP)
     201        self.tree_view.append_column(self.sort_column)
    202202
    203203    def _get_width_for_string(self, text):
    204204        # Add some extra margin
    class BaseListView(gtk.Bin): 
    252252
    253253    def update_with_query(self, query_dict):
    254254        logging.debug('ListView.update_with_query')
     255        if 'order_by' not in query_dict:
     256            query_dict['order_by'] = ['+timestamp']
     257        if query_dict['order_by'] != self._query.get('order_by'):
     258            property_ = query_dict['order_by'][0][1:]
     259            cell_text = self.sort_column.get_cell_renderers()[0]
     260            self.sort_column.set_attributes(cell_text,
     261                text=getattr(ListModel, 'COLUMN_' + property_.upper(),
     262                             ListModel.COLUMN_TIMESTAMP))
    255263        self._query = query_dict
    256264
    257         if 'order_by' not in self._query:
    258             self._query['order_by'] = ['+timestamp']
    259 
    260265        self.refresh()
    261266
    262267    def refresh(self):
    class BaseListView(gtk.Bin): 
    415420
    416421        while True:
    417422            x, y, width, height = self.tree_view.get_cell_area(path,
    418                                                                self.date_column)
     423                                                               self.sort_column)
    419424            x, y = self.tree_view.convert_tree_to_widget_coords(x, y)
    420425            self.tree_view.queue_draw_area(x, y, width, height)
    421426            if path == end_path:
  • src/jarabe/journal/model.py

    diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
    index ffc62e0..e84d77d 100644
    a b import time 
    2121import shutil
    2222from stat import S_IFMT, S_IFDIR, S_IFREG
    2323import re
     24from operator import itemgetter
    2425
    2526import gobject
    2627import dbus
    DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore' 
    3637DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
    3738
    3839# Properties the journal cares about.
    39 PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'keep', 'buddies',
    40               'icon-color', 'mime_type', 'progress', 'activity', 'mountpoint',
    41               'activity_id', 'bundle_id']
     40PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'creation_time', 'filesize',
     41              'keep', 'buddies', 'icon-color', 'mime_type', 'progress',
     42              'activity', 'mountpoint', 'activity_id', 'bundle_id']
    4243
    4344MIN_PAGES_TO_CACHE = 3
    4445MAX_PAGES_TO_CACHE = 5
    class InplaceResultSet(BaseResultSet): 
    246247
    247248        self._mime_types = query.get('mime_type', [])
    248249
     250        self._sort = query.get('order_by', ['+timestamp'])[0]
     251
    249252    def setup(self):
    250253        self._file_list = []
    251254        self._recurse_dir(self._mount_point)
    class InplaceResultSet(BaseResultSet): 
    254257        self._stopped = True
    255258
    256259    def setup_ready(self):
    257         self._file_list.sort(lambda a, b: b[2] - a[2])
     260        if self._sort[1:] == 'filesize':
     261            keygetter = itemgetter(3)
     262        else:
     263            keygetter = itemgetter(2) # timestamp
     264        self._file_list.sort(lambda a, b: b - a,
     265                             key=keygetter,
     266                             reverse=self._sort[0]=='-')
    258267        self.ready.send(self)
    259268
    260269    def find(self, query):
    class InplaceResultSet(BaseResultSet): 
    273282        files = self._file_list[offset:offset + limit]
    274283
    275284        entries = []
    276         for file_path, stat, mtime_ in files:
     285        for file_path, stat, mtime_, size_ in files:
    277286            metadata = _get_file_metadata(file_path, stat)
    278287            metadata['mountpoint'] = self._mount_point
    279288            entries.append(metadata)
    class InplaceResultSet(BaseResultSet): 
    331340                            add_to_list = False
    332341
    333342                    if add_to_list:
    334                         file_info = (full_path, stat, int(stat.st_mtime))
     343                        file_info = (full_path, stat, int(stat.st_mtime), stat.st_size)
    335344                        self._file_list.append(file_info)
    336345
    337346                    self.progress.send(self)
    def _get_file_metadata(path, stat): 
    344353    return {'uid': path,
    345354            'title': os.path.basename(path),
    346355            'timestamp': stat.st_mtime,
     356            'filesize': stat.st_size,
    347357            'mime_type': gio.content_type_guess(filename=path),
    348358            'activity': '',
    349359            'activity_id': '',