Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

# -*- coding: utf-8 -*- 

# 

# Copyright (C) 2007 Andrew Resch <andrewresch@gmail.com> 

# 

# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with 

# the additional special exception to link portions of this program with the OpenSSL library. 

# See LICENSE for more details. 

# 

 

import logging 

import os.path 

 

import gobject 

import gtk 

 

import deluge.common 

import deluge.component as component 

from deluge.configmanager import ConfigManager 

from deluge.ui.gtkui.common import get_logo 

from deluge.ui.gtkui.ipcinterface import process_args 

 

log = logging.getLogger(__name__) 

 

 

class QueuedTorrents(component.Component): 

    def __init__(self): 

        component.Component.__init__(self, "QueuedTorrents", depend=["StatusBar", "AddTorrentDialog"]) 

        self.queue = [] 

        self.status_item = None 

 

        self.config = ConfigManager("gtkui.conf") 

        self.builder = gtk.Builder() 

        self.builder.add_from_file(deluge.common.resource_filename( 

            "deluge.ui.gtkui", os.path.join("glade", "queuedtorrents.ui")) 

        ) 

        self.builder.get_object("chk_autoadd").set_active(self.config["autoadd_queued"]) 

        self.dialog = self.builder.get_object("queued_torrents_dialog") 

        self.dialog.set_icon(get_logo(32)) 

 

        self.builder.connect_signals({ 

            "on_button_remove_clicked": self.on_button_remove_clicked, 

            "on_button_clear_clicked": self.on_button_clear_clicked, 

            "on_button_close_clicked": self.on_button_close_clicked, 

            "on_button_add_clicked": self.on_button_add_clicked, 

            "on_chk_autoadd_toggled": self.on_chk_autoadd_toggled 

        }) 

 

        self.treeview = self.builder.get_object("treeview") 

        self.treeview.append_column( 

            gtk.TreeViewColumn(_("Torrent"), gtk.CellRendererText(), text=0)) 

 

        self.liststore = gtk.ListStore(str, str) 

        self.treeview.set_model(self.liststore) 

 

    def run(self): 

        self.dialog.set_transient_for(component.get("MainWindow").window) 

        self.dialog.show() 

 

    def start(self): 

        if len(self.queue) == 0: 

            return 

 

        # Make sure status bar info is showing 

        self.update_status_bar() 

 

        # We only want the add button sensitive if we're connected to a host 

        self.builder.get_object("button_add").set_sensitive(True) 

 

        if self.config["autoadd_queued"] or self.config["classic_mode"]: 

            self.on_button_add_clicked(None) 

        else: 

            self.run() 

 

    def stop(self): 

        # We only want the add button sensitive if we're connected to a host 

        self.builder.get_object("button_add").set_sensitive(False) 

        self.update_status_bar() 

 

    def add_to_queue(self, torrents): 

        """Adds the list of torrents to the queue""" 

        # Add to the queue while removing duplicates 

        self.queue = list(set(self.queue + torrents)) 

 

        # Update the liststore 

        self.liststore.clear() 

        for torrent in self.queue: 

            self.liststore.append([os.path.split(torrent)[1], torrent]) 

 

        # Update the status bar 

        self.update_status_bar() 

 

    def update_status_bar(self): 

        """Attempts to update status bar""" 

        # If there are no queued torrents.. remove statusbar widgets and return 

        if len(self.queue) == 0: 

            if self.status_item is not None: 

                component.get("StatusBar").remove_item(self.status_item) 

                self.status_item = None 

            return False 

 

        try: 

            component.get("StatusBar") 

        except Exception: 

            # The statusbar hasn't been loaded yet, so we'll add a timer to 

            # update it later. 

            gobject.timeout_add(100, self.update_status_bar) 

            return False 

 

        # Set the label text for statusbar 

        if len(self.queue) > 1: 

            label = str(len(self.queue)) + _(" Torrents Queued") 

        else: 

            label = str(len(self.queue)) + _(" Torrent Queued") 

 

        # Add the statusbar items if needed, or just modify the label if they 

        # have already been added. 

        if self.status_item is None: 

            self.status_item = component.get("StatusBar").add_item( 

                stock=gtk.STOCK_SORT_DESCENDING, 

                text=label, 

                callback=self.on_statusbar_click) 

        else: 

            self.status_item.set_text(label) 

 

        # We return False so the timer stops 

        return False 

 

    def on_statusbar_click(self, widget, event): 

        log.debug("on_statusbar_click") 

        self.run() 

 

    def on_button_remove_clicked(self, widget): 

        selected = self.treeview.get_selection().get_selected()[1] 

        if selected is not None: 

            path = self.liststore.get_value(selected, 1) 

            self.liststore.remove(selected) 

            self.queue.remove(path) 

            self.update_status_bar() 

 

    def on_button_clear_clicked(self, widget): 

        self.liststore.clear() 

        del self.queue[:] 

        self.update_status_bar() 

 

    def on_button_close_clicked(self, widget): 

        self.dialog.hide() 

 

    def on_button_add_clicked(self, widget): 

        # Add all the torrents in the liststore 

        def add_torrent(model, path, iter, data): 

            torrent_path = model.get_value(iter, 1).decode('utf-8') 

            process_args([torrent_path]) 

 

        self.liststore.foreach(add_torrent, None) 

        del self.queue[:] 

        self.dialog.hide() 

        self.update_status_bar() 

 

    def on_chk_autoadd_toggled(self, widget): 

        self.config["autoadd_queued"] = widget.get_active()