Update simple button module

This commit is contained in:
Squishy (C6H12O6+NaCl+H2O)
2024-05-19 22:22:45 +07:00
parent 542cdc6b3e
commit 769eae9fcf

View File

@@ -17,7 +17,9 @@ local function checkColorTableValidation(C)
end
---@class BUTTON.button
---@field name? string # Name of the button, will be used to show
---@field text? string # Name of the button, will be used to show
---@field textOrientation? "center"|"justify"|"left"|"right"
---
---@field x? number # Position of the button (x, y, w, h)
---@field y? number # Position of the button (x, y, w, h)
---@field w? number # Position of the button (x, y, w, h)
@@ -42,8 +44,8 @@ end
---@field draw? function
---@field update? function
local button = {
name = "NEW BUTTON",
x = 0, y = 0, w = 1, h = 1, r = 0,
textOrientation = "center",
r = 0,
backgroundColor = {0,0,0,0},
hoverColor = {1,1,1,0.5},
@@ -76,7 +78,15 @@ function button:draw()
love.graphics.setColor(self.textColor)
love.graphics.setFont(self.font)
love.graphics.printf(self.name, self.x, self.y + (self.h * 0.5) - (self.font:getHeight() * 0.5), self.w, "center")
local lineAmount
do
local _, t = self.font:getWrap(self.text, self.w)
lineAmount = #t
end
local textHeight = self.font:getHeight() * (lineAmount * 0.5)
local textPos = self.y + (self.h * 0.5) - textHeight
love.graphics.printf(self.text, self.x, textPos, self.w, self.textOrientation)
love.graphics.setColor(self.borderColor)
love.graphics.rectangle('line', self.x, self.y, self.w, self.h, self.r)
@@ -112,15 +122,16 @@ local BUTTON = {}
---@return nil
---Validate the provided data, will be called by ``BUTTON.new`` and ``BUTTON.setDefaultOption``<br>
---***WARNING! THIS FUNCTION WILL RAISE EXCEPTION IF DATA IS INVALID!***
function BUTTON.checkDataValidation(D, safe)
function BUTTON.checkDataValidation(D)
-- <SAFE TO IGNORE>
assert(type(D.name) == "string" or (safe and D.name == nil) == "string","[name] is missing, or you just passed an empty data?")
assert(type(D.text) == "string" == "string","[text] is missing, or you just passed an empty data?")
assert( type(D.x) == "number" or (safe and D.x == nil), "[x] must be a integer")
assert( type(D.y) == "number" or (safe and D.y == nil), "[y] must be a integer")
assert((type(D.w) == "number" and D.w > 0) or (safe and D.w == nil), "[w] must be a positive integer")
assert((type(D.h) == "number" and D.h > 0) or (safe and D.h == nil), "[h] must be a positive integer")
assert(type(D.x) == "number" , "[x] must be a integer")
assert(type(D.y) == "number" , "[y] must be a integer")
assert(type(D.w) == "number" and D.w > 0, "[w] must be a positive integer")
assert(type(D.h) == "number" and D.h > 0, "[h] must be a positive integer")
-- </>
assert(table.contains({"center","justify","left","right"}, D.textOrientation) or D.textOrientation == nil, "[borderJoin] must be 'bevel', 'miter' or 'none")
assert((type(D.r) == "number" and D.r >= 0 and D.r <= D.w * 0.5 and D.r <= D.h * 0.5) or D.r == nil, "[r] must be a positive integer and cannot larger than half of button's width and half of button's height")
assert((type(D.borderWidth) == "number" and D.borderWidth > 0) or D.borderWidth == nil, "[borderWidth] must be a postive integer")
@@ -139,7 +150,9 @@ function BUTTON.checkDataValidation(D, safe)
end
---@class BUTTON.newData
---@field name string # Name of the button, will be used to show
---@field text string # Name of the button, will be used to show
---@field textOrientation? "center"|"justify"|"left"|"right"
---
---@field x number # Position of the button (x, y, w, h)
---@field y number # Position of the button (x, y, w, h)
---@field w number # Position of the button (x, y, w, h)
@@ -169,8 +182,9 @@ end
---Create a new button, provide you a table with 4 functions inside: draw and update, press and release<br>
---You need to put them into intended callbacks :)
function BUTTON.new(D)
BUTTON.checkDataValidation(D)
return setmetatable(D, button)
local B = setmetatable(D, button)
BUTTON.checkDataValidation(B)
return B
end
---@param D BUTTON.button
@@ -180,7 +194,7 @@ function BUTTON.setDefaultOption(D)
if button[k] ~= nil then
button[k] = v
else
error("There is no "..k.." parameter in BUTTON!")
error("Parameter named ["..k.."] is not existed or cannot be set default value, in BUTTON!")
end
end
end