Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/palettes.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/journal/palettes.py')
-rw-r--r--src/jarabe/journal/palettes.py128
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'