---- -- wxLua Copilot GUI. -- -- @classmod WXCopilot import Logger, version from require 'alv' import parse_args, Copilot from require 'alv.copilot.base' require 'wx' import wxID_ABOUT, wxID_OPEN, wxID_EXIT, wxID_CLEAR, wxID_STOP, wxID_ANY, wxVERTICAL, wxFrame, wxMenuBar, wxMenu, wxPanel, wxBoxSizer, wxTextCtrl, wxSplitterWindow from wx AUTO_CLEAR = 100 class WXLogger extends Logger new: (level, @eval_ctrl, @run_ctrl) => super level set_time: (time) => @ctrl = switch time when 'eval' then @eval_ctrl when 'run' then @run_ctrl else error "invalid time '#{time}'" put: (message) => @ctrl\AppendText message .. '\n' class WXCopilot extends Copilot new: (arg) => super parse_args arg @app = wx.wxGetApp! @app.VendorName = 'alive' @app.AppName = 'alive wxCopilot' fileMenu = with wxMenu! \Append wxID_ABOUT, '&About', 'About alive wxCopilot' \Append wxID_OPEN, '&Open\tCtrl-O', 'Open Script' \AppendSeparator! \Append wxID_EXIT, 'E&xit\tCtrl-Q', 'Exit Program' editMenu = with wxMenu! \Append wxID_CLEAR, 'C&lear Logs\tCtrl-L' @autoclear = \AppendCheckItem AUTO_CLEAR, '&Auto-Clear on eval' @autoclear\Check true runMenu = with wxMenu! \Append wxID_STOP, '&Start/Stop\tCtrl-P' @menuBar = with wxMenuBar! \Append fileMenu, '&File' \Append editMenu, '&Edit' \Append runMenu, '&Run' @frame = wxFrame wx.NULL, wxID_ANY, @app\GetAppName! @frame\SetMenuBar @menuBar @status = @frame\CreateStatusBar 1 @update_status! splitter = wxSplitterWindow @frame, wx.wxID_ANY eval, @eval_ctrl = @mkPanel splitter, 'eval-time messages' run, @run_ctrl = @mkPanel splitter, 'run-time messages' splitter\SetMinimumPaneSize 100 splitter\SplitHorizontally eval, run, 0 sizer = with wxBoxSizer wx.wxVERTICAL \Add splitter, 1, wx.wxEXPAND + wx.wxALL, 10 @frame\SetAutoLayout true @frame\SetSizer sizer @frame\Show true @frame\Connect wxID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED, @\do_about @frame\Connect wxID_OPEN, wx.wxEVT_COMMAND_MENU_SELECTED, @\do_open @frame\Connect wxID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED, -> @frame\Close! @frame\Connect wxID_STOP, wx.wxEVT_COMMAND_MENU_SELECTED, @\do_startstop @frame\Connect wxID_CLEAR, wx.wxEVT_COMMAND_MENU_SELECTED, @\clear @frame\Connect wxID_ANY, wx.wxEVT_IDLE, @\do_idle do_about: => wx.wxMessageBox "alive #{version.tag} wxCopilot. built using #{wxlua.wxLUA_VERSION_STRING} on #{wx.wxVERSION_STRING}", "About wxCopilot", wx.wxOK + wx.wxICON_INFORMATION, @frame do_open: => dialog = wx.wxFileDialog @frame, 'Change Script', '', '', 'Alive scripts (*.alv)|*.alv|All files (*)|*', wx.wxFD_OPEN + wx.wxFD_FILE_MUST_EXIST if dialog\ShowModal! == wx.wxID_OK @paused = false @open dialog\GetPath! @update_status! dialog\Destroy! do_startstop: (event) => if @active_module @paused = not @paused @update_status! do_idle: (event) => event\RequestMore true if not @paused @tick! update_status: => startstop = @menuBar\FindItem wxID_STOP if not @active_module @frame\SetTitle @app\GetAppName! startstop\Enable false @status\SetStatusText "No script loaded." else @frame\SetTitle "#{@active_module\name!} - #{@app\GetAppName!}" startstop\Enable true @status\SetStatusText if @paused then "Paused." else "Running." mkPanel: (parent, name) => panel = wxPanel parent, wxID_ANY sizer = wxBoxSizer wxVERTICAL panel\SetSizer sizer sizer\Add wx.wxStaticText panel, wx.wxID_ANY, name log = wxTextCtrl panel, wxID_ANY, '', wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_MULTILINE + wx.wxTE_READONLY sizer\Add log, 1, wx.wxEXPAND | wx.wxBOTTOM, 5 panel, log eval: (dirty) => if @autoclear\IsChecked! @clear! super dirty clear: => @eval_ctrl\Clear! @run_ctrl\Clear! run: => WXLogger\init @args.log, @eval_ctrl, @run_ctrl @app\MainLoop! { :WXCopilot }