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
|
----
-- fltk4lua Copilot GUI.
--
-- @classmod FLTKCopilot
import Logger, version from require 'alv'
import parse_args, Copilot from require 'alv.copilot.base'
import sleep from require 'system'
fl = require 'fltk4lua'
class FLTKLogger extends Logger
new: (level, @eval, @run) =>
super level
set_time: (time) =>
@output = switch time
when 'eval' then @eval
when 'run' then @run
else error "invalid time '#{time}'"
put: (message) =>
for line in message\gmatch "[^\r\n]+"
@output.browser\add line
if true or @output.sticky.value
@output.browser.bottomline = @output.browser.nitems
class FLTKCopilot extends Copilot
new: (arg) =>
@window = with fl.Window { 400, 240, "alv copilot", xclass: 'alv' }
\size_range 400, 220, nil, nil, 20, 20
@menubar = with fl.Menu_Bar 0, 0, 400, 20
\add "&File/About", nil, @\about, nil, fl.MENU_DIVIDER
\add "&File/&Open script", '^o', -> @open!
\add "&File/&Quit", '^q', -> @window\hide!
\add "&Edit/C&lear Logs", '^l', @\clear
@autoclear = \add "&Edit/Auto-clear on eval", nil, nil, nil, fl.MENU_TOGGLE + fl.MENU_VALUE
@runcode = \add "Run (^P)", '^p', @\update_status, nil, fl.MENU_TOGGLE
\add "Help", nil, -> fl.open_uri version.web
tile = fl.Tile 5, 40, 390, 160
@window.resizable = tile
resize_box = fl.Box { 5, 60, 390, 120, labeltype: fl.NO_LABEL }
tile.resizable = resize_box
@eval_out = do
browser = fl.Browser {
5, 40, 390, 80, "eval",
box: fl.GTK_DOWN_BOX, align: fl.ALIGN_TOP_RIGHT
}
:browser, :sticky
@run_out = do
browser = fl.Browser {
5, 120, 390, 80, "run",
box: fl.GTK_DOWN_BOX, align: fl.ALIGN_BOTTOM_RIGHT
}
:browser, :sticky
@status = fl.Input {
5, 220, 390, 20,
color: fl.BACKGROUND_COLOR, align: fl.ALIGN_LEFT
type: 'FL_NORMAL_OUTPUT', box: 'FL_FLAT_BOX'
value: "no script"
}
tile\end_group!
@window\end_group!
super parse_args arg
about: =>
fl.alert "alive #{version.tag} fltkCopilot.
visit #{version.web} for more information."
open: (file) =>
file or= fl.file_chooser "Open Script", '*.alv', ''
if file
@menubar\menuitem_set @runcode
super file
@update_status!
update_status: =>
@paused = not @menubar\menuitem_value @runcode
@window.label = if @active_module
"#{@active_module\name!} - alv copilot"
else
"alv copilot"
@status.value = if not @active_module
"no script"
elseif @paused
"paused"
else
"running"
@window\redraw!
eval: (dirty) =>
if @menubar\menuitem_value @autoclear
@clear!
super dirty
clear: =>
@run_out.browser\clear!
@eval_out.browser\clear!
run: =>
FLTKLogger\init @args.log, @eval_out, @run_out
@window\show!
run = true
while run
run = if @paused
fl.check 1
else
@tick!
sleep 1 / 1000
fl.check!
{
:FLTKCopilot
}
|