36 |
kaklik |
1 |
#written by John Hoffman
|
|
|
2 |
|
|
|
3 |
from ConnChoice import *
|
|
|
4 |
from wxPython.wx import *
|
|
|
5 |
from types import IntType, FloatType, StringType
|
|
|
6 |
from download_bt1 import defaults
|
|
|
7 |
from ConfigDir import ConfigDir
|
|
|
8 |
import sys,os
|
|
|
9 |
import socket
|
|
|
10 |
from parseargs import defaultargs
|
|
|
11 |
|
|
|
12 |
try:
|
|
|
13 |
True
|
|
|
14 |
except:
|
|
|
15 |
True = 1
|
|
|
16 |
False = 0
|
|
|
17 |
|
|
|
18 |
try:
|
|
|
19 |
wxFULL_REPAINT_ON_RESIZE
|
|
|
20 |
except:
|
|
|
21 |
wxFULL_REPAINT_ON_RESIZE = 0 # fix for wx pre-2.5
|
|
|
22 |
|
|
|
23 |
if (sys.platform == 'win32'):
|
|
|
24 |
_FONT = 9
|
|
|
25 |
else:
|
|
|
26 |
_FONT = 10
|
|
|
27 |
|
|
|
28 |
def HexToColor(s):
|
|
|
29 |
r,g,b = s.split(' ')
|
|
|
30 |
return wxColour(red=int(r,16), green=int(g,16), blue=int(b,16))
|
|
|
31 |
|
|
|
32 |
def hex2(c):
|
|
|
33 |
h = hex(c)[2:]
|
|
|
34 |
if len(h) == 1:
|
|
|
35 |
h = '0'+h
|
|
|
36 |
return h
|
|
|
37 |
def ColorToHex(c):
|
|
|
38 |
return hex2(c.Red()) + ' ' + hex2(c.Green()) + ' ' + hex2(c.Blue())
|
|
|
39 |
|
|
|
40 |
ratesettingslist = []
|
|
|
41 |
for x in connChoices:
|
|
|
42 |
if not x.has_key('super-seed'):
|
|
|
43 |
ratesettingslist.append(x['name'])
|
|
|
44 |
|
|
|
45 |
|
|
|
46 |
configFileDefaults = [
|
|
|
47 |
#args only available for the gui client
|
|
|
48 |
('win32_taskbar_icon', 1,
|
|
|
49 |
"whether to iconize do system try or not on win32"),
|
|
|
50 |
('gui_stretchwindow', 0,
|
|
|
51 |
"whether to stretch the download status window to fit the torrent name"),
|
|
|
52 |
('gui_displaystats', 1,
|
|
|
53 |
"whether to display statistics on peers and seeds"),
|
|
|
54 |
('gui_displaymiscstats', 1,
|
|
|
55 |
"whether to display miscellaneous other statistics"),
|
|
|
56 |
('gui_ratesettingsdefault', ratesettingslist[0],
|
|
|
57 |
"the default setting for maximum upload rate and users"),
|
|
|
58 |
('gui_ratesettingsmode', 'full',
|
|
|
59 |
"what rate setting controls to display; options are 'none', 'basic', and 'full'"),
|
|
|
60 |
('gui_forcegreenonfirewall', 0,
|
|
|
61 |
"forces the status icon to be green even if the client seems to be firewalled"),
|
|
|
62 |
('gui_default_savedir', '',
|
|
|
63 |
"default save directory"),
|
|
|
64 |
('last_saved', '', # hidden; not set in config
|
|
|
65 |
"where the last torrent was saved"),
|
|
|
66 |
('gui_font', _FONT,
|
|
|
67 |
"the font size to use"),
|
|
|
68 |
('gui_saveas_ask', -1,
|
|
|
69 |
"whether to ask where to download to (0 = never, 1 = always, -1 = automatic resume"),
|
|
|
70 |
]
|
|
|
71 |
|
|
|
72 |
def setwxconfigfiledefaults():
|
|
|
73 |
CHECKINGCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_3DSHADOW))
|
|
|
74 |
DOWNLOADCOLOR = ColorToHex(wxSystemSettings_GetColour(wxSYS_COLOUR_ACTIVECAPTION))
|
|
|
75 |
|
|
|
76 |
configFileDefaults.extend([
|
|
|
77 |
('gui_checkingcolor', CHECKINGCOLOR,
|
|
|
78 |
"progress bar checking color"),
|
|
|
79 |
('gui_downloadcolor', DOWNLOADCOLOR,
|
|
|
80 |
"progress bar downloading color"),
|
|
|
81 |
('gui_seedingcolor', '00 FF 00',
|
|
|
82 |
"progress bar seeding color"),
|
|
|
83 |
])
|
|
|
84 |
|
|
|
85 |
defaultsToIgnore = ['responsefile', 'url', 'priority']
|
|
|
86 |
|
|
|
87 |
|
|
|
88 |
class configReader:
|
|
|
89 |
|
|
|
90 |
def __init__(self):
|
|
|
91 |
self.configfile = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
|
|
|
92 |
self.configMenuBox = None
|
|
|
93 |
self.advancedMenuBox = None
|
|
|
94 |
self._configReset = True # run reset for the first time
|
|
|
95 |
|
|
|
96 |
setwxconfigfiledefaults()
|
|
|
97 |
|
|
|
98 |
defaults.extend(configFileDefaults)
|
|
|
99 |
self.defaults = defaultargs(defaults)
|
|
|
100 |
|
|
|
101 |
self.configDir = ConfigDir('gui')
|
|
|
102 |
self.configDir.setDefaults(defaults,defaultsToIgnore)
|
|
|
103 |
if self.configDir.checkConfig():
|
|
|
104 |
self.config = self.configDir.loadConfig()
|
|
|
105 |
else:
|
|
|
106 |
self.config = self.configDir.getConfig()
|
|
|
107 |
self.importOldGUIConfig()
|
|
|
108 |
self.configDir.saveConfig()
|
|
|
109 |
|
|
|
110 |
updated = False # make all config default changes here
|
|
|
111 |
|
|
|
112 |
if self.config['gui_ratesettingsdefault'] not in ratesettingslist:
|
|
|
113 |
self.config['gui_ratesettingsdefault'] = (
|
|
|
114 |
self.defaults['gui_ratesettingsdefault'] )
|
|
|
115 |
updated = True
|
|
|
116 |
if self.config['ipv6_enabled'] and (
|
|
|
117 |
sys.version_info < (2,3) or not socket.has_ipv6 ):
|
|
|
118 |
self.config['ipv6_enabled'] = 0
|
|
|
119 |
updated = True
|
|
|
120 |
for c in ['gui_checkingcolor','gui_downloadcolor','gui_seedingcolor']:
|
|
|
121 |
try:
|
|
|
122 |
HexToColor(self.config[c])
|
|
|
123 |
except:
|
|
|
124 |
self.config[c] = self.defaults[c]
|
|
|
125 |
updated = True
|
|
|
126 |
|
|
|
127 |
if updated:
|
|
|
128 |
self.configDir.saveConfig()
|
|
|
129 |
|
|
|
130 |
self.configDir.deleteOldCacheData(self.config['expire_cache_data'])
|
|
|
131 |
|
|
|
132 |
|
|
|
133 |
def importOldGUIConfig(self):
|
|
|
134 |
oldconfig = wxConfig("BitTorrent",style=wxCONFIG_USE_LOCAL_FILE)
|
|
|
135 |
cont, s, i = oldconfig.GetFirstEntry()
|
|
|
136 |
if not cont:
|
|
|
137 |
oldconfig.DeleteAll()
|
|
|
138 |
return False
|
|
|
139 |
while cont: # import old config data
|
|
|
140 |
if self.config.has_key(s):
|
|
|
141 |
t = oldconfig.GetEntryType(s)
|
|
|
142 |
try:
|
|
|
143 |
if t == 1:
|
|
|
144 |
assert type(self.config[s]) == type('')
|
|
|
145 |
self.config[s] = oldconfig.Read(s)
|
|
|
146 |
elif t == 2 or t == 3:
|
|
|
147 |
assert type(self.config[s]) == type(1)
|
|
|
148 |
self.config[s] = int(oldconfig.ReadInt(s))
|
|
|
149 |
elif t == 4:
|
|
|
150 |
assert type(self.config[s]) == type(1.0)
|
|
|
151 |
self.config[s] = oldconfig.ReadFloat(s)
|
|
|
152 |
except:
|
|
|
153 |
pass
|
|
|
154 |
cont, s, i = oldconfig.GetNextEntry(i)
|
|
|
155 |
|
|
|
156 |
# oldconfig.DeleteAll()
|
|
|
157 |
return True
|
|
|
158 |
|
|
|
159 |
|
|
|
160 |
def resetConfigDefaults(self):
|
|
|
161 |
for p,v in self.defaults.items():
|
|
|
162 |
if not p in defaultsToIgnore:
|
|
|
163 |
self.config[p] = v
|
|
|
164 |
self.configDir.saveConfig()
|
|
|
165 |
|
|
|
166 |
def writeConfigFile(self):
|
|
|
167 |
self.configDir.saveConfig()
|
|
|
168 |
|
|
|
169 |
def WriteLastSaved(self, l):
|
|
|
170 |
self.config['last_saved'] = l
|
|
|
171 |
self.configDir.saveConfig()
|
|
|
172 |
|
|
|
173 |
|
|
|
174 |
def getcheckingcolor(self):
|
|
|
175 |
return HexToColor(self.config['gui_checkingcolor'])
|
|
|
176 |
def getdownloadcolor(self):
|
|
|
177 |
return HexToColor(self.config['gui_downloadcolor'])
|
|
|
178 |
def getseedingcolor(self):
|
|
|
179 |
return HexToColor(self.config['gui_seedingcolor'])
|
|
|
180 |
|
|
|
181 |
def configReset(self):
|
|
|
182 |
r = self._configReset
|
|
|
183 |
self._configReset = False
|
|
|
184 |
return r
|
|
|
185 |
|
|
|
186 |
def getConfigDir(self):
|
|
|
187 |
return self.configDir
|
|
|
188 |
|
|
|
189 |
def getIconDir(self):
|
|
|
190 |
return self.configDir.getIconDir()
|
|
|
191 |
|
|
|
192 |
def getTorrentData(self,t):
|
|
|
193 |
return self.configDir.getTorrentData(t)
|
|
|
194 |
|
|
|
195 |
def setColorIcon(self, xxicon, xxiconptr, xxcolor):
|
|
|
196 |
idata = wxMemoryDC()
|
|
|
197 |
idata.SelectObject(xxicon)
|
|
|
198 |
idata.SetBrush(wxBrush(xxcolor,wxSOLID))
|
|
|
199 |
idata.DrawRectangle(0,0,16,16)
|
|
|
200 |
idata.SelectObject(wxNullBitmap)
|
|
|
201 |
xxiconptr.Refresh()
|
|
|
202 |
|
|
|
203 |
|
|
|
204 |
def getColorFromUser(self, parent, colInit):
|
|
|
205 |
data = wxColourData()
|
|
|
206 |
if colInit.Ok():
|
|
|
207 |
data.SetColour(colInit)
|
|
|
208 |
data.SetCustomColour(0, self.checkingcolor)
|
|
|
209 |
data.SetCustomColour(1, self.downloadcolor)
|
|
|
210 |
data.SetCustomColour(2, self.seedingcolor)
|
|
|
211 |
dlg = wxColourDialog(parent,data)
|
|
|
212 |
if not dlg.ShowModal():
|
|
|
213 |
return colInit
|
|
|
214 |
return dlg.GetColourData().GetColour()
|
|
|
215 |
|
|
|
216 |
|
|
|
217 |
def configMenu(self, parent):
|
|
|
218 |
self.parent = parent
|
|
|
219 |
try:
|
|
|
220 |
self.FONT = self.config['gui_font']
|
|
|
221 |
self.default_font = wxFont(self.FONT, wxDEFAULT, wxNORMAL, wxNORMAL, False)
|
|
|
222 |
self.checkingcolor = HexToColor(self.config['gui_checkingcolor'])
|
|
|
223 |
self.downloadcolor = HexToColor(self.config['gui_downloadcolor'])
|
|
|
224 |
self.seedingcolor = HexToColor(self.config['gui_seedingcolor'])
|
|
|
225 |
|
|
|
226 |
if (self.configMenuBox is not None):
|
|
|
227 |
try:
|
|
|
228 |
self.configMenuBox.Close()
|
|
|
229 |
except wxPyDeadObjectError, e:
|
|
|
230 |
self.configMenuBox = None
|
|
|
231 |
|
|
|
232 |
self.configMenuBox = wxFrame(None, -1, 'BitTorrent Preferences', size = (1,1),
|
|
|
233 |
style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
|
|
|
234 |
if (sys.platform == 'win32'):
|
|
|
235 |
self.icon = self.parent.icon
|
|
|
236 |
self.configMenuBox.SetIcon(self.icon)
|
|
|
237 |
|
|
|
238 |
panel = wxPanel(self.configMenuBox, -1)
|
|
|
239 |
self.panel = panel
|
|
|
240 |
|
|
|
241 |
def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
|
|
|
242 |
x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
|
|
|
243 |
x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
|
|
|
244 |
if color is not None:
|
|
|
245 |
x.SetForegroundColour(color)
|
|
|
246 |
return x
|
|
|
247 |
|
|
|
248 |
colsizer = wxFlexGridSizer(cols = 1, vgap = 8)
|
|
|
249 |
|
|
|
250 |
self.gui_stretchwindow_checkbox = wxCheckBox(panel, -1, "Stretch window to fit torrent name *")
|
|
|
251 |
self.gui_stretchwindow_checkbox.SetFont(self.default_font)
|
|
|
252 |
self.gui_stretchwindow_checkbox.SetValue(self.config['gui_stretchwindow'])
|
|
|
253 |
|
|
|
254 |
self.gui_displaystats_checkbox = wxCheckBox(panel, -1, "Display peer and seed statistics")
|
|
|
255 |
self.gui_displaystats_checkbox.SetFont(self.default_font)
|
|
|
256 |
self.gui_displaystats_checkbox.SetValue(self.config['gui_displaystats'])
|
|
|
257 |
|
|
|
258 |
self.gui_displaymiscstats_checkbox = wxCheckBox(panel, -1, "Display miscellaneous other statistics")
|
|
|
259 |
self.gui_displaymiscstats_checkbox.SetFont(self.default_font)
|
|
|
260 |
self.gui_displaymiscstats_checkbox.SetValue(self.config['gui_displaymiscstats'])
|
|
|
261 |
|
|
|
262 |
self.security_checkbox = wxCheckBox(panel, -1, "Don't allow multiple connections from the same IP")
|
|
|
263 |
self.security_checkbox.SetFont(self.default_font)
|
|
|
264 |
self.security_checkbox.SetValue(self.config['security'])
|
|
|
265 |
|
|
|
266 |
self.autokick_checkbox = wxCheckBox(panel, -1, "Kick/ban clients that send you bad data *")
|
|
|
267 |
self.autokick_checkbox.SetFont(self.default_font)
|
|
|
268 |
self.autokick_checkbox.SetValue(self.config['auto_kick'])
|
|
|
269 |
|
|
|
270 |
self.buffering_checkbox = wxCheckBox(panel, -1, "Enable read/write buffering *")
|
|
|
271 |
self.buffering_checkbox.SetFont(self.default_font)
|
|
|
272 |
self.buffering_checkbox.SetValue(self.config['buffer_reads'])
|
|
|
273 |
|
|
|
274 |
self.breakup_checkbox = wxCheckBox(panel, -1, "Break-up seed bitfield to foil ISP manipulation")
|
|
|
275 |
self.breakup_checkbox.SetFont(self.default_font)
|
|
|
276 |
self.breakup_checkbox.SetValue(self.config['breakup_seed_bitfield'])
|
|
|
277 |
|
|
|
278 |
self.autoflush_checkbox = wxCheckBox(panel, -1, "Flush data to disk every 5 minutes")
|
|
|
279 |
self.autoflush_checkbox.SetFont(self.default_font)
|
|
|
280 |
self.autoflush_checkbox.SetValue(self.config['auto_flush'])
|
|
|
281 |
|
|
|
282 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
283 |
self.ipv6enabled_checkbox = wxCheckBox(panel, -1, "Initiate and receive connections via IPv6 *")
|
|
|
284 |
self.ipv6enabled_checkbox.SetFont(self.default_font)
|
|
|
285 |
self.ipv6enabled_checkbox.SetValue(self.config['ipv6_enabled'])
|
|
|
286 |
|
|
|
287 |
self.gui_forcegreenonfirewall_checkbox = wxCheckBox(panel, -1,
|
|
|
288 |
"Force icon to display green when firewalled")
|
|
|
289 |
self.gui_forcegreenonfirewall_checkbox.SetFont(self.default_font)
|
|
|
290 |
self.gui_forcegreenonfirewall_checkbox.SetValue(self.config['gui_forcegreenonfirewall'])
|
|
|
291 |
|
|
|
292 |
|
|
|
293 |
self.minport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
|
|
|
294 |
self.minport_data.SetFont(self.default_font)
|
|
|
295 |
self.minport_data.SetRange(1,65535)
|
|
|
296 |
self.minport_data.SetValue(self.config['minport'])
|
|
|
297 |
|
|
|
298 |
self.maxport_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*8, -1))
|
|
|
299 |
self.maxport_data.SetFont(self.default_font)
|
|
|
300 |
self.maxport_data.SetRange(1,65535)
|
|
|
301 |
self.maxport_data.SetValue(self.config['maxport'])
|
|
|
302 |
|
|
|
303 |
self.randomport_checkbox = wxCheckBox(panel, -1, "randomize")
|
|
|
304 |
self.randomport_checkbox.SetFont(self.default_font)
|
|
|
305 |
self.randomport_checkbox.SetValue(self.config['random_port'])
|
|
|
306 |
|
|
|
307 |
self.gui_font_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*5, -1))
|
|
|
308 |
self.gui_font_data.SetFont(self.default_font)
|
|
|
309 |
self.gui_font_data.SetRange(8,16)
|
|
|
310 |
self.gui_font_data.SetValue(self.config['gui_font'])
|
|
|
311 |
|
|
|
312 |
self.gui_ratesettingsdefault_data=wxChoice(panel, -1, choices = ratesettingslist)
|
|
|
313 |
self.gui_ratesettingsdefault_data.SetFont(self.default_font)
|
|
|
314 |
self.gui_ratesettingsdefault_data.SetStringSelection(self.config['gui_ratesettingsdefault'])
|
|
|
315 |
|
|
|
316 |
self.maxdownload_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
|
|
|
317 |
self.maxdownload_data.SetFont(self.default_font)
|
|
|
318 |
self.maxdownload_data.SetRange(0,5000)
|
|
|
319 |
self.maxdownload_data.SetValue(self.config['max_download_rate'])
|
|
|
320 |
|
|
|
321 |
self.gui_ratesettingsmode_data=wxRadioBox(panel, -1, 'Rate Settings Mode',
|
|
|
322 |
choices = [ 'none', 'basic', 'full' ] )
|
|
|
323 |
self.gui_ratesettingsmode_data.SetFont(self.default_font)
|
|
|
324 |
self.gui_ratesettingsmode_data.SetStringSelection(self.config['gui_ratesettingsmode'])
|
|
|
325 |
|
|
|
326 |
if (sys.platform == 'win32'):
|
|
|
327 |
self.win32_taskbar_icon_checkbox = wxCheckBox(panel, -1, "Minimize to system tray")
|
|
|
328 |
self.win32_taskbar_icon_checkbox.SetFont(self.default_font)
|
|
|
329 |
self.win32_taskbar_icon_checkbox.SetValue(self.config['win32_taskbar_icon'])
|
|
|
330 |
|
|
|
331 |
# self.upnp_checkbox = wxCheckBox(panel, -1, "Enable automatic UPnP port forwarding")
|
|
|
332 |
# self.upnp_checkbox.SetFont(self.default_font)
|
|
|
333 |
# self.upnp_checkbox.SetValue(self.config['upnp_nat_access'])
|
|
|
334 |
self.upnp_data=wxChoice(panel, -1,
|
|
|
335 |
choices = ['disabled', 'type 1 (fast)', 'type 2 (slow)'])
|
|
|
336 |
self.upnp_data.SetFont(self.default_font)
|
|
|
337 |
self.upnp_data.SetSelection(self.config['upnp_nat_access'])
|
|
|
338 |
|
|
|
339 |
self.gui_default_savedir_ctrl = wxTextCtrl(parent = panel, id = -1,
|
|
|
340 |
value = self.config['gui_default_savedir'],
|
|
|
341 |
size = (26*self.FONT, -1), style = wxTE_PROCESS_TAB)
|
|
|
342 |
self.gui_default_savedir_ctrl.SetFont(self.default_font)
|
|
|
343 |
|
|
|
344 |
self.gui_savemode_data=wxRadioBox(panel, -1, 'Ask where to save: *',
|
|
|
345 |
choices = [ 'always', 'never', 'auto-resume' ] )
|
|
|
346 |
self.gui_savemode_data.SetFont(self.default_font)
|
|
|
347 |
self.gui_savemode_data.SetSelection(1-self.config['gui_saveas_ask'])
|
|
|
348 |
|
|
|
349 |
self.checkingcolor_icon = wxEmptyBitmap(16,16)
|
|
|
350 |
self.checkingcolor_iconptr = wxStaticBitmap(panel, -1, self.checkingcolor_icon)
|
|
|
351 |
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
|
|
|
352 |
|
|
|
353 |
self.downloadcolor_icon = wxEmptyBitmap(16,16)
|
|
|
354 |
self.downloadcolor_iconptr = wxStaticBitmap(panel, -1, self.downloadcolor_icon)
|
|
|
355 |
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
|
|
|
356 |
|
|
|
357 |
self.seedingcolor_icon = wxEmptyBitmap(16,16)
|
|
|
358 |
self.seedingcolor_iconptr = wxStaticBitmap(panel, -1, self.seedingcolor_icon)
|
|
|
359 |
self.setColorIcon(self.seedingcolor_icon, self.downloadcolor_iconptr, self.seedingcolor)
|
|
|
360 |
|
|
|
361 |
rowsizer = wxFlexGridSizer(cols = 2, hgap = 20)
|
|
|
362 |
|
|
|
363 |
block12sizer = wxFlexGridSizer(cols = 1, vgap = 7)
|
|
|
364 |
|
|
|
365 |
block1sizer = wxFlexGridSizer(cols = 1, vgap = 2)
|
|
|
366 |
if (sys.platform == 'win32'):
|
|
|
367 |
block1sizer.Add(self.win32_taskbar_icon_checkbox)
|
|
|
368 |
# block1sizer.Add(self.upnp_checkbox)
|
|
|
369 |
block1sizer.Add(self.gui_stretchwindow_checkbox)
|
|
|
370 |
block1sizer.Add(self.gui_displaystats_checkbox)
|
|
|
371 |
block1sizer.Add(self.gui_displaymiscstats_checkbox)
|
|
|
372 |
block1sizer.Add(self.security_checkbox)
|
|
|
373 |
block1sizer.Add(self.autokick_checkbox)
|
|
|
374 |
block1sizer.Add(self.buffering_checkbox)
|
|
|
375 |
block1sizer.Add(self.breakup_checkbox)
|
|
|
376 |
block1sizer.Add(self.autoflush_checkbox)
|
|
|
377 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
378 |
block1sizer.Add(self.ipv6enabled_checkbox)
|
|
|
379 |
block1sizer.Add(self.gui_forcegreenonfirewall_checkbox)
|
|
|
380 |
|
|
|
381 |
block12sizer.Add(block1sizer)
|
|
|
382 |
|
|
|
383 |
colorsizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Gauge Colors:"), wxVERTICAL)
|
|
|
384 |
colorsizer1 = wxFlexGridSizer(cols = 7)
|
|
|
385 |
colorsizer1.Add(StaticText(' Checking: '), 1, wxALIGN_BOTTOM)
|
|
|
386 |
colorsizer1.Add(self.checkingcolor_iconptr, 1, wxALIGN_BOTTOM)
|
|
|
387 |
colorsizer1.Add(StaticText(' Downloading: '), 1, wxALIGN_BOTTOM)
|
|
|
388 |
colorsizer1.Add(self.downloadcolor_iconptr, 1, wxALIGN_BOTTOM)
|
|
|
389 |
colorsizer1.Add(StaticText(' Seeding: '), 1, wxALIGN_BOTTOM)
|
|
|
390 |
colorsizer1.Add(self.seedingcolor_iconptr, 1, wxALIGN_BOTTOM)
|
|
|
391 |
colorsizer1.Add(StaticText(' '))
|
|
|
392 |
minsize = self.checkingcolor_iconptr.GetBestSize()
|
|
|
393 |
minsize.SetHeight(minsize.GetHeight()+5)
|
|
|
394 |
colorsizer1.SetMinSize(minsize)
|
|
|
395 |
colorsizer.Add(colorsizer1)
|
|
|
396 |
|
|
|
397 |
block12sizer.Add(colorsizer, 1, wxALIGN_LEFT)
|
|
|
398 |
|
|
|
399 |
rowsizer.Add(block12sizer)
|
|
|
400 |
|
|
|
401 |
block3sizer = wxFlexGridSizer(cols = 1)
|
|
|
402 |
|
|
|
403 |
portsettingsSizer = wxStaticBoxSizer(wxStaticBox(panel, -1, "Port Range:*"), wxVERTICAL)
|
|
|
404 |
portsettingsSizer1 = wxGridSizer(cols = 2, vgap = 1)
|
|
|
405 |
portsettingsSizer1.Add(StaticText('From: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
|
|
|
406 |
portsettingsSizer1.Add(self.minport_data, 1, wxALIGN_BOTTOM)
|
|
|
407 |
portsettingsSizer1.Add(StaticText('To: '), 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT)
|
|
|
408 |
portsettingsSizer1.Add(self.maxport_data, 1, wxALIGN_BOTTOM)
|
|
|
409 |
portsettingsSizer.Add(portsettingsSizer1)
|
|
|
410 |
portsettingsSizer.Add(self.randomport_checkbox, 1, wxALIGN_CENTER)
|
|
|
411 |
block3sizer.Add(portsettingsSizer, 1, wxALIGN_CENTER)
|
|
|
412 |
block3sizer.Add(StaticText(' '))
|
|
|
413 |
block3sizer.Add(self.gui_ratesettingsmode_data, 1, wxALIGN_CENTER)
|
|
|
414 |
block3sizer.Add(StaticText(' '))
|
|
|
415 |
ratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
|
|
|
416 |
ratesettingsSizer.Add(StaticText('Default Rate Setting: *'), 1, wxALIGN_CENTER)
|
|
|
417 |
ratesettingsSizer.Add(self.gui_ratesettingsdefault_data, 1, wxALIGN_CENTER)
|
|
|
418 |
block3sizer.Add(ratesettingsSizer, 1, wxALIGN_CENTER)
|
|
|
419 |
if (sys.platform == 'win32'):
|
|
|
420 |
block3sizer.Add(StaticText(' '))
|
|
|
421 |
upnpSizer = wxFlexGridSizer(cols = 1, vgap = 2)
|
|
|
422 |
upnpSizer.Add(StaticText('UPnP Port Forwarding: *'), 1, wxALIGN_CENTER)
|
|
|
423 |
upnpSizer.Add(self.upnp_data, 1, wxALIGN_CENTER)
|
|
|
424 |
block3sizer.Add(upnpSizer, 1, wxALIGN_CENTER)
|
|
|
425 |
|
|
|
426 |
rowsizer.Add(block3sizer)
|
|
|
427 |
colsizer.Add(rowsizer)
|
|
|
428 |
|
|
|
429 |
block4sizer = wxFlexGridSizer(cols = 3, hgap = 15)
|
|
|
430 |
savepathsizer = wxFlexGridSizer(cols = 2, vgap = 1)
|
|
|
431 |
savepathsizer.Add(StaticText('Default Save Path: *'))
|
|
|
432 |
savepathsizer.Add(StaticText(' '))
|
|
|
433 |
savepathsizer.Add(self.gui_default_savedir_ctrl, 1, wxEXPAND)
|
|
|
434 |
savepathButton = wxButton(panel, -1, '...', size = (18,18))
|
|
|
435 |
# savepathButton.SetFont(self.default_font)
|
|
|
436 |
savepathsizer.Add(savepathButton, 0, wxALIGN_CENTER)
|
|
|
437 |
savepathsizer.Add(self.gui_savemode_data, 0, wxALIGN_CENTER)
|
|
|
438 |
block4sizer.Add(savepathsizer, -1, wxALIGN_BOTTOM)
|
|
|
439 |
|
|
|
440 |
fontsizer = wxFlexGridSizer(cols = 1, vgap = 2)
|
|
|
441 |
fontsizer.Add(StaticText(''))
|
|
|
442 |
fontsizer.Add(StaticText('Font: *'), 1, wxALIGN_CENTER)
|
|
|
443 |
fontsizer.Add(self.gui_font_data, 1, wxALIGN_CENTER)
|
|
|
444 |
block4sizer.Add(fontsizer, 1, wxALIGN_CENTER_VERTICAL)
|
|
|
445 |
|
|
|
446 |
dratesettingsSizer = wxFlexGridSizer(cols = 1, vgap = 2)
|
|
|
447 |
dratesettingsSizer.Add(StaticText('Default Max'), 1, wxALIGN_CENTER)
|
|
|
448 |
dratesettingsSizer.Add(StaticText('Download Rate'), 1, wxALIGN_CENTER)
|
|
|
449 |
dratesettingsSizer.Add(StaticText('(kB/s): *'), 1, wxALIGN_CENTER)
|
|
|
450 |
dratesettingsSizer.Add(self.maxdownload_data, 1, wxALIGN_CENTER)
|
|
|
451 |
dratesettingsSizer.Add(StaticText('(0 = disabled)'), 1, wxALIGN_CENTER)
|
|
|
452 |
|
|
|
453 |
block4sizer.Add(dratesettingsSizer, 1, wxALIGN_CENTER_VERTICAL)
|
|
|
454 |
|
|
|
455 |
colsizer.Add(block4sizer, 0, wxALIGN_CENTER)
|
|
|
456 |
# colsizer.Add(StaticText(' '))
|
|
|
457 |
|
|
|
458 |
savesizer = wxGridSizer(cols = 4, hgap = 10)
|
|
|
459 |
saveButton = wxButton(panel, -1, 'Save')
|
|
|
460 |
# saveButton.SetFont(self.default_font)
|
|
|
461 |
savesizer.Add(saveButton, 0, wxALIGN_CENTER)
|
|
|
462 |
|
|
|
463 |
cancelButton = wxButton(panel, -1, 'Cancel')
|
|
|
464 |
# cancelButton.SetFont(self.default_font)
|
|
|
465 |
savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
|
|
|
466 |
|
|
|
467 |
defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
|
|
|
468 |
# defaultsButton.SetFont(self.default_font)
|
|
|
469 |
savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
|
|
|
470 |
|
|
|
471 |
advancedButton = wxButton(panel, -1, 'Advanced...')
|
|
|
472 |
# advancedButton.SetFont(self.default_font)
|
|
|
473 |
savesizer.Add(advancedButton, 0, wxALIGN_CENTER)
|
|
|
474 |
colsizer.Add(savesizer, 1, wxALIGN_CENTER)
|
|
|
475 |
|
|
|
476 |
resizewarningtext=StaticText('* These settings will not take effect until the next time you start BitTorrent', self.FONT-2)
|
|
|
477 |
colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
|
|
|
478 |
|
|
|
479 |
border = wxBoxSizer(wxHORIZONTAL)
|
|
|
480 |
border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
|
|
|
481 |
|
|
|
482 |
panel.SetSizer(border)
|
|
|
483 |
panel.SetAutoLayout(True)
|
|
|
484 |
|
|
|
485 |
self.advancedConfig = {}
|
|
|
486 |
|
|
|
487 |
def setDefaults(evt, self = self):
|
|
|
488 |
try:
|
|
|
489 |
self.minport_data.SetValue(self.defaults['minport'])
|
|
|
490 |
self.maxport_data.SetValue(self.defaults['maxport'])
|
|
|
491 |
self.randomport_checkbox.SetValue(self.defaults['random_port'])
|
|
|
492 |
self.gui_stretchwindow_checkbox.SetValue(self.defaults['gui_stretchwindow'])
|
|
|
493 |
self.gui_displaystats_checkbox.SetValue(self.defaults['gui_displaystats'])
|
|
|
494 |
self.gui_displaymiscstats_checkbox.SetValue(self.defaults['gui_displaymiscstats'])
|
|
|
495 |
self.security_checkbox.SetValue(self.defaults['security'])
|
|
|
496 |
self.autokick_checkbox.SetValue(self.defaults['auto_kick'])
|
|
|
497 |
self.buffering_checkbox.SetValue(self.defaults['buffer_reads'])
|
|
|
498 |
self.breakup_checkbox.SetValue(self.defaults['breakup_seed_bitfield'])
|
|
|
499 |
self.autoflush_checkbox.SetValue(self.defaults['auto_flush'])
|
|
|
500 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
501 |
self.ipv6enabled_checkbox.SetValue(self.defaults['ipv6_enabled'])
|
|
|
502 |
self.gui_forcegreenonfirewall_checkbox.SetValue(self.defaults['gui_forcegreenonfirewall'])
|
|
|
503 |
self.gui_font_data.SetValue(self.defaults['gui_font'])
|
|
|
504 |
self.gui_ratesettingsdefault_data.SetStringSelection(self.defaults['gui_ratesettingsdefault'])
|
|
|
505 |
self.maxdownload_data.SetValue(self.defaults['max_download_rate'])
|
|
|
506 |
self.gui_ratesettingsmode_data.SetStringSelection(self.defaults['gui_ratesettingsmode'])
|
|
|
507 |
self.gui_default_savedir_ctrl.SetValue(self.defaults['gui_default_savedir'])
|
|
|
508 |
self.gui_savemode_data.SetSelection(1-self.defaults['gui_saveas_ask'])
|
|
|
509 |
|
|
|
510 |
self.checkingcolor = HexToColor(self.defaults['gui_checkingcolor'])
|
|
|
511 |
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, self.checkingcolor)
|
|
|
512 |
self.downloadcolor = HexToColor(self.defaults['gui_downloadcolor'])
|
|
|
513 |
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, self.downloadcolor)
|
|
|
514 |
self.seedingcolor = HexToColor(self.defaults['gui_seedingcolor'])
|
|
|
515 |
self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, self.seedingcolor)
|
|
|
516 |
|
|
|
517 |
if (sys.platform == 'win32'):
|
|
|
518 |
self.win32_taskbar_icon_checkbox.SetValue(self.defaults['win32_taskbar_icon'])
|
|
|
519 |
# self.upnp_checkbox.SetValue(self.defaults['upnp_nat_access'])
|
|
|
520 |
self.upnp_data.SetSelection(self.defaults['upnp_nat_access'])
|
|
|
521 |
|
|
|
522 |
# reset advanced too
|
|
|
523 |
self.advancedConfig = {}
|
|
|
524 |
for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
|
|
|
525 |
'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
|
|
|
526 |
'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
|
|
|
527 |
'expire_cache_data']:
|
|
|
528 |
self.advancedConfig[key] = self.defaults[key]
|
|
|
529 |
self.CloseAdvanced()
|
|
|
530 |
except:
|
|
|
531 |
self.parent.exception()
|
|
|
532 |
|
|
|
533 |
|
|
|
534 |
def saveConfigs(evt, self = self):
|
|
|
535 |
try:
|
|
|
536 |
self.config['gui_stretchwindow']=int(self.gui_stretchwindow_checkbox.GetValue())
|
|
|
537 |
self.config['gui_displaystats']=int(self.gui_displaystats_checkbox.GetValue())
|
|
|
538 |
self.config['gui_displaymiscstats']=int(self.gui_displaymiscstats_checkbox.GetValue())
|
|
|
539 |
self.config['security']=int(self.security_checkbox.GetValue())
|
|
|
540 |
self.config['auto_kick']=int(self.autokick_checkbox.GetValue())
|
|
|
541 |
buffering=int(self.buffering_checkbox.GetValue())
|
|
|
542 |
self.config['buffer_reads']=buffering
|
|
|
543 |
if buffering:
|
|
|
544 |
self.config['write_buffer_size']=self.defaults['write_buffer_size']
|
|
|
545 |
else:
|
|
|
546 |
self.config['write_buffer_size']=0
|
|
|
547 |
self.config['breakup_seed_bitfield']=int(self.breakup_checkbox.GetValue())
|
|
|
548 |
if self.autoflush_checkbox.GetValue():
|
|
|
549 |
self.config['auto_flush']=5
|
|
|
550 |
else:
|
|
|
551 |
self.config['auto_flush']=0
|
|
|
552 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
553 |
self.config['ipv6_enabled']=int(self.ipv6enabled_checkbox.GetValue())
|
|
|
554 |
self.config['gui_forcegreenonfirewall']=int(self.gui_forcegreenonfirewall_checkbox.GetValue())
|
|
|
555 |
self.config['minport']=self.minport_data.GetValue()
|
|
|
556 |
self.config['maxport']=self.maxport_data.GetValue()
|
|
|
557 |
self.config['random_port']=int(self.randomport_checkbox.GetValue())
|
|
|
558 |
self.config['gui_font']=self.gui_font_data.GetValue()
|
|
|
559 |
self.config['gui_ratesettingsdefault']=self.gui_ratesettingsdefault_data.GetStringSelection()
|
|
|
560 |
self.config['max_download_rate']=self.maxdownload_data.GetValue()
|
|
|
561 |
self.config['gui_ratesettingsmode']=self.gui_ratesettingsmode_data.GetStringSelection()
|
|
|
562 |
self.config['gui_default_savedir']=self.gui_default_savedir_ctrl.GetValue()
|
|
|
563 |
self.config['gui_saveas_ask']=1-self.gui_savemode_data.GetSelection()
|
|
|
564 |
self.config['gui_checkingcolor']=ColorToHex(self.checkingcolor)
|
|
|
565 |
self.config['gui_downloadcolor']=ColorToHex(self.downloadcolor)
|
|
|
566 |
self.config['gui_seedingcolor']=ColorToHex(self.seedingcolor)
|
|
|
567 |
|
|
|
568 |
if (sys.platform == 'win32'):
|
|
|
569 |
self.config['win32_taskbar_icon']=int(self.win32_taskbar_icon_checkbox.GetValue())
|
|
|
570 |
# self.config['upnp_nat_access']=int(self.upnp_checkbox.GetValue())
|
|
|
571 |
self.config['upnp_nat_access']=self.upnp_data.GetSelection()
|
|
|
572 |
|
|
|
573 |
if self.advancedConfig:
|
|
|
574 |
for key,val in self.advancedConfig.items():
|
|
|
575 |
self.config[key] = val
|
|
|
576 |
|
|
|
577 |
self.writeConfigFile()
|
|
|
578 |
self._configReset = True
|
|
|
579 |
self.Close()
|
|
|
580 |
except:
|
|
|
581 |
self.parent.exception()
|
|
|
582 |
|
|
|
583 |
def cancelConfigs(evt, self = self):
|
|
|
584 |
self.Close()
|
|
|
585 |
|
|
|
586 |
def savepath_set(evt, self = self):
|
|
|
587 |
try:
|
|
|
588 |
d = self.gui_default_savedir_ctrl.GetValue()
|
|
|
589 |
if d == '':
|
|
|
590 |
d = self.config['last_saved']
|
|
|
591 |
dl = wxDirDialog(self.panel, 'Choose a default directory to save to',
|
|
|
592 |
d, style = wxDD_DEFAULT_STYLE | wxDD_NEW_DIR_BUTTON)
|
|
|
593 |
if dl.ShowModal() == wxID_OK:
|
|
|
594 |
self.gui_default_savedir_ctrl.SetValue(dl.GetPath())
|
|
|
595 |
except:
|
|
|
596 |
self.parent.exception()
|
|
|
597 |
|
|
|
598 |
def checkingcoloricon_set(evt, self = self):
|
|
|
599 |
try:
|
|
|
600 |
newcolor = self.getColorFromUser(self.panel,self.checkingcolor)
|
|
|
601 |
self.setColorIcon(self.checkingcolor_icon, self.checkingcolor_iconptr, newcolor)
|
|
|
602 |
self.checkingcolor = newcolor
|
|
|
603 |
except:
|
|
|
604 |
self.parent.exception()
|
|
|
605 |
|
|
|
606 |
def downloadcoloricon_set(evt, self = self):
|
|
|
607 |
try:
|
|
|
608 |
newcolor = self.getColorFromUser(self.panel,self.downloadcolor)
|
|
|
609 |
self.setColorIcon(self.downloadcolor_icon, self.downloadcolor_iconptr, newcolor)
|
|
|
610 |
self.downloadcolor = newcolor
|
|
|
611 |
except:
|
|
|
612 |
self.parent.exception()
|
|
|
613 |
|
|
|
614 |
def seedingcoloricon_set(evt, self = self):
|
|
|
615 |
try:
|
|
|
616 |
newcolor = self.getColorFromUser(self.panel,self.seedingcolor)
|
|
|
617 |
self.setColorIcon(self.seedingcolor_icon, self.seedingcolor_iconptr, newcolor)
|
|
|
618 |
self.seedingcolor = newcolor
|
|
|
619 |
except:
|
|
|
620 |
self.parent.exception()
|
|
|
621 |
|
|
|
622 |
EVT_BUTTON(self.configMenuBox, saveButton.GetId(), saveConfigs)
|
|
|
623 |
EVT_BUTTON(self.configMenuBox, cancelButton.GetId(), cancelConfigs)
|
|
|
624 |
EVT_BUTTON(self.configMenuBox, defaultsButton.GetId(), setDefaults)
|
|
|
625 |
EVT_BUTTON(self.configMenuBox, advancedButton.GetId(), self.advancedMenu)
|
|
|
626 |
EVT_BUTTON(self.configMenuBox, savepathButton.GetId(), savepath_set)
|
|
|
627 |
EVT_LEFT_DOWN(self.checkingcolor_iconptr, checkingcoloricon_set)
|
|
|
628 |
EVT_LEFT_DOWN(self.downloadcolor_iconptr, downloadcoloricon_set)
|
|
|
629 |
EVT_LEFT_DOWN(self.seedingcolor_iconptr, seedingcoloricon_set)
|
|
|
630 |
|
|
|
631 |
self.configMenuBox.Show ()
|
|
|
632 |
border.Fit(panel)
|
|
|
633 |
self.configMenuBox.Fit()
|
|
|
634 |
except:
|
|
|
635 |
self.parent.exception()
|
|
|
636 |
|
|
|
637 |
|
|
|
638 |
def Close(self):
|
|
|
639 |
self.CloseAdvanced()
|
|
|
640 |
if self.configMenuBox is not None:
|
|
|
641 |
try:
|
|
|
642 |
self.configMenuBox.Close ()
|
|
|
643 |
except wxPyDeadObjectError, e:
|
|
|
644 |
pass
|
|
|
645 |
self.configMenuBox = None
|
|
|
646 |
|
|
|
647 |
def advancedMenu(self, event = None):
|
|
|
648 |
try:
|
|
|
649 |
if not self.advancedConfig:
|
|
|
650 |
for key in ['ip', 'bind', 'min_peers', 'max_initiate', 'display_interval',
|
|
|
651 |
'alloc_type', 'alloc_rate', 'max_files_open', 'max_connections', 'super_seeder',
|
|
|
652 |
'ipv6_binds_v4', 'double_check', 'triple_check', 'lock_files', 'lock_while_reading',
|
|
|
653 |
'expire_cache_data']:
|
|
|
654 |
self.advancedConfig[key] = self.config[key]
|
|
|
655 |
|
|
|
656 |
if (self.advancedMenuBox is not None):
|
|
|
657 |
try:
|
|
|
658 |
self.advancedMenuBox.Close ()
|
|
|
659 |
except wxPyDeadObjectError, e:
|
|
|
660 |
self.advancedMenuBox = None
|
|
|
661 |
|
|
|
662 |
self.advancedMenuBox = wxFrame(None, -1, 'BitTorrent Advanced Preferences', size = (1,1),
|
|
|
663 |
style = wxDEFAULT_FRAME_STYLE|wxFULL_REPAINT_ON_RESIZE)
|
|
|
664 |
if (sys.platform == 'win32'):
|
|
|
665 |
self.advancedMenuBox.SetIcon(self.icon)
|
|
|
666 |
|
|
|
667 |
panel = wxPanel(self.advancedMenuBox, -1)
|
|
|
668 |
# self.panel = panel
|
|
|
669 |
|
|
|
670 |
def StaticText(text, font = self.FONT, underline = False, color = None, panel = panel):
|
|
|
671 |
x = wxStaticText(panel, -1, text, style = wxALIGN_LEFT)
|
|
|
672 |
x.SetFont(wxFont(font, wxDEFAULT, wxNORMAL, wxNORMAL, underline))
|
|
|
673 |
if color is not None:
|
|
|
674 |
x.SetForegroundColour(color)
|
|
|
675 |
return x
|
|
|
676 |
|
|
|
677 |
colsizer = wxFlexGridSizer(cols = 1, hgap = 13, vgap = 13)
|
|
|
678 |
warningtext = StaticText('CHANGE THESE SETTINGS AT YOUR OWN RISK', self.FONT+4, True, 'Red')
|
|
|
679 |
colsizer.Add(warningtext, 1, wxALIGN_CENTER)
|
|
|
680 |
|
|
|
681 |
self.ip_data = wxTextCtrl(parent = panel, id = -1,
|
|
|
682 |
value = self.advancedConfig['ip'],
|
|
|
683 |
size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
|
|
|
684 |
self.ip_data.SetFont(self.default_font)
|
|
|
685 |
|
|
|
686 |
self.bind_data = wxTextCtrl(parent = panel, id = -1,
|
|
|
687 |
value = self.advancedConfig['bind'],
|
|
|
688 |
size = (self.FONT*13, int(self.FONT*2.2)), style = wxTE_PROCESS_TAB)
|
|
|
689 |
self.bind_data.SetFont(self.default_font)
|
|
|
690 |
|
|
|
691 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
692 |
self.ipv6bindsv4_data=wxChoice(panel, -1,
|
|
|
693 |
choices = ['separate sockets', 'single socket'])
|
|
|
694 |
self.ipv6bindsv4_data.SetFont(self.default_font)
|
|
|
695 |
self.ipv6bindsv4_data.SetSelection(self.advancedConfig['ipv6_binds_v4'])
|
|
|
696 |
|
|
|
697 |
self.minpeers_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
|
|
|
698 |
self.minpeers_data.SetFont(self.default_font)
|
|
|
699 |
self.minpeers_data.SetRange(10,100)
|
|
|
700 |
self.minpeers_data.SetValue(self.advancedConfig['min_peers'])
|
|
|
701 |
# max_initiate = 2*minpeers
|
|
|
702 |
|
|
|
703 |
self.displayinterval_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7, -1))
|
|
|
704 |
self.displayinterval_data.SetFont(self.default_font)
|
|
|
705 |
self.displayinterval_data.SetRange(100,2000)
|
|
|
706 |
self.displayinterval_data.SetValue(int(self.advancedConfig['display_interval']*1000))
|
|
|
707 |
|
|
|
708 |
self.alloctype_data=wxChoice(panel, -1,
|
|
|
709 |
choices = ['normal', 'background', 'pre-allocate', 'sparse'])
|
|
|
710 |
self.alloctype_data.SetFont(self.default_font)
|
|
|
711 |
self.alloctype_data.SetStringSelection(self.advancedConfig['alloc_type'])
|
|
|
712 |
|
|
|
713 |
self.allocrate_data = wxSpinCtrl(panel, -1, '', (-1,-1), (self.FONT*7,-1))
|
|
|
714 |
self.allocrate_data.SetFont(self.default_font)
|
|
|
715 |
self.allocrate_data.SetRange(1,100)
|
|
|
716 |
self.allocrate_data.SetValue(int(self.advancedConfig['alloc_rate']))
|
|
|
717 |
|
|
|
718 |
self.locking_data=wxChoice(panel, -1,
|
|
|
719 |
choices = ['no locking', 'lock while writing', 'lock always'])
|
|
|
720 |
self.locking_data.SetFont(self.default_font)
|
|
|
721 |
if self.advancedConfig['lock_files']:
|
|
|
722 |
if self.advancedConfig['lock_while_reading']:
|
|
|
723 |
self.locking_data.SetSelection(2)
|
|
|
724 |
else:
|
|
|
725 |
self.locking_data.SetSelection(1)
|
|
|
726 |
else:
|
|
|
727 |
self.locking_data.SetSelection(0)
|
|
|
728 |
|
|
|
729 |
self.doublecheck_data=wxChoice(panel, -1,
|
|
|
730 |
choices = ['no extra checking', 'double-check', 'triple-check'])
|
|
|
731 |
self.doublecheck_data.SetFont(self.default_font)
|
|
|
732 |
if self.advancedConfig['double_check']:
|
|
|
733 |
if self.advancedConfig['triple_check']:
|
|
|
734 |
self.doublecheck_data.SetSelection(2)
|
|
|
735 |
else:
|
|
|
736 |
self.doublecheck_data.SetSelection(1)
|
|
|
737 |
else:
|
|
|
738 |
self.doublecheck_data.SetSelection(0)
|
|
|
739 |
|
|
|
740 |
self.maxfilesopen_choices = ['50', '100', '200', 'no limit ']
|
|
|
741 |
self.maxfilesopen_data=wxChoice(panel, -1, choices = self.maxfilesopen_choices)
|
|
|
742 |
self.maxfilesopen_data.SetFont(self.default_font)
|
|
|
743 |
setval = self.advancedConfig['max_files_open']
|
|
|
744 |
if setval == 0:
|
|
|
745 |
setval = 'no limit '
|
|
|
746 |
else:
|
|
|
747 |
setval = str(setval)
|
|
|
748 |
if not setval in self.maxfilesopen_choices:
|
|
|
749 |
setval = self.maxfilesopen_choices[0]
|
|
|
750 |
self.maxfilesopen_data.SetStringSelection(setval)
|
|
|
751 |
|
|
|
752 |
self.maxconnections_choices = ['no limit ', '20', '30', '40', '50', '60', '100', '200']
|
|
|
753 |
self.maxconnections_data=wxChoice(panel, -1, choices = self.maxconnections_choices)
|
|
|
754 |
self.maxconnections_data.SetFont(self.default_font)
|
|
|
755 |
setval = self.advancedConfig['max_connections']
|
|
|
756 |
if setval == 0:
|
|
|
757 |
setval = 'no limit '
|
|
|
758 |
else:
|
|
|
759 |
setval = str(setval)
|
|
|
760 |
if not setval in self.maxconnections_choices:
|
|
|
761 |
setval = self.maxconnections_choices[0]
|
|
|
762 |
self.maxconnections_data.SetStringSelection(setval)
|
|
|
763 |
|
|
|
764 |
self.superseeder_data=wxChoice(panel, -1,
|
|
|
765 |
choices = ['normal', 'super-seed'])
|
|
|
766 |
self.superseeder_data.SetFont(self.default_font)
|
|
|
767 |
self.superseeder_data.SetSelection(self.advancedConfig['super_seeder'])
|
|
|
768 |
|
|
|
769 |
self.expirecache_choices = ['never ', '3', '5', '7', '10', '15', '30', '60', '90']
|
|
|
770 |
self.expirecache_data=wxChoice(panel, -1, choices = self.expirecache_choices)
|
|
|
771 |
setval = self.advancedConfig['expire_cache_data']
|
|
|
772 |
if setval == 0:
|
|
|
773 |
setval = 'never '
|
|
|
774 |
else:
|
|
|
775 |
setval = str(setval)
|
|
|
776 |
if not setval in self.expirecache_choices:
|
|
|
777 |
setval = self.expirecache_choices[0]
|
|
|
778 |
self.expirecache_data.SetFont(self.default_font)
|
|
|
779 |
self.expirecache_data.SetStringSelection(setval)
|
|
|
780 |
|
|
|
781 |
|
|
|
782 |
twocolsizer = wxFlexGridSizer(cols = 2, hgap = 20)
|
|
|
783 |
datasizer = wxFlexGridSizer(cols = 2, vgap = 2)
|
|
|
784 |
datasizer.Add(StaticText('Local IP: '), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
785 |
datasizer.Add(self.ip_data)
|
|
|
786 |
datasizer.Add(StaticText('IP to bind to: '), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
787 |
datasizer.Add(self.bind_data)
|
|
|
788 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
789 |
datasizer.Add(StaticText('IPv6 socket handling: '), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
790 |
datasizer.Add(self.ipv6bindsv4_data)
|
|
|
791 |
datasizer.Add(StaticText('Minimum number of peers: '), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
792 |
datasizer.Add(self.minpeers_data)
|
|
|
793 |
datasizer.Add(StaticText('Display interval (ms): '), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
794 |
datasizer.Add(self.displayinterval_data)
|
|
|
795 |
datasizer.Add(StaticText('Disk allocation type:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
796 |
datasizer.Add(self.alloctype_data)
|
|
|
797 |
datasizer.Add(StaticText('Allocation rate (MiB/s):'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
798 |
datasizer.Add(self.allocrate_data)
|
|
|
799 |
datasizer.Add(StaticText('File locking:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
800 |
datasizer.Add(self.locking_data)
|
|
|
801 |
datasizer.Add(StaticText('Extra data checking:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
802 |
datasizer.Add(self.doublecheck_data)
|
|
|
803 |
datasizer.Add(StaticText('Max files open:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
804 |
datasizer.Add(self.maxfilesopen_data)
|
|
|
805 |
datasizer.Add(StaticText('Max peer connections:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
806 |
datasizer.Add(self.maxconnections_data)
|
|
|
807 |
datasizer.Add(StaticText('Default seeding mode:'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
808 |
datasizer.Add(self.superseeder_data)
|
|
|
809 |
datasizer.Add(StaticText('Expire resume data(days):'), 1, wxALIGN_CENTER_VERTICAL)
|
|
|
810 |
datasizer.Add(self.expirecache_data)
|
|
|
811 |
|
|
|
812 |
twocolsizer.Add(datasizer)
|
|
|
813 |
|
|
|
814 |
infosizer = wxFlexGridSizer(cols = 1)
|
|
|
815 |
self.hinttext = StaticText('', self.FONT, False, 'Blue')
|
|
|
816 |
infosizer.Add(self.hinttext, 1, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL)
|
|
|
817 |
infosizer.SetMinSize((180,100))
|
|
|
818 |
twocolsizer.Add(infosizer, 1, wxEXPAND)
|
|
|
819 |
|
|
|
820 |
colsizer.Add(twocolsizer)
|
|
|
821 |
|
|
|
822 |
savesizer = wxGridSizer(cols = 3, hgap = 20)
|
|
|
823 |
okButton = wxButton(panel, -1, 'OK')
|
|
|
824 |
# okButton.SetFont(self.default_font)
|
|
|
825 |
savesizer.Add(okButton, 0, wxALIGN_CENTER)
|
|
|
826 |
|
|
|
827 |
cancelButton = wxButton(panel, -1, 'Cancel')
|
|
|
828 |
# cancelButton.SetFont(self.default_font)
|
|
|
829 |
savesizer.Add(cancelButton, 0, wxALIGN_CENTER)
|
|
|
830 |
|
|
|
831 |
defaultsButton = wxButton(panel, -1, 'Revert to Defaults')
|
|
|
832 |
# defaultsButton.SetFont(self.default_font)
|
|
|
833 |
savesizer.Add(defaultsButton, 0, wxALIGN_CENTER)
|
|
|
834 |
colsizer.Add(savesizer, 1, wxALIGN_CENTER)
|
|
|
835 |
|
|
|
836 |
resizewarningtext=StaticText('None of these settings will take effect until the next time you start BitTorrent', self.FONT-2)
|
|
|
837 |
colsizer.Add(resizewarningtext, 1, wxALIGN_CENTER)
|
|
|
838 |
|
|
|
839 |
border = wxBoxSizer(wxHORIZONTAL)
|
|
|
840 |
border.Add(colsizer, 1, wxEXPAND | wxALL, 4)
|
|
|
841 |
|
|
|
842 |
panel.SetSizer(border)
|
|
|
843 |
panel.SetAutoLayout(True)
|
|
|
844 |
|
|
|
845 |
def setDefaults(evt, self = self):
|
|
|
846 |
try:
|
|
|
847 |
self.ip_data.SetValue(self.defaults['ip'])
|
|
|
848 |
self.bind_data.SetValue(self.defaults['bind'])
|
|
|
849 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
850 |
self.ipv6bindsv4_data.SetSelection(self.defaults['ipv6_binds_v4'])
|
|
|
851 |
self.minpeers_data.SetValue(self.defaults['min_peers'])
|
|
|
852 |
self.displayinterval_data.SetValue(int(self.defaults['display_interval']*1000))
|
|
|
853 |
self.alloctype_data.SetStringSelection(self.defaults['alloc_type'])
|
|
|
854 |
self.allocrate_data.SetValue(int(self.defaults['alloc_rate']))
|
|
|
855 |
if self.defaults['lock_files']:
|
|
|
856 |
if self.defaults['lock_while_reading']:
|
|
|
857 |
self.locking_data.SetSelection(2)
|
|
|
858 |
else:
|
|
|
859 |
self.locking_data.SetSelection(1)
|
|
|
860 |
else:
|
|
|
861 |
self.locking_data.SetSelection(0)
|
|
|
862 |
if self.defaults['double_check']:
|
|
|
863 |
if self.defaults['triple_check']:
|
|
|
864 |
self.doublecheck_data.SetSelection(2)
|
|
|
865 |
else:
|
|
|
866 |
self.doublecheck_data.SetSelection(1)
|
|
|
867 |
else:
|
|
|
868 |
self.doublecheck_data.SetSelection(0)
|
|
|
869 |
setval = self.defaults['max_files_open']
|
|
|
870 |
if setval == 0:
|
|
|
871 |
setval = 'no limit '
|
|
|
872 |
else:
|
|
|
873 |
setval = str(setval)
|
|
|
874 |
if not setval in self.maxfilesopen_choices:
|
|
|
875 |
setval = self.maxfilesopen_choices[0]
|
|
|
876 |
self.maxfilesopen_data.SetStringSelection(setval)
|
|
|
877 |
setval = self.defaults['max_connections']
|
|
|
878 |
if setval == 0:
|
|
|
879 |
setval = 'no limit '
|
|
|
880 |
else:
|
|
|
881 |
setval = str(setval)
|
|
|
882 |
if not setval in self.maxconnections_choices:
|
|
|
883 |
setval = self.maxconnections_choices[0]
|
|
|
884 |
self.maxconnections_data.SetStringSelection(setval)
|
|
|
885 |
self.superseeder_data.SetSelection(int(self.defaults['super_seeder']))
|
|
|
886 |
setval = self.defaults['expire_cache_data']
|
|
|
887 |
if setval == 0:
|
|
|
888 |
setval = 'never '
|
|
|
889 |
else:
|
|
|
890 |
setval = str(setval)
|
|
|
891 |
if not setval in self.expirecache_choices:
|
|
|
892 |
setval = self.expirecache_choices[0]
|
|
|
893 |
self.expirecache_data.SetStringSelection(setval)
|
|
|
894 |
except:
|
|
|
895 |
self.parent.exception()
|
|
|
896 |
|
|
|
897 |
def saveConfigs(evt, self = self):
|
|
|
898 |
try:
|
|
|
899 |
self.advancedConfig['ip'] = self.ip_data.GetValue()
|
|
|
900 |
self.advancedConfig['bind'] = self.bind_data.GetValue()
|
|
|
901 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
902 |
self.advancedConfig['ipv6_binds_v4'] = self.ipv6bindsv4_data.GetSelection()
|
|
|
903 |
self.advancedConfig['min_peers'] = self.minpeers_data.GetValue()
|
|
|
904 |
self.advancedConfig['display_interval'] = float(self.displayinterval_data.GetValue())/1000
|
|
|
905 |
self.advancedConfig['alloc_type'] = self.alloctype_data.GetStringSelection()
|
|
|
906 |
self.advancedConfig['alloc_rate'] = float(self.allocrate_data.GetValue())
|
|
|
907 |
self.advancedConfig['lock_files'] = int(self.locking_data.GetSelection() >= 1)
|
|
|
908 |
self.advancedConfig['lock_while_reading'] = int(self.locking_data.GetSelection() > 1)
|
|
|
909 |
self.advancedConfig['double_check'] = int(self.doublecheck_data.GetSelection() >= 1)
|
|
|
910 |
self.advancedConfig['triple_check'] = int(self.doublecheck_data.GetSelection() > 1)
|
|
|
911 |
try:
|
|
|
912 |
self.advancedConfig['max_files_open'] = int(self.maxfilesopen_data.GetStringSelection())
|
|
|
913 |
except: # if it ain't a number, it must be "no limit"
|
|
|
914 |
self.advancedConfig['max_files_open'] = 0
|
|
|
915 |
try:
|
|
|
916 |
self.advancedConfig['max_connections'] = int(self.maxconnections_data.GetStringSelection())
|
|
|
917 |
self.advancedConfig['max_initiate'] = min(
|
|
|
918 |
2*self.advancedConfig['min_peers'], self.advancedConfig['max_connections'])
|
|
|
919 |
except: # if it ain't a number, it must be "no limit"
|
|
|
920 |
self.advancedConfig['max_connections'] = 0
|
|
|
921 |
self.advancedConfig['max_initiate'] = 2*self.advancedConfig['min_peers']
|
|
|
922 |
self.advancedConfig['super_seeder']=int(self.superseeder_data.GetSelection())
|
|
|
923 |
try:
|
|
|
924 |
self.advancedConfig['expire_cache_data'] = int(self.expirecache_data.GetStringSelection())
|
|
|
925 |
except:
|
|
|
926 |
self.advancedConfig['expire_cache_data'] = 0
|
|
|
927 |
self.advancedMenuBox.Close()
|
|
|
928 |
except:
|
|
|
929 |
self.parent.exception()
|
|
|
930 |
|
|
|
931 |
def cancelConfigs(evt, self = self):
|
|
|
932 |
self.advancedMenuBox.Close()
|
|
|
933 |
|
|
|
934 |
def ip_hint(evt, self = self):
|
|
|
935 |
self.hinttext.SetLabel('\n\n\nThe IP reported to the tracker.\n' +
|
|
|
936 |
'unless the tracker is on the\n' +
|
|
|
937 |
'same intranet as this client,\n' +
|
|
|
938 |
'the tracker will autodetect the\n' +
|
|
|
939 |
"client's IP and ignore this\n" +
|
|
|
940 |
"value.")
|
|
|
941 |
|
|
|
942 |
def bind_hint(evt, self = self):
|
|
|
943 |
self.hinttext.SetLabel('\n\n\nThe IP the client will bind to.\n' +
|
|
|
944 |
'Only useful if your machine is\n' +
|
|
|
945 |
'directly handling multiple IPs.\n' +
|
|
|
946 |
"If you don't know what this is,\n" +
|
|
|
947 |
"leave it blank.")
|
|
|
948 |
|
|
|
949 |
def ipv6bindsv4_hint(evt, self = self):
|
|
|
950 |
self.hinttext.SetLabel('\n\n\nCertain operating systems will\n' +
|
|
|
951 |
'open IPv4 protocol connections on\n' +
|
|
|
952 |
'an IPv6 socket; others require you\n' +
|
|
|
953 |
"to open two sockets on the same\n" +
|
|
|
954 |
"port, one IPv4 and one IPv6.")
|
|
|
955 |
|
|
|
956 |
def minpeers_hint(evt, self = self):
|
|
|
957 |
self.hinttext.SetLabel('\n\n\nThe minimum number of peers the\n' +
|
|
|
958 |
'client tries to stay connected\n' +
|
|
|
959 |
'with. Do not set this higher\n' +
|
|
|
960 |
'unless you have a very fast\n' +
|
|
|
961 |
"connection and a lot of system\n" +
|
|
|
962 |
"resources.")
|
|
|
963 |
|
|
|
964 |
def displayinterval_hint(evt, self = self):
|
|
|
965 |
self.hinttext.SetLabel('\n\n\nHow often to update the\n' +
|
|
|
966 |
'graphical display, in 1/1000s\n' +
|
|
|
967 |
'of a second. Setting this too low\n' +
|
|
|
968 |
"will strain your computer's\n" +
|
|
|
969 |
"processor and video access.")
|
|
|
970 |
|
|
|
971 |
def alloctype_hint(evt, self = self):
|
|
|
972 |
self.hinttext.SetLabel('\n\nHow to allocate disk space.\n' +
|
|
|
973 |
'normal allocates space as data is\n' +
|
|
|
974 |
'received, background also adds\n' +
|
|
|
975 |
"space in the background, pre-\n" +
|
|
|
976 |
"allocate reserves up front, and\n" +
|
|
|
977 |
'sparse is only for filesystems\n' +
|
|
|
978 |
'that support it by default.')
|
|
|
979 |
|
|
|
980 |
def allocrate_hint(evt, self = self):
|
|
|
981 |
self.hinttext.SetLabel('\n\n\nAt what rate to allocate disk\n' +
|
|
|
982 |
'space when allocating in the\n' +
|
|
|
983 |
'background. Set this too high on a\n' +
|
|
|
984 |
"slow filesystem and your download\n" +
|
|
|
985 |
"will slow to a crawl.")
|
|
|
986 |
|
|
|
987 |
def locking_hint(evt, self = self):
|
|
|
988 |
self.hinttext.SetLabel('\n\n\n\nFile locking prevents other\n' +
|
|
|
989 |
'programs (including other instances\n' +
|
|
|
990 |
'of BitTorrent) from accessing files\n' +
|
|
|
991 |
"you are downloading.")
|
|
|
992 |
|
|
|
993 |
def doublecheck_hint(evt, self = self):
|
|
|
994 |
self.hinttext.SetLabel('\n\n\nHow much extra checking to do\n' +
|
|
|
995 |
'making sure no data is corrupted.\n' +
|
|
|
996 |
'Double-check mode uses more CPU,\n' +
|
|
|
997 |
"while triple-check mode increases\n" +
|
|
|
998 |
"disk accesses.")
|
|
|
999 |
|
|
|
1000 |
def maxfilesopen_hint(evt, self = self):
|
|
|
1001 |
self.hinttext.SetLabel('\n\n\nThe maximum number of files to\n' +
|
|
|
1002 |
'keep open at the same time. Zero\n' +
|
|
|
1003 |
'means no limit. Please note that\n' +
|
|
|
1004 |
"if this option is in effect,\n" +
|
|
|
1005 |
"files are not guaranteed to be\n" +
|
|
|
1006 |
"locked.")
|
|
|
1007 |
|
|
|
1008 |
def maxconnections_hint(evt, self = self):
|
|
|
1009 |
self.hinttext.SetLabel('\n\nSome operating systems, most\n' +
|
|
|
1010 |
'notably Windows 9x/ME combined\n' +
|
|
|
1011 |
'with certain network drivers,\n' +
|
|
|
1012 |
"cannot handle more than a certain\n" +
|
|
|
1013 |
"number of open ports. If the\n" +
|
|
|
1014 |
"client freezes, try setting this\n" +
|
|
|
1015 |
"to 60 or below.")
|
|
|
1016 |
|
|
|
1017 |
def superseeder_hint(evt, self = self):
|
|
|
1018 |
self.hinttext.SetLabel('\n\nThe "super-seed" method allows\n' +
|
|
|
1019 |
'a single source to more efficiently\n' +
|
|
|
1020 |
'seed a large torrent, but is not\n' +
|
|
|
1021 |
"necessary in a well-seeded torrent,\n" +
|
|
|
1022 |
"and causes problems with statistics.\n" +
|
|
|
1023 |
"Unless you routinely seed torrents\n" +
|
|
|
1024 |
"you can enable this by selecting\n" +
|
|
|
1025 |
'"SUPER-SEED" for connection type.\n' +
|
|
|
1026 |
'(once enabled it does not turn off.)')
|
|
|
1027 |
|
|
|
1028 |
def expirecache_hint(evt, self = self):
|
|
|
1029 |
self.hinttext.SetLabel('\n\nThe client stores temporary data\n' +
|
|
|
1030 |
'in order to handle downloading only\n' +
|
|
|
1031 |
'specific files from the torrent and\n' +
|
|
|
1032 |
"so it can resume downloads more\n" +
|
|
|
1033 |
"quickly. This sets how long the\n" +
|
|
|
1034 |
"client will keep this data before\n" +
|
|
|
1035 |
"deleting it to free disk space.")
|
|
|
1036 |
|
|
|
1037 |
EVT_BUTTON(self.advancedMenuBox, okButton.GetId(), saveConfigs)
|
|
|
1038 |
EVT_BUTTON(self.advancedMenuBox, cancelButton.GetId(), cancelConfigs)
|
|
|
1039 |
EVT_BUTTON(self.advancedMenuBox, defaultsButton.GetId(), setDefaults)
|
|
|
1040 |
EVT_ENTER_WINDOW(self.ip_data, ip_hint)
|
|
|
1041 |
EVT_ENTER_WINDOW(self.bind_data, bind_hint)
|
|
|
1042 |
if sys.version_info >= (2,3) and socket.has_ipv6:
|
|
|
1043 |
EVT_ENTER_WINDOW(self.ipv6bindsv4_data, ipv6bindsv4_hint)
|
|
|
1044 |
EVT_ENTER_WINDOW(self.minpeers_data, minpeers_hint)
|
|
|
1045 |
EVT_ENTER_WINDOW(self.displayinterval_data, displayinterval_hint)
|
|
|
1046 |
EVT_ENTER_WINDOW(self.alloctype_data, alloctype_hint)
|
|
|
1047 |
EVT_ENTER_WINDOW(self.allocrate_data, allocrate_hint)
|
|
|
1048 |
EVT_ENTER_WINDOW(self.locking_data, locking_hint)
|
|
|
1049 |
EVT_ENTER_WINDOW(self.doublecheck_data, doublecheck_hint)
|
|
|
1050 |
EVT_ENTER_WINDOW(self.maxfilesopen_data, maxfilesopen_hint)
|
|
|
1051 |
EVT_ENTER_WINDOW(self.maxconnections_data, maxconnections_hint)
|
|
|
1052 |
EVT_ENTER_WINDOW(self.superseeder_data, superseeder_hint)
|
|
|
1053 |
EVT_ENTER_WINDOW(self.expirecache_data, expirecache_hint)
|
|
|
1054 |
|
|
|
1055 |
self.advancedMenuBox.Show ()
|
|
|
1056 |
border.Fit(panel)
|
|
|
1057 |
self.advancedMenuBox.Fit()
|
|
|
1058 |
except:
|
|
|
1059 |
self.parent.exception()
|
|
|
1060 |
|
|
|
1061 |
|
|
|
1062 |
def CloseAdvanced(self):
|
|
|
1063 |
if self.advancedMenuBox is not None:
|
|
|
1064 |
try:
|
|
|
1065 |
self.advancedMenuBox.Close()
|
|
|
1066 |
except wxPyDeadObjectError, e:
|
|
|
1067 |
self.advancedMenuBox = None
|
|
|
1068 |
|