This commit is contained in:
Bunny67
2017-12-13 01:20:58 +03:00
parent d9ceb70f4b
commit d515477b12
30 changed files with 1591 additions and 1538 deletions
+1 -14
View File
@@ -8,17 +8,4 @@
Libraries\Load_Libraries.xml Libraries\Load_Libraries.xml
locales\load_locales.xml locales\load_locales.xml
core.lua core.lua
General.lua
actionbars.lua
auras.lua
bags.lua
chat.lua
datatexts.lua
filters.lua
nameplates.lua
skins.lua
tooltip.lua
unitframes.lua
DataBars.lua
maps.lua
@@ -12,15 +12,14 @@ Very light wrapper library that combines all the AceConfig subcomponents into on
]] ]]
local MAJOR, MINOR = "AceConfig-3.0", 2 local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI")
local cfgcmd = LibStub("AceConfigCmd-3.0-ElvUI")
local MAJOR, MINOR = "AceConfig-3.0-ElvUI", 2
local AceConfig = LibStub:NewLibrary(MAJOR, MINOR) local AceConfig = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfig then return end if not AceConfig then return end
AceConfig.embeds = AceConfig.embeds or {}
local cfgreg = LibStub("AceConfigRegistry-3.0")
local cfgcmd = LibStub("AceConfigCmd-3.0")
--TODO: local cfgdlg = LibStub("AceConfigDialog-3.0", true) --TODO: local cfgdlg = LibStub("AceConfigDialog-3.0", true)
--TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0", true) --TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0", true)
@@ -44,27 +43,16 @@ local pcall, error, type, pairs = pcall, error, type, pairs
-- local AceConfig = LibStub("AceConfig-3.0") -- local AceConfig = LibStub("AceConfig-3.0")
-- AceConfig:RegisterOptionsTable("MyAddon", myOptions, {"/myslash", "/my"}) -- AceConfig:RegisterOptionsTable("MyAddon", myOptions, {"/myslash", "/my"})
function AceConfig:RegisterOptionsTable(appName, options, slashcmd) function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
if self == AceConfig then
error([[Usage: RegisterOptionsTable(appName, options[, slashcmd]): 'self' - use your own 'self']], 2)
end
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options) local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end if not ok then error(msg, 2) end
if slashcmd then if slashcmd then
if type(slashcmd) == "table" then if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do for _,cmd in pairs(slashcmd) do
cfgcmd.CreateChatCommand(self, cmd, appName) cfgcmd:CreateChatCommand(cmd, appName)
end end
else else
cfgcmd.CreateChatCommand(self, slashcmd, appName) cfgcmd:CreateChatCommand(slashcmd, appName)
end end
end end
end end
function AceConfig:Embed(target)
target["RegisterOptionsTable"] = self["RegisterOptionsTable"]
end
for addon in pairs(AceConfig.embeds) do
AceConfig:Embed(addon)
end
@@ -14,37 +14,29 @@ REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
-- TODO: plugin args -- TODO: plugin args
local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI")
local MAJOR, MINOR = "AceConfigCmd-3.0", 13 local MAJOR, MINOR = "AceConfigCmd-3.0-ElvUI", 2
local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR) local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigCmd then return end if not AceConfigCmd then return end
local AceCore = LibStub("AceCore-3.0")
local Dispatchers = AceCore.Dispatchers
local strtrim = AceCore.strtrim
local strsplit = AceCore.strsplit
local new, del = AceCore.new, AceCore.del
local wipe = AceCore.wipe
AceConfigCmd.commands = AceConfigCmd.commands or {} AceConfigCmd.commands = AceConfigCmd.commands or {}
AceConfigCmd.embeds = AceConfigCmd.embeds or {}
local commands = AceConfigCmd.commands local commands = AceConfigCmd.commands
local cfgreg = LibStub("AceConfigRegistry-3.0")
local AceConsole -- LoD local AceConsole -- LoD
local AceConsoleName = "AceConsole-3.0" local AceConsoleName = "AceConsole-3.0"
-- Lua APIs -- Lua APIs
local strbyte, strsub = string.byte, string.sub local strsub, strsplit, strlower, strmatch, strtrim, strupper = string.sub, string.split, string.lower, string.match, string.trim, string.upper
local strlen, strupper, strlower = string.len, string.upper, string.lower local format, tonumber, tostring, len, find, byte = string.format, tonumber, tostring, string.len, string.find, string.byte
local strfind, strgfind, strgsub = string.find, string.gfind, string.gsub local tsort, tinsert, tgetn = table.sort, table.insert, table.getn
local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local format = string.format local error, assert = error, assert
local tsort, tinsert, tgetn, tremove = table.sort, table.insert, table.getn, table.remove local mod = math.mod
-- WoW APIs -- WoW APIs
local _G = AceCore._G local _G = getfenv()
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- List them here for Mikk's FindGlobals script
@@ -69,7 +61,18 @@ local handlermsg = "expected a table"
local functypes = {["function"]=true, ["string"]=true} local functypes = {["function"]=true, ["string"]=true}
local funcmsg = "expected function or member name" local funcmsg = "expected function or member name"
local pickfirstset = AceCore.pickfirstset
-- pickfirstset() - picks the first non-nil value and returns it
local function pickfirstset(...)
local args = unpack(arg)
for i=1,select("#", args) do
if select(i,args)~=nil then
return select(i,args)
end
end
end
-- err() - produce real error() regarding malformed options tables etc -- err() - produce real error() regarding malformed options tables etc
@@ -89,26 +92,23 @@ end
-- callmethod() - call a given named method (e.g. "get", "set") with given arguments -- callmethod() - call a given named method (e.g. "get", "set") with given arguments
local function callmethod(info, inputpos, tab, methodtype, ...)
local function callmethod(info, inputpos, tab, methodtype, argc, a1, a2, a3, a4)
local method = info[methodtype] local method = info[methodtype]
if not method then if not method then
err(info, inputpos, "'"..methodtype.."': not set") err(info, inputpos, "'"..methodtype.."': not set")
end end
argc = argc or 0
info.arg = tab.arg info.arg = tab.arg
info.option = tab info.option = tab
info.type = tab.type info.type = tab.type
if type(method)=="function" then if type(method)=="function" then
return Dispatchers[argc+1](method, info, a1, a2, a3, a4) return method(info, unpack(arg))
elseif type(method)=="string" then elseif type(method)=="string" then
if type(info.handler[method])~="function" then if type(info.handler[method])~="function" then
err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler)) err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler))
end end
return Dispatchers[argc+2](info.handler[method], info.handler, info, a1, a2, a3, a4) return info.handler[method](info.handler, info, unpack(arg))
else else
assert(false) -- type should have already been checked on read assert(false) -- type should have already been checked on read
end end
@@ -116,35 +116,33 @@ end
-- callfunction() - call a given named function (e.g. "name", "desc") with given arguments -- callfunction() - call a given named function (e.g. "name", "desc") with given arguments
-- Ace3v: the variable arguments are currently unused, so we removed it local function callfunction(info, tab, methodtype, ...)
local function callfunction(info, tab, methodtype)
local method = tab[methodtype] local method = tab[methodtype]
info.arg = tab.arg info.arg = tab.arg
info.option = tab info.option = tab
info.type = tab.type info.type = tab.type
if type(method)=="function" then if type(method)=="function" then
return method(info) return method(info, unpack(arg))
else else
assert(false) -- type should have already been checked on read assert(false) -- type should have already been checked on read
end end
end end
-- do_final() - do the final step (set/execute) along with validation and confirmation -- do_final() - do the final step (set/execute) along with validation and confirmation
-- Ace3v: experimental
-- @param argc number of variable arguments local function do_final(info, inputpos, tab, methodtype, ...)
local function do_final(info, inputpos, tab, methodtype, argc, a1, a2, a3, a4) -- currently maximum 4 arguments if info.validate then
if info.validate then local res = callmethod(info,inputpos,tab,"validate",unpack(arg))
local res = callmethod(info,inputpos,tab,"validate",argc,a1,a2,a3,a4)
if type(res)=="string" then if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res) usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
return return
end end
end end
-- console ignores .confirm -- console ignores .confirm
callmethod(info,inputpos,tab,methodtype,argc,a1,a2,a3,a4) callmethod(info,inputpos,tab,methodtype, unpack(arg))
end end
@@ -156,8 +154,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
if val~=nil then if val~=nil then
if val==false then if val==false then
val=nil val=nil
elseif not types[type(val)] then elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg) err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end end
info[paramname] = val info[paramname] = val
info[paramname.."_at"] = depth info[paramname.."_at"] = depth
@@ -167,14 +165,16 @@ end
-- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.* -- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.*
local function iterateargs(tab) local dummytable={}
if not tab.plugins then
return pairs(tab.args)
end
local function iterateargs(tab)
if not tab.plugins then
return pairs(tab.args)
end
local argtabkey,argtab=next(tab.plugins) local argtabkey,argtab=next(tab.plugins)
local v local v
return function(_, k) return function(_, k)
while argtab do while argtab do
k,v = next(argtab, k) k,v = next(argtab, k)
@@ -191,53 +191,49 @@ local function iterateargs(tab)
end end
end end
local function getValueFromTab(info, inputpos, tab, key)
local v = tab[key]
if type(v) == "function" or type(v) == "string" then
info[key] = v
v = callmethod(info, inputpos, tab, key)
info[key] = nil
end
return v
end
local function checkhidden(info, inputpos, tab) local function checkhidden(info, inputpos, tab)
if tab.cmdHidden~=nil then if tab.cmdHidden~=nil then
return tab.cmdHidden return tab.cmdHidden
end end
return getValueFromTab(info, inputpos, tab, "hidden") local hidden = tab.hidden
if type(hidden) == "function" or type(hidden) == "string" then
info.hidden = hidden
hidden = callmethod(info, inputpos, tab, 'hidden')
info.hidden = nil
end
return hidden
end end
local function showhelp(info, inputpos, tab, depth, noHead) local function showhelp(info, inputpos, tab, depth, noHead)
if not noHead then if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":") print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end end
local sortTbl = new() -- [1..n]=name local sortTbl = {} -- [1..n]=name
local refTbl = new() -- [name]=tableref local refTbl = {} -- [name]=tableref
for k,v in iterateargs(tab) do for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k) tinsert(sortTbl, k)
refTbl[k] = v refTbl[k] = v
end end
end end
tsort(sortTbl, function(one, two) tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100 local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100 local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then if type(o1) == "function" or type(o1) == "string" then
info.order = o1 info.order = o1
tinsert(info, one) info[tgetn(info)+1] = one
o1 = callmethod(info, inputpos, refTbl[one], "order") o1 = callmethod(info, inputpos, refTbl[one], "order")
tremove(info) info[tgetn(info)] = nil
info.order = nil info.order = nil
end end
if type(o2) == "function" or type(o1) == "string" then if type(o2) == "function" or type(o1) == "string" then
info.order = o2 info.order = o2
tinsert(info, two) info[tgetn(info)+1] = two
o2 = callmethod(info, inputpos, refTbl[two], "order") o2 = callmethod(info, inputpos, refTbl[two], "order")
tremove(info) info[tgetn(info)] = nil
info.order = nil info.order = nil
end end
if o1<0 and o2<0 then return o1<o2 end if o1<0 and o2<0 then return o1<o2 end
@@ -246,7 +242,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
if o1==o2 then return tostring(one)<tostring(two) end -- compare names if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2 return o1<o2
end) end)
for i = 1, tgetn(sortTbl) do for i = 1, tgetn(sortTbl) do
local k = sortTbl[i] local k = sortTbl[i]
local v = refTbl[k] local v = refTbl[k]
@@ -260,22 +256,21 @@ local function showhelp(info, inputpos, tab, depth, noHead)
if type(desc) == "function" then if type(desc) == "function" then
desc = callfunction(info, v, 'desc') desc = callfunction(info, v, 'desc')
end end
if v.type == "group" and pickfirstset(3, v.cmdInline, v.inline, false) then if v.type == "group" and pickfirstset(v.cmdInline, v.inline, false) then
print(" "..(desc or name)..":") print(" "..(desc or name)..":")
local oldhandler,oldhandler_at = getparam(info, inputpos, v, depth, "handler", handlertypes, handlermsg) local oldhandler,oldhandler_at = getparam(info, inputpos, v, depth, "handler", handlertypes, handlermsg)
showhelp(info, inputpos, v, depth, true) showhelp(info, inputpos, v, depth, true)
info.handler,info.handler_at = oldhandler,oldhandler_at info.handler,info.handler_at = oldhandler,oldhandler_at
else else
local key = strgsub(k, " ", "_") local key = gsub(k, " ", "_")
print(" |cffffff78"..key.."|r - "..(desc or name or "")) print(" |cffffff78"..key.."|r - "..(desc or name or ""))
end end
end end
end end
end end
del(sortTbl) -- Ace3v: release the tables
del(refTbl)
end end
local function keybindingValidateFunc(text) local function keybindingValidateFunc(text)
if text == nil or text == "NONE" then if text == nil or text == "NONE" then
return nil return nil
@@ -318,7 +313,7 @@ local function keybindingValidateFunc(text)
if text == "" then if text == "" then
return false return false
end end
if not strfind(text,"^F%d+$") and text ~= "CAPSLOCK" and strlen(text) ~= 1 and (strbyte(text) < 128 or strlen(text) > 4) and not _G["KEY_" .. text] then if not find(text, "^F%d+$") and text ~= "CAPSLOCK" and len(text) ~= 1 and (byte(text) < 128 or len(text) > 4) and not _G["KEY_" .. text] then
return false return false
end end
local s = text local s = text
@@ -334,7 +329,7 @@ local function keybindingValidateFunc(text)
return s return s
end end
-- handle() - selfrecursing function that processes input->optiontable -- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0 -- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups) -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
@@ -353,45 +348,45 @@ local function handle(info, inputpos, tab, depth, retfalse)
local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg) local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg) local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg) --local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
------------------------------------------------------------------- -------------------------------------------------------------------
-- Act according to .type of this table -- Act according to .type of this table
if tab.type=="group" then if tab.type=="group" then
------------ group -------------------------------------------- ------------ group --------------------------------------------
if type(tab.args)~="table" then err(info, inputpos) end if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-- grab next arg from input -- grab next arg from input
local _,nextpos,arg = strfind(info.input, " *([^ ]+) *", inputpos) local _,nextpos,arg = find(info.input, " *([^ ]+) *", inputpos)
if not arg then if not arg then
showhelp(info, inputpos, tab, depth) showhelp(info, inputpos, tab, depth)
return return
end end
nextpos=nextpos+1 nextpos=nextpos+1
-- loop .args and try to find a key with a matching name -- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do for k,v in iterateargs(tab) do
if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-- is this child an inline group? if so, traverse into it -- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(3, v.cmdInline, v.inline, false) then if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
tinsert(info,k) info[depth+1] = k
if handle(info, inputpos, v, depth+1, true)==false then if handle(info, inputpos, v, depth+1, true)==false then
tremove(info) info[depth+1] = nil
-- wasn't found in there, but that's ok, we just keep looking down here -- wasn't found in there, but that's ok, we just keep looking down here
else else
return -- done, name was found in inline group return -- done, name was found in inline group
end end
-- matching name and not a inline group -- matching name and not a inline group
elseif strlower(arg)==strlower(strgsub(k, " ", "_")) then elseif strlower(arg)==strlower(gsub(k, " ", "_")) then
tinsert(info,k) info[depth+1] = k
return handle(info,nextpos,v,depth+1) return handle(info,nextpos,v,depth+1)
end end
end end
-- no match -- no match
if retfalse then if retfalse then
-- restore old infotable members and return false to indicate failure -- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -402,41 +397,36 @@ local function handle(info, inputpos, tab, depth, retfalse)
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at --info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false return false
end end
-- couldn't find the command, display error -- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"]) usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return return
end end
local str = strsub(info.input,inputpos); local str = strsub(info.input,inputpos);
if tab.type=="execute" then if tab.type=="execute" then
------------ execute -------------------------------------------- ------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func") do_final(info, inputpos, tab, "func")
elseif tab.type=="input" then elseif tab.type=="input" then
------------ input -------------------------------------------- ------------ input --------------------------------------------
if str=="" and tab.nullable == false then
usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
return
end
local res = true local res = true
if tab.pattern then if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
if not strfind(str, tab.pattern) then if not strmatch(str, tab.pattern) then
usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"]) usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
return return
end end
end end
do_final(info, inputpos, tab, "set", str)
do_final(info, inputpos, tab, "set", 1, str)
elseif tab.type=="toggle" then elseif tab.type=="toggle" then
------------ toggle -------------------------------------------- ------------ toggle --------------------------------------------
local b local b
@@ -456,7 +446,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
else else
b = not b b = not b
end end
elseif str==L["on"] then elseif str==L["on"] then
b = true b = true
elseif str==L["off"] then elseif str==L["off"] then
@@ -471,64 +461,48 @@ local function handle(info, inputpos, tab, depth, retfalse)
end end
return return
end end
do_final(info, inputpos, tab, "set", 1, b) do_final(info, inputpos, tab, "set", b)
elseif tab.type=="range" then elseif tab.type=="range" then
------------ range -------------------------------------------- ------------ range --------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
-- TODO: Show current value
return
end
local val = tonumber(str) local val = tonumber(str)
if not val then if not val then
usererr(info, inputpos, "'"..str.."' - "..L["expected number"]) usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
return return
end end
if type(info.step)=="number" then
local step = getValueFromTab(info, inputpos, tab, "step") val = val- mod(val, info.step)
local min = getValueFromTab(info, inputpos, tab, "min")
if type(step)=="number" then
val = min + math.floor((val-min)/step) * step
end end
if type(info.min)=="number" and val<info.min then
if type(min)=="number" and val<min then usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(info.min)) )
usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(min)) )
return return
end end
if type(info.max)=="number" and val>info.max then
local max = getValueFromTab(info, inputpos, tab, "max") usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
if type(max)=="number" and val>max then
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(max)) )
return return
end end
do_final(info, inputpos, tab, "set", val)
do_final(info, inputpos, tab, "set", 1, val)
elseif tab.type=="select" then elseif tab.type=="select" then
------------ select ------------------------------------ ------------ select ------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
local values = getValueFromTab(info, inputpos, tab, "values") local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
if str == "" then if str == "" then
-- Ace3v: it is possbile to not have a current value local b = callmethod(info, inputpos, tab, "get")
-- we do this only for select but not for multiselect
local b = tab.get
if type(b) == "function" or type(b) == "string" then
b = callmethod(info, inputpos, tab, "get")
else
b = nil
end
local fmt = "|cffffff78- [%s]|r %s" local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r" local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
print(L["Options for |cffffff78"..info[tgetn(info)].."|r:"]) print(L["Options for |cffffff78"..info[thetn(info)].."|r:"])
for k, v in pairs(values) do for k, v in pairs(values) do
if b == k then if b == k then
print(format(fmt_sel, k, v)) print(format(fmt_sel, k, v))
@@ -536,75 +510,76 @@ local function handle(info, inputpos, tab, depth, retfalse)
print(format(fmt, k, v)) print(format(fmt, k, v))
end end
end end
if tab.valuesTableDestroyable then del(values) end
return return
end end
local ok local ok
for k,v in pairs(values) do for k,v in pairs(values) do
if strlower(k)==str then if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches) str = k -- overwrite with key (in case of case mismatches)
ok = true ok = true
break break
end end
end end
if tab.valuesTableDestroyable then del(values) end
if not ok then if not ok then
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"]) usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return return
end end
do_final(info, inputpos, tab, "set", 1, str) do_final(info, inputpos, tab, "set", str)
elseif tab.type=="multiselect" then elseif tab.type=="multiselect" then
------------ multiselect ------------------------------------------- ------------ multiselect -------------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
local values = getValueFromTab(info, inputpos, tab, "values") local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
if str == "" then if str == "" then
local fmt = "|cffffff78- [%s]|r %s" local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r" local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
print(L["Options for |cffffff78"..info[tgetn(info)].."|r (multiple possible):"]) print(L["Options for |cffffff78"..info[tgetn(info)].."|r (multiple possible):"])
for k, v in pairs(values) do for k, v in pairs(values) do
if callmethod(info, inputpos, tab, "get", 1, k) then if callmethod(info, inputpos, tab, "get", k) then
print(format(fmt_sel, k, v)) print(format(fmt_sel, k, v))
else else
print(format(fmt, k, v)) print(format(fmt, k, v))
end end
end end
if tab.valuesTableDestroyable then del(values) end
return return
end end
--build a table of the selections, checking that they exist --build a table of the selections, checking that they exist
--parse for =on =off =default in the process --parse for =on =off =default in the process
--table will be key = true for options that should toggle, key = [on|off|default] for options to be set --table will be key = true for options that should toggle, key = [on|off|default] for options to be set
local sels = new() local sels = {}
for v in strgfind(str, "[^ ]+") do for v in gmatch(str, "[^ ]+") do
--parse option=on etc --parse option=on etc
local _, _, opt, val = strfind(v, '(.+)=(.+)') local opt, val = strmatch(v, '(.+)=(.+)')
--get option if toggling --get option if toggling
if not opt then if not opt then
opt = v opt = v
end end
--check that the opt is valid --check that the opt is valid
local ok local ok
for k,v in pairs(values) do for k,v in pairs(values) do
if strlower(k)==opt then if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches) opt = k -- overwrite with key (in case of case mismatches)
ok = true ok = true
break break
end end
end end
if tab.valuesTableDestroyable then del(values) end
if not ok then if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"]) usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return return
end end
--check that if val was supplied it is valid --check that if val was supplied it is valid
if val then if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -616,7 +591,6 @@ local function handle(info, inputpos, tab, depth, retfalse)
else else
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val)) usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val))
end end
del(sels)
return return
end end
else else
@@ -624,14 +598,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
sels[opt] = true sels[opt] = true
end end
end end
for opt, val in pairs(sels) do for opt, val in pairs(sels) do
local newval local newval
if (val == true) then if (val == true) then
--toggle the option --toggle the option
local b = callmethod(info, inputpos, tab, "get", 1, opt) local b = callmethod(info, inputpos, tab, "get", opt)
if tab.tristate then if tab.tristate then
--cycle in true, nil, false order --cycle in true, nil, false order
if b then if b then
@@ -655,12 +629,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
newval = nil newval = nil
end end
end end
do_final(info, inputpos, tab, "set", 2, opt, newval) do_final(info, inputpos, tab, "set", opt, newval)
end end
del(sels)
elseif tab.type=="color" then elseif tab.type=="color" then
------------ color -------------------------------------------- ------------ color --------------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
@@ -668,25 +641,30 @@ local function handle(info, inputpos, tab, depth, retfalse)
--TODO: Show current value --TODO: Show current value
return return
end end
local _, r, g, b, a local r, g, b, a
local hasAlpha = getValueFromTab(info, inputpos, tab, 'hasAlpha') local hasAlpha = tab.hasAlpha
if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
info.hasAlpha = hasAlpha
hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
info.hasAlpha = nil
end
if hasAlpha then if hasAlpha then
if strlen(str) == 8 and strfind(str, "^%x*$") then if len(str) == 8 and find(str, "^%x*$") then
--parse a hex string --parse a hex string
r,g,b,a = tonumber(strsub(str, 1, 2), 16) / 255, tonumber(strsub(str, 3, 4), 16) / 255, tonumber(strsub(str, 5, 6), 16) / 255, tonumber(strsub(str, 7, 8), 16) / 255 r,g,b,a = tonumber(sub(str, 1, 2), 16) / 255, tonumber(sub(str, 3, 4), 16) / 255, tonumber(sub(str, 5, 6), 16) / 255
else else
--parse seperate values --parse seperate values
_,_,r,g,b,a = strfind(str, "^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$") r,g,b,a = strmatch(str, "^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a) r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a)
end end
if not (r and g and b and a) then if not (r and g and b and a) then
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str)) usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return return
end end
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
--values are valid --values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -701,12 +679,12 @@ local function handle(info, inputpos, tab, depth, retfalse)
end end
else else
a = 1.0 a = 1.0
if strlen(str) == 6 and strfind(str, "^%x*$") then if len(str) == 6 and find(str, "^%x*$") then
--parse a hex string --parse a hex string
r,g,b = tonumber(strsub(str, 1, 2), 16) / 255, tonumber(strsub(str, 3, 4), 16) / 255, tonumber(strsub(str, 5, 6), 16) / 255 r,g,b = tonumber(sub(str, 1, 2), 16) / 255, tonumber(sub(str, 3, 4), 16) / 255, tonumber(sub(str, 5, 6), 16) / 255
else else
--parse seperate values --parse seperate values
_,_,r,g,b = strfind(str, "^([%d%.]+) ([%d%.]+) ([%d%.]+)$") r,g,b = strmatch(str, "^([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b = tonumber(r), tonumber(g), tonumber(b) r,g,b = tonumber(r), tonumber(g), tonumber(b)
end end
if not (r and g and b) then if not (r and g and b) then
@@ -725,8 +703,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str)) usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end end
end end
do_final(info, inputpos, tab, "set", 4, r,g,b,a) do_final(info, inputpos, tab, "set", r,g,b,a)
elseif tab.type=="keybinding" then elseif tab.type=="keybinding" then
------------ keybinding -------------------------------------------- ------------ keybinding --------------------------------------------
@@ -741,7 +719,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
return return
end end
do_final(info, inputpos, tab, "set", 1, value) do_final(info, inputpos, tab, "set", value)
elseif tab.type=="description" then elseif tab.type=="description" then
------------ description -------------------- ------------ description --------------------
@@ -761,7 +739,7 @@ end
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0") -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command -- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand") -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
-- --
-- -- Show the GUI if no input is supplied, otherwise handle the chat input. -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input) -- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table -- -- Assuming "MyOptions" is the appName of a valid options table
@@ -771,9 +749,6 @@ end
-- LibStub("AceConfigCmd-3.0").HandleCommand(MyAddon, "mychat", "MyOptions", input) -- LibStub("AceConfigCmd-3.0").HandleCommand(MyAddon, "mychat", "MyOptions", input)
-- end -- end
-- end -- end
-- Ace3v: experimental, user should copy info table if he wanna reuse it outside
-- then handler
local info_ = {}
function AceConfigCmd:HandleCommand(slashcmd, appName, input) function AceConfigCmd:HandleCommand(slashcmd, appName, input)
local optgetter = cfgreg:GetOptionsTable(appName) local optgetter = cfgreg:GetOptionsTable(appName)
@@ -781,66 +756,33 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2) error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end end
local options = assert( optgetter("cmd", MAJOR) ) local options = assert( optgetter("cmd", MAJOR) )
-- Ace3v: prevent user from using AceConfigCmd as self local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
if self == AceConfigCmd then [0] = slashcmd,
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'self' - use your own 'self']], 2) appName = appName,
end options = options,
input = input,
--local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot self = self,
-- [0] = slashcmd, handler = self,
-- appName = appName, uiType = "cmd",
-- options = options, uiName = MAJOR,
-- input = input, }
-- self = self,
-- handler = self, handle(info, 1, options, 0) -- (info, inputpos, table, depth)
-- uiType = "cmd",
-- uiName = MAJOR,
--}
wipe(info_)
info_[0] = slashcmd
info_.appName = appName
info_.options = options
info_.input = input
info_.self = self
info_.handler = self
info_.uiType = "cmd"
info_.uiName = MAJOR
handle(info_, 1, options, 0) -- (info, inputpos, table, depth)
end end
--- Utility function to create a slash command handler. --- Utility function to create a slash command handler.
-- Also registers tab completion with AceTab -- Also registers tab completion with AceTab
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output) -- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
-- @param appName The application name as given to `:RegisterOptionsTable()` -- @param appName The application name as given to `:RegisterOptionsTable()`
function AceConfigCmd:CreateChatCommand(slashcmd, appName, func) function AceConfigCmd:CreateChatCommand(slashcmd, appName)
if not AceConsole then if not AceConsole then
AceConsole = LibStub(AceConsoleName) AceConsole = LibStub(AceConsoleName)
end end
if AceConsole.RegisterChatCommand(self, slashcmd, function(input)
-- Ace3v: prevent user from using AceConfigCmd as self AceConfigCmd.HandleCommand(self, slashcmd, appName, input) -- upgradable
if self == AceConfigCmd then end,
error([[Usage: CreateChatCommand("slashcmd", "appName"[, "func"]): 'self' - use your own 'self']], 2) true) then -- succesfully registered so lets get the command -> app table in
end
local t = type(func)
-- Ace3v: make it possible to call another function
local handler
if t == "string" then
handler = function(input) self[func](self, input, slashcmd, appName) end
elseif t ~= "function" then
handler = function(input)
AceConfigCmd.HandleCommand(self, slashcmd, appName, input) -- upgradable
end
else
handler = func
end
if AceConsole.RegisterChatCommand(self, slashcmd, handler, true) then
-- succesfully registered so lets get the command -> app table in
commands[slashcmd] = appName commands[slashcmd] = appName
end end
end end
@@ -852,12 +794,3 @@ end
function AceConfigCmd:GetChatCommandOptions(slashcmd) function AceConfigCmd:GetChatCommandOptions(slashcmd)
return commands[slashcmd] return commands[slashcmd]
end end
function AceConfigCmd:Embed(target)
target["HandleCommand"] = self["HandleCommand"]
target["CreateChatCommand"] = self["CreateChatCommand"]
end
for addon in pairs(AceConfigCmd.embeds) do
AceConfigCmd:Embed(addon)
end
@@ -4,28 +4,29 @@
-- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\ -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
-- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\ -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
-- * The **appName** field is the options table name as given at registration time \\ -- * The **appName** field is the options table name as given at registration time \\
-- --
-- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
-- @class file -- @class file
-- @name AceConfigRegistry-3.0 -- @name AceConfigRegistry-3.0
-- @release $Id: AceConfigRegistry-3.0.lua 1139 2016-07-03 07:43:51Z nevcairiel $ -- @release $Id: AceConfigRegistry-3.0.lua 1105 2013-12-08 22:11:58Z nevcairiel $
local MAJOR, MINOR = "AceConfigRegistry-3.0", 16 local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
local MAJOR, MINOR = "AceConfigRegistry-3.0-ElvUI", 2
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigRegistry then return end if not AceConfigRegistry then return end
AceConfigRegistry.tables = AceConfigRegistry.tables or {} AceConfigRegistry.tables = AceConfigRegistry.tables or {}
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
if not AceConfigRegistry.callbacks then if not AceConfigRegistry.callbacks then
AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry) AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry)
end end
-- Lua APIs -- Lua APIs
local tinsert, tconcat, tgetn = table.insert, table.concat, table.getn local tinsert, tconcat = table.insert, table.concat
local strfind = string.find local strfind, strmatch = string.find, string.match
local type, tostring, pairs = type, tostring, pairs local tgetn = table.getn
local type, tostring, select, pairs, unpack = type, tostring, select, pairs, unpack
local error, assert = error, assert local error, assert = error, assert
----------------------------------------------------------------------- -----------------------------------------------------------------------
@@ -33,24 +34,24 @@ local error, assert = error, assert
AceConfigRegistry.validated = { AceConfigRegistry.validated = {
-- list of options table names ran through :ValidateOptionsTable automatically. -- list of options table names ran through :ValidateOptionsTable automatically.
-- CLEARED ON PURPOSE, since newer versions may have newer validators -- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {}, cmd = {},
dropdown = {}, dropdown = {},
dialog = {}, dialog = {},
} }
local function err(msg, errlvl, ...) local function err(msg, errlvl, ...)
local l = tgetn(arg) local t = {}
local i,j = 1,l for i=tgetn(arg),1,-1 do
while i < j do tinsert(t, (arg[i]))
arg[i], arg[j] = arg[j], arg[i]
i = i+1
j = j-1
end end
error(MAJOR..":ValidateOptionsTable(): "..tconcat(arg,".")..msg, errlvl+2) error(MAJOR..":ValidateOptionsTable(): "..tconcat(t,".")..msg, errlvl+2)
end end
local isstring={["string"]=true, _="string"} local isstring={["string"]=true, _="string"}
local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"} local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"}
local istable={["table"]=true, _="table"} local istable={["table"]=true, _="table"}
@@ -91,6 +92,17 @@ local basekeys={
func=optmethodfalse, func=optmethodfalse,
arg={["*"]=true}, arg={["*"]=true},
width=optstring, width=optstring,
customWidth=optnumber,
textWidth=optmethodbool,
buttonElvUI=optmethodbool,
dragdrop=optmethodbool,
dragOnEnter=optmethodfalse,
dragOnLeave=optmethodfalse,
dragOnClick=optmethodfalse,
dragOnMouseUp=optmethodfalse,
dragOnMouseDown=optmethodfalse,
stateSwitchOnClick=optmethodfalse,
stateSwitchGetText=optmethodfalse,
} }
local typedkeys={ local typedkeys={
@@ -125,7 +137,6 @@ local typedkeys={
dialogControl=optstring, dialogControl=optstring,
dropdownControl=optstring, dropdownControl=optstring,
multiline=optboolnumber, multiline=optboolnumber,
nullable=optbool,
}, },
toggle={ toggle={
tristate=optbool, tristate=optbool,
@@ -145,10 +156,9 @@ local typedkeys={
}, },
select={ select={
values=ismethodtable, values=ismethodtable,
valuesTableDestroyable=optbool, -- Ace3v: if the values table is generated by AceCore.new
style={ style={
["nil"]=true, ["nil"]=true,
["string"]={dropdown=true,radio=true}, ["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'" _="string: 'dropdown' or 'radio'"
}, },
control=optstring, control=optstring,
@@ -158,7 +168,6 @@ local typedkeys={
}, },
multiselect={ multiselect={
values=ismethodtable, values=ismethodtable,
valuesTableDestroyable=optbool, -- Ace3v: if the values table is generated by AceCore.new
style=optstring, style=optstring,
tristate=optbool, tristate=optbool,
control=optstring, control=optstring,
@@ -167,81 +176,82 @@ local typedkeys={
}, },
color={ color={
hasAlpha=optmethodbool, hasAlpha=optmethodbool,
reset=opttable,
}, },
keybinding={ keybinding={
-- TODO -- TODO
}, },
} }
local function validateKey(k,errlvl,arg) local function validateKey(k,errlvl,...)
errlvl=(errlvl or 0)+1 errlvl=(errlvl or 0)+1
if type(k)~="string" then if type(k)~="string" then
err("["..tostring(k).."] - key is not a string", errlvl, arg) err("["..tostring(k).."] - key is not a string", errlvl,unpack(arg))
end end
if strfind(k, "[%c\127]") then if strfind(k, "[%c\127]") then
err("["..tostring(k).."] - key name contained control characters", errlvl, arg) err("["..tostring(k).."] - key name contained control characters", errlvl,unpack(arg))
end end
end end
local function validateVal(v, oktypes, errlvl, arg) local function validateVal(v, oktypes, errlvl,...)
errlvl=(errlvl or 0)+1 errlvl=(errlvl or 0)+1
local isok=oktypes[type(v)] or oktypes["*"] local isok=oktypes[type(v)] or oktypes["*"]
if not isok then if not isok then
err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl, arg) err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl,unpack(arg))
end end
if type(isok)=="table" then -- isok was a table containing specific values to be tested for! if type(isok)=="table" then -- isok was a table containing specific values to be tested for!
if not isok[v] then if not isok[v] then
err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl, arg) err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl,unpack(arg))
end end
end end
end end
local function validate(options,errlvl,arg) local function validate(options,errlvl,...)
errlvl=(errlvl or 0)+1 errlvl=(errlvl or 0)+1
-- basic consistency -- basic consistency
if type(options)~="table" then if type(options)~="table" then
err(": expected a table, got a "..type(options), errlvl, arg) err(": expected a table, got a "..type(options), errlvl,unpack(arg))
end end
if type(options.type)~="string" then if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl, arg) err(".type: expected a string, got a "..type(options.type), errlvl,unpack(arg))
end end
-- get type and 'typedkeys' member -- get type and 'typedkeys' member
local tk = typedkeys[options.type] local tk = typedkeys[options.type]
if not tk then if not tk then
err(".type: unknown type '"..options.type.."'", errlvl, arg) err(".type: unknown type '"..options.type.."'", errlvl,unpack(arg))
end end
-- make sure that all options[] are known parameters -- make sure that all options[] are known parameters
for k,v in pairs(options) do for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then if not (tk[k] or basekeys[k]) then
err(": unknown parameter", errlvl,tostring(k), arg) err(": unknown parameter", errlvl,tostring(k),unpack(arg))
end end
end end
-- verify that required params are there, and that everything is the right type -- verify that required params are there, and that everything is the right type
for k,oktypes in pairs(basekeys) do for k,oktypes in pairs(basekeys) do
validateVal(options[k], oktypes, errlvl, k, arg) validateVal(options[k], oktypes, errlvl,k,unpack(arg))
end end
for k,oktypes in pairs(tk) do for k,oktypes in pairs(tk) do
validateVal(options[k], oktypes, errlvl, k, arg) validateVal(options[k], oktypes, errlvl,k,unpack(arg))
end end
-- extra logic for groups -- extra logic for groups
if options.type=="group" then if options.type=="group" then
for k,v in pairs(options.args) do for k,v in pairs(options.args) do
validateKey(k,errlvl,"args", arg) validateKey(k,errlvl,"args",unpack(arg))
validate(v, errlvl,k,"args", arg) validate(v, errlvl,k,"args",unpack(arg))
end end
if options.plugins then if options.plugins then
for plugname,plugin in pairs(options.plugins) do for plugname,plugin in pairs(options.plugins) do
if type(plugin)~="table" then if type(plugin)~="table" then
err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname), "plugins", arg) err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname),"plugins",unpack(arg))
end end
for k,v in pairs(plugin) do for k,v in pairs(plugin) do
validateKey(k,errlvl,tostring(plugname),"plugins",arg) validateKey(k,errlvl,tostring(plugname),"plugins",unpack(arg))
validate(v, errlvl,k,tostring(plugname),"plugins",arg) validate(v, errlvl,k,tostring(plugname),"plugins",unpack(arg))
end end
end end
end end
@@ -269,7 +279,7 @@ end
-- @param appName The application name as given to `:RegisterOptionsTable()` -- @param appName The application name as given to `:RegisterOptionsTable()`
function AceConfigRegistry:NotifyChange(appName) function AceConfigRegistry:NotifyChange(appName)
if not AceConfigRegistry.tables[appName] then return end if not AceConfigRegistry.tables[appName] then return end
AceConfigRegistry.callbacks:Fire("ConfigTableChange", 1, appName) AceConfigRegistry.callbacks:Fire("ConfigTableChange", appName)
end end
-- ------------------------------------------------------------------- -- -------------------------------------------------------------------
@@ -283,7 +293,7 @@ local function validateGetterArgs(uiType, uiName, errlvl)
if uiType~="cmd" and uiType~="dropdown" and uiType~="dialog" then if uiType~="cmd" and uiType~="dropdown" and uiType~="dialog" then
error(MAJOR..": Requesting options table: 'uiType' - invalid configuration UI type, expected 'cmd', 'dropdown' or 'dialog'", errlvl) error(MAJOR..": Requesting options table: 'uiType' - invalid configuration UI type, expected 'cmd', 'dropdown' or 'dialog'", errlvl)
end end
if not strfind(uiName, "[A-Za-z]+-[0-9]") then -- Expecting e.g. "MyLib-1.2" if not strmatch(uiName, "[A-Za-z]%-[0-9]") then -- Expecting e.g. "MyLib-1.2"
error(MAJOR..": Requesting options table: 'uiName' - badly formatted or missing version number. Expected e.g. 'MyLib-1.2'", errlvl) error(MAJOR..": Requesting options table: 'uiName' - badly formatted or missing version number. Expected e.g. 'MyLib-1.2'", errlvl)
end end
end end
@@ -305,7 +315,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true AceConfigRegistry.validated[uiType][appName] = true
end end
return options return options
end end
elseif type(options)=="function" then elseif type(options)=="function" then
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl) AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@@ -343,7 +353,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
if not f then if not f then
return nil return nil
end end
if uiType then if uiType then
return f(uiType,uiName,1) -- get the table for us return f(uiType,uiName,1) -- get the table for us
else else
@@ -1,15 +1,12 @@
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
-- @class file -- @class file
-- @name AceDBOptions-3.0 -- @name AceDBOptions-3.0
-- @release $Id: AceDBOptions-3.0.lua 1140 2016-07-03 07:53:29Z nevcairiel $ -- @release $Id: AceDBOptions-3.0.lua 1066 2012-09-18 14:36:49Z nevcairiel $
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
if not AceDBOptions then return end -- No upgrade needed if not AceDBOptions then return end -- No upgrade needed
local AceCore = LibStub("AceCore-3.0")
local new, del = AceCore.new, AceCore.del
-- Lua APIs -- Lua APIs
local pairs, next = pairs, next local pairs, next = pairs, next
@@ -233,6 +230,7 @@ elseif LOCALE == "ptBR" then
end end
local defaultProfiles local defaultProfiles
local tmpprofiles = {}
-- Get a list of available profiles for the specified database. -- Get a list of available profiles for the specified database.
-- You can specify which profiles to include/exclude in the list using the two boolean parameters listed below. -- You can specify which profiles to include/exclude in the list using the two boolean parameters listed below.
@@ -241,8 +239,8 @@ local defaultProfiles
-- @param nocurrent If true, then getProfileList will not display the current profile in the list -- @param nocurrent If true, then getProfileList will not display the current profile in the list
-- @return Hashtable of all profiles with the internal name as keys and the display name as value. -- @return Hashtable of all profiles with the internal name as keys and the display name as value.
local function getProfileList(db, common, nocurrent) local function getProfileList(db, common, nocurrent)
local profiles = new() local profiles = {}
local tmpprofiles = new()
-- copy existing profiles into the table -- copy existing profiles into the table
local currentProfile = db:GetCurrentProfile() local currentProfile = db:GetCurrentProfile()
for i,v in pairs(db:GetProfiles(tmpprofiles)) do for i,v in pairs(db:GetProfiles(tmpprofiles)) do
@@ -250,7 +248,6 @@ local function getProfileList(db, common, nocurrent)
profiles[v] = v profiles[v] = v
end end
end end
del(tmpprofiles)
-- add our default profiles to choose from ( or rename existing profiles) -- add our default profiles to choose from ( or rename existing profiles)
for k,v in pairs(defaultProfiles) do for k,v in pairs(defaultProfiles) do
@@ -293,8 +290,6 @@ end
"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default") "common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
"both" - common except the active profile "both" - common except the active profile
]] ]]
-- Ace3v: It is recommanded to destroy the returned table by AceCore.del
-- if it is no longer needed
function OptionsHandlerPrototype:ListProfiles(info) function OptionsHandlerPrototype:ListProfiles(info)
local arg = info.arg local arg = info.arg
local profiles local profiles
@@ -313,9 +308,7 @@ end
function OptionsHandlerPrototype:HasNoProfiles(info) function OptionsHandlerPrototype:HasNoProfiles(info)
local profiles = self:ListProfiles(info) local profiles = self:ListProfiles(info)
local r = (not next(profiles)) and true or false return ((not next(profiles)) and true or false)
del(profiles)
return r
end end
--[[ Copy a profile ]] --[[ Copy a profile ]]
@@ -378,7 +371,8 @@ local optionsTable = {
current = { current = {
order = 11, order = 11,
type = "description", type = "description",
name = function(info) return L["current"] .. " " .. NORMAL_FONT_COLOR_CODE .. info.handler:GetCurrentProfile() .. FONT_COLOR_CODE_CLOSE end, --name = function(info) return L["current"] .. " " .. NORMAL_FONT_COLOR_CODE .. info.handler:GetCurrentProfile() .. FONT_COLOR_CODE_CLOSE end,
name = "t",
width = "default", width = "default",
}, },
choosedesc = { choosedesc = {
@@ -393,7 +387,6 @@ local optionsTable = {
order = 30, order = 30,
get = false, get = false,
set = "SetProfile", set = "SetProfile",
nullable = false, -- Ace3v: we do not want a null or empty value
}, },
choose = { choose = {
name = L["choose"], name = L["choose"],
@@ -403,7 +396,6 @@ local optionsTable = {
get = "GetCurrentProfile", get = "GetCurrentProfile",
set = "SetProfile", set = "SetProfile",
values = "ListProfiles", values = "ListProfiles",
valuesTableDestroyable = true,
arg = "common", arg = "common",
}, },
copydesc = { copydesc = {
@@ -419,7 +411,6 @@ local optionsTable = {
get = false, get = false,
set = "CopyProfile", set = "CopyProfile",
values = "ListProfiles", values = "ListProfiles",
valuesTableDestroyable = true,
disabled = "HasNoProfiles", disabled = "HasNoProfiles",
arg = "nocurrent", arg = "nocurrent",
}, },
@@ -436,7 +427,6 @@ local optionsTable = {
get = false, get = false,
set = "DeleteProfile", set = "DeleteProfile",
values = "ListProfiles", values = "ListProfiles",
valuesTableDestroyable = true,
disabled = "HasNoProfiles", disabled = "HasNoProfiles",
arg = "nocurrent", arg = "nocurrent",
confirm = true, confirm = true,
@@ -1,6 +1,6 @@
--- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs. --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
-- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3 -- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
-- stand-alone distribution. -- stand-alone distribution.
-- --
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly, -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -30,17 +30,13 @@ local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
if not AceGUI then return end -- No upgrade needed if not AceGUI then return end -- No upgrade needed
local AceCore = LibStub("AceCore-3.0")
local hooksecurefunc = AceCore.hooksecurefunc
local safecall = AceCore.safecall
-- Lua APIs -- Lua APIs
local tconcat, tremove, tinsert, tgetn, tsetn = table.concat, table.remove, table.insert, table.getn, table.setn local tconcat, tgetn, tremove, tinsert = table.concat, table.getn,table.remove, table.insert
local pairs, next, type = pairs, next, type local gsub, strupper = string.gsub, string.upper
local select, pairs, next, type = select, pairs, next, type
local error, assert, loadstring = error, assert, loadstring local error, assert, loadstring = error, assert, loadstring
local setmetatable, rawget, rawset = setmetatable, rawget, rawset local setmetatable, rawget, rawset = setmetatable, rawget, rawset
local math_max = math.max local math_max = math.max
local strupper, strfmt = string.upper, string.format
-- WoW APIs -- WoW APIs
local UIParent = UIParent local UIParent = UIParent
@@ -56,17 +52,73 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
AceGUI.WidgetBase = AceGUI.WidgetBase or {} AceGUI.WidgetBase = AceGUI.WidgetBase or {}
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {} AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {} AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
AceGUI.HookedFunctions = AceGUI.HookedFunctions or {}
-- local upvalues -- local upvalues
local WidgetRegistry = AceGUI.WidgetRegistry local WidgetRegistry = AceGUI.WidgetRegistry
local LayoutRegistry = AceGUI.LayoutRegistry local LayoutRegistry = AceGUI.LayoutRegistry
local WidgetVersions = AceGUI.WidgetVersions local WidgetVersions = AceGUI.WidgetVersions
local HookedFunctions = AceGUI.HookedFunctions
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function CreateDispatcher(argCount)
local code = [[
local method, ARGS
local function call() return method(ARGS) end
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = unpack(arg)
return xpcall(call, function(err) return geterrorhandler()(err) end)
end
return dispatch
]]
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = gsub(code, "ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
local function safecall(func, ...)
return Dispatchers[tgetn(arg)](func, unpack(arg))
end
-- Recycling functions -- Recycling functions
local newWidget, delWidget local newWidget, delWidget
do do
-- Version Upgrade in Minor 29
-- Internal Storage of the objects changed, from an array table
-- to a hash table, and additionally we introduced versioning on
-- the widgets which would discard all widgets from a pre-29 version
-- anyway, so we just clear the storage now, and don't try to
-- convert the storage tables to the new format.
-- This should generally not cause *many* widgets to end up in trash,
-- since once dialogs are opened, all addons should be loaded already
-- and AceGUI should be on the latest version available on the users
-- setup.
-- -- nevcairiel - Nov 2nd, 2009
if oldminor and oldminor < 29 and AceGUI.objPools then
AceGUI.objPools = nil
end
AceGUI.objPools = AceGUI.objPools or {} AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor --Returns a new instance, if none are available either returns a new table or calls the given contructor
@@ -74,11 +126,11 @@ do
if not WidgetRegistry[type] then if not WidgetRegistry[type] then
error("Attempt to instantiate unknown widget type", 2) error("Attempt to instantiate unknown widget type", 2)
end end
if not objPools[type] then if not objPools[type] then
objPools[type] = {} objPools[type] = {}
end end
local newObj = next(objPools[type]) local newObj = next(objPools[type])
if not newObj then if not newObj then
newObj = WidgetRegistry[type]() newObj = WidgetRegistry[type]()
@@ -105,35 +157,6 @@ do
end end
end end
-- Ace3v: when a container contains many children, we can only use the variable arguments
local function _fixlevels(parent, ...)
local lv = parent:GetFrameLevel() + 1
for i = 1, tgetn(arg) do
local child = arg[i]
child:SetFrameLevel(lv)
_fixlevels(child, child:GetChildren())
end
end
local function fixlevels(parent)
return _fixlevels(parent, parent:GetChildren())
end
AceGUI.fixlevels = fixlevels
-- Ace3v: attention! this function is recursive
local function _fixstrata(strata, parent, ...)
parent:SetFrameStrata(strata)
for i = 1, tgetn(arg) do
local child = arg[i]
_fixstrata(strata, child, child:GetChildren())
end
end
local function fixstrata(strata, parent)
return _fixstrata(strata, parent, parent:GetChildren())
end
AceGUI.fixstrata = fixstrata
------------------- -------------------
-- API Functions -- -- API Functions --
@@ -150,15 +173,27 @@ function AceGUI:Create(type)
if WidgetRegistry[type] then if WidgetRegistry[type] then
local widget = newWidget(type) local widget = newWidget(type)
if rawget(widget, "Acquire") then
widget.OnAcquire = widget.Acquire
widget.Acquire = nil
elseif rawget(widget, "Aquire") then
widget.OnAcquire = widget.Aquire
widget.Aquire = nil
end
if rawget(widget, "Release") then
widget.OnRelease = rawget(widget, "Release")
widget.Release = nil
end
if widget.OnAcquire then if widget.OnAcquire then
widget:OnAcquire() widget:OnAcquire()
else else
error(strfmt("Widget type %s doesn't supply an OnAcquire Function", type)) error(format("Widget type %s doesn't supply an OnAcquire Function", type))
end end
-- Set the default Layout ("List") -- Set the default Layout ("List")
safecall(widget.SetLayout, 2, widget, "List") safecall(widget.SetLayout, widget, "List")
safecall(widget.ResumeLayout, 1, widget) safecall(widget.ResumeLayout, widget)
return widget return widget
end end
end end
@@ -169,14 +204,14 @@ end
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well. -- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
-- @param widget The widget to release -- @param widget The widget to release
function AceGUI:Release(widget) function AceGUI:Release(widget)
safecall(widget.PauseLayout, 1, widget) safecall(widget.PauseLayout, widget)
widget:Fire("OnRelease") widget:Fire("OnRelease")
safecall(widget.ReleaseChildren, 1, widget) safecall(widget.ReleaseChildren, widget)
if widget.OnRelease then if widget.OnRelease then
widget:OnRelease() widget:OnRelease()
-- else -- else
-- error(strfmt("Widget type %s doesn't supply an OnRelease Function", widget.type)) -- error(format("Widget type %s doesn't supply an OnRelease Function", widget.type))
end end
for k in pairs(widget.userdata) do for k in pairs(widget.userdata) do
widget.userdata[k] = nil widget.userdata[k] = nil
@@ -211,7 +246,7 @@ end
-- @param widget The widget that should be focused -- @param widget The widget that should be focused
function AceGUI:SetFocus(widget) function AceGUI:SetFocus(widget)
if self.FocusedWidget and self.FocusedWidget ~= widget then if self.FocusedWidget and self.FocusedWidget ~= widget then
safecall(self.FocusedWidget.ClearFocus, 1, self.FocusedWidget) safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
end end
self.FocusedWidget = widget self.FocusedWidget = widget
end end
@@ -221,7 +256,7 @@ end
-- e.g. titlebar of a frame being clicked -- e.g. titlebar of a frame being clicked
function AceGUI:ClearFocus() function AceGUI:ClearFocus()
if self.FocusedWidget then if self.FocusedWidget then
safecall(self.FocusedWidget.ClearFocus, 1, self.FocusedWidget) safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
self.FocusedWidget = nil self.FocusedWidget = nil
end end
end end
@@ -232,18 +267,18 @@ end
--[[ --[[
Widgets must provide the following functions Widgets must provide the following functions
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
And the following members And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget() type - the type of the object, same as the name given to :RegisterWidget()
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided Placing values directly into a widget object should be avoided
If the Widget can act as a container for other Widgets the following If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to content - frame or derivitive that children will be anchored to
The Widget can supply the following Optional Members The Widget can supply the following Optional Members
:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data :OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
:OnWidthSet(width) - Called when the width of the widget is changed :OnWidthSet(width) - Called when the width of the widget is changed
@@ -259,33 +294,30 @@ end
-- Widget Base Template -- -- Widget Base Template --
-------------------------- --------------------------
do do
local WidgetBase = AceGUI.WidgetBase local WidgetBase = AceGUI.WidgetBase
WidgetBase.SetParent = function(self, parent) WidgetBase.SetParent = function(self, parent)
local frame = self.frame local frame = self.frame
frame:SetParent(nil) frame:SetParent(nil)
frame:SetParent(parent.content) frame:SetParent(parent.content)
self.parent = parent self.parent = parent
fixlevels(frame)
end end
WidgetBase.SetCallback = function(self, name, func) WidgetBase.SetCallback = function(self, name, func)
if type(func) == "function" then if type(func) == "function" then
self.events[name] = func self.events[name] = func
end end
end end
WidgetBase.Fire = function(self,name,argc,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) WidgetBase.Fire = function(self, name, ...)
argc = argc or 0 if self.events[name] then
local func = self.events[name] local success, ret = safecall(self.events[name], self, name, unpack(arg))
if func then
local success, ret = safecall(func,argc+3,self,name,argc,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
if success then if success then
return ret return ret
end end
end end
end end
WidgetBase.SetWidth = function(self, width) WidgetBase.SetWidth = function(self, width)
self.frame:SetWidth(width) self.frame:SetWidth(width)
self.frame.width = width self.frame.width = width
@@ -293,7 +325,7 @@ do
self:OnWidthSet(width) self:OnWidthSet(width)
end end
end end
WidgetBase.SetRelativeWidth = function(self, width) WidgetBase.SetRelativeWidth = function(self, width)
if width <= 0 or width > 1 then if width <= 0 or width > 1 then
error(":SetRelativeWidth(width): Invalid relative width.", 2) error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -301,7 +333,7 @@ do
self.relWidth = width self.relWidth = width
self.width = "relative" self.width = "relative"
end end
WidgetBase.SetHeight = function(self, height) WidgetBase.SetHeight = function(self, height)
self.frame:SetHeight(height) self.frame:SetHeight(height)
self.frame.height = height self.frame.height = height
@@ -309,7 +341,7 @@ do
self:OnHeightSet(height) self:OnHeightSet(height)
end end
end end
--[[ WidgetBase.SetRelativeHeight = function(self, height) --[[ WidgetBase.SetRelativeHeight = function(self, height)
if height <= 0 or height > 1 then if height <= 0 or height > 1 then
error(":SetRelativeHeight(height): Invalid relative height.", 2) error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -321,47 +353,47 @@ do
WidgetBase.IsVisible = function(self) WidgetBase.IsVisible = function(self)
return self.frame:IsVisible() return self.frame:IsVisible()
end end
WidgetBase.IsShown= function(self) WidgetBase.IsShown= function(self)
return self.frame:IsShown() return self.frame:IsShown()
end end
WidgetBase.Release = function(self) WidgetBase.Release = function(self)
AceGUI:Release(self) AceGUI:Release(self)
end end
WidgetBase.SetPoint = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) return self.frame:SetPoint(unpack(arg))
end end
WidgetBase.ClearAllPoints = function(self) WidgetBase.ClearAllPoints = function(self)
return self.frame:ClearAllPoints() return self.frame:ClearAllPoints()
end end
WidgetBase.GetNumPoints = function(self) WidgetBase.GetNumPoints = function(self)
return self.frame:GetNumPoints() return self.frame:GetNumPoints()
end end
WidgetBase.GetPoint = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) WidgetBase.GetPoint = function(self, ...)
return self.frame:GetPoint(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) return self.frame:GetPoint(unpack(arg))
end end
WidgetBase.GetUserDataTable = function(self) WidgetBase.GetUserDataTable = function(self)
return self.userdata return self.userdata
end end
WidgetBase.SetUserData = function(self, key, value) WidgetBase.SetUserData = function(self, key, value)
self.userdata[key] = value self.userdata[key] = value
end end
WidgetBase.GetUserData = function(self, key) WidgetBase.GetUserData = function(self, key)
return self.userdata[key] return self.userdata[key]
end end
WidgetBase.IsFullHeight = function(self) WidgetBase.IsFullHeight = function(self)
return self.height == "fill" return self.height == "fill"
end end
WidgetBase.SetFullHeight = function(self, isFull) WidgetBase.SetFullHeight = function(self, isFull)
if isFull then if isFull then
self.height = "fill" self.height = "fill"
@@ -369,11 +401,11 @@ do
self.height = nil self.height = nil
end end
end end
WidgetBase.IsFullWidth = function(self) WidgetBase.IsFullWidth = function(self)
return self.width == "fill" return self.width == "fill"
end end
WidgetBase.SetFullWidth = function(self, isFull) WidgetBase.SetFullWidth = function(self, isFull)
if isFull then if isFull then
self.width = "fill" self.width = "fill"
@@ -381,29 +413,29 @@ do
self.width = nil self.width = nil
end end
end end
-- local function LayoutOnUpdate(this) -- local function LayoutOnUpdate(this)
-- this:SetScript("OnUpdate",nil) -- this:SetScript("OnUpdate",nil)
-- this.obj:PerformLayout() -- this.obj:PerformLayout()
-- end -- end
local WidgetContainerBase = AceGUI.WidgetContainerBase local WidgetContainerBase = AceGUI.WidgetContainerBase
WidgetContainerBase.PauseLayout = function(self) WidgetContainerBase.PauseLayout = function(self)
self.LayoutPaused = true self.LayoutPaused = true
end end
WidgetContainerBase.ResumeLayout = function(self) WidgetContainerBase.ResumeLayout = function(self)
self.LayoutPaused = nil self.LayoutPaused = nil
end end
WidgetContainerBase.PerformLayout = function(self) WidgetContainerBase.PerformLayout = function(self)
if self.LayoutPaused then if self.LayoutPaused then
return return
end end
safecall(self.LayoutFunc, 2, self.content, self.children) safecall(self.LayoutFunc, self.content, self.children)
end end
--call this function to layout, makes sure layed out objects get a frame to get sizes etc --call this function to layout, makes sure layed out objects get a frame to get sizes etc
WidgetContainerBase.DoLayout = function(self) WidgetContainerBase.DoLayout = function(self)
self:PerformLayout() self:PerformLayout()
@@ -411,7 +443,7 @@ do
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate) -- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
-- end -- end
end end
WidgetContainerBase.AddChild = function(self, child, beforeWidget) WidgetContainerBase.AddChild = function(self, child, beforeWidget)
if beforeWidget then if beforeWidget then
local siblingIndex = 1 local siblingIndex = 1
@@ -419,7 +451,7 @@ do
if widget == beforeWidget then if widget == beforeWidget then
break break
end end
siblingIndex = siblingIndex + 1 siblingIndex = siblingIndex + 1
end end
tinsert(self.children, siblingIndex, child) tinsert(self.children, siblingIndex, child)
else else
@@ -429,52 +461,25 @@ do
child.frame:Show() child.frame:Show()
self:DoLayout() self:DoLayout()
end end
do WidgetContainerBase.AddChildren = function(self, ...)
local args = {nil,nil,nil,nil,nil,nil,nil,nil,nil,nil} for i = 1, tgetn(arg) do
WidgetContainerBase.AddChildren = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) local child = arg[i]
args[1] = a1
args[2] = a2
args[3] = a3
args[4] = a4
args[5] = a5
args[6] = a6
args[7] = a7
args[8] = a8
args[9] = a9
args[10] = a10
for i = 1,10 do
local child = args[i]
arg[i] = nil
if not child then break end
tinsert(self.children, child) tinsert(self.children, child)
child:SetParent(self) child:SetParent(self)
child.frame:Show() child.frame:Show()
end end
self:DoLayout() self:DoLayout()
end end
end -- WidgetContainerBase.AddChildren
WidgetContainerBase.ReleaseChildren = function(self) WidgetContainerBase.ReleaseChildren = function(self)
local children = self.children local children = self.children
for i = 1,tgetn(children) do for i = 1,tgetn(children) do
AceGUI:Release(tremove(children)) AceGUI:Release(children[i])
children[i] = nil
end end
end end
WidgetContainerBase.SetParent = function(self, parent)
WidgetBase.SetParent(self, parent)
local lv = self.frame:GetFrameLevel()
self.content:SetFrameLevel(lv+1)
local children = self.children
for i = 1,tgetn(children) do
local child = children[i]
child:SetParent(self)
end
end
WidgetContainerBase.SetLayout = function(self, Layout) WidgetContainerBase.SetLayout = function(self, Layout)
self.LayoutFunc = AceGUI:GetLayout(Layout) self.LayoutFunc = AceGUI:GetLayout(Layout)
end end
@@ -498,7 +503,7 @@ do
end end
end end
end end
local function ContentResize() local function ContentResize()
if this:GetWidth() and this:GetHeight() then if this:GetWidth() and this:GetHeight() then
this.width = this:GetWidth() this.width = this:GetWidth()
@@ -510,7 +515,7 @@ do
setmetatable(WidgetContainerBase, {__index=WidgetBase}) setmetatable(WidgetContainerBase, {__index=WidgetBase})
--One of these function should be called on each Widget Instance as part of its creation process --One of these function should be called on each Widget Instance as part of its creation process
--- Register a widget-class as a container for newly created widgets. --- Register a widget-class as a container for newly created widgets.
-- @param widget The widget class -- @param widget The widget class
function AceGUI:RegisterAsContainer(widget) function AceGUI:RegisterAsContainer(widget)
@@ -526,7 +531,7 @@ do
widget:SetLayout("List") widget:SetLayout("List")
return widget return widget
end end
--- Register a widget-class as a widget. --- Register a widget-class as a widget.
-- @param widget The widget class -- @param widget The widget class
function AceGUI:RegisterAsWidget(widget) function AceGUI:RegisterAsWidget(widget)
@@ -553,11 +558,11 @@ end
-- @param Version The version of the widget -- @param Version The version of the widget
function AceGUI:RegisterWidgetType(Name, Constructor, Version) function AceGUI:RegisterWidgetType(Name, Constructor, Version)
assert(type(Constructor) == "function") assert(type(Constructor) == "function")
assert(type(Version) == "number") assert(type(Version) == "number")
local oldVersion = WidgetVersions[Name] local oldVersion = WidgetVersions[Name]
if oldVersion and oldVersion >= Version then return end if oldVersion and oldVersion >= Version then return end
WidgetVersions[Name] = Version WidgetVersions[Name] = Version
WidgetRegistry[Name] = Constructor WidgetRegistry[Name] = Constructor
end end
@@ -568,7 +573,7 @@ end
function AceGUI:RegisterLayout(Name, LayoutFunc) function AceGUI:RegisterLayout(Name, LayoutFunc)
assert(type(LayoutFunc) == "function") assert(type(LayoutFunc) == "function")
if type(Name) == "string" then if type(Name) == "string" then
Name = string.upper(Name) Name = strupper(Name)
end end
LayoutRegistry[Name] = LayoutFunc LayoutRegistry[Name] = LayoutFunc
end end
@@ -626,7 +631,7 @@ AceGUI:RegisterLayout("List",
local width = content.width or content:GetWidth() or 0 local width = content.width or content:GetWidth() or 0
for i = 1, tgetn(children) do for i = 1, tgetn(children) do
local child = children[i] local child = children[i]
local frame = child.frame local frame = child.frame
frame:ClearAllPoints() frame:ClearAllPoints()
frame:Show() frame:Show()
@@ -635,25 +640,25 @@ AceGUI:RegisterLayout("List",
else else
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT") frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
end end
if child.width == "fill" then if child.width == "fill" then
child:SetWidth(width) child:SetWidth(width)
frame:SetPoint("RIGHT", content) frame:SetPoint("RIGHT", content)
if child.DoLayout then if child.DoLayout then
child:DoLayout() child:DoLayout()
end end
elseif child.width == "relative" then elseif child.width == "relative" then
child:SetWidth(width * child.relWidth) child:SetWidth(width * child.relWidth)
if child.DoLayout then if child.DoLayout then
child:DoLayout() child:DoLayout()
end end
end end
height = height + (frame.height or frame:GetHeight() or 0) height = height + (frame.height or frame:GetHeight() or 0)
end end
safecall(content.obj.LayoutFinished, 3, content.obj, nil, height) safecall(content.obj.LayoutFinished, content.obj, nil, height)
end) end)
-- A single control fills the whole content area -- A single control fills the whole content area
@@ -664,15 +669,14 @@ AceGUI:RegisterLayout("Fill",
children[1]:SetHeight(content:GetHeight() or 0) children[1]:SetHeight(content:GetHeight() or 0)
children[1].frame:SetAllPoints(content) children[1].frame:SetAllPoints(content)
children[1].frame:Show() children[1].frame:Show()
safecall(content.obj.LayoutFinished, 3, content.obj, nil, children[1].frame:GetHeight()) safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
end end
end) end)
-- Ace3v: currently only a1 used
local layoutrecursionblock = nil local layoutrecursionblock = nil
local function safelayoutcall(object, func, a1) local function safelayoutcall(object, func, ...)
layoutrecursionblock = true layoutrecursionblock = true
object[func](object, a1) object[func](object, unpack(arg))
layoutrecursionblock = nil layoutrecursionblock = nil
end end
@@ -687,18 +691,18 @@ AceGUI:RegisterLayout("Flow",
local rowheight = 0 local rowheight = 0
local rowoffset = 0 local rowoffset = 0
local lastrowoffset local lastrowoffset
local width = content.width or content:GetWidth() or 0 local width = content.width or content:GetWidth() or 0
--control at the start of the row --control at the start of the row
local rowstart local rowstart
local rowstartoffset local rowstartoffset
local lastrowstart local lastrowstart
local isfullheight local isfullheight
local frameoffset local frameoffset
local lastframeoffset local lastframeoffset
local oversize local oversize
for i = 1, tgetn(children) do for i = 1, tgetn(children) do
local child = children[i] local child = children[i]
oversize = nil oversize = nil
@@ -706,17 +710,17 @@ AceGUI:RegisterLayout("Flow",
local frameheight = frame.height or frame:GetHeight() or 0 local frameheight = frame.height or frame:GetHeight() or 0
local framewidth = frame.width or frame:GetWidth() or 0 local framewidth = frame.width or frame:GetWidth() or 0
lastframeoffset = frameoffset lastframeoffset = frameoffset
-- HACK: Why did we set a frameoffset of (frameheight / 2) ? -- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-- That was moving all widgets half the widgets size down, is that intended? -- That was moving all widgets half the widgets size down, is that intended?
-- Actually, it seems to be neccessary for many cases, we'll leave it in for now. -- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them. -- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-- TODO: Investigate moar! -- TODO: Investigate moar!
frameoffset = child.alignoffset or (frameheight / 2) frameoffset = child.alignoffset or (frameheight / 2)
if child.width == "relative" then if child.width == "relative" then
framewidth = width * child.relWidth framewidth = width * child.relWidth
end end
frame:Show() frame:Show()
frame:ClearAllPoints() frame:ClearAllPoints()
if i == 1 then if i == 1 then
@@ -755,11 +759,11 @@ AceGUI:RegisterLayout("Flow",
else else
--handles cases where the new height is higher than either control because of the offsets --handles cases where the new height is higher than either control because of the offsets
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset) --math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
--offset is always the larger of the two offsets --offset is always the larger of the two offsets
rowoffset = math_max(rowoffset, frameoffset) rowoffset = math_max(rowoffset, frameoffset)
rowheight = math_max(rowheight, rowoffset + (frameheight / 2)) rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset) frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
usedwidth = framewidth + usedwidth usedwidth = framewidth + usedwidth
end end
@@ -768,11 +772,11 @@ AceGUI:RegisterLayout("Flow",
if child.width == "fill" then if child.width == "fill" then
safelayoutcall(child, "SetWidth", width) safelayoutcall(child, "SetWidth", width)
frame:SetPoint("RIGHT", content) frame:SetPoint("RIGHT", content)
usedwidth = 0 usedwidth = 0
rowstart = frame rowstart = frame
rowstartoffset = frameoffset rowstartoffset = frameoffset
if child.DoLayout then if child.DoLayout then
child:DoLayout() child:DoLayout()
end end
@@ -781,7 +785,7 @@ AceGUI:RegisterLayout("Flow",
rowstartoffset = rowoffset rowstartoffset = rowoffset
elseif child.width == "relative" then elseif child.width == "relative" then
safelayoutcall(child, "SetWidth", width * child.relWidth) safelayoutcall(child, "SetWidth", width * child.relWidth)
if child.DoLayout then if child.DoLayout then
child:DoLayout() child:DoLayout()
end end
@@ -790,20 +794,20 @@ AceGUI:RegisterLayout("Flow",
frame:SetPoint("RIGHT", content) frame:SetPoint("RIGHT", content)
end end
end end
if child.height == "fill" then if child.height == "fill" then
frame:SetPoint("BOTTOM", content) frame:SetPoint("BOTTOM", content)
isfullheight = true isfullheight = true
end end
end end
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor --anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
if isfullheight then if isfullheight then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height) rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
elseif rowstart then elseif rowstart then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3)) rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
end end
height = height + rowheight + 3 height = height + rowheight + 3
safecall(content.obj.LayoutFinished, 3, content.obj, nil, height) safecall(content.obj.LayoutFinished, content.obj, nil, height)
end) end)
@@ -15,11 +15,11 @@ local CreateFrame = CreateFrame
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function SelectedGroup(self, event, _, value) local function SelectedGroup(self, event, value)
local group = self.parentgroup local group = self.parentgroup
local status = group.status or group.localstatus local status = group.status or group.localstatus
status.selected = value status.selected = value
self.parentgroup:Fire("OnGroupSelected", 1, value) self.parentgroup:Fire("OnGroupSelected", value)
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -63,7 +63,7 @@ local methods = {
self.dropdown:SetValue(group) self.dropdown:SetValue(group)
local status = self.status or self.localstatus local status = self.status or self.localstatus
status.selected = group status.selected = group
self:Fire("OnGroupSelected", 1, group) self:Fire("OnGroupSelected", group)
end, end,
["OnWidthSet"] = function(self, width) ["OnWidthSet"] = function(self, width)
@@ -150,7 +150,7 @@ local function Constructor()
widget[method] = func widget[method] = func
end end
dropdown.parentgroup = widget dropdown.parentgroup = widget
return AceGUI:RegisterAsContainer(widget) return AceGUI:RegisterAsContainer(widget)
end end
@@ -1,15 +1,13 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Frame Container Frame Container
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Frame", 24 local Type, Version = "Frame", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
local wipe = AceCore.wipe
-- Lua APIs -- Lua APIs
local pairs, assert, type = pairs, assert, type local pairs, assert, type = pairs, assert, type
local wipe = table.wipe
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
@@ -27,6 +25,10 @@ local function Button_OnClick()
this.obj:Hide() this.obj:Hide()
end end
local function Frame_OnShow()
this.obj:Fire("OnShow")
end
local function Frame_OnClose() local function Frame_OnClose()
this.obj:Fire("OnClose") this.obj:Fire("OnClose")
end end
@@ -188,6 +190,7 @@ local function Constructor()
frame:SetBackdropColor(0, 0, 0, 1) frame:SetBackdropColor(0, 0, 0, 1)
frame:SetMinResize(400, 200) frame:SetMinResize(400, 200)
frame:SetToplevel(true) frame:SetToplevel(true)
frame:SetScript("OnShow", Frame_OnShow)
frame:SetScript("OnHide", Frame_OnClose) frame:SetScript("OnHide", Frame_OnClose)
frame:SetScript("OnMouseDown", Frame_OnMouseDown) frame:SetScript("OnMouseDown", Frame_OnMouseDown)
@@ -245,7 +248,6 @@ local function Constructor()
titlebg_r:SetWidth(30) titlebg_r:SetWidth(30)
titlebg_r:SetHeight(40) titlebg_r:SetHeight(40)
-- bottom right sizer
local sizer_se = CreateFrame("Frame", nil, frame) local sizer_se = CreateFrame("Frame", nil, frame)
sizer_se:SetPoint("BOTTOMRIGHT", 0, 0) sizer_se:SetPoint("BOTTOMRIGHT", 0, 0)
sizer_se:SetWidth(25) sizer_se:SetWidth(25)
@@ -6,12 +6,9 @@ local Type, Version = "ScrollFrame", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local fixlevels = AceGUI.fixlevels
-- Lua APIs -- Lua APIs
local pairs, assert, type = pairs, assert, type local pairs, assert, type = pairs, assert, type
local min, max, floor, abs = math.min, math.max, math.floor, math.abs local min, max, floor, abs = math.min, math.max, math.floor, math.abs
local format = string.format
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
@@ -27,23 +24,23 @@ end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function ScrollFrame_OnMouseWheel() local function ScrollFrame_OnMouseWheel(frame, value)
this.obj:MoveScroll(arg1) frame.obj:MoveScroll(value)
end end
local function ScrollFrame_OnSizeChanged() local function ScrollFrame_OnSizeChanged()
this:SetScript("OnUpdate", FixScrollOnUpdate) this:SetScript("OnUpdate", FixScrollOnUpdate)
end end
local function ScrollBar_OnScrollValueChanged() local function ScrollBar_OnScrollValueChanged(frame, value)
this.obj:SetScroll(arg1) frame.obj:SetScroll(value)
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Methods Methods
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local methods = { local methods = {
["OnAcquire"] = function(self) ["OnAcquire"] = function(self)
self:SetScroll(0) self:SetScroll(0)
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate) self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
end, end,
@@ -53,7 +50,7 @@ local methods = {
for k in pairs(self.localstatus) do for k in pairs(self.localstatus) do
self.localstatus[k] = nil self.localstatus[k] = nil
end end
self.scrollframe:SetPoint("BOTTOMRIGHT",0,0) self.scrollframe:SetPoint("BOTTOMRIGHT", 0, 0)
self.scrollbar:Hide() self.scrollbar:Hide()
self.scrollBarShown = nil self.scrollBarShown = nil
self.content.height, self.content.width = nil, nil self.content.height, self.content.width = nil, nil
@@ -80,7 +77,7 @@ local methods = {
["MoveScroll"] = function(self, value) ["MoveScroll"] = function(self, value)
local status = self.status or self.localstatus local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
if self.scrollBarShown then if self.scrollBarShown then
local diff = height - viewheight local diff = height - viewheight
local delta = 1 local delta = 1
@@ -92,46 +89,40 @@ local methods = {
end, end,
["FixScroll"] = function(self) ["FixScroll"] = function(self)
if self.updateLock then return end if self.updateLock then return end
self.updateLock = true self.updateLock = true
local status = self.status or self.localstatus local status = self.status or self.localstatus
local scrollframe, content, scrollbar = self.scrollframe, self.content, self.scrollbar local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
local viewheight, height = self.scrollframe:GetHeight(), self.content:GetHeight()
local offset = status.offset or 0 local offset = status.offset or 0
local curvalue = scrollbar:GetValue() local curvalue = self.scrollbar:GetValue()
-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys -- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow! -- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
if viewheight < height + 2 then
if height < viewheight + 2 then
if self.scrollBarShown then if self.scrollBarShown then
self.scrollBarShown = nil self.scrollBarShown = nil
scrollbar:Hide() self.scrollbar:Hide()
scrollbar:SetValue(0) self.scrollbar:SetValue(0)
scrollframe:SetPoint("BOTTOMRIGHT",0,0) self.scrollframe:SetPoint("BOTTOMRIGHT", 0, 0)
self:DoLayout() self:DoLayout()
end end
offset = 0
else else
if not self.scrollBarShown then if not self.scrollBarShown then
self.scrollBarShown = true self.scrollBarShown = true
scrollbar:Show() self.scrollbar:Show()
scrollframe:SetPoint("BOTTOMRIGHT", -20, 0) self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
self:DoLayout() self:DoLayout()
end end
local value = (offset / (height - viewheight) * 1000) local value = (offset / (viewheight - height) * 1000)
if value > 1000 then if value > 1000 then value = 1000 end
value = 1000 self.scrollbar:SetValue(value)
offset = height - viewheight
end
scrollbar:SetValue(value)
self:SetScroll(value) self:SetScroll(value)
if value < 1000 then
self.content:ClearAllPoints()
self.content:SetPoint("TOPLEFT", 0, offset)
self.content:SetPoint("TOPRIGHT", 0, offset)
status.offset = offset
end
end end
status.offset = offset
scrollframe:SetScrollChild(content)
content:ClearAllPoints()
content:SetPoint("TOPLEFT", 0, offset)
content:SetPoint("TOPRIGHT", 0, offset)
self.updateLock = nil self.updateLock = nil
end, end,
@@ -166,8 +157,8 @@ local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type) local num = AceGUI:GetNextWidgetNum(Type)
local scrollframe = CreateFrame("ScrollFrame", nil, frame) local scrollframe = CreateFrame("ScrollFrame", nil, frame)
scrollframe:SetPoint("TOPLEFT",0,0) scrollframe:SetPoint("TOPLEFT", 0, 0)
scrollframe:SetPoint("BOTTOMRIGHT",0,0) scrollframe:SetPoint("BOTTOMRIGHT", 0, 0)
scrollframe:EnableMouseWheel(true) scrollframe:EnableMouseWheel(true)
scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel) scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel)
scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged) scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged)
@@ -189,8 +180,8 @@ local function Constructor()
--Container Support --Container Support
local content = CreateFrame("Frame", nil, scrollframe) local content = CreateFrame("Frame", nil, scrollframe)
content:SetPoint("TOPLEFT",0,0) content:SetPoint("TOPLEFT", 0, 0)
content:SetPoint("TOPRIGHT",0,0) content:SetPoint("TOPRIGHT", 0, 0)
content:SetHeight(400) content:SetHeight(400)
scrollframe:SetScrollChild(content) scrollframe:SetScrollChild(content)
@@ -2,22 +2,18 @@
TabGroup Container TabGroup Container
Container that uses tabs on top to switch between groups. Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "TabGroup", 35 local Type, Version = "TabGroup", 36
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
local wipe = AceCore.wipe
-- Lua APIs -- Lua APIs
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
local tgetn = table.getn local tgetn = table.getn
local strfmt = string.format
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local _G = AceCore._G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- List them here for Mikk's FindGlobals script
@@ -34,60 +30,57 @@ Support functions
local function UpdateTabLook(frame) local function UpdateTabLook(frame)
if frame.disabled then if frame.disabled then
PanelTemplates_SetDisabledTabState(frame) PanelTemplates_SetDisabledTabState(frame)
frame:SetAlpha(0.5)
elseif frame.selected then elseif frame.selected then
PanelTemplates_SelectTab(frame) PanelTemplates_SelectTab(frame)
frame:SetAlpha(1)
else else
PanelTemplates_DeselectTab(frame) PanelTemplates_DeselectTab(frame)
frame:SetAlpha(0.5)
end end
end end
local function Tab_SetText(tab, text) local function Tab_SetText(frame, text)
tab:_SetText(text) frame:_SetText(text)
local width = tab.obj.frame.width or tab.obj.frame:GetWidth() or 0 local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
PanelTemplates_TabResize(0, tab, nil, width) PanelTemplates_TabResize(frame, 0, nil, width, frame:GetFontString():GetStringWidth())
end end
local function Tab_SetSelected(tab, selected) local function Tab_SetSelected(frame, selected)
tab.selected = selected frame.selected = selected
UpdateTabLook(tab) UpdateTabLook(frame)
end end
local function Tab_SetDisabled(tab, disabled) local function Tab_SetDisabled(frame, disabled)
tab.disabled = disabled frame.disabled = disabled
UpdateTabLook(tab) UpdateTabLook(frame)
end end
local function BuildTabsOnUpdate() local function BuildTabsOnUpdate(frame)
local self = this.obj local self = frame.obj
self:BuildTabs() self:BuildTabs()
this:SetScript("OnUpdate", nil) frame:SetScript("OnUpdate", nil)
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Tab_OnClick() local function Tab_OnClick(frame)
if not (this.selected or this.disabled) then if not (frame.selected or frame.disabled) then
PlaySound("igCharacterInfoTab") PlaySound("igCharacterInfoTab")
this.obj:SelectTab(this.value) frame.obj:SelectTab(frame.value)
end end
end end
local function Tab_OnEnter() local function Tab_OnEnter(frame)
local self = this.obj local self = frame.obj
self:Fire("OnTabEnter", 2, self.tabs[this.id].value, this) self:Fire("OnTabEnter", self.tabs[frame.id].value, frame)
end end
local function Tab_OnLeave() local function Tab_OnLeave(frame)
local self = this.obj local self = frame.obj
self:Fire("OnTabLeave", 2, self.tabs[this.id].value, this) self:Fire("OnTabLeave", self.tabs[frame.id].value, frame)
end end
local function Tab_OnShow() local function Tab_OnShow(frame)
_G[this:GetName().."HighlightTexture"]:SetWidth(this:GetTextWidth() + 30) _G[frame:GetName().."HighlightTexture"]:SetWidth(frame:GetTextWidth() + 30)
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -110,31 +103,16 @@ local methods = {
end, end,
["CreateTab"] = function(self, id) ["CreateTab"] = function(self, id)
local tabname = strfmt("AceGUITabGroup%dTab%d", self.num, id) local tabname = format("AceGUITabGroup%dTab%d", self.num, id)
local tab = CreateFrame("Button", tabname, self.border, "TabButtonTemplate") local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
-- Normal texture
local texture = getglobal(tabname.."Left")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
texture:ClearAllPoints()
texture:SetPoint("BOTTOMLEFT", tab,"BOTTOMLEFT")
texture:SetPoint("TOPLEFT", tab,"TOPLEFT")
texture = getglobal(tabname.."Middle")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
texture = getglobal(tabname.."Right")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
-- Disabled texture
texture = getglobal(tabname.."LeftDisabled")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
texture:SetPoint("BOTTOMLEFT", tab,"BOTTOMLEFT")
texture:SetPoint("TOPLEFT", tab,"TOPLEFT")
texture = getglobal(tabname.."MiddleDisabled")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
texture = getglobal(tabname.."RightDisabled")
texture:SetTexture("Interface\\ChatFrame\\ChatFrameTab")
tab.obj = self tab.obj = self
tab.id = id tab.id = id
tab.text = _G[tabname .. "Text"]
tab.text:ClearAllPoints()
tab.text:SetPoint("LEFT", 14, -3)
tab.text:SetPoint("RIGHT", -12, -3)
tab:SetScript("OnClick", Tab_OnClick) tab:SetScript("OnClick", Tab_OnClick)
tab:SetScript("OnEnter", Tab_OnEnter) tab:SetScript("OnEnter", Tab_OnEnter)
tab:SetScript("OnLeave", Tab_OnLeave) tab:SetScript("OnLeave", Tab_OnLeave)
@@ -176,7 +154,7 @@ local methods = {
end end
status.selected = value status.selected = value
if found then if found then
self:Fire("OnGroupSelected",1,value) self:Fire("OnGroupSelected",value)
end end
end, end,
@@ -184,22 +162,22 @@ local methods = {
self.tablist = tabs self.tablist = tabs
self:BuildTabs() self:BuildTabs()
end, end,
["BuildTabs"] = function(self) ["BuildTabs"] = function(self)
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "") local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
local status = self.status or self.localstatus local status = self.status or self.localstatus
local tablist = self.tablist local tablist = self.tablist
local tabs = self.tabs local tabs = self.tabs
if not tablist then return end if not tablist then return end
local width = self.frame.width or self.frame:GetWidth() or 0 local width = self.frame.width or self.frame:GetWidth() or 0
wipe(widths) wipe(widths)
wipe(rowwidths) wipe(rowwidths)
wipe(rowends) wipe(rowends)
--Place Text into tabs and get thier initial width --Place Text into tabs and get thier initial width
for i, v in ipairs(tablist) do for i, v in ipairs(tablist) do
local tab = tabs[i] local tab = tabs[i]
@@ -207,24 +185,19 @@ local methods = {
tab = self:CreateTab(i) tab = self:CreateTab(i)
tabs[i] = tab tabs[i] = tab
end end
tab:Show() tab:Show()
if type(v) == "table" then tab:SetText(v.text)
tab:SetText(v.text) tab:SetDisabled(v.disabled)
tab:SetDisabled(v.disabled) tab.value = v.value
tab.value = v.value
elseif type(v) == "string" then
tab:SetText(v)
tab.value = v
end
widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
end end
for i = tgetn(tablist)+1, tgetn(tabs), 1 do for i = tgetn(tablist)+1, tgetn(tabs), 1 do
tabs[i]:Hide() tabs[i]:Hide()
end end
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout --First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
local numtabs = tgetn(tablist) local numtabs = tgetn(tablist)
local numrows = 1 local numrows = 1
@@ -242,7 +215,7 @@ local methods = {
end end
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = tgetn(tablist) rowends[numrows] = tgetn(tablist)
--Fix for single tabs being left on the last row, move a tab from the row above if applicable --Fix for single tabs being left on the last row, move a tab from the row above if applicable
if numrows > 1 then if numrows > 1 then
--if the last row has only one tab --if the last row has only one tab
@@ -273,23 +246,23 @@ local methods = {
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0) tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
end end
end end
-- equal padding for each tab to fill the available width, -- equal padding for each tab to fill the available width,
-- if the used space is above 75% already -- if the used space is above 75% already
-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame, -- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't -- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
local padding = 0 local padding = 0
if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
padding = (width - rowwidths[row]) / (endtab - starttab+1) padding = (width - rowwidths[row]) / (endtab - starttab+1)
end end
for i = starttab, endtab do for i = starttab, endtab do
PanelTemplates_TabResize(padding + 4, tabs[i], nil, width) PanelTemplates_TabResize(tabs[i], padding + 4, nil, width, tabs[i]:GetFontString():GetStringWidth())
end end
starttab = endtab + 1 starttab = endtab + 1
end end
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)+7 self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
self.border:SetPoint("TOPLEFT", 1, -self.borderoffset) self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
end, end,
@@ -314,7 +287,7 @@ local methods = {
content:SetHeight(contentheight) content:SetHeight(contentheight)
content.height = contentheight content.height = contentheight
end, end,
["LayoutFinished"] = function(self, width, height) ["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end if self.noAutoHeight then return end
self:SetHeight((height or 0) + (self.borderoffset + 23)) self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -371,7 +344,7 @@ local function Constructor()
for method, func in pairs(methods) do for method, func in pairs(methods) do
widget[method] = func widget[method] = func
end end
return AceGUI:RegisterAsContainer(widget) return AceGUI:RegisterAsContainer(widget)
end end
@@ -6,15 +6,12 @@ local Type, Version = "TreeGroup", 40
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
local strsplit = AceCore.strsplit
local _G = AceCore._G
-- Lua APIs -- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
local math_min, math_max, floor = math.min, math.max, floor local math_min, math_max, floor = math.min, math.max, floor
local tgetn, tremove, unpack, tconcat = table.getn, table.remove, unpack, table.concat local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
local strfmt = string.format local strsplit = string.split
local tgetn = table.getn
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
@@ -39,7 +36,7 @@ do
function del(t) function del(t)
for k in pairs(t) do for k in pairs(t) do
t[k] = nil t[k] = nil
end end
pool[t] = true pool[t] = true
end end
end end
@@ -70,7 +67,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local value = treeline.value local value = treeline.value
local uniquevalue = treeline.uniquevalue local uniquevalue = treeline.uniquevalue
local disabled = treeline.disabled local disabled = treeline.disabled
button.treeline = treeline button.treeline = treeline
button.value = value button.value = value
button.uniquevalue = uniquevalue button.uniquevalue = uniquevalue
@@ -84,17 +81,16 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local normalTexture = button:GetNormalTexture() local normalTexture = button:GetNormalTexture()
local line = button.line local line = button.line
button.level = level button.level = level
if ( level == 1 ) then if ( level == 1 ) then
button.text:SetFontObject("GameFontNormal") button:SetNormalFontObject("GameFontNormal")
button:SetHighlightFontObject("GameFontHighlight") button:SetHighlightFontObject("GameFontHighlight")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2) button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
else else
button.text:SetFontObject("GameFontHighlightSmall") button:SetNormalFontObject("GameFontHighlightSmall")
button:SetHighlightFontObject("GameFontHighlightSmall") button:SetHighlightFontObject("GameFontHighlightSmall")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2) button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
end end
if disabled then if disabled then
button:EnableMouse(false) button:EnableMouse(false)
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE) button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -102,20 +98,20 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
button.text:SetText(text) button.text:SetText(text)
button:EnableMouse(true) button:EnableMouse(true)
end end
if icon then if icon then
button.icon:SetTexture(icon) button.icon:SetTexture(icon)
button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1) button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
else else
button.icon:SetTexture(nil) button.icon:SetTexture(nil)
end end
if iconCoords then if iconCoords then
button.icon:SetTexCoord(unpack(iconCoords)) button.icon:SetTexCoord(unpack(iconCoords))
else else
button.icon:SetTexCoord(0, 1, 0, 1) button.icon:SetTexCoord(0, 1, 0, 1)
end end
if canExpand then if canExpand then
if not isExpanded then if not isExpanded then
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP") toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
@@ -160,143 +156,134 @@ local function addLine(self, v, tree, level, parent)
else else
line.hasChildren = nil line.hasChildren = nil
end end
tinsert(self.lines, line) self.lines[tgetn(self.lines)+1] = line
return line return line
end end
--fire an update after one frame to catch the treeframes height --fire an update after one frame to catch the treeframes height
local function FirstFrameUpdate() local function FirstFrameUpdate(frame)
local self = this.obj local self = frame.obj
this:SetScript("OnUpdate", nil) frame:SetScript("OnUpdate", nil)
self:RefreshTree() self:RefreshTree()
end end
local BuildUniqueValue local function BuildUniqueValue(...)
do local n = select('#', arg)
local args = {nil,nil,nil,nil,nil,nil,nil,nil,nil,nil} if n == 1 then
function BuildUniqueValue(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) return arg1
args[1] = a1 else
args[2] = a2 return (unpack(arg)).."\001"..BuildUniqueValue(select(2,arg))
args[3] = a3 end
args[4] = a4
args[5] = a5
args[6] = a6
args[7] = a7
args[8] = a8
args[9] = a9
args[10] = a10
return tconcat(tmp, "\001", 1, tgetn(args))
end
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Expand_OnClick() local function Expand_OnClick(frame)
local button = this.button local button = frame.button
local self = button.obj local self = button.obj
local status = (self.status or self.localstatus).groups local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue] status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree() self:RefreshTree()
end end
local function Button_OnClick() local function Button_OnClick(frame)
local self = this.obj local self = frame.obj
self:Fire("OnClick", 2, this.uniquevalue, this.selected) self:Fire("OnClick", frame.uniquevalue, frame.selected)
if not this.selected then if not frame.selected then
self:SetSelected(this.uniquevalue) self:SetSelected(frame.uniquevalue)
this.selected = true frame.selected = true
this:LockHighlight() frame:LockHighlight()
self:RefreshTree() self:RefreshTree()
end end
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function Button_OnDoubleClick() local function Button_OnDoubleClick(button)
local self = this.obj local self = button.obj
local status = self.status or self.localstatus local status = self.status or self.localstatus
local status = (self.status or self.localstatus).groups local status = (self.status or self.localstatus).groups
status[this.uniquevalue] = not status[this.uniquevalue] status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree() self:RefreshTree()
end end
local function Button_OnEnter() local function Button_OnEnter(frame)
local self = this.obj local self = frame.obj
self:Fire("OnButtonEnter", 2, this.uniquevalue, this) self:Fire("OnButtonEnter", frame.uniquevalue, frame)
if self.enabletooltips then if self.enabletooltips then
GameTooltip:SetOwner(this, "ANCHOR_NONE") GameTooltip:SetOwner(frame, "ANCHOR_NONE")
GameTooltip:SetPoint("LEFT",this,"RIGHT") GameTooltip:SetPoint("LEFT",frame,"RIGHT")
GameTooltip:SetText(this.text:GetText() or "", 1, .82, 0, true) GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, 1)
GameTooltip:Show() GameTooltip:Show()
end end
end end
local function Button_OnLeave() local function Button_OnLeave(frame)
local self = this.obj local self = frame.obj
self:Fire("OnButtonLeave", 2, this.uniquevalue, this) self:Fire("OnButtonLeave", frame.uniquevalue, frame)
if self.enabletooltips then if self.enabletooltips then
GameTooltip:Hide() GameTooltip:Hide()
end end
end end
local function OnScrollValueChanged() local function OnScrollValueChanged(frame, value)
if this.obj.noupdate then return end if frame.obj.noupdate then return end
local self = this.obj local self = frame.obj
local status = self.status or self.localstatus local status = self.status or self.localstatus
status.scrollvalue = floor(arg1 + 0.5) status.scrollvalue = floor(value + 0.5)
self:RefreshTree() self:RefreshTree()
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function Tree_OnSizeChanged() local function Tree_OnSizeChanged(frame)
this.obj:RefreshTree() frame.obj:RefreshTree()
end end
local function Tree_OnMouseWheel() local function Tree_OnMouseWheel(frame, delta)
local self = this.obj local self = frame.obj
if self.showscroll then if self.showscroll then
local scrollbar = self.scrollbar local scrollbar = self.scrollbar
local min, max = scrollbar:GetMinMaxValues() local min, max = scrollbar:GetMinMaxValues()
local value = scrollbar:GetValue() local value = scrollbar:GetValue()
local newvalue = math_min(max,math_max(min,value - arg1)) local newvalue = math_min(max,math_max(min,value - delta))
if value ~= newvalue then if value ~= newvalue then
scrollbar:SetValue(newvalue) scrollbar:SetValue(newvalue)
end end
end end
end end
local function Dragger_OnLeave() local function Dragger_OnLeave(frame)
this:SetBackdropColor(1, 1, 1, 0) frame:SetBackdropColor(1, 1, 1, 0)
end end
local function Dragger_OnEnter() local function Dragger_OnEnter(frame)
this:SetBackdropColor(1, 1, 1, 0.8) frame:SetBackdropColor(1, 1, 1, 0.8)
end end
local function Dragger_OnMouseDown() local function Dragger_OnMouseDown(frame)
local treeframe = this:GetParent() local treeframe = frame:GetParent()
treeframe:StartSizing("RIGHT") treeframe:StartSizing("RIGHT")
end end
local function Dragger_OnMouseUp() local function Dragger_OnMouseUp(frame)
local treeframe = this:GetParent() local treeframe = frame:GetParent()
local self = treeframe.obj local self = treeframe.obj
local this = treeframe:GetParent() local frame = treeframe:GetParent()
treeframe:StopMovingOrSizing() treeframe:StopMovingOrSizing()
--treeframe:SetScript("OnUpdate", nil) --treeframe:SetScript("OnUpdate", nil)
treeframe:SetUserPlaced(false) treeframe:SetUserPlaced(false)
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize --Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
treeframe:SetHeight(0) treeframe:SetHeight(0)
treeframe:SetPoint("TOPLEFT", this, "TOPLEFT",0,0) treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT", this, "BOTTOMLEFT",0,0) treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
local status = self.status or self.localstatus local status = self.status or self.localstatus
status.treewidth = treeframe:GetWidth() status.treewidth = treeframe:GetWidth()
treeframe.obj:Fire("OnTreeResize", 1, treeframe:GetWidth()) treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-- recalculate the content width -- recalculate the content width
treeframe.obj:OnWidthSet(status.fullwidth) treeframe.obj:OnWidthSet(status.fullwidth)
-- update the layout of the content -- update the layout of the content
@@ -306,10 +293,7 @@ end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Methods Methods
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local methods local methods = {
do
local select_args = {nil,nil,nil,nil,nil,nil,nil,nil,nil,nil}
methods = {
["OnAcquire"] = function(self) ["OnAcquire"] = function(self)
self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE) self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
self:EnableButtonTooltips(true) self:EnableButtonTooltips(true)
@@ -338,39 +322,8 @@ methods = {
["CreateButton"] = function(self) ["CreateButton"] = function(self)
local num = AceGUI:GetNextWidgetNum("TreeGroupButton") local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
local button = CreateFrame("Button", format("AceGUI30TreeButton%d", num), self.treeframe, "OptionsListButtonTemplate")
local button = CreateFrame("Button", strfmt("AceGUI30TreeButton%d", num), self.treeframe)
button.obj = self button.obj = self
button:SetWidth(175)
button:SetHeight(18)
local toggle = CreateFrame("Button", nil, button)
toggle.obj = button
button.toggle = toggle
toggle:SetWidth(14)
toggle:SetHeight(14)
toggle:ClearAllPoints()
toggle:SetPoint("TOPRIGHT", button, "TOPRIGHT", -6, -1)
toggle:SetScript("OnClick", Button_OnClick)
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
toggle:SetHighlightTexture("Interface\Buttons\UI-PlusButton-Hilight", "ADD")
local text = button:CreateFontString()
button.text = text
text:SetFontObject(GameFontNormal)
button:SetHighlightFontObject(GameFontHighlight)
text:SetPoint("RIGHT", toggle, "LEFT", -2, 0);
text:SetJustifyH("LEFT")
local highlight = button:CreateTexture(nil, "HIGHLIGHT");
button.highlight = highlight
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestLogTitleHighlight")
highlight:SetBlendMode("ADD")
highlight:SetVertexColor(.196, .388, .8);
highlight:ClearAllPoints()
highlight:SetPoint("TOPLEFT",0,1)
highlight:SetPoint("BOTTOMRIGHT",0,1)
local icon = button:CreateTexture(nil, "OVERLAY") local icon = button:CreateTexture(nil, "OVERLAY")
icon:SetWidth(14) icon:SetWidth(14)
@@ -412,8 +365,8 @@ methods = {
--sets the tree to be displayed --sets the tree to be displayed
["SetTree"] = function(self, tree, filter) ["SetTree"] = function(self, tree, filter)
self.filter = filter self.filter = filter
if tree then if tree then
assert(type(tree) == "table") assert(type(tree) == "table")
end end
self.tree = tree self.tree = tree
self:RefreshTree() self:RefreshTree()
@@ -422,7 +375,7 @@ methods = {
["BuildLevel"] = function(self, tree, level, parent) ["BuildLevel"] = function(self, tree, level, parent)
local groups = (self.status or self.localstatus).groups local groups = (self.status or self.localstatus).groups
local hasChildren = self.hasChildren local hasChildren = self.hasChildren
for i, v in ipairs(tree) do for i, v in ipairs(tree) do
if v.children then if v.children then
if not self.filter or ShouldDisplayLevel(v.children) then if not self.filter or ShouldDisplayLevel(v.children) then
@@ -438,7 +391,7 @@ methods = {
end, end,
["RefreshTree"] = function(self,scrollToSelection) ["RefreshTree"] = function(self,scrollToSelection)
local buttons = self.buttons local buttons = self.buttons
local lines = self.lines local lines = self.lines
for i, v in ipairs(buttons) do for i, v in ipairs(buttons) do
@@ -459,7 +412,7 @@ methods = {
local tree = self.tree local tree = self.tree
local treeframe = self.treeframe local treeframe = self.treeframe
status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below) status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below)
self:BuildLevel(tree, 1) self:BuildLevel(tree, 1)
@@ -470,7 +423,7 @@ methods = {
if maxlines <= 0 then return end if maxlines <= 0 then return end
local first, last local first, last
scrollToSelection = status.scrollToSelection scrollToSelection = status.scrollToSelection
status.scrollToSelection = nil status.scrollToSelection = nil
@@ -546,41 +499,32 @@ methods = {
button:Show() button:Show()
buttonnum = buttonnum + 1 buttonnum = buttonnum + 1
end end
end, end,
["SetSelected"] = function(self, value) ["SetSelected"] = function(self, value)
local status = self.status or self.localstatus local status = self.status or self.localstatus
if status.selected ~= value then if status.selected ~= value then
status.selected = value status.selected = value
self:Fire("OnGroupSelected", 1, value) self:Fire("OnGroupSelected", value)
end end
end, end,
["Select"] = function(self, uniquevalue, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) ["Select"] = function(self, uniquevalue, ...)
self.filter = false self.filter = false
local status = self.status or self.localstatus local status = self.status or self.localstatus
local groups = status.groups local groups = status.groups
select_args[1] = a1 local path = {unpack(arg)}
select_args[2] = a2 for i = 1, tgetn(path) do
select_args[3] = a3 groups[tconcat(path, "\001", 1, i)] = true
select_args[4] = a4
select_args[5] = a5
select_args[6] = a6
select_args[7] = a7
select_args[8] = a8
select_args[9] = a9
select_args[10] = a10
for i = 1, tgetn(select_args) do
groups[tconcat(select_args, "\001", 1, i)] = true
end end
status.selected = uniquevalue status.selected = uniquevalue
self:RefreshTree(true) self:RefreshTree(true)
self:Fire("OnGroupSelected", 1, uniquevalue) self:Fire("OnGroupSelected", uniquevalue)
end, end,
["SelectByPath"] = function(self, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) ["SelectByPath"] = function(self, ...)
self:Select(BuildUniqueValue(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10), a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) self:Select(BuildUniqueValue(unpack(arg)), unpack(arg))
end, end,
["SelectByValue"] = function(self, uniquevalue) ["SelectByValue"] = function(self, uniquevalue)
@@ -607,16 +551,16 @@ methods = {
local treeframe = self.treeframe local treeframe = self.treeframe
local status = self.status or self.localstatus local status = self.status or self.localstatus
status.fullwidth = width status.fullwidth = width
local contentwidth = width - status.treewidth - 20 local contentwidth = width - status.treewidth - 20
if contentwidth < 0 then if contentwidth < 0 then
contentwidth = 0 contentwidth = 0
end end
content:SetWidth(contentwidth) content:SetWidth(contentwidth)
content.width = contentwidth content.width = contentwidth
local maxtreewidth = math_min(400, width - 50) local maxtreewidth = math_min(400, width - 50)
if maxtreewidth > 100 and status.treewidth > maxtreewidth then if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable) self:SetTreeWidth(maxtreewidth, status.treesizable)
end end
@@ -642,16 +586,16 @@ methods = {
treewidth = DEFAULT_TREE_WIDTH treewidth = DEFAULT_TREE_WIDTH
else else
resizable = false resizable = false
treewidth = DEFAULT_TREE_WIDTH treewidth = DEFAULT_TREE_WIDTH
end end
end end
self.treeframe:SetWidth(treewidth) self.treeframe:SetWidth(treewidth)
self.dragger:EnableMouse(resizable) self.dragger:EnableMouse(resizable)
local status = self.status or self.localstatus local status = self.status or self.localstatus
status.treewidth = treewidth status.treewidth = treewidth
status.treesizable = resizable status.treesizable = resizable
-- recalculate the content width -- recalculate the content width
if status.fullwidth then if status.fullwidth then
self:OnWidthSet(status.fullwidth) self:OnWidthSet(status.fullwidth)
@@ -668,7 +612,6 @@ methods = {
self:SetHeight((height or 0) + 20) self:SetHeight((height or 0) + 20)
end end
} }
end -- method
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Constructor Constructor
@@ -692,8 +635,8 @@ local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent)
local treeframe = CreateFrame("Frame", nil, frame) local treeframe = CreateFrame("Frame", nil, frame)
treeframe:SetPoint("TOPLEFT", 0, 0) treeframe:SetPoint("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT", 0, 0) treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH) treeframe:SetWidth(DEFAULT_TREE_WIDTH)
treeframe:EnableMouseWheel(true) treeframe:EnableMouseWheel(true)
treeframe:SetBackdrop(PaneBackdrop) treeframe:SetBackdrop(PaneBackdrop)
@@ -717,7 +660,7 @@ local function Constructor()
dragger:SetScript("OnMouseDown", Dragger_OnMouseDown) dragger:SetScript("OnMouseDown", Dragger_OnMouseDown)
dragger:SetScript("OnMouseUp", Dragger_OnMouseUp) dragger:SetScript("OnMouseUp", Dragger_OnMouseUp)
local scrollbar = CreateFrame("Slider", strfmt("AceConfigDialogTreeGroup%dScrollBar", num), treeframe, "UIPanelScrollBarTemplate") local scrollbar = CreateFrame("Slider", format("AceConfigDialogTreeGroup%dScrollBar", num), treeframe, "UIPanelScrollBarTemplate")
scrollbar:SetScript("OnValueChanged", nil) scrollbar:SetScript("OnValueChanged", nil)
scrollbar:SetPoint("TOPRIGHT", -10, -26) scrollbar:SetPoint("TOPRIGHT", -10, -26)
scrollbar:SetPoint("BOTTOMRIGHT", -10, 26) scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
@@ -733,7 +676,7 @@ local function Constructor()
local border = CreateFrame("Frame",nil,frame) local border = CreateFrame("Frame",nil,frame)
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT") border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT", 0, 0) border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5) border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
border:SetBackdropBorderColor(0.4, 0.4, 0.4) border:SetBackdropBorderColor(0.4, 0.4, 0.4)
@@ -21,27 +21,31 @@ local CreateFrame, UIParent = CreateFrame, UIParent
]] ]]
do do
local Type = "Window" local Type = "Window"
local Version = 4 local Version = 6
local function frameOnClose() local function frameOnShow(this)
this.obj:Fire("OnShow")
end
local function frameOnClose(this)
this.obj:Fire("OnClose") this.obj:Fire("OnClose")
end end
local function closeOnClick() local function closeOnClick(this)
PlaySound("gsTitleOptionExit") PlaySound("gsTitleOptionExit")
this.obj:Hide() this.obj:Hide()
end end
local function frameOnMouseDown() local function frameOnMouseDown(this)
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function titleOnMouseDown() local function titleOnMouseDown(this)
this:GetParent():StartMoving() this:GetParent():StartMoving()
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function frameOnMouseUp() local function frameOnMouseUp(this)
local frame = this:GetParent() local frame = this:GetParent()
frame:StopMovingOrSizing() frame:StopMovingOrSizing()
local self = frame.obj local self = frame.obj
@@ -52,22 +56,22 @@ do
status.left = frame:GetLeft() status.left = frame:GetLeft()
end end
local function sizerseOnMouseDown() local function sizerseOnMouseDown(this)
this:GetParent():StartSizing("BOTTOMRIGHT") this:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function sizersOnMouseDown() local function sizersOnMouseDown(this)
this:GetParent():StartSizing("BOTTOM") this:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function sizereOnMouseDown() local function sizereOnMouseDown(this)
this:GetParent():StartSizing("RIGHT") this:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function sizerOnMouseUp() local function sizerOnMouseUp(this)
this:GetParent():StopMovingOrSizing() this:GetParent():StopMovingOrSizing()
end end
@@ -180,6 +184,7 @@ do
frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetScript("OnMouseDown", frameOnMouseDown) frame:SetScript("OnMouseDown", frameOnMouseDown)
frame:SetScript("OnShow",frameOnShow)
frame:SetScript("OnHide",frameOnClose) frame:SetScript("OnHide",frameOnClose)
frame:SetMinResize(240,240) frame:SetMinResize(240,240)
frame:SetToplevel(true) frame:SetToplevel(true)
@@ -2,24 +2,83 @@
Button Widget (Modified to change text color on SetDisabled method) Button Widget (Modified to change text color on SetDisabled method)
Graphical Button. Graphical Button.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Button-ElvUI", 23 local Type, Version = "Button-ElvUI", 2
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local pairs = pairs local pairs, unpack = pairs, unpack
-- WoW APIs -- WoW APIs
local _G = _G local _G = _G
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
local IsShiftKeyDown = IsShiftKeyDown
-- GLOBALS: GameTooltip, ElvUI
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local dragdropButton
local function lockTooltip()
GameTooltip:SetOwner(UIParent, "ANCHOR_CURSOR")
GameTooltip:SetText(" ")
GameTooltip:Show()
end
local function dragdrop_OnMouseDown(frame, ...)
if frame.obj.dragOnMouseDown then
dragdropButton.mouseDownFrame = frame
dragdropButton:SetText(frame.obj.value or "Unknown")
dragdropButton:SetSize(frame:GetSize())
frame.obj.dragOnMouseDown(frame, unpack(arg))
end
end
local function dragdrop_OnMouseUp(frame, ...)
if frame.obj.dragOnMouseUp then
frame:SetAlpha(1)
GameTooltip:Hide()
dragdropButton:Hide()
if dragdropButton.enteredFrame and dragdropButton.enteredFrame ~= frame and dragdropButton.enteredFrame:IsMouseOver() then
frame.obj.dragOnMouseUp(frame, unpack(arg))
frame.obj.ActivateMultiControl(frame.obj, unpack(arg))
end
dragdropButton.enteredFrame = nil
dragdropButton.mouseDownFrame = nil
end
end
local function dragdrop_OnLeave(frame, ...)
if frame.obj.dragOnLeave then
if dragdropButton.mouseDownFrame then
lockTooltip()
end
if frame == dragdropButton.mouseDownFrame then
frame:SetAlpha(0)
dragdropButton:Show()
frame.obj.dragOnLeave(frame, unpack(arg))
end
end
end
local function dragdrop_OnEnter(frame, ...)
if frame.obj.dragOnEnter and dragdropButton:IsShown() then
dragdropButton.enteredFrame = frame
lockTooltip()
frame.obj.dragOnEnter(frame, unpack(arg))
end
end
local function dragdrop_OnClick(frame, ...)
local button = unpack(arg)
if frame.obj.dragOnClick and button == "RightButton" then
frame.obj.dragOnClick(frame, unpack(arg))
frame.obj.ActivateMultiControl(frame.obj, unpack(arg))
elseif frame.obj.stateSwitchOnClick and (button == "LeftButton") and IsShiftKeyDown() then
frame.obj.stateSwitchOnClick(frame, unpack(arg))
frame.obj.ActivateMultiControl(frame.obj, unpack(arg))
end
end
local function Button_OnClick(frame, ...) local function Button_OnClick(frame, ...)
AceGUI:ClearFocus() AceGUI:ClearFocus()
PlaySound("igMainMenuOption") PlaySound("igMainMenuOption")
frame.obj:Fire("OnClick", ...) frame.obj:Fire("OnClick", unpack(arg))
end end
local function Control_OnEnter(frame) local function Control_OnEnter(frame)
@@ -51,7 +110,7 @@ local methods = {
self:SetWidth(self.text:GetStringWidth() + 30) self:SetWidth(self.text:GetStringWidth() + 30)
end end
end, end,
["SetAutoWidth"] = function(self, autoWidth) ["SetAutoWidth"] = function(self, autoWidth)
self.autoWidth = autoWidth self.autoWidth = autoWidth
if self.autoWidth then if self.autoWidth then
@@ -76,14 +135,29 @@ Constructor
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Constructor() local function Constructor()
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type) local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate2") local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
frame:Hide() frame:Hide()
frame:EnableMouse(true) frame:EnableMouse(true)
frame:RegisterForClicks("AnyUp")
frame:SetScript("OnClick", Button_OnClick) frame:SetScript("OnClick", Button_OnClick)
frame:SetScript("OnEnter", Control_OnEnter) frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave) frame:SetScript("OnLeave", Control_OnLeave)
-- dragdrop
if not dragdropButton then
dragdropButton = CreateFrame("Button", "ElvUIAceGUI30DragDropButton", UIParent, "UIPanelButtonTemplate")
dragdropButton:SetFrameStrata("TOOLTIP")
dragdropButton:SetFrameLevel(5)
dragdropButton:SetPoint('BOTTOM', GameTooltip, "BOTTOM", 0, 10)
dragdropButton:Hide()
ElvUI[1]:GetModule('Skins'):HandleButton(dragdropButton)
end
frame:HookScript("OnClick", dragdrop_OnClick)
frame:HookScript("OnEnter", dragdrop_OnEnter)
frame:HookScript("OnLeave", dragdrop_OnLeave)
frame:HookScript("OnMouseUp", dragdrop_OnMouseUp)
frame:HookScript("OnMouseDown", dragdrop_OnMouseDown)
local text = frame:GetFontString() local text = frame:GetFontString()
text:ClearAllPoints() text:ClearAllPoints()
text:SetPoint("TOPLEFT", 15, -1) text:SetPoint("TOPLEFT", 15, -1)
@@ -2,27 +2,24 @@
Button Widget Button Widget
Graphical Button. Graphical Button.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Button", 23 local Type, Version = "Button", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
-- Lua APIs -- Lua APIs
local pairs = pairs local pairs, unpack = pairs, unpack
-- WoW APIs -- WoW APIs
local _G = AceCore._G local _G = _G
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
-- arg1 is the button for OnClick event
local function Button_OnClick() local function Button_OnClick()
AceGUI:ClearFocus() AceGUI:ClearFocus()
PlaySound("igMainMenuOption") PlaySound("igMainMenuOption")
this.obj:Fire("OnClick", 1, arg1) this.obj:Fire("OnClick", unpack(arg))
end end
local function Control_OnEnter() local function Control_OnEnter()
@@ -77,7 +74,7 @@ Constructor
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Constructor() local function Constructor()
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type) local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate2") local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
frame:Hide() frame:Hide()
frame:EnableMouse(true) frame:EnableMouse(true)
@@ -1,12 +1,12 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Checkbox Widget Checkbox Widget
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "CheckBox", 22 local Type, Version = "CheckBox", 23
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local pairs = pairs local select, pairs, unpack = select, pairs, unpack
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
@@ -24,10 +24,10 @@ local function AlignImage(self)
self.text:ClearAllPoints() self.text:ClearAllPoints()
if not img then if not img then
self.text:SetPoint("LEFT", self.checkbg, "RIGHT") self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
self.text:SetPoint("RIGHT",0,0) self.text:SetPoint("RIGHT", 0, 0)
else else
self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0) self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
self.text:SetPoint("RIGHT",0,0) self.text:SetPoint("RIGHT", 0, 0)
end end
end end
@@ -55,7 +55,6 @@ local function CheckBox_OnMouseDown()
end end
local function CheckBox_OnMouseUp() local function CheckBox_OnMouseUp()
local self = this.obj local self = this.obj
if not self.disabled then if not self.disabled then
self:ToggleChecked() self:ToggleChecked()
@@ -66,7 +65,7 @@ local function CheckBox_OnMouseUp()
PlaySound("igMainMenuOptionCheckBoxOff") PlaySound("igMainMenuOptionCheckBoxOff")
end end
self:Fire("OnValueChanged", 1, self.checked) self:Fire("OnValueChanged", self.checked)
AlignImage(self) AlignImage(self)
end end
end end
@@ -173,7 +172,6 @@ local methods = {
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
highlight:SetTexCoord(0, 1, 0, 1) highlight:SetTexCoord(0, 1, 0, 1)
end end
checkbg:SetHeight(size) checkbg:SetHeight(size)
checkbg:SetWidth(size) checkbg:SetWidth(size)
end, end,
@@ -222,14 +220,15 @@ local methods = {
self:SetHeight(24) self:SetHeight(24)
end end
end, end,
["SetImage"] = function(self, path, a1,a2,a3,a4,a5,a6,a7,a8) ["SetImage"] = function(self, path, ...)
local image = self.image local image = self.image
image:SetTexture(path) image:SetTexture(path)
if image:GetTexture() then if image:GetTexture() then
if a4 or a8 then local n = select("#", arg)
image:SetTexCoord(a1,a2,a3,a4,a5,a6,a7,a8) if n == 4 or n == 8 then
image:SetTexCoord(unpack(arg))
else else
image:SetTexCoord(0, 1, 0, 1) image:SetTexCoord(0, 1, 0, 1)
end end
@@ -254,7 +253,7 @@ local function Constructor()
local checkbg = frame:CreateTexture(nil, "ARTWORK") local checkbg = frame:CreateTexture(nil, "ARTWORK")
checkbg:SetWidth(24) checkbg:SetWidth(24)
checkbg:SetHeight(24) checkbg:SetHeight(24)
checkbg:SetPoint("TOPLEFT",0,0) checkbg:SetPoint("TOPLEFT", 0, 0)
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
local check = frame:CreateTexture(nil, "OVERLAY") local check = frame:CreateTexture(nil, "OVERLAY")
@@ -262,10 +261,10 @@ local function Constructor()
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
text:SetJustifyH("LEFT") text:SetJustifyH("LEFT", 0, 0)
text:SetHeight(18) text:SetHeight(18)
text:SetPoint("LEFT", checkbg, "RIGHT") text:SetPoint("LEFT", checkbg, "RIGHT")
text:SetPoint("RIGHT",0,0) text:SetPoint("RIGHT", 0, 0)
local highlight = frame:CreateTexture(nil, "HIGHLIGHT") local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
@@ -1,7 +1,7 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
ColorPicker Widget ColorPicker Widget
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "ColorPicker", 23 local Type, Version = "ColorPicker-ElvUI", 1
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -25,12 +25,12 @@ local function ColorCallback(self, r, g, b, a, isAlpha)
self:SetColor(r, g, b, a) self:SetColor(r, g, b, a)
if ColorPickerFrame:IsVisible() then if ColorPickerFrame:IsVisible() then
--colorpicker is still open --colorpicker is still open
self:Fire("OnValueChanged", 4, r, g, b, a) self:Fire("OnValueChanged", r, g, b, a)
else else
--colorpicker is closed, color callback is first, ignore it, --colorpicker is closed, color callback is first, ignore it,
--alpha callback is the final call after it closes so confirm now --alpha callback is the final call after it closes so confirm now
if isAlpha then if isAlpha then
self:Fire("OnValueConfirmed", 4, r, g, b, a) self:Fire("OnValueConfirmed", r, g, b, a)
end end
end end
end end
@@ -38,19 +38,20 @@ end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Control_OnEnter() local function Control_OnEnter(frame)
this.obj:Fire("OnEnter") frame.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(frame)
this.obj:Fire("OnLeave") frame.obj:Fire("OnLeave")
end end
local function ColorSwatch_OnClick() local function ColorSwatch_OnClick(frame)
HideUIPanel(ColorPickerFrame) HideUIPanel(ColorPickerFrame)
local self = this.obj local self = frame.obj
if not self.disabled then if not self.disabled then
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG") ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10)
ColorPickerFrame:SetClampedToScreen(true) ColorPickerFrame:SetClampedToScreen(true)
ColorPickerFrame.func = function() ColorPickerFrame.func = function()
@@ -66,12 +67,20 @@ local function ColorSwatch_OnClick()
ColorCallback(self, r, g, b, a, true) ColorCallback(self, r, g, b, a, true)
end end
local r, g, b, a = self.r, self.g, self.b, self.a local r, g, b, a, dR, dG, dB, dA = self.r, self.g, self.b, self.a, self.dR, self.dG, self.dB, self.dA
if self.HasAlpha then if self.HasAlpha then
ColorPickerFrame.opacity = 1 - (a or 0) ColorPickerFrame.opacity = 1 - (a or 0)
end end
ColorPickerFrame:SetColorRGB(r, g, b) ColorPickerFrame:SetColorRGB(r, g, b)
if(ColorPPDefault and self.dR and self.dG and self.dB) then
local alpha = 1
if(self.dA) then
alpha = 1 - self.dA
end
ColorPPDefault.colors = {r = self.dR, g = self.dG, b = self.dB, a = alpha}
end
ColorPickerFrame.cancelFunc = function() ColorPickerFrame.cancelFunc = function()
ColorCallback(self, r, g, b, a, true) ColorCallback(self, r, g, b, a, true)
end end
@@ -100,11 +109,15 @@ local methods = {
self.text:SetText(text) self.text:SetText(text)
end, end,
["SetColor"] = function(self, r, g, b, a) ["SetColor"] = function(self, r, g, b, a, defaultR, defaultG, defaultB, defaultA)
self.r = r self.r = r
self.g = g self.g = g
self.b = b self.b = b
self.a = a or 1 self.a = a or 1
self.dR = defaultR
self.dG = defaultG
self.dB = defaultB
self.dA = defaultA
self.colorSwatch:SetVertexColor(r, g, b, a) self.colorSwatch:SetVertexColor(r, g, b, a)
end, end,
@@ -140,7 +153,7 @@ local function Constructor()
colorSwatch:SetWidth(19) colorSwatch:SetWidth(19)
colorSwatch:SetHeight(19) colorSwatch:SetHeight(19)
colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch") colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
colorSwatch:SetPoint("LEFT",0,0) colorSwatch:SetPoint("LEFT")
local texture = frame:CreateTexture(nil, "BACKGROUND") local texture = frame:CreateTexture(nil, "BACKGROUND")
texture:SetWidth(16) texture:SetWidth(16)
@@ -164,7 +177,7 @@ local function Constructor()
text:SetJustifyH("LEFT") text:SetJustifyH("LEFT")
text:SetTextColor(1, 1, 1) text:SetTextColor(1, 1, 1)
text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0) text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
text:SetPoint("RIGHT",0,0) text:SetPoint("RIGHT")
--local highlight = frame:CreateTexture(nil, "HIGHLIGHT") --local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") --highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
@@ -1,23 +1,39 @@
--[[ $Id: AceGUIWidget-DropDown-Items.lua 1137 2016-05-15 10:57:36Z nevcairiel $ ]]-- --[[ $Id: AceGUIWidget-DropDown-Items.lua 1153 2016-11-20 09:57:15Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
local IsLegion = false
-- Lua APIs -- Lua APIs
local assert = assert local select, assert = select, assert
local tgetn = table.getn
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local fixlevels = AceGUI.fixlevels local function fixlevels(parent,...)
local fixstrata = AceGUI.fixstrata local i = 1
local child = select(i, arg)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, arg)
end
end
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, arg)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, arg)
end
end
-- ItemBase is the base "class" for all dropdown items. -- ItemBase is the base "class" for all dropdown items.
-- Each item has to use ItemBase.Create(widgetType) to -- Each item has to use ItemBase.Create(widgetType) to
-- create an initial 'self' value. -- create an initial 'self' value.
-- ItemBase will add common functions and ui event handlers. -- ItemBase will add common functions and ui event handlers.
-- Be sure to keep basic usage when you override functions. -- Be sure to keep basic usage when you override functions.
@@ -29,25 +45,25 @@ local ItemBase = {
counter = 0, counter = 0,
} }
function ItemBase.Frame_OnEnter() function ItemBase.Frame_OnEnter(this)
local self = this.obj local self = this.obj
if self.useHighlight then if self.useHighlight then
self.highlight:Show() self.highlight:Show()
end end
self:Fire("OnEnter") self:Fire("OnEnter")
if self.specialOnEnter then if self.specialOnEnter then
self.specialOnEnter(self) self.specialOnEnter(self)
end end
end end
function ItemBase.Frame_OnLeave() function ItemBase.Frame_OnLeave(this)
local self = this.obj local self = this.obj
self.highlight:Hide() self.highlight:Hide()
self:Fire("OnLeave") self:Fire("OnLeave")
if self.specialOnLeave then if self.specialOnLeave then
self.specialOnLeave(self) self.specialOnLeave(self)
end end
@@ -73,12 +89,11 @@ end
-- Do not call this method directly -- Do not call this method directly
function ItemBase.SetPullout(self, pullout) function ItemBase.SetPullout(self, pullout)
self.pullout = pullout self.pullout = pullout
self.frame:SetParent(nil) self.frame:SetParent(nil)
local itemFrame = pullout.itemFrame self.frame:SetParent(pullout.itemFrame)
self.frame:SetParent(itemFrame) self.parent = pullout.itemFrame
self.parent = itemFrame fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
fixlevels(itemFrame)
end end
-- exported -- exported
@@ -92,8 +107,8 @@ function ItemBase.GetText(self)
end end
-- exported -- exported
function ItemBase.SetPoint(self, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) function ItemBase.SetPoint(self, ...)
self.frame:SetPoint(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) self.frame:SetPoint(unpack(arg))
end end
-- exported -- exported
@@ -140,12 +155,12 @@ function ItemBase.Create(type)
self.frame = frame self.frame = frame
frame.obj = self frame.obj = self
self.type = type self.type = type
self.useHighlight = true self.useHighlight = true
frame:SetHeight(17) frame:SetHeight(17)
frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetFrameStrata("FULLSCREEN_DIALOG")
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
text:SetTextColor(1,1,1) text:SetTextColor(1,1,1)
text:SetJustifyH("LEFT") text:SetJustifyH("LEFT")
@@ -163,7 +178,7 @@ function ItemBase.Create(type)
highlight:Hide() highlight:Hide()
self.highlight = highlight self.highlight = highlight
local check = frame:CreateTexture("OVERLAY") local check = frame:CreateTexture("OVERLAY")
check:SetWidth(16) check:SetWidth(16)
check:SetHeight(16) check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1) check:SetPoint("LEFT",frame,"LEFT",3,-1)
@@ -177,26 +192,26 @@ function ItemBase.Create(type)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1) sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow") sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
sub:Hide() sub:Hide()
self.sub = sub self.sub = sub
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter) frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave) frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
self.OnAcquire = ItemBase.OnAcquire self.OnAcquire = ItemBase.OnAcquire
self.OnRelease = ItemBase.OnRelease self.OnRelease = ItemBase.OnRelease
self.SetPullout = ItemBase.SetPullout self.SetPullout = ItemBase.SetPullout
self.GetText = ItemBase.GetText self.GetText = ItemBase.GetText
self.SetText = ItemBase.SetText self.SetText = ItemBase.SetText
self.SetDisabled = ItemBase.SetDisabled self.SetDisabled = ItemBase.SetDisabled
self.SetPoint = ItemBase.SetPoint self.SetPoint = ItemBase.SetPoint
self.Show = ItemBase.Show self.Show = ItemBase.Show
self.Hide = ItemBase.Hide self.Hide = ItemBase.Hide
self.SetOnLeave = ItemBase.SetOnLeave self.SetOnLeave = ItemBase.SetOnLeave
self.SetOnEnter = ItemBase.SetOnEnter self.SetOnEnter = ItemBase.SetOnEnter
return self return self
end end
@@ -208,20 +223,20 @@ end
--[[ --[[
Template for items: Template for items:
-- Item: -- Item:
-- --
do do
local widgetType = "Dropdown-Item-" local widgetType = "Dropdown-Item-"
local widgetVersion = 1 local widgetVersion = 1
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
--]] --]]
@@ -232,25 +247,25 @@ end
do do
local widgetType = "Dropdown-Item-Header" local widgetType = "Dropdown-Item-Header"
local widgetVersion = 1 local widgetVersion = 1
local function OnEnter(this) local function OnEnter(this)
local self = this.obj local self = this.obj
self:Fire("OnEnter") self:Fire("OnEnter")
if self.specialOnEnter then if self.specialOnEnter then
self.specialOnEnter(self) self.specialOnEnter(self)
end end
end end
local function OnLeave() local function OnLeave(this)
local self = this.obj local self = this.obj
self:Fire("OnLeave") self:Fire("OnLeave")
if self.specialOnLeave then if self.specialOnLeave then
self.specialOnLeave(self) self.specialOnLeave(self)
end end
end end
-- exported, override -- exported, override
local function SetDisabled(self, disabled) local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled) ItemBase.SetDisabled(self, disabled)
@@ -258,21 +273,21 @@ do
self.text:SetTextColor(1, 1, 0) self.text:SetTextColor(1, 1, 0)
end end
end end
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
self.SetDisabled = SetDisabled self.SetDisabled = SetDisabled
self.frame:SetScript("OnEnter", OnEnter) self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnLeave", OnLeave) self.frame:SetScript("OnLeave", OnLeave)
self.text:SetTextColor(1, 1, 0) self.text:SetTextColor(1, 1, 0)
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
@@ -281,7 +296,7 @@ end
do do
local widgetType = "Dropdown-Item-Execute" local widgetType = "Dropdown-Item-Execute"
local widgetVersion = 1 local widgetVersion = 1
local function Frame_OnClick(this, button) local function Frame_OnClick(this, button)
local self = this.obj local self = this.obj
if self.disabled then return end if self.disabled then return end
@@ -290,16 +305,16 @@ do
self.pullout:Close() self.pullout:Close()
end end
end end
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
self.frame:SetScript("OnClick", Frame_OnClick) self.frame:SetScript("OnClick", Frame_OnClick)
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
@@ -308,8 +323,8 @@ end
-- Does not close the pullout on click. -- Does not close the pullout on click.
do do
local widgetType = "Dropdown-Item-Toggle" local widgetType = "Dropdown-Item-Toggle"
local widgetVersion = 3 local widgetVersion = 4
local function UpdateToggle(self) local function UpdateToggle(self)
if self.value then if self.value then
self.check:Show() self.check:Show()
@@ -317,13 +332,13 @@ do
self.check:Hide() self.check:Hide()
end end
end end
local function OnRelease(self) local function OnRelease(self)
ItemBase.OnRelease(self) ItemBase.OnRelease(self)
self:SetValue(nil) self:SetValue(nil)
end end
local function Frame_OnClick() local function Frame_OnClick(this, button)
local self = this.obj local self = this.obj
if self.disabled then return end if self.disabled then return end
self.value = not self.value self.value = not self.value
@@ -333,33 +348,33 @@ do
PlaySound("igMainMenuOptionCheckBoxOff") PlaySound("igMainMenuOptionCheckBoxOff")
end end
UpdateToggle(self) UpdateToggle(self)
self:Fire("OnValueChanged", 1, self.value) self:Fire("OnValueChanged", self.value)
end end
-- exported -- exported
local function SetValue(self, value) local function SetValue(self, value)
self.value = value self.value = value
UpdateToggle(self) UpdateToggle(self)
end end
-- exported -- exported
local function GetValue(self) local function GetValue(self)
return self.value return self.value
end end
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
self.frame:SetScript("OnClick", Frame_OnClick) self.frame:SetScript("OnClick", Frame_OnClick)
self.SetValue = SetValue self.SetValue = SetValue
self.GetValue = GetValue self.GetValue = GetValue
self.OnRelease = OnRelease self.OnRelease = OnRelease
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
@@ -369,55 +384,55 @@ end
do do
local widgetType = "Dropdown-Item-Menu" local widgetType = "Dropdown-Item-Menu"
local widgetVersion = 2 local widgetVersion = 2
local function OnEnter() local function OnEnter(this)
local self = this.obj local self = this.obj
self:Fire("OnEnter") self:Fire("OnEnter")
if self.specialOnEnter then if self.specialOnEnter then
self.specialOnEnter(self) self.specialOnEnter(self)
end end
self.highlight:Show() self.highlight:Show()
if not self.disabled and self.submenu then if not self.disabled and self.submenu then
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100) self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
end end
end end
local function OnHide() local function OnHide(this)
local self = this.obj local self = this.obj
if self.submenu then if self.submenu then
self.submenu:Close() self.submenu:Close()
end end
end end
-- exported -- exported
local function SetMenu(self, menu) local function SetMenu(self, menu)
assert(menu.type == "Dropdown-Pullout") assert(menu.type == "Dropdown-Pullout")
self.submenu = menu self.submenu = menu
end end
-- exported -- exported
local function CloseMenu(self) local function CloseMenu(self)
self.submenu:Close() self.submenu:Close()
end end
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
self.sub:Show() self.sub:Show()
self.frame:SetScript("OnEnter", OnEnter) self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnHide", OnHide) self.frame:SetScript("OnHide", OnHide)
self.SetMenu = SetMenu self.SetMenu = SetMenu
self.CloseMenu = CloseMenu self.CloseMenu = CloseMenu
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
@@ -426,32 +441,31 @@ end
do do
local widgetType = "Dropdown-Item-Separator" local widgetType = "Dropdown-Item-Separator"
local widgetVersion = 2 local widgetVersion = 2
-- exported, override -- exported, override
local function SetDisabled(self, disabled) local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled) ItemBase.SetDisabled(self, disabled)
self.useHighlight = false self.useHighlight = false
end end
local function Constructor() local function Constructor()
local self = ItemBase.Create(widgetType) local self = ItemBase.Create(widgetType)
self.SetDisabled = SetDisabled self.SetDisabled = SetDisabled
local line = self.frame:CreateTexture(nil, "OVERLAY") local line = self.frame:CreateTexture(nil, "OVERLAY")
line:SetHeight(1) line:SetHeight(1)
line:SetTexture(.5, .5, .5) line:SetTexture(.5, .5, .5)
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0) line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0) line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
self.text:Hide() self.text:Hide()
self.useHighlight = false self.useHighlight = false
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end end
@@ -1,31 +1,48 @@
--[[ $Id: AceGUIWidget-DropDown.lua 1116 2014-10-12 08:15:46Z nevcairiel $ ]]-- --[[ $Id: AceGUIWidget-DropDown.lua 1116 2014-10-12 08:15:46Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
local AceCore = LibStub("AceCore-3.0")
-- Lua APIs -- Lua APIs
local min, max, floor = math.min, math.max, math.floor local min, max, floor = math.min, math.max, math.floor
local pairs, ipairs, type = pairs, ipairs, type local select, pairs, ipairs, type = select, pairs, ipairs, type
local tsort, tinsert, tgetn, tsetn = table.sort, table.insert, table.getn, table.setn local tgetn, tsort = table.getn, table.sort
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
local UIParent, CreateFrame = UIParent, CreateFrame local UIParent, CreateFrame = UIParent, CreateFrame
local _G = AceCore._G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- List them here for Mikk's FindGlobals script
-- GLOBALS: CLOSE -- GLOBALS: CLOSE
local fixlevels = AceGUI.fixlevels local function fixlevels(parent,...)
local fixstrata = AceGUI.fixstrata local i = 1
local child = select(i, arg)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, arg)
end
end
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, arg)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, arg)
end
end
do do
local widgetType = "Dropdown-Pullout" local widgetType = "Dropdown-Pullout"
local widgetVersion = 3 local widgetVersion = 3
--[[ Static data ]]-- --[[ Static data ]]--
local backdrop = { local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground", bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -43,9 +60,9 @@ do
local defaultWidth = 200 local defaultWidth = 200
local defaultMaxHeight = 600 local defaultMaxHeight = 600
--[[ UI Event Handlers ]]-- --[[ UI Event Handlers ]]--
-- HACK: This should be no part of the pullout, but there -- HACK: This should be no part of the pullout, but there
-- is no other 'clean' way to response to any item-OnEnter -- is no other 'clean' way to response to any item-OnEnter
-- Used to close Submenus when an other item is entered -- Used to close Submenus when an other item is entered
@@ -57,22 +74,22 @@ do
end end
end end
end end
-- See the note in Constructor() for each scroll related function -- See the note in Constructor() for each scroll related function
local function OnMouseWheel() local function OnMouseWheel(this, value)
this.obj:MoveScroll(arg1) this.obj:MoveScroll(value)
end end
local function OnScrollValueChanged() local function OnScrollValueChanged(this, value)
this.obj:SetScroll(arg1) this.obj:SetScroll(value)
end end
local function OnSizeChanged() local function OnSizeChanged(this)
this.obj:FixScroll() this.obj:FixScroll()
end end
--[[ Exported methods ]]-- --[[ Exported methods ]]--
-- exported -- exported
local function SetScroll(self, value) local function SetScroll(self, value)
local status = self.scrollStatus local status = self.scrollStatus
@@ -89,9 +106,9 @@ do
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset) child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset) child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
status.offset = offset status.offset = offset
status.scrollvalue = value status.scrollvalue = value
end end
-- exported -- exported
local function MoveScroll(self, value) local function MoveScroll(self, value)
local status = self.scrollStatus local status = self.scrollStatus
@@ -110,7 +127,7 @@ do
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000)) self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end end
end end
-- exported -- exported
local function FixScroll(self) local function FixScroll(self)
local status = self.scrollStatus local status = self.scrollStatus
@@ -123,7 +140,7 @@ do
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset) child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
self.slider:SetValue(0) self.slider:SetValue(0)
else else
self.slider:Show() self.slider:Show()
local value = (offset / (viewheight - height) * 1000) local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end if value > 1000 then value = 1000 end
self.slider:SetValue(value) self.slider:SetValue(value)
@@ -136,44 +153,44 @@ do
end end
end end
end end
-- exported, AceGUI callback -- exported, AceGUI callback
local function OnAcquire(self) local function OnAcquire(self)
self.frame:SetParent(UIParent) self.frame:SetParent(UIParent)
--self.itemFrame:SetToplevel(true) --self.itemFrame:SetToplevel(true)
end end
-- exported, AceGUI callback -- exported, AceGUI callback
local function OnRelease(self) local function OnRelease(self)
self:Clear() self:Clear()
self.frame:ClearAllPoints() self.frame:ClearAllPoints()
self.frame:Hide() self.frame:Hide()
end end
-- exported -- exported
local function AddItem(self, item) local function AddItem(self, item)
tinsert(self.items, item) self.items[tgetn(self.items) + 1] = item
local h = tgetn(self.items) * 16 local h = tgetn(self.items) * 16
self.itemFrame:SetHeight(h) self.itemFrame:SetHeight(h)
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT") item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT") item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
item:SetPullout(self) item:SetPullout(self)
item:SetOnEnter(OnEnter) item:SetOnEnter(OnEnter)
end end
-- exported -- exported
local function Open(self, point, relFrame, relPoint, x, y) local function Open(self, point, relFrame, relPoint, x, y)
local items = self.items local items = self.items
local frame = self.frame local frame = self.frame
local itemFrame = self.itemFrame local itemFrame = self.itemFrame
frame:SetPoint(point, relFrame, relPoint, x, y) frame:SetPoint(point, relFrame, relPoint, x, y)
local height = 8 local height = 8
for i, item in pairs(items) do for i, item in pairs(items) do
if i == 1 then if i == 1 then
@@ -181,23 +198,23 @@ do
else else
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1) item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
end end
item:Show() item:Show()
height = height + 16 height = height + 16
end end
itemFrame:SetHeight(height) itemFrame:SetHeight(height)
fixstrata("TOOLTIP", frame) fixstrata("TOOLTIP", frame, frame:GetChildren())
frame:Show() frame:Show()
self:Fire("OnOpen") self:Fire("OnOpen")
end end
-- exported -- exported
local function Close(self) local function Close(self)
self.frame:Hide() self.frame:Hide()
self:Fire("OnClose") self:Fire("OnClose")
end end
-- exported -- exported
local function Clear(self) local function Clear(self)
local items = self.items local items = self.items
@@ -205,19 +222,18 @@ do
AceGUI:Release(item) AceGUI:Release(item)
items[i] = nil items[i] = nil
end end
tsetn(items,0) end
end
-- exported -- exported
local function IterateItems(self) local function IterateItems(self)
return ipairs(self.items) return ipairs(self.items)
end end
-- exported -- exported
local function SetHideOnLeave(self, val) local function SetHideOnLeave(self, val)
self.hideOnLeave = val self.hideOnLeave = val
end end
-- exported -- exported
local function SetMaxHeight(self, height) local function SetMaxHeight(self, height)
self.maxHeight = height or defaultMaxHeight self.maxHeight = height or defaultMaxHeight
@@ -227,19 +243,19 @@ do
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
end end
end end
-- exported -- exported
local function GetRightBorderWidth(self) local function GetRightBorderWidth(self)
return 6 + (self.slider:IsShown() and 12 or 0) return 6 + (self.slider:IsShown() and 12 or 0)
end end
-- exported -- exported
local function GetLeftBorderWidth(self) local function GetLeftBorderWidth(self)
return 6 return 6
end end
--[[ Constructor ]]-- --[[ Constructor ]]--
local function Constructor() local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType) local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent) local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
@@ -248,7 +264,7 @@ do
self.type = widgetType self.type = widgetType
self.frame = frame self.frame = frame
frame.obj = self frame.obj = self
self.OnAcquire = OnAcquire self.OnAcquire = OnAcquire
self.OnRelease = OnRelease self.OnRelease = OnRelease
@@ -262,37 +278,37 @@ do
self.SetScroll = SetScroll self.SetScroll = SetScroll
self.MoveScroll = MoveScroll self.MoveScroll = MoveScroll
self.FixScroll = FixScroll self.FixScroll = FixScroll
self.SetMaxHeight = SetMaxHeight self.SetMaxHeight = SetMaxHeight
self.GetRightBorderWidth = GetRightBorderWidth self.GetRightBorderWidth = GetRightBorderWidth
self.GetLeftBorderWidth = GetLeftBorderWidth self.GetLeftBorderWidth = GetLeftBorderWidth
self.items = {} self.items = {}
self.scrollStatus = { self.scrollStatus = {
scrollvalue = 0, scrollvalue = 0,
} }
self.maxHeight = defaultMaxHeight self.maxHeight = defaultMaxHeight
frame:SetBackdrop(backdrop) frame:SetBackdrop(backdrop)
frame:SetBackdropColor(0, 0, 0) frame:SetBackdropColor(0, 0, 0)
frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetClampedToScreen(true) frame:SetClampedToScreen(true)
frame:SetWidth(defaultWidth) frame:SetWidth(defaultWidth)
frame:SetHeight(self.maxHeight) frame:SetHeight(self.maxHeight)
--frame:SetToplevel(true) --frame:SetToplevel(true)
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame -- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
local scrollFrame = CreateFrame("ScrollFrame", nil, frame) local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
local itemFrame = CreateFrame("Frame", nil, scrollFrame) local itemFrame = CreateFrame("Frame", nil, scrollFrame)
self.scrollFrame = scrollFrame self.scrollFrame = scrollFrame
self.itemFrame = itemFrame self.itemFrame = itemFrame
scrollFrame.obj = self scrollFrame.obj = self
itemFrame.obj = self itemFrame.obj = self
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame) local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
slider:SetOrientation("VERTICAL") slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0) slider:SetHitRectInsets(0, 0, -10, 0)
@@ -302,7 +318,7 @@ do
slider:SetFrameStrata("FULLSCREEN_DIALOG") slider:SetFrameStrata("FULLSCREEN_DIALOG")
self.slider = slider self.slider = slider
slider.obj = self slider.obj = self
scrollFrame:SetScrollChild(itemFrame) scrollFrame:SetScrollChild(itemFrame)
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12) scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12) scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -311,59 +327,59 @@ do
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged) scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:SetToplevel(true) scrollFrame:SetToplevel(true)
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG") scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0) itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0) itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
itemFrame:SetHeight(400) itemFrame:SetHeight(400)
itemFrame:SetToplevel(true) itemFrame:SetToplevel(true)
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG") itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0) slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0) slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
slider:SetScript("OnValueChanged", OnScrollValueChanged) slider:SetScript("OnValueChanged", OnScrollValueChanged)
slider:SetMinMaxValues(0, 1000) slider:SetMinMaxValues(0, 1000)
slider:SetValueStep(1) slider:SetValueStep(1)
slider:SetValue(0) slider:SetValue(0)
scrollFrame:Show() scrollFrame:Show()
itemFrame:Show() itemFrame:Show()
slider:Hide() slider:Hide()
self:FixScroll() self:FixScroll()
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end end
do do
local widgetType = "Dropdown" local widgetType = "Dropdown"
local widgetVersion = 30 local widgetVersion = 31
--[[ Static data ]]-- --[[ Static data ]]--
--[[ UI event handler ]]-- --[[ UI event handler ]]--
local function Control_OnEnter() local function Control_OnEnter(this)
this.obj.button:LockHighlight() this.obj.button:LockHighlight()
this.obj:Fire("OnEnter") this.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(this)
this.obj.button:UnlockHighlight() this.obj.button:UnlockHighlight()
this.obj:Fire("OnLeave") this.obj:Fire("OnLeave")
end end
local function Dropdown_OnHide() local function Dropdown_OnHide(this)
local self = this.obj local self = this.obj
if self.open then if self.open then
self.pullout:Close() self.pullout:Close()
end end
end end
local function Dropdown_TogglePullout() local function Dropdown_TogglePullout(this)
local self = this.obj local self = this.obj
PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
if self.open then if self.open then
@@ -377,17 +393,17 @@ do
AceGUI:SetFocus(self) AceGUI:SetFocus(self)
end end
end end
local function OnPulloutOpen(this) local function OnPulloutOpen(this)
local self = this.userdata.obj local self = this.userdata.obj
local value = self.value local value = self.value
if not self.multiselect then if not self.multiselect then
for i, item in this:IterateItems() do for i, item in this:IterateItems() do
item:SetValue(item.userdata.value == value) item:SetValue(item.userdata.value == value)
end end
end end
self.open = true self.open = true
self:Fire("OnOpened") self:Fire("OnOpened")
end end
@@ -397,7 +413,7 @@ do
self.open = nil self.open = nil
self:Fire("OnClosed") self:Fire("OnClosed")
end end
local function ShowMultiText(self) local function ShowMultiText(self)
local text local text
for i, widget in self.pullout:IterateItems() do for i, widget in self.pullout:IterateItems() do
@@ -413,31 +429,28 @@ do
end end
self:SetText(text) self:SetText(text)
end end
local function OnItemValueChanged(this, event, _, checked) local function OnItemValueChanged(this, event, checked)
local self = this.userdata.obj local self = this.userdata.obj
if self.multiselect then if self.multiselect then
self:Fire("OnValueChanged", 2, this.userdata.value, checked) self:Fire("OnValueChanged", this.userdata.value, checked)
ShowMultiText(self) ShowMultiText(self)
else else
if checked then if checked then
self:SetValue(this.userdata.value) self:SetValue(this.userdata.value)
self:Fire("OnValueChanged", 1, this.userdata.value) self:Fire("OnValueChanged", this.userdata.value)
this:SetValue(false)
else else
self:SetValue(nil)
self:Fire("OnValueChanged", 1, nil)
this:SetValue(true) this:SetValue(true)
end end
if self.open then if self.open then
self.pullout:Close() self.pullout:Close()
end end
end end
end end
--[[ Exported methods ]]-- --[[ Exported methods ]]--
-- exported, AceGUI callback -- exported, AceGUI callback
local function OnAcquire(self) local function OnAcquire(self)
local pullout = AceGUI:Create("Dropdown-Pullout") local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -446,15 +459,14 @@ do
pullout:SetCallback("OnClose", OnPulloutClose) pullout:SetCallback("OnClose", OnPulloutClose)
pullout:SetCallback("OnOpen", OnPulloutOpen) pullout:SetCallback("OnOpen", OnPulloutOpen)
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1) self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
local frame = self.pullout.frame fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
fixlevels(frame)
self:SetHeight(44) self:SetHeight(44)
self:SetWidth(200) self:SetWidth(200)
self:SetLabel() self:SetLabel()
self:SetPulloutWidth(nil) self:SetPulloutWidth(nil)
end end
-- exported, AceGUI callback -- exported, AceGUI callback
local function OnRelease(self) local function OnRelease(self)
if self.open then if self.open then
@@ -462,20 +474,20 @@ do
end end
AceGUI:Release(self.pullout) AceGUI:Release(self.pullout)
self.pullout = nil self.pullout = nil
self:SetText("") self:SetText("")
self:SetDisabled(false) self:SetDisabled(false)
self:SetMultiselect(false) self:SetMultiselect(false)
self.value = nil self.value = nil
self.list = nil self.list = nil
self.open = nil self.open = nil
self.hasClose = nil self.hasClose = nil
self.frame:ClearAllPoints() self.frame:ClearAllPoints()
self.frame:Hide() self.frame:Hide()
end end
-- exported -- exported
local function SetDisabled(self, disabled) local function SetDisabled(self, disabled)
self.disabled = disabled self.disabled = disabled
@@ -491,19 +503,19 @@ do
self.text:SetTextColor(1,1,1) self.text:SetTextColor(1,1,1)
end end
end end
-- exported -- exported
local function ClearFocus(self) local function ClearFocus(self)
if self.open then if self.open then
self.pullout:Close() self.pullout:Close()
end end
end end
-- exported -- exported
local function SetText(self, text) local function SetText(self, text)
self.text:SetText(text or "") self.text:SetText(text or "")
end end
-- exported -- exported
local function SetLabel(self, text) local function SetLabel(self, text)
if text and text ~= "" then if text and text ~= "" then
@@ -520,7 +532,7 @@ do
self.alignoffset = 12 self.alignoffset = 12
end end
end end
-- exported -- exported
local function SetValue(self, value) local function SetValue(self, value)
if self.list then if self.list then
@@ -528,12 +540,12 @@ do
end end
self.value = value self.value = value
end end
-- exported -- exported
local function GetValue(self) local function GetValue(self)
return self.value return self.value
end end
-- exported -- exported
local function SetItemValue(self, item, value) local function SetItemValue(self, item, value)
if not self.multiselect then return end if not self.multiselect then return end
@@ -546,7 +558,7 @@ do
end end
ShowMultiText(self) ShowMultiText(self)
end end
-- exported -- exported
local function SetItemDisabled(self, item, disabled) local function SetItemDisabled(self, item, disabled)
for i, widget in self.pullout:IterateItems() do for i, widget in self.pullout:IterateItems() do
@@ -555,11 +567,11 @@ do
end end
end end
end end
local function AddListItem(self, value, text, itemType) local function AddListItem(self, value, text, itemType)
if not itemType then itemType = "Dropdown-Item-Toggle" end if not itemType then itemType = "Dropdown-Item-Toggle" end
local exists = AceGUI:GetWidgetVersion(itemType) local exists = AceGUI:GetWidgetVersion(itemType)
if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end if not exists then error(format("The given item type, %q, does not exist within AceGUI-3.0", tostring(itemType)), 2) end
local item = AceGUI:Create(itemType) local item = AceGUI:Create(itemType)
item:SetText(text) item:SetText(text)
@@ -568,7 +580,7 @@ do
item:SetCallback("OnValueChanged", OnItemValueChanged) item:SetCallback("OnValueChanged", OnItemValueChanged)
self.pullout:AddItem(item) self.pullout:AddItem(item)
end end
local function AddCloseButton(self) local function AddCloseButton(self)
if not self.hasClose then if not self.hasClose then
local close = AceGUI:Create("Dropdown-Item-Execute") local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -577,7 +589,7 @@ do
self.hasClose = true self.hasClose = true
end end
end end
-- exported -- exported
local sortlist = {} local sortlist = {}
local function SetList(self, list, order, itemType) local function SetList(self, list, order, itemType)
@@ -585,18 +597,17 @@ do
self.pullout:Clear() self.pullout:Clear()
self.hasClose = nil self.hasClose = nil
if not list then return end if not list then return end
if type(order) ~= "table" then if type(order) ~= "table" then
for v in pairs(list) do for v in pairs(list) do
tinsert(sortlist, v) sortlist[tgetn(sortlist) + 1] = v
end end
tsort(sortlist) tsort(sortlist)
for i, key in ipairs(sortlist) do for i, key in ipairs(sortlist) do
AddListItem(self, key, list[key], itemType) AddListItem(self, key, list[key], itemType)
sortlist[i] = nil sortlist[i] = nil
end end
tsetn(sortlist,0)
else else
for i, key in ipairs(order) do for i, key in ipairs(order) do
AddListItem(self, key, list[key], itemType) AddListItem(self, key, list[key], itemType)
@@ -607,7 +618,7 @@ do
AddCloseButton(self) AddCloseButton(self)
end end
end end
-- exported -- exported
local function AddItem(self, value, text, itemType) local function AddItem(self, value, text, itemType)
if self.list then if self.list then
@@ -615,7 +626,7 @@ do
AddListItem(self, value, text, itemType) AddListItem(self, value, text, itemType)
end end
end end
-- exported -- exported
local function SetMultiselect(self, multi) local function SetMultiselect(self, multi)
self.multiselect = multi self.multiselect = multi
@@ -624,23 +635,23 @@ do
AddCloseButton(self) AddCloseButton(self)
end end
end end
-- exported -- exported
local function GetMultiselect(self) local function GetMultiselect(self)
return self.multiselect return self.multiselect
end end
local function SetPulloutWidth(self, width) local function SetPulloutWidth(self, width)
self.pulloutWidth = width self.pulloutWidth = width
end end
--[[ Constructor ]]-- --[[ Constructor ]]--
local function Constructor() local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType) local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent)
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate") local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
local self = {} local self = {}
self.type = widgetType self.type = widgetType
self.frame = frame self.frame = frame
@@ -648,10 +659,10 @@ do
self.count = count self.count = count
frame.obj = self frame.obj = self
dropdown.obj = self dropdown.obj = self
self.OnRelease = OnRelease self.OnRelease = OnRelease
self.OnAcquire = OnAcquire self.OnAcquire = OnAcquire
self.ClearFocus = ClearFocus self.ClearFocus = ClearFocus
self.SetText = SetText self.SetText = SetText
@@ -666,9 +677,9 @@ do
self.SetItemValue = SetItemValue self.SetItemValue = SetItemValue
self.SetItemDisabled = SetItemDisabled self.SetItemDisabled = SetItemDisabled
self.SetPulloutWidth = SetPulloutWidth self.SetPulloutWidth = SetPulloutWidth
self.alignoffset = 26 self.alignoffset = 26
frame:SetScript("OnHide",Dropdown_OnHide) frame:SetScript("OnHide",Dropdown_OnHide)
dropdown:ClearAllPoints() dropdown:ClearAllPoints()
@@ -679,10 +690,10 @@ do
local left = _G[dropdown:GetName() .. "Left"] local left = _G[dropdown:GetName() .. "Left"]
local middle = _G[dropdown:GetName() .. "Middle"] local middle = _G[dropdown:GetName() .. "Middle"]
local right = _G[dropdown:GetName() .. "Right"] local right = _G[dropdown:GetName() .. "Right"]
middle:ClearAllPoints() middle:ClearAllPoints()
right:ClearAllPoints() right:ClearAllPoints()
middle:SetPoint("LEFT", left, "RIGHT", 0, 0) middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
middle:SetPoint("RIGHT", right, "LEFT", 0, 0) middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17) right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -693,7 +704,7 @@ do
button:SetScript("OnEnter",Control_OnEnter) button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave) button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnClick",Dropdown_TogglePullout) button:SetScript("OnClick",Dropdown_TogglePullout)
local button_cover = CreateFrame("BUTTON",nil,self.frame) local button_cover = CreateFrame("BUTTON",nil,self.frame)
self.button_cover = button_cover self.button_cover = button_cover
button_cover.obj = self button_cover.obj = self
@@ -702,14 +713,14 @@ do
button_cover:SetScript("OnEnter",Control_OnEnter) button_cover:SetScript("OnEnter",Control_OnEnter)
button_cover:SetScript("OnLeave",Control_OnLeave) button_cover:SetScript("OnLeave",Control_OnLeave)
button_cover:SetScript("OnClick",Dropdown_TogglePullout) button_cover:SetScript("OnClick",Dropdown_TogglePullout)
local text = _G[dropdown:GetName() .. "Text"] local text = _G[dropdown:GetName() .. "Text"]
self.text = text self.text = text
text.obj = self text.obj = self
text:ClearAllPoints() text:ClearAllPoints()
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2) text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
text:SetPoint("LEFT", left, "LEFT", 25, 2) text:SetPoint("LEFT", left, "LEFT", 25, 2)
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0) label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -721,6 +732,6 @@ do
AceGUI:RegisterAsWidget(self) AceGUI:RegisterAsWidget(self)
return self return self
end end
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end end
@@ -1,23 +1,18 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
EditBox Widget EditBox Widget
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "EditBox", 26 local Type, Version = "EditBox", 27
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
local hooksecurefunc = AceCore.hooksecurefunc
local _G = AceCore._G
local GetCursorInfo = _G.GetCursorInfo
-- Lua APIs -- Lua APIs
local tostring, pairs = tostring, pairs local tostring, pairs, unpack = tostring, pairs, unpack
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local strlen = string.len local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- List them here for Mikk's FindGlobals script
@@ -121,7 +116,7 @@ end
function _G.AceGUIEditBoxInsertLink(text) function _G.AceGUIEditBoxInsertLink(text)
for i = 1, AceGUI:GetWidgetCount(Type) do for i = 1, AceGUI:GetWidgetCount(Type) do
local editbox = _G["AceGUI-3.0EditBox"..i] local editbox = _G["AceGUI-3.0EditBox"..i]
if editbox and editbox:IsVisible() and editbox.hasfocus then if editbox and editbox:IsVisible() and editbox:HasFocus() then
editbox:Insert(text) editbox:Insert(text)
return true return true
end end
@@ -143,82 +138,73 @@ end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Control_OnEnter() local function Control_OnEnter(frame)
this.obj:Fire("OnEnter") frame.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(frame)
this.obj:Fire("OnLeave") frame.obj:Fire("OnLeave")
end end
local function Frame_OnShowFocus() local function Frame_OnShowFocus(frame)
this.obj.editbox:SetFocus() frame.obj.editbox:SetFocus()
this:SetScript("OnShow", nil) frame:SetScript("OnShow", nil)
end end
local function EditBox_OnEscapePressed() local function EditBox_OnEscapePressed(frame)
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function EditBox_OnEnterPressed() local function EditBox_OnEnterPressed(frame)
local self = this.obj local self = frame.obj
local value = this:GetText() local value = frame:GetText()
local cancel = self:Fire("OnEnterPressed", 1, value) local cancel = self:Fire("OnEnterPressed", value)
if not cancel then if not cancel then
PlaySound("igMainMenuOptionCheckBoxOn") PlaySound("igMainMenuOptionCheckBoxOn")
HideButton(self) HideButton(self)
end end
end end
local function EditBox_OnReceiveDrag() local function EditBox_OnReceiveDrag(frame)
if not GetCursorInfo then return end local self = frame.obj
local self = this.obj
local type, id, info = GetCursorInfo() local type, id, info = GetCursorInfo()
if type == "item" then if type == "item" then
self:SetText(info) self:SetText(info)
self:Fire("OnEnterPressed", 1, info) self:Fire("OnEnterPressed", info)
ClearCursor() ClearCursor()
elseif type == "spell" then elseif type == "spell" then
local spell, rank = GetSpellName(id, info) local name = GetSpellInfo(id, info)
if rank ~= "" then spell = spell.."("..rank..")" end self:SetText(name)
self:SetText(spell) self:Fire("OnEnterPressed", name)
self:Fire("OnEnterPressed", 1, spell)
ClearCursor() ClearCursor()
elseif type == "macro" then elseif type == "macro" then
local name = GetMacroInfo(id) local name = GetMacroInfo(id)
self:SetText(name) self:SetText(name)
self:Fire("OnEnterPressed", 1, name) self:Fire("OnEnterPressed", name)
ClearCursor() ClearCursor()
end end
HideButton(self) HideButton(self)
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
local function EditBox_OnTextChanged(frame)
local function EditBox_OnTextChanged() local self = frame.obj
local self = this.obj local value = frame:GetText()
local value = this:GetText()
if tostring(value) ~= tostring(self.lasttext) then if tostring(value) ~= tostring(self.lasttext) then
self:Fire("OnTextChanged", 1, value) self:Fire("OnTextChanged", value)
self.lasttext = value self.lasttext = value
ShowButton(self) ShowButton(self)
end end
end end
local function EditBox_OnFocusGained() local function EditBox_OnFocusGained(frame)
this.hasfocus = true AceGUI:SetFocus(frame.obj)
AceGUI:SetFocus(this.obj)
end end
local function EditBox_OnFocusLost() local function Button_OnClick(frame)
this.hasfocus = nil local editbox = frame.obj.editbox
end
local function Button_OnClick()
local editbox = this.obj.editbox
editbox:ClearFocus() editbox:ClearFocus()
this = editbox -- Ace3v: this is kinda hack here EditBox_OnEnterPressed(editbox)
EditBox_OnEnterPressed()
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -256,7 +242,7 @@ local methods = {
["SetText"] = function(self, text) ["SetText"] = function(self, text)
self.lasttext = text or "" self.lasttext = text or ""
self.editbox:SetText(text or "") self.editbox:SetText(text or "")
self.editbox:HighlightText(0) self.editbox:SetCursorPosition(0)
HideButton(self) HideButton(self)
end, end,
@@ -327,11 +313,10 @@ local function Constructor()
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag) editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag) editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained) editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
editbox:SetScript("OnEditFocusLost", EditBox_OnFocusLost)
editbox:SetTextInsets(0, 0, 3, 3) editbox:SetTextInsets(0, 0, 3, 3)
editbox:SetMaxLetters(256) editbox:SetMaxLetters(256)
editbox:SetPoint("BOTTOMLEFT", 6, 0) editbox:SetPoint("BOTTOMLEFT", 6, 0)
editbox:SetPoint("BOTTOMRIGHT", 0, 0) editbox:SetPoint("BOTTOMRIGHT")
editbox:SetHeight(19) editbox:SetHeight(19)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -43,9 +43,9 @@ local function Constructor()
frame:Hide() frame:Hide()
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal") local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
label:SetPoint("TOP",0,0) label:SetPoint("TOP", 0, 0)
label:SetPoint("BOTTOM",0,0) label:SetPoint("BOTTOM", 0, 0)
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER", 0, 0)
local left = frame:CreateTexture(nil, "BACKGROUND") local left = frame:CreateTexture(nil, "BACKGROUND")
left:SetHeight(8) left:SetHeight(8)
@@ -6,7 +6,7 @@ local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local pairs, print = pairs, print local select, pairs, print, unpack = select, pairs, print, unpack
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
@@ -14,16 +14,16 @@ local CreateFrame, UIParent = CreateFrame, UIParent
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Control_OnEnter() local function Control_OnEnter(frame)
this.obj:Fire("OnEnter") frame.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(frame)
this.obj:Fire("OnLeave") frame.obj:Fire("OnLeave")
end end
local function Button_OnClick() local function Button_OnClick(frame, button)
this.obj:Fire("OnClick", 1, arg1) frame.obj:Fire("OnClick", button)
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
@@ -53,13 +53,14 @@ local methods = {
end end
end, end,
["SetImage"] = function(self, path, a1,a2,a3,a4,a5,a6,a7,a8) ["SetImage"] = function(self, path, ...)
local image = self.image local image = self.image
image:SetTexture(path) image:SetTexture(path)
if image:GetTexture() then if image:GetTexture() then
if a4 or a8 then local n = select("#", arg)
image:SetTexCoord(a1,a2,a3,a4,a5,a6,a7,a8) if n == 4 or n == 8 then
image:SetTexCoord(unpack(arg))
else else
image:SetTexCoord(0, 1, 0, 1) image:SetTexCoord(0, 1, 0, 1)
end end
@@ -131,7 +132,7 @@ local function Constructor()
widget[method] = func widget[method] = func
end end
widget.SetText = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) end widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(unpack(arg)) end
return AceGUI:RegisterAsWidget(widget) return AceGUI:RegisterAsWidget(widget)
end end
@@ -1,12 +1,12 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
InteractiveLabel Widget InteractiveLabel Widget
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "InteractiveLabel", 20 local Type, Version = "InteractiveLabel", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local pairs = pairs local select, pairs, unpack = select, pairs, unpack
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
@@ -18,16 +18,16 @@ local CreateFrame, UIParent = CreateFrame, UIParent
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Control_OnEnter() local function Control_OnEnter(frame)
this.obj:Fire("OnEnter") frame.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(frame)
this.obj:Fire("OnLeave") frame.obj:Fire("OnLeave")
end end
local function Label_OnClick() local function Label_OnClick(frame, button)
this.obj:Fire("OnClick", 1, arg1) frame.obj:Fire("OnClick", button)
AceGUI:ClearFocus() AceGUI:ClearFocus()
end end
@@ -44,13 +44,14 @@ local methods = {
-- ["OnRelease"] = nil, -- ["OnRelease"] = nil,
["SetHighlight"] = function(self, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) ["SetHighlight"] = function(self, ...)
self.highlight:SetTexture(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) self.highlight:SetTexture(unpack(arg))
end, end,
["SetHighlightTexCoord"] = function(self, a1,a2,a3,a4,a5,a6,a7,a8) ["SetHighlightTexCoord"] = function(self, ...)
if a4 or a8 then local c = select("#", arg)
self.highlight:SetTexCoord(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) if c == 4 or c == 8 then
self.highlight:SetTexCoord(unpack(arg))
else else
self.highlight:SetTexCoord(0, 1, 0, 1) self.highlight:SetTexCoord(0, 1, 0, 1)
end end
@@ -21,32 +21,44 @@ local CreateFrame, UIParent = CreateFrame, UIParent
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Control_OnEnter() local function Control_OnEnter(frame)
this.obj:Fire("OnEnter") frame.obj:Fire("OnEnter")
end end
local function Control_OnLeave() local function Control_OnLeave(frame)
this.obj:Fire("OnLeave") frame.obj:Fire("OnLeave")
end end
local function Keybinding_OnHide() local function Keybinding_OnClick(frame, button)
local self = this.obj if button == "LeftButton" or button == "RightButton" then
this:EnableKeyboard(false) local self = frame.obj
this:EnableMouseWheel(false) if self.waitingForKey then
self.msgframe:Hide() frame:EnableKeyboard(false)
this:UnlockHighlight() frame:EnableMouseWheel(false)
self.waitingForKey = nil self.msgframe:Hide()
frame:UnlockHighlight()
self.waitingForKey = nil
else
frame:EnableKeyboard(true)
frame:EnableMouseWheel(true)
self.msgframe:Show()
frame:LockHighlight()
self.waitingForKey = true
end
end
AceGUI:ClearFocus()
end end
local ignoreKeys = { local ignoreKeys = {
["BUTTON1"] = true, ["BUTTON2"] = true, ["BUTTON1"] = true, ["BUTTON2"] = true,
["UNKNOWN"] = true, ["UNKNOWN"] = true,
["SHIFT"] = true, ["CTRL"] = true, ["ALT"] = true, ["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
} }
local function Keybinding_OnKeyDown() local function Keybinding_OnKeyDown(frame, key)
local self = this.obj local self = frame.obj
if self.waitingForKey then if self.waitingForKey then
local keyPressed = arg1 local keyPressed = key
if keyPressed == "ESCAPE" then if keyPressed == "ESCAPE" then
keyPressed = "" keyPressed = ""
else else
@@ -62,58 +74,40 @@ local function Keybinding_OnKeyDown()
end end
end end
this:EnableKeyboard(false) frame:EnableKeyboard(false)
this:EnableMouseWheel(false) frame:EnableMouseWheel(false)
self.msgframe:Hide() self.msgframe:Hide()
this:UnlockHighlight() frame:UnlockHighlight()
self.waitingForKey = nil self.waitingForKey = nil
if not self.disabled then if not self.disabled then
self:SetKey(keyPressed) self:SetKey(keyPressed)
self:Fire("OnKeyChanged", 1, keyPressed) self:Fire("OnKeyChanged", keyPressed)
end end
end end
end end
local function Keybinding_OnMouseDown() local function Keybinding_OnMouseDown(frame, button)
getglobal(this:GetName().."Left"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Down"); if button == "LeftButton" or button == "RightButton" then
getglobal(this:GetName().."Middle"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Down"); return
getglobal(this:GetName().."Right"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Down"); elseif button == "MiddleButton" then
end button = "BUTTON3"
elseif button == "Button4" then
local function Keybinding_OnMouseUp() button = "BUTTON4"
getglobal(this:GetName().."Left"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Up"); elseif button == "Button5" then
getglobal(this:GetName().."Middle"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Up"); button = "BUTTON5"
getglobal(this:GetName().."Right"):SetTexture("Interface\\Buttons\\UI-Panel-Button-Up");
local self = this.obj
if MouseIsOver(this) and not self.disabled then
if self.waitingForKey then
if arg1 ~= "LeftButton" and arg1 ~= "RightButton" then
Keybinding_OnKeyDown()
end
this:EnableKeyboard(false)
this:EnableMouseWheel(false)
self.msgframe:Hide()
this:UnlockHighlight()
self.waitingForKey = nil
else
this:EnableKeyboard(true)
this:EnableMouseWheel(true)
self.msgframe:Show()
this:LockHighlight()
self.waitingForKey = true
end
end end
AceGUI:ClearFocus() Keybinding_OnKeyDown(frame, button)
end end
local function Keybinding_OnMouseWheel() local function Keybinding_OnMouseWheel(frame, direction)
if arg1 >= 0 then local button
arg1 = "MOUSEWHEELUP" if direction >= 0 then
button = "MOUSEWHEELUP"
else else
arg1 = "MOUSEWHEELDOWN" button = "MOUSEWHEELDOWN"
end end
Keybinding_OnKeyDown() Keybinding_OnKeyDown(frame, button)
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -147,10 +141,10 @@ local methods = {
["SetKey"] = function(self, key) ["SetKey"] = function(self, key)
if (key or "") == "" then if (key or "") == "" then
self.button:SetText(NOT_BOUND) self.button:SetText(NOT_BOUND)
self.text:SetFontObject("GameFontNormal") self.button:SetNormalFontObject("GameFontNormal")
else else
self.button:SetText(key) self.button:SetText(key)
self.text:SetFontObject("GameFontHighlight") self.button:SetNormalFontObject("GameFontHighlight")
end end
end, end,
@@ -185,31 +179,28 @@ local ControlBackdrop = {
insets = { left = 3, right = 3, top = 3, bottom = 3 } insets = { left = 3, right = 3, top = 3, bottom = 3 }
} }
local function keybindingMsgFixWidth() local function keybindingMsgFixWidth(frame)
this:SetWidth(this.msg:GetWidth() + 10) frame:SetWidth(frame.msg:GetWidth() + 10)
this:SetScript("OnUpdate", nil) frame:SetScript("OnUpdate", nil)
end end
local function Constructor() local function Constructor()
local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type) local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent)
local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate2") local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate")
button:EnableMouse(true) button:EnableMouse(true)
button:EnableMouseWheel(false) button:EnableMouseWheel(false)
button:RegisterForClicks("AnyDown")
button:SetScript("OnEnter", Control_OnEnter) button:SetScript("OnEnter", Control_OnEnter)
button:SetScript("OnLeave", Control_OnLeave) button:SetScript("OnLeave", Control_OnLeave)
button:SetScript("OnClick", Keybinding_OnClick)
button:SetScript("OnKeyDown", Keybinding_OnKeyDown) button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:RegisterForClicks("AnyDown","AnyUp")
-- Ace3v: RegisterForClicks means OnClick will not be triggered, so use OnKeyDown and OnKeyUp
button:SetScript("OnMouseDown", Keybinding_OnMouseDown) button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
button:SetScript("OnMouseUp", Keybinding_OnMouseUp)
button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel) button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
button:SetScript("OnHide", Keybinding_OnHide) button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMLEFT",0,0) button:SetPoint("BOTTOMRIGHT")
button:SetPoint("BOTTOMRIGHT",0,0)
button:SetHeight(24) button:SetHeight(24)
button:EnableKeyboard(false) button:EnableKeyboard(false)
@@ -218,8 +209,8 @@ local function Constructor()
text:SetPoint("RIGHT", -7, 0) text:SetPoint("RIGHT", -7, 0)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
label:SetPoint("TOPLEFT",0,0) label:SetPoint("TOPLEFT")
label:SetPoint("TOPRIGHT",0,0) label:SetPoint("TOPRIGHT")
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER")
label:SetHeight(18) label:SetHeight(18)
@@ -245,8 +236,7 @@ local function Constructor()
msgframe = msgframe, msgframe = msgframe,
frame = frame, frame = frame,
alignoffset = 30, alignoffset = 30,
type = Type, type = Type
text = text
} }
for method, func in pairs(methods) do for method, func in pairs(methods) do
widget[method] = func widget[method] = func
@@ -2,12 +2,12 @@
Label Widget Label Widget
Displays text and optionally an icon. Displays text and optionally an icon.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Label", 23 local Type, Version = "Label", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local max, pairs = math.max, pairs local max, select, pairs, unpack = math.max, select, pairs, unpack
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
@@ -35,14 +35,14 @@ local function UpdateImageAnchor(self)
local imagewidth = image:GetWidth() local imagewidth = image:GetWidth()
if (width - imagewidth) < 200 or (label:GetText() or "") == "" then if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
-- image goes on top centered when less than 200 width for the text, or if there is no text -- image goes on top centered when less than 200 width for the text, or if there is no text
image:SetPoint("TOP",0,0) image:SetPoint("TOP")
label:SetPoint("TOP", image, "BOTTOM") label:SetPoint("TOP", image, "BOTTOM")
label:SetPoint("LEFT",0,0) label:SetPoint("LEFT")
label:SetWidth(width) label:SetWidth(width)
height = image:GetHeight() + label:GetHeight() height = image:GetHeight() + label:GetHeight()
else else
-- image on the left -- image on the left
image:SetPoint("TOPLEFT",0,0) image:SetPoint("TOPLEFT")
if image:GetHeight() > label:GetHeight() then if image:GetHeight() > label:GetHeight() then
label:SetPoint("LEFT", image, "RIGHT", 4, 0) label:SetPoint("LEFT", image, "RIGHT", 4, 0)
else else
@@ -53,7 +53,7 @@ local function UpdateImageAnchor(self)
end end
else else
-- no image shown -- no image shown
label:SetPoint("TOPLEFT",0,0) label:SetPoint("TOPLEFT")
label:SetWidth(width) label:SetWidth(width)
height = label:GetHeight() height = label:GetHeight()
end end
@@ -78,6 +78,8 @@ local methods = {
self:SetImageSize(16, 16) self:SetImageSize(16, 16)
self:SetColor() self:SetColor()
self:SetFontObject() self:SetFontObject()
self:SetJustifyH("LEFT")
self:SetJustifyV("TOP")
-- reset the flag -- reset the flag
self.resizing = nil self.resizing = nil
@@ -103,14 +105,15 @@ local methods = {
self.label:SetVertexColor(r, g, b) self.label:SetVertexColor(r, g, b)
end, end,
["SetImage"] = function(self, path, a1,a2,a3,a4,a5,a6,a7,a8) ["SetImage"] = function(self, path, ...)
local image = self.image local image = self.image
image:SetTexture(path) image:SetTexture(path)
if image:GetTexture() then if image:GetTexture() then
self.imageshown = true self.imageshown = true
if a4 or a8 then local n = select("#", arg)
image:SetTexCoord(a1,a2,a3,a4,a5,a6,a7,a8) if n == 4 or n == 8 then
image:SetTexCoord(unpack(arg))
else else
image:SetTexCoord(0, 1, 0, 1) image:SetTexCoord(0, 1, 0, 1)
end end
@@ -133,6 +136,14 @@ local methods = {
self.image:SetHeight(height) self.image:SetHeight(height)
UpdateImageAnchor(self) UpdateImageAnchor(self)
end, end,
["SetJustifyH"] = function(self, justifyH)
self.label:SetJustifyH(justifyH)
end,
["SetJustifyV"] = function(self, justifyV)
self.label:SetJustifyV(justifyV)
end,
} }
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -143,9 +154,6 @@ local function Constructor()
frame:Hide() frame:Hide()
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall") local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
label:SetJustifyH("LEFT")
label:SetJustifyV("TOP")
local image = frame:CreateTexture(nil, "BACKGROUND") local image = frame:CreateTexture(nil, "BACKGROUND")
-- create widget -- create widget
@@ -2,17 +2,13 @@ local Type, Version = "MultiLineEditBox", 28
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local AceCore = LibStub("AceCore-3.0")
local hooksecurefunc = AceCore.hooksecurefunc
-- Lua APIs -- Lua APIs
local strfmt = string.format local pairs, unpack = pairs, unpack
local pairs = pairs
-- WoW APIs -- WoW APIs
local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local _G = AceCore._G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- List them here for Mikk's FindGlobals script
@@ -21,6 +17,7 @@ local _G = AceCore._G
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
if not AceGUIMultiLineEditBoxInsertLink then if not AceGUIMultiLineEditBoxInsertLink then
-- upgradeable hook -- upgradeable hook
hooksecurefunc("BankFrameItemButtonGeneric_OnClick", hooksecurefunc("BankFrameItemButtonGeneric_OnClick",
@@ -115,14 +112,15 @@ end
function _G.AceGUIMultiLineEditBoxInsertLink(text) function _G.AceGUIMultiLineEditBoxInsertLink(text)
for i = 1, AceGUI:GetWidgetCount(Type) do for i = 1, AceGUI:GetWidgetCount(Type) do
local editbox = _G[strfmt("MultiLineEditBox%uEdit",i)] local editbox = _G[format("MultiLineEditBox%uEdit", i)]
if editbox and editbox:IsVisible() and editbox.hasfocus then if editbox and editbox:IsVisible() and editbox:HasFocus() then
editbox:Insert(text) editbox:Insert(text)
return true return true
end end
end end
end end
local function Layout(self) local function Layout(self)
self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight) self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
@@ -144,122 +142,104 @@ end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function OnClick() -- Button local function OnClick(self) -- Button
local self = this.obj self = self.obj
self.editBox:ClearFocus() self.editBox:ClearFocus()
if not self:Fire("OnEnterPressed", 1, self.editBox:GetText()) then if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
self.button:Disable() self.button:Disable()
end end
end end
local function OnCursorChanged() -- EditBox local function OnCursorChanged(self, _, y, _, cursorHeight) -- EditBox
self, y = self.obj.scrollFrame, -y
local self, y = this.obj.scrollFrame, -arg2
local offset = self:GetVerticalScroll() local offset = self:GetVerticalScroll()
if y < offset then if y < offset then
self:SetVerticalScroll(y) self:SetVerticalScroll(y)
else else
y = y + arg4 - self:GetHeight() y = y + cursorHeight - self:GetHeight()
if y > offset then if y > offset then
self:SetVerticalScroll(y) self:SetVerticalScroll(y)
end end
end end
end end
local function OnEditFocusLost() -- EditBox local function OnEditFocusLost(self) -- EditBox
this.hasfocus = nil self:HighlightText(0, 0)
this:HighlightText(0, 0) self.obj:Fire("OnEditFocusLost")
this.obj:Fire("OnEditFocusLost")
end end
local function OnEnter() -- EditBox / ScrollFrame local function OnEnter(self) -- EditBox / ScrollFrame
local self = this.obj self = self.obj
if not self.entered then if not self.entered then
self.entered = true self.entered = true
self:Fire("OnEnter") self:Fire("OnEnter")
end end
end end
local function OnLeave() -- EditBox / ScrollFrame local function OnLeave(self) -- EditBox / ScrollFrame
local self = this.obj self = self.obj
if self.entered then if self.entered then
self.entered = nil self.entered = nil
self:Fire("OnLeave") self:Fire("OnLeave")
end end
end end
local function OnMouseUp() -- ScrollFrame local function OnMouseUp(self) -- ScrollFrame
local self = this.obj.editBox self = self.obj.editBox
self:SetFocus() self:SetFocus()
local n = self:GetNumLetters() self:SetCursorPosition(self:GetNumLetters())
self:HighlightText(n,n)
end end
local function OnReceiveDrag() -- EditBox / ScrollFrame local function OnReceiveDrag(self) -- EditBox / ScrollFrame
if not GetCursorInfo then return end
local type, id, info = GetCursorInfo() local type, id, info = GetCursorInfo()
if type == "spell" then if type == "spell" then
local spell, rank = GetSpellName(id, info) info = GetSpellInfo(id, info)
if rank ~= "" then spell = spell.."("..rank..")" end
info = spell
elseif type ~= "item" then elseif type ~= "item" then
return return
end end
ClearCursor() ClearCursor()
local self = this.obj self = self.obj
local editBox = self.editBox local editBox = self.editBox
if not this.hasfocus then if not editBox:HasFocus() then
this.hasfocus = true
editBox:SetFocus() editBox:SetFocus()
local n = editBox:GetNumLetters() editBox:SetCursorPosition(editBox:GetNumLetters())
editBox:HighlightText(n,n)
end end
editBox:Insert(info) editBox:Insert(info)
self.button:Enable() self.button:Enable()
end end
local function OnSizeChanged() -- ScrollFrame local function OnSizeChanged(self, width, height) -- ScrollFrame
this.obj.editBox:SetWidth(arg1) self.obj.editBox:SetWidth(width)
end end
local function OnTextChanged() -- EditBox local function OnTextChanged(self, userInput) -- EditBox
local self = this.obj if userInput then
local value = this:GetText() self = self.obj
if tostring(value) ~= tostring(self.lasttext) then self:Fire("OnTextChanged", self.editBox:GetText())
self:Fire("OnTextChanged", 1, value)
self.lasttext = value
self.button:Enable() self.button:Enable()
end end
end end
local function OnTextSet() -- EditBox local function OnTextSet(self) -- EditBox
this:HighlightText(0, 0) self:HighlightText(0, 0)
this.obj.button:Disable() self:SetCursorPosition(self:GetNumLetters())
self:SetCursorPosition(0)
self.obj.button:Disable()
end end
local function OnVerticalScroll() -- ScrollFrame local function OnVerticalScroll(self, offset) -- ScrollFrame
local self = this.obj local editBox = self.obj.editBox
local editBox = self.editBox editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
editBox:SetHitRectInsets(0, 0, arg1, editBox:GetHeight() - arg1 - this:GetHeight())
self.scrollFrame:SetScrollChild(self.editBox)
self.editBox:SetPoint("TOPLEFT",0,arg1)
self.editBox:SetPoint("TOPRIGHT",0,arg1)
end end
local function OnShowFocus() local function OnShowFocus(frame)
this.obj.editBox:SetFocus() frame.obj.editBox:SetFocus()
this:SetScript("OnShow", nil) frame:SetScript("OnShow", nil)
end end
local function OnEditFocusGained() local function OnEditFocusGained(frame)
this.hasfocus = true AceGUI:SetFocus(frame.obj)
AceGUI:SetFocus(this.obj) frame.obj:Fire("OnEditFocusGained")
this.obj:Fire("OnEditFocusGained")
end
local function OnEscapePressed() -- EditBox
AceGUI:ClearFocus()
end end
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -320,10 +300,7 @@ local methods = {
end, end,
["SetText"] = function(self, text) ["SetText"] = function(self, text)
self.lasttext = text or "" self.editBox:SetText(text)
self.editBox:SetText(text or "")
self.editBox:HighlightText(0)
self.button:Disable()
end, end,
["GetText"] = function(self) ["GetText"] = function(self)
@@ -343,7 +320,7 @@ local methods = {
end end
Layout(self) Layout(self)
end, end,
["ClearFocus"] = function(self) ["ClearFocus"] = function(self)
self.editBox:ClearFocus() self.editBox:ClearFocus()
self.frame:SetScript("OnShow", nil) self.frame:SetScript("OnShow", nil)
@@ -359,6 +336,16 @@ local methods = {
["HighlightText"] = function(self, from, to) ["HighlightText"] = function(self, from, to)
self.editBox:HighlightText(from, to) self.editBox:HighlightText(from, to)
end, end,
["GetCursorPosition"] = function(self)
return self.editBox:GetCursorPosition()
end,
["SetCursorPosition"] = function(self, ...)
return self.editBox:SetCursorPosition(unpack(arg))
end,
} }
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@@ -373,7 +360,7 @@ local backdrop = {
local function Constructor() local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide() frame:Hide()
local widgetNum = AceGUI:GetNextWidgetNum(Type) local widgetNum = AceGUI:GetNextWidgetNum(Type)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -383,14 +370,14 @@ local function Constructor()
label:SetText(ACCEPT) label:SetText(ACCEPT)
label:SetHeight(10) label:SetHeight(10)
local button = CreateFrame("Button", strfmt("%s%dButton", Type, widgetNum), frame, "UIPanelButtonTemplate") local button = CreateFrame("Button", format("%s%dButton", Type, widgetNum), frame, "UIPanelButtonTemplate")
button:SetPoint("BOTTOMLEFT", 0, 4) button:SetPoint("BOTTOMLEFT", 0, 4)
button:SetHeight(22) button:SetHeight(22)
button:SetWidth(label:GetStringWidth() + 24) button:SetWidth(label:GetStringWidth() + 24)
button:SetText(ACCEPT) button:SetText(ACCEPT)
button:SetScript("OnClick", OnClick) button:SetScript("OnClick", OnClick)
button:Disable() button:Disable()
local text = button:GetFontString() local text = button:GetFontString()
text:ClearAllPoints() text:ClearAllPoints()
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5) text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
@@ -402,7 +389,7 @@ local function Constructor()
scrollBG:SetBackdropColor(0, 0, 0) scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
local scrollFrame = CreateFrame("ScrollFrame", strfmt("%s%dScrollFrame", Type, widgetNum), frame, "UIPanelScrollFrameTemplate") local scrollFrame = CreateFrame("ScrollFrame", format("%s%dScrollFrame", Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"] local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
scrollBar:ClearAllPoints() scrollBar:ClearAllPoints()
@@ -420,37 +407,28 @@ local function Constructor()
scrollFrame:SetScript("OnMouseUp", OnMouseUp) scrollFrame:SetScript("OnMouseUp", OnMouseUp)
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag) scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged) scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
local old = scrollFrame:GetScript("OnVerticalScroll"); scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
if old then
scrollFrame:SetScript("OnVerticalScroll", function()
old()
OnVerticalScroll()
end)
else
scrollFrame:SetScript("OnVerticalScroll", OnVerticalScroll)
end
local editBox = CreateFrame("EditBox", strfmt("%s%dEdit", Type, widgetNum), scrollFrame) local editBox = CreateFrame("EditBox", format("%s%dEdit", Type, widgetNum), scrollFrame)
editBox:SetAllPoints()
editBox:SetFontObject(ChatFontNormal) editBox:SetFontObject(ChatFontNormal)
editBox:SetMultiLine(true) editBox:SetMultiLine(true)
editBox:EnableMouse(true) editBox:EnableMouse(true)
editBox:SetAutoFocus(false) editBox:SetAutoFocus(false)
--editBox:SetCountInvisibleLetters(false) editBox:SetCountInvisibleLetters(false)
editBox:SetScript("OnCursorChanged", OnCursorChanged) editBox:SetScript("OnCursorChanged", OnCursorChanged)
editBox:SetScript("OnEditFocusLost", OnEditFocusLost) editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
editBox:SetScript("OnEnter", OnEnter) editBox:SetScript("OnEnter", OnEnter)
editBox:SetScript("OnEscapePressed", OnEscapePressed) editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
editBox:SetScript("OnLeave", OnLeave) editBox:SetScript("OnLeave", OnLeave)
editBox:SetScript("OnMouseDown", OnReceiveDrag) editBox:SetScript("OnMouseDown", OnReceiveDrag)
editBox:SetScript("OnReceiveDrag", OnReceiveDrag) editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
editBox:SetScript("OnTextChanged", OnTextChanged) editBox:SetScript("OnTextChanged", OnTextChanged)
editBox:SetScript("OnTextSet", OnTextSet) editBox:SetScript("OnTextSet", OnTextSet)
editBox:SetScript("OnEditFocusGained", OnEditFocusGained) editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-- Ace3v: the orders are important here
scrollFrame:SetScrollChild(editBox) scrollFrame:SetScrollChild(editBox)
editBox:SetPoint("TOPLEFT",0,0)
editBox:SetPoint("TOPRIGHT",0,0)
local widget = { local widget = {
button = button, button = button,
@@ -2,12 +2,13 @@
Slider Widget Slider Widget
Graphical Slider, like, for Range values. Graphical Slider, like, for Range values.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Slider", 21 local Type, Version = "Slider", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local min, max, floor = math.min, math.max, math.floor local min, max, floor = math.min, math.max, math.floor
local gsub = string.gsub
local tonumber, pairs = tonumber, pairs local tonumber, pairs = tonumber, pairs
-- WoW APIs -- WoW APIs
@@ -67,7 +68,7 @@ local function Slider_OnValueChanged()
end end
if newvalue ~= self.value and not self.disabled then if newvalue ~= self.value and not self.disabled then
self.value = newvalue self.value = newvalue
self:Fire("OnValueChanged", 1, newvalue) self:Fire("OnValueChanged", newvalue)
end end
if self.value then if self.value then
UpdateText(self) UpdateText(self)
@@ -77,7 +78,7 @@ end
local function Slider_OnMouseUp() local function Slider_OnMouseUp()
local self = this.obj local self = this.obj
self:Fire("OnMouseUp", 1, self.value) self:Fire("OnMouseUp", self.value)
end end
local function Slider_OnMouseWheel() local function Slider_OnMouseWheel()
@@ -101,7 +102,7 @@ local function EditBox_OnEnterPressed()
local self = this.obj local self = this.obj
local value = this:GetText() local value = this:GetText()
if self.ispercent then if self.ispercent then
value = value:gsub('%%', '') value = gsub(value, '%%', '')
value = tonumber(value) / 100 value = tonumber(value) / 100
else else
value = tonumber(value) value = tonumber(value)
@@ -110,7 +111,7 @@ local function EditBox_OnEnterPressed()
if value then if value then
PlaySound("igMainMenuOptionCheckBoxOn") PlaySound("igMainMenuOptionCheckBoxOn")
self.slider:SetValue(value) self.slider:SetValue(value)
self:Fire("OnMouseUp", 1, value) self:Fire("OnMouseUp", value)
end end
end end
@@ -221,9 +222,9 @@ local function Constructor()
frame:SetScript("OnMouseDown", Frame_OnMouseDown) frame:SetScript("OnMouseDown", Frame_OnMouseDown)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal") local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("TOPLEFT",0,0) label:SetPoint("TOPLEFT", 0, 0)
label:SetPoint("TOPRIGHT",0,0) label:SetPoint("TOPRIGHT", 0, 0)
label:SetJustifyH("CENTER",0,0) label:SetJustifyH("CENTER", 0, 0)
label:SetHeight(15) label:SetHeight(15)
local slider = CreateFrame("Slider", nil, frame) local slider = CreateFrame("Slider", nil, frame)
@@ -12,6 +12,7 @@
<Script file="AceGUIContainer-Window.lua"/> <Script file="AceGUIContainer-Window.lua"/>
<!-- Widgets --> <!-- Widgets -->
<Script file="AceGUIWidget-Button.lua"/> <Script file="AceGUIWidget-Button.lua"/>
<Script file="AceGUIWidget-Button-ElvUI.lua"/>
<Script file="AceGUIWidget-CheckBox.lua"/> <Script file="AceGUIWidget-CheckBox.lua"/>
<Script file="AceGUIWidget-ColorPicker.lua"/> <Script file="AceGUIWidget-ColorPicker.lua"/>
<Script file="AceGUIWidget-DropDown.lua"/> <Script file="AceGUIWidget-DropDown.lua"/>
+1 -1
View File
@@ -1,6 +1,6 @@
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local AB = E:GetModule("ActionBars"); local AB = E:GetModule("ActionBars");
local ACD = LibStub("AceConfigDialog-3.0"); local ACD = LibStub("AceConfigDialog-3.0-ElvUI");
local group local group
--Cache global variables --Cache global variables
+102 -6
View File
@@ -1,5 +1,5 @@
local E, L, V, P, G = unpack(ElvUI); local E, L, V, P, G = unpack(ElvUI);
local D = {}; --local D = E:GetModule("Distributor");
local AceGUI = LibStub("AceGUI-3.0"); local AceGUI = LibStub("AceGUI-3.0");
local pairs = pairs; local pairs = pairs;
@@ -14,10 +14,11 @@ local UnitName = UnitName;
local DEFAULT_WIDTH = 890; local DEFAULT_WIDTH = 890;
local DEFAULT_HEIGHT = 651; local DEFAULT_HEIGHT = 651;
local AC = LibStub("AceConfig-3.0"); local AC = LibStub("AceConfig-3.0-ElvUI");
local ACD = LibStub("AceConfigDialog-3.0"); local ACD = LibStub("AceConfigDialog-3.0-ElvUI");
local ACR = LibStub("AceConfigRegistry-3.0"); local ACR = LibStub("AceConfigRegistry-3.0-ElvUI");
AC.RegisterOptionsTable(E, "ElvUI", E.Options);
AC:RegisterOptionsTable("ElvUI", E.Options);
ACD:SetDefaultSize("ElvUI", DEFAULT_WIDTH, DEFAULT_HEIGHT); ACD:SetDefaultSize("ElvUI", DEFAULT_WIDTH, DEFAULT_HEIGHT);
function E:RefreshGUI() function E:RefreshGUI()
@@ -66,4 +67,99 @@ E.Options.args = {
desc = L["Reset all frames to their original positions."], desc = L["Reset all frames to their original positions."],
func = function() E:ResetUI(); end func = function() E:ResetUI(); end
} }
}; };
local DONATOR_STRING = "";
local DEVELOPER_STRING = "";
local TESTER_STRING = "";
local LINE_BREAK = "\n";
local DONATORS = {
"Dandruff",
"Tobur/Tarilya",
"Netu",
"Alluren",
"Thorgnir",
"Emalal",
"Bendmeova",
"Curl",
"Zarac",
"Emmo",
"Oz",
"Hawké",
"Aynya",
"Tahira",
"Karsten Lumbye Thomsen",
"Thomas B. aka Pitschiqüü",
"Sea Garnet",
"Paul Storry",
"Azagar",
"Archury",
"Donhorn",
"Woodson Harmon",
"Phoenyx",
"Feat",
"Konungr",
"Leyrin",
"Dragonsys",
"Tkalec",
"Paavi",
"Giorgio",
"Bearscantank",
"Eidolic",
"Cosmo",
"Adorno",
"Domoaligato",
"Smorg",
"Pyrokee",
"Portable",
"Ithilyn"
};
local DEVELOPERS = {
"Tukz",
"Haste",
"Nightcracker",
"Omega1970",
"Hydrazine"
};
local TESTERS = {
"Tukui Community",
"|cffF76ADBSarah|r - For Sarahing",
"Affinity",
"Modarch",
"Bladesdruid",
"Tirain",
"Phima",
"Veiled",
"Blazeflack",
"Repooc",
"Darth Predator",
"Alex",
"Nidra",
"Kurhyus",
"BuG",
"Yachanay",
"Catok"
}
tsort(DONATORS, function(a, b) return a < b end);
for _, donatorName in pairs(DONATORS) do
tinsert(E.CreditsList, donatorName);
DONATOR_STRING = DONATOR_STRING .. LINE_BREAK .. donatorName;
end
tsort(DEVELOPERS, function(a,b) return a < b end);
for _, devName in pairs(DEVELOPERS) do
tinsert(E.CreditsList, devName);
DEVELOPER_STRING = DEVELOPER_STRING .. LINE_BREAK .. devName;
end
tsort(TESTERS, function(a, b) return a < b end)
for _, testerName in pairs(TESTERS) do
tinsert(E.CreditsList, testerName);
TESTER_STRING = TESTER_STRING .. LINE_BREAK .. testerName;
end