You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

717 lines
24 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
8 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3. """Youtubedlg module responsible for the options window. """
  4. from __future__ import unicode_literals
  5. import os
  6. import gettext
  7. import wx
  8. from .version import __version__
  9. from .info import (
  10. __descriptionfull__,
  11. __licensefull__,
  12. __projecturl__,
  13. __appname__,
  14. __author__
  15. )
  16. from .utils import (
  17. TwoWayOrderedDict as twodict,
  18. os_path_exists,
  19. get_icon_file
  20. )
  21. #TODO Set up load-save methods
  22. #TODO Adjust layout
  23. #TODO Set frame's min size
  24. #TODO Add labels to gettext
  25. class OptionsFrame(wx.Frame):
  26. """Youtubedlg options frame class.
  27. Args:
  28. parent (mainframe.MainFrame): Parent class.
  29. """
  30. FRAME_TITLE = _("Options")
  31. def __init__(self, parent):
  32. wx.Frame.__init__(self, parent, title=self.FRAME_TITLE, size=parent.opt_manager.options["opts_win_size"])
  33. self.opt_manager = parent.opt_manager
  34. self.log_manager = parent.log_manager
  35. self.app_icon = None
  36. # Set the app icon
  37. app_icon_path = get_icon_file()
  38. if app_icon_path is not None:
  39. self.app_icon = wx.Icon(app_icon_path, wx.BITMAP_TYPE_PNG)
  40. self.SetIcon(self.app_icon)
  41. self._was_shown = False
  42. # Create options frame basic components
  43. self.panel = wx.Panel(self)
  44. self.notebook = wx.Notebook(self.panel)
  45. self.separator_line = wx.StaticLine(self.panel)
  46. self.reset_button = wx.Button(self.panel, label="Reset")
  47. self.close_button = wx.Button(self.panel, label="Close")
  48. # Create tabs
  49. tab_args = (self, self.notebook)
  50. self.tabs = (
  51. (GeneralTab(*tab_args), "General"),
  52. (FormatsTab(*tab_args), "Formats"),
  53. (DownloadsTab(*tab_args), "Downloads"),
  54. (AdvancedTab(*tab_args), "Advanced"),
  55. (ExtraTab(*tab_args), "Extra")
  56. )
  57. # Add tabs on notebook
  58. for tab, label in self.tabs:
  59. self.notebook.AddPage(tab, label)
  60. # Bind events
  61. self.Bind(wx.EVT_BUTTON, self._on_reset, self.reset_button)
  62. self.Bind(wx.EVT_BUTTON, self._on_close, self.close_button)
  63. self.Bind(wx.EVT_CLOSE, self._on_close)
  64. self._set_layout()
  65. self.load_all_options()
  66. def _set_layout(self):
  67. main_sizer = wx.BoxSizer(wx.VERTICAL)
  68. main_sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, border=5)
  69. main_sizer.Add(self.separator_line, 0, wx.EXPAND)
  70. buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
  71. buttons_sizer.Add(self.reset_button)
  72. buttons_sizer.Add(self.close_button)
  73. main_sizer.Add(buttons_sizer, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
  74. self.panel.SetSizer(main_sizer)
  75. def _on_close(self, event):
  76. """Event handler for wx.EVT_CLOSE event."""
  77. self.save_all_options()
  78. self.Hide()
  79. def _on_reset(self, event):
  80. """Event handler for the reset button wx.EVT_BUTTON event."""
  81. self.reset()
  82. def reset(self):
  83. """Reset the default options."""
  84. self.opt_manager.load_default()
  85. self.load_all_options()
  86. def load_all_options(self):
  87. """Load all the options on each tab."""
  88. for tab, _ in self.tabs:
  89. tab.load_options()
  90. def save_all_options(self):
  91. """Save all the options from all the tabs back to the OptionsManager."""
  92. for tab, _ in self.tabs:
  93. tab.save_options()
  94. def Show(self, *args, **kwargs):
  95. # CenterOnParent can't go to main frame's __init__ as main frame may change
  96. # own position and options frame won't be centered on main frame anymore.
  97. if not self._was_shown:
  98. self._was_shown = True
  99. self.CenterOnParent()
  100. return wx.Frame.Show(self, *args, **kwargs)
  101. class TabPanel(wx.Panel):
  102. """Main tab class from which each tab inherits.
  103. Args:
  104. parent (OptionsFrame): The parent of all tabs.
  105. notebook (wx.Notebook): The container for each tab.
  106. Notes:
  107. In order to use a different size you must overwrite the below *_SIZE
  108. attributes on the corresponding child object.
  109. """
  110. CHECKBOX_SIZE = (-1, -1)
  111. if os.name == "nt":
  112. # Make checkboxes look the same on Windows
  113. CHECKBOX_SIZE = (-1, 25)
  114. BUTTONS_SIZE = (-1, -1)
  115. TEXTCTRL_SIZE = (-1, -1)
  116. SPINCTRL_SIZE = (70, -1)
  117. CHECKLISTBOX_MAX_SIZE = (-1, 120)
  118. def __init__(self, parent, notebook):
  119. wx.Panel.__init__(self, notebook)
  120. self.opt_manager = parent.opt_manager
  121. self.log_manager = parent.log_manager
  122. self.app_icon = parent.app_icon
  123. self.reset_handler = parent.reset
  124. # Shortcut methods below
  125. def crt_button(self, label, event_handler=None):
  126. button = wx.Button(self, label=label, size=self.BUTTONS_SIZE)
  127. if event_handler is not None:
  128. button.Bind(wx.EVT_BUTTON, event_handler)
  129. return button
  130. def crt_checkbox(self, label, event_handler=None):
  131. checkbox = wx.CheckBox(self, label=label, size=self.CHECKBOX_SIZE)
  132. if event_handler is not None:
  133. checkbox.Bind(wx.EVT_CHECKBOX, event_handler)
  134. return checkbox
  135. def crt_textctrl(self, style=None):
  136. if style is None:
  137. textctrl = wx.TextCtrl(self, size=self.TEXTCTRL_SIZE)
  138. else:
  139. textctrl = wx.TextCtrl(self, size=self.TEXTCTRL_SIZE, style=style)
  140. return textctrl
  141. def crt_combobox(self, choices, size=(-1, -1), event_handler=None):
  142. combobox = wx.ComboBox(self, choices=choices, size=size, style=wx.CB_READONLY)
  143. if event_handler is not None:
  144. combobox.Bind(wx.EVT_COMBOBOX, event_handler)
  145. return combobox
  146. def crt_spinctrl(self, spin_range=(0, 9999)):
  147. spinctrl = wx.SpinCtrl(self, size=self.SPINCTRL_SIZE)
  148. spinctrl.SetRange(*spin_range)
  149. return spinctrl
  150. def crt_statictext(self, label):
  151. return wx.StaticText(self, wx.ID_ANY, label)
  152. def crt_staticbox(self, label):
  153. return wx.StaticBox(self, wx.ID_ANY, label)
  154. def crt_checklistbox(self, choices, style=None):
  155. if style is None:
  156. checklistbox = wx.CheckListBox(self, choices=choices)
  157. else:
  158. checklistbox = wx.CheckListBox(self, choices=choices, style=style)
  159. checklistbox.SetMaxSize(self.CHECKLISTBOX_MAX_SIZE)
  160. return checklistbox
  161. class GeneralTab(TabPanel):
  162. LOCALE_NAMES = twodict([
  163. ('ar_AR', 'Arabic'),
  164. ('cs_CZ', 'Czech'),
  165. ('en_US', 'English'),
  166. ('fr_FR', 'French'),
  167. ('de_DE', 'German'),
  168. ('it_IT', 'Italian'),
  169. ('he_IS', 'Hebrew'),
  170. ('hu_HU', 'Hungarian'),
  171. ('pt_BR', 'Portuguese'),
  172. ('ru_RU', 'Russian'),
  173. ('es_ES', 'Spanish'),
  174. ('es_MX', 'Mexican Spanish'),
  175. ('tr_TR', 'Turkish')
  176. ])
  177. # TODO Add support on parsers.py
  178. OUTPUT_FORMATS = [
  179. "Title",
  180. "Title + Quality",
  181. "Title + ID",
  182. "Title + ID + Quality",
  183. "Custom"
  184. ]
  185. def __init__(self, *args, **kwargs):
  186. super(GeneralTab, self).__init__(*args, **kwargs)
  187. self.language_label = self.crt_statictext("Language")
  188. self.language_combobox = self.crt_combobox(self.LOCALE_NAMES.values())
  189. self.filename_format_label = self.crt_statictext("Filename format")
  190. self.filename_format_combobox = self.crt_combobox(self.OUTPUT_FORMATS)
  191. self.filename_custom_format = self.crt_textctrl()
  192. self.filename_opts_label = self.crt_statictext("Filename options")
  193. self.filename_ascii_checkbox = self.crt_checkbox("Restrict filenames to ASCII")
  194. self.more_opts_label = self.crt_statictext("More options")
  195. self.confirm_exit_checkbox = self.crt_checkbox("Confirm on exit")
  196. self.shutdown_checkbox = self.crt_checkbox("Shutdown")
  197. self.sudo_textctrl = self.crt_textctrl(wx.TE_PASSWORD)
  198. self._set_layout()
  199. def _set_layout(self):
  200. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  201. vertical_sizer = wx.BoxSizer(wx.VERTICAL)
  202. vertical_sizer.Add(self.language_label)
  203. vertical_sizer.Add(self.language_combobox, flag=wx.EXPAND | wx.ALL, border=5)
  204. vertical_sizer.Add(self.filename_format_label)
  205. vertical_sizer.Add(self.filename_format_combobox, flag=wx.EXPAND | wx.ALL, border=5)
  206. vertical_sizer.Add(self.filename_custom_format, flag=wx.EXPAND | wx.ALL, border=5)
  207. vertical_sizer.Add(self.filename_opts_label)
  208. vertical_sizer.Add(self.filename_ascii_checkbox, flag=wx.ALL, border=5)
  209. vertical_sizer.Add(self.more_opts_label)
  210. vertical_sizer.Add(self.confirm_exit_checkbox, flag=wx.ALL, border=5)
  211. shutdown_sizer = wx.BoxSizer(wx.HORIZONTAL)
  212. shutdown_sizer.Add(self.shutdown_checkbox)
  213. shutdown_sizer.AddSpacer((-1, -1), 1)
  214. shutdown_sizer.Add(self.sudo_textctrl, 1)
  215. vertical_sizer.Add(shutdown_sizer, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)
  216. main_sizer.Add(vertical_sizer, 1, wx.EXPAND | wx.ALL, border=5)
  217. self.SetSizer(main_sizer)
  218. def load_options(self):
  219. pass
  220. def save_options(self):
  221. pass
  222. class FormatsTab(TabPanel):
  223. AUDIO_QUALITY = twodict([("0", _("high")), ("5", _("mid")), ("9", _("low"))])
  224. #TODO Move those to separate file
  225. AUDIO_FORMATS = ["mp3", "wav", "aac", "m4a", "vorbis", "opus"]
  226. def __init__(self, *args, **kwargs):
  227. super(FormatsTab, self).__init__(*args, **kwargs)
  228. self.video_formats_label = self.crt_statictext("Video formats")
  229. self.video_formats_checklistbox = self.crt_checklistbox([])
  230. self.audio_formats_label = self.crt_statictext("Audio formats")
  231. self.audio_formats_checklistbox = self.crt_checklistbox(self.AUDIO_FORMATS)
  232. self.post_proc_opts_label = self.crt_statictext("Post-Process options")
  233. self.keep_video_checkbox = self.crt_checkbox("Keep original video")
  234. self.audio_quality_label = self.crt_statictext("Audio quality")
  235. self.audio_quality_combobox = self.crt_combobox(self.AUDIO_QUALITY.values())
  236. self._set_layout()
  237. def _set_layout(self):
  238. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  239. vertical_sizer = wx.BoxSizer(wx.VERTICAL)
  240. vertical_sizer.Add(self.video_formats_label)
  241. vertical_sizer.Add(self.video_formats_checklistbox, 1, wx.EXPAND | wx.ALL, border=5)
  242. vertical_sizer.Add(self.audio_formats_label)
  243. vertical_sizer.Add(self.audio_formats_checklistbox, 1, wx.EXPAND | wx.ALL, border=5)
  244. vertical_sizer.Add(self.post_proc_opts_label)
  245. vertical_sizer.Add(self.keep_video_checkbox, flag=wx.ALL, border=5)
  246. audio_quality_sizer = wx.BoxSizer(wx.HORIZONTAL)
  247. audio_quality_sizer.Add(self.audio_quality_label, flag=wx.ALIGN_CENTER_VERTICAL)
  248. audio_quality_sizer.AddSpacer((20, -1))
  249. audio_quality_sizer.Add(self.audio_quality_combobox)
  250. vertical_sizer.Add(audio_quality_sizer, flag=wx.LEFT | wx.RIGHT, border=10)
  251. main_sizer.Add(vertical_sizer, 1, wx.EXPAND | wx.ALL, border=5)
  252. self.SetSizer(main_sizer)
  253. def load_options(self):
  254. pass
  255. def save_options(self):
  256. pass
  257. class DownloadsTab(TabPanel):
  258. SUBS_LANG = twodict([
  259. ("en", _("English")),
  260. ("gr", _("Greek")),
  261. ("pt", _("Portuguese")),
  262. ("fr", _("French")),
  263. ("it", _("Italian")),
  264. ("ru", _("Russian")),
  265. ("es", _("Spanish")),
  266. ("tr", _("Turkish")),
  267. ("de", _("German"))
  268. ])
  269. FILESIZES = twodict([
  270. ("", "Bytes"),
  271. ("k", "Kilobytes"),
  272. ("m", "Megabytes"),
  273. ("g", "Gigabytes"),
  274. ("t", "Terabytes"),
  275. ("p", "Petabytes"),
  276. ("e", "Exabytes"),
  277. ("z", "Zettabytes"),
  278. ("y", "Yottabytes")
  279. ])
  280. SUBS_CHOICES = [
  281. "None",
  282. "Automatic subtitles (YOUTUBE ONLY)",
  283. "All available subtitles",
  284. "Subtitles by language"
  285. ]
  286. def __init__(self, *args, **kwargs):
  287. super(DownloadsTab, self).__init__(*args, **kwargs)
  288. self.subtitles_label = self.crt_statictext("Subtitles")
  289. self.subtitles_combobox = self.crt_combobox(self.SUBS_CHOICES)
  290. self.subtitles_lang_listbox = self.crt_checklistbox(self.SUBS_LANG.values())
  291. self.subtitles_opts_label = self.crt_statictext("Subtitles options")
  292. self.embed_subs_checkbox = self.crt_checkbox("Embed subtitles into video file (mp4 ONLY)")
  293. self.playlist_box = self.crt_staticbox("Playlist")
  294. self.playlist_start_label = self.crt_statictext("Start")
  295. self.playlist_start_spinctrl = self.crt_spinctrl()
  296. self.playlist_stop_label = self.crt_statictext("Stop")
  297. self.playlist_stop_spinctrl = self.crt_spinctrl()
  298. self.playlist_max_label = self.crt_statictext("Max")
  299. self.playlist_max_spinctrl = self.crt_spinctrl()
  300. self.filesize_box = self.crt_staticbox("Filesize")
  301. self.filesize_min_label = self.crt_statictext("Min")
  302. self.filesize_min_spinctrl = self.crt_spinctrl()
  303. self.filesize_min_sizeunit_combobox = self.crt_combobox(self.FILESIZES.values())
  304. self.filesize_max_label = self.crt_statictext("Max")
  305. self.filesize_max_spinctrl = self.crt_spinctrl()
  306. self.filesize_max_sizeunit_combobox = self.crt_combobox(self.FILESIZES.values())
  307. self._set_layout()
  308. def _set_layout(self):
  309. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  310. vertical_sizer = wx.BoxSizer(wx.VERTICAL)
  311. vertical_sizer.Add(self.subtitles_label)
  312. vertical_sizer.Add(self.subtitles_combobox, flag=wx.EXPAND | wx.ALL, border=5)
  313. vertical_sizer.Add(self.subtitles_lang_listbox, 1, wx.EXPAND | wx.ALL, border=5)
  314. vertical_sizer.Add(self.subtitles_opts_label)
  315. vertical_sizer.Add(self.embed_subs_checkbox, flag=wx.ALL, border=5)
  316. plist_and_fsize_sizer = wx.BoxSizer(wx.HORIZONTAL)
  317. plist_and_fsize_sizer.Add(self._build_playlist_sizer(), 1, wx.EXPAND)
  318. plist_and_fsize_sizer.AddSpacer((10, -1))
  319. plist_and_fsize_sizer.Add(self._build_filesize_sizer(), 1, wx.EXPAND)
  320. vertical_sizer.Add(plist_and_fsize_sizer, 1, wx.EXPAND | wx.TOP, border=5)
  321. main_sizer.Add(vertical_sizer, 1, wx.EXPAND | wx.ALL, border=5)
  322. self.SetSizer(main_sizer)
  323. def _build_playlist_sizer(self):
  324. left_right_border = 80
  325. playlist_box_sizer = wx.StaticBoxSizer(self.playlist_box, wx.VERTICAL)
  326. playlist_box_sizer.AddSpacer((-1, 10))
  327. start_plist_sizer = wx.BoxSizer(wx.HORIZONTAL)
  328. start_plist_sizer.AddSpacer((left_right_border, -1))
  329. start_plist_sizer.Add(self.playlist_start_label, flag=wx.ALIGN_CENTER_VERTICAL)
  330. start_plist_sizer.AddSpacer((-1, -1), 1)
  331. start_plist_sizer.Add(self.playlist_start_spinctrl)
  332. start_plist_sizer.AddSpacer((left_right_border, -1))
  333. stop_plist_sizer = wx.BoxSizer(wx.HORIZONTAL)
  334. stop_plist_sizer.AddSpacer((left_right_border, -1))
  335. stop_plist_sizer.Add(self.playlist_stop_label, flag=wx.ALIGN_CENTER_VERTICAL)
  336. stop_plist_sizer.AddSpacer((-1, -1), 1)
  337. stop_plist_sizer.Add(self.playlist_stop_spinctrl)
  338. stop_plist_sizer.AddSpacer((left_right_border, -1))
  339. max_plist_sizer = wx.BoxSizer(wx.HORIZONTAL)
  340. max_plist_sizer.AddSpacer((left_right_border, -1))
  341. max_plist_sizer.Add(self.playlist_max_label, flag=wx.ALIGN_CENTER_VERTICAL)
  342. max_plist_sizer.AddSpacer((-1, -1), 1)
  343. max_plist_sizer.Add(self.playlist_max_spinctrl)
  344. max_plist_sizer.AddSpacer((left_right_border, -1))
  345. playlist_box_sizer.Add(start_plist_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  346. playlist_box_sizer.Add(stop_plist_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  347. playlist_box_sizer.Add(max_plist_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  348. return playlist_box_sizer
  349. def _build_filesize_sizer(self):
  350. left_right_border = 40
  351. filesize_box_sizer = wx.StaticBoxSizer(self.filesize_box, wx.VERTICAL)
  352. filesize_box_sizer.AddSpacer((-1, 10))
  353. max_filesize_sizer = wx.BoxSizer(wx.HORIZONTAL)
  354. max_filesize_sizer.AddSpacer((left_right_border, -1))
  355. max_filesize_sizer.Add(self.filesize_max_spinctrl)
  356. max_filesize_sizer.AddSpacer((-1, -1), 1)
  357. max_filesize_sizer.Add(self.filesize_max_sizeunit_combobox)
  358. max_filesize_sizer.AddSpacer((left_right_border, -1))
  359. min_filesize_sizer = wx.BoxSizer(wx.HORIZONTAL)
  360. min_filesize_sizer.AddSpacer((left_right_border, -1))
  361. min_filesize_sizer.Add(self.filesize_min_spinctrl)
  362. min_filesize_sizer.AddSpacer((-1, -1), 1)
  363. min_filesize_sizer.Add(self.filesize_min_sizeunit_combobox)
  364. min_filesize_sizer.AddSpacer((left_right_border, -1))
  365. filesize_box_sizer.Add(self.filesize_max_label, flag=wx.ALIGN_CENTER_HORIZONTAL)
  366. filesize_box_sizer.Add(max_filesize_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  367. filesize_box_sizer.Add(self.filesize_min_label, flag=wx.ALIGN_CENTER_HORIZONTAL)
  368. filesize_box_sizer.Add(min_filesize_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  369. return filesize_box_sizer
  370. def load_options(self):
  371. pass
  372. def save_options(self):
  373. pass
  374. class AdvancedTab(TabPanel):
  375. TEXTCTRL_SIZE = (250, -1)
  376. def __init__(self, *args, **kwargs):
  377. super(AdvancedTab, self).__init__(*args, **kwargs)
  378. self.retries_label = self.crt_statictext("Retries")
  379. self.retries_spinctrl = self.crt_spinctrl()
  380. self.auth_label = self.crt_statictext("Authentication")
  381. self.username_label = self.crt_statictext("Username")
  382. self.username_textctrl = self.crt_textctrl()
  383. self.password_label = self.crt_statictext("Password")
  384. self.password_textctrl = self.crt_textctrl(wx.TE_PASSWORD)
  385. self.video_pass_label = self.crt_statictext("Video password")
  386. self.video_pass_textctrl = self.crt_textctrl(wx.TE_PASSWORD)
  387. self.network_label = self.crt_statictext("Network")
  388. self.proxy_label = self.crt_statictext("Proxy")
  389. self.proxy_textctrl = self.crt_textctrl()
  390. self.useragent_label = self.crt_statictext("User agent")
  391. self.useragent_textctrl = self.crt_textctrl()
  392. self.referer_label = self.crt_statictext("Referer")
  393. self.referer_textctrl = self.crt_textctrl()
  394. self.logging_label = self.crt_statictext("Logging")
  395. self.enable_log_checkbox = self.crt_checkbox("Enable log")
  396. self.view_log_button = self.crt_button("View")
  397. self.clear_log_button = self.crt_button("Clear")
  398. self._set_layout()
  399. def _set_layout(self):
  400. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  401. vertical_sizer = wx.BoxSizer(wx.VERTICAL)
  402. retries_sizer = wx.BoxSizer(wx.HORIZONTAL)
  403. retries_sizer.AddSpacer((10, -1))
  404. retries_sizer.Add(self.retries_label, flag=wx.ALIGN_CENTER_VERTICAL)
  405. retries_sizer.AddSpacer((20, -1))
  406. retries_sizer.Add(self.retries_spinctrl)
  407. retries_sizer.AddSpacer((10, -1))
  408. vertical_sizer.Add(retries_sizer, flag=wx.ALIGN_RIGHT | wx.TOP, border=5)
  409. vertical_sizer.Add(self.auth_label, flag=wx.TOP, border=5)
  410. username_sizer = wx.BoxSizer(wx.HORIZONTAL)
  411. username_sizer.AddSpacer((10, -1))
  412. username_sizer.Add(self.username_label, flag=wx.ALIGN_CENTER_VERTICAL)
  413. username_sizer.AddSpacer((-1, -1), 1)
  414. username_sizer.Add(self.username_textctrl)
  415. username_sizer.AddSpacer((10, -1))
  416. vertical_sizer.Add(username_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  417. password_sizer = wx.BoxSizer(wx.HORIZONTAL)
  418. password_sizer.AddSpacer((10, -1))
  419. password_sizer.Add(self.password_label, flag=wx.ALIGN_CENTER_VERTICAL)
  420. password_sizer.AddSpacer((-1, -1), 1)
  421. password_sizer.Add(self.password_textctrl)
  422. password_sizer.AddSpacer((10, -1))
  423. vertical_sizer.Add(password_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  424. video_pass_sizer = wx.BoxSizer(wx.HORIZONTAL)
  425. video_pass_sizer.AddSpacer((10, -1))
  426. video_pass_sizer.Add(self.video_pass_label, flag=wx.ALIGN_CENTER_VERTICAL)
  427. video_pass_sizer.AddSpacer((-1, -1), 1)
  428. video_pass_sizer.Add(self.video_pass_textctrl)
  429. video_pass_sizer.AddSpacer((10, -1))
  430. vertical_sizer.Add(video_pass_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  431. vertical_sizer.Add(self.network_label, flag=wx.TOP, border=15)
  432. proxy_sizer = wx.BoxSizer(wx.HORIZONTAL)
  433. proxy_sizer.AddSpacer((10, -1))
  434. proxy_sizer.Add(self.proxy_label, flag=wx.ALIGN_CENTER_VERTICAL)
  435. proxy_sizer.AddSpacer((-1, -1), 1)
  436. proxy_sizer.Add(self.proxy_textctrl)
  437. proxy_sizer.AddSpacer((10, -1))
  438. vertical_sizer.Add(proxy_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  439. useragent_sizer = wx.BoxSizer(wx.HORIZONTAL)
  440. useragent_sizer.AddSpacer((10, -1))
  441. useragent_sizer.Add(self.useragent_label, flag=wx.ALIGN_CENTER_VERTICAL)
  442. useragent_sizer.AddSpacer((-1, -1), 1)
  443. useragent_sizer.Add(self.useragent_textctrl)
  444. useragent_sizer.AddSpacer((10, -1))
  445. vertical_sizer.Add(useragent_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  446. referer_sizer = wx.BoxSizer(wx.HORIZONTAL)
  447. referer_sizer.AddSpacer((10, -1))
  448. referer_sizer.Add(self.referer_label, flag=wx.ALIGN_CENTER_VERTICAL)
  449. referer_sizer.AddSpacer((-1, -1), 1)
  450. referer_sizer.Add(self.referer_textctrl)
  451. referer_sizer.AddSpacer((10, -1))
  452. vertical_sizer.Add(referer_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  453. vertical_sizer.Add(self.logging_label, flag=wx.TOP, border=15)
  454. logging_sizer = wx.BoxSizer(wx.HORIZONTAL)
  455. logging_sizer.AddSpacer((10, -1))
  456. logging_sizer.Add(self.enable_log_checkbox)
  457. logging_sizer.AddSpacer((-1, -1), 1)
  458. logging_sizer.Add(self.view_log_button)
  459. logging_sizer.Add(self.clear_log_button)
  460. logging_sizer.AddSpacer((10, -1))
  461. vertical_sizer.Add(logging_sizer, flag=wx.EXPAND | wx.TOP, border=5)
  462. main_sizer.Add(vertical_sizer, 1, wx.EXPAND | wx.ALL, border=5)
  463. self.SetSizer(main_sizer)
  464. def load_options(self):
  465. pass
  466. def save_options(self):
  467. pass
  468. class ExtraTab(TabPanel):
  469. def __init__(self, *args, **kwargs):
  470. super(ExtraTab, self).__init__(*args, **kwargs)
  471. self.cmdline_args_label = self.crt_statictext("Command line arguments (e.g. --help)")
  472. self.cmdline_args_textctrl = self.crt_textctrl(wx.TE_MULTILINE | wx.TE_LINEWRAP)
  473. self.extra_opts_label = self.crt_statictext("Extra options")
  474. self.ignore_errors_checkbox = self.crt_checkbox("Ignore errors")
  475. self._set_layout()
  476. def _set_layout(self):
  477. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  478. vertical_sizer = wx.BoxSizer(wx.VERTICAL)
  479. vertical_sizer.Add(self.cmdline_args_label)
  480. vertical_sizer.Add(self.cmdline_args_textctrl, 1, wx.EXPAND | wx.ALL, border=5)
  481. vertical_sizer.Add(self.extra_opts_label)
  482. extra_opts_sizer = wx.WrapSizer()
  483. extra_opts_sizer.Add(self.ignore_errors_checkbox)
  484. vertical_sizer.Add(extra_opts_sizer, flag=wx.ALL, border=5)
  485. main_sizer.Add(vertical_sizer, 1, wx.EXPAND | wx.ALL, border=5)
  486. self.SetSizer(main_sizer)
  487. def load_options(self):
  488. pass
  489. def save_options(self):
  490. pass
  491. class LogGUI(wx.Frame):
  492. """Simple window for reading the STDERR.
  493. Attributes:
  494. TITLE (string): Frame title.
  495. FRAME_SIZE (tuple): Tuple that holds the frame size (width, height).
  496. Args:
  497. parent (wx.Window): Frame parent.
  498. """
  499. # REFACTOR move it on widgets module
  500. TITLE = _("Log Viewer")
  501. FRAME_SIZE = (650, 200)
  502. def __init__(self, parent=None):
  503. wx.Frame.__init__(self, parent, title=self.TITLE, size=self.FRAME_SIZE)
  504. panel = wx.Panel(self)
  505. self._text_area = wx.TextCtrl(
  506. panel,
  507. style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL
  508. )
  509. sizer = wx.BoxSizer()
  510. sizer.Add(self._text_area, 1, wx.EXPAND)
  511. panel.SetSizerAndFit(sizer)
  512. def load(self, filename):
  513. """Load file content on the text area. """
  514. if os_path_exists(filename):
  515. self._text_area.LoadFile(filename)