def show_file_request(self, account, contact, file_props): """ Show dialog asking for comfirmation and store location of new file requested by a contact """ if not file_props or not file_props.name: return sec_text = '\t' + _('File: %s') % GLib.markup_escape_text( file_props.name) if file_props.size: sec_text += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.mime_type: sec_text += '\n\t' + _('Type: %s') % file_props.mime_type if file_props.desc: sec_text += '\n\t' + _('Description: %s') % file_props.desc prim_text = _('%s wants to send you a file:') % contact.jid dialog = None def on_response_ok(account, contact, file_props): self.on_file_request_accepted(account, contact, file_props) def on_response_cancel(account, file_props): app.connections[account].send_file_rejection(file_props) dialog = NonModalConfirmationDialog( prim_text, sec_text, on_response_ok=(on_response_ok, account, contact, file_props), on_response_cancel=(on_response_cancel, account, file_props)) dialog.connect( 'delete-event', lambda widget, event: on_response_cancel(account, file_props)) dialog.popup()
def show_completed(self, jid, file_props): """ Show a dialog saying that file (file_props) has been transferred """ def on_open(widget, file_props): dialog.destroy() if not file_props.file_name: return path = os.path.split(file_props.file_name)[0] if os.path.exists(path) and os.path.isdir(path): helpers.launch_file_manager(path) self.tree.get_selection().unselect_all() if file_props.type_ == 'r': # file path is used below in 'Save in' (file_path, file_name) = os.path.split(file_props.file_name) else: file_name = file_props.name sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.type_ == 'r': jid = file_props.sender.split('/')[0] sender_name = app.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() sender = sender_name else: #You is a reply of who sent a file sender = _('You') sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': jid = file_props.receiver.split('/')[0] receiver_name = app.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() recipient = receiver_name else: #You is a reply of who received a file recipient = _('You') sectext += recipient if file_props.type_ == 'r': sectext += '\n\t' + _('Saved in: %s') % file_path dialog = HigDialog(app.interface.roster.window, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, _('File transfer completed'), sectext) if file_props.type_ == 'r': button = Gtk.Button.new_with_mnemonic(_('Open _Containing Folder')) button.connect('clicked', on_open, file_props) dialog.action_area.pack_start(button, True, True, 0) ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) def on_ok(widget): dialog.destroy() ok_button.connect('clicked', on_ok) dialog.show_all()
def set_status(self, file_props, status): """ Change the status of a transfer to state 'status' """ iter_ = self.get_iter_by_sid(file_props.type_, file_props.sid) if iter_ is None: return self.model[iter_][Column.SID] if status == 'stop': file_props.stopped = True elif status == 'ok': file_props.completed = True text = self._format_percent(100) received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PULSE, GLib.MAXINT32) elif status == 'computing': self.model.set(iter_, Column.PULSE, 1) text = _('Checking file…') + '\n' received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) def pulse(): p = self.model.get(iter_, Column.PULSE)[0] if p == GLib.MAXINT32: return False self.model.set(iter_, Column.PULSE, p + 1) return True GLib.timeout_add(100, pulse) elif status == 'hash_error': text = _('File error') + '\n' received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PULSE, GLib.MAXINT32) self.model.set(iter_, Column.IMAGE, self.get_icon(status)) path = self.model.get_path(iter_) self.select_func(path)
def populate(self, file_props): ft_table = Gtk.Table(2, 1) ft_table.set_property('column-spacing', 2) current_row = 1 self.create_window() properties = [] name = file_props.name if file_props.type_ == 'r': file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name properties.append((_('Name: '), GLib.markup_escape_text(file_name))) if file_props.type_ == 'r': type_ = Q_('?Noun:Download') actor = _('Sender: ') sender = file_props.sender.split('/')[0] name = app.contacts.get_first_contact_from_jid( file_props.tt_account, sender).get_shown_name() else: type_ = Q_('?Noun:Upload') actor = _('Recipient: ') receiver = file_props.receiver if hasattr(receiver, 'name'): name = receiver.get_shown_name() else: name = receiver.split('/')[0] properties.append((_('Type: '), type_)) properties.append((actor, GLib.markup_escape_text(name))) transfered_len = file_props.received_len if not transfered_len: transfered_len = 0 properties.append((_('Transferred: '), helpers.convert_bytes(transfered_len))) status = '' if file_props.started: status = _('Not started') if file_props.stopped == True: status = _('Stopped') elif file_props.completed: status = _('Completed') elif file_props.connected == False: if file_props.completed: status = _('Completed') else: if file_props.paused == True: status = Q_('?transfer status:Paused') elif file_props.stalled == True: #stalled is not paused. it is like 'frozen' it stopped alone status = _('Stalled') else: status = _('Transferring') else: status = _('Not started') properties.append((_('Status: '), status)) file_desc = file_props.desc or '' properties.append((_('Description: '), GLib.markup_escape_text( file_desc))) while properties: property_ = properties.pop(0) current_row += 1 label = Gtk.Label() label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_markup(property_[0]) ft_table.attach(label, 1, 2, current_row, current_row + 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) label = Gtk.Label() label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_line_wrap(True) label.set_markup(property_[1]) ft_table.attach(label, 2, 3, current_row, current_row + 1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) self.win.add(ft_table)
def set_progress(self, typ, sid, transfered_size, iter_=None): """ Change the progress of a transfer with new transfered size """ file_props = FilesProp.getFilePropByType(typ, sid) full_size = file_props.size if full_size == 0: percent = 0 else: percent = round(float(transfered_size) / full_size * 100, 1) if iter_ is None: iter_ = self.get_iter_by_sid(typ, sid) if iter_ is not None: just_began = False if self.model[iter_][Column.PERCENT] == 0 and int(percent > 0): just_began = True text = self._format_percent(percent) if transfered_size == 0: text += '0' else: text += helpers.convert_bytes(transfered_size) text += '/' + helpers.convert_bytes(full_size) # Kb/s # remaining time if file_props.offset: transfered_size -= file_props.offset full_size -= file_props.offset if file_props.elapsed_time > 0: file_props.transfered_size.append( (file_props.last_time, transfered_size)) if len(file_props.transfered_size) > 6: file_props.transfered_size.pop(0) eta, speed = self._get_eta_and_speed(full_size, transfered_size, file_props) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PERCENT, int(percent)) text = self._format_time(eta) text += '\n' #This should make the string Kb/s, #where 'Kb' part is taken from %s. #Only the 's' after / (which means second) should be translated. text += _('(%(filesize_unit)s/s)') % { 'filesize_unit': helpers.convert_bytes(speed) } self.model.set(iter_, Column.TIME, text) # try to guess what should be the status image if file_props.type_ == 'r': status = 'download' else: status = 'upload' if file_props.paused == True: status = 'pause' elif file_props.stalled == True: status = 'waiting' if file_props.connected == False: status = 'stop' self.model.set(iter_, 0, self.get_icon(status)) if transfered_size == full_size: # If we are receiver and this is a jingle session if file_props.type_ == 'r' and \ file_props.session_type == 'jingle' and file_props.hash_: # Show that we are computing the hash self.set_status(file_props, 'computing') else: self.set_status(file_props, 'ok') elif just_began: path = self.model.get_path(iter_) self.select_func(path)