From aaa85c82cc15781dcfd00dd6d6a05a799910915e Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Thu, 12 Mar 2009 12:04:17 +0000 Subject: Remove transfer icon from frame when the local user cancels it #483 --- 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) -- cgit v0.9.1