⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btdownloadgui.py

📁 BitTorrent(简称BT
💻 PY
📖 第 1 页 / 共 5 页
字号:
                                                         self.config, self.setfunc)        self.last_torrent_box.pack_start(self.last_torrent_ratio_field,                                         fill=False, expand=False)        self.last_torrent_box.pack_start(gtk.Label(' percent.'),                                         fill=False, expand=False)        self.last_torrent_frame.add(self.last_torrent_box)        self.downloading_box.pack_start(self.last_torrent_frame, expand=False, fill=False)        # end Downloading tab                # Network tab        self.network_box = gtk.VBox(spacing=SPACING)        self.network_box.set_border_width(SPACING)        self.notebook.append_page(self.network_box, gtk.Label('Network'))        self.port_range_frame = gtk.Frame('Look for available port:')                self.port_range = gtk.HBox()        self.port_range.set_border_width(SPACING)        self.port_range.pack_start(gtk.Label('starting at port: '),                                   expand=False, fill=False)        self.minport_field = PortValidator('minport', self.config, self.setfunc)        self.minport_field.add_end('maxport')        self.port_range.pack_start(self.minport_field, expand=False, fill=False)        self.minport_field.settingswindow = self        self.port_range.pack_start(gtk.Label(' (0-65535)'),                                   expand=False, fill=False)        self.port_range_frame.add(self.port_range)        self.network_box.pack_start(self.port_range_frame, expand=False, fill=False)        self.ip_frame = gtk.Frame('IP to report to the tracker:')        self.ip_box = gtk.VBox()        self.ip_box.set_border_width(SPACING)        self.ip_field = IPValidator('ip', self.config, self.setfunc)        self.ip_box.pack_start(self.ip_field, expand=False, fill=False)        self.ip_box.pack_start(lalign(gtk.Label('(Has no effect unless you are on the\nsame local network as the tracker)')), expand=False, fill=False)        self.ip_frame.add(self.ip_box)        self.network_box.pack_start(self.ip_frame, expand=False, fill=False)        if is_frozen_exe:             self.reset_checkbox = gtk.CheckButton("Potential Windows TCP stack fix")            self.reset_checkbox.set_active( bool(self.config['close_with_rst']) )            self.network_box.pack_start(self.reset_checkbox, expand=False, fill=False)            def toggle_reset(w):                self.config['close_with_rst'] = int(not self.config['close_with_rst'])                self.setfunc('close_with_rst', self.config['close_with_rst'])            self.reset_checkbox.connect('toggled', toggle_reset)                # end Network tab                # Misc tab        if is_frozen_exe:            # allow the user to set the progress bar text to all black            self.progressbar_hack = gtk.CheckButton('Progress bar text is always black\n(requires restart)')            if self.config['progressbar_hack'] :                self.progressbar_hack.set_active(True)            else:                self.progressbar_hack.set_active(False)            def progressbar_callback(w):                self.config['progressbar_hack'] = int(not self.config['progressbar_hack'])                self.setfunc('progressbar_hack', self.config['progressbar_hack'])            self.progressbar_hack.connect('toggled', progressbar_callback)            self.misc_box = gtk.VBox(spacing=SPACING)            self.misc_box.set_border_width(SPACING)            self.misc_box.pack_start(self.progressbar_hack, expand=False, fill=False)            self.notebook.append_page(self.misc_box, gtk.Label("Misc"))        # end Misc tab        # Advanced tab        if advanced_ui:            self.advanced_box = gtk.VBox(spacing=SPACING)            self.advanced_box.set_border_width(SPACING)            hint = gtk.Label("WARNING: Changing these settings can\nprevent %s from functioning correctly."%app_name)            self.advanced_box.pack_start(lalign(hint), expand=False, fill=False)            self.store = gtk.ListStore(*[gobject.TYPE_STRING] * 2)            for option in ui_options[advanced_ui_options_index:]:                self.store.append((option, str(self.config[option])))            self.treeview = gtk.TreeView(self.store)            r = gtk.CellRendererText()            column = gtk.TreeViewColumn('Option', r, text=0)            self.treeview.append_column(column)            r = gtk.CellRendererText()            r.set_property('editable', True)            r.connect('edited', self.store_value_edited)            column = gtk.TreeViewColumn('Value', r, text=1)            self.treeview.append_column(column)            self.advanced_box.pack_start(self.treeview, expand=False, fill=False)            self.notebook.append_page(self.advanced_box, gtk.Label("Advanced"))                self.win.add(self.vbox)        self.win.show_all()    def get_save_in(self, widget=None):        self.file_selection = self.main.open_window('choosefolder',                                                    title='Choose default download directory',                                                    fullname=self.config['save_in'],                                                    got_location_func=self.set_save_in,                                                    no_location_func=lambda: self.main.window_closed('choosefolder'))    def set_save_in(self, save_location):        self.main.window_closed('choosefolder')        if os.path.isdir(save_location):            if save_location[-1] != os.sep:                save_location += os.sep            self.config['save_in'] = save_location            save_in = path_wrap(self.config['save_in'])            self.dl_save_in.set_text(save_in)            self.setfunc('save_in', self.config['save_in'])    def set_start_torrent_behavior(self, state_name):        if state_name in self.dnd_states:            for r in self.dnd_group:                if r.state_name == state_name:                    r.set_active(True)                else:                    r.set_active(False)        else:            self.always_replace_radio.set_active(True)            def start_torrent_behavior_changed(self, radiobutton):        if radiobutton.get_active():            self.setfunc('start_torrent_behavior', radiobutton.state_name)    def store_value_edited(self, cell, row, new_text):        it = self.store.get_iter_from_string(row)        option = ui_options[int(row)+advanced_ui_options_index]        t = type(defconfig[option])        try:            if t is type(None) or t is str:                value = new_text            elif t is int or t is long:                value = int(new_text)            elif t is float:                value = float(new_text)            else:                raise TypeError, str(t)        except ValueError:            return        self.setfunc(option, value)        self.store.set(it, 1, str(value))    def close(self, widget):        self.win.destroy()class FileListWindow(object):    def __init__(self, metainfo, closefunc):        self.metainfo = metainfo        self.setfunc = None        self.allocfunc = None        priorities = [0, 0]        self.win = Window()        self.win.set_title('Files in "%s"' % self.metainfo.name)        self.win.connect("destroy", closefunc)        self.box1 = gtk.VBox()        size_request = [0,0]                if advanced_ui and False:            self.toolbar = gtk.Toolbar()            for label, stockicon, method, arg in (("Apply"         , gtk.STOCK_APPLY  , self.set_priorities, None ),                                                  ("Allocate"      , gtk.STOCK_SAVE   , self.dosomething, 'alloc',),                                                  ("Never download", gtk.STOCK_DELETE , self.dosomething, 'never',),                                                  ("Decrease"      , gtk.STOCK_GO_DOWN, self.dosomething, -1     ,),                                                  ("Increase"      , gtk.STOCK_GO_UP  , self.dosomething, +1     ,),):                self.make_tool_item(label, stockicon, method, arg)            self.box1.pack_start(self.toolbar, False)            size_request = [450,54]                    self.sw = gtk.ScrolledWindow()        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)        self.box1.pack_start(self.sw)        self.win.add(self.box1)        columns = ['Filename','Length','%']        pre_size_list = ['MMMMMMMMMMMMMMMMMMMMMMMM', '6666 MB', '100.0']        if advanced_ui:            columns += ['A','Order']            pre_size_list += ['*','None','black']        num_columns = len(pre_size_list)        self.store = gtk.ListStore(*[gobject.TYPE_STRING] * num_columns)        self.store.append(pre_size_list)        self.treeview = gtk.TreeView(self.store)        cs = []        for i, name in enumerate(columns):            r = gtk.CellRendererText()            r.set_property('xalign', (0, 1, 1, .5, 1)[i])            if i != 4:                column = gtk.TreeViewColumn(name, r, text = i)            else:                column = gtk.TreeViewColumn(name, r, text = i, foreground = i + 1)            column.set_resizable(True)            self.treeview.append_column(column)            cs.append(column)        self.sw.add(self.treeview)        self.treeview.set_headers_visible(False)        self.treeview.columns_autosize()        self.box1.show_all()        self.treeview.realize()        for column in cs:            column.set_fixed_width(max(5,column.get_width()))            column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)        self.treeview.set_headers_visible(True)        self.store.clear()        self.treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)        self.piecelen = self.metainfo.piece_length        self.lengths = self.metainfo.sizes        self.initialize_file_priorities(priorities)        for name, size, priority in itertools.izip(self.metainfo.orig_files,                                        self.metainfo.sizes, self.priorities):            row = [name, Size(size), '?',]            if advanced_ui:                row += ['', priority == 255 and 'None' or str(priority), 'black']            self.store.append(row)        tvsr = self.treeview.size_request()        vertical_padding = 18         size_request = [max(size_request[0],tvsr[0]),                        (size_request[1] + tvsr[1] ) + vertical_padding]        maximum_height = 300        if size_request[1] > maximum_height - SCROLLBAR_WIDTH:            size_request[1] = maximum_height            size_request[0] = size_request[0] + SCROLLBAR_WIDTH        self.win.set_default_size(*size_request)                                          self.win.show_all()    def make_tool_item_24(self, label, stockicon, method, arg): # for pygtk 2.4        icon = gtk.Image()        icon.set_from_stock(stockicon, gtk.ICON_SIZE_SMALL_TOOLBAR)        item = gtk.ToolButton(icon_widget=icon, label=label)        item.set_homogeneous(True)        if arg is not None:            item.connect('clicked', method, arg)        else:            item.connect('clicked', method)        self.toolbar.insert(item, 0)    def make_tool_item_22(self, label, stockicon, method, arg): # for pygtk 2.2        icon = gtk.Image()        icon.set_from_stock(stockicon, gtk.ICON_SIZE_SMALL_TOOLBAR)        self.toolbar.prepend_item(label, None, None, icon, method, user_data=arg)    if gtk.pygtk_version >= (2, 4):        make_tool_item = make_tool_item_24    else:        make_tool_item = make_tool_item_22            def set_priorities(self, widget):        r = []        piece = 0        pos = 0        curprio = prevprio = 1000        for priority, length in itertools.izip(self.priorities, self.lengths):            pos += length            curprio = min(priority, curprio)            while pos >= (piece + 1) * self.piecelen:                if curprio != prevprio:                    r.extend((piece, curprio))                prevprio = curprio                if curprio == priority:                    piece = pos // self.piecelen                else:                    piece += 1                if pos == piece * self.piecelen:                    curprio = 1000                else:                    curprio = priority        if curprio != prevprio:            r.extend((piece, curprio))        self.setfunc(r)        it = self.store.get_iter_first()        for i in xrange(len(self.priorities)):            self.store.set_value(it, 5, "black")            it = self.store.iter_next(it)        self.origpriorities = list(self.priorities)    def initialize_file_priorities(self, piecepriorities):        self.priorities = []        piecepriorities = piecepriorities + [999999999]        it = iter(piecepriorities)        assert it.next() == 0        pos = piece = curprio = 0        for length in self.lengths:            pos += length            priority = curprio            while pos >= piece * self.piecelen:                curprio = it.next()                if pos > piece * self.piecelen:                    priority = max(priority, curprio)                piece = it.next()            self.priorities.append(priority)        self.origpriorities = list(self.priorities)    def dosomething(self, widget, dowhat):        self.treeview.get_selection().selected_foreach(self.adjustfile, dowhat)    def adjustfile(self, treemodel, path, it, dowhat):        row = path[0]        if dowhat == "alloc":            self.allocfunc(row)            return        if self.priorities[row] == 255:            return        if dowhat == 'never':            self.priorities[row] = 255        else:            if self.priorities[row] == 0 and dowhat < 0:                return            self.priorities[row] += dowhat        treemodel.set_value(it, 4, self.priorities[row] == 255 and 'None' or str(self.priorities[row]))        treemodel.set_value(it, 5, self.priorities[row] == self.origpriorities[row] and 'black' or 'red')    def update(self, left, allocated):        it = self.store.get_iter_first()        for left, total, alloc in itertools.izip(left, self.lengths,                                                 allocated):            if total == 0:                p = 1            else:                p = (total - left) / total            self.store.set_value(it, 2, "%.1f" % (int(p * 1000)/10))            if advanced_ui:                self.store.set_value(it, 3, '*' * alloc)            it = self.store.iter_next(it)    def close(self):        self.win.destroy()class PeerListWindow(object):    def __init__(self, torrent_name, closefunc):        self.win = Window()        self.win.connect("destroy", closefunc)        self.win.set_title( 'Peers for "%s"'%torrent_name)        self.sw = gtk.ScrolledWindow()        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -