1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
----
-- 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
}
|