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.

97 lines
2.9 KiB

  1. import webbrowser
  2. import wx
  3. from gooey.gui.lang import i18n
  4. from .widgets.basictextconsole import BasicTextConsole
  5. class Console(wx.Panel):
  6. '''
  7. Textbox console/terminal displayed during the client program's execution.
  8. '''
  9. def __init__(self, parent, buildSpec, **kwargs):
  10. wx.Panel.__init__(self, parent, **kwargs)
  11. self.buildSpec = buildSpec
  12. self.text = wx.StaticText(self, label=i18n._("status"))
  13. if buildSpec["richtext_controls"]:
  14. from .widgets.richtextconsole import RichTextConsole
  15. self.textbox = RichTextConsole(self)
  16. else:
  17. self.textbox = BasicTextConsole(self)
  18. self.defaultFont = self.textbox.GetFont()
  19. self.textbox.SetFont(wx.Font(
  20. self.buildSpec['terminal_font_size'] or self.defaultFont.GetPointSize(),
  21. self.getFontStyle(),
  22. wx.NORMAL,
  23. self.buildSpec['terminal_font_weight'] or wx.NORMAL,
  24. False,
  25. self.getFontFace(),
  26. ))
  27. self.textbox.SetForegroundColour(self.buildSpec['terminal_font_color'])
  28. self.layoutComponent()
  29. self.Layout()
  30. self.Bind(wx.EVT_TEXT_URL, self.followUrl, self.textbox)
  31. def followUrl(self, event):
  32. webbrowser.open(self.textbox.GetValue()[event.URLStart:event.URLEnd])
  33. def getFontStyle(self):
  34. """
  35. Force wx.Modern style to support legacy
  36. monospace_display param when present
  37. """
  38. return (wx.MODERN
  39. if self.buildSpec['monospace_display']
  40. else wx.DEFAULT)
  41. def getFontFace(self):
  42. """Choose the best font face available given the user options"""
  43. userFace = self.buildSpec['terminal_font_family'] or self.defaultFont.GetFaceName()
  44. return (''
  45. if self.buildSpec['monospace_display']
  46. else userFace)
  47. def logOutput(self, *args, **kwargs):
  48. """Event Handler for console updates coming from the client's program"""
  49. self.appendText(kwargs.get('msg'))
  50. def appendText(self, txt):
  51. """
  52. Append the text to the main TextCtrl.
  53. Note! Must be called from a Wx specific thread handler to avoid
  54. multi-threaded explosions (e.g. wx.CallAfter)
  55. """
  56. self.textbox.AppendText(txt)
  57. def clear(self):
  58. """
  59. Clear the the main TextCtrl.
  60. """
  61. self.textbox.Clear()
  62. def getText(self):
  63. return self.textbox.GetValue()
  64. def layoutComponent(self):
  65. self.SetBackgroundColour(self.buildSpec.get('terminal_bg_color', '#F0F0F0'))
  66. sizer = wx.BoxSizer(wx.VERTICAL)
  67. sizer.AddSpacer(10)
  68. sizer.Add(self.text, 0, wx.LEFT, 20)
  69. sizer.AddSpacer(10)
  70. sizer.Add(self.textbox, 1, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 20)
  71. sizer.AddSpacer(20)
  72. self.SetSizer(sizer)