Create gui.lua
This commit is contained in:
parent
dd0ed9e86c
commit
60dda2ea29
1 changed files with 239 additions and 0 deletions
239
src/apis/gui.lua
Normal file
239
src/apis/gui.lua
Normal file
|
@ -0,0 +1,239 @@
|
|||
--[[GUI API BY MHIEKURU
|
||||
functions available
|
||||
|
||||
OBJECTS
|
||||
gui.background()
|
||||
gui.progressBar()
|
||||
gui.toggleButton()
|
||||
gui.pulseButton()
|
||||
|
||||
RENDER
|
||||
gui.render()
|
||||
]]
|
||||
--CORE FUNCTION--
|
||||
|
||||
local function convertArea( vertex )
|
||||
local xMax, yMax = term.getSize()
|
||||
--if vertex consist of two numbers, convert given as length and height, then set starting vertex to the current cursor position
|
||||
if type(vertex[1]) == 'number' and type(vertex[2]) == 'number' and vertex[3] == nil and vertex[4] == nil then
|
||||
local x, y = term.getCursorPos()
|
||||
if vertex[1] < 0 then
|
||||
vertex[3] = xMax+vertex[1]+1
|
||||
else
|
||||
vertex[3] = x-1+vertex[1]
|
||||
end
|
||||
if vertex[2] < 0 then
|
||||
vertex[4] = yMax+vertex[2]+1
|
||||
else
|
||||
vertex[4] = y-1+vertex[2]
|
||||
end
|
||||
vertex[1] = x
|
||||
vertex[2] = y
|
||||
--if vertex consist of four numbers, convert each number to its [maxAxis plus the negative vertex plus one] if the vertex is a negative value
|
||||
elseif type(vertex[1]) == 'number' and type(vertex[2]) == 'number' and type(vertex[3]) == 'number' and type(vertex[4]) == 'number' then
|
||||
if vertex[1] < 0 then
|
||||
vertex[1] = xMax+vertex[1]+1
|
||||
end
|
||||
if vertex[2] < 0 then
|
||||
vertex[2] = yMax+vertex[2]+1
|
||||
end
|
||||
if vertex[3] < 0 then
|
||||
vertex[3] = xMax+vertex[3]+1
|
||||
end
|
||||
if vertex[4] < 0 then
|
||||
vertex[4] = yMax+vertex[4]+1
|
||||
end
|
||||
end
|
||||
--switch vertex[1] and vertex[3] if vertex[1] is greater
|
||||
local placeHolderX, placeHolderY
|
||||
if vertex[3] < vertex[1] then
|
||||
placeHolderX = vertex[1]
|
||||
vertex[1] = vertex[3]
|
||||
vertex[3] = placeHolderX
|
||||
end
|
||||
--switch vertex[1] and vertex[3] if vertex[1] is greater
|
||||
if vertex[4] < vertex[2] then
|
||||
placeHolderY = vertex[2]
|
||||
vertex[2] = vertex[4]
|
||||
vertex[4] = placeHolderY
|
||||
end
|
||||
return vertex
|
||||
end
|
||||
|
||||
local function fill( vertex, color )
|
||||
term.setBackgroundColor( color )
|
||||
for i = vertex[2], vertex[4] do
|
||||
term.setCursorPos( vertex[1], i )
|
||||
write( string.rep( ' ', vertex[3] - vertex[1] + 1 ) )
|
||||
end
|
||||
end
|
||||
|
||||
function setCursorPos( vertex, string, position )
|
||||
if position == 'c' then
|
||||
term.setCursorPos( math.ceil( ( ( vertex[3] - vertex[1] + 1 - #string ) / 2 ) + vertex[1] ),
|
||||
math.ceil( ( math.floor(vertex[4]) + math.floor(vertex[2]) ) / 2 ) )
|
||||
elseif position == 'l' then
|
||||
term.setCursorPos( vertex[1], math.ceil( ( math.floor(vertex[4]) + math.floor(vertex[2]) ) / 2 ) )
|
||||
end
|
||||
end
|
||||
|
||||
--GUI LIBRARY--
|
||||
|
||||
background = function( color )
|
||||
return
|
||||
{
|
||||
type = 'background',
|
||||
color = color
|
||||
}
|
||||
end
|
||||
|
||||
progressBar = function( vertex, color, string )
|
||||
return
|
||||
{
|
||||
type = 'bar_percent',
|
||||
vertex = vertex,
|
||||
color = color,
|
||||
string = string,
|
||||
}
|
||||
end
|
||||
|
||||
toggleButton = function( vertex, color, string, guifunction )
|
||||
return
|
||||
{
|
||||
type = 'button_toggle',
|
||||
vertex = vertex,
|
||||
color = color,
|
||||
string = string,
|
||||
guifunction = guifunction,
|
||||
state = 1
|
||||
}
|
||||
end
|
||||
|
||||
pulseButton = function( vertex, color, string, guifunction )
|
||||
return
|
||||
{
|
||||
type = 'button_pulse',
|
||||
vertex = vertex,
|
||||
color = color,
|
||||
string = string,
|
||||
guifunction = guifunction,
|
||||
}
|
||||
end
|
||||
|
||||
render = function(gui)
|
||||
local counter = 0
|
||||
local counterEvent
|
||||
local refreshrate = 0
|
||||
os.startTimer(0)
|
||||
while true do
|
||||
if counter == 3 then
|
||||
if gui[counterEvent].guifunction then
|
||||
local startTime = os.clock()
|
||||
gui[counterEvent].guifunction()
|
||||
if os.clock() > startTime+refreshrate then
|
||||
os.startTimer(refreshrate)
|
||||
end
|
||||
end
|
||||
counter = 0
|
||||
elseif counter > 0 then
|
||||
counter = counter+1
|
||||
end
|
||||
--wait event
|
||||
local event, mbttn, crsrX, crsrY = os.pullEvent()
|
||||
--check and run functions
|
||||
if event == 'mouse_click' or event == 'monitor_touch' or event == 'mouse_drag' then
|
||||
local startTime = os.clock()
|
||||
for i = 1, #gui do
|
||||
if gui[i].type == 'button_toggle' or gui[i].type == 'button_pulse' then
|
||||
if crsrX >= gui[i].vertex[1] and crsrX <= gui[i].vertex[3] and crsrY >= gui[i].vertex[2] and crsrY <= gui[i].vertex[4] then
|
||||
if gui[i].type == 'button_toggle' then
|
||||
if gui[i].guifunction then
|
||||
gui[i].guifunction[gui[i].state]()
|
||||
end
|
||||
if mbttn == 1 then -- [+]
|
||||
if gui[i].state == #gui[i].color then --only when func activated
|
||||
gui[i].state = 1
|
||||
else
|
||||
gui[i].state = gui[i].state + 1
|
||||
end
|
||||
else -- [-]
|
||||
if gui[i].state == 1 then --only when func activated
|
||||
gui[i].state = #gui[i].color
|
||||
else
|
||||
gui[i].state = gui[i].state - 1
|
||||
end
|
||||
end
|
||||
elseif gui[i].type == 'button_pulse' then
|
||||
counter = 1
|
||||
counterEvent = i
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if os.clock() > startTime+refreshrate then
|
||||
os.startTimer(refreshrate)
|
||||
end
|
||||
elseif event == 'timer' then
|
||||
--render
|
||||
for i, v in ipairs(gui) do
|
||||
if gui[i].type == 'button_toggle' then
|
||||
gui[i].vertex = convertArea( gui[i].vertex )
|
||||
--renders button's background
|
||||
fill( gui[i].vertex, gui[i].color[gui[i].state] )
|
||||
--renders button's text
|
||||
setCursorPos( gui[i].vertex, gui[i].string[gui[i].state], 'c' )
|
||||
term.setTextColor( colors.white )
|
||||
write( gui[i].string[gui[i].state] )
|
||||
term.setCursorPos( gui[i].vertex[1], gui[i].vertex[4] + 2 )
|
||||
elseif gui[i].type == 'button_pulse' then
|
||||
gui[i].vertex = convertArea( gui[i].vertex )
|
||||
--renders button's background
|
||||
if counter == 0 then
|
||||
fill( gui[i].vertex, gui[i].color[1] )
|
||||
else
|
||||
fill( gui[i].vertex, gui[i].color[2] )
|
||||
end
|
||||
--renders button's text
|
||||
setCursorPos( gui[i].vertex, gui[i].string, 'c' )
|
||||
term.setTextColor( colors.white )
|
||||
write( gui[i].string )
|
||||
term.setCursorPos( gui[i].vertex[1], gui[i].vertex[4] + 2 )
|
||||
elseif gui[i].type == 'bar_percent' then
|
||||
if gui[i].string then
|
||||
local percent = gui[i].string()
|
||||
gui[i].vertex = convertArea( gui[i].vertex )
|
||||
if percent > 100 then percent = 100 end --limit percent to 100%
|
||||
--renders progress bar's background
|
||||
fill( {math.floor(((gui[i].vertex[3]-gui[i].vertex[1]+1)*percent/100)+gui[i].vertex[1]), gui[i].vertex[2], gui[i].vertex[3], gui[i].vertex[4]}, gui[i].color[1] )
|
||||
--renders progress bar's foreground
|
||||
fill( {gui[i].vertex[1], gui[i].vertex[2], math.floor(((gui[i].vertex[3]-gui[i].vertex[1]+1)*percent/100)+gui[i].vertex[1]-1), gui[i].vertex[4]}, gui[i].color[2] )
|
||||
--renders data to be displayed
|
||||
local perTab = {}
|
||||
for j = 1, #tostring( percent .. '%' ) do
|
||||
perTab[ j ] = tostring( percent .. '%' ):sub( j, j )
|
||||
end
|
||||
setCursorPos( gui[i].vertex, perTab, 'c' )
|
||||
for j = 1, #perTab do
|
||||
local perX, perY = term.getCursorPos()
|
||||
if perX <= math.floor(((gui[i].vertex[3]-gui[i].vertex[1]+1)*percent/100)+gui[i].vertex[1]-1) and perX >= gui[i].vertex[1] then
|
||||
term.setBackgroundColor(gui[i].color[2])
|
||||
term.setTextColor(gui[i].color[1])
|
||||
else
|
||||
term.setBackgroundColor(gui[i].color[1])
|
||||
term.setTextColor(gui[i].color[2])
|
||||
end
|
||||
write(perTab[j])
|
||||
end
|
||||
term.setCursorPos( gui[i].vertex[1], gui[i].vertex[4] + 2 )
|
||||
end
|
||||
elseif gui[i].type == 'background' then
|
||||
local x, y = term.getCursorPos()
|
||||
term.setBackgroundColor( gui[ i ].color )
|
||||
term.clear()
|
||||
term.setCursorPos( x, y )
|
||||
end
|
||||
end
|
||||
os.startTimer(refreshrate)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue