iup-stack/iup/srcluaconsole/console5.lua

335 lines
9.5 KiB
Lua
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
require"iuplua"
-- Utilities
iup_console = {}
function iup_console.concat(str, info)
return str .. info .. "\n"
end
function iup_console.print_version_info()
iup_console.clear()
local str = ""
str = iup_console.concat(str, _COPYRIGHT) -- Only available in IupLuaConsole
if (im) then str = iup_console.concat(str, "IM " .. im._VERSION .. " " .. im._COPYRIGHT) end
if (cd) then str = iup_console.concat(str, "CD " .. cd._VERSION .. " " .. cd._COPYRIGHT) end
str = iup_console.concat(str, "IUP " .. iup._VERSION .. " " .. iup._COPYRIGHT)
str = iup_console.concat(str, "")
str = iup_console.concat(str, "IUP Info")
str = iup_console.concat(str, " System: " .. iup.GetGlobal("SYSTEM"))
str = iup_console.concat(str, " System Version: " .. iup.GetGlobal("SYSTEMVERSION"))
local mot = iup.GetGlobal("MOTIFVERSION")
if (mot) then str = iup_console.concat(str, " Motif Version: " .. mot) end
local gtk = iup.GetGlobal("GTKVERSION")
if (gtk) then str = iup_console.concat(str, " GTK Version: " .. gtk) end
str = iup_console.concat(str, " Screen Size: " .. iup.GetGlobal("SCREENSIZE"))
str = iup_console.concat(str, " Screen Depth: " .. iup.GetGlobal("SCREENDEPTH"))
if (iup.GL_VENDOR) then str = iup_console.concat(str, " OpenGL Vendor: " .. iup.GL_VENDOR) end
if (iup.GL_RENDERER) then str = iup_console.concat(str, " OpenGL Renderer: " .. iup.GL_RENDERER) end
if (iup.GL_VERSION) then str = iup_console.concat(str, " OpenGL Version: " .. iup.GL_VERSION) end
print(str)
end
-- Console Dialog
iup_console.current_filename = nil -- Last file open
iup_console.mlCode = iup.multiline{expand="YES", visiblecolumns=60, visiblelines=20, font="Courier, 11"}
iup_console.mlConsole = iup.multiline{expand="YES", visiblecolumns=60, visiblelines=10, font="Courier, 11", readonly="Yes", bgcolor = "248 248 248"}
iup_console.txtCommand = iup.text{expand="HORIZONTAL", visiblecolumns=60, font="Courier, 11" }
iup_console.lblPosition = iup.label{title="0:0", expand="HORIZONTAL", alignment = "ARIGHT"}
iup_console.lblFileName = iup.label{title="", expand="HORIZONTAL"}
print_old = print
function print(...)
local param = {...}
local str = ""
if (#param == 0) then
str = "nil"
else
for i, k in ipairs(param) do
if (i > 1) then str = str .."\t" end
str = str .. tostring(k)
end
end
iup_console.mlConsole.append = str
iup_console.mlConsole.scrollto = "99999999:1"
end
write_old = io.write
io.write = function(...)
iup_console.mlConsole.appendnewline="No"
print(...)
iup_console.mlConsole.appendnewline="Yes"
end
function iup_console.value_to_string(v)
if (type(v) == "string") then
return "\"" .. v .. "\""
else
return tostring(v)
end
end
function iup_console.printtable(t)
local str = "{\n"
local tmp = {}
for i, k in ipairs(t) do
str = str .. " "..iup_console.value_to_string(k)..",\n"
tmp[i] = true
end
for i, k in pairs(t) do
if (not tmp[i]) then
str = str .. " "..tostring(i).. " = "..iup_console.value_to_string(k)..",\n"
end
end
str = str .. "}"
print(str)
end
function iup_console.printvalue(v)
if (type(v) == "table") then
iup_console.printtable(v)
else
print(iup_console.value_to_string(v))
end
end
if (not loadstring) then
loadstring = load
end
iup_console.cmd_history = {
}
function iup_console.txtCommand:k_any(k)
if (k == iup.K_CR) then
print("> " .. iup_console.txtCommand.value)
table.insert(iup_console.cmd_history, iup_console.txtCommand.value)
iup_console.cmd_history.current = #iup_console.cmd_history
local cmd, msg = loadstring(iup_console.txtCommand.value)
if (not cmd) then
cmd = loadstring("return " .. iup_console.txtCommand.value)
end
if (not cmd) then
print("Error: ".. msg) -- the original error message
else
local result = {pcall(cmd)}
if result[1] then
for i = 2, #result do
iup_console.printvalue(result[i])
end
else
print("Error: ".. result[2])
end
end
iup_console.txtCommand.value = ""
elseif (k == iup.K_UP) then
if (iup_console.cmd_history.current) then
if (iup_console.cmd_history.current > 0) then
iup_console.txtCommand.value = iup_console.cmd_history[iup_console.cmd_history.current]
iup_console.cmd_history.current = iup_console.cmd_history.current - 1
return iup.IGNORE
end
end
elseif (k == iup.K_DOWN) then
if (iup_console.cmd_history.current) then
if (iup_console.cmd_history.current == 0) then iup_console.cmd_history.current = 1 end -- avoid repeating the first item
if (iup_console.cmd_history.current < #iup_console.cmd_history) then
iup_console.cmd_history.current = iup_console.cmd_history.current + 1
iup_console.txtCommand.value = iup_console.cmd_history[iup_console.cmd_history.current]
return iup.IGNORE
end
end
end
end
function iup_console.mlCode:caret_cb(lin, col)
iup_console.lblPosition.title = lin..":"..col
end
function iup_console.clear()
iup_console.mlCode.value=''
iup_console.lblFileName.title = ''
iup_console.current_filename = nil
end
iup_console.butExecute = iup.button{size="50x15", title="Execute (F5)", action="iup.dostring(iup_console.mlCode.value)"}
iup_console.butClearCommands = iup.button{size="50x15", title="Clear", action=iup_console.clear}
iup_console.butLoadFile = iup.button{size="50x15", title="Load..."}
iup_console.butSaveasFile = iup.button{size="50x15", title="Save As..."}
iup_console.butSaveFile = iup.button{size="50x15", title="Save (Ctrl+S)"}
iup_console.butExit = iup.button{size="50x15", title="Exit (Esc)", action="iup.ExitLoop()"}
function iup_console.SaveFile(filename)
local newfile = io.open(filename, "w+")
if (newfile) then
newfile:write(iup_console.mlCode.value)
newfile:close(newfile)
print("FileSave:\n "..filename)
iup_console.current_filename = filename
iup_console.lblFileName.title = iup_console.current_filename
else
error("Cannot Save file:\n "..filename)
end
end
function iup_console.butSaveFile:action()
if (iup_console.current_filename == nil) then
iup_console.butSaveasFile:action()
else
iup_console.SaveFile(iup_console.current_filename)
end
end
function iup_console.butSaveasFile:action()
local fd = iup.filedlg{
dialogtype="SAVE",
nochangedir="NO",
directory=iup_console.last_directory,
extfilter="Lua files|*.lua|All Files|*.*|",
allownew="yes",
}
fd:popup(iup.CENTERPARENT, iup.CENTERPARENT)
local status = fd.status
local filename = fd.value
iup_console.last_directory = fd.directory
fd:destroy()
if status ~= "-1" then
iup_console.SaveFile(filename)
end
end
function iup_console.LoadFile(filename)
local newfile = io.open (filename, "r")
if (newfile == nil) then
error ("Cannot load file:\n "..filename)
else
iup_console.mlCode.value = newfile:read("*a")
newfile:close (newfile)
if IndentationLib then
IndentationLib.textboxRecolor(iup_console.mlCode)
end
iup_console.current_filename = filename
iup_console.lblFileName.title = iup_console.current_filename
end
end
function iup_console.butLoadFile:action()
local fd=iup.filedlg{
dialogtype="OPEN",
nochangedir="NO",
parentdialog = iup_console.dlgMain,
directory=iup_console.last_directory,
extfilter="Lua files|*.lua|All Files|*.*|",
allownew="NO"
}
fd:popup(iup.CENTERPARENT, iup.CENTERPARENT)
local status = fd.status
local filename = fd.value
iup_console.last_directory = fd.directory
fd:destroy()
if (status == "0") then
print("FileOpen:\n "..filename)
iup_console.LoadFile(filename)
end
end
iup_console.vbxConsole = iup.hbox {
iup.vbox{
iup.label {title = "Filename: "},
iup_console.butExecute,
iup_console.butClearCommands,
iup_console.butLoadFile,
iup_console.butSaveFile,
iup_console.butSaveasFile,
iup_console.butExit,
margin="0x0",
},
iup.vbox{
iup_console.lblFileName,
iup_console.mlCode,
iup.hbox { iup.label{title="Command Line:"}, iup_console.lblPosition, margin = "0x0", gap = 0},
iup_console.txtCommand,
iup_console.mlConsole,
alignment = "ARIGHT",
margin="0x0",
},
alignment="ATOP",
margin="5x5",
gap="10",
}
-- Main Dialog Definition.
iup_console.dlgMain = iup.dialog{
iup_console.vbxConsole,
title="IupLua Console",
dragdrop = "YES",
defaultesc=iup_console.butExit,
startfocus=iup_console.mlCode,
close_cb = "iup.ExitLoop()",
k_any = function(self, k)
if (k == iup.K_F5) then
iup.dostring(iup_console.mlCode.value)
elseif (k == iup.K_cS) then
iup_console.butSaveFile:action()
end
end,
}
function iup_console.dlgMain:dropfiles_cb(filename, index, x, y)
if (index == 0) then
print("FileDropped:\n "..filename)
iup_console.LoadFile(filename)
end
end
function iup_console.mlCode:dropfiles_cb(filename, index, x, y)
if (index == 0) then
print("FileDropped:\n "..filename)
iup_console.LoadFile(filename)
end
end
if IndentationLib then
IndentationLib.enable(iup_console.mlCode)
end
-- Displays the Main Dialog
iup_console.dlgMain:show()
iup_console.print_version_info()
iup.SetGlobal("GLOBALLAYOUTDLGKEY", "Yes")
if (arg and arg[0]) then
local filename = arg[0]
print("FileCommandLine:\n "..filename)
iup_console.LoadFile(filename)
end
if (iup.MainLoopLevel()==0) then
iup.MainLoop()
iup_console.dlgMain:destroy()
if (im) then im.Close() end
if (cd) then cd.Close() end
iup.Close()
end