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

161

162

163

164

165

166

167

168

169

170

171

172

173

174

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

# 

# Copyright (C) 2008 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 deluge.component as component 

from deluge.common import fdate, fpeer, fsize, fspeed, ftime 

from deluge.configmanager import ConfigManager 

from deluge.ui.gtkui.piecesbar import PiecesBar 

from deluge.ui.gtkui.torrentdetails import Tab 

 

log = logging.getLogger(__name__) 

 

 

def fpeer_sized(first, second): 

    return "%s (%s)" % (fsize(first), fsize(second)) 

 

 

def fratio(value): 

    if value < 0: 

        return "∞" 

    elif value == 0: 

        return "0" 

    return "%.3f" % value 

 

 

def fpcnt(value, state): 

    if state: 

        state = _(state) + " " 

    return "%s%.2f%%" % (state, value) 

 

 

def fspeed_max(value, max_value=-1): 

    if max_value > -1: 

        return "%s (%s %s)" % (fspeed(value), max_value, _("KiB/s")) 

    else: 

        return fspeed(value) 

 

 

def fdate_or_never(value): 

    """Display value as date, eg 05/05/08 or Never""" 

    if value > 0.0: 

        return fdate(value) 

    else: 

        return "Never" 

 

 

def ftime_or_dash(value): 

    """Display value as time, eg 2h 30m or dash""" 

    if value > 0.0: 

        return ftime(value) 

    else: 

        return "-" 

 

 

class StatusTab(Tab): 

    def __init__(self): 

        Tab.__init__(self) 

        # Get the labels we need to update. 

        # widget name, modifier function, status keys 

        self.builder = builder = component.get("MainWindow").get_builder() 

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

 

        self._name = "Status" 

        self._child_widget = builder.get_object("status_tab") 

        self._tab_label = builder.get_object("status_tab_label") 

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

        self.config.register_set_function( 

            "show_piecesbar", 

            self.on_show_pieces_bar_config_changed, 

            apply_now=True 

        ) 

        self.label_widgets = [ 

            (builder.get_object("summary_availability"), fratio, ("distributed_copies",)), 

            (builder.get_object("summary_total_downloaded"), fpeer_sized, ("all_time_download", 

                                                                           "total_payload_download")), 

            (builder.get_object("summary_total_uploaded"), fpeer_sized, ("total_uploaded", "total_payload_upload")), 

            (builder.get_object("summary_download_speed"), fspeed_max, ("download_payload_rate", "max_download_speed")), 

            (builder.get_object("summary_upload_speed"), fspeed_max, ("upload_payload_rate", "max_upload_speed")), 

            (builder.get_object("summary_seeds"), fpeer, ("num_seeds", "total_seeds")), 

            (builder.get_object("summary_peers"), fpeer, ("num_peers", "total_peers")), 

            (builder.get_object("summary_eta"), ftime_or_dash, ("eta",)), 

            (builder.get_object("summary_share_ratio"), fratio, ("ratio",)), 

            (builder.get_object("summary_active_time"), ftime_or_dash, ("active_time",)), 

            (builder.get_object("summary_seed_time"), ftime_or_dash, ("seeding_time",)), 

            (builder.get_object("summary_seed_rank"), str, ("seed_rank",)), 

            (builder.get_object("progressbar"), fpcnt, ("progress", "state")), 

            (builder.get_object("summary_last_seen_complete"), fdate_or_never, ("last_seen_complete",)), 

            (builder.get_object("summary_torrent_status"), str, ("message",)), 

        ] 

 

        self.status_keys = [status for widget in self.label_widgets for status in widget[2]] 

 

    def update(self): 

        # Get the first selected torrent 

        selected = component.get("TorrentView").get_selected_torrents() 

 

        # Only use the first torrent in the list or return if None selected 

        if selected: 

            selected = selected[0] 

        else: 

            # No torrent is selected in the torrentview 

            self.clear() 

            return 

 

        # Get the torrent status 

        status_keys = self.status_keys 

        if self.config['show_piecesbar']: 

            status_keys = self.status_keys + ["pieces", "num_pieces"] 

 

        component.get("SessionProxy").get_torrent_status( 

            selected, status_keys).addCallback(self._on_get_torrent_status) 

 

    def _on_get_torrent_status(self, status): 

        # Check to see if we got valid data from the core 

        if status is None: 

            return 

 

        # Update all the label widgets 

        for widget in self.label_widgets: 

            if widget[1] is not None: 

                try: 

                    args = [status[key] for key in widget[2]] 

                except KeyError as ex: 

                    log.debug("Unable to get status value: %s", ex) 

                    continue 

                txt = widget[1](*args) 

            else: 

                txt = status[widget[2][0]] 

 

            if widget[0].get_text() != txt: 

                widget[0].set_text(txt) 

 

        # Do the progress bar because it's a special case (not a label) 

        if self.config['show_piecesbar']: 

            self.piecesbar.update_from_status(status) 

        else: 

            fraction = status["progress"] / 100 

            if self.progressbar.get_fraction() != fraction: 

                self.progressbar.set_fraction(fraction) 

 

    def on_show_pieces_bar_config_changed(self, key, show): 

        self.show_pieces_bar(show) 

 

    def show_pieces_bar(self, show): 

        if hasattr(self, 'piecesbar'): 

            if show: 

                self.piecesbar.show() 

                self.progressbar.hide() 

            else: 

                self.piecesbar.hide() 

                self.progressbar.show() 

        else: 

            if show: 

                self.piecesbar = PiecesBar() 

                self.builder.get_object("status_progress_vbox").pack_start( 

                    self.piecesbar, False, False, 0 

                ) 

                self.progressbar.hide() 

 

    def clear(self): 

        for widget in self.label_widgets: 

            widget[0].set_text("") 

 

        if self.config['show_piecesbar']: 

            self.piecesbar.clear() 

        else: 

            self.progressbar.set_fraction(0.0)