diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-05-15 11:22:56 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | dceb06938c1295d1a4a7eafff20d5007e48dab81 (patch) | |
| tree | 5984aa544f188d4033fda2b40c91e4a10005f4a8 | |
| parent | add array and struct constructors (diff) | |
| download | alive-dceb06938c1295d1a4a7eafff20d5007e48dab81.tar.gz alive-dceb06938c1295d1a4a7eafff20d5007e48dab81.zip | |
move copilot logic, make startup scripts lua
| -rw-r--r-- | alv/copilot/base.moon (renamed from alv/copilot.moon) | 19 | ||||
| -rw-r--r-- | alv/copilot/cli.moon | 34 | ||||
| -rw-r--r-- | alv/copilot/fltk.moon | 111 | ||||
| -rw-r--r-- | alv/copilot/wx.moon | 139 | ||||
| -rw-r--r-- | alv/init.moon | 6 | ||||
| -rwxr-xr-x | bin/alv | 40 | ||||
| -rwxr-xr-x | bin/alv-fltk | 119 | ||||
| -rwxr-xr-x | bin/alv-wx | 146 | ||||
| -rw-r--r-- | spec/cell_spec.moon | 1 | ||||
| -rw-r--r-- | spec/test_setup.moon | 2 |
10 files changed, 316 insertions, 301 deletions
diff --git a/alv/copilot.moon b/alv/copilot/base.moon index 6c6df8d..8669d93 100644 --- a/alv/copilot.moon +++ b/alv/copilot/base.moon @@ -1,5 +1,5 @@ ---- --- File watcher and CLI entrypoint. +-- File watcher and runtime entrypoint. -- -- @classmod Copilot lfs = require 'lfs' @@ -9,6 +9,22 @@ import Error from require 'alv.error' import RTNode from require 'alv.rtnode' import Constant from require 'alv.result' +parse_args = (args, out={}) -> + local key + for a in *args + if key + out[key] = a + key = nil + else if match = a\match '^%-%-(.*)' + if 'boolean' == type out[match] + out[match] = true + else + key = match + else + table.insert out, a + assert not key, "value for option '--#{key}' missing!" + out + export COPILOT class Copilot @@ -131,5 +147,6 @@ class Copilot @last_modules, @modules = @modules, nil { + :parse_args :Copilot } diff --git a/alv/copilot/cli.moon b/alv/copilot/cli.moon new file mode 100644 index 0000000..3686491 --- /dev/null +++ b/alv/copilot/cli.moon @@ -0,0 +1,34 @@ +---- +-- CLI Copilot entrypoint. +-- +-- @classmod CLICopilot +import Logger, version from require 'alv' +import parse_args, Copilot from require 'alv.copilot.base' +import sleep from require 'system' + +class ColorLogger extends Logger + set_time: (time) => + super time + @stream\write switch time + when 'eval' then '\27[92m' + when 'run' then '\27[0m' + +class CLICopilot extends Copilot + new: (arg) => + @args = parse_args arg, { nocolor: false } + assert @args[1], "no filename given" + super @args[1] + + run: => + if @args.nocolor + Logger\init @args.log + else + ColorLogger\init @args.log + + while true + @tick! + sleep 1 / 1000 + +{ + :CLICopilot +} diff --git a/alv/copilot/fltk.moon b/alv/copilot/fltk.moon new file mode 100644 index 0000000..8821358 --- /dev/null +++ b/alv/copilot/fltk.moon @@ -0,0 +1,111 @@ +---- +-- 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) => + @output.browser\add message + if true or @output.sticky.value + @output.browser.bottomline = @output.browser.nitems + +class FLTKCopilot extends Copilot + new: (arg) => + @args = parse_args arg + + @window = with fl.Window { 400, 220, "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! + @pause = \add "Run (^P)", '^p', @\pause, 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 + } + -- sticky = fl.Check_Button 5, 20, 80, 20, 'sticky' + -- sticky\set! + :browser, :sticky + + @run_out = do + browser = fl.Browser { + 5, 120, 390, 80, "run", + box: fl.GTK_DOWN_BOX, align: fl.ALIGN_BOTTOM_RIGHT + } + -- sticky = fl.Check_Button 5, 200, 80, 20, 'sticky' + -- sticky\set! + :browser, :sticky + + tile\end_group! + @window\end_group! + + @update_status! + super @args[1] + + about: => + fl.alert "alive #{version.tag} fltkCopilot. + +visit #{version.web} for more information." + + open: (file) => + file or= fl.file_chooser "Open Script", '*.alv', 'script.alv' + + if file + @paused = false + super file + @update_status! + + pause: => + @paused = not @paused + @update_status! + + update_status: => + state = fl.MENU_TOGGLE + if not @paused + state += fl.MENU_VALUE + @menubar\menuitem_setp @pause, 'flags', state + + if @paused + "Paused." + else + "Running." + + 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 +} diff --git a/alv/copilot/wx.moon b/alv/copilot/wx.moon new file mode 100644 index 0000000..b740794 --- /dev/null +++ b/alv/copilot/wx.moon @@ -0,0 +1,139 @@ +---- +-- 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_ANY, wxVERTICAL, + wxFrame, wxMenuBar, wxMenu, wxPanel, wxBoxSizer, wxTextCtrl, wxSplitterWindow +from wx + +STARTSTOP = 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) => + @args = parse_args arg + super @args[1] + + @app = wx.wxGetApp! + @app.VendorName = 'alive' + @app.AppName = 'alive wxCopilot' + + fileMenu = wxMenu { + { wxID_ABOUT, '&About', 'About alive wxCopilot' } + { wxID_OPEN, '&Open\tCtrl-O', 'Open Script' } + { } + { wxID_EXIT, 'E&xit\tCtrl-Q', 'Exit Program' } + } + runMenu = wxMenu { + { STARTSTOP, '&Start/Stop\tCtrl-P', 'Start/Stop Script Execution' } + } + @menuBar = with wxMenuBar! + \Append fileMenu, '&File' + \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 60 + 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 STARTSTOP, wx.wxEVT_COMMAND_MENU_SELECTED, @\do_startstop + @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 @file + @paused = not @paused + @update_status! + + do_idle: (event) => + if not @paused + event\RequestMore true + @tick! + + update_status: => + startstop = @menuBar\FindItem STARTSTOP + if not @file + @status\SetStatusText "No script loaded." + startstop\Enable false + else + startstop\Enable true + if @paused + @status\SetStatusText "Paused." + else + @status\SetStatusText "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 + + run: => + WXLogger\init @args.log, copilot.eval_ctrl, copilot.run_ctrl + @app\MainLoop! + +{ + :WXCopilot +} diff --git a/alv/init.moon b/alv/init.moon index fc85f8b..26d1656 100644 --- a/alv/init.moon +++ b/alv/init.moon @@ -31,8 +31,6 @@ globals = require 'alv.builtin' cycle\resolve! -import Copilot from require 'alv.copilot' - --- exports -- @table exports -- @tfield version version @@ -51,7 +49,6 @@ import Copilot from require 'alv.copilot' -- @tfield Error Error -- @tfield Registry Registry -- @tfield Tag Tag --- @tfield Copilot Copilot -- @tfield Logger Logger -- @tfield Scope globals global definitons -- @tfield parse function to turn a `string` into a root `Cell` @@ -65,11 +62,10 @@ import Copilot from require 'alv.copilot' :T, :Primitive, :Struct, :Array :Registry, :SimpleRegistry, :Tag + :Logger :globals - :Copilot, :Logger - parse: (str) -> assert (program\match str), Error 'syntax', "failed to parse" @@ -1,36 +1,4 @@ -#!/usr/bin/env moon -import Copilot, Logger from require 'alv' -import sleep from require 'system' - -class ColorLogger extends Logger - set_time: (time) => - super time - @stream\write switch time - when 'eval' then '\27[92m' - when 'run' then '\27[0m' - -arguments, key = { nocolor: false } -for a in *arg - if key - arguments[key] = a - key = nil - else if match = a\match '^%-%-(.*)' - if 'bool' == type arguments[key] - arguments[key] = true - else - key = match - else - table.insert arguments, a -assert not key, "option value missing" - -if arguments.nocolor - Logger\init arguments.log -else - ColorLogger\init arguments.log - -assert arguments[1], "no filename given" -copilot = Copilot arguments[1] - -while true - copilot\tick! - sleep 1 / 1000 +#!/usr/bin/env lua +require('moonscript') +local Copilot = require('alv.copilot.cli').CLICopilot +Copilot(arg):run() diff --git a/bin/alv-fltk b/bin/alv-fltk index 8075540..0837fab 100755 --- a/bin/alv-fltk +++ b/bin/alv-fltk @@ -1,115 +1,4 @@ -#!/usr/bin/env moon -import Copilot, Logger, version from require 'alv' -import sleep from require 'system' -fl = require 'fltk4lua' - -class GUILogger 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) => - @output.browser\add message - if true or @output.sticky.value - @output.browser.bottomline = @output.browser.nitems - -class GUICopilot extends Copilot - new: (...) => - @window = with fl.Window { 400, 220, "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! - @pause = \add "Run (^P)", '^p', @\pause, 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 - } - -- sticky = fl.Check_Button 5, 20, 80, 20, 'sticky' - -- sticky\set! - :browser, :sticky - - @run_out = do - browser = fl.Browser { - 5, 120, 390, 80, "run", - box: fl.GTK_DOWN_BOX, align: fl.ALIGN_BOTTOM_RIGHT - } - -- sticky = fl.Check_Button 5, 200, 80, 20, 'sticky' - -- sticky\set! - :browser, :sticky - - tile\end_group! - @window\end_group! - - @update_status! - super ... - - run: (opts) => - GUILogger\init opts.log, @eval_out, @run_out - @window\show! - - run = true - while run - run = if @paused - fl.check 1 - else - @tick! - sleep 1 / 1000 - fl.check! - - about: => - fl.alert "alive #{version.tag} fltkCopilot. - -visit #{version.web} for more information." - - open: (file) => - file or= fl.file_chooser "Open Script", '*.alv', 'script.alv' - - if file - @paused = false - super file - @update_status! - - pause: => - @paused = not @paused - @update_status! - - update_status: => - state = fl.MENU_TOGGLE - if not @paused - state += fl.MENU_VALUE - @menubar\menuitem_setp @pause, 'flags', state - - if @paused - "Paused." - else - "Running." - -arguments, key = {} -for a in *arg - if match = a\match '^%-%-(.*)' - key = match - arguments[key] = true - elseif key - arguments[key] = a - key = nil - else - table.insert arguments, a - -copilot = GUICopilot arguments[1] -copilot\run arguments +#!/usr/bin/env lua +require('moonscript') +local Copilot = require('alv.copilot.fltk').FLTKCopilot +Copilot(arg):run() @@ -1,142 +1,4 @@ -#!/usr/bin/env moon -import Copilot, Logger, version from require 'alv' -import sleep from require 'system' - -require 'wx' -import - wxID_ABOUT, wxID_OPEN, wxID_EXIT, wxID_ANY, wxVERTICAL, - wxFrame, wxMenuBar, wxMenu, wxPanel, wxBoxSizer, wxTextCtrl, wxSplitterWindow -from wx - -STARTSTOP = 100 - -class GUILogger 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 GUICopilot extends Copilot - new: (...) => - super ... - - @app = wx.wxGetApp! - @app.VendorName = 'alive' - @app.AppName = 'alive wxCopilot' - - fileMenu = wxMenu { - { wxID_ABOUT, '&About', 'About alive wxCopilot' } - { wxID_OPEN, '&Open\tCtrl-O', 'Open Script' } - { } - { wxID_EXIT, 'E&xit\tCtrl-Q', 'Exit Program' } - } - runMenu = wxMenu { - { STARTSTOP, '&Start/Stop\tCtrl-P', 'Start/Stop Script Execution' } - } - @menuBar = with wxMenuBar! - \Append fileMenu, '&File' - \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 60 - 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 STARTSTOP, wx.wxEVT_COMMAND_MENU_SELECTED, @\do_startstop - @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 @file - @paused = not @paused - @update_status! - - do_idle: (event) => - if not @paused - event\RequestMore true - @tick! - - update_status: => - startstop = @menuBar\FindItem STARTSTOP - if not @file - @status\SetStatusText "No script loaded." - startstop\Enable false - else - startstop\Enable true - if @paused - @status\SetStatusText "Paused." - else - @status\SetStatusText "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 - -arguments, key = {} -for a in *arg - if match = a\match '^%-%-(.*)' - key = match - arguments[key] = true - elseif key - arguments[key] = a - key = nil - else - table.insert arguments, a - -copilot = GUICopilot arguments[1] -GUILogger\init arguments.log, copilot.eval_ctrl, copilot.run_ctrl -copilot.app\MainLoop! +#!/usr/bin/env lua +require('moonscript') +local Copilot = require('alv.copilot.wx').WXCopilot +Copilot(arg):run() diff --git a/spec/cell_spec.moon b/spec/cell_spec.moon index de46245..a8e79fe 100644 --- a/spec/cell_spec.moon +++ b/spec/cell_spec.moon @@ -1,7 +1,6 @@ import do_setup from require 'spec.test_setup' import Cell, RootCell from require 'alv.cell' import Constant, Scope, Tag, SimpleRegistry, globals from require 'alv' -import Copilot from require 'alv.copilot' setup do_setup diff --git a/spec/test_setup.moon b/spec/test_setup.moon index ca5c71c..dc91bdd 100644 --- a/spec/test_setup.moon +++ b/spec/test_setup.moon @@ -1,5 +1,5 @@ require 'alv' -import Copilot from require 'alv.copilot' +import Copilot from require 'alv.copilot.base' import Module from require 'alv.module' import Logger from require 'alv.logger' Logger\init 'silent' |
