summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua')
-rw-r--r--Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua119
1 files changed, 119 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua b/Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua
new file mode 100644
index 0000000..98c52ef
--- /dev/null
+++ b/Data/BuiltIn/Libraries/addons/addons/bluguide/ui/buttons.lua
@@ -0,0 +1,119 @@
+local texts = require('texts')
+
+local buttons = {}
+local buttonlist = {}
+
+function buttons.new(label, settings)
+ label = label or ""
+ settings = settings or {}
+
+ settings.flags = settings.flags or {}
+ settings.flags.draggable = false
+
+ local button = {}
+
+ button.left_click = settings.left_click
+ button.hover_on = settings.hover_on
+ button.hover_off = settings.hover_off
+
+ button.text = texts.new(label, settings)
+ button.destroy = function() buttons.destroy(button) end
+
+ setmetatable(button, {__index = function(t, k)
+ if t.text[k] ~= nil then
+ return function(...)
+ return t.text[k](t.text, ...)
+ end
+ end
+ end })
+
+ buttonlist[#buttonlist +1] = button
+ return button
+end
+
+function buttons.destroy(me)
+ for k, v in pairs(buttonlist) do
+ if v == me then
+ buttonlist[k] = nil
+ end
+ end
+ me.text.destroy(me.text)
+end
+
+local mousemoved = true
+local ignorerelease = false
+
+windower.register_event('mouse', function(eventtype, x, y, delta, blocked)
+ if blocked then
+ return
+ end
+
+ -- Mouse drag
+ if eventtype == 0 then
+ mousemoved = true
+
+ for _, button in pairs(buttonlist) do
+ if type(button.hover_on) == "function" and type(button.hover_off) == "function" then
+ if button.text:hover(x, y) then
+ button:hover_on()
+ else
+ button:hover_off()
+ end
+ end
+ end
+
+ -- Mouse left click
+ elseif eventtype == 1 then
+ mousemoved = false
+ for _, button in pairs(buttonlist) do
+ if button.text:hover(x, y) then
+ ignorerelease = true
+ return true
+ end
+ end
+ ignorerelease = false
+
+ -- Mouse left release
+ elseif eventtype == 2 then
+ for _, button in pairs(buttonlist) do
+ if button.text:hover(x, y) and button.text:visible() and not mousemoved and type(button.left_click) == "function" then
+ button:left_click()
+ return true
+ end
+ end
+
+ if ignorerelease then
+ return true
+ end
+ end
+
+ return false
+end)
+
+return buttons
+
+--Copyright © 2015, Anissa
+--All rights reserved.
+
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are met:
+
+-- * Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- * Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+-- * Neither the name of bluGuide nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+--ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+--WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+--DISCLAIMED. IN NO EVENT SHALL ANISSA BE LIABLE FOR ANY
+--DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+--(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+--LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+--ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+--(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file