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.

104 lines
3.2 KiB

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