From e10cc30820bf248da3c4ec782f25fee7e50f9ab2 Mon Sep 17 00:00:00 2001
From: "Squishy (C6H12O6+NaCl+H2O)"
<106439598+SweetSea-ButImNotSweet@users.noreply.github.com>
Date: Sat, 18 May 2024 16:49:12 +0700
Subject: [PATCH] Update button module
---
libs/simple-button.lua | 196 ++++++++++++++++-------------------------
1 file changed, 75 insertions(+), 121 deletions(-)
diff --git a/libs/simple-button.lua b/libs/simple-button.lua
index 8b969e2..a13eb8e 100644
--- a/libs/simple-button.lua
+++ b/libs/simple-button.lua
@@ -1,4 +1,20 @@
-local NULL = function () end
+local NULL = function() end
+local function checkColorTableValidation(C)
+ if C then
+ if type(C) == "table" then
+ if #C == 3 or #C == 4 then
+ for _, v in pairs(C) do
+ if type(v) ~= "number" or v<0 or v>1 then return false end
+ end
+ else
+ return false
+ end
+ else
+ return false
+ end
+ end
+ return true
+end
---@class BUTTON.button
---@field name string
@@ -6,24 +22,24 @@ local NULL = function () end
---@field y number
---@field w number
---@field h number
+---@field r number # Round corner
---
----@field borderWidth? number
----@field borderJoin? "bevel"|"milter"|"none"
----@field borderStyle? "rough"|"smooth"
+---@field borderWidth number
+---@field borderJoin "bevel"|"miter"|"none"
+---@field borderStyle "rough"|"smooth"
---
----@field font? love.Font
+---@field font love.Font
---
----@field codeWhenPressed? function
----@field codeWhenReleased? function
----@field drawingTextFunc? function
+---@field codeWhenPressed function
+---@field codeWhenReleased function
---
---@field _hovering? boolean
---
----@field draw? function
----@field update? function
+---@field draw function
+---@field update function
local button = {
name = "NEW BUTTON",
- x = 0, y = 0, w = 0, h = 0,
+ x = 0, y = 0, w = 1, h = 1, r = 0,
backgroundColor = {0,0,0,0},
hoverColor = {1,1,1,0.5},
@@ -36,34 +52,30 @@ local button = {
borderJoin = "none",
borderStyle = "smooth",
- drawingBackgroundFunc = function(self)
- love.graphics.setLineWidth(self.borderWidth)
- love.graphics.setLineStyle(self.borderStyle)
- love.graphics.setLineJoin(self.borderJoin)
-
- love.graphics.setColor(unpack(self.backgroundColor))
- love.graphics.rectangle('fill', self.x, self.y, self.w, self.h)
-
- if self._hovering then
- love.graphics.setColor(unpack(self.hoverColor))
- love.graphics.rectangle('fill', self.x, self.y, self.w, self.h)
- end
-
- love.graphics.setColor(unpack(self.borderColor))
- love.graphics.rectangle('line', self.x, self.y, self.w, self.h)
- end,
- drawingTextFunc = function(self)
- love.graphics.setFont(self.font)
- love.graphics.printf(self.name, self.x, self.y + (self.h * 0.25), self.w, "center")
- end,
codeWhenPressed = NULL,
codeWhenReleased = NULL,
_hovering = false
}; button.__index = button
function button:draw()
- self:drawingBackgroundFunc()
- self:drawingTextFunc()
+ love.graphics.setLineWidth(self.borderWidth)
+ love.graphics.setLineStyle(self.borderStyle)
+ love.graphics.setLineJoin(self.borderJoin)
+
+ love.graphics.setColor(self.backgroundColor)
+ love.graphics.rectangle('fill', self.x, self.y, self.w, self.h, self.r)
+
+ if self._hovering then
+ love.graphics.setColor(self.hoverColor)
+ love.graphics.rectangle('fill', self.x, self.y, self.w, self.h, self.r)
+ end
+
+ love.graphics.setColor(self.textColor)
+ love.graphics.setFont(self.font)
+ love.graphics.printf(self.name, self.x, self.y + (self.h * 0.25), self.w, "center")
+
+ love.graphics.setColor(self.borderColor)
+ love.graphics.rectangle('line', self.x, self.y, self.w, self.h, self.r)
end
function button:isHovering(x,y)
if
@@ -99,107 +111,53 @@ local BUTTON = {}
function BUTTON.checkDataValidation(D)
assert(type(D.name) == "string", "[name] is missing or not valid")
- assert(type(D.x) == "number" and D.x > 0, "[x] must be a positive integer")
- assert(type(D.y) == "number" and D.y > 0, "[y] 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((type(D.borderWidth) == "number" and D.borderWidth > 0) or D.drawingTextFunc == nil, "[borderWidth] must be a postive integer")
- assert(table.contains({"bevel", "milter", "none"}, D.borderJoin) or D.borderJoin == nil, "[borderJoin] must be 'bevel', 'milter' 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")
+ assert(table.contains({"bevel", "miter", "none"}, D.borderJoin) or D.borderJoin == nil, "[borderJoin] must be 'bevel', 'miter' or 'none")
assert(table.contains({"rough", "smooth"}, D.borderStyle) or D.borderStyle == nil, "[borderStyle] must be 'rough' or 'smooth'")
assert((D.font and D.font.typeOf and D.font:typeOf("Font")) or D.font == nil, "[font] must be love.Font")
- local red_flag = false
- if D.backgroundColor then
- if type(D.backgroundColor) == "table" then
- if #D.backgroundColor == 3 or #D.backgroundColor == 4 then
- for _, v in pairs(D.backgroundColor) do
- if type(v) ~= "number" or v<0 or v>1 then red_flag = true end
- end
- else
- red_flag = true
- end
- else
- red_flag = true
- end
- end
- if red_flag then error("[backgroundColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1") end
-
- if D.hoverColor then
- if type(D.hoverColor) == "table" then
- if #D.hoverColor == 3 or #D.hoverColor == 4 then
- for _, v in pairs(D.hoverColor) do
- if type(v) ~= "number" or v<0 or v>1 then red_flag = true end
- end
- else
- red_flag = true
- end
- else
- red_flag = true
- end
- end
- if red_flag then error("[hoverColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1") end
-
- if D.borderColor then
- if type(D.borderColor) == "table" then
- if #D.borderColor == 3 or #D.borderColor == 4 then
- for _, v in pairs(D.borderColor) do
- if type(v) ~= "number" or v<0 or v>1 then red_flag = true end
- end
- else
- red_flag = true
- end
- else
- red_flag = true
- end
- end
- if red_flag then error("[borderColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1") end
-
- if D.textColor then
- if type(D.textColor) == "table" then
- if #D.textColor == 3 or #D.textColor == 4 then
- for _, v in pairs(D.textColor) do
- if type(v) ~= "number" or v<0 or v>1 then red_flag = true end
- end
- else
- red_flag = true
- end
- else
- red_flag = true
- end
- end
- if red_flag then error("[textColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1") end
+ assert(checkColorTableValidation(D.backgroundColor), "[backgroundColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1")
+ assert(checkColorTableValidation(D.hoverColor), "[hoverColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1")
+ assert(checkColorTableValidation(D.borderColor), "[borderColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1")
+ assert(checkColorTableValidation(D.textColor), "[textColor] must be a table with r, g, b (, a) values, all of them must be integers between 0 and 1")
assert(type(D.codeWhenPressed) == "function" or D.codeWhenPressed == nil, "[codeWhenPressed] must be a function or nil")
assert(type(D.codeWhenReleased) == "function" or D.codeWhenReleased == nil, "[codeWhenReleased] must be a function or nil")
- assert(type(D.drawingTextFunc) == "function" or D.drawingTextFunc == nil, "[drawingTextFunc] must be a function or nil")
+ assert(type(D.drawingButtonFunc) == "function" or D.drawingButtonFunc == nil, "[drawingButtonFunc] must be a function or nil")
end
---@class BUTTON.newData
----@field name string # Name of the button, will be shown
----@field x number
----@field y number
----@field w number
----@field h number
+---@field name? string # Name of the button, will be used to show
+---@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)
+---@field h? number # Position of the button (x, y, w, h)
+---@field r? number # Radius corner, cannot larger than half of button's width and half of button's height
---
---@field borderWidth? number|1 # Line width will be used to draw button
----@field borderJoin? "bevel"|"milter"|"none"
+---@field borderJoin? "bevel"|"miter"|"none"
---@field borderStyle? "rough"|"smooth"
---
---@field font? love.Font
---
---@field backgroundColor? table<[r,g,b,a]>
----@field hoverColor? table<[r,g,b,a]>
----@field borderColor? table<[r,g,b,a]>
---@field textColor? table<[r,g,b,a]>
+---@field borderColor? table<[r,g,b,a]>
+---@field hoverColor? table<[r,g,b,a]>
---
----@field codeWhenPressed? function|nil # Code will be execute when pressed
----@field codeWhenReleased? function|nil # Code will be execute when released
----@field drawingTextFunc? function|defaultDrawingTextFunc
+---@field codeWhenPressed? function| # Code will be execute when pressed
+---@field codeWhenReleased? function| # Code will be execute when released
+---@field drawingButtonFunc? function| # The function is used to draw text
You can override the default one if you feel the default text drawing function is not suitable for you
---@param D BUTTON.newData
---@return BUTTON.button
----Create a new button, provide you a table with 2 functions inside: draw and update
+---Create a new button, provide you a table with 4 functions inside: draw and update, press and release
---You need to put them into intended callbacks :)
function BUTTON.new(D)
BUTTON.checkDataValidation(D)
@@ -209,6 +167,7 @@ function BUTTON.new(D)
y = D.y,
w = D.w,
h = D.h,
+ r = D.r,
borderWidth = D.borderWidth,
borderJoin = D.borderJoin,
@@ -216,24 +175,19 @@ function BUTTON.new(D)
backgroundColor = D.backgroundColor,
hoverColor = D.hoverColor,
- borderColor = D.borderColor,
textColor = D.textColor,
+ borderColor = D.borderColor,
- codeWhenPressed = D.codeWhenPressed,
- codeWhenReleased = D.codeWhenReleased,
- drawingTextFunc = D.drawingTextFunc,
+ codeWhenPressed = D.codeWhenPressed,
+ codeWhenReleased = D.codeWhenReleased,
+ drawingButtonFunc = D.drawingButtonFunc,
}, button)
end
---- Set the default funciton used to drawing text, will be passed name, x, y, w and h
-function BUTTON.setDefaultDrawingTextFunction(f)
- assert(type(f) == "function", "[f] must be a function!")
- button.drawingTextFunc = f
-end
-
---@param D BUTTON.newData
function BUTTON.setDefaultOption(D)
- BUTTON.checkDataValidation(D)
+ ---@diagnostic disable-next-line: param-type-mismatch
+ BUTTON.checkDataValidation(setmetatable(D, button))
for k, v in pairs(D) do
if button[k] ~= nil then
button[k] = v