diff options
Diffstat (limited to 'src/jarabe/journal/palettes.py')
-rw-r--r-- | src/jarabe/journal/palettes.py | 128 |
1 files changed, 124 insertions, 4 deletions
diff --git a/src/jarabe/journal/palettes.py b/src/jarabe/journal/palettes.py index 8fc1e5d..e1d1e7d 100644 --- a/src/jarabe/journal/palettes.py +++ b/src/jarabe/journal/palettes.py @@ -37,6 +37,39 @@ from jarabe.model import mimeregistry from jarabe.journal import misc from jarabe.journal import model +friends_model = friends.get_model() + + +class BulkOperationDetails(): + + def __init__(self, group_name, friend, friend_keys, total, counter, proceed_cb): + self._group_name = group_name + self._friend = friend + self._friend_keys = friend_keys + self._counter = counter + self._total = total + self._proceed_cb = proceed_cb + + def _get_group_name(self): + return self._group_name + + def _get_friend_keys(self): + return self._friend_keys + + def _get_counter(self): + return self._counter + + def _get_total(self): + return self._total + + def _get_proceed_cb(self): + return self._proceed_cb + + def _set_operation_status(self, status): + friends_model._set_last_operation_status_of_friend_in_group(self._group_name, + self._friend.get_key(), + status) + class ObjectPalette(Palette): @@ -117,6 +150,10 @@ class ObjectPalette(Palette): friends_menu.connect('friend-selected', self.__friend_selected_cb) menu_item.set_submenu(friends_menu) + groups_menu = GroupsMenu() + groups_menu.connect('group-selected', self.__group_selected_cb) + friends_menu._set_group_menu(groups_menu) + if detail == True: menu_item = MenuItem(_('View Details'), 'go-right') menu_item.connect('activate', self.__detail_activate_cb) @@ -150,7 +187,8 @@ class ObjectPalette(Palette): def __volume_error_cb(self, menu_item, message, severity): self.emit('volume-error', message, severity) - def __friend_selected_cb(self, menu_item, buddy): + def __friend_selected_cb(self, menu_item, buddy, + bulk_operation_details=None): logging.debug('__friend_selected_cb') file_name = model.get_file(self._metadata['uid']) @@ -167,9 +205,51 @@ class ObjectPalette(Palette): if not mime_type: mime_type = mime.get_for_file(file_name) - filetransfer.start_transfer(buddy, file_name, title, description, - mime_type) + mime_type, bulk_operation_details) + + def __group_selected_cb(self, menu_item, group_name): + logging.debug('__group_selected_cb') + if group_name is not None: + friends_model._set_last_group_operation(group_name, + _('(TRANSFER) %s') % (self._metadata['title'],)) + friends_model._set_last_operation_status_of_friends_in_group_with_common_status( + group_name, _('PENDING ...')) + friend_keys = \ + friends_model._get_friend_keys_of_group(group_name) + + self._proceed_with_next_friend(group_name, friend_keys, 0) + + """ + This is the (callback) function that needs to be called per friend. + Note that this function is a callback (and not a looped one), since + the "next" friend iteration begins, only when the current iteration + has finished - which is asynchronous. + """ + def _proceed_with_next_friend(self, group_name, friend_keys, counter): + counter = counter + 1 + + if counter <= len(friend_keys): + friend_key = friend_keys[counter-1] + friend = friends_model._get_friend_by_key(friend_key) + + bulk_operation_details = \ + BulkOperationDetails(group_name, + friend, + friend_keys, + len(friend_keys), + counter, + self._proceed_with_next_friend) + + # Only proceed if the friend is online. + # Else, set the failure-status, and move forward. + if friend.is_present(): + self.__friend_selected_cb(None, friend, bulk_operation_details) + else: + bulk_operation_details._set_operation_status(_('FAILURE:\tFriend' + ' is offline.')) + self._proceed_with_next_friend(group_name, friend_keys, + counter) class CopyMenu(gtk.Menu): @@ -295,6 +375,41 @@ class ClipboardMenu(MenuItem): self._temp_file_path = None +class GroupsMenu(gtk.Menu): + __gtype_name__ = 'GroupsMenu' + + __gsignals__ = { + 'group-selected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([object])), + } + + def __init__(self): + gobject.GObject.__init__(self) + + if filetransfer.file_transfer_available(): + for group in friends_model._get_groups(): + menu_item = MenuItem(text_label=group, + icon_name='zoom-groups') + menu_item.connect('activate', self.__item_activate_cb, + group) + self.append(menu_item) + menu_item.show() + + if not self.get_children(): + menu_item = MenuItem(_('No groups present')) + menu_item.set_sensitive(False) + self.append(menu_item) + menu_item.show() + else: + menu_item = MenuItem(_('No valid connection found')) + menu_item.set_sensitive(False) + self.append(menu_item) + menu_item.show() + + def __item_activate_cb(self, menu_item, group): + self.emit('group-selected', group) + + class FriendsMenu(gtk.Menu): __gtype_name__ = 'JournalFriendsMenu' @@ -307,7 +422,6 @@ class FriendsMenu(gtk.Menu): gobject.GObject.__init__(self) if filetransfer.file_transfer_available(): - friends_model = friends.get_model() for friend in friends_model: if friend.is_present(): menu_item = MenuItem(text_label=friend.get_nick(), @@ -332,6 +446,12 @@ class FriendsMenu(gtk.Menu): def __item_activate_cb(self, menu_item, friend): self.emit('friend-selected', friend) + def _set_group_menu(self, group_menu): + menu_item = MenuItem(_('Select a group, to send')) + menu_item.set_submenu(group_menu) + self.append(menu_item) + menu_item.show() + class StartWithMenu(gtk.Menu): __gtype_name__ = 'JournalStartWithMenu' |