initial release
This commit is contained in:
186
cosmic rage/lua/gauge.lua
Normal file
186
cosmic rage/lua/gauge.lua
Normal file
@@ -0,0 +1,186 @@
|
||||
--[[
|
||||
|
||||
Function to draw a gauge (health bar).
|
||||
|
||||
You specify the starting point, width, and height.
|
||||
Also the name to show for the mouse-over window (eg. "HP).
|
||||
|
||||
Author: Nick Gammon
|
||||
Date: 14 February 2010
|
||||
|
||||
--]]
|
||||
|
||||
function gauge (win, -- miniwindow ID to draw in
|
||||
name, -- string, eg: "HP"
|
||||
current, max, -- current and max value (eg. 50, 100)
|
||||
-- if max is nil, then current is a percentage
|
||||
left, top, width, height, -- where to put it inside the window
|
||||
fg_colour, bg_colour, -- colour for bar, colour for unfilled part
|
||||
ticks, tick_colour, -- number of ticks to draw, and in what colour
|
||||
frame_colour, -- colour for frame around bar
|
||||
shadow_colour, -- colour for shadow, nil for no shadow
|
||||
no_gradient) -- don't use the gradient fill effect
|
||||
|
||||
local Fraction
|
||||
|
||||
if not current then
|
||||
return
|
||||
end -- if
|
||||
|
||||
-- max == nil, means current is a percentage
|
||||
if max then
|
||||
if max <= 0 then
|
||||
return
|
||||
end -- no divide by zero
|
||||
|
||||
Fraction = current / max
|
||||
else
|
||||
Fraction = current / 100
|
||||
end -- if
|
||||
|
||||
-- fraction in range 0 to 1
|
||||
Fraction = math.min (math.max (Fraction, 0), 1)
|
||||
|
||||
-- set up some defaults
|
||||
height = height or 15
|
||||
fg_colour = fg_colour or ColourNameToRGB "mediumblue"
|
||||
bg_colour = bg_colour or ColourNameToRGB "rosybrown"
|
||||
ticks = ticks or 5
|
||||
tick_colour = tick_colour or ColourNameToRGB "silver"
|
||||
frame_colour = frame_colour or ColourNameToRGB "lightgrey"
|
||||
|
||||
-- shadow
|
||||
if shadow_colour then
|
||||
WindowRectOp (win, miniwin.rect_fill, left + 2, top + 2, left + width + 2, top + height + 2, shadow_colour)
|
||||
end -- if
|
||||
|
||||
-- background colour - for un-filled part
|
||||
WindowRectOp (win, miniwin.rect_fill, left, top, left + width, top + height, bg_colour) -- fill entire box
|
||||
|
||||
-- how big filled part is
|
||||
local gauge_width = (width - 2) * Fraction
|
||||
|
||||
-- box size must be > 0 or WindowGradient fills the whole thing
|
||||
if math.floor (gauge_width) > 0 then
|
||||
|
||||
if no_gradient then
|
||||
WindowRectOp (win, miniwin.rect_fill, left+1, top, left+1+gauge_width, top+height, fg_colour)
|
||||
else
|
||||
-- top half
|
||||
WindowGradient (win, left, top,
|
||||
left + gauge_width, top + height / 2,
|
||||
0x000000, -- black
|
||||
fg_colour, 2) -- vertical top to bottom
|
||||
|
||||
-- bottom half
|
||||
WindowGradient (win, left, top + height / 2,
|
||||
left + gauge_width, top + height-1,
|
||||
fg_colour,
|
||||
0x000000, -- black
|
||||
2) -- vertical top to bottom
|
||||
end
|
||||
|
||||
end -- non-zero
|
||||
|
||||
-- draw tick marks if wanted
|
||||
if ticks > 0 then
|
||||
|
||||
-- show ticks (if there are 5 ticks there are 6 gaps)
|
||||
local ticks_at = width / (ticks + 1)
|
||||
|
||||
-- ticks
|
||||
for i = 1, ticks do
|
||||
WindowLine (win, left + (i * ticks_at), top,
|
||||
left + (i * ticks_at), top + height,
|
||||
tick_colour, 0, 1)
|
||||
end -- for
|
||||
|
||||
end -- ticks wanted
|
||||
|
||||
-- draw a box around it (frame)
|
||||
WindowRectOp (win, miniwin.rect_frame, left, top, left + width, top + height, frame_colour)
|
||||
|
||||
if name and #name > 0 then
|
||||
-- mouse-over information: add hotspot
|
||||
WindowAddHotspot (win, name, left, top, left + width, top + height,
|
||||
"", "", "", "", "", "", 0, 0)
|
||||
|
||||
-- store numeric values in case they mouse over it
|
||||
if max then
|
||||
WindowHotspotTooltip(win, name, string.format ("%s\t%i / %i (%i%%)",
|
||||
name, current, max, Fraction * 100) )
|
||||
else
|
||||
WindowHotspotTooltip(win, name, string.format ("%s\t(%i%%)",
|
||||
name, Fraction * 100) )
|
||||
end -- if
|
||||
|
||||
end -- hotspot wanted
|
||||
|
||||
end -- function gauge
|
||||
|
||||
-- find which element in an array has the largest text size
|
||||
function max_text_width (win, font_id, t, utf8)
|
||||
local max = 0
|
||||
for _, s in ipairs (t) do
|
||||
max = math.max (max, WindowTextWidth (win, font_id, s, utf8))
|
||||
end -- for each item
|
||||
return max
|
||||
end -- max_text_width
|
||||
|
||||
-- get font from preferred font list
|
||||
function get_preferred_font (t)
|
||||
local fonts = utils.getfontfamilies ()
|
||||
|
||||
-- convert to upper-case
|
||||
local f2 = {}
|
||||
for k in pairs (fonts) do
|
||||
f2 [k:upper ()] = true
|
||||
end -- for
|
||||
|
||||
for _, s in ipairs (t) do
|
||||
if f2 [s:upper ()] then
|
||||
return s
|
||||
end -- if
|
||||
end -- for each item
|
||||
|
||||
return "Courier"
|
||||
end -- get_preferred_font
|
||||
|
||||
function capitalize (x)
|
||||
return string.upper (string.sub(x, 1, 1)) .. string.lower (string.sub(x, 2))
|
||||
end -- capitalize
|
||||
|
||||
function draw_3d_box (win, left, top, width, height)
|
||||
local right = left + width
|
||||
local bottom = top + height
|
||||
|
||||
WindowCircleOp (win, miniwin.circle_round_rectangle, left, top, right, bottom, 0x505050, 0, 3, 0, 1) -- dark grey border (3 pixels)
|
||||
WindowCircleOp (win, miniwin.circle_round_rectangle, left + 1, top + 1, right - 1, bottom - 1, 0x7C7C7C, 0, 1, 0, 1) -- lighter inner border
|
||||
WindowCircleOp (win, miniwin.circle_round_rectangle, left + 2, top + 2, right - 2, bottom - 2, 0x000000, 0, 1, 0, 1) -- black inside that
|
||||
WindowLine (win, left + 1, top + 1, right - 1, top + 1, 0xC2C2C2, 0, 1) -- light top edge
|
||||
WindowLine (win, left + 1, top + 1, left + 1, bottom - 1, 0xC2C2C2, 0, 1) -- light left edge (for 3D look)
|
||||
end -- draw_3d_box
|
||||
|
||||
function draw_text_box (win, font, left, top, text, utf8, text_colour, fill_colour, border_colour)
|
||||
local width = WindowTextWidth (win, font, text, utf8)
|
||||
local font_height = WindowFontInfo (win, font, 1)
|
||||
|
||||
WindowRectOp (win, miniwin.rect_fill, left - 3, top, left + width + 3, top + font_height + 4, fill_colour) -- fill
|
||||
WindowText (win, font, text, left, top + 2, 0, 0, text_colour, utf8) -- draw text
|
||||
WindowRectOp (win, miniwin.rect_frame, left - 3, top, left + width + 3, top + font_height + 4, border_colour) -- border
|
||||
return width
|
||||
end -- draw_text_box
|
||||
|
||||
-- text with a black outline
|
||||
function outlined_text(win, font, text, startx, starty, endx, endy, color, utf8)
|
||||
WindowText(win, font, text, startx-1, starty-1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx-1, starty, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx-1, starty+1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx, starty-1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx, starty+1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx+1, starty-1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx+1, starty, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx+1, starty+1, endx, endy, 0x000000, utf8)
|
||||
WindowText(win, font, text, startx, starty, endx, endy, color, utf8)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user