aboutsummaryrefslogtreecommitdiffstats
path: root/alv/copilot/fltk.moon
blob: 403c5d9eb9d7ee236a774a2c84ffaf673042cea0 (plain)
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
}