1# -*- coding: utf-8 -*- 2# 3# Copyright (C) 2007-2008 Andrew Resch <andrewresch@gmail.com> 4# 5# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with 6# the additional special exception to link portions of this program with the OpenSSL library. 7# See LICENSE for more details. 8# 9 10from __future__ import unicode_literals 11 12import logging 13import os 14 15from gi.repository import Gtk 16 17import deluge.common 18import deluge.component as component 19from deluge.ui.client import client 20 21log = logging.getLogger(__name__) 22 23 24class RemoveTorrentDialog(object): 25 """ 26 This class is used to create and show a Remove Torrent Dialog. 27 28 :param torrent_ids: the torrent_ids to remove 29 :type torrent_ids: list of torrent_ids 30 31 :raises TypeError: if `torrent_id` is not a sequence type 32 :raises ValueError: if `torrent_id` contains no torrent_ids or is None 33 34 """ 35 36 def __init__(self, torrent_ids, delete_files=False): 37 if not isinstance(torrent_ids, list) and not isinstance(torrent_ids, tuple): 38 raise TypeError('requires a list of torrent_ids') 39 40 if not torrent_ids: 41 raise ValueError('requires a list of torrent_ids') 42 43 self.__torrent_ids = torrent_ids 44 45 self.builder = Gtk.Builder() 46 self.builder.add_from_file( 47 deluge.common.resource_filename( 48 __package__, os.path.join('glade', 'remove_torrent_dialog.ui') 49 ) 50 ) 51 52 self.__dialog = self.builder.get_object('remove_torrent_dialog') 53 self.__dialog.set_transient_for(component.get('MainWindow').window) 54 55 self.builder.connect_signals(self) 56 self.builder.get_object('delete_files').set_active(delete_files) 57 label_title = self.builder.get_object('label_title') 58 label_torrents = self.builder.get_object('label_torrents') 59 num_torrents = len(self.__torrent_ids) 60 if num_torrents == 1: 61 label_torrents.set_markup( 62 component.get('TorrentView').get_torrent_status(self.__torrent_ids[0])[ 63 'name' 64 ] 65 ) 66 else: 67 label_title.set_markup(_('Remove the selected torrents?')) 68 label_torrents.set_markup(_('Total of %s torrents selected') % num_torrents) 69 70 def on_delete_files_toggled(self, widget): 71 self.builder.get_object('warning_label').set_visible(widget.get_active()) 72 73 def __remove_torrents(self, remove_data): 74 # Unselect all to avoid issues with the selection changed event 75 component.get('TorrentView').treeview.get_selection().unselect_all() 76 77 def on_removed_finished(errors): 78 if errors: 79 log.info('Error(s) occured when trying to delete torrent(s).') 80 for t_id, e_msg in errors: 81 log.warning('Error removing torrent %s : %s', t_id, e_msg) 82 83 d = client.core.remove_torrents(self.__torrent_ids, remove_data) 84 d.addCallback(on_removed_finished) 85 86 def run(self): 87 """ 88 Shows the dialog and awaits for user input. The user can select to 89 remove the torrent(s) from the session with or without their data. 90 """ 91 if self.__dialog.run() == Gtk.ResponseType.OK: 92 self.__remove_torrents(self.builder.get_object('delete_files').get_active()) 93 self.__dialog.destroy() 94