117 lines
3.8 KiB
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;
|
|
|