WoWInterface SVN ReadySpells

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /trunk/ReadySpells/libs/AceConfig-3.0/AceConfigCmd-3.0
    from Rev 4 to Rev 23
    Reverse comparison

Rev 4 → Rev 23

AceConfigCmd-3.0.lua
1,7 → 1,7
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file
-- @name AceConfigCmd-3.0
-- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 
--[[
AceConfigCmd-3.0
63,7 → 63,7
 
-- pickfirstset() - picks the first non-nil value and returns it
 
local function pickfirstset(...)
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
120,7 → 120,7
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
 
if type(method)=="function" then
return method(info, ...)
else
131,7 → 131,7
-- do_final() - do the final step (set/execute) along with validation and confirmation
 
local function do_final(info, inputpos, tab, methodtype, ...)
if info.validate then
if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
139,7 → 139,7
end
end
-- console ignores .confirm
 
 
callmethod(info,inputpos,tab,methodtype, ...)
end
 
152,8 → 152,8
if val~=nil then
if val==false then
val=nil
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end
info[paramname] = val
info[paramname.."_at"] = depth
166,13 → 166,13
local dummytable={}
 
local function iterateargs(tab)
if not tab.plugins then
return pairs(tab.args)
if not tab.plugins then
return pairs(tab.args)
end
 
 
local argtabkey,argtab=next(tab.plugins)
local v
 
 
return function(_, k)
while argtab do
k,v = next(argtab, k)
206,18 → 206,18
if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end
 
 
local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref
 
 
for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k)
refTbl[k] = v
end
end
 
tsort(sortTbl, function(one, two)
 
tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then
240,7 → 240,7
if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2
end)
 
 
for i = 1, #sortTbl do
local k = sortTbl[i]
local v = refTbl[k]
327,7 → 327,7
return s
end
 
-- handle() - selfrecursing function that processes input->optiontable
-- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
 
346,16 → 346,16
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 oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
 
 
-------------------------------------------------------------------
-- Act according to .type of this table
 
 
if tab.type=="group" then
------------ group --------------------------------------------
 
 
if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
 
 
-- grab next arg from input
local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
if not arg then
363,11 → 363,11
return
end
nextpos=nextpos+1
 
 
-- loop .args and try to find a key with a matching name
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
 
 
-- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k
383,8 → 383,8
return handle(info,nextpos,v,depth+1)
end
end
 
-- no match
 
-- no match
if retfalse then
-- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at
395,23 → 395,23
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false
end
 
 
-- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return
end
 
 
local str = strsub(info.input,inputpos);
 
 
if tab.type=="execute" then
------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func")
 
 
 
 
 
elseif tab.type=="input" then
------------ input --------------------------------------------
 
 
local res = true
if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
420,11 → 420,11
return
end
end
 
 
do_final(info, inputpos, tab, "set", str)
 
 
 
 
 
elseif tab.type=="toggle" then
------------ toggle --------------------------------------------
local b
444,7 → 444,7
else
b = not b
end
 
 
elseif str==L["on"] then
b = true
elseif str==L["off"] then
459,10 → 459,10
end
return
end
 
 
do_final(info, inputpos, tab, "set", b)
 
 
 
elseif tab.type=="range" then
------------ range --------------------------------------------
local val = tonumber(str)
481,21 → 481,21
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return
end
 
 
do_final(info, inputpos, tab, "set", val)
 
 
 
elseif tab.type=="select" then
------------ select ------------------------------------
local str = strtrim(strlower(str))
 
 
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
local b = callmethod(info, inputpos, tab, "get")
local fmt = "|cffffff78- [%s]|r %s"
512,7 → 512,7
end
 
local ok
for k,v in pairs(values) do
for k,v in pairs(values) do
if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches)
ok = true
523,20 → 523,20
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return
end
 
 
do_final(info, inputpos, tab, "set", str)
 
 
elseif tab.type=="multiselect" then
------------ multiselect -------------------------------------------
local str = strtrim(strlower(str))
 
 
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
local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
550,7 → 550,7
end
return
end
 
 
--build a table of the selections, checking that they exist
--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
559,25 → 559,25
--parse option=on etc
local opt, val = v:match('(.+)=(.+)')
--get option if toggling
if not opt then
opt = v
if not opt then
opt = v
end
 
 
--check that the opt is valid
local ok
for k,v in pairs(values) do
for k,v in pairs(values) do
if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
 
 
if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return
end
 
 
--check that if val was supplied it is valid
if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
596,14 → 596,14
sels[opt] = true
end
end
 
 
for opt, val in pairs(sels) do
local newval
 
 
if (val == true) then
--toggle the option
local b = callmethod(info, inputpos, tab, "get", opt)
 
 
if tab.tristate then
--cycle in true, nil, false order
if b then
627,11 → 627,11
newval = nil
end
end
 
 
do_final(info, inputpos, tab, "set", opt, newval)
end
 
 
 
 
elseif tab.type=="color" then
------------ color --------------------------------------------
local str = strtrim(strlower(str))
639,16 → 639,16
--TODO: Show current value
return
end
 
 
local r, g, b, a
 
 
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 str:len() == 8 and str:find("^%x*$") then
--parse a hex string
662,7 → 662,7
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return
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
--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
701,7 → 701,7
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end
end
 
 
do_final(info, inputpos, tab, "set", r,g,b,a)
 
elseif tab.type=="keybinding" then
737,7 → 737,7
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
--
--
-- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table
754,7 → 754,7
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end
local options = assert( optgetter("cmd", MAJOR) )
 
 
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd,
appName = appName,
765,7 → 765,7
uiType = "cmd",
uiName = MAJOR,
}
 
 
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end