📄 settingswindow.py
字号:
self.ip_field = IPValidator(self, 'ip', self.settings_window.config, self.settings_window.setfunc) ip_label = ElectroStaticText(self, wx.ID_ANY, _("(Has no effect unless you are on the\nsame local network as the tracker)")) # sizers self.ip_box_sizer = wx.StaticBoxSizer(self.ip_box, wx.VERTICAL) self.ip_box_sizer.Add(self.ip_field, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW, border=SPACING) self.ip_box_sizer.Add(ip_label, flag=wx.ALL, border=SPACING) self.sizer.Add(self.ip_box_sizer, flag=wx.GROW) def bandwidth_management_callback(self): enable = not self.autodetect.GetValue() if enable: self.up_rate_slider.LoadValue() self.down_rate_slider.LoadValue() self.up_rate_slider.Enable(enable) self.down_rate_slider.Enable(enable)class AppearanceSettingsPanel(SettingsPanel): label = _("Appearance") pb_config_key = 'progressbar_style' # sample data sample_value = 0.4 sample_data = {'h': SparseSet(xrange(0, 80)), 't': SparseSet(xrange(80, 100)), } for i in range(20,0,-1): s = SparseSet() s.add(200-i*5, 200-(i-1)*5) sample_data[i-1] = s del i,s def __init__(self, parent, *a, **k): SettingsPanel.__init__(self, parent, *a, **k) # widgets self.gauge_box = wx.StaticBox(self, label=_("Progress bar style:")) self.gauge_sizer = wx.StaticBoxSizer(self.gauge_box, wx.VERTICAL) self.null_radio = wx.RadioButton(self, label=_("&None (just show percent complete)"), style=wx.RB_GROUP) self.null_radio.value = 0 self.simple_radio = wx.RadioButton(self, label=_("&Ordinary progress bar")) self.simple_radio.value = 1 self.simple_sample = self.new_sample(SimpleDownloadGauge, 1) self.moderate_radio = wx.RadioButton(self, label=_("&Detailed progress bar")) self.moderate_radio.value = 2 msg = _("(shows the percentage of complete, transferring, available and missing pieces in the torrent)") if not text_wrappable: half = len(msg)//2 for i in xrange(half): if msg[half+i] == ' ': msg = msg[:half+i+1] + '\n' + msg[half+i+1:] break elif msg[half-i] == ' ': msg = msg[:half-i+1] + '\n' + msg[half-i+1:] break self.moderate_text = ElectroStaticText(self, wx.ID_ANY, msg) if text_wrappable: self.moderate_text.Wrap(250) self.moderate_sample = self.new_sample(ModerateDownloadGauge, 2) self.fancy_radio = wx.RadioButton(self, label=_("&Piece bar")) self.fancy_radio.value = 3 self.fancy_text = ElectroStaticText(self, wx.ID_ANY, _("(shows the status of each piece in the torrent)")) if text_wrappable: self.fancy_text.Wrap(250) # generate random sample data r = set(xrange(200)) self.sample_data = {} for key, count in (('h',80), ('t',20)) + tuple([(i,5) for i in range(19)]): self.sample_data[key] = SparseSet() for d in random.sample(r, count): self.sample_data[key].add(d) r.remove(d) for d in r: self.sample_data[0].add(d) self.fancy_sample = self.new_sample(FancyDownloadGauge, 3) # sizers gauge = wx.TOP|wx.LEFT|wx.RIGHT extra = wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW self.gauge_sizer.Add(self.null_radio , flag=gauge, border=SPACING) self.gauge_sizer.AddSpacer((SPACING, SPACING)) self.gauge_sizer.Add(self.simple_radio , flag=gauge, border=SPACING) self.gauge_sizer.Add(self.simple_sample , flag=extra, border=SPACING) self.gauge_sizer.AddSpacer((SPACING, SPACING)) self.gauge_sizer.Add(self.moderate_radio , flag=gauge, border=SPACING) self.gauge_sizer.Add(self.moderate_sample, flag=extra, border=SPACING) self.gauge_sizer.Add(self.moderate_text , flag=extra, border=SPACING) self.gauge_sizer.AddSpacer((SPACING, SPACING)) self.gauge_sizer.Add(self.fancy_radio , flag=gauge, border=SPACING) self.gauge_sizer.Add(self.fancy_sample , flag=extra, border=SPACING) self.gauge_sizer.Add(self.fancy_text , flag=extra, border=SPACING) self.sizer.AddFirst(self.gauge_sizer, flag=wx.GROW) # setup self.pb_group = (self.null_radio, self.simple_radio, self.moderate_radio, self.fancy_radio) for r in self.pb_group: r.Bind(wx.EVT_RADIOBUTTON, self.radio) if r.value == wx.the_app.config[self.pb_config_key]: r.SetValue(True) else: r.SetValue(False) # toolbar widgets self.toolbar_box = wx.StaticBox(self, label=_("Toolbar style:")) self.toolbar_text = CheckButton(self, _("Show text"), self.settings_window, 'toolbar_text', self.settings_window.config['toolbar_text'], wx.the_app.reset_toolbar_style) self.toolbar_size_text = ElectroStaticText(self, id=wx.ID_ANY, label=_("Icon size:")) self.toolbar_size_choice = wx.Choice(self, choices=(_("Small"), _("Normal"), _("Large"))) self.toolbar_config_to_choice(wx.the_app.config['toolbar_size']) self.toolbar_size_choice.Bind(wx.EVT_CHOICE, self.toolbar_choice_to_config) # toolbar sizers self.toolbar_sizer = HSizer() self.toolbar_sizer.AddFirst(self.toolbar_text, flag=wx.ALIGN_CENTER_VERTICAL) line = wx.StaticLine(self, id=wx.ID_ANY, style=wx.VERTICAL) self.toolbar_sizer.Add(line, flag=wx.ALIGN_CENTER_VERTICAL|wx.GROW) self.toolbar_sizer.Add(self.toolbar_size_text, flag=wx.ALIGN_CENTER_VERTICAL) self.toolbar_sizer.Add(self.toolbar_size_choice, flag=wx.GROW|wx.ALIGN_TOP, proportion=1) self.toolbar_box_sizer = wx.StaticBoxSizer(self.toolbar_box, wx.VERTICAL) self.toolbar_box_sizer.Add(self.toolbar_sizer, flag=wx.GROW) self.sizer.Add(self.toolbar_box_sizer, flag=wx.GROW) if wx.the_app.config['debug']: # the T-Word widgets self.themes = [] self.theme_choice = wx.Choice(self, choices=[]) self.theme_choice.Enable(False) self.theme_choice.Bind(wx.EVT_CHOICE, self.set_theme) self.restart_hint = ElectroStaticText(self, id=wx.ID_ANY, label=_("(Changing themes requires restart.)")) self.theme_static_box = wx.StaticBox(self, label=_("Theme:")) # the T-Word sizers self.theme_sizer = VSizer() self.theme_sizer.AddFirst(self.theme_choice, flag=wx.GROW|wx.ALIGN_RIGHT) self.theme_sizer.Add(self.restart_hint, flag=wx.GROW|wx.ALIGN_RIGHT) self.theme_static_box_sizer = wx.StaticBoxSizer(self.theme_static_box, wx.VERTICAL) self.theme_static_box_sizer.Add(self.theme_sizer, flag=wx.GROW) self.sizer.Add(self.theme_static_box_sizer, flag=wx.GROW) self.get_themes() def get_themes(self): def _callback(themes): self.themes.extend(themes) self.theme_choice.AppendItems(strings=themes) curr_theme = wx.the_app.config['theme'] if curr_theme not in self.themes: self.settings_window.setfunc('theme', 'default') curr_theme = wx.the_app.config['theme'] curr_idx = self.themes.index(curr_theme) self.theme_choice.SetSelection(curr_idx) self.theme_choice.Enable(True) def callback(themes): gui_wrap(_callback, themes) df = list_themes() df.addCallback(callback) df.getResult() def set_theme(self, e): i = self.theme_choice.GetSelection() t = self.themes[i] self.settings_window.setfunc('theme', t) def toolbar_choice_to_config(self, *a): i = self.toolbar_size_choice.GetSelection(), size = 8*(i[0]+2) self.settings_window.setfunc('toolbar_size', size) wx.the_app.reset_toolbar_style() def toolbar_config_to_choice(self, value): i = (value//8) - 2 self.toolbar_size_choice.SetSelection(i) def new_sample(self, sample_class, value): sample = sample_class(self, size=wx.Size(-1, -1), style=wx.SUNKEN_BORDER) # I happen to know 200 is the right number because I looked. sample.SetValue(self.sample_value, 'running', (200, 0, self.sample_data)) sample.Bind(wx.EVT_LEFT_DOWN, self.sample) sample.Bind(wx.EVT_CONTEXT_MENU, None) sample.value = value return sample def radio(self, event): widget = event.GetEventObject() value = widget.value self.settings_window.setfunc(self.pb_config_key, value) gui_wrap(wx.the_app.main_window.torrentlist.change_gauge_type, value) def sample(self, event): self.radio(event) pb = event.GetEventObject() value = pb.value for p in self.pb_group: if p.value == value: p.SetValue(True) breakclass LanguageSettingsPanel(LanguageSettings): label = _("Language") def __init__(self, parent, *a, **k): LanguageSettings.__init__(self, parent, *a, **k) parent.AddPage(self, self.label) self.settings_window = parent.GetParent()class SettingsWindow(BTDialog): use_listbook = False def __init__(self, main_window, config, setfunc): BTDialog.__init__(self, main_window, style=wx.DEFAULT_DIALOG_STYLE|wx.CLIP_CHILDREN|wx.WANTS_CHARS) self.Bind(wx.EVT_CLOSE, self.close) self.Bind(wx.EVT_CHAR, self.key) self.SetTitle(_("%s Settings")%app_name) self.setfunc = setfunc self.config = config if self.use_listbook: self.notebook = wx.Listbook(self) # BUG use real icons imagelist = wx.ImageList(32, 32) p = os.path.join(image_root, 'logo', 'bittorrent_icon_32.png') assert os.access(p, os.F_OK) bitmap = wx.Bitmap(p, type=wx.BITMAP_TYPE_ANY) assert bitmap.Ok() imagelist.Add(bitmap) # end bug self.notebook.AssignImageList(imagelist) else: self.notebook = wx.Notebook(self) self.notebook.Bind(wx.EVT_CHAR, self.key) self.general_panel = GeneralSettingsPanel(self.notebook) self.saving_panel = SavingSettingsPanel(self.notebook) self.network_panel = NetworkSettingsPanel(self.notebook) self.appearance_panel = AppearanceSettingsPanel(self.notebook) self.language_panel = LanguageSettingsPanel(self.notebook) if self.use_listbook: for i in range(self.notebook.GetPageCount()): # BUG use real icons self.notebook.SetPageImage(i, 0) self.vbox = VSizer() self.vbox.AddFirst(self.notebook, proportion=1, flag=wx.GROW) self.vbox.Layout() self.SetSizerAndFit(self.vbox) self.SetFocus() def key(self, event): c = event.GetKeyCode() if c == wx.WXK_ESCAPE: self.close() event.Skip() def get_save_in(self, *e): d = wx.DirDialog(self, "", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) d.SetPath(self.config['save_in']) if d.ShowModal() == wx.ID_OK: path = d.GetPath() self.saving_panel.save_in_button.SetLabel(path) self.setfunc('save_in', path) def start_torrent_behavior_changed(self, event): widget = event.GetEventObject() state_name = widget.state_name self.setfunc('start_torrent_behavior', state_name) def close(self, *e): self.Hide()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -