From 12415cc700dfa4a04f89f5e3a73cde2115293d70 Mon Sep 17 00:00:00 2001 From: octacian Date: Sat, 24 Nov 2018 21:25:27 -0800 Subject: [PATCH] Replace input, output, and output_editable APIs for system.* keys * [set/get]_input -> system.input (string) * [set/get]_output -> system.output (string) * set_output_editable -> system.output_editable (bool) --- .luacheckrc | 5 ++- doc/computers/os_api.md | 28 ++------------- modules/computers/env.lua | 76 ++++++++++++++++----------------------- octos/exec/nano.lua | 16 ++++----- octos/main.lua | 2 +- octos/start.lua | 2 +- 6 files changed, 45 insertions(+), 84 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 5040ef4..8f379e1 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -22,7 +22,6 @@ read_globals = { "default", "sfinv", "creative", -- OctOS Internals (custom environment functions) - "set_help", "get_attr", "get_output", "set_output", - "set_output_editable", "get_input", "set_input", - "refresh", "run", "loadstring", "set_run", "fs", + "set_help", "get_attr", "refresh", "run", + "loadstring", "set_run", "fs", } diff --git a/doc/computers/os_api.md b/doc/computers/os_api.md index 7f630c2..b738279 100644 --- a/doc/computers/os_api.md +++ b/doc/computers/os_api.md @@ -14,6 +14,9 @@ Earlier versions of digicompute had an array of functions to get and set arbitra * `off` - `string`: command to turn the computer off. * `reboot` - `string`: command to reboot the computer. * `prefix` - `string`: prefix printed at the beginning of a new line. +* `input` - `string`: contents of the input field. +* `output` - `string`: contents of the output buffer. +* `output_editable` - `boolean`: whether or not the output is editable. **Example:** ```lua @@ -51,31 +54,6 @@ Gets a piece of global information from the node meta (storage). Several common * `id`: computer id. * `output_editable`: whether the output buffer is editable. -#### `get_output()` -**Usage:** `get_output()` - -Returns the value of the output buffer. Shorthand for `get_attr("output")`. - -#### `set_output(value)` -**Usage:** `set_output()` - -Set the output buffer to any string. This is the write method for the output attribute. - -#### `set_output_editable(bool)` -**Usage:** `set_output_editable()` - -Makes the output buffer editable. Useful for programs that would like a larger input field. However, it can be used in any way wanted as `get_output` and `set_output` are still functional. - -#### `get_input()` -**Usage:** `get_input()` - -Returns the value of the input field. Shorthand for `get_attr("input")`. - -#### `set_input(value)` -**Usage:** `set_input()` - -Set the input field to any string. This is the write method for the input attribute. - #### `refresh()` **Usage:** `refresh()` diff --git a/modules/computers/env.lua b/modules/computers/env.lua index 157a9b1..7410cb8 100644 --- a/modules/computers/env.lua +++ b/modules/computers/env.lua @@ -52,35 +52,6 @@ local function create_env_table(meta, pos) return meta:to_table().fields[key] or nil end - -- [function] Get the value of the output formspec field - function env.get_output() - return meta:get_string("output") or nil - end - - -- [function] Set the value of the output formspec field - function env.set_output(value) - return meta:set_string("output", value) - end - - -- [function] Toggle whether the output area can be edited - function env.set_output_editable(bool) - if bool == true then - meta:set_string("output_editable", "true") - else - meta:set_string("output_editable", "false") - end - end - - -- [function] Get the value of the input formspec field - function env.get_input() - return meta:get_string("input") or nil - end - - -- [function] Set the value of the input formspec field - function env.set_input(value) - return meta:set_string("input", value) - end - -- [function] Refresh the computer formspec function env.refresh() local current_user = meta:get_string("current_user") @@ -202,37 +173,50 @@ local function create_env_table(meta, pos) } setmetatable(env.ram, ram_mt) - local system_shadow = minetest.deserialize(meta:get_string("os")) + local system_shadow = minetest.deserialize(meta:get_string("system")) -- Define OS metatable local system_mt = { -- Ensure value is allowed and save to meta as well __newindex = function(table, key, value) local allowed_keys = { - clear = true, - off = true, - reboot = true, - prefix = true, + clear = "string", + off = "string", + reboot = "string", + prefix = "string", + input = "string", + output = "string", + output_editable = "boolean", } - -- Ensure strings - if type(value) ~= "string" then - local msg = "Error: All values in the system table must be strings." - env.print(msg) - env.print_debug(msg) - elseif not allowed_keys[key] then + -- Ensure allowed + if not allowed_keys[key] then local msg = "Error: "..key.. " is not an allowed key in the system table." env.print(msg) env.print_debug(msg) + -- Ensure type + elseif type(value) ~= allowed_keys[key] then + local msg = "Error: "..key.." must be a "..allowed_keys[key] + env.print(msg) + env.print_debug(msg) else -- else, save - rawset(system_shadow, key, value) -- Save to table - -- Save to metadata - meta:set_string("system", minetest.serialize(system_shadow)) + -- Set input, output, and output editable separately + if key == "input" or key == "output" or key == "output_editable" then + rawset(system_shadow, key, value) -- Save to table + + local t = allowed_keys[key] + -- if type is boolean, convert to string + if t == "boolean" then t = "string" end + -- Save separately to metadata + meta["set_"..t](meta, key, _G["to"..t](value)) + else + rawset(system_shadow, key, value) -- Save to table + -- Save to metadata + meta:set_string("system", minetest.serialize(system_shadow)) + end end end, -- Always fetch values from the shadow table - __index = function(table, key) - return system_shadow[key] - end, + __index = system_shadow, } setmetatable(env.system, system_mt) diff --git a/octos/exec/nano.lua b/octos/exec/nano.lua index fad983f..090f1d9 100644 --- a/octos/exec/nano.lua +++ b/octos/exec/nano.lua @@ -1,28 +1,28 @@ if get_attr("run") == "os/exec/nano.lua" then local input = get_attr("input") if input == "save" then - fs.write(ram.nano_path, get_output(), "w") + fs.write(ram.nano_path, system.output, "w") elseif input == "discard" or input == "exit" then if input == "exit" then - fs.write(ram.nano_path, get_output(), "w") + fs.write(ram.nano_path, system.output, "w") end ram.nano_path = nil -- Clear nano path system.prefix = ram.nano_prefix -- Restore prefix ram.nano_prefix = nil -- Clear stored prefix - set_output(ram.nano_output.."\n"..system.prefix) -- Restore output + system.output = ram.nano_output.."\n"..system.prefix -- Restore output ram.nano_output = nil -- Clear stored output set_run() -- Clear custom run file -- Restore "output editable" to previous state if not ram.nano_output_was_editable then - set_output_editable(false) + system.output_editable = false else ram.nano_output_was_editable = nil end end - set_input("") -- Clear input + system.input = "" -- Clear input refresh() -- Refresh formspec else local path = ... @@ -32,8 +32,8 @@ else local contents = fs.read(path) or "" ram.nano_path = path -- Store editing path for later - ram.nano_output = get_output() -- Store old output for later - set_output(contents) -- Set output to contents of file or blank + ram.nano_output = system.output -- Store old output for later + system.output = contents -- Set output to contents of file or blank ram.nano_prefix = system.prefix -- Store OS prefix for later system.prefix = "" -- Set OS prefix to a blank string set_help("\"save\" to save, \"discard\" to discard and exit, \"exit\" to save and exit") -- Add information to help @@ -41,7 +41,7 @@ else -- Ensure output is editable if get_attr("output_editable") == "false" then - set_output_editable(true) + system.output_editable = true else ram.nano_output_was_editable = true end diff --git a/octos/main.lua b/octos/main.lua index f76a825..1f10bc2 100644 --- a/octos/main.lua +++ b/octos/main.lua @@ -22,7 +22,7 @@ if input[1] ~= "" then print(system.prefix) -- Clear input - set_input("") + system.input = "" -- Refresh view refresh() diff --git a/octos/start.lua b/octos/start.lua index 5758e60..2b7de45 100644 --- a/octos/start.lua +++ b/octos/start.lua @@ -30,7 +30,7 @@ bin[system.reboot] = { description = "Reboot computer" } -- Reboot computer ram.bin = bin -- Set initial output value -set_output("Welcome to octOS version 0.2.\n\n"..system.prefix) -- print welcome +system.output = "Welcome to octOS version 0.2.\n\n"..system.prefix -- print welcome -- Refresh view refresh()