aboutsummaryrefslogtreecommitdiffstats
path: root/alv/copilot/wx.moon
blob: f61897dedd87044b8a8c2bfa72a1a0769e6aa646 (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
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
}