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

📄 downloadmanager.py

📁 bittorrent source by python. please enjoy
💻 PY
📖 第 1 页 / 共 5 页
字号:
           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 + -