335 lines
9.5 KiB
Lua
335 lines
9.5 KiB
Lua
|
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
|