247 lines
6.4 KiB
Lua
247 lines
6.4 KiB
Lua
require ("iuplua")
|
|
|
|
console = {}
|
|
|
|
console.prompt = iup.text{expand="Horizontal", dragdrop = "Yes"}
|
|
console.output = iup.text{expand="Yes",
|
|
readonly="Yes",
|
|
bgcolor="232 232 232",
|
|
font = "Courier, 11",
|
|
appendnewline = "No",
|
|
multiline = "Yes"}
|
|
|
|
console.prompt.tip = "Enter - executes a Lua command\n"..
|
|
"Esc - clears the command\n"..
|
|
"Ctrl+Del - clears the output\n"..
|
|
"Ctrl+O - selects a file and execute it\n"..
|
|
"Ctrl+X - exits the console\n"..
|
|
"Up Arrow - shows the previous command in history\n"..
|
|
"Down Arrow - shows the next command in history\n"..
|
|
"Drop files here to execute them"
|
|
|
|
console.orig_output = io.output
|
|
console.orig_write = io.write
|
|
console.orig_print = print
|
|
|
|
function io.output(filename)
|
|
console.orig_output(filename)
|
|
if (filename) then
|
|
io.write = console.orig_write
|
|
else
|
|
io.write = console.new_write
|
|
end
|
|
end
|
|
|
|
function console.new_write(...)
|
|
-- Try to simulate the same behavior of the standard io.write
|
|
local arg = {...}
|
|
local str -- allow to print a nil value
|
|
for i,v in ipairs(arg) do
|
|
if (str) then
|
|
str = str .. tostring(v)
|
|
else
|
|
str = tostring(v)
|
|
end
|
|
end
|
|
console.print2output(str, true)
|
|
end
|
|
io.write = console.new_write
|
|
|
|
function print(...)
|
|
-- Try to simulate the same behavior of the standard print
|
|
local arg = {...}
|
|
local str -- allow to print a nil value
|
|
for i,v in ipairs(arg) do
|
|
if (i > 1) then
|
|
str = str .. "\t" -- only add Tab for more than 1 parameters
|
|
end
|
|
if (str) then
|
|
str = str .. tostring(v)
|
|
else
|
|
str = tostring(v)
|
|
end
|
|
end
|
|
console.print2output(str)
|
|
end
|
|
|
|
function console.print2output(s, no_newline)
|
|
if (no_newline) then
|
|
console.output.append = tostring(s)
|
|
console.no_newline = no_newline
|
|
else
|
|
if (console.no_newline) then
|
|
-- if io.write was called, then a print is called, must add a new line before
|
|
console.output.append = "\n" .. tostring(s) .. "\n"
|
|
console.no_newline = nil
|
|
else
|
|
console.output.append = tostring(s) .. "\n"
|
|
end
|
|
end
|
|
end
|
|
|
|
function console.print_command(cmd)
|
|
console.add_command(cmd)
|
|
console.print2output("> " .. cmd)
|
|
end
|
|
|
|
function console.add_command(cmd)
|
|
console.cmd_index = nil
|
|
if (not console.cmd_list) then
|
|
console.cmd_list = {}
|
|
end
|
|
local n = #(console.cmd_list)
|
|
console.cmd_list[n+1] = cmd
|
|
end
|
|
|
|
function console.prev_command()
|
|
if (not console.cmd_list) then
|
|
return
|
|
end
|
|
if (not console.cmd_index) then
|
|
console.cmd_index = #(console.cmd_list)
|
|
else
|
|
console.cmd_index = console.cmd_index - 1
|
|
if (console.cmd_index == 0) then
|
|
console.cmd_index = 1
|
|
end
|
|
end
|
|
console.prompt.value = console.cmd_list[console.cmd_index]
|
|
end
|
|
|
|
function console.next_command()
|
|
if (not console.cmd_list) then
|
|
return
|
|
end
|
|
if (not console.cmd_index) then
|
|
return
|
|
else
|
|
console.cmd_index = console.cmd_index + 1
|
|
local n = #(console.cmd_list)
|
|
if (console.cmd_index == n+1) then
|
|
console.cmd_index = n
|
|
end
|
|
end
|
|
console.prompt.value = console.cmd_list[console.cmd_index]
|
|
end
|
|
|
|
function console.do_file(filename)
|
|
local cmd = 'dofile(' .. string.format('%q', filename) .. ')'
|
|
console.print_command(cmd)
|
|
dofile(filename)
|
|
end
|
|
|
|
function console.do_string(cmd)
|
|
console.print_command(cmd)
|
|
assert(loadstring(cmd))()
|
|
end
|
|
|
|
function console.open_file()
|
|
local fd=iup.filedlg{dialogtype="OPEN", title="Load File",
|
|
nochangedir="NO", directory=console.last_directory,
|
|
filter="*.*", filterinfo="All Files", allownew="NO"}
|
|
fd:popup(iup.CENTER, iup.CENTER)
|
|
local status = fd.status
|
|
local filename = fd.value
|
|
console.last_directory = fd.directory -- save the previous directory
|
|
fd:destroy()
|
|
|
|
if (status == "-1") or (status == "1") then
|
|
if (status == "1") then
|
|
error ("Cannot load file: "..filename)
|
|
end
|
|
else
|
|
console.do_file(filename)
|
|
end
|
|
end
|
|
|
|
function console.prompt:dropfiles_cb(filename)
|
|
-- will execute all dropped files, can drop more than one at once
|
|
-- works in Windows and in Linux
|
|
console.do_file(filename)
|
|
end
|
|
|
|
function console.prompt:k_any(key)
|
|
if (key == iup.K_CR) then -- Enter executes the string
|
|
console.do_string(self.value)
|
|
self.value = ""
|
|
end
|
|
if (key == iup.K_ESC) then -- Esc clears console.prompt
|
|
self.value = ""
|
|
end
|
|
if (key == iup.K_cO) then -- Ctrl+O selects a file and execute it
|
|
console.open_file()
|
|
end
|
|
if (key == iup.K_cX) then -- Ctrl+X exits the console
|
|
console.dialog:close_cb()
|
|
end
|
|
if (key == iup.K_cDEL) then -- Ctrl+Del clears console.output
|
|
console.output.value = ""
|
|
end
|
|
if (key == iup.K_UP) then -- Up Arrow - shows the previous command in history
|
|
console.prev_command()
|
|
end
|
|
if (key == iup.K_DOWN) then -- Down Arrow - shows the next command in history
|
|
console.next_command()
|
|
end
|
|
end
|
|
|
|
console.dialog = iup.dialog
|
|
{
|
|
iup.vbox
|
|
{
|
|
iup.frame
|
|
{
|
|
iup.hbox -- use it to inherit margins
|
|
{
|
|
console.prompt,
|
|
},
|
|
title = "Command:",
|
|
},
|
|
iup.frame
|
|
{
|
|
iup.hbox -- use it to inherit margins
|
|
{
|
|
console.output
|
|
},
|
|
title = "Output:",
|
|
},
|
|
margin = "5x5",
|
|
gap = "5",
|
|
},
|
|
title="Lua Console",
|
|
size="250x180", -- initial size
|
|
icon=0, -- use the Lua icon from the executable in Windows
|
|
}
|
|
|
|
function console.dialog:close_cb()
|
|
print = console.orig_print -- restore print and io.write
|
|
io.write = console.orig_write
|
|
iup.ExitLoop() -- should be removed if used inside a bigger application
|
|
console.dialog:destroy()
|
|
return iup.IGNORE
|
|
end
|
|
|
|
function console.version_info()
|
|
print(_VERSION, _COPYRIGHT) -- _COPYRIGHT does not exists by default, but it could...
|
|
|
|
print("IUP " .. iup._VERSION .. " " .. iup._COPYRIGHT)
|
|
print(" System: " .. iup.GetGlobal("SYSTEM"))
|
|
print(" System Version: " .. iup.GetGlobal("SYSTEMVERSION"))
|
|
|
|
local mot = iup.GetGlobal("MOTIFVERSION")
|
|
if (mot) then print(" Motif Version: ", mot) end
|
|
|
|
local gtk = iup.GetGlobal("GTKVERSION")
|
|
if (gtk) then print(" GTK Version: ", gtk) end
|
|
end
|
|
|
|
console.dialog:show()
|
|
console.dialog.size = nil -- reset initial size, allow resize to smaller values
|
|
iup.SetFocus(console.prompt)
|
|
|
|
console.version_info()
|
|
|
|
if (iup.MainLoopLevel() == 0) then
|
|
iup.MainLoop()
|
|
end
|