fceux/output/luaScripts/x_interface.lua

117 lines
3.8 KiB
Lua

-- ****************************************************************************
-- *
-- * FCEUX Lua GUI tools
-- *
-- ****************************************************************************
control = {};
last = {};
inpt = { xmouse = 0, ymouse = 0 };
-- ****************************************************************************
-- * input.update()
-- * Updates input changes and calculates mouse movement averages.
-- ****************************************************************************
function input.update()
last = table.clone(inpt);
inpt = input.get();
end;
-- ****************************************************************************
-- * control.button( xpos, ypos, width, height, t )
-- * Draws a button that can have some effect. Not quite implemented yet!
-- * width/height are for the outline and more or less have to be set manually.
-- * since height is fixed, though, it's always a multiple.
-- * c disables hitbox checking and sets the outline to that color
-- ****************************************************************************
function control.button(x, y, w, h, t, c, sc)
local h = h * 8;
filledbox( x , y , x + w , y + h , "#000000");
text(x - 1, y - 1, t); -- Yeah, for some reason...
if c and not sc then
box( x - 1, y - 1, x + w + 1, y + h + 1, c);
elseif c then
return (hitbox(inpt['xmouse'], inpt['ymouse'], inpt['xmouse'], inpt['ymouse'], x - 1, y - 1, x + w + 1, y + h + 1, c, c) and (inpt['leftclick'] and not last['leftclick']));
elseif hitbox(inpt['xmouse'], inpt['ymouse'], inpt['xmouse'], inpt['ymouse'], x - 1, y - 1, x + w + 1, y + h + 1, "#6666ff", "#0000ff") and (inpt['leftclick'] and not last['leftclick']) then
box(x - 1, y - 1, x + w + 1, y + h + 1, "#ffffff"); -- for white-flash highlighting
return true;
end;
return false;
end;
-- ****************************************************************************
-- * control.showmenu( xpos, ypos, menutable )
-- * Displays the given menu and takes action on it. Usually.
-- ****************************************************************************
function control.showmenu(x, y, menuinfo)
if menuinfo['life'] > 0 then
local temp = 0;
local i = 0;
local yscale = 11 - math.max(0, menuinfo['life'] - 60);
-- text(x, y - 11, string.format("Life: %3d", menuinfo['life']));
for k, v in spairs(menuinfo['menu']) do
local buttoncolor = nil;
if v['menu'] and v['life'] > 0 then
buttoncolor = "#ffffff";
end;
buttonclicked = control.button(x, y + yscale * i, menuinfo['width'], 1, v['label'], buttoncolor, true);
if v['menu'] then
text(x + menuinfo['width'] - 6, y + yscale * i - 1, ">");
end;
if v['marked'] == 1 then
text(x, y + yscale * i - 1, ">");
end;
-- is a selection, not a submenu
if buttonclicked and v['action'] then
v['action'](v['args']);
menuinfo['life'] = 0;
return -1;
-- a submenu
elseif buttonclicked and v['menu'] then
v['life'] = 70;
end;
if v['menu'] and v['life'] > 0 and temp >= 0 then
temp2 = control.showmenu(x + menuinfo['width'] + 3, y + yscale * i, v);
if temp2 >= 0 then
temp = math.max(temp, temp2);
else
temp = temp2;
end;
end;
i = i + 1;
end;
if temp >= 0 and hitbox(inpt['xmouse'], inpt['ymouse'], inpt['xmouse'], inpt['ymouse'], x, y, x + menuinfo['width'] + 2, y + i * yscale) then
menuinfo['life'] = math.max(menuinfo['life'] - 1, 60);
elseif temp == -1 or (menuinfo['life'] < 60 and inpt['leftclick'] and not last['leftclick']) then
menuinfo['life'] = 0;
return 0;
else
menuinfo['life'] = math.max(math.min(60, temp), menuinfo['life'] - 1);
end;
end;
return menuinfo['life'];
end;