?? btdownloadgui.py
字號:
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 + -