Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@sugarlabs.org>2009-03-12 12:04:17 (GMT)
committer Tomeu Vizoso <tomeu@sugarlabs.org>2009-03-12 12:04:17 (GMT)
commitaaa85c82cc15781dcfd00dd6d6a05a799910915e (patch)
tree16d0ee2a9531b216eac4b14fe458057cbc31c95f
parentc55090e3259ac5ede93fd6f769b7a8ba88bf0f64 (diff)
Remove transfer icon from frame when the local user cancels it #483
-rw-r--r--src/jarabe/frame/activitiestray.py39
-rw-r--r--src/jarabe/model/filetransfer.py18
2 files changed, 39 insertions, 18 deletions
diff --git a/src/jarabe/frame/activitiestray.py b/src/jarabe/frame/activitiestray.py
index fcdb613..88df5df 100644
--- a/src/jarabe/frame/activitiestray.py
+++ b/src/jarabe/frame/activitiestray.py
@@ -436,8 +436,12 @@ class ActivitiesTray(HTray):
class BaseTransferButton(ToolButton):
"""Button with a notification attached
"""
- def __init__(self):
+ def __init__(self, file_transfer):
ToolButton.__init__(self)
+
+ self.file_transfer = file_transfer
+ file_transfer.connect('notify::state', self.__notify_state_cb)
+
icon = Icon()
self.props.icon_widget = icon
icon.show()
@@ -452,18 +456,28 @@ class BaseTransferButton(ToolButton):
frame.remove_notification(self.notif_icon)
self.notif_icon = None
+ def __notify_state_cb(self, file_transfer, pspec):
+ logging.debug('_update state: %r %r' % (file_transfer.props.state,
+ file_transfer.reason_last_change))
+ if file_transfer.props.state == filetransfer.FT_STATE_CANCELLED:
+ if file_transfer.reason_last_change == \
+ filetransfer.FT_REASON_LOCAL_STOPPED:
+ frame = jarabe.frame.get_view()
+ frame.remove_notification(self.notif_icon)
+ self.props.parent.remove(self)
+
class IncomingTransferButton(BaseTransferButton):
"""UI element representing an ongoing incoming file transfer
"""
def __init__(self, file_transfer):
- BaseTransferButton.__init__(self)
+ BaseTransferButton.__init__(self, file_transfer)
self._object_id = None
self._metadata = {}
- self._file_transfer = file_transfer
- self._file_transfer.connect('notify::state', self.__notify_state_cb)
- self._file_transfer.connect('notify::transferred-bytes',
- self.__notify_transferred_bytes_cb)
+
+ file_transfer.connect('notify::state', self.__notify_state_cb)
+ file_transfer.connect('notify::transferred-bytes',
+ self.__notify_transferred_bytes_cb)
icons = gio.content_type_get_icon(file_transfer.mime_type).props.names
icons.append('application-octet-stream')
@@ -484,7 +498,7 @@ class IncomingTransferButton(BaseTransferButton):
gtk.CORNER_TOP_LEFT)
def create_palette(self):
- palette = IncomingTransferPalette(self._file_transfer)
+ palette = IncomingTransferPalette(self.file_transfer)
palette.props.invoker = FrameWidgetInvoker(self)
palette.set_group_id('frame')
return palette
@@ -555,9 +569,7 @@ class OutgoingTransferButton(BaseTransferButton):
"""UI element representing an ongoing outgoing file transfer
"""
def __init__(self, file_transfer):
- BaseTransferButton.__init__(self)
-
- self._file_transfer = file_transfer
+ BaseTransferButton.__init__(self, file_transfer)
icons = gio.content_type_get_icon(file_transfer.mime_type).props.names
icons.append('application-octet-stream')
@@ -579,7 +591,7 @@ class OutgoingTransferButton(BaseTransferButton):
gtk.CORNER_TOP_LEFT)
def create_palette(self):
- palette = OutgoingTransferPalette(self._file_transfer)
+ palette = OutgoingTransferPalette(self.file_transfer)
palette.props.invoker = FrameWidgetInvoker(self)
palette.set_group_id('frame')
return palette
@@ -739,7 +751,7 @@ class IncomingTransferPalette(BaseTransferPalette):
return file_name
def __decline_activate_cb(self, menu_item):
- self.file_transfer.decline()
+ self.file_transfer.cancel()
def __cancel_activate_cb(self, menu_item):
self.file_transfer.cancel()
@@ -820,9 +832,6 @@ class OutgoingTransferPalette(BaseTransferPalette):
elif self.file_transfer.props.state == filetransfer.FT_STATE_COMPLETED:
# TODO: What to do here?
self.update_progress()
- elif self.file_transfer.props.state == filetransfer.FT_STATE_CANCELLED:
- # TODO: What to do here?
- self.update_progress()
def __cancel_activate_cb(self, menu_item):
self.file_transfer.cancel()
diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py
index 997fcc3..964b6b4 100644
--- a/src/jarabe/model/filetransfer.py
+++ b/src/jarabe/model/filetransfer.py
@@ -39,6 +39,14 @@ FT_STATE_OPEN = 3
FT_STATE_COMPLETED = 4
FT_STATE_CANCELLED = 5
+FT_REASON_NONE = 0
+FT_REASON_REQUESTED = 1
+FT_REASON_LOCAL_STOPPED = 2
+FT_REASON_REMOTE_STOPPED = 3
+FT_REASON_LOCAL_ERROR = 4
+FT_REASON_LOCAL_ERROR = 5
+FT_REASON_REMOTE_ERROR = 6
+
# FIXME: use constants from tp-python once the spec is undrafted
CHANNEL_TYPE_FILE_TRANSFER = \
'org.freedesktop.Telepathy.Channel.Type.FileTransfer'
@@ -113,6 +121,7 @@ class BaseFileTransfer(gobject.GObject):
self.description = None
self.mime_type = None
self.initial_offset = 0
+ self.reason_last_change = FT_REASON_NONE
def set_channel(self, channel):
self.channel = channel
@@ -158,6 +167,7 @@ class BaseFileTransfer(gobject.GObject):
def __state_changed_cb(self, state, reason):
logging.debug('__state_changed_cb %r %r' % (state, reason))
+ self.reason_last_change = reason
self.props.state = state
def _set_state(self, state):
@@ -196,9 +206,6 @@ class IncomingFileTransfer(BaseFileTransfer):
self._socket_address = channel_ft.AcceptFile(SOCKET_ADDRESS_TYPE_UNIX,
SOCKET_ACCESS_CONTROL_LOCALHOST, '', 0)
- def decline(self):
- self.channel[CHANNEL].Close()
-
def __notify_state_cb(self, file_transfer, pspec):
logging.debug('__notify_state_cb %r' % self.props.state)
if self.props.state == FT_STATE_OPEN:
@@ -309,18 +316,23 @@ def _new_channels_cb(connection, channels):
new_file_transfer.send(None, file_transfer=incoming_file_transfer)
def _monitor_connection(connection):
+ logging.debug('connection added %r' % connection)
connection[CONNECTION_INTERFACE_REQUESTS].connect_to_signal('NewChannels',
lambda channels: _new_channels_cb(connection, channels))
def _connection_addded_cb(conn_watcher, connection):
_monitor_connection(connection)
+def _connection_removed_cb(conn_watcher, connection):
+ logging.debug('connection removed %r' % connection)
+
_conn_watcher = None
def init():
global _conn_watcher
_conn_watcher = connection_watcher.ConnectionWatcher()
_conn_watcher.connect('connection-added', _connection_addded_cb)
+ _conn_watcher.connect('connection-removed', _connection_removed_cb)
for connection in _conn_watcher.get_connections():
_monitor_connection(connection)