📄 downloadmanager.py
字号:
63 < int(ip_address[11:]) < 128: return self.image_list_offset - 1 cc, country = lookup(ip_address) if cc == '--': cc = 'unknown' index = self.cc_index.get(cc, self.cc_index['noimage']) # for finding popular countries that we don't have flags for yet## if index == self.cc_index['noimage']:## if cc not in unknown_ccs:## print cc, country## unknown_ccs.add(cc) return index##unknown_ccs = set()class BTToolBar(wx.ToolBar): default_style = wx.TB_HORIZONTAL|wx.NO_BORDER|wx.TB_NODIVIDER|wx.TB_FLAT default_size = 16 def __init__(self, parent, ops=[], *a, **k): size = wx.the_app.config['toolbar_size'] self.size = size style = self.default_style config = wx.the_app.config if config['toolbar_text']: style |= wx.TB_TEXT wx.ToolBar.__init__(self, parent, style=style, **k) self.SetToolBitmapSize((size,size)) while ops: opset = ops.pop(0) for e in opset: if issubclass(type(e.image), (str,unicode)): bmp = wx.ArtProvider.GetBitmap(e.image, wx.ART_TOOLBAR, (size,size)) elif type(e.image) is tuple: i = wx.the_app.theme_library.get(e.image, self.size) bmp = wx.BitmapFromImage(i) assert bmp.Ok(), "The image (%s) is not valid." % image self.AddLabelTool(e.id, e.label, bmp, shortHelp=e.shorthelp) if len(ops): self.AddSeparator() self.Realize()class DownloaderToolBar(BTToolBar): def __init__(self, parent, ops=[], *a, **k): ops = [[op for op in opset if op.in_toolbar] for opset in ops] BTToolBar.__init__(self, parent, ops=ops, *a, **k) self.stop_button = self.FindById(STOP_ID) self.start_button = self.FindById(START_ID) self.RemoveTool(START_ID) self.stop_start_position = self.GetToolPos(STOP_ID)## self.priority = wx.Choice(parent=self, id=wx.ID_ANY, choices=[_("High"), _("Normal"), _("Low")])## self.priority.SetSelection(1)## self.AddControl(self.priority) self.Realize() def toggle_stop_start_button(self, show_stop_button=False): changed = False if show_stop_button: sb = self.FindById(START_ID) if sb: changed = True self.RemoveTool(START_ID) self.InsertToolItem(self.stop_start_position, self.stop_button) else: sb = self.FindById(STOP_ID) if sb: changed = True self.RemoveTool(STOP_ID) self.InsertToolItem(self.stop_start_position, self.start_button) if changed: self.Realize() return changedclass FileListView(TreeListCtrl): priority_names = {1: _("first"), 0: '', -1: _("never")} sample_row = ('M'*30, unicode(Size(1024**3 - 1)), "%.1f" % 100.0, 'normal') colors = {-1: wx.Colour(192,192,192), 0: wx.Colour( 0, 0, 0), 1: wx.Colour( 32,128, 32), } def __init__(self, parent, torrent): self.torrent = torrent TreeListCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE|wx.TR_FULL_ROW_HIGHLIGHT|wx.TR_MULTIPLE|wx.WS_EX_PROCESS_IDLE) size = (16,16) il = wx.ImageList(*size) self.folder_index = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, size)) self.folder_open_index = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_OTHER, size)) self.file_index = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, size)) self.SetImageList(il) self.il = il self.path_items = {} self.AddColumn(_("Name" )) self.AddColumn(_("Size" )) self.AddColumn(_("%" )) self.AddColumn(_("Download")) self.SetMainColumn(0) metainfo = self.torrent.metainfo self.root = self.AddRoot(metainfo.name) self.SetItemImage(self.root, self.folder_index , which=wx.TreeItemIcon_Normal ) self.SetItemImage(self.root, self.folder_open_index, which=wx.TreeItemIcon_Expanded) dc = wx.ClientDC(self) for c, t in enumerate(self.sample_row): w, h = dc.GetTextExtent(t) self.SetColumnWidth(c, w+2) if metainfo.is_batch: files = metainfo.orig_files else: files = [ ] for i, f in enumerate(files): path, filename = os.path.split(f) parent = self.find_path(path, self.root) child = self.AppendItem(parent, filename) self.Expand(parent) self.path_items[f] = child self.SetItemText(child, unicode(Size(metainfo.sizes[i])), 1) self.SetItemText(child, '?', 2) self.SetItemData(child, wx.TreeItemData(f)) self.SetItemImage(child, self.file_index, which=wx.TreeItemIcon_Normal) self.EnsureVisible(self.root) self.Refresh() self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnPopupMenu) def OnPopupMenu(self, event): p = event.GetPoint() # sure would be cool if this method were documented item, some_random_number, seems_to_always_be_zero = self.HitTest(p) if not self.IsSelected(item): # hey, this would be a cool one to document too self.SelectItem(item, unselect_others=True, extended_select=False) self.PopupMenu(self.context_menu) def find_path(self, path, parent=None): """Finds the node associated with path under parent, and creates it if it doesn't exist""" components = [] if parent == None: parent = self.root while True: parent_path, local_path = os.path.split(path) if local_path == '': break components.append(local_path) path = parent_path l = len(components) for i in xrange(l): parent = self.find_child(parent, components[(l-1)-i], create=True) return parent def find_child(self, parent, childname, create=False): """Finds the node child under parent, and creates it if it doesn't exist""" i, c = self.GetFirstChild(parent) while i.IsOk(): text = self.GetItemText(i, 0) if text == childname: break i, c = self.GetNextChild(parent, c) else: i = self.AppendItem(parent, childname) self.Expand(parent) self.SetItemData(i, wx.TreeItemData(childname)) self.SetItemImage(i, self.folder_index , which=wx.TreeItemIcon_Normal ) self.SetItemImage(i, self.folder_open_index, which=wx.TreeItemIcon_Expanded) return i def update_files(self, left, priorities): metainfo = self.torrent.metainfo for name, left, total, in itertools.izip(metainfo.orig_files, left, metainfo.sizes): if total == 0: p = 1 else: p = (total - left) / total item = self.path_items[name] newvalue = "%.1f" % (int(p * 1000)/10) oldvalue = self.GetItemText(item, 2) if oldvalue != newvalue: self.SetItemText(item, newvalue, 2) if name in priorities: self.set_priority(item, priorities[name]) def get_complete_files(self, files): complete_files = [] for f in files: item = self.path_items[f] if self.get_file_completion(item): complete_files.append(f) return complete_files def get_item_completion(self, item): if self.ItemHasChildren(item): return True return self.get_file_completion(item) def get_file_completion(self, item): completion = self.GetItemText(item, 2) if completion == '100.0': # BUG HACK HACK HACK return True return False def get_selected_files(self, priority=None): """Get selected files, directories, and all descendents. For (batch) setting file priorities.""" selected_items = self.GetSelections() items = [] data = [] for i in selected_items: if not self.ItemHasChildren(i): data.append(self.GetPyData(i)) items.append(i) else: descendents = self.get_all_descendents(i) items.extend(descendents) for d in descendents: data.append(self.GetPyData(d)) if priority is not None: self.set_priorities(items, priority) return data def get_all_descendents(self, item): """Get all descendents of this item. For (batch) setting file priorities.""" descendents = [] i, c = self.GetFirstChild(item) while i.IsOk(): if self.ItemHasChildren(i): d = self.get_all_descendents(i) descendents.extend(d) else: descendents.append(i) i, c = self.GetNextChild(item, c) return descendents def get_selection(self): """Get just the selected files/directories, not including descendents. For checking toolbar state and handling double-click.""" selected_items = self.GetSelections() dirs, files = [], [] for i in selected_items: if not self.ItemHasChildren(i): files.append(self.GetPyData(i)) else: dirs.append(self.GetPyData(i)) return dirs, files def set_priority(self, item, priority): priority_label = self.priority_names[priority] self.SetItemText(item, priority_label, 3) self.SetItemTextColour(item, colour=self.colors[priority]) def set_priorities(self, items, priority): priority_label = self.priority_names[priority] for item in items: self.SetItemText(item, priority_label, 3)class FileListPanel(BTPanel): FIRST_ID = wx.NewId() NORMAL_ID = wx.NewId() NEVER_ID = wx.NewId() OPEN_ID = wx.NewId() def __init__(self, parent, torrent, *a, **k): BTPanel.__init__(self, parent, *a, **k) self.torrent = torrent app = wx.the_app self.file_ops = [ EventProperties(self.FIRST_ID, ('fileops', 'first'), self.set_file_priority_first, _("First"), _("Download first")), EventProperties(self.NORMAL_ID, ('fileops', 'normal'), self.set_file_priority_normal, _("Normal"), _("Download normally")),## # BUG: uncomment this once we implement NEVER## EventProperties(self.NEVER_ID,## ('fileops', 'never'),## self.set_file_priority_never,## _("Never"), _("Never download")), EventProperties(self.OPEN_ID, ('torrentops', 'launch'), self.open_items, _("Launch"), _("Launch file")), ] self.context_menu = BTMenu() self.event_table = {} for e in self.file_ops: self.event_table[e.id] = e self.Bind(wx.EVT_MENU, self.OnFileEvent, id=e.id) self.context_menu.Append(e.id, e.shorthelp) self.context_menu.InsertSeparator(len(self.file_ops)-1) self._build_tool_bar() self.file_list = FileListView(self, torrent) self.sizer.Add(self.file_list, flag=wx.GROW, proportion=1) self.SetSizerAndFit(self.sizer) self.check_file_selection() self.file_list.Bind(wx.EVT_TREE_SEL_CHANGED, self.check_file_selection) self.file_list.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.file_double_clicked) self.file_list.context_menu = self.context_menu def check_file_selection(self, event=None): items = self.file_list.GetSelections() if len(items) < 1: for i in(self.NEVER_ID, self.NORMAL_ID, self.FIRST_ID, self.OPEN_ID): self.tool_bar.EnableTool(i, False) elif len(items) == 1: for i in(self.NEVER_ID, self.NORMAL_ID, self.FIRST_ID): self.tool_bar.EnableTool(i, True) self.tool_bar.EnableTool(self.OPEN_ID, self.file_list.get_item_completion(items[0])) self.context_menu.Enable(self.OPEN_ID, self.file_list.get_item_completion(items[0]))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -