📄 downloadmanager.py
字号:
else: nv = _('%s (%s seeds)') % (str(np), str(ns)) ov = self.peers.GetLabel() if ov != nv: self.peers.SetLabel(nv) layout = True # if the torrent is not finished, set some other stuff, too if not self.parent.completed: for w, k, r in zip((self.time_remaining, self.download_rate), ('timeEst', 'downRate'), (Duration, Rate)): if self.change_label(statistics, w, k, r): layout = True # layout if necessary if layout: self.dynamic_sizer.Layout() self.piece_bar.SetValue(self.torrent.completion, self.torrent.state, self.torrent.piece_states)class TorrentPanel(BTPanel): sizer_class = wx.FlexGridSizer sizer_args = (3, 1, 0, 0) def __init__(self, parent, *a, **k): BTPanel.__init__(self, parent, *a, **k) self.torrent = parent.torrent self.details_shown = False self.parent = parent self.completed = False metainfo = self.torrent.metainfo self.sizer.AddGrowableRow(0) self.sizer.AddGrowableRow(2) self.sizer.AddGrowableCol(0) self.torrent_info = TorrentInfoPanel(self, self.torrent) self.sizer.Add(self.torrent_info, flag=wx.GROW) self.outer_button_sizer = wx.FlexGridSizer(1, 2, SPACING, SPACING) self.outer_button_sizer.AddGrowableCol(0) self.left_button_sizer = HSizer() self.outer_button_sizer.Add(self.left_button_sizer) self.right_button_sizer = HSizer() self.outer_button_sizer.Add(self.right_button_sizer) self.details_button = wx.Button(parent=self, id=wx.ID_ANY, label=_("Show &Details")) self.details_button.Bind(wx.EVT_BUTTON, self.toggle_details) self.open_button = wx.Button(parent=self, id=wx.ID_OPEN) self.open_button.Bind(wx.EVT_BUTTON, self.open_torrent) self.open_folder_button = wx.Button(parent=self, id=wx.ID_ANY, label=_("Open &Folder")) self.open_folder_button.Bind(wx.EVT_BUTTON, self.open_folder) self.left_button_sizer.Add(self.details_button, flag=wx.ALIGN_LEFT|wx.LEFT, border=SPACING) self.right_button_sizer.Add(self.open_button, flag=wx.RIGHT, border=SPACING) self.right_button_sizer.Add(self.open_folder_button, flag=wx.RIGHT, border=SPACING) self.open_button.Disable() if self.torrent.metainfo.is_batch: self.open_button.Hide() self.sizer.Add(self.outer_button_sizer, flag=wx.GROW|wx.ALIGN_BOTTOM, border=0) self.notebook = wx.Notebook(self) self.speed_tab_index = None self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging) self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged) self.tab_height = self.notebook.GetBestFittingSize().y self.torrent_panel = TorrentDetailsPanel(self.notebook, self.torrent) self.notebook.AddPage(self.torrent_panel, _("Torrent")) if metainfo.is_batch: self.file_tab_index = self.notebook.GetPageCount() self.file_list = FileListPanel(self.notebook, self.torrent) self.notebook.AddPage(self.file_list, _("File List")) self.peer_tab_index = self.notebook.GetPageCount() self.peer_tab_panel = wx.Panel(self.notebook) self.peer_tab_sizer = wx.BoxSizer(wx.HORIZONTAL) self.peer_list = PeerListView(self.torrent, self.peer_tab_panel) self.peer_tab_sizer.Add(self.peer_list, proportion=1, flag=wx.GROW) self.peer_tab_panel.SetSizerAndFit(self.peer_tab_sizer) self.peer_list.SortListItems(col='ip', ascending=1) self.notebook.AddPage(self.peer_tab_panel, _("Peer List")) self.bandwidth_panel = BandwidthGraphPanel(self.notebook, self.torrent.bandwidth_history) self.speed_tab_index = self.notebook.GetPageCount() self.notebook.AddPage(self.bandwidth_panel, _("Speed")) if metainfo.comment: self.comment_panel = BTPanel(self.notebook) self.notebook.AddPage(self.comment_panel, _("Comments")) self.comment = wx.TextCtrl(self.comment_panel, id=wx.ID_ANY, value=metainfo.comment, style=wx.TE_MULTILINE|wx.TE_READONLY) self.comment_panel.Add(self.comment, flag=wx.GROW, proportion=1) self.log_panel = LogPanel(self.notebook, self.torrent) self.notebook.AddPage(self.log_panel, _("Log")) self.notebook.SetPageSize(wx.Size(300, 200)) self.notebook.Hide() if self.torrent.completion >= 1: self.change_to_completed() self.toggle_details() self.sizer.Layout() def change_to_completed(self): self.completed = True self.torrent_info.change_to_completed() self.open_button.Enable() def toggle_details(self, event=None): if self.details_shown: self.sizer.AddGrowableRow(0) self.notebook.Hide() self.sizer.Detach(self.notebook) self.sizer.Layout() self.details_button.SetLabel(_("Show &Details")) self.parent.Fit() self.details_shown = False else: self.sizer.RemoveGrowableRow(0) self.notebook.Show() self.sizer.Add(self.notebook, flag=wx.GROW, proportion=1) self.sizer.Layout() self.details_button.SetLabel(_("Hide &Details")) self.parent.Fit() self.details_shown = True def open_torrent(self, event): wx.the_app.launch_torrent(self.torrent.metainfo.infohash) def open_folder(self, event): wx.the_app.launch_torrent_folder(self.torrent.metainfo.infohash) def BindChildren(self, evt_id, func): ws = [self.torrent_info, self.notebook, self.peer_list, self.bandwidth_panel, self.log_panel, self.torrent_panel] if self.torrent.metainfo.is_batch: ws.append(self.file_list) for w in ws: w.Bind(evt_id, func) if hasattr(w, 'BindChildren'): w.BindChildren(evt_id, func) def GetBestFittingSize(self): tis = self.torrent_info.GetSize() tibs = self.torrent_info.GetBestFittingSize() tdbs = self.torrent_panel.GetBestFittingSize() x = min(max(tis.x, tdbs.x), 600) y = tibs.y + tdbs.y + self.tab_height return wx.Size(x, y) def OnPageChanging(self, event): wx.the_app.make_statusrequest() def OnPageChanged(self, event): if event.GetSelection() == self.speed_tab_index: self.bandwidth_panel.update(force=True) event.Skip() def wants_peers(self): return self.IsShown() and self.peer_tab_index == self.notebook.GetSelection() def wants_files(self): return self.IsShown() and self.file_tab_index == self.notebook.GetSelection() def update_peers(self, peers, bad_peers): self.peer_list.update_peers(peers, bad_peers) def update_files(self, *args): self.file_list.update(*args) def update_swarm(self, statistics): self.torrent_panel.update(statistics) def update_info(self, statistics): if statistics.get('fractionDone', 0) >= 1 and not self.completed: # first update since the torrent finished. Remove various # download stats, enable open button. self.change_to_completed() self.torrent_info.update(statistics) def reset_toolbar_style(self): self.file_list.reset_toolbar_style()class TorrentWindow(BTFrameWithSizer): panel_class = TorrentPanel def __init__(self, torrent, parent, *a, **k): self.torrent = torrent k['style'] = k.get('style', wx.DEFAULT_FRAME_STYLE) | wx.WANTS_CHARS BTFrameWithSizer.__init__(self, parent, *a, **k) self.Bind(wx.EVT_CLOSE, self.close) self.Bind(wx.EVT_CHAR, self.key) self.panel.BindChildren(wx.EVT_CHAR, self.key) self.sizer.Layout() self.Fit() self.SetMinSize(self.GetSize()) def key(self, event): c = event.GetKeyCode() if c == wx.WXK_ESCAPE: self.close() event.Skip() def GetBestFittingSize(self): sbs = self.GetSize() pbs = BTFrameWithSizer.GetBestFittingSize(self) return wx.Size(sbs.x, pbs.y) def SortListItems(self, col=-1, ascending=1): self.panel.peer_list.SortListItems(col, ascending) def details_shown(self): return self.panel.details_shown def toggle_details(self): self.panel.toggle_details() def update_peers(self, peers, bad_peers): self.panel.update_peers(peers, bad_peers) def update_files(self, *args): self.panel.update_files(*args) def update_swarm(self, statistics): self.panel.update_swarm(statistics) def update_info(self, statistics): self.panel.update_info(statistics) def update(self, statistics): percent = percentify(self.torrent.completion, self.torrent.completed) if percent is not None: title=_('%.1f%% of %s')%(percent, self.torrent.metainfo.name) else: title=_('%s')%(self.torrent.metainfo.name) self.SetTitle(title) if self.IsShown(): spew = statistics.get('spew', None) if spew is not None: self.update_peers(spew, statistics['bad_peers']) if self.torrent.metainfo.is_batch: self.update_files(statistics.get('files_left', {}), statistics.get('file_priorities', {})) self.update_swarm(statistics) self.update_info(statistics) def close(self, *e): # this should set the app preference self.Hide() def reset_toolbar_style(self): self.panel.reset_toolbar_style() def wants_peers(self): return self.IsShown() and self.panel.wants_peers() def wants_files(self): return self.IsShown() and self.panel.wants_files()class AboutWindow(BTDialog): def __init__(self, main): BTDialog.__init__(self, main, size = (300,400), style=wx.DEFAULT_DIALOG_STYLE|wx.CLIP_CHILDREN|wx.WANTS_CHARS) self.Bind(wx.EVT_CLOSE, self.close) self.SetTitle(_("About %s")%app_name) self.sizer = VSizer() i = wx.the_app.image_library.get(('logo', 'banner')) b = wx.BitmapFromImage(i) self.bitmap = ElectroStaticBitmap(self, b) self.sizer.AddFirst(self.bitmap, flag=wx.ALIGN_CENTER_HORIZONTAL) version_str = version if int(version_str[2]) % 2: version_str = version_str + ' ' + _("Beta") version_label = ElectroStaticText(self, label=_("Version %s")%version_str) self.sizer.Add(version_label, flag=wx.ALIGN_CENTER_HORIZONTAL) if branch is not None: blabel = ElectroStaticText(self, label='cdv client dir: %s' % branch) self.sizer.Add(blabel, flag=wx.ALIGN_CENTER_HORIZONTAL) self.credits_scroll = CreditsScroll(self, 'credits', style=wx.TE_CENTRE) self.translators_scroll = CreditsScroll(self, 'credits-l10n') self.sizer.Add(self.credits_scroll , flag=wx.GROW, proportion=1) self.sizer.Add(self.translators_scroll, flag=wx.GROW, proportion=1) self.credits_scroll.Hide() self.translators_scroll.Hide() self.button_sizer = HSizer() self.credits_button = wx.Button(parent=self, id=wx.ID_ANY, label=_("&Credits")) self.credits_button.Bind(wx.EVT_BUTTON, self.toggle_credits) self.translators_button = wx.Button(parent=self, id=wx.ID_ANY, label=_("&Translators")) self.translators_button.Bind(wx.EVT_BUTTON, self.toggle_translators) self.button_sizer.AddFirst(self.credits_button) self.button_sizer.Add(self.translators_button) self.translators_button.Hide() self.sizer.Add(self.button_sizer, flag=wx.ALIGN_CENTER_HORIZONTAL, proportion=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -