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