Init
@@ -0,0 +1,19 @@
|
||||
## Interface: 30300
|
||||
## Title: Shadowed UF (Options)
|
||||
## Notes: Configuration for Shadowed Unit Frames.
|
||||
## Author: Shadowed
|
||||
## LoadOnDemand: true
|
||||
## Dependencies: ShadowedUnitFrames
|
||||
## X-Curse-Packaged-Version: v3.2.12
|
||||
## X-Curse-Project-Name: Shadowed Unit Frames
|
||||
## X-Curse-Project-ID: shadowed-unit-frames
|
||||
## X-Curse-Repository-ID: wow/shadowed-unit-frames/mainline
|
||||
|
||||
#@no-lib-strip@
|
||||
libs\AceDBOptions-3.0\AceDBOptions-3.0.xml
|
||||
libs\AceGUI-3.0\AceGUI-3.0.xml
|
||||
libs\AceGUI-3.0-SharedMediaWidgets\widget.xml
|
||||
libs\AceConfig-3.0\AceConfig-3.0.xml
|
||||
#@end-no-lib-strip@
|
||||
|
||||
config.lua
|
||||
@@ -0,0 +1,57 @@
|
||||
--- AceConfig-3.0 wrapper library.
|
||||
-- Provides an API to register an options table with the config registry,
|
||||
-- as well as associate it with a slash command.
|
||||
-- @class file
|
||||
-- @name AceConfig-3.0
|
||||
-- @release $Id: AceConfig-3.0.lua 877 2009-11-02 15:56:50Z nevcairiel $
|
||||
|
||||
--[[
|
||||
AceConfig-3.0
|
||||
|
||||
Very light wrapper library that combines all the AceConfig subcomponents into one more easily used whole.
|
||||
|
||||
]]
|
||||
|
||||
local MAJOR, MINOR = "AceConfig-3.0", 2
|
||||
local AceConfig = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not AceConfig then return end
|
||||
|
||||
local cfgreg = LibStub("AceConfigRegistry-3.0")
|
||||
local cfgcmd = LibStub("AceConfigCmd-3.0")
|
||||
local cfgdlg = LibStub("AceConfigDialog-3.0")
|
||||
--TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local pcall, error, type, pairs = pcall, error, type, pairs
|
||||
|
||||
-- -------------------------------------------------------------------
|
||||
-- :RegisterOptionsTable(appName, options, slashcmd, persist)
|
||||
--
|
||||
-- - appName - (string) application name
|
||||
-- - options - table or function ref, see AceConfigRegistry
|
||||
-- - slashcmd - slash command (string) or table with commands, or nil to NOT create a slash command
|
||||
|
||||
--- Register a option table with the AceConfig registry.
|
||||
-- You can supply a slash command (or a table of slash commands) to register with AceConfigCmd directly.
|
||||
-- @paramsig appName, options [, slashcmd]
|
||||
-- @param appName The application name for the config table.
|
||||
-- @param options The option table (or a function to generate one on demand)
|
||||
-- @param slashcmd A slash command to register for the option table, or a table of slash commands.
|
||||
-- @usage
|
||||
-- local AceConfig = LibStub("AceConfig-3.0")
|
||||
-- AceConfig:RegisterOptionsTable("MyAddon", myOptions, {"/myslash", "/my"})
|
||||
function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
|
||||
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
|
||||
if not ok then error(msg, 2) end
|
||||
|
||||
if slashcmd then
|
||||
if type(slashcmd) == "table" then
|
||||
for _,cmd in pairs(slashcmd) do
|
||||
cfgcmd:CreateChatCommand(cmd, appName)
|
||||
end
|
||||
else
|
||||
cfgcmd:CreateChatCommand(slashcmd, appName)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Include file="AceConfigRegistry-3.0\AceConfigRegistry-3.0.xml"/>
|
||||
<Include file="AceConfigCmd-3.0\AceConfigCmd-3.0.xml"/>
|
||||
<Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/>
|
||||
<!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>-->
|
||||
<Script file="AceConfig-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,787 @@
|
||||
--- 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 904 2009-12-13 11:56:37Z nevcairiel $
|
||||
|
||||
--[[
|
||||
AceConfigCmd-3.0
|
||||
|
||||
Handles commandline optionstable access
|
||||
|
||||
REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
|
||||
|
||||
]]
|
||||
|
||||
-- TODO: plugin args
|
||||
|
||||
|
||||
local MAJOR, MINOR = "AceConfigCmd-3.0", 12
|
||||
local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not AceConfigCmd then return end
|
||||
|
||||
AceConfigCmd.commands = AceConfigCmd.commands or {}
|
||||
local commands = AceConfigCmd.commands
|
||||
|
||||
local cfgreg = LibStub("AceConfigRegistry-3.0")
|
||||
local AceConsole -- LoD
|
||||
local AceConsoleName = "AceConsole-3.0"
|
||||
|
||||
-- Lua APIs
|
||||
local strsub, strsplit, strlower, strmatch, strtrim = string.sub, string.split, string.lower, string.match, string.trim
|
||||
local format, tonumber, tostring = string.format, tonumber, tostring
|
||||
local tsort, tinsert = table.sort, table.insert
|
||||
local select, pairs, next, type = select, pairs, next, type
|
||||
local error, assert = error, assert
|
||||
|
||||
-- WoW APIs
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
|
||||
|
||||
|
||||
local L = setmetatable({}, { -- TODO: replace with proper locale
|
||||
__index = function(self,k) return k end
|
||||
})
|
||||
|
||||
|
||||
|
||||
local function print(msg)
|
||||
(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
|
||||
end
|
||||
|
||||
-- constants used by getparam() calls below
|
||||
|
||||
local handlertypes = {["table"]=true}
|
||||
local handlermsg = "expected a table"
|
||||
|
||||
local functypes = {["function"]=true, ["string"]=true}
|
||||
local funcmsg = "expected function or member name"
|
||||
|
||||
|
||||
-- pickfirstset() - picks the first non-nil value and returns it
|
||||
|
||||
local function pickfirstset(...)
|
||||
for i=1,select("#",...) do
|
||||
if select(i,...)~=nil then
|
||||
return select(i,...)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- err() - produce real error() regarding malformed options tables etc
|
||||
|
||||
local function err(info,inputpos,msg )
|
||||
local cmdstr=" "..strsub(info.input, 1, inputpos-1)
|
||||
error(MAJOR..": /" ..info[0] ..cmdstr ..": "..(msg or "malformed options table"), 2)
|
||||
end
|
||||
|
||||
|
||||
-- usererr() - produce chatframe message regarding bad slash syntax etc
|
||||
|
||||
local function usererr(info,inputpos,msg )
|
||||
local cmdstr=strsub(info.input, 1, inputpos-1);
|
||||
print("/" ..info[0] .. " "..cmdstr ..": "..(msg or "malformed options table"))
|
||||
end
|
||||
|
||||
|
||||
-- callmethod() - call a given named method (e.g. "get", "set") with given arguments
|
||||
|
||||
local function callmethod(info, inputpos, tab, methodtype, ...)
|
||||
local method = info[methodtype]
|
||||
if not method then
|
||||
err(info, inputpos, "'"..methodtype.."': not set")
|
||||
end
|
||||
|
||||
info.arg = tab.arg
|
||||
info.option = tab
|
||||
info.type = tab.type
|
||||
|
||||
if type(method)=="function" then
|
||||
return method(info, ...)
|
||||
elseif type(method)=="string" then
|
||||
if type(info.handler[method])~="function" then
|
||||
err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler))
|
||||
end
|
||||
return info.handler[method](info.handler, info, ...)
|
||||
else
|
||||
assert(false) -- type should have already been checked on read
|
||||
end
|
||||
end
|
||||
|
||||
-- callfunction() - call a given named function (e.g. "name", "desc") with given arguments
|
||||
|
||||
local function callfunction(info, tab, methodtype, ...)
|
||||
local method = tab[methodtype]
|
||||
|
||||
info.arg = tab.arg
|
||||
info.option = tab
|
||||
info.type = tab.type
|
||||
|
||||
if type(method)=="function" then
|
||||
return method(info, ...)
|
||||
else
|
||||
assert(false) -- type should have already been checked on read
|
||||
end
|
||||
end
|
||||
|
||||
-- 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
|
||||
local res = callmethod(info,inputpos,tab,"validate",...)
|
||||
if type(res)=="string" then
|
||||
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
|
||||
return
|
||||
end
|
||||
end
|
||||
-- console ignores .confirm
|
||||
|
||||
callmethod(info,inputpos,tab,methodtype, ...)
|
||||
end
|
||||
|
||||
|
||||
-- getparam() - used by handle() to retreive and store "handler", "get", "set", etc
|
||||
|
||||
local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
|
||||
local old,oldat = info[paramname], info[paramname.."_at"]
|
||||
local val=tab[paramname]
|
||||
if val~=nil then
|
||||
if val==false then
|
||||
val=nil
|
||||
elseif not types[type(val)] then
|
||||
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
|
||||
end
|
||||
info[paramname] = val
|
||||
info[paramname.."_at"] = depth
|
||||
end
|
||||
return old,oldat
|
||||
end
|
||||
|
||||
|
||||
-- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.*
|
||||
local dummytable={}
|
||||
|
||||
local function iterateargs(tab)
|
||||
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)
|
||||
if k then return k,v end
|
||||
if argtab==tab.args then
|
||||
argtab=nil
|
||||
else
|
||||
argtabkey,argtab = next(tab.plugins, argtabkey)
|
||||
if not argtabkey then
|
||||
argtab=tab.args
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function checkhidden(info, inputpos, tab)
|
||||
if tab.cmdHidden~=nil then
|
||||
return tab.cmdHidden
|
||||
end
|
||||
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
|
||||
|
||||
local function showhelp(info, inputpos, tab, depth, noHead)
|
||||
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)
|
||||
local o1 = refTbl[one].order or 100
|
||||
local o2 = refTbl[two].order or 100
|
||||
if type(o1) == "function" or type(o1) == "string" then
|
||||
info.order = o1
|
||||
info[#info+1] = one
|
||||
o1 = callmethod(info, inputpos, refTbl[one], "order")
|
||||
info[#info] = nil
|
||||
info.order = nil
|
||||
end
|
||||
if type(o2) == "function" or type(o1) == "string" then
|
||||
info.order = o2
|
||||
info[#info+1] = two
|
||||
o2 = callmethod(info, inputpos, refTbl[two], "order")
|
||||
info[#info] = nil
|
||||
info.order = nil
|
||||
end
|
||||
if o1<0 and o2<0 then return o1<o2 end
|
||||
if o2<0 then return true end
|
||||
if o1<0 then return false end
|
||||
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]
|
||||
if not checkhidden(info, inputpos, v) then
|
||||
if v.type ~= "description" and v.type ~= "header" then
|
||||
-- recursively show all inline groups
|
||||
local name, desc = v.name, v.desc
|
||||
if type(name) == "function" then
|
||||
name = callfunction(info, v, 'name')
|
||||
end
|
||||
if type(desc) == "function" then
|
||||
desc = callfunction(info, v, 'desc')
|
||||
end
|
||||
if v.type == "group" and pickfirstset(v.cmdInline, v.inline, false) then
|
||||
print(" "..(desc or name)..":")
|
||||
local oldhandler,oldhandler_at = getparam(info, inputpos, v, depth, "handler", handlertypes, handlermsg)
|
||||
showhelp(info, inputpos, v, depth, true)
|
||||
info.handler,info.handler_at = oldhandler,oldhandler_at
|
||||
else
|
||||
local key = k:gsub(" ", "_")
|
||||
print(" |cffffff78"..key.."|r - "..(desc or name or ""))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function keybindingValidateFunc(text)
|
||||
if text == nil or text == "NONE" then
|
||||
return nil
|
||||
end
|
||||
text = text:upper()
|
||||
local shift, ctrl, alt
|
||||
local modifier
|
||||
while true do
|
||||
if text == "-" then
|
||||
break
|
||||
end
|
||||
modifier, text = strsplit('-', text, 2)
|
||||
if text then
|
||||
if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then
|
||||
return false
|
||||
end
|
||||
if modifier == "SHIFT" then
|
||||
if shift then
|
||||
return false
|
||||
end
|
||||
shift = true
|
||||
end
|
||||
if modifier == "CTRL" then
|
||||
if ctrl then
|
||||
return false
|
||||
end
|
||||
ctrl = true
|
||||
end
|
||||
if modifier == "ALT" then
|
||||
if alt then
|
||||
return false
|
||||
end
|
||||
alt = true
|
||||
end
|
||||
else
|
||||
text = modifier
|
||||
break
|
||||
end
|
||||
end
|
||||
if text == "" then
|
||||
return false
|
||||
end
|
||||
if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] then
|
||||
return false
|
||||
end
|
||||
local s = text
|
||||
if shift then
|
||||
s = "SHIFT-" .. s
|
||||
end
|
||||
if ctrl then
|
||||
s = "CTRL-" .. s
|
||||
end
|
||||
if alt then
|
||||
s = "ALT-" .. s
|
||||
end
|
||||
return s
|
||||
end
|
||||
|
||||
-- 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)
|
||||
|
||||
local function handle(info, inputpos, tab, depth, retfalse)
|
||||
|
||||
if not(type(tab)=="table" and type(tab.type)=="string") then err(info,inputpos) end
|
||||
|
||||
-------------------------------------------------------------------
|
||||
-- Grab hold of handler,set,get,func,etc if set (and remember old ones)
|
||||
-- Note that we do NOT validate if method names are correct at this stage,
|
||||
-- the handler may change before they're actually used!
|
||||
|
||||
local oldhandler,oldhandler_at = getparam(info,inputpos,tab,depth,"handler",handlertypes,handlermsg)
|
||||
local oldset,oldset_at = getparam(info,inputpos,tab,depth,"set",functypes,funcmsg)
|
||||
local oldget,oldget_at = getparam(info,inputpos,tab,depth,"get",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 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
|
||||
showhelp(info, inputpos, tab, depth)
|
||||
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
|
||||
if handle(info, inputpos, v, depth+1, true)==false then
|
||||
info[depth+1] = nil
|
||||
-- wasn't found in there, but that's ok, we just keep looking down here
|
||||
else
|
||||
return -- done, name was found in inline group
|
||||
end
|
||||
-- matching name and not a inline group
|
||||
elseif strlower(arg)==strlower(k:gsub(" ", "_")) then
|
||||
info[depth+1] = k
|
||||
return handle(info,nextpos,v,depth+1)
|
||||
end
|
||||
end
|
||||
|
||||
-- no match
|
||||
if retfalse then
|
||||
-- restore old infotable members and return false to indicate failure
|
||||
info.handler,info.handler_at = oldhandler,oldhandler_at
|
||||
info.set,info.set_at = oldset,oldset_at
|
||||
info.get,info.get_at = oldget,oldget_at
|
||||
info.func,info.func_at = oldfunc,oldfunc_at
|
||||
info.validate,info.validate_at = oldvalidate,oldvalidate_at
|
||||
--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
|
||||
if not strmatch(str, tab.pattern) then
|
||||
usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
do_final(info, inputpos, tab, "set", str)
|
||||
|
||||
|
||||
|
||||
elseif tab.type=="toggle" then
|
||||
------------ toggle --------------------------------------------
|
||||
local b
|
||||
local str = strtrim(strlower(str))
|
||||
if str=="" then
|
||||
b = callmethod(info, inputpos, tab, "get")
|
||||
|
||||
if tab.tristate then
|
||||
--cycle in true, nil, false order
|
||||
if b then
|
||||
b = nil
|
||||
elseif b == nil then
|
||||
b = false
|
||||
else
|
||||
b = true
|
||||
end
|
||||
else
|
||||
b = not b
|
||||
end
|
||||
|
||||
elseif str==L["on"] then
|
||||
b = true
|
||||
elseif str==L["off"] then
|
||||
b = false
|
||||
elseif tab.tristate and str==L["default"] then
|
||||
b = nil
|
||||
else
|
||||
if tab.tristate then
|
||||
usererr(info, inputpos, format(L["'%s' - expected 'on', 'off' or 'default', or no argument to toggle."], str))
|
||||
else
|
||||
usererr(info, inputpos, format(L["'%s' - expected 'on' or 'off', or no argument to toggle."], str))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
do_final(info, inputpos, tab, "set", b)
|
||||
|
||||
|
||||
elseif tab.type=="range" then
|
||||
------------ range --------------------------------------------
|
||||
local val = tonumber(str)
|
||||
if not val then
|
||||
usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
|
||||
return
|
||||
end
|
||||
if type(info.step)=="number" then
|
||||
val = val- (val % info.step)
|
||||
end
|
||||
if type(info.min)=="number" and val<info.min then
|
||||
usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(info.min)) )
|
||||
return
|
||||
end
|
||||
if type(info.max)=="number" and val>info.max then
|
||||
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"
|
||||
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
|
||||
print(L["Options for |cffffff78"..info[#info].."|r:"])
|
||||
for k, v in pairs(values) do
|
||||
if b == k then
|
||||
print(fmt_sel:format(k, v))
|
||||
else
|
||||
print(fmt:format(k, v))
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local ok
|
||||
for k,v in pairs(values) do
|
||||
if strlower(k)==str then
|
||||
str = k -- overwrite with key (in case of case mismatches)
|
||||
ok = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not ok then
|
||||
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"
|
||||
print(L["Options for |cffffff78"..info[#info].."|r (multiple possible):"])
|
||||
for k, v in pairs(values) do
|
||||
if callmethod(info, inputpos, tab, "get", k) then
|
||||
print(fmt_sel:format(k, v))
|
||||
else
|
||||
print(fmt:format(k, v))
|
||||
end
|
||||
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
|
||||
local sels = {}
|
||||
for v in str:gmatch("[^ ]+") do
|
||||
--parse option=on etc
|
||||
local opt, val = v:match('(.+)=(.+)')
|
||||
--get option if toggling
|
||||
if not opt then
|
||||
opt = v
|
||||
end
|
||||
|
||||
--check that the opt is valid
|
||||
local ok
|
||||
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
|
||||
--val is valid insert it
|
||||
sels[opt] = val
|
||||
else
|
||||
if tab.tristate then
|
||||
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on', 'off' or 'default', or no argument to toggle."], v, val))
|
||||
else
|
||||
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val))
|
||||
end
|
||||
return
|
||||
end
|
||||
else
|
||||
-- no val supplied, toggle
|
||||
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
|
||||
b = nil
|
||||
elseif b == nil then
|
||||
b = false
|
||||
else
|
||||
b = true
|
||||
end
|
||||
else
|
||||
b = not b
|
||||
end
|
||||
newval = b
|
||||
else
|
||||
--set the option as specified
|
||||
if val==L["on"] then
|
||||
newval = true
|
||||
elseif val==L["off"] then
|
||||
newval = false
|
||||
elseif val==L["default"] then
|
||||
newval = nil
|
||||
end
|
||||
end
|
||||
|
||||
do_final(info, inputpos, tab, "set", opt, newval)
|
||||
end
|
||||
|
||||
|
||||
elseif tab.type=="color" then
|
||||
------------ color --------------------------------------------
|
||||
local str = strtrim(strlower(str))
|
||||
if str == "" then
|
||||
--TODO: Show current value
|
||||
return
|
||||
end
|
||||
|
||||
local r, g, b, a
|
||||
|
||||
if tab.hasAlpha then
|
||||
if str:len() == 8 and str:find("^%x*$") then
|
||||
--parse a hex string
|
||||
r,g,b,a = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255, tonumber(str:sub(7, 8), 16) / 255
|
||||
else
|
||||
--parse seperate values
|
||||
r,g,b,a = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$")
|
||||
r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a)
|
||||
end
|
||||
if not (r and g and b and a) then
|
||||
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
|
||||
--values are valid 0..255, convert to 0..1
|
||||
r = r / 255
|
||||
g = g / 255
|
||||
b = b / 255
|
||||
a = a / 255
|
||||
else
|
||||
--values are invalid
|
||||
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0..1 or 0..255."], str))
|
||||
end
|
||||
else
|
||||
a = 1.0
|
||||
if str:len() == 6 and str:find("^%x*$") then
|
||||
--parse a hex string
|
||||
r,g,b = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255
|
||||
else
|
||||
--parse seperate values
|
||||
r,g,b = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+)$")
|
||||
r,g,b = tonumber(r), tonumber(g), tonumber(b)
|
||||
end
|
||||
if not (r and g and b) then
|
||||
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBB' or 'r g b'."], 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 then
|
||||
--values are valid
|
||||
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 then
|
||||
--values are valid 0..255, convert to 0..1
|
||||
r = r / 255
|
||||
g = g / 255
|
||||
b = b / 255
|
||||
else
|
||||
--values are invalid
|
||||
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
|
||||
------------ keybinding --------------------------------------------
|
||||
local str = strtrim(strlower(str))
|
||||
if str == "" then
|
||||
--TODO: Show current value
|
||||
return
|
||||
end
|
||||
local value = keybindingValidateFunc(str:upper())
|
||||
if value == false then
|
||||
usererr(info, inputpos, format(L["'%s' - Invalid Keybinding."], str))
|
||||
return
|
||||
end
|
||||
|
||||
do_final(info, inputpos, tab, "set", value)
|
||||
|
||||
elseif tab.type=="description" then
|
||||
------------ description --------------------
|
||||
-- ignore description, GUI config only
|
||||
else
|
||||
err(info, inputpos, "unknown options table item type '"..tostring(tab.type).."'")
|
||||
end
|
||||
end
|
||||
|
||||
--- Handle the chat command.
|
||||
-- This is usually called from a chat command handler to parse the command input as operations on an aceoptions table.\\
|
||||
-- AceConfigCmd uses this function internally when a slash command is registered with `:CreateChatCommand`
|
||||
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
|
||||
-- @param appName The application name as given to `:RegisterOptionsTable()`
|
||||
-- @param input The commandline input (as given by the WoW handler, i.e. without the command itself)
|
||||
-- @usage
|
||||
-- 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
|
||||
-- if not input or input:trim() == "" then
|
||||
-- LibStub("AceConfigDialog-3.0"):Open("MyOptions")
|
||||
-- else
|
||||
-- LibStub("AceConfigCmd-3.0").HandleCommand(MyAddon, "mychat", "MyOptions", input)
|
||||
-- end
|
||||
-- end
|
||||
function AceConfigCmd:HandleCommand(slashcmd, appName, input)
|
||||
|
||||
local optgetter = cfgreg:GetOptionsTable(appName)
|
||||
if not optgetter then
|
||||
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,
|
||||
options = options,
|
||||
input = input,
|
||||
self = self,
|
||||
handler = self,
|
||||
uiType = "cmd",
|
||||
uiName = MAJOR,
|
||||
}
|
||||
|
||||
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
|
||||
end
|
||||
|
||||
--- Utility function to create a slash command handler.
|
||||
-- Also registers tab completion with AceTab
|
||||
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
|
||||
-- @param appName The application name as given to `:RegisterOptionsTable()`
|
||||
function AceConfigCmd:CreateChatCommand(slashcmd, appName)
|
||||
if not AceConsole then
|
||||
AceConsole = LibStub(AceConsoleName)
|
||||
end
|
||||
if AceConsole.RegisterChatCommand(self, slashcmd, function(input)
|
||||
AceConfigCmd.HandleCommand(self, slashcmd, appName, input) -- upgradable
|
||||
end,
|
||||
true) then -- succesfully registered so lets get the command -> app table in
|
||||
commands[slashcmd] = appName
|
||||
end
|
||||
end
|
||||
|
||||
--- Utility function that returns the options table that belongs to a slashcommand.
|
||||
-- Designed to be used for the AceTab interface.
|
||||
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
|
||||
-- @return The options table associated with the slash command (or nil if the slash command was not registered)
|
||||
function AceConfigCmd:GetChatCommandOptions(slashcmd)
|
||||
return commands[slashcmd]
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceConfigCmd-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceConfigDialog-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,346 @@
|
||||
--- AceConfigRegistry-3.0 handles central registration of options tables in use by addons and modules.\\
|
||||
-- Options tables can be registered as raw tables, OR as function refs that return a table.\\
|
||||
-- Such functions receive three arguments: "uiType", "uiName", "appName". \\
|
||||
-- * 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 **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".
|
||||
-- @class file
|
||||
-- @name AceConfigRegistry-3.0
|
||||
-- @release $Id: AceConfigRegistry-3.0.lua 921 2010-05-09 15:49:14Z nevcairiel $
|
||||
local MAJOR, MINOR = "AceConfigRegistry-3.0", 12
|
||||
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not AceConfigRegistry then return end
|
||||
|
||||
AceConfigRegistry.tables = AceConfigRegistry.tables or {}
|
||||
|
||||
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
|
||||
|
||||
if not AceConfigRegistry.callbacks then
|
||||
AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry)
|
||||
end
|
||||
|
||||
-- Lua APIs
|
||||
local tinsert, tconcat = table.insert, table.concat
|
||||
local strfind, strmatch = string.find, string.match
|
||||
local type, tostring, select, pairs = type, tostring, select, pairs
|
||||
local error, assert = error, assert
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Validating options table consistency:
|
||||
|
||||
|
||||
AceConfigRegistry.validated = {
|
||||
-- list of options table names ran through :ValidateOptionsTable automatically.
|
||||
-- CLEARED ON PURPOSE, since newer versions may have newer validators
|
||||
cmd = {},
|
||||
dropdown = {},
|
||||
dialog = {},
|
||||
}
|
||||
|
||||
|
||||
|
||||
local function err(msg, errlvl, ...)
|
||||
local t = {}
|
||||
for i=select("#",...),1,-1 do
|
||||
tinsert(t, (select(i, ...)))
|
||||
end
|
||||
error(MAJOR..":ValidateOptionsTable(): "..tconcat(t,".")..msg, errlvl+2)
|
||||
end
|
||||
|
||||
|
||||
local isstring={["string"]=true, _="string"}
|
||||
local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"}
|
||||
local istable={["table"]=true, _="table"}
|
||||
local ismethodtable={["table"]=true,["string"]=true,["function"]=true, _="methodname, funcref or table"}
|
||||
local optstring={["nil"]=true,["string"]=true, _="string"}
|
||||
local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
|
||||
local optnumber={["nil"]=true,["number"]=true, _="number"}
|
||||
local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
|
||||
local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true}, _="methodname, funcref or false"}
|
||||
local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true, _="methodname, funcref or number"}
|
||||
local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true, _="methodname, funcref or table"}
|
||||
local optmethodbool={["nil"]=true,["string"]=true,["function"]=true,["boolean"]=true, _="methodname, funcref or boolean"}
|
||||
local opttable={["nil"]=true,["table"]=true, _="table"}
|
||||
local optbool={["nil"]=true,["boolean"]=true, _="boolean"}
|
||||
local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true, _="boolean or number"}
|
||||
|
||||
local basekeys={
|
||||
type=isstring,
|
||||
name=isstringfunc,
|
||||
desc=optstringfunc,
|
||||
descStyle=optstring,
|
||||
order=optmethodnumber,
|
||||
validate=optmethodfalse,
|
||||
confirm=optmethodbool,
|
||||
confirmText=optstring,
|
||||
disabled=optmethodbool,
|
||||
hidden=optmethodbool,
|
||||
guiHidden=optmethodbool,
|
||||
dialogHidden=optmethodbool,
|
||||
dropdownHidden=optmethodbool,
|
||||
cmdHidden=optmethodbool,
|
||||
icon=optstringfunc,
|
||||
iconCoords=optmethodtable,
|
||||
handler=opttable,
|
||||
get=optmethodfalse,
|
||||
set=optmethodfalse,
|
||||
func=optmethodfalse,
|
||||
arg={["*"]=true},
|
||||
width=optstring,
|
||||
}
|
||||
|
||||
local typedkeys={
|
||||
header={},
|
||||
description={
|
||||
image=optstringfunc,
|
||||
imageCoords=optmethodtable,
|
||||
imageHeight=optnumber,
|
||||
imageWidth=optnumber,
|
||||
fontSize=optstringfunc,
|
||||
},
|
||||
group={
|
||||
args=istable,
|
||||
plugins=opttable,
|
||||
inline=optbool,
|
||||
cmdInline=optbool,
|
||||
guiInline=optbool,
|
||||
dropdownInline=optbool,
|
||||
dialogInline=optbool,
|
||||
childGroups=optstring,
|
||||
},
|
||||
execute={
|
||||
image=optstringfunc,
|
||||
imageCoords=optmethodtable,
|
||||
imageHeight=optnumber,
|
||||
imageWidth=optnumber,
|
||||
},
|
||||
input={
|
||||
pattern=optstring,
|
||||
usage=optstring,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
multiline=optboolnumber,
|
||||
},
|
||||
toggle={
|
||||
tristate=optbool,
|
||||
image=optstringfunc,
|
||||
imageCoords=optmethodtable,
|
||||
},
|
||||
tristate={
|
||||
},
|
||||
range={
|
||||
min=optnumber,
|
||||
softMin=optnumber,
|
||||
max=optnumber,
|
||||
softMax=optnumber,
|
||||
step=optnumber,
|
||||
bigStep=optnumber,
|
||||
isPercent=optbool,
|
||||
},
|
||||
select={
|
||||
values=ismethodtable,
|
||||
style={
|
||||
["nil"]=true,
|
||||
["string"]={dropdown=true,radio=true},
|
||||
_="string: 'dropdown' or 'radio'"
|
||||
},
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
multiselect={
|
||||
values=ismethodtable,
|
||||
style=optstring,
|
||||
tristate=optbool,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
color={
|
||||
hasAlpha=optbool,
|
||||
},
|
||||
keybinding={
|
||||
-- TODO
|
||||
},
|
||||
}
|
||||
|
||||
local function validateKey(k,errlvl,...)
|
||||
errlvl=(errlvl or 0)+1
|
||||
if type(k)~="string" then
|
||||
err("["..tostring(k).."] - key is not a string", errlvl,...)
|
||||
end
|
||||
if strfind(k, "[%c\127]") then
|
||||
err("["..tostring(k).."] - key name contained control characters", errlvl,...)
|
||||
end
|
||||
end
|
||||
|
||||
local function validateVal(v, oktypes, errlvl,...)
|
||||
errlvl=(errlvl or 0)+1
|
||||
local isok=oktypes[type(v)] or oktypes["*"]
|
||||
|
||||
if not isok then
|
||||
err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl,...)
|
||||
end
|
||||
if type(isok)=="table" then -- isok was a table containing specific values to be tested for!
|
||||
if not isok[v] then
|
||||
err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl,...)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function validate(options,errlvl,...)
|
||||
errlvl=(errlvl or 0)+1
|
||||
-- basic consistency
|
||||
if type(options)~="table" then
|
||||
err(": expected a table, got a "..type(options), errlvl,...)
|
||||
end
|
||||
if type(options.type)~="string" then
|
||||
err(".type: expected a string, got a "..type(options.type), errlvl,...)
|
||||
end
|
||||
|
||||
-- get type and 'typedkeys' member
|
||||
local tk = typedkeys[options.type]
|
||||
if not tk then
|
||||
err(".type: unknown type '"..options.type.."'", errlvl,...)
|
||||
end
|
||||
|
||||
-- make sure that all options[] are known parameters
|
||||
for k,v in pairs(options) do
|
||||
if not (tk[k] or basekeys[k]) then
|
||||
err(": unknown parameter", errlvl,tostring(k),...)
|
||||
end
|
||||
end
|
||||
|
||||
-- verify that required params are there, and that everything is the right type
|
||||
for k,oktypes in pairs(basekeys) do
|
||||
validateVal(options[k], oktypes, errlvl,k,...)
|
||||
end
|
||||
for k,oktypes in pairs(tk) do
|
||||
validateVal(options[k], oktypes, errlvl,k,...)
|
||||
end
|
||||
|
||||
-- extra logic for groups
|
||||
if options.type=="group" then
|
||||
for k,v in pairs(options.args) do
|
||||
validateKey(k,errlvl,"args",...)
|
||||
validate(v, errlvl,k,"args",...)
|
||||
end
|
||||
if options.plugins then
|
||||
for plugname,plugin in pairs(options.plugins) do
|
||||
if type(plugin)~="table" then
|
||||
err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname),"plugins",...)
|
||||
end
|
||||
for k,v in pairs(plugin) do
|
||||
validateKey(k,errlvl,tostring(plugname),"plugins",...)
|
||||
validate(v, errlvl,k,tostring(plugname),"plugins",...)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Validates basic structure and integrity of an options table \\
|
||||
-- Does NOT verify that get/set etc actually exist, since they can be defined at any depth
|
||||
-- @param options The table to be validated
|
||||
-- @param name The name of the table to be validated (shown in any error message)
|
||||
-- @param errlvl (optional number) error level offset, default 0 (=errors point to the function calling :ValidateOptionsTable)
|
||||
function AceConfigRegistry:ValidateOptionsTable(options,name,errlvl)
|
||||
errlvl=(errlvl or 0)+1
|
||||
name = name or "Optionstable"
|
||||
if not options.name then
|
||||
options.name=name -- bit of a hack, the root level doesn't really need a .name :-/
|
||||
end
|
||||
validate(options,errlvl,name)
|
||||
end
|
||||
|
||||
--- Fires a "ConfigTableChange" callback for those listening in on it, allowing config GUIs to refresh.
|
||||
-- You should call this function if your options table changed from any outside event, like a game event
|
||||
-- or a timer.
|
||||
-- @param appName The application name as given to `:RegisterOptionsTable()`
|
||||
function AceConfigRegistry:NotifyChange(appName)
|
||||
if not AceConfigRegistry.tables[appName] then return end
|
||||
AceConfigRegistry.callbacks:Fire("ConfigTableChange", appName)
|
||||
end
|
||||
|
||||
-- -------------------------------------------------------------------
|
||||
-- Registering and retreiving options tables:
|
||||
|
||||
|
||||
-- validateGetterArgs: helper function for :GetOptionsTable (or, rather, the getter functions returned by it)
|
||||
|
||||
local function validateGetterArgs(uiType, uiName, errlvl)
|
||||
errlvl=(errlvl or 0)+2
|
||||
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)
|
||||
end
|
||||
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)
|
||||
end
|
||||
end
|
||||
|
||||
--- Register an options table with the config registry.
|
||||
-- @param appName The application name as given to `:RegisterOptionsTable()`
|
||||
-- @param options The options table, OR a function reference that generates it on demand. \\
|
||||
-- See the top of the page for info on arguments passed to such functions.
|
||||
function AceConfigRegistry:RegisterOptionsTable(appName, options)
|
||||
if type(options)=="table" then
|
||||
if options.type~="group" then -- quick sanity checker
|
||||
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - missing type='group' member in root group", 2)
|
||||
end
|
||||
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
|
||||
errlvl=(errlvl or 0)+1
|
||||
validateGetterArgs(uiType, uiName, errlvl)
|
||||
if not AceConfigRegistry.validated[uiType][appName] then
|
||||
AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable
|
||||
AceConfigRegistry.validated[uiType][appName] = true
|
||||
end
|
||||
return options
|
||||
end
|
||||
elseif type(options)=="function" then
|
||||
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
|
||||
errlvl=(errlvl or 0)+1
|
||||
validateGetterArgs(uiType, uiName, errlvl)
|
||||
local tab = assert(options(uiType, uiName, appName))
|
||||
if not AceConfigRegistry.validated[uiType][appName] then
|
||||
AceConfigRegistry:ValidateOptionsTable(tab, appName, errlvl) -- upgradable
|
||||
AceConfigRegistry.validated[uiType][appName] = true
|
||||
end
|
||||
return tab
|
||||
end
|
||||
else
|
||||
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - expected table or function reference", 2)
|
||||
end
|
||||
end
|
||||
|
||||
--- Returns an iterator of ["appName"]=funcref pairs
|
||||
function AceConfigRegistry:IterateOptionsTables()
|
||||
return pairs(AceConfigRegistry.tables)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
--- Query the registry for a specific options table.
|
||||
-- If only appName is given, a function is returned which you
|
||||
-- can call with (uiType,uiName) to get the table.\\
|
||||
-- If uiType&uiName are given, the table is returned.
|
||||
-- @param appName The application name as given to `:RegisterOptionsTable()`
|
||||
-- @param uiType The type of UI to get the table for, one of "cmd", "dropdown", "dialog"
|
||||
-- @param uiName The name of the library/addon querying for the table, e.g. "MyLib-1.0"
|
||||
function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
|
||||
local f = AceConfigRegistry.tables[appName]
|
||||
if not f then
|
||||
return nil
|
||||
end
|
||||
|
||||
if uiType then
|
||||
return f(uiType,uiName,1) -- get the table for us
|
||||
else
|
||||
return f -- return the function
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceConfigRegistry-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,420 @@
|
||||
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
|
||||
-- @class file
|
||||
-- @name AceDBOptions-3.0
|
||||
-- @release $Id: AceDBOptions-3.0.lua 938 2010-06-13 07:21:38Z nevcairiel $
|
||||
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 12
|
||||
local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
|
||||
|
||||
if not AceDBOptions then return end -- No upgrade needed
|
||||
|
||||
-- Lua APIs
|
||||
local pairs, next = pairs, next
|
||||
|
||||
-- WoW APIs
|
||||
local UnitClass = UnitClass
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: NORMAL_FONT_COLOR_CODE, FONT_COLOR_CODE_CLOSE
|
||||
|
||||
AceDBOptions.optionTables = AceDBOptions.optionTables or {}
|
||||
AceDBOptions.handlers = AceDBOptions.handlers or {}
|
||||
|
||||
--[[
|
||||
Localization of AceDBOptions-3.0
|
||||
]]
|
||||
|
||||
local L = {
|
||||
default = "Default",
|
||||
intro = "You can change the active database profile, so you can have different settings for every character.",
|
||||
reset_desc = "Reset the current profile back to its default values, in case your configuration is broken, or you simply want to start over.",
|
||||
reset = "Reset Profile",
|
||||
reset_sub = "Reset the current profile to the default",
|
||||
choose_desc = "You can either create a new profile by entering a name in the editbox, or choose one of the already existing profiles.",
|
||||
new = "New",
|
||||
new_sub = "Create a new empty profile.",
|
||||
choose = "Existing Profiles",
|
||||
choose_sub = "Select one of your currently available profiles.",
|
||||
copy_desc = "Copy the settings from one existing profile into the currently active profile.",
|
||||
copy = "Copy From",
|
||||
delete_desc = "Delete existing and unused profiles from the database to save space, and cleanup the SavedVariables file.",
|
||||
delete = "Delete a Profile",
|
||||
delete_sub = "Deletes a profile from the database.",
|
||||
delete_confirm = "Are you sure you want to delete the selected profile?",
|
||||
profiles = "Profiles",
|
||||
profiles_sub = "Manage Profiles",
|
||||
current = "Current Profile:",
|
||||
}
|
||||
|
||||
local LOCALE = GetLocale()
|
||||
if LOCALE == "deDE" then
|
||||
L["default"] = "Standard"
|
||||
L["intro"] = "Hier kannst du das aktive Datenbankprofile \195\164ndern, damit du verschiedene Einstellungen f\195\188r jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration m\195\182glich wird."
|
||||
L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zur\195\188ck, f\195\188r den Fall das mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
|
||||
L["reset"] = "Profil zur\195\188cksetzen"
|
||||
L["reset_sub"] = "Das aktuelle Profil auf Standard zur\195\188cksetzen."
|
||||
L["choose_desc"] = "Du kannst ein neues Profil erstellen, indem du einen neuen Namen in der Eingabebox 'Neu' eingibst, oder w\195\164hle eines der vorhandenen Profile aus."
|
||||
L["new"] = "Neu"
|
||||
L["new_sub"] = "Ein neues Profil erstellen."
|
||||
L["choose"] = "Vorhandene Profile"
|
||||
L["choose_sub"] = "W\195\164hlt ein bereits vorhandenes Profil aus."
|
||||
L["copy_desc"] = "Kopiere die Einstellungen von einem vorhandenen Profil in das aktive Profil."
|
||||
L["copy"] = "Kopieren von..."
|
||||
L["delete_desc"] = "L\195\182sche vorhandene oder unbenutzte Profile aus der Datenbank um Platz zu sparen und um die SavedVariables Datei 'sauber' zu halten."
|
||||
L["delete"] = "Profil l\195\182schen"
|
||||
L["delete_sub"] = "L\195\182scht ein Profil aus der Datenbank."
|
||||
L["delete_confirm"] = "Willst du das ausgew\195\164hlte Profil wirklich l\195\182schen?"
|
||||
L["profiles"] = "Profile"
|
||||
L["profiles_sub"] = "Profile verwalten"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "frFR" then
|
||||
L["default"] = "D\195\169faut"
|
||||
L["intro"] = "Vous pouvez changer le profil actuel afin d'avoir des param\195\168tres diff\195\169rents pour chaque personnage, permettant ainsi d'avoir une configuration tr\195\168s flexible."
|
||||
L["reset_desc"] = "R\195\169initialise le profil actuel au cas o\195\185 votre configuration est corrompue ou si vous voulez tout simplement faire table rase."
|
||||
L["reset"] = "R\195\169initialiser le profil"
|
||||
L["reset_sub"] = "R\195\169initialise le profil actuel avec les param\195\168tres par d\195\169faut."
|
||||
L["choose_desc"] = "Vous pouvez cr\195\169er un nouveau profil en entrant un nouveau nom dans la bo\195\174te de saisie, ou en choississant un des profils d\195\169j\195\160 existants."
|
||||
L["new"] = "Nouveau"
|
||||
L["new_sub"] = "Cr\195\169\195\169e un nouveau profil vierge."
|
||||
L["choose"] = "Profils existants"
|
||||
L["choose_sub"] = "Permet de choisir un des profils d\195\169j\195\160 disponibles."
|
||||
L["copy_desc"] = "Copie les param\195\168tres d'un profil d\195\169j\195\160 existant dans le profil actuellement actif."
|
||||
L["copy"] = "Copier \195\160 partir de"
|
||||
L["delete_desc"] = "Supprime les profils existants inutilis\195\169s de la base de donn\195\169es afin de gagner de la place et de nettoyer le fichier SavedVariables."
|
||||
L["delete"] = "Supprimer un profil"
|
||||
L["delete_sub"] = "Supprime un profil de la base de donn\195\169es."
|
||||
L["delete_confirm"] = "Etes-vous s\195\187r de vouloir supprimer le profil s\195\169lectionn\195\169 ?"
|
||||
L["profiles"] = "Profils"
|
||||
L["profiles_sub"] = "Gestion des profils"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "koKR" then
|
||||
L["default"] = "기본값"
|
||||
L["intro"] = "모든 캐릭터의 다양한 설정과 사용중인 데이터베이스 프로필, 어느것이던지 매우 다루기 쉽게 바꿀수 있습니다."
|
||||
L["reset_desc"] = "단순히 다시 새롭게 구성을 원하는 경우, 현재 프로필을 기본값으로 초기화 합니다."
|
||||
L["reset"] = "프로필 초기화"
|
||||
L["reset_sub"] = "현재의 프로필을 기본값으로 초기화 합니다"
|
||||
L["choose_desc"] = "새로운 이름을 입력하거나, 이미 있는 프로필중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
|
||||
L["new"] = "새로운 프로필"
|
||||
L["new_sub"] = "새로운 프로필을 만듭니다."
|
||||
L["choose"] = "프로필 선택"
|
||||
L["choose_sub"] = "당신이 현재 이용할수 있는 프로필을 선택합니다."
|
||||
L["copy_desc"] = "현재 사용중인 프로필에, 선택한 프로필의 설정을 복사합니다."
|
||||
L["copy"] = "복사"
|
||||
L["delete_desc"] = "데이터베이스에 사용중이거나 저장된 프로파일 삭제로 SavedVariables 파일의 정리와 공간 절약이 됩니다."
|
||||
L["delete"] = "프로필 삭제"
|
||||
L["delete_sub"] = "데이터베이스의 프로필을 삭제합니다."
|
||||
L["delete_confirm"] = "정말로 선택한 프로필의 삭제를 원하십니까?"
|
||||
L["profiles"] = "프로필"
|
||||
L["profiles_sub"] = "프로필 설정"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "esES" or LOCALE == "esMX" then
|
||||
L["default"] = "Por defecto"
|
||||
L["intro"] = "Puedes cambiar el perfil activo de tal manera que cada personaje tenga diferentes configuraciones."
|
||||
L["reset_desc"] = "Reinicia el perfil actual a los valores por defectos, en caso de que se haya estropeado la configuración o quieras volver a empezar de nuevo."
|
||||
L["reset"] = "Reiniciar Perfil"
|
||||
L["reset_sub"] = "Reinicar el perfil actual al de por defecto"
|
||||
L["choose_desc"] = "Puedes crear un nuevo perfil introduciendo un nombre en el recuadro o puedes seleccionar un perfil de los ya existentes."
|
||||
L["new"] = "Nuevo"
|
||||
L["new_sub"] = "Crear un nuevo perfil vacio."
|
||||
L["choose"] = "Perfiles existentes"
|
||||
L["choose_sub"] = "Selecciona uno de los perfiles disponibles."
|
||||
L["copy_desc"] = "Copia los ajustes de un perfil existente al perfil actual."
|
||||
L["copy"] = "Copiar de"
|
||||
L["delete_desc"] = "Borra los perfiles existentes y sin uso de la base de datos para ganar espacio y limpiar el archivo SavedVariables."
|
||||
L["delete"] = "Borrar un Perfil"
|
||||
L["delete_sub"] = "Borra un perfil de la base de datos."
|
||||
L["delete_confirm"] = "¿Estas seguro que quieres borrar el perfil seleccionado?"
|
||||
L["profiles"] = "Perfiles"
|
||||
L["profiles_sub"] = "Manejar Perfiles"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "zhTW" then
|
||||
L["default"] = "預設"
|
||||
L["intro"] = "你可以選擇一個活動的資料設定檔,這樣你的每個角色就可以擁有不同的設定值,可以給你的插件設定帶來極大的靈活性。"
|
||||
L["reset_desc"] = "將當前的設定檔恢復到它的預設值,用於你的設定檔損壞,或者你只是想重來的情況。"
|
||||
L["reset"] = "重置設定檔"
|
||||
L["reset_sub"] = "將當前的設定檔恢復為預設值"
|
||||
L["choose_desc"] = "你可以通過在文本框內輸入一個名字創立一個新的設定檔,也可以選擇一個已經存在的設定檔。"
|
||||
L["new"] = "新建"
|
||||
L["new_sub"] = "新建一個空的設定檔。"
|
||||
L["choose"] = "現有的設定檔"
|
||||
L["choose_sub"] = "從當前可用的設定檔裏面選擇一個。"
|
||||
L["copy_desc"] = "從當前某個已保存的設定檔複製到當前正使用的設定檔。"
|
||||
L["copy"] = "複製自"
|
||||
L["delete_desc"] = "從資料庫裏刪除不再使用的設定檔,以節省空間,並且清理SavedVariables檔。"
|
||||
L["delete"] = "刪除一個設定檔"
|
||||
L["delete_sub"] = "從資料庫裏刪除一個設定檔。"
|
||||
L["delete_confirm"] = "你確定要刪除所選擇的設定檔嗎?"
|
||||
L["profiles"] = "設定檔"
|
||||
L["profiles_sub"] = "管理設定檔"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "zhCN" then
|
||||
L["default"] = "默认"
|
||||
L["intro"] = "你可以选择一个活动的数据配置文件,这样你的每个角色就可以拥有不同的设置值,可以给你的插件配置带来极大的灵活性。"
|
||||
L["reset_desc"] = "将当前的配置文件恢复到它的默认值,用于你的配置文件损坏,或者你只是想重来的情况。"
|
||||
L["reset"] = "重置配置文件"
|
||||
L["reset_sub"] = "将当前的配置文件恢复为默认值"
|
||||
L["choose_desc"] = "你可以通过在文本框内输入一个名字创立一个新的配置文件,也可以选择一个已经存在的配置文件。"
|
||||
L["new"] = "新建"
|
||||
L["new_sub"] = "新建一个空的配置文件。"
|
||||
L["choose"] = "现有的配置文件"
|
||||
L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
|
||||
L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
|
||||
L["copy"] = "复制自"
|
||||
L["delete_desc"] = "从数据库里删除不再使用的配置文件,以节省空间,并且清理SavedVariables文件。"
|
||||
L["delete"] = "删除一个配置文件"
|
||||
L["delete_sub"] = "从数据库里删除一个配置文件。"
|
||||
L["delete_confirm"] = "你确定要删除所选择的配置文件么?"
|
||||
L["profiles"] = "配置文件"
|
||||
L["profiles_sub"] = "管理配置文件"
|
||||
--L["current"] = "Current Profile:"
|
||||
elseif LOCALE == "ruRU" then
|
||||
L["default"] = "По умолчанию"
|
||||
L["intro"] = "Изменяя активный профиль, вы можете задать различные настройки модификаций для каждого персонажа."
|
||||
L["reset_desc"] = "Если ваша конфигурации испорчена или если вы хотите настроить всё заново - сбросьте текущий профиль на стандартные значения."
|
||||
L["reset"] = "Сброс профиля"
|
||||
L["reset_sub"] = "Сброс текущего профиля на стандартный"
|
||||
L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей."
|
||||
L["new"] = "Новый"
|
||||
L["new_sub"] = "Создать новый чистый профиль"
|
||||
L["choose"] = "Существующие профили"
|
||||
L["choose_sub"] = "Выбор одиного из уже доступных профилей"
|
||||
L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный."
|
||||
L["copy"] = "Скопировать из"
|
||||
L["delete_desc"] = "Удалить существующий и неиспользуемый профиль из БД для сохранения места, и очистить SavedVariables файл."
|
||||
L["delete"] = "Удалить профиль"
|
||||
L["delete_sub"] = "Удаление профиля из БД"
|
||||
L["delete_confirm"] = "Вы уверены, что вы хотите удалить выбранный профиль?"
|
||||
L["profiles"] = "Профили"
|
||||
L["profiles_sub"] = "Управление профилями"
|
||||
--L["current"] = "Current Profile:"
|
||||
end
|
||||
|
||||
local defaultProfiles
|
||||
local tmpprofiles = {}
|
||||
|
||||
-- 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.
|
||||
-- @param db The db object to retrieve the profiles from
|
||||
-- @param common If true, getProfileList will add the default profiles to the return list, even if they have not been created yet
|
||||
-- @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.
|
||||
local function getProfileList(db, common, nocurrent)
|
||||
local profiles = {}
|
||||
|
||||
-- copy existing profiles into the table
|
||||
local currentProfile = db:GetCurrentProfile()
|
||||
for i,v in pairs(db:GetProfiles(tmpprofiles)) do
|
||||
if not (nocurrent and v == currentProfile) then
|
||||
profiles[v] = v
|
||||
end
|
||||
end
|
||||
|
||||
-- add our default profiles to choose from ( or rename existing profiles)
|
||||
for k,v in pairs(defaultProfiles) do
|
||||
if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
|
||||
profiles[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
return profiles
|
||||
end
|
||||
|
||||
--[[
|
||||
OptionsHandlerPrototype
|
||||
prototype class for handling the options in a sane way
|
||||
]]
|
||||
local OptionsHandlerPrototype = {}
|
||||
|
||||
--[[ Reset the profile ]]
|
||||
function OptionsHandlerPrototype:Reset()
|
||||
self.db:ResetProfile()
|
||||
end
|
||||
|
||||
--[[ Set the profile to value ]]
|
||||
function OptionsHandlerPrototype:SetProfile(info, value)
|
||||
self.db:SetProfile(value)
|
||||
end
|
||||
|
||||
--[[ returns the currently active profile ]]
|
||||
function OptionsHandlerPrototype:GetCurrentProfile()
|
||||
return self.db:GetCurrentProfile()
|
||||
end
|
||||
|
||||
--[[
|
||||
List all active profiles
|
||||
you can control the output with the .arg variable
|
||||
currently four modes are supported
|
||||
|
||||
(empty) - return all available profiles
|
||||
"nocurrent" - returns all available profiles except the currently active profile
|
||||
"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
|
||||
"both" - common except the active profile
|
||||
]]
|
||||
function OptionsHandlerPrototype:ListProfiles(info)
|
||||
local arg = info.arg
|
||||
local profiles
|
||||
if arg == "common" and not self.noDefaultProfiles then
|
||||
profiles = getProfileList(self.db, true, nil)
|
||||
elseif arg == "nocurrent" then
|
||||
profiles = getProfileList(self.db, nil, true)
|
||||
elseif arg == "both" then -- currently not used
|
||||
profiles = getProfileList(self.db, (not self.noDefaultProfiles) and true, true)
|
||||
else
|
||||
profiles = getProfileList(self.db)
|
||||
end
|
||||
|
||||
return profiles
|
||||
end
|
||||
|
||||
function OptionsHandlerPrototype:HasNoProfiles(info)
|
||||
local profiles = self:ListProfiles(info)
|
||||
return ((not next(profiles)) and true or false)
|
||||
end
|
||||
|
||||
--[[ Copy a profile ]]
|
||||
function OptionsHandlerPrototype:CopyProfile(info, value)
|
||||
self.db:CopyProfile(value)
|
||||
end
|
||||
|
||||
--[[ Delete a profile from the db ]]
|
||||
function OptionsHandlerPrototype:DeleteProfile(info, value)
|
||||
self.db:DeleteProfile(value)
|
||||
end
|
||||
|
||||
--[[ fill defaultProfiles with some generic values ]]
|
||||
local function generateDefaultProfiles(db)
|
||||
defaultProfiles = {
|
||||
["Default"] = L["default"],
|
||||
[db.keys.char] = db.keys.char,
|
||||
[db.keys.realm] = db.keys.realm,
|
||||
[db.keys.class] = UnitClass("player")
|
||||
}
|
||||
end
|
||||
|
||||
--[[ create and return a handler object for the db, or upgrade it if it already existed ]]
|
||||
local function getOptionsHandler(db, noDefaultProfiles)
|
||||
if not defaultProfiles then
|
||||
generateDefaultProfiles(db)
|
||||
end
|
||||
|
||||
local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
|
||||
|
||||
for k,v in pairs(OptionsHandlerPrototype) do
|
||||
handler[k] = v
|
||||
end
|
||||
|
||||
AceDBOptions.handlers[db] = handler
|
||||
return handler
|
||||
end
|
||||
|
||||
--[[
|
||||
the real options table
|
||||
]]
|
||||
local optionsTable = {
|
||||
desc = {
|
||||
order = 1,
|
||||
type = "description",
|
||||
name = L["intro"] .. "\n",
|
||||
},
|
||||
descreset = {
|
||||
order = 9,
|
||||
type = "description",
|
||||
name = L["reset_desc"],
|
||||
},
|
||||
reset = {
|
||||
order = 10,
|
||||
type = "execute",
|
||||
name = L["reset"],
|
||||
desc = L["reset_sub"],
|
||||
func = "Reset",
|
||||
},
|
||||
current = {
|
||||
order = 11,
|
||||
type = "description",
|
||||
name = function(info) return L["current"] .. " " .. NORMAL_FONT_COLOR_CODE .. info.handler:GetCurrentProfile() .. FONT_COLOR_CODE_CLOSE end,
|
||||
width = "default",
|
||||
},
|
||||
choosedesc = {
|
||||
order = 20,
|
||||
type = "description",
|
||||
name = "\n" .. L["choose_desc"],
|
||||
},
|
||||
new = {
|
||||
name = L["new"],
|
||||
desc = L["new_sub"],
|
||||
type = "input",
|
||||
order = 30,
|
||||
get = false,
|
||||
set = "SetProfile",
|
||||
},
|
||||
choose = {
|
||||
name = L["choose"],
|
||||
desc = L["choose_sub"],
|
||||
type = "select",
|
||||
order = 40,
|
||||
get = "GetCurrentProfile",
|
||||
set = "SetProfile",
|
||||
values = "ListProfiles",
|
||||
arg = "common",
|
||||
},
|
||||
copydesc = {
|
||||
order = 50,
|
||||
type = "description",
|
||||
name = "\n" .. L["copy_desc"],
|
||||
},
|
||||
copyfrom = {
|
||||
order = 60,
|
||||
type = "select",
|
||||
name = L["copy"],
|
||||
desc = L["copy_desc"],
|
||||
get = false,
|
||||
set = "CopyProfile",
|
||||
values = "ListProfiles",
|
||||
disabled = "HasNoProfiles",
|
||||
arg = "nocurrent",
|
||||
},
|
||||
deldesc = {
|
||||
order = 70,
|
||||
type = "description",
|
||||
name = "\n" .. L["delete_desc"],
|
||||
},
|
||||
delete = {
|
||||
order = 80,
|
||||
type = "select",
|
||||
name = L["delete"],
|
||||
desc = L["delete_sub"],
|
||||
get = false,
|
||||
set = "DeleteProfile",
|
||||
values = "ListProfiles",
|
||||
disabled = "HasNoProfiles",
|
||||
arg = "nocurrent",
|
||||
confirm = true,
|
||||
confirmText = L["delete_confirm"],
|
||||
},
|
||||
}
|
||||
|
||||
--- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0.
|
||||
-- @param db The database object to create the options table for.
|
||||
-- @return The options table to be used in AceConfig-3.0
|
||||
-- @usage
|
||||
-- -- Assuming `options` is your top-level options table and `self.db` is your database:
|
||||
-- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
|
||||
function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
|
||||
local tbl = AceDBOptions.optionTables[db] or {
|
||||
type = "group",
|
||||
name = L["profiles"],
|
||||
desc = L["profiles_sub"],
|
||||
}
|
||||
|
||||
tbl.handler = getOptionsHandler(db, noDefaultProfiles)
|
||||
tbl.args = optionsTable
|
||||
|
||||
AceDBOptions.optionTables[db] = tbl
|
||||
return tbl
|
||||
end
|
||||
|
||||
-- upgrade existing tables
|
||||
for db,tbl in pairs(AceDBOptions.optionTables) do
|
||||
tbl.handler = getOptionsHandler(db)
|
||||
tbl.args = optionsTable
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceDBOptions-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,14 @@
|
||||
## Interface: 30300
|
||||
## X-Curse-Packaged-Version: 3.3.1
|
||||
## X-Curse-Project-Name: AceGUI-3.0-SharedMediaWidgets
|
||||
## X-Curse-Project-ID: ace-gui-3-0-shared-media-widgets
|
||||
## X-Curse-Repository-ID: wow/ace-gui-3-0-shared-media-widgets/mainline
|
||||
|
||||
## Title: Lib: AceGUI-3.0-SharedMediaWidgets
|
||||
## Notes: Enables AceGUI-3.0 widgets for the 5 basic SharedMedia-3.0 types
|
||||
## Version: 3.3.1
|
||||
## Author: Yssaril
|
||||
## OptionalDeps: Ace3, LibSharedMedia-3.0
|
||||
## X-Category: Library
|
||||
|
||||
widget.xml
|
||||
@@ -0,0 +1,162 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
do
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local fixlevels = AceGUISharedMediaWidgets.fixlevels
|
||||
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Background_Item_Select"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
|
||||
if self.useHighlight then
|
||||
self.highlight:Show()
|
||||
self.texture:Show()
|
||||
end
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
self.texture:Hide()
|
||||
self.highlight:Hide()
|
||||
self:Fire("OnLeave")
|
||||
|
||||
if self.specialOnLeave then
|
||||
self.specialOnLeave(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
self.texture:SetTexture(Media:Fetch('background',text))
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown-Item-Toggle")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
local textureframe = CreateFrame('Frame')
|
||||
textureframe:SetFrameStrata("TOOLTIP")
|
||||
textureframe:SetWidth(128)
|
||||
textureframe:SetHeight(128)
|
||||
textureframe:SetPoint("LEFT",self.frame,"RIGHT",5,0)
|
||||
self.textureframe = textureframe
|
||||
local texture = textureframe:CreateTexture(nil, "OVERLAY")
|
||||
texture:SetTexture(0,0,0,0)
|
||||
texture:SetAllPoints(textureframe)
|
||||
texture:Hide()
|
||||
self.texture = texture
|
||||
self.frame:SetScript("OnEnter", Frame_OnEnter)
|
||||
self.frame:SetScript("OnLeave", Frame_OnLeave)
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Background"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
local text = self.text:GetText()
|
||||
if text ~= nil and text ~= '' then
|
||||
self.textureframe:Show()
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
self.textureframe:Hide()
|
||||
end
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
self.texture:SetTexture(Media:Fetch('background',text))
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("LSM30_Background_Item_Select")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function SetList(self, list)
|
||||
self.list = list or Media:HashTable("background")
|
||||
self.pullout:Clear()
|
||||
|
||||
if self.multiselect then
|
||||
AddCloseButton()
|
||||
end
|
||||
end
|
||||
|
||||
local sortlist = {}
|
||||
local function ParseListItems(self)
|
||||
for v in pairs(self.list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
table.sort(sortlist)
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, value)
|
||||
sortlist[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
self.SetList = SetList
|
||||
self.SetValue = AceGUISharedMediaWidgets.SetValue
|
||||
|
||||
local left = _G[self.dropdown:GetName() .. "Left"]
|
||||
local middle = _G[self.dropdown:GetName() .. "Middle"]
|
||||
local right = _G[self.dropdown:GetName() .. "Right"]
|
||||
|
||||
local textureframe = CreateFrame('Frame')
|
||||
textureframe:SetFrameStrata("TOOLTIP")
|
||||
textureframe:SetWidth(128)
|
||||
textureframe:SetHeight(128)
|
||||
textureframe:SetPoint("LEFT",right,"RIGHT",-15,0)
|
||||
self.textureframe = textureframe
|
||||
local texture = textureframe:CreateTexture(nil, "OVERLAY")
|
||||
texture:SetTexture(0,0,0,0)
|
||||
texture:SetAllPoints(textureframe)
|
||||
textureframe:Hide()
|
||||
self.texture = texture
|
||||
|
||||
self.dropdown:EnableMouse(true)
|
||||
self.dropdown:SetScript("OnEnter", Frame_OnEnter)
|
||||
self.dropdown:SetScript("OnLeave", Frame_OnLeave)
|
||||
|
||||
local clickscript = self.button:GetScript("OnClick")
|
||||
self.button:SetScript("OnClick", function(...)
|
||||
self.pullout:Clear()
|
||||
ParseListItems(self)
|
||||
clickscript(...)
|
||||
end)
|
||||
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,163 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
do
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local fixlevels = AceGUISharedMediaWidgets.fixlevels
|
||||
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Border_Item_Select"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
|
||||
if self.useHighlight then
|
||||
self.highlight:Show()
|
||||
self.border:Show()
|
||||
end
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
self.border:Hide()
|
||||
self.highlight:Hide()
|
||||
self:Fire("OnLeave")
|
||||
|
||||
if self.specialOnLeave then
|
||||
self.specialOnLeave(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
local backdropTable = self.border:GetBackdrop()
|
||||
backdropTable.edgeFile = Media:Fetch('border',text)
|
||||
self.border:SetBackdrop(backdropTable)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown-Item-Toggle")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
local border = CreateFrame('Frame')
|
||||
border:SetFrameStrata("TOOLTIP")
|
||||
border:SetWidth(64)
|
||||
border:SetHeight(32)
|
||||
border:SetPoint("LEFT",self.frame,"RIGHT",5,0)
|
||||
border:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 4, right = 4, top = 4, bottom = 4 }})
|
||||
self.border = border
|
||||
border:Hide()
|
||||
self.frame:SetScript("OnEnter", Frame_OnEnter)
|
||||
self.frame:SetScript("OnLeave", Frame_OnLeave)
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Border"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
local text = self.text:GetText()
|
||||
if text ~= nil and text ~= '' then
|
||||
self.borderframe:Show()
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
self.borderframe:Hide()
|
||||
end
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("LSM30_Border_Item_Select")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function SetList(self, list)
|
||||
self.list = list or Media:HashTable("border")
|
||||
self.pullout:Clear()
|
||||
if self.multiselect then
|
||||
AddCloseButton()
|
||||
end
|
||||
end
|
||||
|
||||
local sortlist = {}
|
||||
local function ParseListItems(self)
|
||||
for v in pairs(self.list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
table.sort(sortlist)
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, value)
|
||||
sortlist[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
local backdropTable = self.borderframe:GetBackdrop()
|
||||
backdropTable.edgeFile = Media:Fetch('border',text)
|
||||
self.borderframe:SetBackdrop(backdropTable)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown")
|
||||
self.type = widgetType
|
||||
self.SetList = SetList
|
||||
self.SetText = SetText
|
||||
self.SetValue = AceGUISharedMediaWidgets.SetValue
|
||||
|
||||
local left = _G[self.dropdown:GetName() .. "Left"]
|
||||
local middle = _G[self.dropdown:GetName() .. "Middle"]
|
||||
local right = _G[self.dropdown:GetName() .. "Right"]
|
||||
|
||||
local borderframe = CreateFrame('Frame')
|
||||
borderframe:SetFrameStrata("TOOLTIP")
|
||||
borderframe:SetWidth(64)
|
||||
borderframe:SetHeight(32)
|
||||
borderframe:SetPoint("LEFT",right,"RIGHT",-15,0)
|
||||
borderframe:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 4, right = 4, top = 4, bottom = 4 }})
|
||||
self.borderframe = borderframe
|
||||
borderframe:Hide()
|
||||
|
||||
self.dropdown:EnableMouse(true)
|
||||
self.dropdown:SetScript("OnEnter", Frame_OnEnter)
|
||||
self.dropdown:SetScript("OnLeave", Frame_OnLeave)
|
||||
|
||||
local clickscript = self.button:GetScript("OnClick")
|
||||
self.button:SetScript("OnClick", function(...)
|
||||
self.pullout:Clear()
|
||||
ParseListItems(self)
|
||||
clickscript(...)
|
||||
end)
|
||||
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,94 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
do
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local fixlevels = AceGUISharedMediaWidgets.fixlevels
|
||||
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Font_Item_Select"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
local _, size, outline= self.text:GetFont()
|
||||
self.text:SetFont(Media:Fetch('font',text),size,outline)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown-Item-Toggle")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Font"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
local _, size, outline= self.text:GetFont()
|
||||
self.text:SetFont(Media:Fetch('font',text),size,outline)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("LSM30_Font_Item_Select")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function SetList(self, list)
|
||||
self.list = list or Media:HashTable("font")
|
||||
self.pullout:Clear()
|
||||
if self.multiselect then
|
||||
AddCloseButton()
|
||||
end
|
||||
end
|
||||
|
||||
local sortlist = {}
|
||||
local function ParseListItems(self)
|
||||
for v in pairs(self.list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
table.sort(sortlist)
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, value)
|
||||
sortlist[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
self.SetValue = AceGUISharedMediaWidgets.SetValue
|
||||
self.SetList = SetList
|
||||
|
||||
local clickscript = self.button:GetScript("OnClick")
|
||||
self.button:SetScript("OnClick", function(...)
|
||||
self.pullout:Clear()
|
||||
ParseListItems(self)
|
||||
clickscript(...)
|
||||
end)
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,55 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
LoadAddOn("LibSharedMedia-3.0")
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
AceGUISharedMediaWidgets = {}
|
||||
do
|
||||
AceGUIWidgetLSMlists = {
|
||||
['font'] = Media:HashTable("font"),
|
||||
['sound'] = Media:HashTable("sound"),
|
||||
['statusbar'] = Media:HashTable("statusbar"),
|
||||
['border'] = Media:HashTable("border"),
|
||||
['background'] = Media:HashTable("background"),
|
||||
}
|
||||
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
|
||||
local function fixlevels(parent,...)
|
||||
local i = 1
|
||||
local child = select(i, ...)
|
||||
while child do
|
||||
child:SetFrameLevel(parent:GetFrameLevel()+1)
|
||||
fixlevels(child, child:GetChildren())
|
||||
i = i + 1
|
||||
child = select(i, ...)
|
||||
end
|
||||
end
|
||||
|
||||
local function OnItemValueChanged(this, event, checked)
|
||||
local self = this.userdata.obj
|
||||
if self.multiselect then
|
||||
self:Fire("OnValueChanged", this.userdata.value, checked)
|
||||
else
|
||||
if checked then
|
||||
self:SetValue(this.userdata.value)
|
||||
self:Fire("OnValueChanged", this.userdata.value)
|
||||
else
|
||||
this:SetValue(true)
|
||||
end
|
||||
self.pullout:Close()
|
||||
end
|
||||
end
|
||||
|
||||
local function SetValue(self, value)
|
||||
if value then
|
||||
self:SetText(value or "")
|
||||
end
|
||||
self.value = value
|
||||
end
|
||||
|
||||
AceGUISharedMediaWidgets.fixlevels = fixlevels
|
||||
AceGUISharedMediaWidgets.OnItemValueChanged = OnItemValueChanged
|
||||
AceGUISharedMediaWidgets.SetValue = SetValue
|
||||
end
|
||||
@@ -0,0 +1,274 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
do
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local fixlevels = AceGUISharedMediaWidgets.fixlevels
|
||||
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Sound_Item_Select"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
|
||||
if self.useHighlight then
|
||||
self.highlight:Show()
|
||||
end
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
|
||||
self.highlight:Hide()
|
||||
self:Fire("OnLeave")
|
||||
|
||||
if self.specialOnLeave then
|
||||
self.specialOnLeave(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function OnAcquire(self)
|
||||
self.frame:SetToplevel(true)
|
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.pullout = nil
|
||||
self.frame:SetParent(nil)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
local function SetPullout(self, pullout)
|
||||
self.pullout = pullout
|
||||
|
||||
self.frame:SetParent(nil)
|
||||
self.frame:SetParent(pullout.itemFrame)
|
||||
self.parent = pullout.itemFrame
|
||||
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
|
||||
end
|
||||
|
||||
local function SetText(self, text)
|
||||
self.sound = text or ''
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function GetText(self)
|
||||
return self.text:GetText()
|
||||
end
|
||||
|
||||
local function SetPoint(self, ...)
|
||||
self.frame:SetPoint(...)
|
||||
end
|
||||
|
||||
local function Show(self)
|
||||
self.frame:Show()
|
||||
end
|
||||
|
||||
local function Hide(self)
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
local function SetDisabled(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.useHighlight = false
|
||||
self.text:SetTextColor(.5, .5, .5)
|
||||
else
|
||||
self.useHighlight = true
|
||||
self.text:SetTextColor(1, 1, 1)
|
||||
end
|
||||
end
|
||||
|
||||
local function SetOnLeave(self, func)
|
||||
self.specialOnLeave = func
|
||||
end
|
||||
|
||||
local function SetOnEnter(self, func)
|
||||
self.specialOnEnter = func
|
||||
end
|
||||
|
||||
local function UpdateToggle(self)
|
||||
if self.value then
|
||||
self.check:Show()
|
||||
else
|
||||
self.check:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
local function Frame_OnClick(this, button)
|
||||
local self = this.obj
|
||||
self.value = not self.value
|
||||
UpdateToggle(self)
|
||||
self:Fire("OnValueChanged", self.value)
|
||||
end
|
||||
|
||||
local function Speaker_OnClick(this, button)
|
||||
local self = this.obj
|
||||
PlaySoundFile(Media:Fetch('sound',self.sound))
|
||||
end
|
||||
|
||||
local function SetValue(self, value)
|
||||
self.value = value
|
||||
UpdateToggle(self)
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local count = AceGUI:GetNextWidgetNum(type)
|
||||
local frame = CreateFrame("Frame", "LSM30_Sound_DropDownItem"..count)
|
||||
local self = {}
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
self.type = type
|
||||
|
||||
self.useHighlight = true
|
||||
|
||||
frame:SetHeight(17)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
local button = CreateFrame("Button", nil, frame)
|
||||
button:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-22,0)
|
||||
button:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||
self.button = button
|
||||
button.obj = self
|
||||
|
||||
local speakerbutton = CreateFrame("Button", nil, frame)
|
||||
speakerbutton:SetWidth(16)
|
||||
speakerbutton:SetHeight(16)
|
||||
speakerbutton:SetPoint("RIGHT",frame,"RIGHT",-6,0)
|
||||
self.speakerbutton = speakerbutton
|
||||
speakerbutton.obj = self
|
||||
|
||||
local speaker = frame:CreateTexture(nil, "BACKGROUND")
|
||||
speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker")
|
||||
speaker:SetAllPoints(speakerbutton)
|
||||
self.speaker = speaker
|
||||
|
||||
local speakeron = speakerbutton:CreateTexture(nil, "HIGHLIGHT")
|
||||
speakeron:SetTexture("Interface\\Common\\VoiceChat-On")
|
||||
speakeron:SetAllPoints(speakerbutton)
|
||||
self.speakeron = speakeron
|
||||
|
||||
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
||||
text:SetTextColor(1,1,1)
|
||||
text:SetJustifyH("LEFT")
|
||||
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
|
||||
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-24,0)
|
||||
self.text = text
|
||||
|
||||
local highlight = button:CreateTexture(nil, "OVERLAY")
|
||||
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||
highlight:SetBlendMode("ADD")
|
||||
highlight:SetHeight(14)
|
||||
highlight:ClearAllPoints()
|
||||
highlight:SetPoint("RIGHT",frame,"RIGHT",-19,0)
|
||||
highlight:SetPoint("LEFT",frame,"LEFT",5,0)
|
||||
highlight:Hide()
|
||||
self.highlight = highlight
|
||||
|
||||
local check = frame:CreateTexture("OVERLAY")
|
||||
check:SetWidth(16)
|
||||
check:SetHeight(16)
|
||||
check:SetPoint("LEFT",frame,"LEFT",3,-1)
|
||||
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||
check:Hide()
|
||||
self.check = check
|
||||
|
||||
local sub = frame:CreateTexture("OVERLAY")
|
||||
sub:SetWidth(16)
|
||||
sub:SetHeight(16)
|
||||
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
|
||||
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
|
||||
sub:Hide()
|
||||
self.sub = sub
|
||||
|
||||
button:SetScript("OnEnter", Frame_OnEnter)
|
||||
button:SetScript("OnLeave", Frame_OnLeave)
|
||||
|
||||
self.OnAcquire = OnAcquire
|
||||
self.OnRelease = OnRelease
|
||||
|
||||
self.SetPullout = SetPullout
|
||||
self.GetText = GetText
|
||||
self.SetText = SetText
|
||||
self.SetDisabled = SetDisabled
|
||||
|
||||
self.SetPoint = SetPoint
|
||||
self.Show = Show
|
||||
self.Hide = Hide
|
||||
|
||||
self.SetOnLeave = SetOnLeave
|
||||
self.SetOnEnter = SetOnEnter
|
||||
|
||||
self.button:SetScript("OnClick", Frame_OnClick)
|
||||
self.speakerbutton:SetScript("OnClick", Speaker_OnClick)
|
||||
|
||||
self.SetValue = SetValue
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Sound"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("LSM30_Sound_Item_Select")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function SetList(self, list)
|
||||
self.list = list or Media:HashTable("sound")
|
||||
self.pullout:Clear()
|
||||
if self.multiselect then
|
||||
AddCloseButton()
|
||||
end
|
||||
end
|
||||
|
||||
local sortlist = {}
|
||||
local function ParseListItems(self)
|
||||
for v in pairs(self.list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
table.sort(sortlist)
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, value)
|
||||
sortlist[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown")
|
||||
self.type = widgetType
|
||||
self.SetList = SetList
|
||||
self.SetValue = AceGUISharedMediaWidgets.SetValue
|
||||
|
||||
local clickscript = self.button:GetScript("OnClick")
|
||||
self.button:SetScript("OnClick", function(...)
|
||||
self.pullout:Clear()
|
||||
ParseListItems(self)
|
||||
clickscript(...)
|
||||
end)
|
||||
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,106 @@
|
||||
-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
|
||||
-- Widget created by Yssaril
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local Media = LibStub("LibSharedMedia-3.0")
|
||||
|
||||
do
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local fixlevels = AceGUISharedMediaWidgets.fixlevels
|
||||
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Statusbar_Item_Select"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
self.texture:SetTexture(Media:Fetch('statusbar',text))
|
||||
self.texture:SetVertexColor(.5,.5,.5)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown-Item-Toggle")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
local texture = self.frame:CreateTexture(nil, "BACKGROUND")
|
||||
texture:SetTexture(0,0,0,0)
|
||||
texture:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",-4,1)
|
||||
texture:SetPoint("TOPLEFT",self.frame,"TOPLEFT",6,-1)
|
||||
self.texture = texture
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "LSM30_Statusbar"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function SetText(self, text)
|
||||
if text and text ~= '' then
|
||||
self.texture:SetTexture(Media:Fetch('statusbar',text))
|
||||
self.texture:SetVertexColor(.5,.5,.5)
|
||||
end
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("LSM30_Statusbar_Item_Select")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function SetList(self, list)
|
||||
self.list = list or Media:HashTable("statusbar")
|
||||
self.pullout:Clear()
|
||||
if self.multiselect then
|
||||
AddCloseButton()
|
||||
end
|
||||
end
|
||||
|
||||
local sortlist = {}
|
||||
local function ParseListItems(self)
|
||||
for v in pairs(self.list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
table.sort(sortlist)
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, value)
|
||||
sortlist[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = AceGUI:Create("Dropdown")
|
||||
self.type = widgetType
|
||||
self.SetText = SetText
|
||||
self.SetList = SetList
|
||||
self.SetValue = AceGUISharedMediaWidgets.SetValue
|
||||
|
||||
local left = _G[self.dropdown:GetName() .. "Left"]
|
||||
local middle = _G[self.dropdown:GetName() .. "Middle"]
|
||||
local right = _G[self.dropdown:GetName() .. "Right"]
|
||||
|
||||
local texture = self.dropdown:CreateTexture(nil, "ARTWORK")
|
||||
texture:SetPoint("BOTTOMRIGHT", right, "BOTTOMRIGHT" ,-39, 26)
|
||||
texture:SetPoint("TOPLEFT", left, "TOPLEFT", 24, -24)
|
||||
self.texture = texture
|
||||
|
||||
local clickscript = self.button:GetScript("OnClick")
|
||||
self.button:SetScript("OnClick", function(...)
|
||||
self.pullout:Clear()
|
||||
ParseListItems(self)
|
||||
clickscript(...)
|
||||
end)
|
||||
|
||||
return self
|
||||
end
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="SharedFunctions.lua" />
|
||||
<Script file="FontWidget.lua" />
|
||||
<Script file="SoundWidget.lua" />
|
||||
<Script file="StatusbarWidget.lua" />
|
||||
<Script file="BorderWidget.lua" />
|
||||
<Script file="BackgroundWidget.lua" />
|
||||
</Ui>
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Include file="AceGUI-3.0-SharedMediaWidgets\widget.xml" />
|
||||
</Ui>
|
||||
@@ -0,0 +1,805 @@
|
||||
--- **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
|
||||
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
|
||||
-- stand-alone distribution.
|
||||
--
|
||||
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
|
||||
-- as any "unknown" change to the widgets will cause addons that get your widget out of the widget pool
|
||||
-- to misbehave. If you think some part of a widget should be modifiable, please open a ticket, and we"ll
|
||||
-- implement a proper API to modify it.
|
||||
-- @usage
|
||||
-- local AceGUI = LibStub("AceGUI-3.0")
|
||||
-- -- Create a container frame
|
||||
-- local f = AceGUI:Create("Frame")
|
||||
-- f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
|
||||
-- f:SetTitle("AceGUI-3.0 Example")
|
||||
-- f:SetStatusText("Status Bar")
|
||||
-- f:SetLayout("Flow")
|
||||
-- -- Create a button
|
||||
-- local btn = AceGUI:Create("Button")
|
||||
-- btn:SetWidth(170)
|
||||
-- btn:SetText("Button !")
|
||||
-- btn:SetCallback("OnClick", function() print("Click!") end)
|
||||
-- -- Add the button to the container
|
||||
-- f:AddChild(btn)
|
||||
-- @class file
|
||||
-- @name AceGUI-3.0
|
||||
-- @release $Id: AceGUI-3.0.lua 924 2010-05-13 15:12:20Z nevcairiel $
|
||||
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 33
|
||||
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
|
||||
|
||||
if not AceGUI then return end -- No upgrade needed
|
||||
|
||||
-- Lua APIs
|
||||
local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
|
||||
local select, pairs, next, type = select, pairs, next, type
|
||||
local error, assert, loadstring = error, assert, loadstring
|
||||
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
|
||||
local math_max = math.max
|
||||
|
||||
-- WoW APIs
|
||||
local UIParent = UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: geterrorhandler, LibStub
|
||||
|
||||
--local con = LibStub("AceConsole-3.0",true)
|
||||
|
||||
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
|
||||
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
|
||||
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
|
||||
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
|
||||
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
|
||||
|
||||
-- local upvalues
|
||||
local WidgetRegistry = AceGUI.WidgetRegistry
|
||||
local LayoutRegistry = AceGUI.LayoutRegistry
|
||||
local WidgetVersions = AceGUI.WidgetVersions
|
||||
|
||||
--[[
|
||||
xpcall safecall implementation
|
||||
]]
|
||||
local xpcall = xpcall
|
||||
|
||||
local function errorhandler(err)
|
||||
return geterrorhandler()(err)
|
||||
end
|
||||
|
||||
local function CreateDispatcher(argCount)
|
||||
local code = [[
|
||||
local xpcall, eh = ...
|
||||
local method, ARGS
|
||||
local function call() return method(ARGS) end
|
||||
|
||||
local function dispatch(func, ...)
|
||||
method = func
|
||||
if not method then return end
|
||||
ARGS = ...
|
||||
return xpcall(call, eh)
|
||||
end
|
||||
|
||||
return dispatch
|
||||
]]
|
||||
|
||||
local ARGS = {}
|
||||
for i = 1, argCount do ARGS[i] = "arg"..i end
|
||||
code = code:gsub("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[select("#", ...)](func, ...)
|
||||
end
|
||||
|
||||
-- Recycling functions
|
||||
local newWidget, delWidget
|
||||
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 {}
|
||||
local objPools = AceGUI.objPools
|
||||
--Returns a new instance, if none are available either returns a new table or calls the given contructor
|
||||
function newWidget(type)
|
||||
if not WidgetRegistry[type] then
|
||||
error("Attempt to instantiate unknown widget type", 2)
|
||||
end
|
||||
|
||||
if not objPools[type] then
|
||||
objPools[type] = {}
|
||||
end
|
||||
|
||||
local newObj = next(objPools[type])
|
||||
if not newObj then
|
||||
newObj = WidgetRegistry[type]()
|
||||
newObj.AceGUIWidgetVersion = WidgetVersions[type]
|
||||
else
|
||||
objPools[type][newObj] = nil
|
||||
-- if the widget is older then the latest, don't even try to reuse it
|
||||
-- just forget about it, and grab a new one.
|
||||
if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
|
||||
return newWidget(type)
|
||||
end
|
||||
end
|
||||
return newObj
|
||||
end
|
||||
-- Releases an instance to the Pool
|
||||
function delWidget(obj,type)
|
||||
if not objPools[type] then
|
||||
objPools[type] = {}
|
||||
end
|
||||
if objPools[type][obj] then
|
||||
error("Attempt to Release Widget that is already released", 2)
|
||||
end
|
||||
objPools[type][obj] = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-------------------
|
||||
-- API Functions --
|
||||
-------------------
|
||||
|
||||
-- Gets a widget Object
|
||||
|
||||
--- Create a new Widget of the given type.
|
||||
-- This function will instantiate a new widget (or use one from the widget pool), and call the
|
||||
-- OnAcquire function on it, before returning.
|
||||
-- @param type The type of the widget.
|
||||
-- @return The newly created widget.
|
||||
function AceGUI:Create(type)
|
||||
if WidgetRegistry[type] then
|
||||
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
|
||||
widget:OnAcquire()
|
||||
else
|
||||
error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
|
||||
end
|
||||
-- Set the default Layout ("List")
|
||||
safecall(widget.SetLayout, widget, "List")
|
||||
safecall(widget.ResumeLayout, widget)
|
||||
return widget
|
||||
end
|
||||
end
|
||||
|
||||
--- Releases a widget Object.
|
||||
-- This function calls OnRelease on the widget and places it back in the widget pool.
|
||||
-- Any data on the widget is being erased, and the widget will be hidden.\\
|
||||
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
|
||||
-- @param widget The widget to release
|
||||
function AceGUI:Release(widget)
|
||||
safecall(widget.PauseLayout, widget)
|
||||
widget:Fire("OnRelease")
|
||||
safecall(widget.ReleaseChildren, widget)
|
||||
|
||||
if widget.OnRelease then
|
||||
widget:OnRelease()
|
||||
-- else
|
||||
-- error(("Widget type %s doesn't supply an OnRelease Function"):format(widget.type))
|
||||
end
|
||||
for k in pairs(widget.userdata) do
|
||||
widget.userdata[k] = nil
|
||||
end
|
||||
for k in pairs(widget.events) do
|
||||
widget.events[k] = nil
|
||||
end
|
||||
widget.width = nil
|
||||
widget.relWidth = nil
|
||||
widget.height = nil
|
||||
widget.relHeight = nil
|
||||
widget.noAutoHeight = nil
|
||||
widget.frame:ClearAllPoints()
|
||||
widget.frame:Hide()
|
||||
widget.frame:SetParent(UIParent)
|
||||
widget.frame.width = nil
|
||||
widget.frame.height = nil
|
||||
if widget.content then
|
||||
widget.content.width = nil
|
||||
widget.content.height = nil
|
||||
end
|
||||
delWidget(widget, widget.type)
|
||||
end
|
||||
|
||||
-----------
|
||||
-- Focus --
|
||||
-----------
|
||||
|
||||
|
||||
--- Called when a widget has taken focus.
|
||||
-- e.g. Dropdowns opening, Editboxes gaining kb focus
|
||||
-- @param widget The widget that should be focused
|
||||
function AceGUI:SetFocus(widget)
|
||||
if self.FocusedWidget and self.FocusedWidget ~= widget then
|
||||
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
|
||||
end
|
||||
self.FocusedWidget = widget
|
||||
end
|
||||
|
||||
|
||||
--- Called when something has happened that could cause widgets with focus to drop it
|
||||
-- e.g. titlebar of a frame being clicked
|
||||
function AceGUI:ClearFocus()
|
||||
if self.FocusedWidget then
|
||||
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
|
||||
self.FocusedWidget = nil
|
||||
end
|
||||
end
|
||||
|
||||
-------------
|
||||
-- Widgets --
|
||||
-------------
|
||||
--[[
|
||||
Widgets must provide the following functions
|
||||
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
|
||||
|
||||
And the following members
|
||||
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()
|
||||
|
||||
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
|
||||
Placing values directly into a widget object should be avoided
|
||||
|
||||
If the Widget can act as a container for other Widgets the following
|
||||
content - frame or derivitive that children will be anchored to
|
||||
|
||||
The Widget can supply the following Optional Members
|
||||
: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
|
||||
:OnHeightSet(height) - Called when the height of the widget is changed
|
||||
Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
|
||||
AceGUI already sets a handler to the event
|
||||
:LayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
|
||||
area used for controls. These can be nil if the layout used the existing size to layout the controls.
|
||||
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Widget Base Template --
|
||||
--------------------------
|
||||
do
|
||||
local WidgetBase = AceGUI.WidgetBase
|
||||
|
||||
WidgetBase.SetParent = function(self, parent)
|
||||
local frame = self.frame
|
||||
frame:SetParent(nil)
|
||||
frame:SetParent(parent.content)
|
||||
self.parent = parent
|
||||
end
|
||||
|
||||
WidgetBase.SetCallback = function(self, name, func)
|
||||
if type(func) == "function" then
|
||||
self.events[name] = func
|
||||
end
|
||||
end
|
||||
|
||||
WidgetBase.Fire = function(self, name, ...)
|
||||
if self.events[name] then
|
||||
local success, ret = safecall(self.events[name], self, name, ...)
|
||||
if success then
|
||||
return ret
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
WidgetBase.SetWidth = function(self, width)
|
||||
self.frame:SetWidth(width)
|
||||
self.frame.width = width
|
||||
if self.OnWidthSet then
|
||||
self:OnWidthSet(width)
|
||||
end
|
||||
end
|
||||
|
||||
WidgetBase.SetRelativeWidth = function(self, width)
|
||||
if width <= 0 or width > 1 then
|
||||
error(":SetRelativeWidth(width): Invalid relative width.", 2)
|
||||
end
|
||||
self.relWidth = width
|
||||
self.width = "relative"
|
||||
end
|
||||
|
||||
WidgetBase.SetHeight = function(self, height)
|
||||
self.frame:SetHeight(height)
|
||||
self.frame.height = height
|
||||
if self.OnHeightSet then
|
||||
self:OnHeightSet(height)
|
||||
end
|
||||
end
|
||||
|
||||
--[[ WidgetBase.SetRelativeHeight = function(self, height)
|
||||
if height <= 0 or height > 1 then
|
||||
error(":SetRelativeHeight(height): Invalid relative height.", 2)
|
||||
end
|
||||
self.relHeight = height
|
||||
self.height = "relative"
|
||||
end ]]
|
||||
|
||||
WidgetBase.IsVisible = function(self)
|
||||
return self.frame:IsVisible()
|
||||
end
|
||||
|
||||
WidgetBase.IsShown= function(self)
|
||||
return self.frame:IsShown()
|
||||
end
|
||||
|
||||
WidgetBase.Release = function(self)
|
||||
AceGUI:Release(self)
|
||||
end
|
||||
|
||||
WidgetBase.SetPoint = function(self, ...)
|
||||
return self.frame:SetPoint(...)
|
||||
end
|
||||
|
||||
WidgetBase.ClearAllPoints = function(self)
|
||||
return self.frame:ClearAllPoints()
|
||||
end
|
||||
|
||||
WidgetBase.GetNumPoints = function(self)
|
||||
return self.frame:GetNumPoints()
|
||||
end
|
||||
|
||||
WidgetBase.GetPoint = function(self, ...)
|
||||
return self.frame:GetPoint(...)
|
||||
end
|
||||
|
||||
WidgetBase.GetUserDataTable = function(self)
|
||||
return self.userdata
|
||||
end
|
||||
|
||||
WidgetBase.SetUserData = function(self, key, value)
|
||||
self.userdata[key] = value
|
||||
end
|
||||
|
||||
WidgetBase.GetUserData = function(self, key)
|
||||
return self.userdata[key]
|
||||
end
|
||||
|
||||
WidgetBase.IsFullHeight = function(self)
|
||||
return self.height == "fill"
|
||||
end
|
||||
|
||||
WidgetBase.SetFullHeight = function(self, isFull)
|
||||
if isFull then
|
||||
self.height = "fill"
|
||||
else
|
||||
self.height = nil
|
||||
end
|
||||
end
|
||||
|
||||
WidgetBase.IsFullWidth = function(self)
|
||||
return self.width == "fill"
|
||||
end
|
||||
|
||||
WidgetBase.SetFullWidth = function(self, isFull)
|
||||
if isFull then
|
||||
self.width = "fill"
|
||||
else
|
||||
self.width = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- local function LayoutOnUpdate(this)
|
||||
-- this:SetScript("OnUpdate",nil)
|
||||
-- this.obj:PerformLayout()
|
||||
-- end
|
||||
|
||||
local WidgetContainerBase = AceGUI.WidgetContainerBase
|
||||
|
||||
WidgetContainerBase.PauseLayout = function(self)
|
||||
self.LayoutPaused = true
|
||||
end
|
||||
|
||||
WidgetContainerBase.ResumeLayout = function(self)
|
||||
self.LayoutPaused = nil
|
||||
end
|
||||
|
||||
WidgetContainerBase.PerformLayout = function(self)
|
||||
if self.LayoutPaused then
|
||||
return
|
||||
end
|
||||
safecall(self.LayoutFunc, self.content, self.children)
|
||||
end
|
||||
|
||||
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
|
||||
WidgetContainerBase.DoLayout = function(self)
|
||||
self:PerformLayout()
|
||||
-- if not self.parent then
|
||||
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
|
||||
-- end
|
||||
end
|
||||
|
||||
WidgetContainerBase.AddChild = function(self, child, beforeWidget)
|
||||
if beforeWidget then
|
||||
local siblingIndex = 1
|
||||
for _, widget in pairs(self.children) do
|
||||
if widget == beforeWidget then
|
||||
break
|
||||
end
|
||||
siblingIndex = siblingIndex + 1
|
||||
end
|
||||
tinsert(self.children, siblingIndex, child)
|
||||
else
|
||||
tinsert(self.children, child)
|
||||
end
|
||||
child:SetParent(self)
|
||||
child.frame:Show()
|
||||
self:DoLayout()
|
||||
end
|
||||
|
||||
WidgetContainerBase.AddChildren = function(self, ...)
|
||||
for i = 1, select("#", ...) do
|
||||
local child = select(i, ...)
|
||||
tinsert(self.children, child)
|
||||
child:SetParent(self)
|
||||
child.frame:Show()
|
||||
end
|
||||
self:DoLayout()
|
||||
end
|
||||
|
||||
WidgetContainerBase.ReleaseChildren = function(self)
|
||||
local children = self.children
|
||||
for i = 1,#children do
|
||||
AceGUI:Release(children[i])
|
||||
children[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
WidgetContainerBase.SetLayout = function(self, Layout)
|
||||
self.LayoutFunc = AceGUI:GetLayout(Layout)
|
||||
end
|
||||
|
||||
WidgetContainerBase.SetAutoAdjustHeight = function(self, adjust)
|
||||
if adjust then
|
||||
self.noAutoHeight = nil
|
||||
else
|
||||
self.noAutoHeight = true
|
||||
end
|
||||
end
|
||||
|
||||
local function FrameResize(this)
|
||||
local self = this.obj
|
||||
if this:GetWidth() and this:GetHeight() then
|
||||
if self.OnWidthSet then
|
||||
self:OnWidthSet(this:GetWidth())
|
||||
end
|
||||
if self.OnHeightSet then
|
||||
self:OnHeightSet(this:GetHeight())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function ContentResize(this)
|
||||
if this:GetWidth() and this:GetHeight() then
|
||||
this.width = this:GetWidth()
|
||||
this.height = this:GetHeight()
|
||||
this.obj:DoLayout()
|
||||
end
|
||||
end
|
||||
|
||||
setmetatable(WidgetContainerBase, {__index=WidgetBase})
|
||||
|
||||
--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.
|
||||
-- @param widget The widget class
|
||||
function AceGUI:RegisterAsContainer(widget)
|
||||
widget.children = {}
|
||||
widget.userdata = {}
|
||||
widget.events = {}
|
||||
widget.base = WidgetContainerBase
|
||||
widget.content.obj = widget
|
||||
widget.frame.obj = widget
|
||||
widget.content:SetScript("OnSizeChanged", ContentResize)
|
||||
widget.frame:SetScript("OnSizeChanged", FrameResize)
|
||||
setmetatable(widget, {__index = WidgetContainerBase})
|
||||
widget:SetLayout("List")
|
||||
return widget
|
||||
end
|
||||
|
||||
--- Register a widget-class as a widget.
|
||||
-- @param widget The widget class
|
||||
function AceGUI:RegisterAsWidget(widget)
|
||||
widget.userdata = {}
|
||||
widget.events = {}
|
||||
widget.base = WidgetBase
|
||||
widget.frame.obj = widget
|
||||
widget.frame:SetScript("OnSizeChanged", FrameResize)
|
||||
setmetatable(widget, {__index = WidgetBase})
|
||||
return widget
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
------------------
|
||||
-- Widget API --
|
||||
------------------
|
||||
|
||||
--- Registers a widget Constructor, this function returns a new instance of the Widget
|
||||
-- @param Name The name of the widget
|
||||
-- @param Constructor The widget constructor function
|
||||
-- @param Version The version of the widget
|
||||
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
|
||||
assert(type(Constructor) == "function")
|
||||
assert(type(Version) == "number")
|
||||
|
||||
local oldVersion = WidgetVersions[Name]
|
||||
if oldVersion and oldVersion >= Version then return end
|
||||
|
||||
WidgetVersions[Name] = Version
|
||||
WidgetRegistry[Name] = Constructor
|
||||
end
|
||||
|
||||
--- Registers a Layout Function
|
||||
-- @param Name The name of the layout
|
||||
-- @param LayoutFunc Reference to the layout function
|
||||
function AceGUI:RegisterLayout(Name, LayoutFunc)
|
||||
assert(type(LayoutFunc) == "function")
|
||||
if type(Name) == "string" then
|
||||
Name = Name:upper()
|
||||
end
|
||||
LayoutRegistry[Name] = LayoutFunc
|
||||
end
|
||||
|
||||
--- Get a Layout Function from the registry
|
||||
-- @param Name The name of the layout
|
||||
function AceGUI:GetLayout(Name)
|
||||
if type(Name) == "string" then
|
||||
Name = Name:upper()
|
||||
end
|
||||
return LayoutRegistry[Name]
|
||||
end
|
||||
|
||||
AceGUI.counts = AceGUI.counts or {}
|
||||
|
||||
--- A type-based counter to count the number of widgets created.
|
||||
-- This is used by widgets that require a named frame, e.g. when a Blizzard
|
||||
-- Template requires it.
|
||||
-- @param type The widget type
|
||||
function AceGUI:GetNextWidgetNum(type)
|
||||
if not self.counts[type] then
|
||||
self.counts[type] = 0
|
||||
end
|
||||
self.counts[type] = self.counts[type] + 1
|
||||
return self.counts[type]
|
||||
end
|
||||
|
||||
--- Return the number of created widgets for this type.
|
||||
-- In contrast to GetNextWidgetNum, the number is not incremented.
|
||||
-- @param type The widget type
|
||||
function AceGUI:GetWidgetCount(type)
|
||||
return self.counts[type] or 0
|
||||
end
|
||||
|
||||
--- Return the version of the currently registered widget type.
|
||||
-- @param type The widget type
|
||||
function AceGUI:GetWidgetVersion(type)
|
||||
return WidgetVersions[type]
|
||||
end
|
||||
|
||||
-------------
|
||||
-- Layouts --
|
||||
-------------
|
||||
|
||||
--[[
|
||||
A Layout is a func that takes 2 parameters
|
||||
content - the frame that widgets will be placed inside
|
||||
children - a table containing the widgets to layout
|
||||
]]
|
||||
|
||||
-- Very simple Layout, Children are stacked on top of each other down the left side
|
||||
AceGUI:RegisterLayout("List",
|
||||
function(content, children)
|
||||
local height = 0
|
||||
local width = content.width or content:GetWidth() or 0
|
||||
for i = 1, #children do
|
||||
local child = children[i]
|
||||
|
||||
local frame = child.frame
|
||||
frame:ClearAllPoints()
|
||||
frame:Show()
|
||||
if i == 1 then
|
||||
frame:SetPoint("TOPLEFT", content)
|
||||
else
|
||||
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
|
||||
end
|
||||
|
||||
if child.width == "fill" then
|
||||
child:SetWidth(width)
|
||||
frame:SetPoint("RIGHT", content)
|
||||
|
||||
if child.DoLayout then
|
||||
child:DoLayout()
|
||||
end
|
||||
elseif child.width == "relative" then
|
||||
child:SetWidth(width * child.relWidth)
|
||||
|
||||
if child.DoLayout then
|
||||
child:DoLayout()
|
||||
end
|
||||
end
|
||||
|
||||
height = height + (frame.height or frame:GetHeight() or 0)
|
||||
end
|
||||
safecall(content.obj.LayoutFinished, content.obj, nil, height)
|
||||
end)
|
||||
|
||||
-- A single control fills the whole content area
|
||||
AceGUI:RegisterLayout("Fill",
|
||||
function(content, children)
|
||||
if children[1] then
|
||||
children[1]:SetWidth(content:GetWidth() or 0)
|
||||
children[1]:SetHeight(content:GetHeight() or 0)
|
||||
children[1].frame:SetAllPoints(content)
|
||||
children[1].frame:Show()
|
||||
safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
|
||||
end
|
||||
end)
|
||||
|
||||
AceGUI:RegisterLayout("Flow",
|
||||
function(content, children)
|
||||
--used height so far
|
||||
local height = 0
|
||||
--width used in the current row
|
||||
local usedwidth = 0
|
||||
--height of the current row
|
||||
local rowheight = 0
|
||||
local rowoffset = 0
|
||||
local lastrowoffset
|
||||
|
||||
local width = content.width or content:GetWidth() or 0
|
||||
|
||||
--control at the start of the row
|
||||
local rowstart
|
||||
local rowstartoffset
|
||||
local lastrowstart
|
||||
local isfullheight
|
||||
|
||||
local frameoffset
|
||||
local lastframeoffset
|
||||
local oversize
|
||||
for i = 1, #children do
|
||||
local child = children[i]
|
||||
oversize = nil
|
||||
local frame = child.frame
|
||||
local frameheight = frame.height or frame:GetHeight() or 0
|
||||
local framewidth = frame.width or frame:GetWidth() or 0
|
||||
lastframeoffset = frameoffset
|
||||
-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
|
||||
-- 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.
|
||||
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
|
||||
-- TODO: Investigate moar!
|
||||
frameoffset = child.alignoffset or (frameheight / 2)
|
||||
|
||||
if child.width == "relative" then
|
||||
framewidth = width * child.relWidth
|
||||
end
|
||||
|
||||
frame:Show()
|
||||
frame:ClearAllPoints()
|
||||
if i == 1 then
|
||||
-- anchor the first control to the top left
|
||||
frame:SetPoint("TOPLEFT", content)
|
||||
rowheight = frameheight
|
||||
rowoffset = frameoffset
|
||||
rowstart = frame
|
||||
rowstartoffset = frameoffset
|
||||
usedwidth = framewidth
|
||||
if usedwidth > width then
|
||||
oversize = true
|
||||
end
|
||||
else
|
||||
-- if there isn't available width for the control start a new row
|
||||
-- if a control is "fill" it will be on a row of its own full width
|
||||
if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
|
||||
if isfullheight then
|
||||
-- a previous row has already filled the entire height, there's nothing we can usefully do anymore
|
||||
-- (maybe error/warn about this?)
|
||||
break
|
||||
end
|
||||
--anchor the previous row, we will now know its height and offset
|
||||
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
|
||||
height = height + rowheight + 3
|
||||
--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
|
||||
rowstart = frame
|
||||
rowstartoffset = frameoffset
|
||||
rowheight = frameheight
|
||||
rowoffset = frameoffset
|
||||
usedwidth = framewidth
|
||||
if usedwidth > width then
|
||||
oversize = true
|
||||
end
|
||||
-- put the control on the current row, adding it to the width and checking if the height needs to be increased
|
||||
else
|
||||
--handles cases where the new height is higher than either control because of the offsets
|
||||
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
|
||||
|
||||
--offset is always the larger of the two offsets
|
||||
rowoffset = math_max(rowoffset, frameoffset)
|
||||
rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
|
||||
|
||||
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
|
||||
usedwidth = framewidth + usedwidth
|
||||
end
|
||||
end
|
||||
|
||||
if child.width == "fill" then
|
||||
child:SetWidth(width)
|
||||
frame:SetPoint("RIGHT", content)
|
||||
|
||||
usedwidth = 0
|
||||
rowstart = frame
|
||||
rowstartoffset = frameoffset
|
||||
|
||||
if child.DoLayout then
|
||||
child:DoLayout()
|
||||
end
|
||||
rowheight = frame.height or frame:GetHeight() or 0
|
||||
rowoffset = child.alignoffset or (rowheight / 2)
|
||||
rowstartoffset = rowoffset
|
||||
elseif child.width == "relative" then
|
||||
child:SetWidth(width * child.relWidth)
|
||||
|
||||
if child.DoLayout then
|
||||
child:DoLayout()
|
||||
end
|
||||
elseif oversize then
|
||||
if width > 1 then
|
||||
frame:SetPoint("RIGHT", content)
|
||||
end
|
||||
end
|
||||
|
||||
if child.height == "fill" then
|
||||
frame:SetPoint("BOTTOM", content)
|
||||
isfullheight = true
|
||||
end
|
||||
end
|
||||
|
||||
--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
|
||||
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
|
||||
elseif rowstart then
|
||||
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
|
||||
end
|
||||
|
||||
height = height + rowheight + 3
|
||||
safecall(content.obj.LayoutFinished, content.obj, nil, height)
|
||||
end)
|
||||
@@ -0,0 +1,28 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceGUI-3.0.lua"/>
|
||||
<!-- Container -->
|
||||
<Script file="widgets\AceGUIContainer-BlizOptionsGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-DropDownGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-Frame.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-InlineGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-ScrollFrame.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-SimpleGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-TabGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-TreeGroup.lua"/>
|
||||
<Script file="widgets\AceGUIContainer-Window.lua"/>
|
||||
<!-- Widgets -->
|
||||
<Script file="widgets\AceGUIWidget-Button.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-DropDown.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-EditBox.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-Heading.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-Icon.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-InteractiveLabel.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-Label.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
|
||||
<Script file="widgets\AceGUIWidget-Slider.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,133 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
BlizOptionsGroup Container
|
||||
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "BlizOptionsGroup", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame = CreateFrame
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local function OnShow(frame)
|
||||
frame.obj:Fire("OnShow")
|
||||
end
|
||||
|
||||
local function OnHide(frame)
|
||||
frame.obj:Fire("OnHide")
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local function okay(frame)
|
||||
frame.obj:Fire("okay")
|
||||
end
|
||||
|
||||
local function cancel(frame)
|
||||
frame.obj:Fire("cancel")
|
||||
end
|
||||
|
||||
local function defaults(frame)
|
||||
frame.obj:Fire("defaults")
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetName()
|
||||
self:SetTitle()
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["OnWidthSet"] = function(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 63
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
end,
|
||||
|
||||
["OnHeightSet"] = function(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 26
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end,
|
||||
|
||||
["SetName"] = function(self, name, parent)
|
||||
self.frame.name = name
|
||||
self.frame.parent = parent
|
||||
end,
|
||||
|
||||
["SetTitle"] = function(self, title)
|
||||
local content = self.content
|
||||
content:ClearAllPoints()
|
||||
if not title or title == "" then
|
||||
content:SetPoint("TOPLEFT", 10, -10)
|
||||
self.label:SetText("")
|
||||
else
|
||||
content:SetPoint("TOPLEFT", 10, -40)
|
||||
self.label:SetText(title)
|
||||
end
|
||||
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame")
|
||||
frame:Hide()
|
||||
|
||||
-- support functions for the Blizzard Interface Options
|
||||
frame.okay = okay
|
||||
frame.cancel = cancel
|
||||
frame.defaults = defaults
|
||||
|
||||
frame:SetScript("OnHide", OnHide)
|
||||
frame:SetScript("OnShow", OnShow)
|
||||
|
||||
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
|
||||
label:SetPoint("TOPLEFT", 10, -15)
|
||||
label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
|
||||
label:SetJustifyH("LEFT")
|
||||
label:SetJustifyV("TOP")
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame", nil, frame)
|
||||
content:SetPoint("TOPLEFT", 10, -10)
|
||||
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||
|
||||
local widget = {
|
||||
label = label,
|
||||
frame = frame,
|
||||
content = content,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsContainer(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,178 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local assert, pairs, type = assert, pairs, type
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame = CreateFrame
|
||||
|
||||
--[[
|
||||
Selection Group controls all have an interface to select a group for thier contents
|
||||
None of them will auto size to thier contents, and should usually be used with a scrollframe
|
||||
unless you know that the controls will fit inside
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Dropdown Group --
|
||||
--------------------------
|
||||
--[[
|
||||
Events :
|
||||
OnGroupSelected
|
||||
|
||||
]]
|
||||
do
|
||||
local Type = "DropdownGroup"
|
||||
local Version = 13
|
||||
|
||||
local function OnAcquire(self)
|
||||
self.dropdown:SetText("")
|
||||
self:SetDropdownWidth(200)
|
||||
self:SetTitle("")
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
self.dropdown.list = nil
|
||||
self.status = nil
|
||||
for k in pairs(self.localstatus) do
|
||||
self.localstatus[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local PaneBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||
}
|
||||
|
||||
local function SetTitle(self,title)
|
||||
self.titletext:SetText(title)
|
||||
self.dropdown.frame:ClearAllPoints()
|
||||
if title and title ~= "" then
|
||||
self.dropdown.frame:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -2, 0)
|
||||
else
|
||||
self.dropdown.frame:SetPoint("TOPLEFT", self.frame, "TOPLEFT", -1, 0)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function SelectedGroup(self,event,value)
|
||||
local group = self.parentgroup
|
||||
local status = group.status or group.localstatus
|
||||
status.selected = value
|
||||
self.parentgroup:Fire("OnGroupSelected", value)
|
||||
end
|
||||
|
||||
local function SetGroupList(self,list)
|
||||
self.dropdown:SetList(list)
|
||||
end
|
||||
|
||||
-- called to set an external table to store status in
|
||||
local function SetStatusTable(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
end
|
||||
|
||||
local function SetGroup(self,group)
|
||||
self.dropdown:SetValue(group)
|
||||
local status = self.status or self.localstatus
|
||||
status.selected = group
|
||||
self:Fire("OnGroupSelected", group)
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 26
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 63
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
self:SetHeight((height or 0) + 63)
|
||||
end
|
||||
|
||||
local function SetDropdownWidth(self, width)
|
||||
self.dropdown:SetWidth(width)
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame")
|
||||
local self = {}
|
||||
self.type = Type
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
|
||||
self.SetTitle = SetTitle
|
||||
self.SetGroupList = SetGroupList
|
||||
self.SetGroup = SetGroup
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.SetDropdownWidth = SetDropdownWidth
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
self.LayoutFinished = LayoutFinished
|
||||
|
||||
self.localstatus = {}
|
||||
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
|
||||
frame:SetHeight(100)
|
||||
frame:SetWidth(100)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
titletext:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -5)
|
||||
titletext:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -4, -5)
|
||||
titletext:SetJustifyH("LEFT")
|
||||
titletext:SetHeight(18)
|
||||
self.titletext = titletext
|
||||
|
||||
local dropdown = AceGUI:Create("Dropdown")
|
||||
self.dropdown = dropdown
|
||||
dropdown.frame:SetParent(frame)
|
||||
dropdown.frame:SetFrameLevel(dropdown.frame:GetFrameLevel() + 2)
|
||||
dropdown.parentgroup = self
|
||||
dropdown:SetCallback("OnValueChanged",SelectedGroup)
|
||||
dropdown.frame:SetPoint("TOPLEFT",frame,"TOPLEFT", -1, 0)
|
||||
dropdown.frame:Show()
|
||||
dropdown:SetLabel("")
|
||||
|
||||
local border = CreateFrame("Frame",nil,frame)
|
||||
self.border = border
|
||||
border:SetPoint("TOPLEFT",frame,"TOPLEFT",0,-26)
|
||||
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,3)
|
||||
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
border:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||
border:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,border)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
|
||||
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,288 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Frame Container
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Frame", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs, assert, type = pairs, assert, type
|
||||
local wipe = table.wipe
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: CLOSE
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Button_OnClick(frame)
|
||||
PlaySound("gsTitleOptionExit")
|
||||
frame.obj:Hide()
|
||||
end
|
||||
|
||||
local function Frame_OnClose(frame)
|
||||
frame.obj:Fire("OnClose")
|
||||
end
|
||||
|
||||
local function Frame_OnMouseDown(frame)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function Title_OnMouseDown(frame)
|
||||
frame:GetParent():StartMoving()
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function MoverSizer_OnMouseUp(mover)
|
||||
local frame = mover:GetParent()
|
||||
frame:StopMovingOrSizing()
|
||||
local self = frame.obj
|
||||
local status = self.status or self.localstatus
|
||||
status.width = frame:GetWidth()
|
||||
status.height = frame:GetHeight()
|
||||
status.top = frame:GetTop()
|
||||
status.left = frame:GetLeft()
|
||||
end
|
||||
|
||||
local function SizerSE_OnMouseDown(frame)
|
||||
frame:GetParent():StartSizing("BOTTOMRIGHT")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function SizerS_OnMouseDown(frame)
|
||||
frame:GetParent():StartSizing("BOTTOM")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function SizerE_OnMouseDown(frame)
|
||||
frame:GetParent():StartSizing("RIGHT")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self.frame:SetParent(UIParent)
|
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
self:SetTitle()
|
||||
self:SetStatusText()
|
||||
self:ApplyStatus()
|
||||
self:Show()
|
||||
end,
|
||||
|
||||
["OnRelease"] = function(self)
|
||||
self.status = nil
|
||||
wipe(self.localstatus)
|
||||
end,
|
||||
|
||||
["OnWidthSet"] = function(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 34
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
end,
|
||||
|
||||
["OnHeightSet"] = function(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 57
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end,
|
||||
|
||||
["SetTitle"] = function(self, title)
|
||||
self.titletext:SetText(title)
|
||||
end,
|
||||
|
||||
["SetStatusText"] = function(self, text)
|
||||
self.statustext:SetText(text)
|
||||
end,
|
||||
|
||||
["Hide"] = function(self)
|
||||
self.frame:Hide()
|
||||
end,
|
||||
|
||||
["Show"] = function(self)
|
||||
self.frame:Show()
|
||||
end,
|
||||
|
||||
-- called to set an external table to store status in
|
||||
["SetStatusTable"] = function(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
self:ApplyStatus()
|
||||
end,
|
||||
|
||||
["ApplyStatus"] = function(self)
|
||||
local status = self.status or self.localstatus
|
||||
local frame = self.frame
|
||||
self:SetWidth(status.width or 700)
|
||||
self:SetHeight(status.height or 500)
|
||||
frame:ClearAllPoints()
|
||||
if status.top and status.left then
|
||||
frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
|
||||
frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
|
||||
else
|
||||
frame:SetPoint("CENTER")
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local FrameBackdrop = {
|
||||
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
|
||||
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||
tile = true, tileSize = 32, edgeSize = 32,
|
||||
insets = { left = 8, right = 8, top = 8, bottom = 8 }
|
||||
}
|
||||
|
||||
local PaneBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||
}
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetMovable(true)
|
||||
frame:SetResizable(true)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
frame:SetBackdrop(FrameBackdrop)
|
||||
frame:SetBackdropColor(0, 0, 0, 1)
|
||||
frame:SetMinResize(400, 200)
|
||||
frame:SetToplevel(true)
|
||||
frame:SetScript("OnHide", Frame_OnClose)
|
||||
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
|
||||
|
||||
local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
|
||||
closebutton:SetScript("OnClick", Button_OnClick)
|
||||
closebutton:SetPoint("BOTTOMRIGHT", -27, 17)
|
||||
closebutton:SetHeight(20)
|
||||
closebutton:SetWidth(100)
|
||||
closebutton:SetText(CLOSE)
|
||||
|
||||
local statusbg = CreateFrame("Frame", nil, frame)
|
||||
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
|
||||
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
|
||||
statusbg:SetHeight(24)
|
||||
statusbg:SetBackdrop(PaneBackdrop)
|
||||
statusbg:SetBackdropColor(0.1,0.1,0.1)
|
||||
statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
statustext:SetPoint("TOPLEFT", 7, -2)
|
||||
statustext:SetPoint("BOTTOMRIGHT", -7, 2)
|
||||
statustext:SetHeight(20)
|
||||
statustext:SetJustifyH("LEFT")
|
||||
statustext:SetText("")
|
||||
|
||||
local titlebg = frame:CreateTexture(nil, "OVERLAY")
|
||||
titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||
titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
|
||||
titlebg:SetPoint("TOP", 0, 12)
|
||||
titlebg:SetWidth(100)
|
||||
titlebg:SetHeight(40)
|
||||
|
||||
local title = CreateFrame("Frame", nil, frame)
|
||||
title:EnableMouse(true)
|
||||
title:SetScript("OnMouseDown", Title_OnMouseDown)
|
||||
title:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||
title:SetAllPoints(titlebg)
|
||||
|
||||
local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
|
||||
|
||||
local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
|
||||
titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||
titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
|
||||
titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
|
||||
titlebg_l:SetWidth(30)
|
||||
titlebg_l:SetHeight(40)
|
||||
|
||||
local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
|
||||
titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||
titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
|
||||
titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
|
||||
titlebg_r:SetWidth(30)
|
||||
titlebg_r:SetHeight(40)
|
||||
|
||||
local sizer_se = CreateFrame("Frame", nil, frame)
|
||||
sizer_se:SetPoint("BOTTOMRIGHT")
|
||||
sizer_se:SetWidth(25)
|
||||
sizer_se:SetHeight(25)
|
||||
sizer_se:EnableMouse()
|
||||
sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown)
|
||||
sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||
|
||||
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||
line1:SetWidth(14)
|
||||
line1:SetHeight(14)
|
||||
line1:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
local x = 0.1 * 14/17
|
||||
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||
|
||||
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||
line2:SetWidth(8)
|
||||
line2:SetHeight(8)
|
||||
line2:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
local x = 0.1 * 8/17
|
||||
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||
|
||||
local sizer_s = CreateFrame("Frame", nil, frame)
|
||||
sizer_s:SetPoint("BOTTOMRIGHT", -25, 0)
|
||||
sizer_s:SetPoint("BOTTOMLEFT")
|
||||
sizer_s:SetHeight(25)
|
||||
sizer_s:EnableMouse(true)
|
||||
sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown)
|
||||
sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||
|
||||
local sizer_e = CreateFrame("Frame", nil, frame)
|
||||
sizer_e:SetPoint("BOTTOMRIGHT", 0, 25)
|
||||
sizer_e:SetPoint("TOPRIGHT")
|
||||
sizer_e:SetWidth(25)
|
||||
sizer_e:EnableMouse(true)
|
||||
sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown)
|
||||
sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame", nil, frame)
|
||||
content:SetPoint("TOPLEFT", 17, -27)
|
||||
content:SetPoint("BOTTOMRIGHT", -17, 40)
|
||||
|
||||
local widget = {
|
||||
localstatus = {},
|
||||
titletext = titletext,
|
||||
statustext = statustext,
|
||||
content = content,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
closebutton.obj = widget
|
||||
|
||||
return AceGUI:RegisterAsContainer(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,138 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-------------
|
||||
-- Widgets --
|
||||
-------------
|
||||
--[[
|
||||
Widgets must provide the following functions
|
||||
Acquire() - Called when the object is aquired, should set everything to a default hidden state
|
||||
Release() - Called when the object is Released, should remove any anchors and hide the Widget
|
||||
|
||||
And the following members
|
||||
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()
|
||||
|
||||
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
|
||||
Placing values directly into a widget object should be avoided
|
||||
|
||||
If the Widget can act as a container for other Widgets the following
|
||||
content - frame or derivitive that children will be anchored to
|
||||
|
||||
The Widget can supply the following Optional Members
|
||||
|
||||
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Inline Group --
|
||||
--------------------------
|
||||
--[[
|
||||
This is a simple grouping container, no selection
|
||||
It will resize automatically to the height of the controls added to it
|
||||
]]
|
||||
|
||||
do
|
||||
local Type = "InlineGroup"
|
||||
local Version = 6
|
||||
|
||||
local function OnAcquire(self)
|
||||
self:SetWidth(300)
|
||||
self:SetHeight(100)
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
local PaneBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||
}
|
||||
|
||||
local function SetTitle(self,title)
|
||||
self.titletext:SetText(title)
|
||||
end
|
||||
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
if self.noAutoHeight then return end
|
||||
self:SetHeight((height or 0) + 40)
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 20
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 20
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame",nil,UIParent)
|
||||
local self = {}
|
||||
self.type = Type
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
self.SetTitle = SetTitle
|
||||
self.frame = frame
|
||||
self.LayoutFinished = LayoutFinished
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
|
||||
frame.obj = self
|
||||
|
||||
frame:SetHeight(100)
|
||||
frame:SetWidth(100)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
|
||||
titletext:SetPoint("TOPLEFT",frame,"TOPLEFT",14,0)
|
||||
titletext:SetPoint("TOPRIGHT",frame,"TOPRIGHT",-14,0)
|
||||
titletext:SetJustifyH("LEFT")
|
||||
titletext:SetHeight(18)
|
||||
|
||||
self.titletext = titletext
|
||||
|
||||
local border = CreateFrame("Frame",nil,frame)
|
||||
self.border = border
|
||||
border:SetPoint("TOPLEFT",frame,"TOPLEFT",0,-17)
|
||||
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-1,3)
|
||||
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
border:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||
border:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,border)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
|
||||
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,241 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local pairs, assert, type = pairs, assert, type
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
|
||||
-------------
|
||||
-- Widgets --
|
||||
-------------
|
||||
--[[
|
||||
Widgets must provide the following functions
|
||||
Acquire() - Called when the object is aquired, should set everything to a default hidden state
|
||||
Release() - Called when the object is Released, should remove any anchors and hide the Widget
|
||||
|
||||
And the following members
|
||||
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()
|
||||
|
||||
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
|
||||
Placing values directly into a widget object should be avoided
|
||||
|
||||
If the Widget can act as a container for other Widgets the following
|
||||
content - frame or derivitive that children will be anchored to
|
||||
|
||||
The Widget can supply the following Optional Members
|
||||
|
||||
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Scroll Frame --
|
||||
--------------------------
|
||||
do
|
||||
local Type = "ScrollFrame"
|
||||
local Version = 9
|
||||
|
||||
local function OnAcquire(self)
|
||||
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
self.status = nil
|
||||
-- do SetScroll after niling status, but before clearing localstatus
|
||||
-- so the scroll value isnt populated back into status, but not kept in localstatus either
|
||||
self:SetScroll(0)
|
||||
for k in pairs(self.localstatus) do
|
||||
self.localstatus[k] = nil
|
||||
end
|
||||
self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0)
|
||||
self.scrollbar:Hide()
|
||||
self.scrollBarShown = nil
|
||||
self.content.height, self.content.width = nil, nil
|
||||
end
|
||||
|
||||
local function SetScroll(self, value)
|
||||
local status = self.status or self.localstatus
|
||||
local viewheight = self.scrollframe:GetHeight()
|
||||
local height = self.content:GetHeight()
|
||||
local offset
|
||||
|
||||
if viewheight > height then
|
||||
offset = 0
|
||||
else
|
||||
offset = floor((height - viewheight) / 1000.0 * value)
|
||||
end
|
||||
self.content:ClearAllPoints()
|
||||
self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset)
|
||||
self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset)
|
||||
status.offset = offset
|
||||
status.scrollvalue = value
|
||||
end
|
||||
|
||||
local function MoveScroll(self, value)
|
||||
local status = self.status or self.localstatus
|
||||
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
|
||||
|
||||
if height > viewheight then
|
||||
self.scrollbar:Hide()
|
||||
else
|
||||
self.scrollbar:Show()
|
||||
local diff = height - viewheight
|
||||
local delta = 1
|
||||
if value < 0 then
|
||||
delta = -1
|
||||
end
|
||||
self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function FixScroll(self)
|
||||
if self.updateLock then return end
|
||||
self.updateLock = true
|
||||
local status = self.status or self.localstatus
|
||||
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
|
||||
local offset = status.offset or 0
|
||||
local curvalue = self.scrollbar:GetValue()
|
||||
if viewheight < height then
|
||||
if self.scrollBarShown then
|
||||
self.scrollBarShown = nil
|
||||
self.scrollbar:Hide()
|
||||
self.scrollbar:SetValue(0)
|
||||
self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0)
|
||||
self:DoLayout()
|
||||
end
|
||||
else
|
||||
if not self.scrollBarShown then
|
||||
self.scrollBarShown = true
|
||||
self.scrollbar:Show()
|
||||
self.scrollframe:SetPoint("BOTTOMRIGHT", self.frame,"BOTTOMRIGHT",-20,0)
|
||||
self:DoLayout()
|
||||
end
|
||||
local value = (offset / (viewheight - height) * 1000)
|
||||
if value > 1000 then value = 1000 end
|
||||
self.scrollbar:SetValue(value)
|
||||
self:SetScroll(value)
|
||||
if value < 1000 then
|
||||
self.content:ClearAllPoints()
|
||||
self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset)
|
||||
self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset)
|
||||
status.offset = offset
|
||||
end
|
||||
end
|
||||
self.updateLock = nil
|
||||
end
|
||||
|
||||
local function OnMouseWheel(this, value)
|
||||
this.obj:MoveScroll(value)
|
||||
end
|
||||
|
||||
local function OnScrollValueChanged(this, value)
|
||||
this.obj:SetScroll(value)
|
||||
end
|
||||
|
||||
local function FixScrollOnUpdate(this)
|
||||
this:SetScript("OnUpdate", nil)
|
||||
this.obj:FixScroll()
|
||||
end
|
||||
|
||||
local function OnSizeChanged(this)
|
||||
this:SetScript("OnUpdate", FixScrollOnUpdate)
|
||||
end
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
self.content:SetHeight(height or 0 + 20)
|
||||
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
|
||||
end
|
||||
|
||||
-- called to set an external table to store status in
|
||||
local function SetStatusTable(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
if not status.scrollvalue then
|
||||
status.scrollvalue = 0
|
||||
end
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
content.width = width
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
content.height = height
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
local self = {}
|
||||
self.type = Type
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
|
||||
self.MoveScroll = MoveScroll
|
||||
self.FixScroll = FixScroll
|
||||
self.SetScroll = SetScroll
|
||||
self.LayoutFinished = LayoutFinished
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
|
||||
self.localstatus = {}
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
|
||||
--Container Support
|
||||
local scrollframe = CreateFrame("ScrollFrame", nil, frame)
|
||||
scrollframe.obj = self
|
||||
scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 0)
|
||||
scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, 0)
|
||||
scrollframe:EnableMouseWheel(true)
|
||||
scrollframe:SetScript("OnMouseWheel", OnMouseWheel)
|
||||
scrollframe:SetScript("OnSizeChanged", OnSizeChanged)
|
||||
self.scrollframe = scrollframe
|
||||
|
||||
local content = CreateFrame("Frame", nil, scrollframe)
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT", scrollframe, "TOPLEFT", 0, 0)
|
||||
content:SetPoint("TOPRIGHT", scrollframe, "TOPRIGHT", 0, 0)
|
||||
content:SetHeight(400)
|
||||
self.content = content
|
||||
scrollframe:SetScrollChild(content)
|
||||
|
||||
local num = AceGUI:GetNextWidgetNum(Type)
|
||||
local name = ("AceConfigDialogScrollFrame%dScrollBar"):format(num)
|
||||
local scrollbar = CreateFrame("Slider", name, scrollframe, "UIPanelScrollBarTemplate")
|
||||
scrollbar.obj = self
|
||||
scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16)
|
||||
scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16)
|
||||
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
|
||||
scrollbar:SetMinMaxValues(0, 1000)
|
||||
scrollbar:SetValueStep(1)
|
||||
scrollbar:SetValue(0)
|
||||
scrollbar:SetWidth(16)
|
||||
scrollbar:Hide()
|
||||
self.scrollbar = scrollbar
|
||||
|
||||
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
|
||||
scrollbg:SetAllPoints(scrollbar)
|
||||
scrollbg:SetTexture(0, 0, 0, 0.4)
|
||||
|
||||
self.localstatus.scrollvalue = 0
|
||||
|
||||
--self:FixScroll()
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
--AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,99 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-------------
|
||||
-- Widgets --
|
||||
-------------
|
||||
--[[
|
||||
Widgets must provide the following functions
|
||||
Acquire() - Called when the object is aquired, should set everything to a default hidden state
|
||||
Release() - Called when the object is Released, should remove any anchors and hide the Widget
|
||||
|
||||
And the following members
|
||||
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()
|
||||
|
||||
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
|
||||
Placing values directly into a widget object should be avoided
|
||||
|
||||
If the Widget can act as a container for other Widgets the following
|
||||
content - frame or derivitive that children will be anchored to
|
||||
|
||||
The Widget can supply the following Optional Members
|
||||
|
||||
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Simple Group --
|
||||
--------------------------
|
||||
--[[
|
||||
This is a simple grouping container, no selection, no borders
|
||||
It will resize automatically to the height of the controls added to it
|
||||
]]
|
||||
|
||||
do
|
||||
local Type = "SimpleGroup"
|
||||
local Version = 5
|
||||
|
||||
local function OnAcquire(self)
|
||||
self:SetWidth(300)
|
||||
self:SetHeight(100)
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
if self.noAutoHeight then return end
|
||||
self:SetHeight(height or 0)
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
content:SetWidth(width)
|
||||
content.width = width
|
||||
end
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
content:SetHeight(height)
|
||||
content.height = height
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame",nil,UIParent)
|
||||
local self = {}
|
||||
self.type = Type
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
self.frame = frame
|
||||
self.LayoutFinished = LayoutFinished
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
|
||||
frame.obj = self
|
||||
|
||||
frame:SetHeight(100)
|
||||
frame:SetWidth(100)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,frame)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,389 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local pairs, ipairs, assert, type = pairs, ipairs, assert, type
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
|
||||
|
||||
-------------
|
||||
-- Widgets --
|
||||
-------------
|
||||
--[[
|
||||
Widgets must provide the following functions
|
||||
Acquire() - Called when the object is aquired, should set everything to a default hidden state
|
||||
Release() - Called when the object is Released, should remove any anchors and hide the Widget
|
||||
|
||||
And the following members
|
||||
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()
|
||||
|
||||
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
|
||||
Placing values directly into a widget object should be avoided
|
||||
|
||||
If the Widget can act as a container for other Widgets the following
|
||||
content - frame or derivitive that children will be anchored to
|
||||
|
||||
The Widget can supply the following Optional Members
|
||||
|
||||
|
||||
]]
|
||||
|
||||
--------------------------
|
||||
-- Tab Group --
|
||||
--------------------------
|
||||
|
||||
do
|
||||
local Type = "TabGroup"
|
||||
local Version = 25
|
||||
|
||||
local PaneBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||
}
|
||||
|
||||
local function OnAcquire(self)
|
||||
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
self.status = nil
|
||||
for k in pairs(self.localstatus) do
|
||||
self.localstatus[k] = nil
|
||||
end
|
||||
self.tablist = nil
|
||||
for _, tab in pairs(self.tabs) do
|
||||
tab:Hide()
|
||||
end
|
||||
self:SetTitle()
|
||||
end
|
||||
|
||||
local function Tab_SetText(self, text)
|
||||
self:_SetText(text)
|
||||
local width = self.obj.frame.width or self.obj.frame:GetWidth() or 0
|
||||
PanelTemplates_TabResize(self, 0, nil, width)
|
||||
end
|
||||
|
||||
local function UpdateTabLook(self)
|
||||
if self.disabled then
|
||||
PanelTemplates_SetDisabledTabState(self)
|
||||
elseif self.selected then
|
||||
PanelTemplates_SelectTab(self)
|
||||
else
|
||||
PanelTemplates_DeselectTab(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function Tab_SetSelected(self, selected)
|
||||
self.selected = selected
|
||||
UpdateTabLook(self)
|
||||
end
|
||||
|
||||
local function Tab_OnClick(self)
|
||||
if not (self.selected or self.disabled) then
|
||||
PlaySound("igCharacterInfoTab")
|
||||
self.obj:SelectTab(self.value)
|
||||
end
|
||||
end
|
||||
|
||||
local function Tab_SetDisabled(self, disabled)
|
||||
self.disabled = disabled
|
||||
UpdateTabLook(self)
|
||||
end
|
||||
|
||||
local function Tab_OnEnter(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnTabEnter", self.tabs[this.id].value, this)
|
||||
end
|
||||
|
||||
local function Tab_OnLeave(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnTabLeave", self.tabs[this.id].value, this)
|
||||
end
|
||||
|
||||
local function Tab_OnShow(this)
|
||||
_G[this:GetName().."HighlightTexture"]:SetWidth(this:GetTextWidth() + 30)
|
||||
end
|
||||
|
||||
local function CreateTab(self, id)
|
||||
local tabname = "AceGUITabGroup"..self.num.."Tab"..id
|
||||
local tab = CreateFrame("Button",tabname,self.border,"OptionsFrameTabButtonTemplate")
|
||||
tab.obj = self
|
||||
tab.id = id
|
||||
|
||||
tab.text = _G[tabname .. "Text"]
|
||||
tab.text:ClearAllPoints()
|
||||
tab.text:SetPoint("LEFT", tab, "LEFT", 14, -3)
|
||||
tab.text:SetPoint("RIGHT", tab, "RIGHT", -12, -3)
|
||||
|
||||
tab:SetScript("OnClick",Tab_OnClick)
|
||||
tab:SetScript("OnEnter",Tab_OnEnter)
|
||||
tab:SetScript("OnLeave",Tab_OnLeave)
|
||||
tab:SetScript("OnShow", Tab_OnShow)
|
||||
|
||||
tab._SetText = tab.SetText
|
||||
tab.SetText = Tab_SetText
|
||||
tab.SetSelected = Tab_SetSelected
|
||||
tab.SetDisabled = Tab_SetDisabled
|
||||
|
||||
return tab
|
||||
end
|
||||
|
||||
local function SetTitle(self, text)
|
||||
self.titletext:SetText(text or "")
|
||||
if text and text ~= "" then
|
||||
self.alignoffset = 25
|
||||
else
|
||||
self.alignoffset = 18
|
||||
end
|
||||
self:BuildTabs()
|
||||
end
|
||||
|
||||
-- called to set an external table to store status in
|
||||
local function SetStatusTable(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
end
|
||||
|
||||
local function SelectTab(self, value)
|
||||
local status = self.status or self.localstatus
|
||||
|
||||
local found
|
||||
for i, v in ipairs(self.tabs) do
|
||||
if v.value == value then
|
||||
v:SetSelected(true)
|
||||
found = true
|
||||
else
|
||||
v:SetSelected(false)
|
||||
end
|
||||
end
|
||||
status.selected = value
|
||||
if found then
|
||||
self:Fire("OnGroupSelected",value)
|
||||
end
|
||||
end
|
||||
|
||||
local function SetTabs(self, tabs)
|
||||
self.tablist = tabs
|
||||
self:BuildTabs()
|
||||
end
|
||||
|
||||
|
||||
local widths = {}
|
||||
local rowwidths = {}
|
||||
local rowends = {}
|
||||
local function BuildTabs(self)
|
||||
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
|
||||
local status = self.status or self.localstatus
|
||||
local tablist = self.tablist
|
||||
local tabs = self.tabs
|
||||
|
||||
if not tablist then return end
|
||||
|
||||
local width = self.frame.width or self.frame:GetWidth() or 0
|
||||
|
||||
for i = #widths, 1, -1 do
|
||||
widths[i] = nil
|
||||
end
|
||||
for i = #rowwidths, 1, -1 do
|
||||
rowwidths[i] = nil
|
||||
end
|
||||
for i = #rowends, 1, -1 do
|
||||
rowends[i] = nil
|
||||
end
|
||||
|
||||
--Place Text into tabs and get thier initial width
|
||||
for i, v in ipairs(tablist) do
|
||||
local tab = tabs[i]
|
||||
if not tab then
|
||||
tab = self:CreateTab(i)
|
||||
tabs[i] = tab
|
||||
end
|
||||
|
||||
tab:Show()
|
||||
tab:SetText(v.text)
|
||||
tab:SetDisabled(v.disabled)
|
||||
tab.value = v.value
|
||||
|
||||
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
|
||||
|
||||
for i = (#tablist)+1, #tabs, 1 do
|
||||
tabs[i]:Hide()
|
||||
end
|
||||
|
||||
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
|
||||
local numtabs = #tablist
|
||||
local numrows = 1
|
||||
local usedwidth = 0
|
||||
|
||||
for i = 1, #tablist do
|
||||
--If this is not the first tab of a row and there isn't room for it
|
||||
if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
|
||||
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
|
||||
rowends[numrows] = i - 1
|
||||
numrows = numrows + 1
|
||||
usedwidth = 0
|
||||
end
|
||||
usedwidth = usedwidth + widths[i]
|
||||
end
|
||||
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
|
||||
rowends[numrows] = #tablist
|
||||
|
||||
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
|
||||
if numrows > 1 then
|
||||
--if the last row has only one tab
|
||||
if rowends[numrows-1] == numtabs-1 then
|
||||
--if there are more than 2 tabs in the 2nd last row
|
||||
if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
|
||||
--move 1 tab from the second last row to the last, if there is enough space
|
||||
if (rowwidths[numrows] + widths[numtabs-1]) <= width then
|
||||
rowends[numrows-1] = rowends[numrows-1] - 1
|
||||
rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
|
||||
rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--anchor the rows as defined and resize tabs to fill thier row
|
||||
local starttab = 1
|
||||
for row, endtab in ipairs(rowends) do
|
||||
local first = true
|
||||
for tabno = starttab, endtab do
|
||||
local tab = tabs[tabno]
|
||||
tab:ClearAllPoints()
|
||||
if first then
|
||||
tab:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, -(hastitle and 14 or 7)-(row-1)*20 )
|
||||
first = false
|
||||
else
|
||||
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
|
||||
end
|
||||
end
|
||||
|
||||
-- equal padding for each tab to fill the available width,
|
||||
-- if the used space is above 75% already
|
||||
local padding = 0
|
||||
if not (numrows == 1 and rowwidths[1] < width*0.75) then
|
||||
padding = (width - rowwidths[row]) / (endtab - starttab+1)
|
||||
end
|
||||
|
||||
for i = starttab, endtab do
|
||||
PanelTemplates_TabResize(tabs[i], padding + 4, nil, width)
|
||||
end
|
||||
starttab = endtab + 1
|
||||
end
|
||||
|
||||
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
|
||||
self.border:SetPoint("TOPLEFT",self.frame,"TOPLEFT",1,-self.borderoffset)
|
||||
end
|
||||
|
||||
local function BuildTabsOnUpdate(this)
|
||||
BuildTabs(this.obj)
|
||||
this:SetScript("OnUpdate", nil)
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 60
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
BuildTabs(self)
|
||||
self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - (self.borderoffset + 23)
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
if self.noAutoHeight then return end
|
||||
self:SetHeight((height or 0) + (self.borderoffset + 23))
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame",nil,UIParent)
|
||||
local self = {}
|
||||
self.type = Type
|
||||
|
||||
self.num = AceGUI:GetNextWidgetNum(Type)
|
||||
|
||||
self.localstatus = {}
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
self.SetTitle = SetTitle
|
||||
self.CreateTab = CreateTab
|
||||
self.SelectTab = SelectTab
|
||||
self.BuildTabs = BuildTabs
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.SetTabs = SetTabs
|
||||
self.LayoutFinished = LayoutFinished
|
||||
self.frame = frame
|
||||
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
|
||||
frame.obj = self
|
||||
|
||||
frame:SetHeight(100)
|
||||
frame:SetWidth(100)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
self.alignoffset = 18
|
||||
|
||||
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
|
||||
titletext:SetPoint("TOPLEFT",frame,"TOPLEFT",14,0)
|
||||
titletext:SetPoint("TOPRIGHT",frame,"TOPRIGHT",-14,0)
|
||||
titletext:SetJustifyH("LEFT")
|
||||
titletext:SetHeight(18)
|
||||
titletext:SetText("")
|
||||
|
||||
self.titletext = titletext
|
||||
|
||||
local border = CreateFrame("Frame",nil,frame)
|
||||
self.border = border
|
||||
self.borderoffset = 27
|
||||
border:SetPoint("TOPLEFT",frame,"TOPLEFT",1,-27)
|
||||
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-1,3)
|
||||
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
border:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||
border:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
self.tabs = {}
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,border)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-7)
|
||||
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,7)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,746 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
|
||||
local math_min, math_max, floor = math.min, math.max, floor
|
||||
local select, tremove, unpack = select, table.remove, unpack
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
|
||||
|
||||
-- Recycling functions
|
||||
local new, del
|
||||
do
|
||||
local pool = setmetatable({},{__mode='k'})
|
||||
function new()
|
||||
local t = next(pool)
|
||||
if t then
|
||||
pool[t] = nil
|
||||
return t
|
||||
else
|
||||
return {}
|
||||
end
|
||||
end
|
||||
function del(t)
|
||||
for k in pairs(t) do
|
||||
t[k] = nil
|
||||
end
|
||||
pool[t] = true
|
||||
end
|
||||
end
|
||||
|
||||
--------------
|
||||
-- TreeView --
|
||||
--------------
|
||||
|
||||
do
|
||||
local Type = "TreeGroup"
|
||||
local Version = 23
|
||||
|
||||
local DEFAULT_TREE_WIDTH = 175
|
||||
local DEFAULT_TREE_SIZABLE = true
|
||||
|
||||
local PaneBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||
}
|
||||
|
||||
local DraggerBackdrop = {
|
||||
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||
edgeFile = nil,
|
||||
tile = true, tileSize = 16, edgeSize = 0,
|
||||
insets = { left = 3, right = 3, top = 7, bottom = 7 }
|
||||
}
|
||||
|
||||
local function OnAcquire(self)
|
||||
self:SetTreeWidth(DEFAULT_TREE_WIDTH,DEFAULT_TREE_SIZABLE)
|
||||
self:EnableButtonTooltips(true)
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
self.status = nil
|
||||
for k, v in pairs(self.localstatus) do
|
||||
if k == "groups" then
|
||||
for k2 in pairs(v) do
|
||||
v[k2] = nil
|
||||
end
|
||||
else
|
||||
self.localstatus[k] = nil
|
||||
end
|
||||
end
|
||||
self.localstatus.scrollvalue = 0
|
||||
self.localstatus.treewidth = DEFAULT_TREE_WIDTH
|
||||
self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
|
||||
end
|
||||
|
||||
local function GetButtonParents(line)
|
||||
local parent = line.parent
|
||||
if parent and parent.value then
|
||||
return parent.value, GetButtonParents(parent)
|
||||
end
|
||||
end
|
||||
|
||||
local function GetButtonUniqueValue(line)
|
||||
local parent = line.parent
|
||||
if parent and parent.value then
|
||||
return GetButtonUniqueValue(parent).."\001"..line.value
|
||||
else
|
||||
return line.value
|
||||
end
|
||||
end
|
||||
|
||||
local function ButtonOnClick(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnClick",this.uniquevalue, this.selected)
|
||||
if not this.selected then
|
||||
self:SetSelected(this.uniquevalue)
|
||||
this.selected = true
|
||||
this:LockHighlight()
|
||||
self:RefreshTree()
|
||||
end
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function ExpandOnClick(this)
|
||||
local button = this.button
|
||||
local self = button.obj
|
||||
local status = (self.status or self.localstatus).groups
|
||||
status[button.uniquevalue] = not status[button.uniquevalue]
|
||||
self:RefreshTree()
|
||||
end
|
||||
|
||||
local function ButtonOnDoubleClick(button)
|
||||
local self = button.obj
|
||||
local status = self.status or self.localstatus
|
||||
local status = (self.status or self.localstatus).groups
|
||||
status[button.uniquevalue] = not status[button.uniquevalue]
|
||||
self:RefreshTree()
|
||||
end
|
||||
|
||||
local function EnableButtonTooltips(self, enable)
|
||||
self.enabletooltips = enable
|
||||
end
|
||||
|
||||
local function Button_OnEnter(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnButtonEnter", this.uniquevalue, this)
|
||||
|
||||
if self.enabletooltips then
|
||||
GameTooltip:SetOwner(this, "ANCHOR_NONE")
|
||||
GameTooltip:SetPoint("LEFT",this,"RIGHT")
|
||||
GameTooltip:SetText(this.text:GetText() or "", 1, .82, 0, 1)
|
||||
|
||||
GameTooltip:Show()
|
||||
end
|
||||
end
|
||||
|
||||
local function Button_OnLeave(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnButtonLeave", this.uniquevalue, this)
|
||||
|
||||
if self.enabletooltips then
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local buttoncount = 1
|
||||
local function CreateButton(self)
|
||||
local button = CreateFrame("Button",("AceGUI30TreeButton%d"):format(buttoncount),self.treeframe, "OptionsListButtonTemplate")
|
||||
buttoncount = buttoncount + 1
|
||||
button.obj = self
|
||||
|
||||
local icon = button:CreateTexture(nil, "OVERLAY")
|
||||
icon:SetWidth(14)
|
||||
icon:SetHeight(14)
|
||||
button.icon = icon
|
||||
|
||||
button:SetScript("OnClick",ButtonOnClick)
|
||||
button:SetScript("OnDoubleClick", ButtonOnDoubleClick)
|
||||
button:SetScript("OnEnter",Button_OnEnter)
|
||||
button:SetScript("OnLeave",Button_OnLeave)
|
||||
|
||||
button.toggle.button = button
|
||||
button.toggle:SetScript("OnClick",ExpandOnClick)
|
||||
|
||||
return button
|
||||
end
|
||||
|
||||
local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
|
||||
local self = button.obj
|
||||
local toggle = button.toggle
|
||||
local frame = self.frame
|
||||
local text = treeline.text or ""
|
||||
local icon = treeline.icon
|
||||
local iconCoords = treeline.iconCoords
|
||||
local level = treeline.level
|
||||
local value = treeline.value
|
||||
local uniquevalue = treeline.uniquevalue
|
||||
local disabled = treeline.disabled
|
||||
|
||||
button.treeline = treeline
|
||||
button.value = value
|
||||
button.uniquevalue = uniquevalue
|
||||
if selected then
|
||||
button:LockHighlight()
|
||||
button.selected = true
|
||||
else
|
||||
button:UnlockHighlight()
|
||||
button.selected = false
|
||||
end
|
||||
local normalTexture = button:GetNormalTexture()
|
||||
local line = button.line
|
||||
button.level = level
|
||||
if ( level == 1 ) then
|
||||
button:SetNormalFontObject("GameFontNormal")
|
||||
button:SetHighlightFontObject("GameFontHighlight")
|
||||
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
|
||||
else
|
||||
button:SetNormalFontObject("GameFontHighlightSmall")
|
||||
button:SetHighlightFontObject("GameFontHighlightSmall")
|
||||
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
|
||||
end
|
||||
|
||||
if disabled then
|
||||
button:EnableMouse(false)
|
||||
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
|
||||
else
|
||||
button.text:SetText(text)
|
||||
button:EnableMouse(true)
|
||||
end
|
||||
|
||||
if icon then
|
||||
button.icon:SetTexture(icon)
|
||||
button.icon:SetPoint("LEFT", button, "LEFT", 8 * level, (level == 1) and 0 or 1)
|
||||
else
|
||||
button.icon:SetTexture(nil)
|
||||
end
|
||||
|
||||
if iconCoords then
|
||||
button.icon:SetTexCoord(unpack(iconCoords))
|
||||
else
|
||||
button.icon:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
|
||||
if canExpand then
|
||||
if not isExpanded then
|
||||
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
|
||||
toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
|
||||
else
|
||||
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
|
||||
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
|
||||
end
|
||||
toggle:Show()
|
||||
else
|
||||
toggle:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function OnScrollValueChanged(this, value)
|
||||
if this.obj.noupdate then return end
|
||||
local self = this.obj
|
||||
local status = self.status or self.localstatus
|
||||
status.scrollvalue = value
|
||||
self:RefreshTree()
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
-- called to set an external table to store status in
|
||||
local function SetStatusTable(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
if not status.groups then
|
||||
status.groups = {}
|
||||
end
|
||||
if not status.scrollvalue then
|
||||
status.scrollvalue = 0
|
||||
end
|
||||
if not status.treewidth then
|
||||
status.treewidth = DEFAULT_TREE_WIDTH
|
||||
end
|
||||
if not status.treesizable then
|
||||
status.treesizable = DEFAULT_TREE_SIZABLE
|
||||
end
|
||||
self:SetTreeWidth(status.treewidth,status.treesizable)
|
||||
self:RefreshTree()
|
||||
end
|
||||
|
||||
--sets the tree to be displayed
|
||||
--[[
|
||||
example tree
|
||||
|
||||
Alpha
|
||||
Bravo
|
||||
-Charlie
|
||||
-Delta
|
||||
-Echo
|
||||
Foxtrot
|
||||
|
||||
tree = {
|
||||
{
|
||||
value = "A",
|
||||
text = "Alpha"
|
||||
},
|
||||
{
|
||||
value = "B",
|
||||
text = "Bravo",
|
||||
children = {
|
||||
{
|
||||
value = "C",
|
||||
text = "Charlie"
|
||||
},
|
||||
{
|
||||
value = "D",
|
||||
text = "Delta"
|
||||
children = {
|
||||
{
|
||||
value = "E",
|
||||
text = "Echo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
value = "F",
|
||||
text = "Foxtrot"
|
||||
},
|
||||
}
|
||||
]]
|
||||
local function SetTree(self, tree, filter)
|
||||
self.filter = filter
|
||||
if tree then
|
||||
assert(type(tree) == "table")
|
||||
end
|
||||
self.tree = tree
|
||||
self:RefreshTree()
|
||||
end
|
||||
|
||||
local function ShouldDisplayLevel(tree)
|
||||
local result = false
|
||||
for k, v in ipairs(tree) do
|
||||
if v.children == nil and v.visible ~= false then
|
||||
result = true
|
||||
elseif v.children then
|
||||
result = result or ShouldDisplayLevel(v.children)
|
||||
end
|
||||
if result then return result end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function addLine(self, v, tree, level, parent)
|
||||
local line = new()
|
||||
line.value = v.value
|
||||
line.text = v.text
|
||||
line.icon = v.icon
|
||||
line.iconCoords = v.iconCoords
|
||||
line.disabled = v.disabled
|
||||
line.tree = tree
|
||||
line.level = level
|
||||
line.parent = parent
|
||||
line.visible = v.visible
|
||||
line.uniquevalue = GetButtonUniqueValue(line)
|
||||
if v.children then
|
||||
line.hasChildren = true
|
||||
else
|
||||
line.hasChildren = nil
|
||||
end
|
||||
self.lines[#self.lines+1] = line
|
||||
return line
|
||||
end
|
||||
|
||||
local function BuildLevel(self, tree, level, parent)
|
||||
local groups = (self.status or self.localstatus).groups
|
||||
local hasChildren = self.hasChildren
|
||||
|
||||
for i, v in ipairs(tree) do
|
||||
if v.children then
|
||||
if not self.filter or ShouldDisplayLevel(v.children) then
|
||||
local line = addLine(self, v, tree, level, parent)
|
||||
if groups[line.uniquevalue] then
|
||||
self:BuildLevel(v.children, level+1, line)
|
||||
end
|
||||
end
|
||||
elseif v.visible ~= false or not self.filter then
|
||||
addLine(self, v, tree, level, parent)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--fire an update after one frame to catch the treeframes height
|
||||
local function FirstFrameUpdate(this)
|
||||
local self = this.obj
|
||||
this:SetScript("OnUpdate",nil)
|
||||
self:RefreshTree()
|
||||
end
|
||||
|
||||
local function ResizeUpdate(this)
|
||||
this.obj:RefreshTree()
|
||||
end
|
||||
|
||||
local function RefreshTree(self)
|
||||
local buttons = self.buttons
|
||||
local lines = self.lines
|
||||
|
||||
for i, v in ipairs(buttons) do
|
||||
v:Hide()
|
||||
end
|
||||
while lines[1] do
|
||||
local t = tremove(lines)
|
||||
for k in pairs(t) do
|
||||
t[k] = nil
|
||||
end
|
||||
del(t)
|
||||
end
|
||||
|
||||
if not self.tree then return end
|
||||
--Build the list of visible entries from the tree and status tables
|
||||
local status = self.status or self.localstatus
|
||||
local groupstatus = status.groups
|
||||
local tree = self.tree
|
||||
|
||||
local treeframe = self.treeframe
|
||||
|
||||
self:BuildLevel(tree, 1)
|
||||
|
||||
local numlines = #lines
|
||||
|
||||
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
|
||||
|
||||
local first, last
|
||||
|
||||
if numlines <= maxlines then
|
||||
--the whole tree fits in the frame
|
||||
status.scrollvalue = 0
|
||||
self:ShowScroll(false)
|
||||
first, last = 1, numlines
|
||||
else
|
||||
self:ShowScroll(true)
|
||||
--scrolling will be needed
|
||||
self.noupdate = true
|
||||
self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
|
||||
--check if we are scrolled down too far
|
||||
if numlines - status.scrollvalue < maxlines then
|
||||
status.scrollvalue = numlines - maxlines
|
||||
self.scrollbar:SetValue(status.scrollvalue)
|
||||
end
|
||||
self.noupdate = nil
|
||||
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
|
||||
end
|
||||
|
||||
local buttonnum = 1
|
||||
for i = first, last do
|
||||
local line = lines[i]
|
||||
local button = buttons[buttonnum]
|
||||
if not button then
|
||||
button = self:CreateButton()
|
||||
|
||||
buttons[buttonnum] = button
|
||||
button:SetParent(treeframe)
|
||||
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
|
||||
button:ClearAllPoints()
|
||||
if i == 1 then
|
||||
if self.showscroll then
|
||||
button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
|
||||
button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
|
||||
else
|
||||
button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
|
||||
button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
|
||||
end
|
||||
else
|
||||
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
|
||||
button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
|
||||
end
|
||||
end
|
||||
|
||||
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
|
||||
button:Show()
|
||||
buttonnum = buttonnum + 1
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function SetSelected(self, value)
|
||||
local status = self.status or self.localstatus
|
||||
if status.selected ~= value then
|
||||
status.selected = value
|
||||
self:Fire("OnGroupSelected", value)
|
||||
end
|
||||
end
|
||||
|
||||
local function BuildUniqueValue(...)
|
||||
local n = select('#', ...)
|
||||
if n == 1 then
|
||||
return ...
|
||||
else
|
||||
return (...).."\001"..BuildUniqueValue(select(2,...))
|
||||
end
|
||||
end
|
||||
|
||||
local function Select(self, uniquevalue, ...)
|
||||
self.filter = false
|
||||
local status = self.status or self.localstatus
|
||||
local groups = status.groups
|
||||
for i = 1, select('#', ...) do
|
||||
groups[BuildUniqueValue(select(i, ...))] = true
|
||||
end
|
||||
status.selected = uniquevalue
|
||||
self:RefreshTree()
|
||||
self:Fire("OnGroupSelected", uniquevalue)
|
||||
end
|
||||
|
||||
local function SelectByPath(self, ...)
|
||||
self:Select(BuildUniqueValue(...), ...)
|
||||
end
|
||||
|
||||
--Selects a tree node by UniqueValue
|
||||
local function SelectByValue(self, uniquevalue)
|
||||
self:Select(uniquevalue, ("\001"):split(uniquevalue))
|
||||
end
|
||||
|
||||
|
||||
local function ShowScroll(self, show)
|
||||
self.showscroll = show
|
||||
if show then
|
||||
self.scrollbar:Show()
|
||||
if self.buttons[1] then
|
||||
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
|
||||
end
|
||||
else
|
||||
self.scrollbar:Hide()
|
||||
if self.buttons[1] then
|
||||
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
local treeframe = self.treeframe
|
||||
local status = self.status or self.localstatus
|
||||
status.fullwidth = width
|
||||
|
||||
local contentwidth = width - status.treewidth - 20
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
|
||||
local maxtreewidth = math_min(400, width - 50)
|
||||
|
||||
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
|
||||
self:SetTreeWidth(maxtreewidth, status.treesizable)
|
||||
end
|
||||
treeframe:SetMaxResize(maxtreewidth,1600)
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 20
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end
|
||||
|
||||
|
||||
local function TreeOnMouseWheel(this, delta)
|
||||
local self = this.obj
|
||||
if self.showscroll then
|
||||
local scrollbar = self.scrollbar
|
||||
local min, max = scrollbar:GetMinMaxValues()
|
||||
local value = scrollbar:GetValue()
|
||||
local newvalue = math_min(max,math_max(min,value - delta))
|
||||
if value ~= newvalue then
|
||||
scrollbar:SetValue(newvalue)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function SetTreeWidth(self, treewidth, resizable)
|
||||
if not resizable then
|
||||
if type(treewidth) == 'number' then
|
||||
resizable = false
|
||||
elseif type(treewidth) == 'boolean' then
|
||||
resizable = treewidth
|
||||
treewidth = DEFAULT_TREE_WIDTH
|
||||
else
|
||||
resizable = false
|
||||
treewidth = DEFAULT_TREE_WIDTH
|
||||
end
|
||||
end
|
||||
self.treeframe:SetWidth(treewidth)
|
||||
self.dragger:EnableMouse(resizable)
|
||||
|
||||
local status = self.status or self.localstatus
|
||||
status.treewidth = treewidth
|
||||
status.treesizable = resizable
|
||||
|
||||
-- recalculate the content width
|
||||
if status.fullwidth then
|
||||
self:OnWidthSet(status.fullwidth)
|
||||
end
|
||||
end
|
||||
|
||||
local function draggerLeave(this)
|
||||
this:SetBackdropColor(1, 1, 1, 0)
|
||||
end
|
||||
|
||||
local function draggerEnter(this)
|
||||
this:SetBackdropColor(1, 1, 1, 0.8)
|
||||
end
|
||||
|
||||
local function draggerDown(this)
|
||||
local treeframe = this:GetParent()
|
||||
treeframe:StartSizing("RIGHT")
|
||||
end
|
||||
|
||||
local function draggerUp(this)
|
||||
local treeframe = this:GetParent()
|
||||
local self = treeframe.obj
|
||||
local frame = treeframe:GetParent()
|
||||
treeframe:StopMovingOrSizing()
|
||||
--treeframe:SetScript("OnUpdate", nil)
|
||||
treeframe:SetUserPlaced(false)
|
||||
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
|
||||
treeframe:SetHeight(0)
|
||||
treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||
treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
|
||||
|
||||
local status = self.status or self.localstatus
|
||||
status.treewidth = treeframe:GetWidth()
|
||||
|
||||
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
|
||||
-- recalculate the content width
|
||||
treeframe.obj:OnWidthSet(status.fullwidth)
|
||||
-- update the layout of the content
|
||||
treeframe.obj:DoLayout()
|
||||
end
|
||||
|
||||
local function LayoutFinished(self, width, height)
|
||||
if self.noAutoHeight then return end
|
||||
self:SetHeight((height or 0) + 20)
|
||||
end
|
||||
|
||||
local createdcount = 0
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame",nil,UIParent)
|
||||
local self = {}
|
||||
self.type = Type
|
||||
self.lines = {}
|
||||
self.levels = {}
|
||||
self.buttons = {}
|
||||
self.hasChildren = {}
|
||||
self.localstatus = {}
|
||||
self.localstatus.groups = {}
|
||||
self.filter = false
|
||||
|
||||
local treeframe = CreateFrame("Frame",nil,frame)
|
||||
treeframe.obj = self
|
||||
treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||
treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
|
||||
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
|
||||
treeframe:SetScript("OnUpdate",FirstFrameUpdate)
|
||||
treeframe:SetScript("OnSizeChanged",ResizeUpdate)
|
||||
|
||||
treeframe:EnableMouseWheel(true)
|
||||
treeframe:SetScript("OnMouseWheel", TreeOnMouseWheel)
|
||||
treeframe:SetBackdrop(PaneBackdrop)
|
||||
treeframe:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||
treeframe:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
treeframe:SetResizable(true)
|
||||
treeframe:SetMinResize(100, 1)
|
||||
treeframe:SetMaxResize(400,1600)
|
||||
local dragger = CreateFrame("Frame", nil, treeframe)
|
||||
dragger:SetWidth(8)
|
||||
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
|
||||
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
|
||||
dragger:SetBackdrop(DraggerBackdrop)
|
||||
dragger:SetBackdropColor(1, 1, 1, 0)
|
||||
dragger:SetScript("OnMouseDown", draggerDown)
|
||||
dragger:SetScript("OnMouseUp", draggerUp)
|
||||
dragger:SetScript("OnEnter", draggerEnter)
|
||||
dragger:SetScript("OnLeave", draggerLeave)
|
||||
|
||||
self.dragger = dragger
|
||||
self.treeframe = treeframe
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
|
||||
self.SetTree = SetTree
|
||||
self.SetTreeWidth = SetTreeWidth
|
||||
self.RefreshTree = RefreshTree
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.BuildLevel = BuildLevel
|
||||
self.CreateButton = CreateButton
|
||||
self.SetSelected = SetSelected
|
||||
self.ShowScroll = ShowScroll
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.Select = Select
|
||||
self.SelectByValue = SelectByValue
|
||||
self.SelectByPath = SelectByPath
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
self.EnableButtonTooltips = EnableButtonTooltips
|
||||
--self.Filter = Filter
|
||||
self.LayoutFinished = LayoutFinished
|
||||
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
|
||||
createdcount = createdcount + 1
|
||||
local scrollbar = CreateFrame("Slider",("AceConfigDialogTreeGroup%dScrollBar"):format(createdcount),treeframe,"UIPanelScrollBarTemplate")
|
||||
self.scrollbar = scrollbar
|
||||
local scrollbg = scrollbar:CreateTexture(nil,"BACKGROUND")
|
||||
scrollbg:SetAllPoints(scrollbar)
|
||||
scrollbg:SetTexture(0,0,0,0.4)
|
||||
scrollbar.obj = self
|
||||
self.noupdate = true
|
||||
scrollbar:SetPoint("TOPRIGHT",treeframe,"TOPRIGHT",-10,-26)
|
||||
scrollbar:SetPoint("BOTTOMRIGHT",treeframe,"BOTTOMRIGHT",-10,26)
|
||||
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
|
||||
scrollbar:SetMinMaxValues(0,0)
|
||||
self.localstatus.scrollvalue = 0
|
||||
scrollbar:SetValueStep(1)
|
||||
scrollbar:SetValue(0)
|
||||
scrollbar:SetWidth(16)
|
||||
self.noupdate = nil
|
||||
|
||||
local border = CreateFrame("Frame",nil,frame)
|
||||
self.border = border
|
||||
border:SetPoint("TOPLEFT",treeframe,"TOPRIGHT", 0,0)
|
||||
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
|
||||
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
border:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||
border:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,border)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
|
||||
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
--AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,331 @@
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local pairs, assert, type = pairs, assert, type
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: GameFontNormal
|
||||
|
||||
----------------
|
||||
-- Main Frame --
|
||||
----------------
|
||||
--[[
|
||||
Events :
|
||||
OnClose
|
||||
|
||||
]]
|
||||
do
|
||||
local Type = "Window"
|
||||
local Version = 4
|
||||
|
||||
local function frameOnClose(this)
|
||||
this.obj:Fire("OnClose")
|
||||
end
|
||||
|
||||
local function closeOnClick(this)
|
||||
PlaySound("gsTitleOptionExit")
|
||||
this.obj:Hide()
|
||||
end
|
||||
|
||||
local function frameOnMouseDown(this)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function titleOnMouseDown(this)
|
||||
this:GetParent():StartMoving()
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function frameOnMouseUp(this)
|
||||
local frame = this:GetParent()
|
||||
frame:StopMovingOrSizing()
|
||||
local self = frame.obj
|
||||
local status = self.status or self.localstatus
|
||||
status.width = frame:GetWidth()
|
||||
status.height = frame:GetHeight()
|
||||
status.top = frame:GetTop()
|
||||
status.left = frame:GetLeft()
|
||||
end
|
||||
|
||||
local function sizerseOnMouseDown(this)
|
||||
this:GetParent():StartSizing("BOTTOMRIGHT")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function sizersOnMouseDown(this)
|
||||
this:GetParent():StartSizing("BOTTOM")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function sizereOnMouseDown(this)
|
||||
this:GetParent():StartSizing("RIGHT")
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function sizerOnMouseUp(this)
|
||||
this:GetParent():StopMovingOrSizing()
|
||||
end
|
||||
|
||||
local function SetTitle(self,title)
|
||||
self.titletext:SetText(title)
|
||||
end
|
||||
|
||||
local function SetStatusText(self,text)
|
||||
-- self.statustext:SetText(text)
|
||||
end
|
||||
|
||||
local function Hide(self)
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
local function Show(self)
|
||||
self.frame:Show()
|
||||
end
|
||||
|
||||
local function OnAcquire(self)
|
||||
self.frame:SetParent(UIParent)
|
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
self:ApplyStatus()
|
||||
self:EnableResize(true)
|
||||
self:Show()
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
self.status = nil
|
||||
for k in pairs(self.localstatus) do
|
||||
self.localstatus[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- called to set an external table to store status in
|
||||
local function SetStatusTable(self, status)
|
||||
assert(type(status) == "table")
|
||||
self.status = status
|
||||
self:ApplyStatus()
|
||||
end
|
||||
|
||||
local function ApplyStatus(self)
|
||||
local status = self.status or self.localstatus
|
||||
local frame = self.frame
|
||||
self:SetWidth(status.width or 700)
|
||||
self:SetHeight(status.height or 500)
|
||||
if status.top and status.left then
|
||||
frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
|
||||
frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
|
||||
else
|
||||
frame:SetPoint("CENTER",UIParent,"CENTER")
|
||||
end
|
||||
end
|
||||
|
||||
local function OnWidthSet(self, width)
|
||||
local content = self.content
|
||||
local contentwidth = width - 34
|
||||
if contentwidth < 0 then
|
||||
contentwidth = 0
|
||||
end
|
||||
content:SetWidth(contentwidth)
|
||||
content.width = contentwidth
|
||||
end
|
||||
|
||||
|
||||
local function OnHeightSet(self, height)
|
||||
local content = self.content
|
||||
local contentheight = height - 57
|
||||
if contentheight < 0 then
|
||||
contentheight = 0
|
||||
end
|
||||
content:SetHeight(contentheight)
|
||||
content.height = contentheight
|
||||
end
|
||||
|
||||
local function EnableResize(self, state)
|
||||
local func = state and "Show" or "Hide"
|
||||
self.sizer_se[func](self.sizer_se)
|
||||
self.sizer_s[func](self.sizer_s)
|
||||
self.sizer_e[func](self.sizer_e)
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame",nil,UIParent)
|
||||
local self = {}
|
||||
self.type = "Window"
|
||||
|
||||
self.Hide = Hide
|
||||
self.Show = Show
|
||||
self.SetTitle = SetTitle
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
self.SetStatusText = SetStatusText
|
||||
self.SetStatusTable = SetStatusTable
|
||||
self.ApplyStatus = ApplyStatus
|
||||
self.OnWidthSet = OnWidthSet
|
||||
self.OnHeightSet = OnHeightSet
|
||||
self.EnableResize = EnableResize
|
||||
|
||||
self.localstatus = {}
|
||||
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
frame:SetWidth(700)
|
||||
frame:SetHeight(500)
|
||||
frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
|
||||
frame:EnableMouse()
|
||||
frame:SetMovable(true)
|
||||
frame:SetResizable(true)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
frame:SetScript("OnMouseDown", frameOnMouseDown)
|
||||
|
||||
frame:SetScript("OnHide",frameOnClose)
|
||||
frame:SetMinResize(240,240)
|
||||
frame:SetToplevel(true)
|
||||
|
||||
local titlebg = frame:CreateTexture(nil, "BACKGROUND")
|
||||
titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
|
||||
titlebg:SetPoint("TOPLEFT", 9, -6)
|
||||
titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
|
||||
|
||||
local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
|
||||
dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
|
||||
dialogbg:SetPoint("TOPLEFT", 8, -24)
|
||||
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
|
||||
dialogbg:SetVertexColor(0, 0, 0, .75)
|
||||
|
||||
local topleft = frame:CreateTexture(nil, "BORDER")
|
||||
topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
topleft:SetWidth(64)
|
||||
topleft:SetHeight(64)
|
||||
topleft:SetPoint("TOPLEFT")
|
||||
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
|
||||
|
||||
local topright = frame:CreateTexture(nil, "BORDER")
|
||||
topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
topright:SetWidth(64)
|
||||
topright:SetHeight(64)
|
||||
topright:SetPoint("TOPRIGHT")
|
||||
topright:SetTexCoord(0.625, 0.75, 0, 1)
|
||||
|
||||
local top = frame:CreateTexture(nil, "BORDER")
|
||||
top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
top:SetHeight(64)
|
||||
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
|
||||
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
|
||||
top:SetTexCoord(0.25, 0.369140625, 0, 1)
|
||||
|
||||
local bottomleft = frame:CreateTexture(nil, "BORDER")
|
||||
bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
bottomleft:SetWidth(64)
|
||||
bottomleft:SetHeight(64)
|
||||
bottomleft:SetPoint("BOTTOMLEFT")
|
||||
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
|
||||
|
||||
local bottomright = frame:CreateTexture(nil, "BORDER")
|
||||
bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
bottomright:SetWidth(64)
|
||||
bottomright:SetHeight(64)
|
||||
bottomright:SetPoint("BOTTOMRIGHT")
|
||||
bottomright:SetTexCoord(0.875, 1, 0, 1)
|
||||
|
||||
local bottom = frame:CreateTexture(nil, "BORDER")
|
||||
bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
bottom:SetHeight(64)
|
||||
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
|
||||
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
|
||||
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
|
||||
|
||||
local left = frame:CreateTexture(nil, "BORDER")
|
||||
left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
left:SetWidth(64)
|
||||
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
|
||||
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
|
||||
left:SetTexCoord(0.001953125, 0.125, 0, 1)
|
||||
|
||||
local right = frame:CreateTexture(nil, "BORDER")
|
||||
right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||
right:SetWidth(64)
|
||||
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
|
||||
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
|
||||
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
|
||||
|
||||
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
|
||||
close:SetPoint("TOPRIGHT", 2, 1)
|
||||
close:SetScript("OnClick", closeOnClick)
|
||||
self.closebutton = close
|
||||
close.obj = self
|
||||
|
||||
local titletext = frame:CreateFontString(nil, "ARTWORK")
|
||||
titletext:SetFontObject(GameFontNormal)
|
||||
titletext:SetPoint("TOPLEFT", 12, -8)
|
||||
titletext:SetPoint("TOPRIGHT", -32, -8)
|
||||
self.titletext = titletext
|
||||
|
||||
local title = CreateFrame("Button", nil, frame)
|
||||
title:SetPoint("TOPLEFT", titlebg)
|
||||
title:SetPoint("BOTTOMRIGHT", titlebg)
|
||||
title:EnableMouse()
|
||||
title:SetScript("OnMouseDown",titleOnMouseDown)
|
||||
title:SetScript("OnMouseUp", frameOnMouseUp)
|
||||
self.title = title
|
||||
|
||||
local sizer_se = CreateFrame("Frame",nil,frame)
|
||||
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
|
||||
sizer_se:SetWidth(25)
|
||||
sizer_se:SetHeight(25)
|
||||
sizer_se:EnableMouse()
|
||||
sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
|
||||
sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||
self.sizer_se = sizer_se
|
||||
|
||||
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||
self.line1 = line1
|
||||
line1:SetWidth(14)
|
||||
line1:SetHeight(14)
|
||||
line1:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
local x = 0.1 * 14/17
|
||||
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||
|
||||
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||
self.line2 = line2
|
||||
line2:SetWidth(8)
|
||||
line2:SetHeight(8)
|
||||
line2:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
local x = 0.1 * 8/17
|
||||
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||
|
||||
local sizer_s = CreateFrame("Frame",nil,frame)
|
||||
sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
|
||||
sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
|
||||
sizer_s:SetHeight(25)
|
||||
sizer_s:EnableMouse()
|
||||
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
|
||||
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||
self.sizer_s = sizer_s
|
||||
|
||||
local sizer_e = CreateFrame("Frame",nil,frame)
|
||||
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
|
||||
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
|
||||
sizer_e:SetWidth(25)
|
||||
sizer_e:EnableMouse()
|
||||
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
|
||||
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||
self.sizer_e = sizer_e
|
||||
|
||||
--Container Support
|
||||
local content = CreateFrame("Frame",nil,frame)
|
||||
self.content = content
|
||||
content.obj = self
|
||||
content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
|
||||
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
|
||||
|
||||
AceGUI:RegisterAsContainer(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
end
|
||||
@@ -0,0 +1,92 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Button Widget
|
||||
Graphical Button.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Button", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local _G = _G
|
||||
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Button_OnClick(frame, ...)
|
||||
PlaySound("igMainMenuOption")
|
||||
frame.obj:Fire("OnClick", ...)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
-- restore default values
|
||||
self:SetHeight(24)
|
||||
self:SetWidth(200)
|
||||
self:SetDisabled(false)
|
||||
self:SetText()
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetText"] = function(self, text)
|
||||
self.text:SetText(text)
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.frame:Disable()
|
||||
else
|
||||
self.frame:Enable()
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
|
||||
local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate2")
|
||||
frame:Hide()
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnClick", Button_OnClick)
|
||||
frame:SetScript("OnEnter", Control_OnEnter)
|
||||
frame:SetScript("OnLeave", Control_OnLeave)
|
||||
|
||||
local text = frame:GetFontString()
|
||||
text:ClearAllPoints()
|
||||
text:SetPoint("TOPLEFT", 15, -1)
|
||||
text:SetPoint("BOTTOMRIGHT", -15, 1)
|
||||
text:SetJustifyV("MIDDLE")
|
||||
|
||||
local widget = {
|
||||
text = text,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,289 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Checkbox Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "CheckBox", 21
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local select, pairs = select, pairs
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: SetDesaturation, GameFontHighlight
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function AlignImage(self)
|
||||
local img = self.image:GetTexture()
|
||||
self.text:ClearAllPoints()
|
||||
if not img then
|
||||
self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
|
||||
self.text:SetPoint("RIGHT")
|
||||
else
|
||||
self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
|
||||
self.text:SetPoint("RIGHT")
|
||||
end
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function CheckBox_OnMouseDown(frame)
|
||||
local self = frame.obj
|
||||
if not self.disabled then
|
||||
if self.image:GetTexture() then
|
||||
self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
|
||||
else
|
||||
self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
|
||||
end
|
||||
end
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function CheckBox_OnMouseUp(frame)
|
||||
local self = frame.obj
|
||||
if not self.disabled then
|
||||
self:ToggleChecked()
|
||||
|
||||
if self.checked then
|
||||
PlaySound("igMainMenuOptionCheckBoxOn")
|
||||
else -- for both nil and false (tristate)
|
||||
PlaySound("igMainMenuOptionCheckBoxOff")
|
||||
end
|
||||
|
||||
self:Fire("OnValueChanged", self.checked)
|
||||
AlignImage(self)
|
||||
end
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetType()
|
||||
self:SetValue(false)
|
||||
self:SetTriState(nil)
|
||||
-- height is calculated from the width and required space for the description
|
||||
self:SetWidth(200)
|
||||
self:SetImage()
|
||||
self:SetDisabled(nil)
|
||||
self:SetDescription(nil)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["OnWidthSet"] = function(self, width)
|
||||
if self.desc then
|
||||
self.desc:SetWidth(width - 30)
|
||||
if self.desc:GetText() and self.desc:GetText() ~= "" then
|
||||
self:SetHeight(28 + self.desc:GetHeight())
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.frame:Disable()
|
||||
self.text:SetTextColor(0.5, 0.5, 0.5)
|
||||
SetDesaturation(self.check, true)
|
||||
else
|
||||
self.frame:Enable()
|
||||
self.text:SetTextColor(1, 1, 1)
|
||||
if self.tristate and self.checked == nil then
|
||||
SetDesaturation(self.check, true)
|
||||
else
|
||||
SetDesaturation(self.check, false)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
["SetValue"] = function(self,value)
|
||||
local check = self.check
|
||||
self.checked = value
|
||||
if value then
|
||||
SetDesaturation(self.check, false)
|
||||
self.check:Show()
|
||||
else
|
||||
--Nil is the unknown tristate value
|
||||
if self.tristate and value == nil then
|
||||
SetDesaturation(self.check, true)
|
||||
self.check:Show()
|
||||
else
|
||||
SetDesaturation(self.check, false)
|
||||
self.check:Hide()
|
||||
end
|
||||
end
|
||||
self:SetDisabled(self.disabled)
|
||||
end,
|
||||
|
||||
["GetValue"] = function(self)
|
||||
return self.checked
|
||||
end,
|
||||
|
||||
["SetTriState"] = function(self, enabled)
|
||||
self.tristate = enabled
|
||||
self:SetValue(self:GetValue())
|
||||
end,
|
||||
|
||||
["SetType"] = function(self, type)
|
||||
local checkbg = self.checkbg
|
||||
local check = self.check
|
||||
local highlight = self.highlight
|
||||
|
||||
local size
|
||||
if type == "radio" then
|
||||
size = 16
|
||||
checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||
checkbg:SetTexCoord(0, 0.25, 0, 1)
|
||||
check:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||
check:SetTexCoord(0.25, 0.5, 0, 1)
|
||||
check:SetBlendMode("ADD")
|
||||
highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||
highlight:SetTexCoord(0.5, 0.75, 0, 1)
|
||||
else
|
||||
size = 24
|
||||
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
||||
checkbg:SetTexCoord(0, 1, 0, 1)
|
||||
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||
check:SetTexCoord(0, 1, 0, 1)
|
||||
check:SetBlendMode("BLEND")
|
||||
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
||||
highlight:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
checkbg:SetHeight(size)
|
||||
checkbg:SetWidth(size)
|
||||
end,
|
||||
|
||||
["ToggleChecked"] = function(self)
|
||||
local value = self:GetValue()
|
||||
if self.tristate then
|
||||
--cycle in true, nil, false order
|
||||
if value then
|
||||
self:SetValue(nil)
|
||||
elseif value == nil then
|
||||
self:SetValue(false)
|
||||
else
|
||||
self:SetValue(true)
|
||||
end
|
||||
else
|
||||
self:SetValue(not self:GetValue())
|
||||
end
|
||||
end,
|
||||
|
||||
["SetLabel"] = function(self, label)
|
||||
self.text:SetText(label)
|
||||
end,
|
||||
|
||||
["SetDescription"] = function(self, desc)
|
||||
if desc then
|
||||
if not self.desc then
|
||||
local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||
desc:ClearAllPoints()
|
||||
desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
|
||||
desc:SetWidth(self.frame.width - 30)
|
||||
desc:SetJustifyH("LEFT")
|
||||
desc:SetJustifyV("TOP")
|
||||
self.desc = desc
|
||||
end
|
||||
self.desc:Show()
|
||||
--self.text:SetFontObject(GameFontNormal)
|
||||
self.desc:SetText(desc)
|
||||
self:SetHeight(28 + self.desc:GetHeight())
|
||||
else
|
||||
if self.desc then
|
||||
self.desc:SetText("")
|
||||
self.desc:Hide()
|
||||
end
|
||||
--self.text:SetFontObject(GameFontHighlight)
|
||||
self:SetHeight(24)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetImage"] = function(self, path, ...)
|
||||
local image = self.image
|
||||
image:SetTexture(path)
|
||||
|
||||
if image:GetTexture() then
|
||||
local n = select("#", ...)
|
||||
if n == 4 or n == 8 then
|
||||
image:SetTexCoord(...)
|
||||
else
|
||||
image:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
end
|
||||
AlignImage(self)
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Button", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnEnter", Control_OnEnter)
|
||||
frame:SetScript("OnLeave", Control_OnLeave)
|
||||
frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
|
||||
frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
|
||||
|
||||
local checkbg = frame:CreateTexture(nil, "ARTWORK")
|
||||
checkbg:SetWidth(24)
|
||||
checkbg:SetHeight(24)
|
||||
checkbg:SetPoint("TOPLEFT")
|
||||
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
||||
|
||||
local check = frame:CreateTexture(nil, "OVERLAY")
|
||||
check:SetAllPoints(checkbg)
|
||||
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||
|
||||
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
|
||||
text:SetJustifyH("LEFT")
|
||||
text:SetHeight(18)
|
||||
text:SetPoint("LEFT", checkbg, "RIGHT")
|
||||
text:SetPoint("RIGHT")
|
||||
|
||||
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
||||
highlight:SetBlendMode("ADD")
|
||||
highlight:SetAllPoints(checkbg)
|
||||
|
||||
local image = frame:CreateTexture(nil, "OVERLAY")
|
||||
image:SetHeight(16)
|
||||
image:SetWidth(16)
|
||||
image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
|
||||
|
||||
local widget = {
|
||||
checkbg = checkbg,
|
||||
check = check,
|
||||
text = text,
|
||||
highlight = highlight,
|
||||
image = image,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,186 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
ColorPicker Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "ColorPicker", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function ColorCallback(self, r, g, b, a, isAlpha)
|
||||
if not self.HasAlpha then
|
||||
a = 1
|
||||
end
|
||||
self:SetColor(r, g, b, a)
|
||||
if ColorPickerFrame:IsVisible() then
|
||||
--colorpicker is still open
|
||||
self:Fire("OnValueChanged", r, g, b, a)
|
||||
else
|
||||
--colorpicker is closed, color callback is first, ignore it,
|
||||
--alpha callback is the final call after it closes so confirm now
|
||||
if isAlpha then
|
||||
self:Fire("OnValueConfirmed", r, g, b, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function ColorSwatch_OnClick(frame)
|
||||
HideUIPanel(ColorPickerFrame)
|
||||
local self = frame.obj
|
||||
if not self.disabled then
|
||||
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
ColorPickerFrame.func = function()
|
||||
local r, g, b = ColorPickerFrame:GetColorRGB()
|
||||
local a = 1 - OpacitySliderFrame:GetValue()
|
||||
ColorCallback(self, r, g, b, a)
|
||||
end
|
||||
|
||||
ColorPickerFrame.hasOpacity = self.HasAlpha
|
||||
ColorPickerFrame.opacityFunc = function()
|
||||
local r, g, b = ColorPickerFrame:GetColorRGB()
|
||||
local a = 1 - OpacitySliderFrame:GetValue()
|
||||
ColorCallback(self, r, g, b, a, true)
|
||||
end
|
||||
|
||||
local r, g, b, a = self.r, self.g, self.b, self.a
|
||||
if self.HasAlpha then
|
||||
ColorPickerFrame.opacity = 1 - (a or 0)
|
||||
end
|
||||
ColorPickerFrame:SetColorRGB(r, g, b)
|
||||
|
||||
ColorPickerFrame.cancelFunc = function()
|
||||
ColorCallback(self, r, g, b, a, true)
|
||||
end
|
||||
|
||||
ShowUIPanel(ColorPickerFrame)
|
||||
end
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetHeight(24)
|
||||
self:SetWidth(200)
|
||||
self:SetHasAlpha(false)
|
||||
self:SetColor(0, 0, 0, 1)
|
||||
self:SetDisabled(nil)
|
||||
self:SetLabel(nil)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetLabel"] = function(self, text)
|
||||
self.text:SetText(text)
|
||||
end,
|
||||
|
||||
["SetColor"] = function(self, r, g, b, a)
|
||||
self.r = r
|
||||
self.g = g
|
||||
self.b = b
|
||||
self.a = a or 1
|
||||
self.colorSwatch:SetVertexColor(r, g, b, a)
|
||||
end,
|
||||
|
||||
["SetHasAlpha"] = function(self, HasAlpha)
|
||||
self.HasAlpha = HasAlpha
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if self.disabled then
|
||||
self.frame:Disable()
|
||||
self.text:SetTextColor(0.5, 0.5, 0.5)
|
||||
else
|
||||
self.frame:Enable()
|
||||
self.text:SetTextColor(1, 1, 1)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Button", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnEnter", Control_OnEnter)
|
||||
frame:SetScript("OnLeave", Control_OnLeave)
|
||||
frame:SetScript("OnClick", ColorSwatch_OnClick)
|
||||
|
||||
local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
|
||||
colorSwatch:SetWidth(19)
|
||||
colorSwatch:SetHeight(19)
|
||||
colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
|
||||
colorSwatch:SetPoint("LEFT")
|
||||
|
||||
local texture = frame:CreateTexture(nil, "BACKGROUND")
|
||||
texture:SetWidth(16)
|
||||
texture:SetHeight(16)
|
||||
texture:SetTexture(1, 1, 1)
|
||||
texture:SetPoint("CENTER", colorSwatch)
|
||||
texture:Show()
|
||||
|
||||
local checkers = frame:CreateTexture(nil, "BACKGROUND")
|
||||
checkers:SetWidth(14)
|
||||
checkers:SetHeight(14)
|
||||
checkers:SetTexture("Tileset\\Generic\\Checkers")
|
||||
checkers:SetTexCoord(.25, 0, 0.5, .25)
|
||||
checkers:SetDesaturated(true)
|
||||
checkers:SetVertexColor(1, 1, 1, 0.75)
|
||||
checkers:SetPoint("CENTER", colorSwatch)
|
||||
checkers:Show()
|
||||
|
||||
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
|
||||
text:SetHeight(24)
|
||||
text:SetJustifyH("LEFT")
|
||||
text:SetTextColor(1, 1, 1)
|
||||
text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
|
||||
text:SetPoint("RIGHT")
|
||||
|
||||
--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||
--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||
--highlight:SetBlendMode("ADD")
|
||||
--highlight:SetAllPoints(frame)
|
||||
|
||||
local widget = {
|
||||
colorSwatch = colorSwatch,
|
||||
text = text,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,465 @@
|
||||
--[[ $Id: AceGUIWidget-DropDown-Items.lua 916 2010-03-15 12:24:36Z nevcairiel $ ]]--
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local select, assert = select, assert
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame = CreateFrame
|
||||
|
||||
local function fixlevels(parent,...)
|
||||
local i = 1
|
||||
local child = select(i, ...)
|
||||
while child do
|
||||
child:SetFrameLevel(parent:GetFrameLevel()+1)
|
||||
fixlevels(child, child:GetChildren())
|
||||
i = i + 1
|
||||
child = select(i, ...)
|
||||
end
|
||||
end
|
||||
|
||||
local function fixstrata(strata, parent, ...)
|
||||
local i = 1
|
||||
local child = select(i, ...)
|
||||
parent:SetFrameStrata(strata)
|
||||
while child do
|
||||
fixstrata(strata, child, child:GetChildren())
|
||||
i = i + 1
|
||||
child = select(i, ...)
|
||||
end
|
||||
end
|
||||
|
||||
-- ItemBase is the base "class" for all dropdown items.
|
||||
-- Each item has to use ItemBase.Create(widgetType) to
|
||||
-- create an initial 'self' value.
|
||||
-- ItemBase will add common functions and ui event handlers.
|
||||
-- Be sure to keep basic usage when you override functions.
|
||||
|
||||
local ItemBase = {
|
||||
-- NOTE: The ItemBase version is added to each item's version number
|
||||
-- to ensure proper updates on ItemBase changes.
|
||||
-- Use at least 1000er steps.
|
||||
version = 1000,
|
||||
counter = 0,
|
||||
}
|
||||
|
||||
function ItemBase.Frame_OnEnter(this)
|
||||
local self = this.obj
|
||||
|
||||
if self.useHighlight then
|
||||
self.highlight:Show()
|
||||
end
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
end
|
||||
|
||||
function ItemBase.Frame_OnLeave(this)
|
||||
local self = this.obj
|
||||
|
||||
self.highlight:Hide()
|
||||
self:Fire("OnLeave")
|
||||
|
||||
if self.specialOnLeave then
|
||||
self.specialOnLeave(self)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
function ItemBase.OnAcquire(self)
|
||||
self.frame:SetToplevel(true)
|
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
function ItemBase.OnRelease(self)
|
||||
self:SetDisabled(false)
|
||||
self.pullout = nil
|
||||
self.frame:SetParent(nil)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
-- exported
|
||||
-- NOTE: this is called by a Dropdown-Pullout.
|
||||
-- Do not call this method directly
|
||||
function ItemBase.SetPullout(self, pullout)
|
||||
self.pullout = pullout
|
||||
|
||||
self.frame:SetParent(nil)
|
||||
self.frame:SetParent(pullout.itemFrame)
|
||||
self.parent = pullout.itemFrame
|
||||
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.SetText(self, text)
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.GetText(self)
|
||||
return self.text:GetText()
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.SetPoint(self, ...)
|
||||
self.frame:SetPoint(...)
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.Show(self)
|
||||
self.frame:Show()
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.Hide(self)
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
-- exported
|
||||
function ItemBase.SetDisabled(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.useHighlight = false
|
||||
self.text:SetTextColor(.5, .5, .5)
|
||||
else
|
||||
self.useHighlight = true
|
||||
self.text:SetTextColor(1, 1, 1)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
-- NOTE: this is called by a Dropdown-Pullout.
|
||||
-- Do not call this method directly
|
||||
function ItemBase.SetOnLeave(self, func)
|
||||
self.specialOnLeave = func
|
||||
end
|
||||
|
||||
-- exported
|
||||
-- NOTE: this is called by a Dropdown-Pullout.
|
||||
-- Do not call this method directly
|
||||
function ItemBase.SetOnEnter(self, func)
|
||||
self.specialOnEnter = func
|
||||
end
|
||||
|
||||
function ItemBase.Create(type)
|
||||
-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
|
||||
local count = AceGUI:GetNextWidgetNum(type)
|
||||
local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
|
||||
local self = {}
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
self.type = type
|
||||
|
||||
self.useHighlight = true
|
||||
|
||||
frame:SetHeight(17)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
||||
text:SetTextColor(1,1,1)
|
||||
text:SetJustifyH("LEFT")
|
||||
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
|
||||
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
|
||||
self.text = text
|
||||
|
||||
local highlight = frame:CreateTexture(nil, "OVERLAY")
|
||||
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||
highlight:SetBlendMode("ADD")
|
||||
highlight:SetHeight(14)
|
||||
highlight:ClearAllPoints()
|
||||
highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
|
||||
highlight:SetPoint("LEFT",frame,"LEFT",5,0)
|
||||
highlight:Hide()
|
||||
self.highlight = highlight
|
||||
|
||||
local check = frame:CreateTexture("OVERLAY")
|
||||
check:SetWidth(16)
|
||||
check:SetHeight(16)
|
||||
check:SetPoint("LEFT",frame,"LEFT",3,-1)
|
||||
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||
check:Hide()
|
||||
self.check = check
|
||||
|
||||
local sub = frame:CreateTexture("OVERLAY")
|
||||
sub:SetWidth(16)
|
||||
sub:SetHeight(16)
|
||||
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
|
||||
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
|
||||
sub:Hide()
|
||||
self.sub = sub
|
||||
|
||||
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
|
||||
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
|
||||
|
||||
self.OnAcquire = ItemBase.OnAcquire
|
||||
self.OnRelease = ItemBase.OnRelease
|
||||
|
||||
self.SetPullout = ItemBase.SetPullout
|
||||
self.GetText = ItemBase.GetText
|
||||
self.SetText = ItemBase.SetText
|
||||
self.SetDisabled = ItemBase.SetDisabled
|
||||
|
||||
self.SetPoint = ItemBase.SetPoint
|
||||
self.Show = ItemBase.Show
|
||||
self.Hide = ItemBase.Hide
|
||||
|
||||
self.SetOnLeave = ItemBase.SetOnLeave
|
||||
self.SetOnEnter = ItemBase.SetOnEnter
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--[[
|
||||
Template for items:
|
||||
|
||||
-- Item:
|
||||
--
|
||||
do
|
||||
local widgetType = "Dropdown-Item-"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
--]]
|
||||
|
||||
-- Item: Header
|
||||
-- A single text entry.
|
||||
-- Special: Different text color and no highlight
|
||||
do
|
||||
local widgetType = "Dropdown-Item-Header"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function OnEnter(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function OnLeave(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnLeave")
|
||||
|
||||
if self.specialOnLeave then
|
||||
self.specialOnLeave(self)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported, override
|
||||
local function SetDisabled(self, disabled)
|
||||
ItemBase.SetDisabled(self, disabled)
|
||||
if not disabled then
|
||||
self.text:SetTextColor(1, 1, 0)
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
self.SetDisabled = SetDisabled
|
||||
|
||||
self.frame:SetScript("OnEnter", OnEnter)
|
||||
self.frame:SetScript("OnLeave", OnLeave)
|
||||
|
||||
self.text:SetTextColor(1, 1, 0)
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
|
||||
-- Item: Execute
|
||||
-- A simple button
|
||||
do
|
||||
local widgetType = "Dropdown-Item-Execute"
|
||||
local widgetVersion = 1
|
||||
|
||||
local function Frame_OnClick(this, button)
|
||||
local self = this.obj
|
||||
if self.disabled then return end
|
||||
self:Fire("OnClick")
|
||||
if self.pullout then
|
||||
self.pullout:Close()
|
||||
end
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
self.frame:SetScript("OnClick", Frame_OnClick)
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
|
||||
-- Item: Toggle
|
||||
-- Some sort of checkbox for dropdown menus.
|
||||
-- Does not close the pullout on click.
|
||||
do
|
||||
local widgetType = "Dropdown-Item-Toggle"
|
||||
local widgetVersion = 3
|
||||
|
||||
local function UpdateToggle(self)
|
||||
if self.value then
|
||||
self.check:Show()
|
||||
else
|
||||
self.check:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
local function OnRelease(self)
|
||||
ItemBase.OnRelease(self)
|
||||
self:SetValue(nil)
|
||||
end
|
||||
|
||||
local function Frame_OnClick(this, button)
|
||||
local self = this.obj
|
||||
if self.disabled then return end
|
||||
self.value = not self.value
|
||||
if self.value then
|
||||
PlaySound("igMainMenuOptionCheckBoxOn")
|
||||
else
|
||||
PlaySound("igMainMenuOptionCheckBoxOff")
|
||||
end
|
||||
UpdateToggle(self)
|
||||
self:Fire("OnValueChanged", self.value)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetValue(self, value)
|
||||
self.value = value
|
||||
UpdateToggle(self)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function GetValue(self)
|
||||
return self.value
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
self.frame:SetScript("OnClick", Frame_OnClick)
|
||||
|
||||
self.SetValue = SetValue
|
||||
self.GetValue = GetValue
|
||||
self.OnRelease = OnRelease
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
|
||||
-- Item: Menu
|
||||
-- Shows a submenu on mouse over
|
||||
-- Does not close the pullout on click
|
||||
do
|
||||
local widgetType = "Dropdown-Item-Menu"
|
||||
local widgetVersion = 2
|
||||
|
||||
local function OnEnter(this)
|
||||
local self = this.obj
|
||||
self:Fire("OnEnter")
|
||||
|
||||
if self.specialOnEnter then
|
||||
self.specialOnEnter(self)
|
||||
end
|
||||
|
||||
self.highlight:Show()
|
||||
|
||||
if not self.disabled and self.submenu then
|
||||
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
|
||||
end
|
||||
end
|
||||
|
||||
local function OnHide(this)
|
||||
local self = this.obj
|
||||
if self.submenu then
|
||||
self.submenu:Close()
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetMenu(self, menu)
|
||||
assert(menu.type == "Dropdown-Pullout")
|
||||
self.submenu = menu
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function CloseMenu(self)
|
||||
self.submenu:Close()
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
self.sub:Show()
|
||||
|
||||
self.frame:SetScript("OnEnter", OnEnter)
|
||||
self.frame:SetScript("OnHide", OnHide)
|
||||
|
||||
self.SetMenu = SetMenu
|
||||
self.CloseMenu = CloseMenu
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
|
||||
-- Item: Separator
|
||||
-- A single line to separate items
|
||||
do
|
||||
local widgetType = "Dropdown-Item-Separator"
|
||||
local widgetVersion = 1
|
||||
|
||||
-- exported, override
|
||||
local function SetDisabled(self, disabled)
|
||||
ItemBase.SetDisabled(self, disabled)
|
||||
self.useHighlight = false
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local self = ItemBase.Create(widgetType)
|
||||
|
||||
self.SetDisabled = SetDisabled
|
||||
|
||||
local line = self.frame:CreateTexture(nil, "OVERLAY")
|
||||
line:SetHeight(1)
|
||||
line:SetTexture(.5, .5, .5)
|
||||
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
|
||||
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
|
||||
|
||||
self.text:Hide()
|
||||
|
||||
self.useHighlight = false
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||
end
|
||||
@@ -0,0 +1,707 @@
|
||||
--[[ $Id: AceGUIWidget-DropDown.lua 916 2010-03-15 12:24:36Z nevcairiel $ ]]--
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local select, pairs, ipairs = select, pairs, ipairs
|
||||
local tsort = table.sort
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local UIParent, CreateFrame = UIParent, CreateFrame
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: CLOSE
|
||||
|
||||
local function fixlevels(parent,...)
|
||||
local i = 1
|
||||
local child = select(i, ...)
|
||||
while child do
|
||||
child:SetFrameLevel(parent:GetFrameLevel()+1)
|
||||
fixlevels(child, child:GetChildren())
|
||||
i = i + 1
|
||||
child = select(i, ...)
|
||||
end
|
||||
end
|
||||
|
||||
local function fixstrata(strata, parent, ...)
|
||||
local i = 1
|
||||
local child = select(i, ...)
|
||||
parent:SetFrameStrata(strata)
|
||||
while child do
|
||||
fixstrata(strata, child, child:GetChildren())
|
||||
i = i + 1
|
||||
child = select(i, ...)
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "Dropdown-Pullout"
|
||||
local widgetVersion = 3
|
||||
|
||||
--[[ Static data ]]--
|
||||
|
||||
local backdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||
edgeSize = 32,
|
||||
tileSize = 32,
|
||||
tile = true,
|
||||
insets = { left = 11, right = 12, top = 12, bottom = 11 },
|
||||
}
|
||||
local sliderBackdrop = {
|
||||
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
|
||||
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
|
||||
tile = true, tileSize = 8, edgeSize = 8,
|
||||
insets = { left = 3, right = 3, top = 3, bottom = 3 }
|
||||
}
|
||||
|
||||
local defaultWidth = 200
|
||||
local defaultMaxHeight = 600
|
||||
|
||||
--[[ UI Event Handlers ]]--
|
||||
|
||||
-- HACK: This should be no part of the pullout, but there
|
||||
-- is no other 'clean' way to response to any item-OnEnter
|
||||
-- Used to close Submenus when an other item is entered
|
||||
local function OnEnter(item)
|
||||
local self = item.pullout
|
||||
for k, v in ipairs(self.items) do
|
||||
if v.CloseMenu and v ~= item then
|
||||
v:CloseMenu()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- See the note in Constructor() for each scroll related function
|
||||
local function OnMouseWheel(this, value)
|
||||
this.obj:MoveScroll(value)
|
||||
end
|
||||
|
||||
local function OnScrollValueChanged(this, value)
|
||||
this.obj:SetScroll(value)
|
||||
end
|
||||
|
||||
local function OnSizeChanged(this)
|
||||
this.obj:FixScroll()
|
||||
end
|
||||
|
||||
--[[ Exported methods ]]--
|
||||
|
||||
-- exported
|
||||
local function SetScroll(self, value)
|
||||
local status = self.scrollStatus
|
||||
local frame, child = self.scrollFrame, self.itemFrame
|
||||
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||
|
||||
local offset
|
||||
if height > viewheight then
|
||||
offset = 0
|
||||
else
|
||||
offset = floor((viewheight - height) / 1000 * value)
|
||||
end
|
||||
child:ClearAllPoints()
|
||||
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
|
||||
status.offset = offset
|
||||
status.scrollvalue = value
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function MoveScroll(self, value)
|
||||
local status = self.scrollStatus
|
||||
local frame, child = self.scrollFrame, self.itemFrame
|
||||
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||
|
||||
if height > viewheight then
|
||||
self.slider:Hide()
|
||||
else
|
||||
self.slider:Show()
|
||||
local diff = height - viewheight
|
||||
local delta = 1
|
||||
if value < 0 then
|
||||
delta = -1
|
||||
end
|
||||
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function FixScroll(self)
|
||||
local status = self.scrollStatus
|
||||
local frame, child = self.scrollFrame, self.itemFrame
|
||||
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||
local offset = status.offset or 0
|
||||
|
||||
if viewheight < height then
|
||||
self.slider:Hide()
|
||||
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
|
||||
self.slider:SetValue(0)
|
||||
else
|
||||
self.slider:Show()
|
||||
local value = (offset / (viewheight - height) * 1000)
|
||||
if value > 1000 then value = 1000 end
|
||||
self.slider:SetValue(value)
|
||||
self:SetScroll(value)
|
||||
if value < 1000 then
|
||||
child:ClearAllPoints()
|
||||
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
|
||||
status.offset = offset
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
local function OnAcquire(self)
|
||||
self.frame:SetParent(UIParent)
|
||||
--self.itemFrame:SetToplevel(true)
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
local function OnRelease(self)
|
||||
self:Clear()
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function AddItem(self, item)
|
||||
self.items[#self.items + 1] = item
|
||||
|
||||
local h = #self.items * 16
|
||||
self.itemFrame:SetHeight(h)
|
||||
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("RIGHT", self.itemFrame, "RIGHT")
|
||||
|
||||
item:SetPullout(self)
|
||||
item:SetOnEnter(OnEnter)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function Open(self, point, relFrame, relPoint, x, y)
|
||||
local items = self.items
|
||||
local frame = self.frame
|
||||
local itemFrame = self.itemFrame
|
||||
|
||||
frame:SetPoint(point, relFrame, relPoint, x, y)
|
||||
|
||||
|
||||
local height = 8
|
||||
for i, item in pairs(items) do
|
||||
if i == 1 then
|
||||
item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
|
||||
else
|
||||
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
|
||||
end
|
||||
|
||||
item:Show()
|
||||
|
||||
height = height + 16
|
||||
end
|
||||
itemFrame:SetHeight(height)
|
||||
fixstrata("TOOLTIP", frame, frame:GetChildren())
|
||||
frame:Show()
|
||||
self:Fire("OnOpen")
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function Close(self)
|
||||
self.frame:Hide()
|
||||
self:Fire("OnClose")
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function Clear(self)
|
||||
local items = self.items
|
||||
for i, item in pairs(items) do
|
||||
AceGUI:Release(item)
|
||||
items[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function IterateItems(self)
|
||||
return ipairs(self.items)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetHideOnLeave(self, val)
|
||||
self.hideOnLeave = val
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetMaxHeight(self, height)
|
||||
self.maxHeight = height or defaultMaxHeight
|
||||
if self.frame:GetHeight() > height then
|
||||
self.frame:SetHeight(height)
|
||||
elseif (self.itemFrame:GetHeight() + 34) < height then
|
||||
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function GetRightBorderWidth(self)
|
||||
return 6 + (self.slider:IsShown() and 12 or 0)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function GetLeftBorderWidth(self)
|
||||
return 6
|
||||
end
|
||||
|
||||
--[[ Constructor ]]--
|
||||
|
||||
local function Constructor()
|
||||
local count = AceGUI:GetNextWidgetNum(widgetType)
|
||||
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
|
||||
local self = {}
|
||||
self.count = count
|
||||
self.type = widgetType
|
||||
self.frame = frame
|
||||
frame.obj = self
|
||||
|
||||
self.OnAcquire = OnAcquire
|
||||
self.OnRelease = OnRelease
|
||||
|
||||
self.AddItem = AddItem
|
||||
self.Open = Open
|
||||
self.Close = Close
|
||||
self.Clear = Clear
|
||||
self.IterateItems = IterateItems
|
||||
self.SetHideOnLeave = SetHideOnLeave
|
||||
|
||||
self.SetScroll = SetScroll
|
||||
self.MoveScroll = MoveScroll
|
||||
self.FixScroll = FixScroll
|
||||
|
||||
self.SetMaxHeight = SetMaxHeight
|
||||
self.GetRightBorderWidth = GetRightBorderWidth
|
||||
self.GetLeftBorderWidth = GetLeftBorderWidth
|
||||
|
||||
self.items = {}
|
||||
|
||||
self.scrollStatus = {
|
||||
scrollvalue = 0,
|
||||
}
|
||||
|
||||
self.maxHeight = defaultMaxHeight
|
||||
|
||||
frame:SetBackdrop(backdrop)
|
||||
frame:SetBackdropColor(0, 0, 0)
|
||||
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
frame:SetClampedToScreen(true)
|
||||
frame:SetWidth(defaultWidth)
|
||||
frame:SetHeight(self.maxHeight)
|
||||
--frame:SetToplevel(true)
|
||||
|
||||
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
|
||||
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
|
||||
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
|
||||
|
||||
self.scrollFrame = scrollFrame
|
||||
self.itemFrame = itemFrame
|
||||
|
||||
scrollFrame.obj = self
|
||||
itemFrame.obj = self
|
||||
|
||||
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
|
||||
slider:SetOrientation("VERTICAL")
|
||||
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||
slider:SetBackdrop(sliderBackdrop)
|
||||
slider:SetWidth(8)
|
||||
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
|
||||
slider:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
self.slider = slider
|
||||
slider.obj = self
|
||||
|
||||
scrollFrame:SetScrollChild(itemFrame)
|
||||
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
|
||||
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
|
||||
scrollFrame:EnableMouseWheel(true)
|
||||
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
|
||||
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
||||
scrollFrame:SetToplevel(true)
|
||||
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
|
||||
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
|
||||
itemFrame:SetHeight(400)
|
||||
itemFrame:SetToplevel(true)
|
||||
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
|
||||
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
|
||||
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
|
||||
slider:SetScript("OnValueChanged", OnScrollValueChanged)
|
||||
slider:SetMinMaxValues(0, 1000)
|
||||
slider:SetValueStep(1)
|
||||
slider:SetValue(0)
|
||||
|
||||
scrollFrame:Show()
|
||||
itemFrame:Show()
|
||||
slider:Hide()
|
||||
|
||||
self:FixScroll()
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
|
||||
do
|
||||
local widgetType = "Dropdown"
|
||||
local widgetVersion = 22
|
||||
|
||||
--[[ Static data ]]--
|
||||
|
||||
--[[ UI event handler ]]--
|
||||
|
||||
local function Control_OnEnter(this)
|
||||
this.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(this)
|
||||
this.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function Dropdown_OnHide(this)
|
||||
local self = this.obj
|
||||
if self.open then
|
||||
self.pullout:Close()
|
||||
end
|
||||
end
|
||||
|
||||
local function Dropdown_TogglePullout(this)
|
||||
local self = this.obj
|
||||
PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
|
||||
if self.open then
|
||||
self.open = nil
|
||||
self.pullout:Close()
|
||||
AceGUI:ClearFocus()
|
||||
else
|
||||
self.open = true
|
||||
self.pullout:SetWidth(self.frame:GetWidth())
|
||||
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
|
||||
AceGUI:SetFocus(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function OnPulloutOpen(this)
|
||||
local self = this.userdata.obj
|
||||
local value = self.value
|
||||
|
||||
if not self.multiselect then
|
||||
for i, item in this:IterateItems() do
|
||||
item:SetValue(item.userdata.value == value)
|
||||
end
|
||||
end
|
||||
|
||||
self.open = true
|
||||
end
|
||||
|
||||
local function OnPulloutClose(this)
|
||||
local self = this.userdata.obj
|
||||
self.open = nil
|
||||
self:Fire("OnClosed")
|
||||
end
|
||||
|
||||
local function ShowMultiText(self)
|
||||
local text
|
||||
for i, widget in self.pullout:IterateItems() do
|
||||
if widget.type == "Dropdown-Item-Toggle" then
|
||||
if widget:GetValue() then
|
||||
if text then
|
||||
text = text..", "..widget:GetText()
|
||||
else
|
||||
text = widget:GetText()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
self:SetText(text)
|
||||
end
|
||||
|
||||
local function OnItemValueChanged(this, event, checked)
|
||||
local self = this.userdata.obj
|
||||
|
||||
if self.multiselect then
|
||||
self:Fire("OnValueChanged", this.userdata.value, checked)
|
||||
ShowMultiText(self)
|
||||
else
|
||||
if checked then
|
||||
self:SetValue(this.userdata.value)
|
||||
self:Fire("OnValueChanged", this.userdata.value)
|
||||
else
|
||||
this:SetValue(true)
|
||||
end
|
||||
if self.open then
|
||||
self.pullout:Close()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--[[ Exported methods ]]--
|
||||
|
||||
-- exported, AceGUI callback
|
||||
local function OnAcquire(self)
|
||||
local pullout = AceGUI:Create("Dropdown-Pullout")
|
||||
self.pullout = pullout
|
||||
pullout.userdata.obj = self
|
||||
pullout:SetCallback("OnClose", OnPulloutClose)
|
||||
pullout:SetCallback("OnOpen", OnPulloutOpen)
|
||||
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
|
||||
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
|
||||
|
||||
self:SetHeight(44)
|
||||
self:SetWidth(200)
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
local function OnRelease(self)
|
||||
if self.open then
|
||||
self.pullout:Close()
|
||||
end
|
||||
AceGUI:Release(self.pullout)
|
||||
self.pullout = nil
|
||||
|
||||
self:SetText("")
|
||||
self:SetLabel("")
|
||||
self:SetDisabled(false)
|
||||
self:SetMultiselect(false)
|
||||
|
||||
self.value = nil
|
||||
self.list = nil
|
||||
self.open = nil
|
||||
self.hasClose = nil
|
||||
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetDisabled(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.text:SetTextColor(0.5,0.5,0.5)
|
||||
self.button:Disable()
|
||||
self.label:SetTextColor(0.5,0.5,0.5)
|
||||
else
|
||||
self.button:Enable()
|
||||
self.label:SetTextColor(1,.82,0)
|
||||
self.text:SetTextColor(1,1,1)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function ClearFocus(self)
|
||||
if self.open then
|
||||
self.pullout:Close()
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetText(self, text)
|
||||
self.text:SetText(text or "")
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetLabel(self, text)
|
||||
if text and text ~= "" then
|
||||
self.label:SetText(text)
|
||||
self.label:Show()
|
||||
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-18)
|
||||
self.frame:SetHeight(44)
|
||||
else
|
||||
self.label:SetText("")
|
||||
self.label:Hide()
|
||||
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
|
||||
self.frame:SetHeight(26)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetValue(self, value)
|
||||
if self.list then
|
||||
self:SetText(self.list[value] or "")
|
||||
end
|
||||
self.value = value
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function GetValue(self)
|
||||
return self.value
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetItemValue(self, item, value)
|
||||
if not self.multiselect then return end
|
||||
for i, widget in self.pullout:IterateItems() do
|
||||
if widget.userdata.value == item then
|
||||
if widget.SetValue then
|
||||
widget:SetValue(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
ShowMultiText(self)
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetItemDisabled(self, item, disabled)
|
||||
for i, widget in self.pullout:IterateItems() do
|
||||
if widget.userdata.value == item then
|
||||
widget:SetDisabled(disabled)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function AddListItem(self, value, text)
|
||||
local item = AceGUI:Create("Dropdown-Item-Toggle")
|
||||
item:SetText(text)
|
||||
item.userdata.obj = self
|
||||
item.userdata.value = value
|
||||
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||
self.pullout:AddItem(item)
|
||||
end
|
||||
|
||||
local function AddCloseButton(self)
|
||||
if not self.hasClose then
|
||||
local close = AceGUI:Create("Dropdown-Item-Execute")
|
||||
close:SetText(CLOSE)
|
||||
self.pullout:AddItem(close)
|
||||
self.hasClose = true
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local sortlist = {}
|
||||
local function SetList(self, list)
|
||||
self.list = list
|
||||
self.pullout:Clear()
|
||||
self.hasClose = nil
|
||||
if not list then return end
|
||||
|
||||
for v in pairs(list) do
|
||||
sortlist[#sortlist + 1] = v
|
||||
end
|
||||
tsort(sortlist)
|
||||
|
||||
for i, value in pairs(sortlist) do
|
||||
AddListItem(self, value, list[value])
|
||||
sortlist[i] = nil
|
||||
end
|
||||
if self.multiselect then
|
||||
ShowMultiText(self)
|
||||
AddCloseButton(self)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function AddItem(self, value, text)
|
||||
if self.list then
|
||||
self.list[value] = text
|
||||
AddListItem(self, value, text)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function SetMultiselect(self, multi)
|
||||
self.multiselect = multi
|
||||
if multi then
|
||||
ShowMultiText(self)
|
||||
AddCloseButton(self)
|
||||
end
|
||||
end
|
||||
|
||||
-- exported
|
||||
local function GetMultiselect(self)
|
||||
return self.multiselect
|
||||
end
|
||||
|
||||
--[[ Constructor ]]--
|
||||
|
||||
local function Constructor()
|
||||
local count = AceGUI:GetNextWidgetNum(widgetType)
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
|
||||
|
||||
local self = {}
|
||||
self.type = widgetType
|
||||
self.frame = frame
|
||||
self.dropdown = dropdown
|
||||
self.count = count
|
||||
frame.obj = self
|
||||
dropdown.obj = self
|
||||
|
||||
self.OnRelease = OnRelease
|
||||
self.OnAcquire = OnAcquire
|
||||
|
||||
self.ClearFocus = ClearFocus
|
||||
|
||||
self.SetText = SetText
|
||||
self.SetValue = SetValue
|
||||
self.GetValue = GetValue
|
||||
self.SetList = SetList
|
||||
self.SetLabel = SetLabel
|
||||
self.SetDisabled = SetDisabled
|
||||
self.AddItem = AddItem
|
||||
self.SetMultiselect = SetMultiselect
|
||||
self.GetMultiselect = GetMultiselect
|
||||
self.SetItemValue = SetItemValue
|
||||
self.SetItemDisabled = SetItemDisabled
|
||||
|
||||
self.alignoffset = 31
|
||||
|
||||
frame:SetHeight(44)
|
||||
frame:SetWidth(200)
|
||||
frame:SetScript("OnHide",Dropdown_OnHide)
|
||||
|
||||
dropdown:ClearAllPoints()
|
||||
dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
|
||||
dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
|
||||
dropdown:SetScript("OnHide", nil)
|
||||
|
||||
local left = _G[dropdown:GetName() .. "Left"]
|
||||
local middle = _G[dropdown:GetName() .. "Middle"]
|
||||
local right = _G[dropdown:GetName() .. "Right"]
|
||||
|
||||
middle:ClearAllPoints()
|
||||
right:ClearAllPoints()
|
||||
|
||||
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
|
||||
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
|
||||
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
|
||||
|
||||
local button = _G[dropdown:GetName() .. "Button"]
|
||||
self.button = button
|
||||
button.obj = self
|
||||
button:SetScript("OnEnter",Control_OnEnter)
|
||||
button:SetScript("OnLeave",Control_OnLeave)
|
||||
button:SetScript("OnClick",Dropdown_TogglePullout)
|
||||
|
||||
local text = _G[dropdown:GetName() .. "Text"]
|
||||
self.text = text
|
||||
text.obj = self
|
||||
text:ClearAllPoints()
|
||||
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
|
||||
text:SetPoint("LEFT", left, "LEFT", 25, 2)
|
||||
|
||||
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
||||
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
|
||||
label:SetJustifyH("LEFT")
|
||||
label:SetHeight(18)
|
||||
label:Hide()
|
||||
self.label = label
|
||||
|
||||
AceGUI:RegisterAsWidget(self)
|
||||
return self
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||
end
|
||||
@@ -0,0 +1,223 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
EditBox Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "EditBox", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local tostring, pairs = tostring, pairs
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local GetCursorInfo, ClearCursor, GetSpellName = GetCursorInfo, ClearCursor, GetSpellName
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
if not AceGUIEditBoxInsertLink then
|
||||
-- upgradeable hook
|
||||
hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
|
||||
end
|
||||
|
||||
function _G.AceGUIEditBoxInsertLink(text)
|
||||
for i = 1, AceGUI:GetWidgetCount(Type) do
|
||||
local editbox = _G["AceGUI-3.0EditBox"..i]
|
||||
if editbox and editbox:IsVisible() and editbox:HasFocus() then
|
||||
editbox:Insert(text)
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function ShowButton(self)
|
||||
if not self.disablebutton then
|
||||
self.button:Show()
|
||||
self.editbox:SetTextInsets(0, 20, 3, 3)
|
||||
end
|
||||
end
|
||||
|
||||
local function HideButton(self)
|
||||
self.button:Hide()
|
||||
self.editbox:SetTextInsets(0, 0, 3, 3)
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function EditBox_OnEscapePressed(frame)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function EditBox_OnEnterPressed(frame)
|
||||
local self = frame.obj
|
||||
local value = frame:GetText()
|
||||
local cancel = self:Fire("OnEnterPressed", value)
|
||||
if not cancel then
|
||||
PlaySound("igMainMenuOptionCheckBoxOn")
|
||||
HideButton(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function EditBox_OnReceiveDrag(frame)
|
||||
local self = frame.obj
|
||||
local type, id, info = GetCursorInfo()
|
||||
if type == "item" then
|
||||
self:SetText(info)
|
||||
self:Fire("OnEnterPressed", info)
|
||||
ClearCursor()
|
||||
elseif type == "spell" then
|
||||
local name, rank = GetSpellName(id, info)
|
||||
if rank and rank:match("%d") then
|
||||
name = name.."("..rank..")"
|
||||
end
|
||||
self:SetText(name)
|
||||
self:Fire("OnEnterPressed", name)
|
||||
ClearCursor()
|
||||
end
|
||||
HideButton(self)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function EditBox_OnTextChanged(frame)
|
||||
local self = frame.obj
|
||||
local value = frame:GetText()
|
||||
if tostring(value) ~= tostring(self.lasttext) then
|
||||
self:Fire("OnTextChanged", value)
|
||||
self.lasttext = value
|
||||
ShowButton(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function Button_OnClick(frame)
|
||||
local editbox = frame.obj.editbox
|
||||
editbox:ClearFocus()
|
||||
EditBox_OnEnterPressed(editbox)
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
-- height is controlled by SetLabel
|
||||
self:SetWidth(200)
|
||||
self:SetDisabled(false)
|
||||
self:SetLabel()
|
||||
self:SetText()
|
||||
self:DisableButton(false)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.editbox:EnableMouse(false)
|
||||
self.editbox:ClearFocus()
|
||||
self.editbox:SetTextColor(0.5,0.5,0.5)
|
||||
self.label:SetTextColor(0.5,0.5,0.5)
|
||||
else
|
||||
self.editbox:EnableMouse(true)
|
||||
self.editbox:SetTextColor(1,1,1)
|
||||
self.label:SetTextColor(1,.82,0)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetText"] = function(self, text)
|
||||
self.lasttext = text or ""
|
||||
self.editbox:SetText(text or "")
|
||||
self.editbox:SetCursorPosition(0)
|
||||
HideButton(self)
|
||||
end,
|
||||
|
||||
["SetLabel"] = function(self, text)
|
||||
if text and text ~= "" then
|
||||
self.label:SetText(text)
|
||||
self.label:Show()
|
||||
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
|
||||
self:SetHeight(44)
|
||||
self.alignoffset = 30
|
||||
else
|
||||
self.label:SetText("")
|
||||
self.label:Hide()
|
||||
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
|
||||
self:SetHeight(26)
|
||||
self.alignoffset = 12
|
||||
end
|
||||
end,
|
||||
|
||||
["DisableButton"] = function(self, disabled)
|
||||
self.disablebutton = disabled
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local num = AceGUI:GetNextWidgetNum(Type)
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate")
|
||||
editbox:SetAutoFocus(false)
|
||||
editbox:SetFontObject(ChatFontNormal)
|
||||
editbox:SetScript("OnEnter", Control_OnEnter)
|
||||
editbox:SetScript("OnLeave", Control_OnLeave)
|
||||
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
|
||||
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
|
||||
editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
|
||||
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
|
||||
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
|
||||
editbox:SetTextInsets(0, 0, 3, 3)
|
||||
editbox:SetMaxLetters(256)
|
||||
editbox:SetPoint("BOTTOMLEFT", 6, 0)
|
||||
editbox:SetPoint("BOTTOMRIGHT")
|
||||
editbox:SetHeight(19)
|
||||
|
||||
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
label:SetPoint("TOPLEFT", 0, -2)
|
||||
label:SetPoint("TOPRIGHT", 0, -2)
|
||||
label:SetJustifyH("LEFT")
|
||||
label:SetHeight(18)
|
||||
|
||||
local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate")
|
||||
button:SetWidth(40)
|
||||
button:SetHeight(20)
|
||||
button:SetPoint("RIGHT", -2, 0)
|
||||
button:SetText(OKAY)
|
||||
button:SetScript("OnClick", Button_OnClick)
|
||||
button:Hide()
|
||||
|
||||
local widget = {
|
||||
alignoffset = 30,
|
||||
editbox = editbox,
|
||||
label = label,
|
||||
button = button,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
editbox.obj, button.obj = widget, widget
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,78 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Heading Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Heading", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetText()
|
||||
self:SetFullWidth()
|
||||
self:SetHeight(18)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetText"] = function(self, text)
|
||||
self.label:SetText(text or "")
|
||||
if text and text ~= "" then
|
||||
self.left:SetPoint("RIGHT", self.label, "LEFT", -5, 0)
|
||||
self.right:Show()
|
||||
else
|
||||
self.left:SetPoint("RIGHT", -3, 0)
|
||||
self.right:Hide()
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
|
||||
label:SetPoint("TOP")
|
||||
label:SetPoint("BOTTOM")
|
||||
label:SetJustifyH("CENTER")
|
||||
|
||||
local left = frame:CreateTexture(nil, "BACKGROUND")
|
||||
left:SetHeight(8)
|
||||
left:SetPoint("LEFT", 3, 0)
|
||||
left:SetPoint("RIGHT", label, "LEFT", -5, 0)
|
||||
left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
left:SetTexCoord(0.81, 0.94, 0.5, 1)
|
||||
|
||||
local right = frame:CreateTexture(nil, "BACKGROUND")
|
||||
right:SetHeight(8)
|
||||
right:SetPoint("RIGHT", -3, 0)
|
||||
right:SetPoint("LEFT", label, "RIGHT", 5, 0)
|
||||
right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||
right:SetTexCoord(0.81, 0.94, 0.5, 1)
|
||||
|
||||
local widget = {
|
||||
label = label,
|
||||
left = left,
|
||||
right = right,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,144 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Icon Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Icon", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local select, pairs = select, pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function Button_OnClick(frame, button)
|
||||
frame.obj:Fire("OnClick", button)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetHeight(110)
|
||||
self:SetWidth(110)
|
||||
self:SetLabel()
|
||||
self:SetImage(nil)
|
||||
self:SetImageSize(64, 64)
|
||||
self:SetDisabled(false)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetLabel"] = function(self, text)
|
||||
if text and text ~= "" then
|
||||
self.label:Show()
|
||||
self.label:SetText(text)
|
||||
self:SetHeight(self.image:GetHeight() + 25)
|
||||
else
|
||||
self.label:Hide()
|
||||
self:SetHeight(self.image:GetHeight() + 10)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetImage"] = function(self, path, ...)
|
||||
local image = self.image
|
||||
image:SetTexture(path)
|
||||
|
||||
if image:GetTexture() then
|
||||
local n = select("#", ...)
|
||||
if n == 4 or n == 8 then
|
||||
image:SetTexCoord(...)
|
||||
else
|
||||
image:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
["SetImageSize"] = function(self, width, height)
|
||||
self.image:SetWidth(width)
|
||||
self.image:SetHeight(height)
|
||||
--self.frame:SetWidth(width + 30)
|
||||
if self.label:IsShown() then
|
||||
self:SetHeight(height + 25)
|
||||
else
|
||||
self:SetHeight(height + 10)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.frame:Disable()
|
||||
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||
self.image:SetVertexColor(0.5, 0.5, 0.5, 0.5)
|
||||
else
|
||||
self.frame:Enable()
|
||||
self.label:SetTextColor(1, 1, 1)
|
||||
self.image:SetVertexColor(1, 1, 1)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Button", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnEnter", Control_OnEnter)
|
||||
frame:SetScript("OnLeave", Control_OnLeave)
|
||||
frame:SetScript("OnClick", Button_OnClick)
|
||||
|
||||
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlight")
|
||||
label:SetPoint("BOTTOMLEFT")
|
||||
label:SetPoint("BOTTOMRIGHT")
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetJustifyV("TOP")
|
||||
label:SetHeight(18)
|
||||
|
||||
local image = frame:CreateTexture(nil, "BACKGROUND")
|
||||
image:SetWidth(64)
|
||||
image:SetHeight(64)
|
||||
image:SetPoint("TOP", 0, -5)
|
||||
|
||||
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||
highlight:SetAllPoints(image)
|
||||
highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
|
||||
highlight:SetTexCoord(0, 1, 0.23, 0.77)
|
||||
highlight:SetBlendMode("ADD")
|
||||
|
||||
local widget = {
|
||||
label = label,
|
||||
image = image,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
-- SetText is deprecated, but keep it around for a while. (say, to WoW 4.0)
|
||||
if (select(4, GetBuildInfo()) < 40000) then
|
||||
widget.SetText = widget.SetLabel
|
||||
else
|
||||
widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,101 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
InteractiveLabel Widget
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "InteractiveLabel", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local select, pairs = select, pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: GameFontHighlightSmall
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function Label_OnClick(frame, button)
|
||||
frame.obj:Fire("OnClick", button)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:LabelOnAcquire()
|
||||
self:SetHighlight()
|
||||
self:SetHighlightTexCoord()
|
||||
self:SetDisabled(false)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetHighlight"] = function(self, ...)
|
||||
self.highlight:SetTexture(...)
|
||||
end,
|
||||
|
||||
["SetHighlightTexCoord"] = function(self, ...)
|
||||
local c = select("#", ...)
|
||||
if c == 4 or c == 8 then
|
||||
self.highlight:SetTexCoord(...)
|
||||
else
|
||||
self.highlight:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self,disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.frame:EnableMouse(false)
|
||||
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||
else
|
||||
self.frame:EnableMouse(true)
|
||||
self.label:SetTextColor(1, 1, 1)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
-- create a Label type that we will hijack
|
||||
local label = AceGUI:Create("Label")
|
||||
|
||||
local frame = label.frame
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnEnter", Control_OnEnter)
|
||||
frame:SetScript("OnLeave", Control_OnLeave)
|
||||
frame:SetScript("OnMouseDown", Label_OnClick)
|
||||
|
||||
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||
highlight:SetTexture(nil)
|
||||
highlight:SetAllPoints()
|
||||
highlight:SetBlendMode("ADD")
|
||||
|
||||
label.highlight = highlight
|
||||
label.type = Type
|
||||
label.LabelOnAcquire = label.OnAcquire
|
||||
for method, func in pairs(methods) do
|
||||
label[method] = func
|
||||
end
|
||||
|
||||
return label
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Keybinding Widget
|
||||
Set Keybindings in the Config UI.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Keybinding", 21
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: NOT_BOUND
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function Keybinding_OnClick(frame, button)
|
||||
if button == "LeftButton" or button == "RightButton" then
|
||||
local self = frame.obj
|
||||
if self.waitingForKey then
|
||||
frame:EnableKeyboard(false)
|
||||
self.msgframe:Hide()
|
||||
frame:UnlockHighlight()
|
||||
self.waitingForKey = nil
|
||||
else
|
||||
frame:EnableKeyboard(true)
|
||||
self.msgframe:Show()
|
||||
frame:LockHighlight()
|
||||
self.waitingForKey = true
|
||||
end
|
||||
end
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local ignoreKeys = {
|
||||
["BUTTON1"] = true, ["BUTTON2"] = true,
|
||||
["UNKNOWN"] = true,
|
||||
["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
|
||||
["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
|
||||
}
|
||||
local function Keybinding_OnKeyDown(frame, key)
|
||||
local self = frame.obj
|
||||
if self.waitingForKey then
|
||||
local keyPressed = key
|
||||
if keyPressed == "ESCAPE" then
|
||||
keyPressed = ""
|
||||
else
|
||||
if ignoreKeys[keyPressed] then return end
|
||||
if IsShiftKeyDown() then
|
||||
keyPressed = "SHIFT-"..keyPressed
|
||||
end
|
||||
if IsControlKeyDown() then
|
||||
keyPressed = "CTRL-"..keyPressed
|
||||
end
|
||||
if IsAltKeyDown() then
|
||||
keyPressed = "ALT-"..keyPressed
|
||||
end
|
||||
end
|
||||
|
||||
frame:EnableKeyboard(false)
|
||||
self.msgframe:Hide()
|
||||
frame:UnlockHighlight()
|
||||
self.waitingForKey = nil
|
||||
|
||||
if not self.disabled then
|
||||
self:SetKey(keyPressed)
|
||||
self:Fire("OnKeyChanged", keyPressed)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function Keybinding_OnMouseDown(frame, button)
|
||||
if button == "LeftButton" or button == "RightButton" then
|
||||
return
|
||||
elseif button == "MiddleButton" then
|
||||
button = "BUTTON3"
|
||||
elseif button == "Button4" then
|
||||
button = "BUTTON4"
|
||||
elseif button == "Button5" then
|
||||
button = "BUTTON5"
|
||||
end
|
||||
Keybinding_OnKeyDown(frame, button)
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetWidth(200)
|
||||
self:SetLabel("")
|
||||
self:SetKey("")
|
||||
self.waitingForKey = nil
|
||||
self.msgframe:Hide()
|
||||
self:SetDisabled(false)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.button:Disable()
|
||||
self.label:SetTextColor(0.5,0.5,0.5)
|
||||
else
|
||||
self.button:Enable()
|
||||
self.label:SetTextColor(1,1,1)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetKey"] = function(self, key)
|
||||
if (key or "") == "" then
|
||||
self.button:SetText(NOT_BOUND)
|
||||
self.button:SetNormalFontObject("GameFontNormal")
|
||||
else
|
||||
self.button:SetText(key)
|
||||
self.button:SetNormalFontObject("GameFontHighlight")
|
||||
end
|
||||
end,
|
||||
|
||||
["GetKey"] = function(self)
|
||||
local key = self.button:GetText()
|
||||
if key == NOT_BOUND then
|
||||
key = nil
|
||||
end
|
||||
return key
|
||||
end,
|
||||
|
||||
["SetLabel"] = function(self, label)
|
||||
self.label:SetText(label or "")
|
||||
if (label or "") == "" then
|
||||
self.alignoffset = nil
|
||||
self:SetHeight(24)
|
||||
else
|
||||
self.alignoffset = 30
|
||||
self:SetHeight(44)
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local ControlBackdrop = {
|
||||
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 3, right = 3, top = 3, bottom = 3 }
|
||||
}
|
||||
|
||||
local function keybindingMsgFixWidth(frame)
|
||||
frame:SetWidth(frame.msg:GetWidth() + 10)
|
||||
frame:SetScript("OnUpdate", nil)
|
||||
end
|
||||
|
||||
local function Constructor()
|
||||
local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)
|
||||
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate2")
|
||||
|
||||
button:EnableMouse(true)
|
||||
button:RegisterForClicks("AnyDown")
|
||||
button:SetScript("OnEnter", Control_OnEnter)
|
||||
button:SetScript("OnLeave", Control_OnLeave)
|
||||
button:SetScript("OnClick", Keybinding_OnClick)
|
||||
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
|
||||
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
|
||||
button:SetPoint("BOTTOMLEFT")
|
||||
button:SetPoint("BOTTOMRIGHT")
|
||||
button:SetHeight(24)
|
||||
|
||||
local text = button:GetFontString()
|
||||
text:SetPoint("LEFT", 7, 0)
|
||||
text:SetPoint("RIGHT", -7, 0)
|
||||
|
||||
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
|
||||
label:SetPoint("TOPLEFT")
|
||||
label:SetPoint("TOPRIGHT")
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetHeight(18)
|
||||
|
||||
local msgframe = CreateFrame("Frame", nil, UIParent)
|
||||
msgframe:SetHeight(30)
|
||||
msgframe:SetBackdrop(ControlBackdrop)
|
||||
msgframe:SetBackdropColor(0,0,0)
|
||||
msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
msgframe:SetFrameLevel(1000)
|
||||
|
||||
local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
|
||||
msgframe.msg = msg
|
||||
msg:SetPoint("TOPLEFT", 5, -5)
|
||||
msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
|
||||
msgframe:SetPoint("BOTTOM", button, "TOP")
|
||||
msgframe:Hide()
|
||||
|
||||
local widget = {
|
||||
button = button,
|
||||
label = label,
|
||||
msgframe = msgframe,
|
||||
frame = frame,
|
||||
alignoffset = 30,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
button.obj = widget
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,162 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Label Widget
|
||||
Displays text and optionally an icon.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Label", 21
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local max, select, pairs = math.max, select, pairs
|
||||
|
||||
-- WoW APIs
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: GameFontHighlightSmall
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
|
||||
local function UpdateImageAnchor(self)
|
||||
if self.resizing then return end
|
||||
local frame = self.frame
|
||||
local width = frame.width or frame:GetWidth() or 0
|
||||
local image = self.image
|
||||
local label = self.label
|
||||
local height
|
||||
|
||||
label:ClearAllPoints()
|
||||
image:ClearAllPoints()
|
||||
|
||||
if self.imageshown then
|
||||
local imagewidth = image:GetWidth()
|
||||
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:SetPoint("TOP")
|
||||
label:SetPoint("TOP", image, "BOTTOM")
|
||||
label:SetPoint("LEFT")
|
||||
label:SetWidth(width)
|
||||
height = image:GetHeight() + label:GetHeight()
|
||||
else
|
||||
-- image on the left
|
||||
image:SetPoint("TOPLEFT")
|
||||
label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
|
||||
label:SetWidth(width - imagewidth - 4)
|
||||
height = max(image:GetHeight(), label:GetHeight())
|
||||
end
|
||||
else
|
||||
-- no image shown
|
||||
label:SetPoint("TOPLEFT")
|
||||
label:SetWidth(width)
|
||||
height = label:GetHeight()
|
||||
end
|
||||
|
||||
self.resizing = true
|
||||
frame:SetHeight(height)
|
||||
frame.height = height
|
||||
self.resizing = nil
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
-- set the flag to stop constant size updates
|
||||
self.resizing = true
|
||||
-- height is set dynamically by the text and image size
|
||||
self:SetWidth(200)
|
||||
self:SetText()
|
||||
self:SetImage(nil)
|
||||
self:SetImageSize(16, 16)
|
||||
self:SetColor()
|
||||
self:SetFontObject()
|
||||
|
||||
-- reset the flag
|
||||
self.resizing = nil
|
||||
-- run the update explicitly
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["OnWidthSet"] = function(self, width)
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
|
||||
["SetText"] = function(self, text)
|
||||
self.label:SetText(text)
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
|
||||
["SetColor"] = function(self, r, g, b)
|
||||
if not (r and g and b) then
|
||||
r, g, b = 1, 1, 1
|
||||
end
|
||||
self.label:SetVertexColor(r, g, b)
|
||||
end,
|
||||
|
||||
["SetImage"] = function(self, path, ...)
|
||||
local image = self.image
|
||||
image:SetTexture(path)
|
||||
|
||||
if image:GetTexture() then
|
||||
self.imageshown = true
|
||||
local n = select("#", ...)
|
||||
if n == 4 or n == 8 then
|
||||
image:SetTexCoord(...)
|
||||
else
|
||||
image:SetTexCoord(0, 1, 0, 1)
|
||||
end
|
||||
else
|
||||
self.imageshown = nil
|
||||
end
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
|
||||
["SetFont"] = function(self, font, height, flags)
|
||||
self.label:SetFont(font, height, flags)
|
||||
end,
|
||||
|
||||
["SetFontObject"] = function(self, font)
|
||||
self:SetFont((font or GameFontHighlightSmall):GetFont())
|
||||
end,
|
||||
|
||||
["SetImageSize"] = function(self, width, height)
|
||||
self.image:SetWidth(width)
|
||||
self.image:SetHeight(height)
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
|
||||
label:SetJustifyH("LEFT")
|
||||
label:SetJustifyV("TOP")
|
||||
|
||||
local image = frame:CreateTexture(nil, "BACKGROUND")
|
||||
|
||||
-- create widget
|
||||
local widget = {
|
||||
label = label,
|
||||
image = image,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,278 @@
|
||||
local Type, Version = "MultiLineEditBox", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local pairs = pairs
|
||||
|
||||
-- WoW APIs
|
||||
local GetCursorInfo, GetSpellName, ClearCursor = GetCursorInfo, GetSpellName, ClearCursor
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: ACCEPT, ChatFontNormal
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function OnClick(self) -- Button
|
||||
self = self.obj
|
||||
self.editBox:ClearFocus()
|
||||
if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
|
||||
self.button:Disable()
|
||||
end
|
||||
end
|
||||
|
||||
local function OnCursorChanged(self, _, y, _, cursorHeight) -- EditBox
|
||||
self, y = self.obj.scrollFrame, -y
|
||||
local offset = self:GetVerticalScroll()
|
||||
if y < offset then
|
||||
self:SetVerticalScroll(y)
|
||||
else
|
||||
y = y + cursorHeight - self:GetHeight()
|
||||
if y > offset then
|
||||
self:SetVerticalScroll(y)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function OnEditFocusLost(self) -- EditBox
|
||||
self:HighlightText(0, 0)
|
||||
end
|
||||
|
||||
local function OnEnter(self) -- EditBox / ScrollFrame
|
||||
self = self.obj
|
||||
if not self.entered then
|
||||
self.entered = true
|
||||
self:Fire("OnEnter")
|
||||
end
|
||||
end
|
||||
|
||||
local function OnLeave(self) -- EditBox / ScrollFrame
|
||||
self = self.obj
|
||||
if self.entered then
|
||||
self.entered = nil
|
||||
self:Fire("OnLeave")
|
||||
end
|
||||
end
|
||||
|
||||
local function OnMouseUp(self) -- ScrollFrame
|
||||
self = self.obj.editBox
|
||||
self:SetFocus()
|
||||
self:SetCursorPosition(self:GetNumLetters())
|
||||
end
|
||||
|
||||
local function OnReceiveDrag(self) -- EditBox / ScrollFrame
|
||||
local type, id, info = GetCursorInfo()
|
||||
if type == "spell" then
|
||||
info, id = GetSpellName(id, info)
|
||||
if id and id:match("%d") then
|
||||
info = info .. "(" .. id .. ")"
|
||||
end
|
||||
elseif type ~= "item" then
|
||||
return
|
||||
end
|
||||
ClearCursor()
|
||||
self = self.obj
|
||||
local editBox = self.editBox
|
||||
if not editBox:HasFocus() then
|
||||
editBox:SetFocus()
|
||||
editBox:SetCursorPosition(editBox:GetNumLetters())
|
||||
end
|
||||
editBox:Insert(info)
|
||||
self.button:Enable()
|
||||
end
|
||||
|
||||
local function OnSizeChanged(self, width, height) -- ScrollFrame
|
||||
self.obj.editBox:SetWidth(width)
|
||||
end
|
||||
|
||||
local function OnTextChanged(self, userInput) -- EditBox
|
||||
if userInput then
|
||||
self = self.obj
|
||||
self:Fire("OnTextChanged", self.editBox:GetText())
|
||||
self.button:Enable()
|
||||
end
|
||||
end
|
||||
|
||||
local function OnTextSet(self) -- EditBox
|
||||
self:HighlightText(0, 0)
|
||||
self:SetCursorPosition(self:GetNumLetters())
|
||||
self:SetCursorPosition(0)
|
||||
self.obj.button:Disable()
|
||||
end
|
||||
|
||||
local function OnVerticalScroll(self, offset) -- ScrollFrame
|
||||
local editBox = self.obj.editBox
|
||||
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["GetText"] = function(self)
|
||||
return self.editBox:GetText()
|
||||
end,
|
||||
|
||||
["OnAcquire"] = function(self)
|
||||
self.editBox:SetText("")
|
||||
self:SetDisabled(false)
|
||||
self:SetWidth(200)
|
||||
self:SetNumLines()
|
||||
self.entered = nil
|
||||
end,
|
||||
|
||||
["OnRelease"] = function(self)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:Hide()
|
||||
end,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
local editBox = self.editBox
|
||||
if disabled then
|
||||
editBox:ClearFocus()
|
||||
editBox:EnableMouse(false)
|
||||
editBox:SetTextColor(0.5, 0.5, 0.5)
|
||||
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||
self.scrollFrame:EnableMouse(false)
|
||||
self.button:Disable()
|
||||
else
|
||||
editBox:EnableMouse(true)
|
||||
editBox:SetTextColor(1, 1, 1)
|
||||
self.label:SetTextColor(1, 0.82, 0)
|
||||
self.scrollFrame:EnableMouse(true)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetLabel"] = function(self, text)
|
||||
if text and text ~= "" then
|
||||
self.label:SetText(text)
|
||||
if self.labelHeight ~= 10 then
|
||||
self.labelHeight = 10
|
||||
self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
|
||||
self:SetHeight(self.frame.height + 10)
|
||||
self.label:Show()
|
||||
end
|
||||
elseif self.labelHeight ~= 0 then
|
||||
self.labelHeight = 0
|
||||
self.label:Hide()
|
||||
self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
|
||||
self:SetHeight(self.frame.height - 10)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetNumLines"] = function(self, value)
|
||||
if not value or value < 4 then
|
||||
value = 4
|
||||
end
|
||||
self:SetHeight(value * 14 + 41 + self.labelHeight)
|
||||
end,
|
||||
|
||||
["SetText"] = function(self, text)
|
||||
self.editBox:SetText(text)
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local backdrop = {
|
||||
bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
|
||||
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
|
||||
insets = { left = 4, right = 3, top = 4, bottom = 3 }
|
||||
}
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
frame:Hide()
|
||||
|
||||
local widgetNum = AceGUI:GetNextWidgetNum(Type)
|
||||
|
||||
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
|
||||
label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
|
||||
label:SetJustifyH("LEFT")
|
||||
label:SetText(ACCEPT)
|
||||
label:SetHeight(10)
|
||||
|
||||
local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate2")
|
||||
button:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, 4)
|
||||
button:SetHeight(22)
|
||||
button:SetWidth(label:GetStringWidth() + 24)
|
||||
button:SetText(ACCEPT)
|
||||
button:SetScript("OnClick", OnClick)
|
||||
button:Disable()
|
||||
|
||||
local text = button:GetFontString()
|
||||
text:ClearAllPoints()
|
||||
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
|
||||
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
|
||||
text:SetJustifyV("MIDDLE")
|
||||
|
||||
local scrollBG = CreateFrame("Frame", nil, frame)
|
||||
scrollBG:SetBackdrop(backdrop)
|
||||
scrollBG:SetBackdropColor(0, 0, 0)
|
||||
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||
|
||||
local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
|
||||
|
||||
local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
|
||||
scrollBar:ClearAllPoints()
|
||||
scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
|
||||
scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
|
||||
scrollBar:SetPoint("RIGHT", frame, "RIGHT")
|
||||
|
||||
scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
|
||||
scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
|
||||
|
||||
scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
|
||||
scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
|
||||
scrollFrame:SetScript("OnEnter", OnEnter)
|
||||
scrollFrame:SetScript("OnLeave", OnLeave)
|
||||
scrollFrame:SetScript("OnMouseUp", OnMouseUp)
|
||||
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
|
||||
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
||||
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
|
||||
|
||||
local editBox = CreateFrame("EditBox", nil, scrollFrame)
|
||||
editBox:SetAllPoints()
|
||||
editBox:SetFontObject(ChatFontNormal)
|
||||
editBox:SetMultiLine(true)
|
||||
editBox:EnableMouse(true)
|
||||
editBox:SetAutoFocus(false)
|
||||
editBox:SetCountInvisibleLetters(false)
|
||||
editBox:SetScript("OnCursorChanged", OnCursorChanged)
|
||||
editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
|
||||
editBox:SetScript("OnEnter", OnEnter)
|
||||
editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
|
||||
editBox:SetScript("OnLeave", OnLeave)
|
||||
editBox:SetScript("OnMouseDown", OnReceiveDrag)
|
||||
editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
|
||||
editBox:SetScript("OnTextChanged", OnTextChanged)
|
||||
editBox:SetScript("OnTextSet", OnTextSet)
|
||||
|
||||
scrollFrame:SetScrollChild(editBox)
|
||||
|
||||
local widget = {
|
||||
button = button,
|
||||
editBox = editBox,
|
||||
frame = frame,
|
||||
label = label,
|
||||
labelHeight = 10,
|
||||
scrollBar = scrollBar,
|
||||
scrollFrame = scrollFrame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
|
||||
|
||||
AceGUI:RegisterAsWidget(widget)
|
||||
return widget
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||
@@ -0,0 +1,281 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Slider Widget
|
||||
Graphical Slider, like, for Range values.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Slider", 20
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
-- Lua APIs
|
||||
local min, max, floor = math.min, math.max, math.floor
|
||||
local tonumber = tonumber
|
||||
|
||||
-- WoW APIs
|
||||
local PlaySound = PlaySound
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: GameFontHighlightSmall
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Support functions
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function UpdateText(self)
|
||||
local value = self.value or 0
|
||||
if self.ispercent then
|
||||
self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10))
|
||||
else
|
||||
self.editbox:SetText(floor(value * 100 + 0.5) / 100)
|
||||
end
|
||||
end
|
||||
|
||||
local function UpdateLabels(self)
|
||||
local min, max = (self.min or 0), (self.max or 100)
|
||||
if self.ispercent then
|
||||
self.lowtext:SetFormattedText("%s%%", (min * 100))
|
||||
self.hightext:SetFormattedText("%s%%", (max * 100))
|
||||
else
|
||||
self.lowtext:SetText(min)
|
||||
self.hightext:SetText(max)
|
||||
end
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Scripts
|
||||
-------------------------------------------------------------------------------]]
|
||||
local function Control_OnEnter(frame)
|
||||
frame.obj:Fire("OnEnter")
|
||||
end
|
||||
|
||||
local function Control_OnLeave(frame)
|
||||
frame.obj:Fire("OnLeave")
|
||||
end
|
||||
|
||||
local function Frame_OnMouseDown(frame)
|
||||
frame.obj.slider:EnableMouseWheel(true)
|
||||
AceGUI:ClearFocus()
|
||||
end
|
||||
|
||||
local function Slider_OnValueChanged(frame)
|
||||
local self = frame.obj
|
||||
if not frame.setup then
|
||||
local newvalue = frame:GetValue()
|
||||
if newvalue ~= self.value and not self.disabled then
|
||||
self.value = newvalue
|
||||
self:Fire("OnValueChanged", newvalue)
|
||||
end
|
||||
if self.value then
|
||||
UpdateText(self)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function Slider_OnMouseUp(frame)
|
||||
local self = frame.obj
|
||||
self:Fire("OnMouseUp", self.value)
|
||||
end
|
||||
|
||||
local function Slider_OnMouseWheel(frame, v)
|
||||
local self = frame.obj
|
||||
if not self.disabled then
|
||||
local value = self.value
|
||||
if v > 0 then
|
||||
value = min(value + (self.step or 1), self.max)
|
||||
else
|
||||
value = max(value - (self.step or 1), self.min)
|
||||
end
|
||||
self.slider:SetValue(value)
|
||||
end
|
||||
end
|
||||
|
||||
local function EditBox_OnEscapePressed(frame)
|
||||
frame:ClearFocus()
|
||||
end
|
||||
|
||||
local function EditBox_OnEnterPressed(frame)
|
||||
local self = frame.obj
|
||||
local value = frame:GetText()
|
||||
if self.ispercent then
|
||||
value = value:gsub('%%', '')
|
||||
value = tonumber(value) / 100
|
||||
else
|
||||
value = tonumber(value)
|
||||
end
|
||||
|
||||
if value then
|
||||
PlaySound("igMainMenuOptionCheckBoxOn")
|
||||
self.slider:SetValue(value)
|
||||
self:Fire("OnMouseUp", value)
|
||||
end
|
||||
end
|
||||
|
||||
local function EditBox_OnEnter(frame)
|
||||
frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
|
||||
end
|
||||
|
||||
local function EditBox_OnLeave(frame)
|
||||
frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
|
||||
end
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Methods
|
||||
-------------------------------------------------------------------------------]]
|
||||
local methods = {
|
||||
["OnAcquire"] = function(self)
|
||||
self:SetWidth(200)
|
||||
self:SetHeight(44)
|
||||
self:SetDisabled(false)
|
||||
self:SetIsPercent(nil)
|
||||
self:SetSliderValues(0,100,1)
|
||||
self:SetValue(0)
|
||||
self.slider:EnableMouseWheel(false)
|
||||
end,
|
||||
|
||||
-- ["OnRelease"] = nil,
|
||||
|
||||
["SetDisabled"] = function(self, disabled)
|
||||
self.disabled = disabled
|
||||
if disabled then
|
||||
self.slider:EnableMouse(false)
|
||||
self.label:SetTextColor(.5, .5, .5)
|
||||
self.hightext:SetTextColor(.5, .5, .5)
|
||||
self.lowtext:SetTextColor(.5, .5, .5)
|
||||
--self.valuetext:SetTextColor(.5, .5, .5)
|
||||
self.editbox:SetTextColor(.5, .5, .5)
|
||||
self.editbox:EnableMouse(false)
|
||||
self.editbox:ClearFocus()
|
||||
else
|
||||
self.slider:EnableMouse(true)
|
||||
self.label:SetTextColor(1, .82, 0)
|
||||
self.hightext:SetTextColor(1, 1, 1)
|
||||
self.lowtext:SetTextColor(1, 1, 1)
|
||||
--self.valuetext:SetTextColor(1, 1, 1)
|
||||
self.editbox:SetTextColor(1, 1, 1)
|
||||
self.editbox:EnableMouse(true)
|
||||
end
|
||||
end,
|
||||
|
||||
["SetValue"] = function(self, value)
|
||||
self.slider.setup = true
|
||||
self.slider:SetValue(value)
|
||||
self.value = value
|
||||
UpdateText(self)
|
||||
self.slider.setup = nil
|
||||
end,
|
||||
|
||||
["GetValue"] = function(self)
|
||||
return self.value
|
||||
end,
|
||||
|
||||
["SetLabel"] = function(self, text)
|
||||
self.label:SetText(text)
|
||||
end,
|
||||
|
||||
["SetSliderValues"] = function(self, min, max, step)
|
||||
local frame = self.slider
|
||||
frame.setup = true
|
||||
self.min = min
|
||||
self.max = max
|
||||
self.step = step
|
||||
frame:SetMinMaxValues(min or 0,max or 100)
|
||||
UpdateLabels(self)
|
||||
frame:SetValueStep(step or 1)
|
||||
if self.value then
|
||||
frame:SetValue(self.value)
|
||||
end
|
||||
frame.setup = nil
|
||||
end,
|
||||
|
||||
["SetIsPercent"] = function(self, value)
|
||||
self.ispercent = value
|
||||
UpdateLabels(self)
|
||||
UpdateText(self)
|
||||
end
|
||||
}
|
||||
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Constructor
|
||||
-------------------------------------------------------------------------------]]
|
||||
local SliderBackdrop = {
|
||||
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
|
||||
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
|
||||
tile = true, tileSize = 8, edgeSize = 8,
|
||||
insets = { left = 3, right = 3, top = 6, bottom = 6 }
|
||||
}
|
||||
|
||||
local ManualBackdrop = {
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
tile = true, edgeSize = 1, tileSize = 5,
|
||||
}
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
|
||||
frame:EnableMouse(true)
|
||||
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
|
||||
|
||||
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
label:SetPoint("TOPLEFT")
|
||||
label:SetPoint("TOPRIGHT")
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetHeight(15)
|
||||
|
||||
local slider = CreateFrame("Slider", nil, frame)
|
||||
slider:SetOrientation("HORIZONTAL")
|
||||
slider:SetHeight(15)
|
||||
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||
slider:SetBackdrop(SliderBackdrop)
|
||||
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
|
||||
slider:SetPoint("TOP", label, "BOTTOM")
|
||||
slider:SetPoint("LEFT", 3, 0)
|
||||
slider:SetPoint("RIGHT", -3, 0)
|
||||
slider:SetValue(0)
|
||||
slider:SetScript("OnValueChanged",Slider_OnValueChanged)
|
||||
slider:SetScript("OnEnter", Control_OnEnter)
|
||||
slider:SetScript("OnLeave", Control_OnLeave)
|
||||
slider:SetScript("OnMouseUp", Slider_OnMouseUp)
|
||||
slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
|
||||
|
||||
local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3)
|
||||
|
||||
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
|
||||
|
||||
local editbox = CreateFrame("EditBox", nil, frame)
|
||||
editbox:SetAutoFocus(false)
|
||||
editbox:SetFontObject(GameFontHighlightSmall)
|
||||
editbox:SetPoint("TOP", slider, "BOTTOM")
|
||||
editbox:SetHeight(14)
|
||||
editbox:SetWidth(70)
|
||||
editbox:SetJustifyH("CENTER")
|
||||
editbox:EnableMouse(true)
|
||||
editbox:SetBackdrop(ManualBackdrop)
|
||||
editbox:SetBackdropColor(0, 0, 0, 0.5)
|
||||
editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
|
||||
editbox:SetScript("OnEnter", EditBox_OnEnter)
|
||||
editbox:SetScript("OnLeave", EditBox_OnLeave)
|
||||
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
|
||||
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
|
||||
|
||||
local widget = {
|
||||
label = label,
|
||||
slider = slider,
|
||||
lowtext = lowtext,
|
||||
hightext = hightext,
|
||||
editbox = editbox,
|
||||
alignoffset = 25,
|
||||
frame = frame,
|
||||
type = Type
|
||||
}
|
||||
for method, func in pairs(methods) do
|
||||
widget[method] = func
|
||||
end
|
||||
slider.obj, editbox.obj = widget, widget
|
||||
|
||||
return AceGUI:RegisterAsWidget(widget)
|
||||
end
|
||||
|
||||
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||
@@ -0,0 +1,12 @@
|
||||
tag v3.2.12
|
||||
1b93c00084ab126cddc6930ba2c6476723dd86b6
|
||||
Shadowed <shadowed.wow@gmail.com>
|
||||
2010-06-26 19:21:53 -0700
|
||||
|
||||
Tagging as release 3.2.12
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
Shadowed:
|
||||
- Reverting the boss OnUpdate removal, Blizzard seems to have partially fixed the bug, but not completely
|
||||
@@ -0,0 +1,728 @@
|
||||
--- **AceDB-3.0** manages the SavedVariables of your addon.
|
||||
-- It offers profile management, smart defaults and namespaces for modules.\\
|
||||
-- Data can be saved in different data-types, depending on its intended usage.
|
||||
-- The most common data-type is the `profile` type, which allows the user to choose
|
||||
-- the active profile, and manage the profiles of all of his characters.\\
|
||||
-- The following data types are available:
|
||||
-- * **char** Character-specific data. Every character has its own database.
|
||||
-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
|
||||
-- * **class** Class-specific data. All of the players characters of the same class share this database.
|
||||
-- * **race** Race-specific data. All of the players characters of the same race share this database.
|
||||
-- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
|
||||
-- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
|
||||
-- * **global** Global Data. All characters on the same account share this database.
|
||||
-- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
|
||||
--
|
||||
-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
|
||||
-- of the DBObjectLib listed here. \\
|
||||
-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
|
||||
-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
|
||||
-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
|
||||
--
|
||||
-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
|
||||
--
|
||||
-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
|
||||
--
|
||||
-- @usage
|
||||
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
|
||||
--
|
||||
-- -- declare defaults to be used in the DB
|
||||
-- local defaults = {
|
||||
-- profile = {
|
||||
-- setting = true,
|
||||
-- }
|
||||
-- }
|
||||
--
|
||||
-- function MyAddon:OnInitialize()
|
||||
-- -- Assuming the .toc says ## SavedVariables: MyAddonDB
|
||||
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
|
||||
-- end
|
||||
-- @class file
|
||||
-- @name AceDB-3.0.lua
|
||||
-- @release $Id: AceDB-3.0.lua 940 2010-06-19 08:01:47Z nevcairiel $
|
||||
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 21
|
||||
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
|
||||
|
||||
if not AceDB then return end -- No upgrade needed
|
||||
|
||||
-- Lua APIs
|
||||
local type, pairs, next, error = type, pairs, next, error
|
||||
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
|
||||
|
||||
-- WoW APIs
|
||||
local _G = _G
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: LibStub
|
||||
|
||||
AceDB.db_registry = AceDB.db_registry or {}
|
||||
AceDB.frame = AceDB.frame or CreateFrame("Frame")
|
||||
|
||||
local CallbackHandler
|
||||
local CallbackDummy = { Fire = function() end }
|
||||
|
||||
local DBObjectLib = {}
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
AceDB Utility Functions
|
||||
---------------------------------------------------------------------------]]
|
||||
|
||||
-- Simple shallow copy for copying defaults
|
||||
local function copyTable(src, dest)
|
||||
if type(dest) ~= "table" then dest = {} end
|
||||
if type(src) == "table" then
|
||||
for k,v in pairs(src) do
|
||||
if type(v) == "table" then
|
||||
-- try to index the key first so that the metatable creates the defaults, if set, and use that table
|
||||
v = copyTable(v, dest[k])
|
||||
end
|
||||
dest[k] = v
|
||||
end
|
||||
end
|
||||
return dest
|
||||
end
|
||||
|
||||
-- Called to add defaults to a section of the database
|
||||
--
|
||||
-- When a ["*"] default section is indexed with a new key, a table is returned
|
||||
-- and set in the host table. These tables must be cleaned up by removeDefaults
|
||||
-- in order to ensure we don't write empty default tables.
|
||||
local function copyDefaults(dest, src)
|
||||
-- this happens if some value in the SV overwrites our default value with a non-table
|
||||
--if type(dest) ~= "table" then return end
|
||||
for k, v in pairs(src) do
|
||||
if k == "*" or k == "**" then
|
||||
if type(v) == "table" then
|
||||
-- This is a metatable used for table defaults
|
||||
local mt = {
|
||||
-- This handles the lookup and creation of new subtables
|
||||
__index = function(t,k)
|
||||
if k == nil then return nil end
|
||||
local tbl = {}
|
||||
copyDefaults(tbl, v)
|
||||
rawset(t, k, tbl)
|
||||
return tbl
|
||||
end,
|
||||
}
|
||||
setmetatable(dest, mt)
|
||||
-- handle already existing tables in the SV
|
||||
for dk, dv in pairs(dest) do
|
||||
if not rawget(src, dk) and type(dv) == "table" then
|
||||
copyDefaults(dv, v)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Values are not tables, so this is just a simple return
|
||||
local mt = {__index = function(t,k) return k~=nil and v or nil end}
|
||||
setmetatable(dest, mt)
|
||||
end
|
||||
elseif type(v) == "table" then
|
||||
if not rawget(dest, k) then rawset(dest, k, {}) end
|
||||
if type(dest[k]) == "table" then
|
||||
copyDefaults(dest[k], v)
|
||||
if src['**'] then
|
||||
copyDefaults(dest[k], src['**'])
|
||||
end
|
||||
end
|
||||
else
|
||||
if rawget(dest, k) == nil then
|
||||
rawset(dest, k, v)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Called to remove all defaults in the default table from the database
|
||||
local function removeDefaults(db, defaults, blocker)
|
||||
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
|
||||
setmetatable(db, nil)
|
||||
-- loop through the defaults and remove their content
|
||||
for k,v in pairs(defaults) do
|
||||
if k == "*" or k == "**" then
|
||||
if type(v) == "table" then
|
||||
-- Loop through all the actual k,v pairs and remove
|
||||
for key, value in pairs(db) do
|
||||
if type(value) == "table" then
|
||||
-- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
|
||||
if defaults[key] == nil and (not blocker or blocker[key] == nil) then
|
||||
removeDefaults(value, v)
|
||||
-- if the table is empty afterwards, remove it
|
||||
if next(value) == nil then
|
||||
db[key] = nil
|
||||
end
|
||||
-- if it was specified, only strip ** content, but block values which were set in the key table
|
||||
elseif k == "**" then
|
||||
removeDefaults(value, v, defaults[key])
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif k == "*" then
|
||||
-- check for non-table default
|
||||
for key, value in pairs(db) do
|
||||
if defaults[key] == nil and v == value then
|
||||
db[key] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif type(v) == "table" and type(db[k]) == "table" then
|
||||
-- if a blocker was set, dive into it, to allow multi-level defaults
|
||||
removeDefaults(db[k], v, blocker and blocker[k])
|
||||
if next(db[k]) == nil then
|
||||
db[k] = nil
|
||||
end
|
||||
else
|
||||
-- check if the current value matches the default, and that its not blocked by another defaults table
|
||||
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
|
||||
db[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- This is called when a table section is first accessed, to set up the defaults
|
||||
local function initSection(db, section, svstore, key, defaults)
|
||||
local sv = rawget(db, "sv")
|
||||
|
||||
local tableCreated
|
||||
if not sv[svstore] then sv[svstore] = {} end
|
||||
if not sv[svstore][key] then
|
||||
sv[svstore][key] = {}
|
||||
tableCreated = true
|
||||
end
|
||||
|
||||
local tbl = sv[svstore][key]
|
||||
|
||||
if defaults then
|
||||
copyDefaults(tbl, defaults)
|
||||
end
|
||||
rawset(db, section, tbl)
|
||||
|
||||
return tableCreated, tbl
|
||||
end
|
||||
|
||||
-- Metatable to handle the dynamic creation of sections and copying of sections.
|
||||
local dbmt = {
|
||||
__index = function(t, section)
|
||||
local keys = rawget(t, "keys")
|
||||
local key = keys[section]
|
||||
if key then
|
||||
local defaultTbl = rawget(t, "defaults")
|
||||
local defaults = defaultTbl and defaultTbl[section]
|
||||
|
||||
if section == "profile" then
|
||||
local new = initSection(t, section, "profiles", key, defaults)
|
||||
if new then
|
||||
-- Callback: OnNewProfile, database, newProfileKey
|
||||
t.callbacks:Fire("OnNewProfile", t, key)
|
||||
end
|
||||
elseif section == "profiles" then
|
||||
local sv = rawget(t, "sv")
|
||||
if not sv.profiles then sv.profiles = {} end
|
||||
rawset(t, "profiles", sv.profiles)
|
||||
elseif section == "global" then
|
||||
local sv = rawget(t, "sv")
|
||||
if not sv.global then sv.global = {} end
|
||||
if defaults then
|
||||
copyDefaults(sv.global, defaults)
|
||||
end
|
||||
rawset(t, section, sv.global)
|
||||
else
|
||||
initSection(t, section, section, key, defaults)
|
||||
end
|
||||
end
|
||||
|
||||
return rawget(t, section)
|
||||
end
|
||||
}
|
||||
|
||||
local function validateDefaults(defaults, keyTbl, offset)
|
||||
if not defaults then return end
|
||||
offset = offset or 0
|
||||
for k in pairs(defaults) do
|
||||
if not keyTbl[k] or k == "profiles" then
|
||||
error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local preserve_keys = {
|
||||
["callbacks"] = true,
|
||||
["RegisterCallback"] = true,
|
||||
["UnregisterCallback"] = true,
|
||||
["UnregisterAllCallbacks"] = true,
|
||||
["children"] = true,
|
||||
}
|
||||
|
||||
local realmKey = GetRealmName()
|
||||
local charKey = UnitName("player") .. " - " .. realmKey
|
||||
local _, classKey = UnitClass("player")
|
||||
local _, raceKey = UnitRace("player")
|
||||
local factionKey = UnitFactionGroup("player")
|
||||
local factionrealmKey = factionKey .. " - " .. realmKey
|
||||
-- Actual database initialization function
|
||||
local function initdb(sv, defaults, defaultProfile, olddb, parent)
|
||||
-- Generate the database keys for each section
|
||||
|
||||
-- map "true" to our "Default" profile
|
||||
if defaultProfile == true then defaultProfile = "Default" end
|
||||
|
||||
local profileKey
|
||||
if not parent then
|
||||
-- Make a container for profile keys
|
||||
if not sv.profileKeys then sv.profileKeys = {} end
|
||||
|
||||
-- Try to get the profile selected from the char db
|
||||
profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
|
||||
|
||||
-- save the selected profile for later
|
||||
sv.profileKeys[charKey] = profileKey
|
||||
else
|
||||
-- Use the profile of the parents DB
|
||||
profileKey = parent.keys.profile or defaultProfile or charKey
|
||||
|
||||
-- clear the profileKeys in the DB, namespaces don't need to store them
|
||||
sv.profileKeys = nil
|
||||
end
|
||||
|
||||
-- This table contains keys that enable the dynamic creation
|
||||
-- of each section of the table. The 'global' and 'profiles'
|
||||
-- have a key of true, since they are handled in a special case
|
||||
local keyTbl= {
|
||||
["char"] = charKey,
|
||||
["realm"] = realmKey,
|
||||
["class"] = classKey,
|
||||
["race"] = raceKey,
|
||||
["faction"] = factionKey,
|
||||
["factionrealm"] = factionrealmKey,
|
||||
["profile"] = profileKey,
|
||||
["global"] = true,
|
||||
["profiles"] = true,
|
||||
}
|
||||
|
||||
validateDefaults(defaults, keyTbl, 1)
|
||||
|
||||
-- This allows us to use this function to reset an entire database
|
||||
-- Clear out the old database
|
||||
if olddb then
|
||||
for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
|
||||
end
|
||||
|
||||
-- Give this database the metatable so it initializes dynamically
|
||||
local db = setmetatable(olddb or {}, dbmt)
|
||||
|
||||
if not rawget(db, "callbacks") then
|
||||
-- try to load CallbackHandler-1.0 if it loaded after our library
|
||||
if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
|
||||
db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
|
||||
end
|
||||
|
||||
-- Copy methods locally into the database object, to avoid hitting
|
||||
-- the metatable when calling methods
|
||||
|
||||
if not parent then
|
||||
for name, func in pairs(DBObjectLib) do
|
||||
db[name] = func
|
||||
end
|
||||
else
|
||||
-- hack this one in
|
||||
db.RegisterDefaults = DBObjectLib.RegisterDefaults
|
||||
db.ResetProfile = DBObjectLib.ResetProfile
|
||||
end
|
||||
|
||||
-- Set some properties in the database object
|
||||
db.profiles = sv.profiles
|
||||
db.keys = keyTbl
|
||||
db.sv = sv
|
||||
--db.sv_name = name
|
||||
db.defaults = defaults
|
||||
db.parent = parent
|
||||
|
||||
-- store the DB in the registry
|
||||
AceDB.db_registry[db] = true
|
||||
|
||||
return db
|
||||
end
|
||||
|
||||
-- handle PLAYER_LOGOUT
|
||||
-- strip all defaults from all databases
|
||||
-- and cleans up empty sections
|
||||
local function logoutHandler(frame, event)
|
||||
if event == "PLAYER_LOGOUT" then
|
||||
for db in pairs(AceDB.db_registry) do
|
||||
db.callbacks:Fire("OnDatabaseShutdown", db)
|
||||
db:RegisterDefaults(nil)
|
||||
|
||||
-- cleanup sections that are empty without defaults
|
||||
local sv = rawget(db, "sv")
|
||||
for section in pairs(db.keys) do
|
||||
if rawget(sv, section) then
|
||||
-- global is special, all other sections have sub-entrys
|
||||
-- also don't delete empty profiles on main dbs, only on namespaces
|
||||
if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
|
||||
for key in pairs(sv[section]) do
|
||||
if not next(sv[section][key]) then
|
||||
sv[section][key] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
if not next(sv[section]) then
|
||||
sv[section] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
|
||||
AceDB.frame:SetScript("OnEvent", logoutHandler)
|
||||
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
AceDB Object Method Definitions
|
||||
---------------------------------------------------------------------------]]
|
||||
|
||||
--- Sets the defaults table for the given database object by clearing any
|
||||
-- that are currently set, and then setting the new defaults.
|
||||
-- @param defaults A table of defaults for this database
|
||||
function DBObjectLib:RegisterDefaults(defaults)
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
|
||||
end
|
||||
|
||||
validateDefaults(defaults, self.keys)
|
||||
|
||||
-- Remove any currently set defaults
|
||||
if self.defaults then
|
||||
for section,key in pairs(self.keys) do
|
||||
if self.defaults[section] and rawget(self, section) then
|
||||
removeDefaults(self[section], self.defaults[section])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Set the DBObject.defaults table
|
||||
self.defaults = defaults
|
||||
|
||||
-- Copy in any defaults, only touching those sections already created
|
||||
if defaults then
|
||||
for section,key in pairs(self.keys) do
|
||||
if defaults[section] and rawget(self, section) then
|
||||
copyDefaults(self[section], defaults[section])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Changes the profile of the database and all of it's namespaces to the
|
||||
-- supplied named profile
|
||||
-- @param name The name of the profile to set as the current profile
|
||||
function DBObjectLib:SetProfile(name)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
|
||||
end
|
||||
|
||||
-- changing to the same profile, dont do anything
|
||||
if name == self.keys.profile then return end
|
||||
|
||||
local oldProfile = self.profile
|
||||
local defaults = self.defaults and self.defaults.profile
|
||||
|
||||
-- Callback: OnProfileShutdown, database
|
||||
self.callbacks:Fire("OnProfileShutdown", self)
|
||||
|
||||
if oldProfile and defaults then
|
||||
-- Remove the defaults from the old profile
|
||||
removeDefaults(oldProfile, defaults)
|
||||
end
|
||||
|
||||
self.profile = nil
|
||||
self.keys["profile"] = name
|
||||
|
||||
-- if the storage exists, save the new profile
|
||||
-- this won't exist on namespaces.
|
||||
if self.sv.profileKeys then
|
||||
self.sv.profileKeys[charKey] = name
|
||||
end
|
||||
|
||||
-- populate to child namespaces
|
||||
if self.children then
|
||||
for _, db in pairs(self.children) do
|
||||
DBObjectLib.SetProfile(db, name)
|
||||
end
|
||||
end
|
||||
|
||||
-- Callback: OnProfileChanged, database, newProfileKey
|
||||
self.callbacks:Fire("OnProfileChanged", self, name)
|
||||
end
|
||||
|
||||
--- Returns a table with the names of the existing profiles in the database.
|
||||
-- You can optionally supply a table to re-use for this purpose.
|
||||
-- @param tbl A table to store the profile names in (optional)
|
||||
function DBObjectLib:GetProfiles(tbl)
|
||||
if tbl and type(tbl) ~= "table" then
|
||||
error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
|
||||
end
|
||||
|
||||
-- Clear the container table
|
||||
if tbl then
|
||||
for k,v in pairs(tbl) do tbl[k] = nil end
|
||||
else
|
||||
tbl = {}
|
||||
end
|
||||
|
||||
local curProfile = self.keys.profile
|
||||
|
||||
local i = 0
|
||||
for profileKey in pairs(self.profiles) do
|
||||
i = i + 1
|
||||
tbl[i] = profileKey
|
||||
if curProfile and profileKey == curProfile then curProfile = nil end
|
||||
end
|
||||
|
||||
-- Add the current profile, if it hasn't been created yet
|
||||
if curProfile then
|
||||
i = i + 1
|
||||
tbl[i] = curProfile
|
||||
end
|
||||
|
||||
return tbl, i
|
||||
end
|
||||
|
||||
--- Returns the current profile name used by the database
|
||||
function DBObjectLib:GetCurrentProfile()
|
||||
return self.keys.profile
|
||||
end
|
||||
|
||||
--- Deletes a named profile. This profile must not be the active profile.
|
||||
-- @param name The name of the profile to be deleted
|
||||
-- @param silent If true, do not raise an error when the profile does not exist
|
||||
function DBObjectLib:DeleteProfile(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
|
||||
end
|
||||
|
||||
if self.keys.profile == name then
|
||||
error("Cannot delete the active profile in an AceDBObject.", 2)
|
||||
end
|
||||
|
||||
if not rawget(self.profiles, name) and not silent then
|
||||
error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
|
||||
end
|
||||
|
||||
self.profiles[name] = nil
|
||||
|
||||
-- populate to child namespaces
|
||||
if self.children then
|
||||
for _, db in pairs(self.children) do
|
||||
DBObjectLib.DeleteProfile(db, name, true)
|
||||
end
|
||||
end
|
||||
|
||||
-- Callback: OnProfileDeleted, database, profileKey
|
||||
self.callbacks:Fire("OnProfileDeleted", self, name)
|
||||
end
|
||||
|
||||
--- Copies a named profile into the current profile, overwriting any conflicting
|
||||
-- settings.
|
||||
-- @param name The name of the profile to be copied into the current profile
|
||||
-- @param silent If true, do not raise an error when the profile does not exist
|
||||
function DBObjectLib:CopyProfile(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
|
||||
end
|
||||
|
||||
if name == self.keys.profile then
|
||||
error("Cannot have the same source and destination profiles.", 2)
|
||||
end
|
||||
|
||||
if not rawget(self.profiles, name) and not silent then
|
||||
error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
|
||||
end
|
||||
|
||||
-- Reset the profile before copying
|
||||
DBObjectLib.ResetProfile(self, nil, true)
|
||||
|
||||
local profile = self.profile
|
||||
local source = self.profiles[name]
|
||||
|
||||
copyTable(source, profile)
|
||||
|
||||
-- populate to child namespaces
|
||||
if self.children then
|
||||
for _, db in pairs(self.children) do
|
||||
DBObjectLib.CopyProfile(db, name, true)
|
||||
end
|
||||
end
|
||||
|
||||
-- Callback: OnProfileCopied, database, sourceProfileKey
|
||||
self.callbacks:Fire("OnProfileCopied", self, name)
|
||||
end
|
||||
|
||||
--- Resets the current profile to the default values (if specified).
|
||||
-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
|
||||
-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
|
||||
function DBObjectLib:ResetProfile(noChildren, noCallbacks)
|
||||
local profile = self.profile
|
||||
|
||||
for k,v in pairs(profile) do
|
||||
profile[k] = nil
|
||||
end
|
||||
|
||||
local defaults = self.defaults and self.defaults.profile
|
||||
if defaults then
|
||||
copyDefaults(profile, defaults)
|
||||
end
|
||||
|
||||
-- populate to child namespaces
|
||||
if self.children and not noChildren then
|
||||
for _, db in pairs(self.children) do
|
||||
DBObjectLib.ResetProfile(db, nil, noCallbacks)
|
||||
end
|
||||
end
|
||||
|
||||
-- Callback: OnProfileReset, database
|
||||
if not noCallbacks then
|
||||
self.callbacks:Fire("OnProfileReset", self)
|
||||
end
|
||||
end
|
||||
|
||||
--- Resets the entire database, using the string defaultProfile as the new default
|
||||
-- profile.
|
||||
-- @param defaultProfile The profile name to use as the default
|
||||
function DBObjectLib:ResetDB(defaultProfile)
|
||||
if defaultProfile and type(defaultProfile) ~= "string" then
|
||||
error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
|
||||
end
|
||||
|
||||
local sv = self.sv
|
||||
for k,v in pairs(sv) do
|
||||
sv[k] = nil
|
||||
end
|
||||
|
||||
local parent = self.parent
|
||||
|
||||
initdb(sv, self.defaults, defaultProfile, self)
|
||||
|
||||
-- fix the child namespaces
|
||||
if self.children then
|
||||
if not sv.namespaces then sv.namespaces = {} end
|
||||
for name, db in pairs(self.children) do
|
||||
if not sv.namespaces[name] then sv.namespaces[name] = {} end
|
||||
initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
|
||||
end
|
||||
end
|
||||
|
||||
-- Callback: OnDatabaseReset, database
|
||||
self.callbacks:Fire("OnDatabaseReset", self)
|
||||
-- Callback: OnProfileChanged, database, profileKey
|
||||
self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Creates a new database namespace, directly tied to the database. This
|
||||
-- is a full scale database in it's own rights other than the fact that
|
||||
-- it cannot control its profile individually
|
||||
-- @param name The name of the new namespace
|
||||
-- @param defaults A table of values to use as defaults
|
||||
function DBObjectLib:RegisterNamespace(name, defaults)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
|
||||
end
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
|
||||
end
|
||||
if self.children and self.children[name] then
|
||||
error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
|
||||
end
|
||||
|
||||
local sv = self.sv
|
||||
if not sv.namespaces then sv.namespaces = {} end
|
||||
if not sv.namespaces[name] then
|
||||
sv.namespaces[name] = {}
|
||||
end
|
||||
|
||||
local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
|
||||
|
||||
if not self.children then self.children = {} end
|
||||
self.children[name] = newDB
|
||||
return newDB
|
||||
end
|
||||
|
||||
--- Returns an already existing namespace from the database object.
|
||||
-- @param name The name of the new namespace
|
||||
-- @param silent if true, the addon is optional, silently return nil if its not found
|
||||
-- @usage
|
||||
-- local namespace = self.db:GetNamespace('namespace')
|
||||
-- @return the namespace object if found
|
||||
function DBObjectLib:GetNamespace(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
|
||||
end
|
||||
if not silent and not (self.children and self.children[name]) then
|
||||
error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
|
||||
end
|
||||
if not self.children then self.children = {} end
|
||||
return self.children[name]
|
||||
end
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
AceDB Exposed Methods
|
||||
---------------------------------------------------------------------------]]
|
||||
|
||||
--- Creates a new database object that can be used to handle database settings and profiles.
|
||||
-- By default, an empty DB is created, using a character specific profile.
|
||||
--
|
||||
-- You can override the default profile used by passing any profile name as the third argument,
|
||||
-- or by passing //true// as the third argument to use a globally shared profile called "Default".
|
||||
--
|
||||
-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
|
||||
-- will use a profile named "char", and not a character-specific profile.
|
||||
-- @param tbl The name of variable, or table to use for the database
|
||||
-- @param defaults A table of database defaults
|
||||
-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
|
||||
-- You can also pass //true// to use a shared global profile called "Default".
|
||||
-- @usage
|
||||
-- -- Create an empty DB using a character-specific default profile.
|
||||
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
|
||||
-- @usage
|
||||
-- -- Create a DB using defaults and using a shared default profile
|
||||
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
|
||||
function AceDB:New(tbl, defaults, defaultProfile)
|
||||
if type(tbl) == "string" then
|
||||
local name = tbl
|
||||
tbl = _G[name]
|
||||
if not tbl then
|
||||
tbl = {}
|
||||
_G[name] = tbl
|
||||
end
|
||||
end
|
||||
|
||||
if type(tbl) ~= "table" then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
|
||||
end
|
||||
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
|
||||
end
|
||||
|
||||
if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
|
||||
end
|
||||
|
||||
return initdb(tbl, defaults, defaultProfile)
|
||||
end
|
||||
|
||||
-- upgrade existing databases
|
||||
for db in pairs(AceDB.db_registry) do
|
||||
if not db.parent then
|
||||
for name,func in pairs(DBObjectLib) do
|
||||
db[name] = func
|
||||
end
|
||||
else
|
||||
db.RegisterDefaults = DBObjectLib.RegisterDefaults
|
||||
db.ResetProfile = DBObjectLib.ResetProfile
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceDB-3.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,15 @@
|
||||
## Interface: 30200
|
||||
## LoadOnDemand: 1
|
||||
## Title: Lib: CallbackHandler-1.0
|
||||
## Notes: Callback handling Library, normally embedded inside other libraries
|
||||
## Author: Ace3 Development Team
|
||||
## X-Website: http://www.wowace.com/projects/callbackhandler/
|
||||
## X-Category: Library
|
||||
## X-License: BSD-2.0
|
||||
## X-Curse-Packaged-Version: 1.0.5
|
||||
## X-Curse-Project-Name: CallbackHandler-1.0
|
||||
## X-Curse-Project-ID: callbackhandler
|
||||
## X-Curse-Repository-ID: wow/callbackhandler/mainline
|
||||
|
||||
LibStub\LibStub.lua
|
||||
CallbackHandler-1.0\CallbackHandler-1.0.xml
|
||||
@@ -0,0 +1,239 @@
|
||||
--[[ $Id: CallbackHandler-1.0.lua 9 2009-09-17 10:38:10Z mikk $ ]]
|
||||
local MAJOR, MINOR = "CallbackHandler-1.0", 5
|
||||
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not CallbackHandler then return end -- No upgrade needed
|
||||
|
||||
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
|
||||
|
||||
local type = type
|
||||
local pcall = pcall
|
||||
local pairs = pairs
|
||||
local assert = assert
|
||||
local concat = table.concat
|
||||
local loadstring = loadstring
|
||||
local next = next
|
||||
local select = select
|
||||
local type = type
|
||||
local xpcall = xpcall
|
||||
|
||||
local function errorhandler(err)
|
||||
return geterrorhandler()(err)
|
||||
end
|
||||
|
||||
local function CreateDispatcher(argCount)
|
||||
local code = [[
|
||||
local next, xpcall, eh = ...
|
||||
|
||||
local method, ARGS
|
||||
local function call() method(ARGS) end
|
||||
|
||||
local function dispatch(handlers, ...)
|
||||
local index
|
||||
index, method = next(handlers)
|
||||
if not method then return end
|
||||
local OLD_ARGS = ARGS
|
||||
ARGS = ...
|
||||
repeat
|
||||
xpcall(call, eh)
|
||||
index, method = next(handlers, index)
|
||||
until not method
|
||||
ARGS = OLD_ARGS
|
||||
end
|
||||
|
||||
return dispatch
|
||||
]]
|
||||
|
||||
local ARGS, OLD_ARGS = {}, {}
|
||||
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
|
||||
code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
|
||||
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
|
||||
end
|
||||
|
||||
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
|
||||
local dispatcher = CreateDispatcher(argCount)
|
||||
rawset(self, argCount, dispatcher)
|
||||
return dispatcher
|
||||
end})
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- CallbackHandler:New
|
||||
--
|
||||
-- target - target object to embed public APIs in
|
||||
-- RegisterName - name of the callback registration API, default "RegisterCallback"
|
||||
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
|
||||
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
|
||||
|
||||
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
|
||||
-- TODO: Remove this after beta has gone out
|
||||
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
|
||||
|
||||
RegisterName = RegisterName or "RegisterCallback"
|
||||
UnregisterName = UnregisterName or "UnregisterCallback"
|
||||
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
|
||||
UnregisterAllName = "UnregisterAllCallbacks"
|
||||
end
|
||||
|
||||
-- we declare all objects and exported APIs inside this closure to quickly gain access
|
||||
-- to e.g. function names, the "target" parameter, etc
|
||||
|
||||
|
||||
-- Create the registry object
|
||||
local events = setmetatable({}, meta)
|
||||
local registry = { recurse=0, events=events }
|
||||
|
||||
-- registry:Fire() - fires the given event/message into the registry
|
||||
function registry:Fire(eventname, ...)
|
||||
if not rawget(events, eventname) or not next(events[eventname]) then return end
|
||||
local oldrecurse = registry.recurse
|
||||
registry.recurse = oldrecurse + 1
|
||||
|
||||
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
|
||||
|
||||
registry.recurse = oldrecurse
|
||||
|
||||
if registry.insertQueue and oldrecurse==0 then
|
||||
-- Something in one of our callbacks wanted to register more callbacks; they got queued
|
||||
for eventname,callbacks in pairs(registry.insertQueue) do
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
for self,func in pairs(callbacks) do
|
||||
events[eventname][self] = func
|
||||
-- fire OnUsed callback?
|
||||
if first and registry.OnUsed then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
first = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
registry.insertQueue = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Registration of a callback, handles:
|
||||
-- self["method"], leads to self["method"](self, ...)
|
||||
-- self with function ref, leads to functionref(...)
|
||||
-- "addonId" (instead of self) with function ref, leads to functionref(...)
|
||||
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
|
||||
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
|
||||
end
|
||||
|
||||
method = method or eventname
|
||||
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
|
||||
if type(method) ~= "string" and type(method) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
|
||||
end
|
||||
|
||||
local regfunc
|
||||
|
||||
if type(method) == "string" then
|
||||
-- self["method"] calling style
|
||||
if type(self) ~= "table" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
|
||||
elseif self==target then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
|
||||
elseif type(self[method]) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) self[method](self,arg,...) end
|
||||
else
|
||||
regfunc = function(...) self[method](self,...) end
|
||||
end
|
||||
else
|
||||
-- function ref with self=object or self="addonId"
|
||||
if type(self)~="table" and type(self)~="string" then
|
||||
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) method(arg,...) end
|
||||
else
|
||||
regfunc = method
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if events[eventname][self] or registry.recurse<1 then
|
||||
-- if registry.recurse<1 then
|
||||
-- we're overwriting an existing entry, or not currently recursing. just set it.
|
||||
events[eventname][self] = regfunc
|
||||
-- fire OnUsed callback?
|
||||
if registry.OnUsed and first then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
end
|
||||
else
|
||||
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
|
||||
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
|
||||
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
|
||||
registry.insertQueue[eventname][self] = regfunc
|
||||
end
|
||||
end
|
||||
|
||||
-- Unregister a callback
|
||||
target[UnregisterName] = function(self, eventname)
|
||||
if not self or self==target then
|
||||
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
|
||||
end
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
|
||||
end
|
||||
if rawget(events, eventname) and events[eventname][self] then
|
||||
events[eventname][self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(events[eventname]) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
|
||||
registry.insertQueue[eventname][self] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
|
||||
if UnregisterAllName then
|
||||
target[UnregisterAllName] = function(...)
|
||||
if select("#",...)<1 then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
|
||||
end
|
||||
if select("#",...)==1 and ...==target then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
|
||||
end
|
||||
|
||||
|
||||
for i=1,select("#",...) do
|
||||
local self = select(i,...)
|
||||
if registry.insertQueue then
|
||||
for eventname, callbacks in pairs(registry.insertQueue) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
for eventname, callbacks in pairs(events) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(callbacks) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return registry
|
||||
end
|
||||
|
||||
|
||||
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
|
||||
-- try to upgrade old implicit embeds since the system is selfcontained and
|
||||
-- relies on closures to work.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="CallbackHandler-1.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,30 @@
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
function LibStub:NewLibrary(major, minor)
|
||||
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
||||
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
||||
|
||||
local oldminor = self.minors[major]
|
||||
if oldminor and oldminor >= minor then return nil end
|
||||
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
function LibStub:GetLibrary(major, silent)
|
||||
if not self.libs[major] and not silent then
|
||||
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
||||
end
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
@@ -0,0 +1,503 @@
|
||||
--
|
||||
-- ChatThrottleLib by Mikk
|
||||
--
|
||||
-- Manages AddOn chat output to keep player from getting kicked off.
|
||||
--
|
||||
-- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept
|
||||
-- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage.
|
||||
--
|
||||
-- Priorities get an equal share of available bandwidth when fully loaded.
|
||||
-- Communication channels are separated on extension+chattype+destination and
|
||||
-- get round-robinned. (Destination only matters for whispers and channels,
|
||||
-- obviously)
|
||||
--
|
||||
-- Will install hooks for SendChatMessage and SendAddonMessage to measure
|
||||
-- bandwidth bypassing the library and use less bandwidth itself.
|
||||
--
|
||||
--
|
||||
-- Fully embeddable library. Just copy this file into your addon directory,
|
||||
-- add it to the .toc, and it's done.
|
||||
--
|
||||
-- Can run as a standalone addon also, but, really, just embed it! :-)
|
||||
--
|
||||
|
||||
local CTL_VERSION = 21
|
||||
|
||||
local _G = _G
|
||||
|
||||
if _G.ChatThrottleLib then
|
||||
if _G.ChatThrottleLib.version >= CTL_VERSION then
|
||||
-- There's already a newer (or same) version loaded. Buh-bye.
|
||||
return
|
||||
elseif not _G.ChatThrottleLib.securelyHooked then
|
||||
print("ChatThrottleLib: Warning: There's an ANCIENT ChatThrottleLib.lua (pre-wow 2.0, <v16) in an addon somewhere. Get the addon updated or copy in a newer ChatThrottleLib.lua (>=v16) in it!")
|
||||
-- ATTEMPT to unhook; this'll behave badly if someone else has hooked...
|
||||
-- ... and if someone has securehooked, they can kiss that goodbye too... >.<
|
||||
_G.SendChatMessage = _G.ChatThrottleLib.ORIG_SendChatMessage
|
||||
if _G.ChatThrottleLib.ORIG_SendAddonMessage then
|
||||
_G.SendAddonMessage = _G.ChatThrottleLib.ORIG_SendAddonMessage
|
||||
end
|
||||
end
|
||||
_G.ChatThrottleLib.ORIG_SendChatMessage = nil
|
||||
_G.ChatThrottleLib.ORIG_SendAddonMessage = nil
|
||||
end
|
||||
|
||||
if not _G.ChatThrottleLib then
|
||||
_G.ChatThrottleLib = {}
|
||||
end
|
||||
|
||||
ChatThrottleLib = _G.ChatThrottleLib -- in case some addon does "local ChatThrottleLib" above us and we're copypasted (AceComm-2, sigh)
|
||||
local ChatThrottleLib = _G.ChatThrottleLib
|
||||
|
||||
ChatThrottleLib.version = CTL_VERSION
|
||||
|
||||
|
||||
|
||||
------------------ TWEAKABLES -----------------
|
||||
|
||||
ChatThrottleLib.MAX_CPS = 800 -- 2000 seems to be safe if NOTHING ELSE is happening. let's call it 800.
|
||||
ChatThrottleLib.MSG_OVERHEAD = 40 -- Guesstimate overhead for sending a message; source+dest+chattype+protocolstuff
|
||||
|
||||
ChatThrottleLib.BURST = 4000 -- WoW's server buffer seems to be about 32KB. 8KB should be safe, but seen disconnects on _some_ servers. Using 4KB now.
|
||||
|
||||
ChatThrottleLib.MIN_FPS = 20 -- Reduce output CPS to half (and don't burst) if FPS drops below this value
|
||||
|
||||
|
||||
local setmetatable = setmetatable
|
||||
local table_remove = table.remove
|
||||
local tostring = tostring
|
||||
local GetTime = GetTime
|
||||
local math_min = math.min
|
||||
local math_max = math.max
|
||||
local next = next
|
||||
local strlen = string.len
|
||||
local GetFrameRate = GetFrameRate
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Double-linked ring implementation
|
||||
|
||||
local Ring = {}
|
||||
local RingMeta = { __index = Ring }
|
||||
|
||||
function Ring:New()
|
||||
local ret = {}
|
||||
setmetatable(ret, RingMeta)
|
||||
return ret
|
||||
end
|
||||
|
||||
function Ring:Add(obj) -- Append at the "far end" of the ring (aka just before the current position)
|
||||
if self.pos then
|
||||
obj.prev = self.pos.prev
|
||||
obj.prev.next = obj
|
||||
obj.next = self.pos
|
||||
obj.next.prev = obj
|
||||
else
|
||||
obj.next = obj
|
||||
obj.prev = obj
|
||||
self.pos = obj
|
||||
end
|
||||
end
|
||||
|
||||
function Ring:Remove(obj)
|
||||
obj.next.prev = obj.prev
|
||||
obj.prev.next = obj.next
|
||||
if self.pos == obj then
|
||||
self.pos = obj.next
|
||||
if self.pos == obj then
|
||||
self.pos = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Recycling bin for pipes
|
||||
-- A pipe is a plain integer-indexed queue, which also happens to be a ring member
|
||||
|
||||
ChatThrottleLib.PipeBin = nil -- pre-v19, drastically different
|
||||
local PipeBin = setmetatable({}, {__mode="k"})
|
||||
|
||||
local function DelPipe(pipe)
|
||||
for i = #pipe, 1, -1 do
|
||||
pipe[i] = nil
|
||||
end
|
||||
pipe.prev = nil
|
||||
pipe.next = nil
|
||||
|
||||
PipeBin[pipe] = true
|
||||
end
|
||||
|
||||
local function NewPipe()
|
||||
local pipe = next(PipeBin)
|
||||
if pipe then
|
||||
PipeBin[pipe] = nil
|
||||
return pipe
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Recycling bin for messages
|
||||
|
||||
ChatThrottleLib.MsgBin = nil -- pre-v19, drastically different
|
||||
local MsgBin = setmetatable({}, {__mode="k"})
|
||||
|
||||
local function DelMsg(msg)
|
||||
msg[1] = nil
|
||||
-- there's more parameters, but they're very repetetive so the string pool doesn't suffer really, and it's faster to just not delete them.
|
||||
MsgBin[msg] = true
|
||||
end
|
||||
|
||||
local function NewMsg()
|
||||
local msg = next(MsgBin)
|
||||
if msg then
|
||||
MsgBin[msg] = nil
|
||||
return msg
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- ChatThrottleLib:Init
|
||||
-- Initialize queues, set up frame for OnUpdate, etc
|
||||
|
||||
|
||||
function ChatThrottleLib:Init()
|
||||
|
||||
-- Set up queues
|
||||
if not self.Prio then
|
||||
self.Prio = {}
|
||||
self.Prio["ALERT"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
|
||||
self.Prio["NORMAL"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
|
||||
self.Prio["BULK"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
|
||||
end
|
||||
|
||||
-- v4: total send counters per priority
|
||||
for _, Prio in pairs(self.Prio) do
|
||||
Prio.nTotalSent = Prio.nTotalSent or 0
|
||||
end
|
||||
|
||||
if not self.avail then
|
||||
self.avail = 0 -- v5
|
||||
end
|
||||
if not self.nTotalSent then
|
||||
self.nTotalSent = 0 -- v5
|
||||
end
|
||||
|
||||
|
||||
-- Set up a frame to get OnUpdate events
|
||||
if not self.Frame then
|
||||
self.Frame = CreateFrame("Frame")
|
||||
self.Frame:Hide()
|
||||
end
|
||||
self.Frame:SetScript("OnUpdate", self.OnUpdate)
|
||||
self.Frame:SetScript("OnEvent", self.OnEvent) -- v11: Monitor P_E_W so we can throttle hard for a few seconds
|
||||
self.Frame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
self.OnUpdateDelay = 0
|
||||
self.LastAvailUpdate = GetTime()
|
||||
self.HardThrottlingBeginTime = GetTime() -- v11: Throttle hard for a few seconds after startup
|
||||
|
||||
-- Hook SendChatMessage and SendAddonMessage so we can measure unpiped traffic and avoid overloads (v7)
|
||||
if not self.securelyHooked then
|
||||
-- Use secure hooks as of v16. Old regular hook support yanked out in v21.
|
||||
self.securelyHooked = true
|
||||
--SendChatMessage
|
||||
hooksecurefunc("SendChatMessage", function(...)
|
||||
return ChatThrottleLib.Hook_SendChatMessage(...)
|
||||
end)
|
||||
--SendAddonMessage
|
||||
hooksecurefunc("SendAddonMessage", function(...)
|
||||
return ChatThrottleLib.Hook_SendAddonMessage(...)
|
||||
end)
|
||||
end
|
||||
self.nBypass = 0
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- ChatThrottleLib.Hook_SendChatMessage / .Hook_SendAddonMessage
|
||||
|
||||
local bMyTraffic = false
|
||||
|
||||
function ChatThrottleLib.Hook_SendChatMessage(text, chattype, language, destination, ...)
|
||||
if bMyTraffic then
|
||||
return
|
||||
end
|
||||
local self = ChatThrottleLib
|
||||
local size = strlen(tostring(text or "")) + strlen(tostring(destination or "")) + self.MSG_OVERHEAD
|
||||
self.avail = self.avail - size
|
||||
self.nBypass = self.nBypass + size -- just a statistic
|
||||
end
|
||||
function ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destination, ...)
|
||||
if bMyTraffic then
|
||||
return
|
||||
end
|
||||
local self = ChatThrottleLib
|
||||
local size = tostring(text or ""):len() + tostring(prefix or ""):len();
|
||||
size = size + tostring(destination or ""):len() + self.MSG_OVERHEAD
|
||||
self.avail = self.avail - size
|
||||
self.nBypass = self.nBypass + size -- just a statistic
|
||||
end
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- ChatThrottleLib:UpdateAvail
|
||||
-- Update self.avail with how much bandwidth is currently available
|
||||
|
||||
function ChatThrottleLib:UpdateAvail()
|
||||
local now = GetTime()
|
||||
local MAX_CPS = self.MAX_CPS;
|
||||
local newavail = MAX_CPS * (now - self.LastAvailUpdate)
|
||||
local avail = self.avail
|
||||
|
||||
if now - self.HardThrottlingBeginTime < 5 then
|
||||
-- First 5 seconds after startup/zoning: VERY hard clamping to avoid irritating the server rate limiter, it seems very cranky then
|
||||
avail = math_min(avail + (newavail*0.1), MAX_CPS*0.5)
|
||||
self.bChoking = true
|
||||
elseif GetFramerate() < self.MIN_FPS then -- GetFrameRate call takes ~0.002 secs
|
||||
avail = math_min(MAX_CPS, avail + newavail*0.5)
|
||||
self.bChoking = true -- just a statistic
|
||||
else
|
||||
avail = math_min(self.BURST, avail + newavail)
|
||||
self.bChoking = false
|
||||
end
|
||||
|
||||
avail = math_max(avail, 0-(MAX_CPS*2)) -- Can go negative when someone is eating bandwidth past the lib. but we refuse to stay silent for more than 2 seconds; if they can do it, we can.
|
||||
|
||||
self.avail = avail
|
||||
self.LastAvailUpdate = now
|
||||
|
||||
return avail
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Despooling logic
|
||||
|
||||
function ChatThrottleLib:Despool(Prio)
|
||||
local ring = Prio.Ring
|
||||
while ring.pos and Prio.avail > ring.pos[1].nSize do
|
||||
local msg = table_remove(Prio.Ring.pos, 1)
|
||||
if not Prio.Ring.pos[1] then
|
||||
local pipe = Prio.Ring.pos
|
||||
Prio.Ring:Remove(pipe)
|
||||
Prio.ByName[pipe.name] = nil
|
||||
DelPipe(pipe)
|
||||
else
|
||||
Prio.Ring.pos = Prio.Ring.pos.next
|
||||
end
|
||||
Prio.avail = Prio.avail - msg.nSize
|
||||
bMyTraffic = true
|
||||
msg.f(unpack(msg, 1, msg.n))
|
||||
bMyTraffic = false
|
||||
Prio.nTotalSent = Prio.nTotalSent + msg.nSize
|
||||
DelMsg(msg)
|
||||
if msg.callbackFn then
|
||||
msg.callbackFn (msg.callbackArg)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function ChatThrottleLib.OnEvent(this,event)
|
||||
-- v11: We know that the rate limiter is touchy after login. Assume that it's touchy after zoning, too.
|
||||
local self = ChatThrottleLib
|
||||
if event == "PLAYER_ENTERING_WORLD" then
|
||||
self.HardThrottlingBeginTime = GetTime() -- Throttle hard for a few seconds after zoning
|
||||
self.avail = 0
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function ChatThrottleLib.OnUpdate(this,delay)
|
||||
local self = ChatThrottleLib
|
||||
|
||||
self.OnUpdateDelay = self.OnUpdateDelay + delay
|
||||
if self.OnUpdateDelay < 0.08 then
|
||||
return
|
||||
end
|
||||
self.OnUpdateDelay = 0
|
||||
|
||||
self:UpdateAvail()
|
||||
|
||||
if self.avail < 0 then
|
||||
return -- argh. some bastard is spewing stuff past the lib. just bail early to save cpu.
|
||||
end
|
||||
|
||||
-- See how many of our priorities have queued messages (we only have 3, don't worry about the loop)
|
||||
local n = 0
|
||||
for prioname,Prio in pairs(self.Prio) do
|
||||
if Prio.Ring.pos or Prio.avail < 0 then
|
||||
n = n + 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Anything queued still?
|
||||
if n<1 then
|
||||
-- Nope. Move spillover bandwidth to global availability gauge and clear self.bQueueing
|
||||
for prioname, Prio in pairs(self.Prio) do
|
||||
self.avail = self.avail + Prio.avail
|
||||
Prio.avail = 0
|
||||
end
|
||||
self.bQueueing = false
|
||||
self.Frame:Hide()
|
||||
return
|
||||
end
|
||||
|
||||
-- There's stuff queued. Hand out available bandwidth to priorities as needed and despool their queues
|
||||
local avail = self.avail/n
|
||||
self.avail = 0
|
||||
|
||||
for prioname, Prio in pairs(self.Prio) do
|
||||
if Prio.Ring.pos or Prio.avail < 0 then
|
||||
Prio.avail = Prio.avail + avail
|
||||
if Prio.Ring.pos and Prio.avail > Prio.Ring.pos[1].nSize then
|
||||
self:Despool(Prio)
|
||||
-- Note: We might not get here if the user-supplied callback function errors out! Take care!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Spooling logic
|
||||
|
||||
|
||||
function ChatThrottleLib:Enqueue(prioname, pipename, msg)
|
||||
local Prio = self.Prio[prioname]
|
||||
local pipe = Prio.ByName[pipename]
|
||||
if not pipe then
|
||||
self.Frame:Show()
|
||||
pipe = NewPipe()
|
||||
pipe.name = pipename
|
||||
Prio.ByName[pipename] = pipe
|
||||
Prio.Ring:Add(pipe)
|
||||
end
|
||||
|
||||
pipe[#pipe + 1] = msg
|
||||
|
||||
self.bQueueing = true
|
||||
end
|
||||
|
||||
|
||||
|
||||
function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, language, destination, queueName, callbackFn, callbackArg)
|
||||
if not self or not prio or not prefix or not text or not self.Prio[prio] then
|
||||
error('Usage: ChatThrottleLib:SendChatMessage("{BULK||NORMAL||ALERT}", "prefix", "text"[, "chattype"[, "language"[, "destination"]]]', 2)
|
||||
end
|
||||
if callbackFn and type(callbackFn)~="function" then
|
||||
error('ChatThrottleLib:ChatMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
|
||||
end
|
||||
|
||||
local nSize = text:len()
|
||||
|
||||
if nSize>255 then
|
||||
error("ChatThrottleLib:SendChatMessage(): message length cannot exceed 255 bytes", 2)
|
||||
end
|
||||
|
||||
nSize = nSize + self.MSG_OVERHEAD
|
||||
|
||||
-- Check if there's room in the global available bandwidth gauge to send directly
|
||||
if not self.bQueueing and nSize < self:UpdateAvail() then
|
||||
self.avail = self.avail - nSize
|
||||
bMyTraffic = true
|
||||
_G.SendChatMessage(text, chattype, language, destination)
|
||||
bMyTraffic = false
|
||||
self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
|
||||
if callbackFn then
|
||||
callbackFn (callbackArg)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- Message needs to be queued
|
||||
local msg = NewMsg()
|
||||
msg.f = _G.SendChatMessage
|
||||
msg[1] = text
|
||||
msg[2] = chattype or "SAY"
|
||||
msg[3] = language
|
||||
msg[4] = destination
|
||||
msg.n = 4
|
||||
msg.nSize = nSize
|
||||
msg.callbackFn = callbackFn
|
||||
msg.callbackArg = callbackArg
|
||||
|
||||
self:Enqueue(prio, queueName or (prefix..(chattype or "SAY")..(destination or "")), msg)
|
||||
end
|
||||
|
||||
|
||||
function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg)
|
||||
if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then
|
||||
error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2)
|
||||
end
|
||||
if callbackFn and type(callbackFn)~="function" then
|
||||
error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
|
||||
end
|
||||
|
||||
local nSize = prefix:len() + 1 + text:len();
|
||||
|
||||
if nSize>255 then
|
||||
error("ChatThrottleLib:SendAddonMessage(): prefix + message length cannot exceed 254 bytes", 2)
|
||||
end
|
||||
|
||||
nSize = nSize + self.MSG_OVERHEAD;
|
||||
|
||||
-- Check if there's room in the global available bandwidth gauge to send directly
|
||||
if not self.bQueueing and nSize < self:UpdateAvail() then
|
||||
self.avail = self.avail - nSize
|
||||
bMyTraffic = true
|
||||
_G.SendAddonMessage(prefix, text, chattype, target)
|
||||
bMyTraffic = false
|
||||
self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
|
||||
if callbackFn then
|
||||
callbackFn (callbackArg)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- Message needs to be queued
|
||||
local msg = NewMsg()
|
||||
msg.f = _G.SendAddonMessage
|
||||
msg[1] = prefix
|
||||
msg[2] = text
|
||||
msg[3] = chattype
|
||||
msg[4] = target
|
||||
msg.n = (target~=nil) and 4 or 3;
|
||||
msg.nSize = nSize
|
||||
msg.callbackFn = callbackFn
|
||||
msg.callbackArg = callbackArg
|
||||
|
||||
self:Enqueue(prio, queueName or (prefix..chattype..(target or "")), msg)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- Get the ball rolling!
|
||||
|
||||
ChatThrottleLib:Init()
|
||||
|
||||
--[[ WoWBench debugging snippet
|
||||
if(WOWB_VER) then
|
||||
local function SayTimer()
|
||||
print("SAY: "..GetTime().." "..arg1)
|
||||
end
|
||||
ChatThrottleLib.Frame:SetScript("OnEvent", SayTimer)
|
||||
ChatThrottleLib.Frame:RegisterEvent("CHAT_MSG_SAY")
|
||||
end
|
||||
]]
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
## Interface: 30300
|
||||
## Title: Lib: HealComm-4.0
|
||||
## Notes: Library for showing incoming heals and hots
|
||||
## Author: Shadowed
|
||||
## X-Category: Library
|
||||
## X-Curse-Packaged-Version: v1.6.5
|
||||
## X-Curse-Project-Name: LibHealComm-4.0
|
||||
## X-Curse-Project-ID: libhealcomm-4-0
|
||||
## X-Curse-Repository-ID: wow/libhealcomm-4-0/mainline
|
||||
|
||||
libs\LibStub\LibStub.lua
|
||||
libs\CallbackHandler-1.0\CallbackHandler-1.0\CallbackHandler-1.0.xml
|
||||
|
||||
LibHealComm-4.0.xml
|
||||
@@ -0,0 +1,5 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="ChatThrottleLib.lua"/>
|
||||
<Script file="LibHealComm-4.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,15 @@
|
||||
## Interface: 30200
|
||||
## LoadOnDemand: 1
|
||||
## Title: Lib: CallbackHandler-1.0
|
||||
## Notes: Callback handling Library, normally embedded inside other libraries
|
||||
## Author: Ace3 Development Team
|
||||
## X-Website: http://www.wowace.com/projects/callbackhandler/
|
||||
## X-Category: Library
|
||||
## X-License: BSD-2.0
|
||||
## X-Curse-Packaged-Version: 1.0.5
|
||||
## X-Curse-Project-Name: CallbackHandler-1.0
|
||||
## X-Curse-Project-ID: callbackhandler
|
||||
## X-Curse-Repository-ID: wow/callbackhandler/mainline
|
||||
|
||||
LibStub\LibStub.lua
|
||||
CallbackHandler-1.0\CallbackHandler-1.0.xml
|
||||
@@ -0,0 +1,239 @@
|
||||
--[[ $Id: CallbackHandler-1.0.lua 9 2009-09-17 10:38:10Z mikk $ ]]
|
||||
local MAJOR, MINOR = "CallbackHandler-1.0", 5
|
||||
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not CallbackHandler then return end -- No upgrade needed
|
||||
|
||||
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
|
||||
|
||||
local type = type
|
||||
local pcall = pcall
|
||||
local pairs = pairs
|
||||
local assert = assert
|
||||
local concat = table.concat
|
||||
local loadstring = loadstring
|
||||
local next = next
|
||||
local select = select
|
||||
local type = type
|
||||
local xpcall = xpcall
|
||||
|
||||
local function errorhandler(err)
|
||||
return geterrorhandler()(err)
|
||||
end
|
||||
|
||||
local function CreateDispatcher(argCount)
|
||||
local code = [[
|
||||
local next, xpcall, eh = ...
|
||||
|
||||
local method, ARGS
|
||||
local function call() method(ARGS) end
|
||||
|
||||
local function dispatch(handlers, ...)
|
||||
local index
|
||||
index, method = next(handlers)
|
||||
if not method then return end
|
||||
local OLD_ARGS = ARGS
|
||||
ARGS = ...
|
||||
repeat
|
||||
xpcall(call, eh)
|
||||
index, method = next(handlers, index)
|
||||
until not method
|
||||
ARGS = OLD_ARGS
|
||||
end
|
||||
|
||||
return dispatch
|
||||
]]
|
||||
|
||||
local ARGS, OLD_ARGS = {}, {}
|
||||
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
|
||||
code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
|
||||
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
|
||||
end
|
||||
|
||||
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
|
||||
local dispatcher = CreateDispatcher(argCount)
|
||||
rawset(self, argCount, dispatcher)
|
||||
return dispatcher
|
||||
end})
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- CallbackHandler:New
|
||||
--
|
||||
-- target - target object to embed public APIs in
|
||||
-- RegisterName - name of the callback registration API, default "RegisterCallback"
|
||||
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
|
||||
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
|
||||
|
||||
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
|
||||
-- TODO: Remove this after beta has gone out
|
||||
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
|
||||
|
||||
RegisterName = RegisterName or "RegisterCallback"
|
||||
UnregisterName = UnregisterName or "UnregisterCallback"
|
||||
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
|
||||
UnregisterAllName = "UnregisterAllCallbacks"
|
||||
end
|
||||
|
||||
-- we declare all objects and exported APIs inside this closure to quickly gain access
|
||||
-- to e.g. function names, the "target" parameter, etc
|
||||
|
||||
|
||||
-- Create the registry object
|
||||
local events = setmetatable({}, meta)
|
||||
local registry = { recurse=0, events=events }
|
||||
|
||||
-- registry:Fire() - fires the given event/message into the registry
|
||||
function registry:Fire(eventname, ...)
|
||||
if not rawget(events, eventname) or not next(events[eventname]) then return end
|
||||
local oldrecurse = registry.recurse
|
||||
registry.recurse = oldrecurse + 1
|
||||
|
||||
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
|
||||
|
||||
registry.recurse = oldrecurse
|
||||
|
||||
if registry.insertQueue and oldrecurse==0 then
|
||||
-- Something in one of our callbacks wanted to register more callbacks; they got queued
|
||||
for eventname,callbacks in pairs(registry.insertQueue) do
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
for self,func in pairs(callbacks) do
|
||||
events[eventname][self] = func
|
||||
-- fire OnUsed callback?
|
||||
if first and registry.OnUsed then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
first = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
registry.insertQueue = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Registration of a callback, handles:
|
||||
-- self["method"], leads to self["method"](self, ...)
|
||||
-- self with function ref, leads to functionref(...)
|
||||
-- "addonId" (instead of self) with function ref, leads to functionref(...)
|
||||
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
|
||||
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
|
||||
end
|
||||
|
||||
method = method or eventname
|
||||
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
|
||||
if type(method) ~= "string" and type(method) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
|
||||
end
|
||||
|
||||
local regfunc
|
||||
|
||||
if type(method) == "string" then
|
||||
-- self["method"] calling style
|
||||
if type(self) ~= "table" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
|
||||
elseif self==target then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
|
||||
elseif type(self[method]) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) self[method](self,arg,...) end
|
||||
else
|
||||
regfunc = function(...) self[method](self,...) end
|
||||
end
|
||||
else
|
||||
-- function ref with self=object or self="addonId"
|
||||
if type(self)~="table" and type(self)~="string" then
|
||||
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) method(arg,...) end
|
||||
else
|
||||
regfunc = method
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if events[eventname][self] or registry.recurse<1 then
|
||||
-- if registry.recurse<1 then
|
||||
-- we're overwriting an existing entry, or not currently recursing. just set it.
|
||||
events[eventname][self] = regfunc
|
||||
-- fire OnUsed callback?
|
||||
if registry.OnUsed and first then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
end
|
||||
else
|
||||
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
|
||||
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
|
||||
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
|
||||
registry.insertQueue[eventname][self] = regfunc
|
||||
end
|
||||
end
|
||||
|
||||
-- Unregister a callback
|
||||
target[UnregisterName] = function(self, eventname)
|
||||
if not self or self==target then
|
||||
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
|
||||
end
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
|
||||
end
|
||||
if rawget(events, eventname) and events[eventname][self] then
|
||||
events[eventname][self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(events[eventname]) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
|
||||
registry.insertQueue[eventname][self] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
|
||||
if UnregisterAllName then
|
||||
target[UnregisterAllName] = function(...)
|
||||
if select("#",...)<1 then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
|
||||
end
|
||||
if select("#",...)==1 and ...==target then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
|
||||
end
|
||||
|
||||
|
||||
for i=1,select("#",...) do
|
||||
local self = select(i,...)
|
||||
if registry.insertQueue then
|
||||
for eventname, callbacks in pairs(registry.insertQueue) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
for eventname, callbacks in pairs(events) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(callbacks) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return registry
|
||||
end
|
||||
|
||||
|
||||
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
|
||||
-- try to upgrade old implicit embeds since the system is selfcontained and
|
||||
-- relies on closures to work.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="CallbackHandler-1.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,30 @@
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
function LibStub:NewLibrary(major, minor)
|
||||
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
||||
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
||||
|
||||
local oldminor = self.minors[major]
|
||||
if oldminor and oldminor >= minor then return nil end
|
||||
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
function LibStub:GetLibrary(major, silent)
|
||||
if not self.libs[major] and not silent then
|
||||
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
||||
end
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
@@ -0,0 +1,30 @@
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
function LibStub:NewLibrary(major, minor)
|
||||
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
||||
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
||||
|
||||
local oldminor = self.minors[major]
|
||||
if oldminor and oldminor >= minor then return nil end
|
||||
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
function LibStub:GetLibrary(major, silent)
|
||||
if not self.libs[major] and not silent then
|
||||
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
||||
end
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
## Interface: 20400
|
||||
## Title: Lib: LibStub
|
||||
## Notes: Universal Library Stub
|
||||
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
|
||||
## X-Website: http://jira.wowace.com/browse/LS
|
||||
## X-Category: Library
|
||||
## X-License: Public Domain
|
||||
## X-Curse-Packaged-Version: 1.0
|
||||
## X-Curse-Project-Name: LibStub
|
||||
## X-Curse-Project-ID: libstub
|
||||
## X-Curse-Repository-ID: wow/libstub/mainline
|
||||
|
||||
LibStub.lua
|
||||
@@ -0,0 +1,239 @@
|
||||
--[[ $Id: CallbackHandler-1.0.lua 60548 2008-02-07 11:04:06Z nevcairiel $ ]]
|
||||
local MAJOR, MINOR = "CallbackHandler-1.0", 3
|
||||
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not CallbackHandler then return end -- No upgrade needed
|
||||
|
||||
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
|
||||
|
||||
local type = type
|
||||
local pcall = pcall
|
||||
local pairs = pairs
|
||||
local assert = assert
|
||||
local concat = table.concat
|
||||
local loadstring = loadstring
|
||||
local next = next
|
||||
local select = select
|
||||
local type = type
|
||||
local xpcall = xpcall
|
||||
|
||||
local function errorhandler(err)
|
||||
return geterrorhandler()(err)
|
||||
end
|
||||
|
||||
local function CreateDispatcher(argCount)
|
||||
local code = [[
|
||||
local next, xpcall, eh = ...
|
||||
|
||||
local method, ARGS
|
||||
local function call() method(ARGS) end
|
||||
|
||||
local function dispatch(handlers, ...)
|
||||
local index
|
||||
index, method = next(handlers)
|
||||
if not method then return end
|
||||
local OLD_ARGS = ARGS
|
||||
ARGS = ...
|
||||
repeat
|
||||
xpcall(call, eh)
|
||||
index, method = next(handlers, index)
|
||||
until not method
|
||||
ARGS = OLD_ARGS
|
||||
end
|
||||
|
||||
return dispatch
|
||||
]]
|
||||
|
||||
local ARGS, OLD_ARGS = {}, {}
|
||||
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
|
||||
code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
|
||||
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
|
||||
end
|
||||
|
||||
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
|
||||
local dispatcher = CreateDispatcher(argCount)
|
||||
rawset(self, argCount, dispatcher)
|
||||
return dispatcher
|
||||
end})
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- CallbackHandler:New
|
||||
--
|
||||
-- target - target object to embed public APIs in
|
||||
-- RegisterName - name of the callback registration API, default "RegisterCallback"
|
||||
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
|
||||
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
|
||||
|
||||
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
|
||||
-- TODO: Remove this after beta has gone out
|
||||
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
|
||||
|
||||
RegisterName = RegisterName or "RegisterCallback"
|
||||
UnregisterName = UnregisterName or "UnregisterCallback"
|
||||
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
|
||||
UnregisterAllName = "UnregisterAllCallbacks"
|
||||
end
|
||||
|
||||
-- we declare all objects and exported APIs inside this closure to quickly gain access
|
||||
-- to e.g. function names, the "target" parameter, etc
|
||||
|
||||
|
||||
-- Create the registry object
|
||||
local events = setmetatable({}, meta)
|
||||
local registry = { recurse=0, events=events }
|
||||
|
||||
-- registry:Fire() - fires the given event/message into the registry
|
||||
function registry:Fire(eventname, ...)
|
||||
if not rawget(events, eventname) or not next(events[eventname]) then return end
|
||||
local oldrecurse = registry.recurse
|
||||
registry.recurse = oldrecurse + 1
|
||||
|
||||
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
|
||||
|
||||
registry.recurse = oldrecurse
|
||||
|
||||
if registry.insertQueue and oldrecurse==0 then
|
||||
-- Something in one of our callbacks wanted to register more callbacks; they got queued
|
||||
for eventname,callbacks in pairs(registry.insertQueue) do
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
for self,func in pairs(callbacks) do
|
||||
events[eventname][self] = func
|
||||
-- fire OnUsed callback?
|
||||
if first and registry.OnUsed then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
first = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
registry.insertQueue = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Registration of a callback, handles:
|
||||
-- self["method"], leads to self["method"](self, ...)
|
||||
-- self with function ref, leads to functionref(...)
|
||||
-- "addonId" (instead of self) with function ref, leads to functionref(...)
|
||||
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
|
||||
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
|
||||
end
|
||||
|
||||
method = method or eventname
|
||||
|
||||
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
|
||||
|
||||
if type(method) ~= "string" and type(method) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
|
||||
end
|
||||
|
||||
local regfunc
|
||||
|
||||
if type(method) == "string" then
|
||||
-- self["method"] calling style
|
||||
if type(self) ~= "table" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
|
||||
elseif self==target then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
|
||||
elseif type(self[method]) ~= "function" then
|
||||
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) self[method](self,arg,...) end
|
||||
else
|
||||
regfunc = function(...) self[method](self,...) end
|
||||
end
|
||||
else
|
||||
-- function ref with self=object or self="addonId"
|
||||
if type(self)~="table" and type(self)~="string" then
|
||||
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
|
||||
end
|
||||
|
||||
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
|
||||
local arg=select(1,...)
|
||||
regfunc = function(...) method(arg,...) end
|
||||
else
|
||||
regfunc = method
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if events[eventname][self] or registry.recurse<1 then
|
||||
-- if registry.recurse<1 then
|
||||
-- we're overwriting an existing entry, or not currently recursing. just set it.
|
||||
events[eventname][self] = regfunc
|
||||
-- fire OnUsed callback?
|
||||
if registry.OnUsed and first then
|
||||
registry.OnUsed(registry, target, eventname)
|
||||
end
|
||||
else
|
||||
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
|
||||
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
|
||||
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
|
||||
registry.insertQueue[eventname][self] = regfunc
|
||||
end
|
||||
end
|
||||
|
||||
-- Unregister a callback
|
||||
target[UnregisterName] = function(self, eventname)
|
||||
if not self or self==target then
|
||||
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
|
||||
end
|
||||
if type(eventname) ~= "string" then
|
||||
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
|
||||
end
|
||||
if rawget(events, eventname) and events[eventname][self] then
|
||||
events[eventname][self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(events[eventname]) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
|
||||
registry.insertQueue[eventname][self] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
|
||||
if UnregisterAllName then
|
||||
target[UnregisterAllName] = function(...)
|
||||
if select("#",...)<1 then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
|
||||
end
|
||||
if select("#",...)==1 and ...==target then
|
||||
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
|
||||
end
|
||||
|
||||
|
||||
for i=1,select("#",...) do
|
||||
local self = select(i,...)
|
||||
if registry.insertQueue then
|
||||
for eventname, callbacks in pairs(registry.insertQueue) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
for eventname, callbacks in pairs(events) do
|
||||
if callbacks[self] then
|
||||
callbacks[self] = nil
|
||||
-- Fire OnUnused callback?
|
||||
if registry.OnUnused and not next(callbacks) then
|
||||
registry.OnUnused(registry, target, eventname)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return registry
|
||||
end
|
||||
|
||||
|
||||
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
|
||||
-- try to upgrade old implicit embeds since the system is selfcontained and
|
||||
-- relies on closures to work.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
## Interface: 30000
|
||||
## X-Curse-Packaged-Version: 2
|
||||
## X-Curse-Project-Name: LibSharedMedia-3.0
|
||||
## X-Curse-Project-ID: libsharedmedia-3-0
|
||||
## X-Curse-Repository-ID: wow/libsharedmedia-3-0/mainline
|
||||
|
||||
## Title: Lib: SharedMedia-3.0
|
||||
## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
|
||||
## Author: Elkano
|
||||
## Version: 3.0-59
|
||||
## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/
|
||||
## X-Category: Library
|
||||
|
||||
## X-Revision: 59
|
||||
## X-Date: 2009-03-06T10:12:34Z
|
||||
|
||||
LibStub\LibStub.lua
|
||||
CallbackHandler-1.0\CallbackHandler-1.0.lua
|
||||
|
||||
LibSharedMedia-3.0\lib.xml
|
||||
@@ -0,0 +1,227 @@
|
||||
--[[
|
||||
Name: LibSharedMedia-3.0
|
||||
Revision: $Revision: 53 $
|
||||
Author: Elkano (elkano@gmx.de)
|
||||
Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
|
||||
Website: http://www.wowace.com/projects/libsharedmedia-3-0/
|
||||
Description: Shared handling of media data (fonts, sounds, textures, ...) between addons.
|
||||
Dependencies: LibStub, CallbackHandler-1.0
|
||||
License: LGPL v2.1
|
||||
]]
|
||||
|
||||
local MAJOR, MINOR = "LibSharedMedia-3.0", 90000 + tonumber(("$Revision: 53 $"):match("(%d+)"))
|
||||
local lib = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not lib then return end
|
||||
|
||||
local _G = getfenv(0)
|
||||
|
||||
local pairs = _G.pairs
|
||||
local type = _G.type
|
||||
|
||||
local band = _G.bit.band
|
||||
|
||||
local table_insert = _G.table.insert
|
||||
local table_sort = _G.table.sort
|
||||
|
||||
local locale = GetLocale()
|
||||
local locale_is_western
|
||||
local LOCALE_MASK = 0
|
||||
lib.LOCALE_BIT_koKR = 1
|
||||
lib.LOCALE_BIT_ruRU = 2
|
||||
lib.LOCALE_BIT_zhCN = 4
|
||||
lib.LOCALE_BIT_zhTW = 8
|
||||
lib.LOCALE_BIT_western = 128
|
||||
|
||||
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
|
||||
|
||||
lib.callbacks = lib.callbacks or CallbackHandler:New(lib)
|
||||
|
||||
lib.DefaultMedia = lib.DefaultMedia or {}
|
||||
lib.MediaList = lib.MediaList or {}
|
||||
lib.MediaTable = lib.MediaTable or {}
|
||||
lib.MediaType = lib.MediaType or {}
|
||||
lib.OverrideMedia = lib.OverrideMedia or {}
|
||||
|
||||
local defaultMedia = lib.DefaultMedia
|
||||
local mediaList = lib.MediaList
|
||||
local mediaTable = lib.MediaTable
|
||||
local overrideMedia = lib.OverrideMedia
|
||||
|
||||
|
||||
-- create mediatype constants
|
||||
lib.MediaType.BACKGROUND = "background" -- background textures
|
||||
lib.MediaType.BORDER = "border" -- border textures
|
||||
lib.MediaType.FONT = "font" -- fonts
|
||||
lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures
|
||||
lib.MediaType.SOUND = "sound" -- sound files
|
||||
|
||||
-- populate lib with default Blizzard data
|
||||
-- BACKGROUND
|
||||
if not lib.MediaTable.background then lib.MediaTable.background = {} end
|
||||
lib.MediaTable.background["Blizzard Dialog Background"] = [[Interface\DialogFrame\UI-DialogBox-Background]]
|
||||
lib.MediaTable.background["Blizzard Low Health"] = [[Interface\FullScreenTextures\LowHealth]]
|
||||
lib.MediaTable.background["Blizzard Out of Control"] = [[Interface\FullScreenTextures\OutOfControl]]
|
||||
lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
|
||||
lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-Achievement-Parchment]]
|
||||
lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]]
|
||||
lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]]
|
||||
lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]]
|
||||
|
||||
-- BORDER
|
||||
if not lib.MediaTable.border then lib.MediaTable.border = {} end
|
||||
lib.MediaTable.border["None"] = [[Interface\None]]
|
||||
lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]]
|
||||
lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
|
||||
lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]]
|
||||
|
||||
-- FONT
|
||||
if not lib.MediaTable.font then lib.MediaTable.font = {} end
|
||||
local SML_MT_font = lib.MediaTable.font
|
||||
if locale == "koKR" then
|
||||
LOCALE_MASK = lib.LOCALE_BIT_koKR
|
||||
--
|
||||
SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]]
|
||||
SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]]
|
||||
SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]]
|
||||
SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]]
|
||||
--
|
||||
lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
|
||||
--
|
||||
elseif locale == "zhCN" then
|
||||
LOCALE_MASK = lib.LOCALE_BIT_zhCN
|
||||
--
|
||||
SML_MT_font["伤害数字"] = [[Fonts\ZYKai_C.ttf]]
|
||||
SML_MT_font["默认"] = [[Fonts\ZYKai_T.ttf]]
|
||||
SML_MT_font["聊天"] = [[Fonts\ZYHei.ttf]]
|
||||
--
|
||||
lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
|
||||
--
|
||||
elseif locale == "zhTW" then
|
||||
LOCALE_MASK = lib.LOCALE_BIT_zhTW
|
||||
--
|
||||
SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]]
|
||||
SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]]
|
||||
SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]]
|
||||
SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]]
|
||||
--
|
||||
lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
|
||||
|
||||
elseif locale == "ruRU" then
|
||||
LOCALE_MASK = lib.LOCALE_BIT_ruRU
|
||||
--
|
||||
SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]]
|
||||
SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]]
|
||||
SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS.TTF]]
|
||||
SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]]
|
||||
SML_MT_font["Skurri"] = [[Fonts\SKURRI.TTF]]
|
||||
--
|
||||
lib.DefaultMedia.font = "Friz Quadrata TT"
|
||||
--
|
||||
else
|
||||
LOCALE_MASK = lib.LOCALE_BIT_western
|
||||
locale_is_western = true
|
||||
--
|
||||
SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]]
|
||||
SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]]
|
||||
SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS.TTF]]
|
||||
SML_MT_font["Skurri"] = [[Fonts\SKURRI.TTF]]
|
||||
--
|
||||
lib.DefaultMedia.font = "Friz Quadrata TT"
|
||||
--
|
||||
end
|
||||
|
||||
-- STATUSBAR
|
||||
if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
|
||||
lib.MediaTable.statusbar["Blizzard"] = [[Interface\TargetingFrame\UI-StatusBar]]
|
||||
lib.DefaultMedia.statusbar = "Blizzard"
|
||||
|
||||
-- SOUND
|
||||
if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
|
||||
lib.MediaTable.sound["None"] = [[Interface\Quiet.mp3]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
|
||||
lib.DefaultMedia.sound = "None"
|
||||
|
||||
local function rebuildMediaList(mediatype)
|
||||
local mtable = mediaTable[mediatype]
|
||||
if not mtable then return end
|
||||
if not mediaList[mediatype] then mediaList[mediatype] = {} end
|
||||
local mlist = mediaList[mediatype]
|
||||
-- list can only get larger, so simply overwrite it
|
||||
local i = 0
|
||||
for k in pairs(mtable) do
|
||||
i = i + 1
|
||||
mlist[i] = k
|
||||
end
|
||||
table_sort(mlist)
|
||||
end
|
||||
|
||||
function lib:Register(mediatype, key, data, langmask)
|
||||
if type(mediatype) ~= "string" then
|
||||
error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
|
||||
end
|
||||
if type(key) ~= "string" then
|
||||
error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
|
||||
end
|
||||
if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
|
||||
mediatype = mediatype:lower()
|
||||
if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
|
||||
local mtable = mediaTable[mediatype]
|
||||
if mtable[key] then return false end
|
||||
|
||||
mtable[key] = data
|
||||
rebuildMediaList(mediatype)
|
||||
self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
|
||||
return true
|
||||
end
|
||||
|
||||
function lib:Fetch(mediatype, key, noDefault)
|
||||
local mtt = mediaTable[mediatype]
|
||||
local overridekey = overrideMedia[mediatype]
|
||||
local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
function lib:IsValid(mediatype, key)
|
||||
return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
|
||||
end
|
||||
|
||||
function lib:HashTable(mediatype)
|
||||
return mediaTable[mediatype]
|
||||
end
|
||||
|
||||
function lib:List(mediatype)
|
||||
if not mediaTable[mediatype] then
|
||||
return nil
|
||||
end
|
||||
if not mediaList[mediatype] then
|
||||
rebuildMediaList(mediatype)
|
||||
end
|
||||
return mediaList[mediatype]
|
||||
end
|
||||
|
||||
function lib:GetGlobal(mediatype)
|
||||
return overrideMedia[mediatype]
|
||||
end
|
||||
|
||||
function lib:SetGlobal(mediatype, key)
|
||||
if not mediaTable[mediatype] then
|
||||
return false
|
||||
end
|
||||
overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
|
||||
self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
|
||||
return true
|
||||
end
|
||||
|
||||
function lib:GetDefault(mediatype)
|
||||
return defaultMedia[mediatype]
|
||||
end
|
||||
|
||||
function lib:SetDefault(mediatype, key)
|
||||
if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
|
||||
defaultMedia[mediatype] = key
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="LibSharedMedia-3.0.lua" />
|
||||
</Ui>
|
||||
@@ -0,0 +1,30 @@
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
function LibStub:NewLibrary(major, minor)
|
||||
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
||||
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
||||
|
||||
local oldminor = self.minors[major]
|
||||
if oldminor and oldminor >= minor then return nil end
|
||||
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
function LibStub:GetLibrary(major, silent)
|
||||
if not self.libs[major] and not silent then
|
||||
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
||||
end
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Include file="LibSharedMedia-3.0\lib.xml" />
|
||||
</Ui>
|
||||
@@ -0,0 +1,30 @@
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
function LibStub:NewLibrary(major, minor)
|
||||
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
||||
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
||||
|
||||
local oldminor = self.minors[major]
|
||||
if oldminor and oldminor >= minor then return nil end
|
||||
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
function LibStub:GetLibrary(major, silent)
|
||||
if not self.libs[major] and not silent then
|
||||
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
||||
end
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
## Interface: 20400
|
||||
## Title: Lib: LibStub
|
||||
## Notes: Universal Library Stub
|
||||
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
|
||||
## X-Website: http://jira.wowace.com/browse/LS
|
||||
## X-Category: Library
|
||||
## X-License: Public Domain
|
||||
## X-Curse-Packaged-Version: 1.0
|
||||
## X-Curse-Project-Name: LibStub
|
||||
## X-Curse-Project-ID: libstub
|
||||
## X-Curse-Repository-ID: wow/libstub/mainline
|
||||
|
||||
LibStub.lua
|
||||
@@ -0,0 +1,667 @@
|
||||
if( GetLocale() ~= "deDE" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "Kürzt die Namen von Einheiten mit mehr als 10 Zeichen. \"Dunkler Runenchampion\" wird zu \"D.R.Champion\" und \"Dunkler Runenbürger\" wird zu \"D.R.Bürger\"."
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "Absoluter Wert der eingehenden Heilung. Wenn 10.000 eingehen, werden auch 10.000 angezeigt."
|
||||
L["Add"] = "Hinzufügen"
|
||||
L["Add new tag"] = "Neuen Tag hinzufügen"
|
||||
L["Add new text"] = "Neuen Text hinzufügen"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "Fügt eine Leiste hinzu, die Dir die verbleibende Zeit für Deinen Ghul anzeigt (wird nur verwendet wenn Du keinen permanenten Ghul-Begleiter hast)."
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "Fügt in der Gesundheitsleiste eine weitere Leiste hinzu, die anzeigt, wieviel geschätzte Heilung jemand erhält."
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "Fügt eine weitere leere Leiste hinzu, in der Du zusätzlichen Text anzeigen lassen kannst."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "Fügt eine weitere Mana-Leiste hinzu, um zu sehen wieviel Mana Du hast, während Du in Bär- oder Katzen-Form bist."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "Fügt dem Spielerfenster eine Runenleiste sowie einen Timer hinzu, bevor diese aktualisiert werden."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "Fügt %s zur Liste der Einheiten hinzu, die verändert werden, wenn Du die Werte in diesem Reiter änderst."
|
||||
L["Adds temporary enchants to the buffs for the player."] = "Fügt vorübergehende Verzauberungen zu den Buffs des Spielers hinzu."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "Fügt dem Spielerfenster eine Totemleiste mit Timern hinzu, bevor diese ablaufen."
|
||||
L["Add tags"] = "Tags hinzufügen"
|
||||
L["Advanced"] = "Erweitert"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "Erweiterte Tag-Verwaltung, erlaubt Dir das Hinzufügen von benutzerdefinierten Tags."
|
||||
L["AFK"] = "AFK"
|
||||
L["AFK:%s"] = "AFK: %s"
|
||||
L["AFK status"] = "AFK-Status"
|
||||
L["AFK timer"] = "AFK-Timer"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "Nachdem Du \"Exportieren\" gedrückt hast, kannst Du den unten aufgeführten Code an andere weitergeben und sie erhalten exakt das selbe Layout."
|
||||
L["Aggro"] = "Aggro"
|
||||
L["Allows you to anchor the aura group to another, you can then choose where it will be anchored using the position.|n|nUse this if you want to duplicate the default ui style where buffs and debuffs are separate groups."] = "Erlaubt Dir die Auren-Gruppe an eine andere zu befestigen. Du kannst anschließend mit der Position auswählen, wo diese befestigt werden soll.|n|nVerwende dies, wenn Du den Standard UI-Stil verdoppeln möchtest, bei dem Buffs und Debuffs in seperate Gruppen sind."
|
||||
L["Alpha to use for bar."] = "Transparenz für Leiste verwenden."
|
||||
L["Alpha to use for bar backgrounds."] = "Transparenz für Leistenhintergründe verwenden."
|
||||
L["Ammo"] = "Munition"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "Menge der fehlenden Gesundheit, bei voller Gesundheit wird nichts angezeigt. Verwendet ein kurzes Format, -18.500 wird als -18.5k angezeigt, Werte unter 10.000 werden ganz normal angezeigt."
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "Menge der fehlenden Energie, bei voller Energie wird nichts angezeigt. Verwendet ein kurzes Format, -13.850 wird als -13.8k angezeigt, Werte unter 10.000 werden ganz normal angezeigt."
|
||||
L["Anchor point"] = "Ausrichtungspunkt"
|
||||
L["Anchor to"] = "Ausrichten an"
|
||||
L["Anchor to another frame"] = "Ausrichten an einem anderen Fenster"
|
||||
L["Anchor to buffs"] = "Ausrichten an Buffs"
|
||||
L["Anchor to debuffs"] = "Ausrichten an Debuffs"
|
||||
L["Aquatic"] = "Wasser"
|
||||
L["Arena"] = "Arena"
|
||||
L["Arena Pet"] = "Arena Begleiter"
|
||||
L["Arenas"] = "Arenen"
|
||||
L["Arena Target"] = "Arena Ziel"
|
||||
L["Are you sure you want to delete this filter?"] = "Bist Du sicher, dass Du diesen Filter löschen möchtest?"
|
||||
L["Are you sure you want to delete this tag?"] = "Bist Du sicher, dass Du diesen Tag löschen möchtest?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "Bist Du sicher, dass Du diesen Text löschen möchtest? Alle Einstellungen dafür werden gelöscht."
|
||||
L["Ascending"] = "Aufsteigend"
|
||||
L["Aura border style"] = "Aura Rahmen Stil"
|
||||
L["Aura filters"] = "Aura-Filter"
|
||||
L["Aura name"] = "Aura-Name"
|
||||
L["Auras"] = "Auren"
|
||||
L["Aura types to filter"] = "Auren zum Filtern"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "Hintergrund"
|
||||
L["Background alpha"] = "Hintergrund-Transparenz"
|
||||
L["Background/border"] = "Hintergrund/Rahmen"
|
||||
L["Background color"] = "Hintergrundfarbe"
|
||||
L["Bag indicator for master looters."] = "Taschen-Indikator für Plündermeister."
|
||||
L["Bar alpha"] = "Leisten-Transparenz"
|
||||
L["Bars"] = "Leisten"
|
||||
L["Bar spacing"] = "Leistenabstand"
|
||||
L["Bars with an order higher or lower than the full size options will use the entire unit frame width.|n|nBar orders between those two numbers are shown next to the portrait."] = "Leisten mit einer höheren oder niedrigeren Anordnung als die volle Größe Optionen, verwenden die gesamte Breite des Einheitenfensters.|n|nLeistenanordnungen zwischen diesen Zwei Nummern, werden neber dem Portrait angezeigt." -- Needs review
|
||||
L["Bar texture"] = "Leistentextur"
|
||||
L["Battlegrounds"] = "Schlachtfelder"
|
||||
L["Bear"] = "Bär"
|
||||
L["Blacklist"] = "Schwarze Liste"
|
||||
L["Blacklist filters"] = "Schwarze Liste Filter"
|
||||
L["Blacklists"] = "Schwarze Listen"
|
||||
L["Blizzard"] = "Blizzard"
|
||||
L["Border"] = "Rahmen"
|
||||
L["Border alpha"] = "Rahmen-Transparenz"
|
||||
L["Border color"] = "Rahmenfarbe"
|
||||
L["Border highlighting"] = "Rahmenhervorhebung"
|
||||
L["Border thickness"] = "Rahmendicke"
|
||||
L["Boss"] = "Boss"
|
||||
L["Boss Target"] = "Boss Ziel"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "Die Boss-Einheitenfenster sind nur für bestimmte Kämpfe (wie z.B. die Blutprinzen oder der Luftschiffkampf). Du wirst sie nicht bei jedem Bosskampf sehen."
|
||||
L["Both"] = "Beide"
|
||||
L["Bottom"] = "Unten"
|
||||
L["Bottom Center"] = "Unten zentriert"
|
||||
L["Bottom Left"] = "Unten links"
|
||||
L["Bottom Right"] = "Unten rechts"
|
||||
L["buff frames"] = "Buff-Fenster"
|
||||
L["Buffs"] = "Buffs"
|
||||
L["C"] = "K"
|
||||
L["Cannot find any profiles named \"%s\"."] = "Es kann kein Profil mit dem Namen \"%s\" gefunden werden."
|
||||
L["Cast"] = "Zauber"
|
||||
L["Cast bar"] = "Zauberleiste"
|
||||
L["Cast icon"] = "Zaubersymbol"
|
||||
L["Casting"] = "Zaubern"
|
||||
L["Cast interrupted"] = "Zauber unterbrochen"
|
||||
L["Cast name"] = "Zaubername"
|
||||
L["Cast time"] = "Zauberzeit"
|
||||
L["Cast uninterruptible"] = "Zauber nicht unterbrechbar"
|
||||
L["Cat"] = "Katze"
|
||||
L["Category"] = "Kategorie"
|
||||
L["Center"] = "Zentriert"
|
||||
L["Changed profile to %s."] = "Profil auf %s geändert."
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "Ändert die Farbe der Gesundheitsleiste zur gesetzten gegnerischen Farbe (Standardmäßig Rot) wenn eine Einheit Aggro zieht."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "Ändert dieses Widget in eine Leiste, womit Du in der Lage bist, die Höhe und Reihenfolge wie die der Gesundheits- oder Energieleiste zu verändern."
|
||||
L["Channelling"] = "Kanalisieren"
|
||||
L["Child units cannot be dragged, you will have to reposition them through /shadowuf."] = "Kinder-Einheiten können nicht verschoben werden. Du musst diese selbst mit /shadowuf repositionieren."
|
||||
L["Class"] = "Klasse"
|
||||
L["Class color tag"] = "Tag für Klassenfarbe"
|
||||
L["Classes"] = "Klassen"
|
||||
L["Class icon"] = "Klassen-Symbol"
|
||||
L["Class icon for players."] = "Klassensymbol für Spieler."
|
||||
L["Classificaiton"] = "Klassifizierung"
|
||||
L["Classifications"] = "Klassifizierungen"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "Klassenname ohne Farbe. Verwende [classcolor][class][close], wenn der Klassenname nach der jeweiligen Klasse eingefärbt werden soll."
|
||||
L["Class (Smart)"] = "Klasse (Intelligent) "
|
||||
L["Clip"] = "Anheften"
|
||||
L["Close color"] = "Zu nah am Ziel Farbe"
|
||||
L["Closes a color code, prevents colors from showing up on text that you do not want it to."] = "Sperren einer Farbe, dies verhindert das Anzeigen von Farben auf einen Text wenn du es nicht möchtest."
|
||||
L["Code"] = "Code"
|
||||
L["Color by class"] = "Nach Klasse färben"
|
||||
L["Color by happiness"] = "Nach Zufriedenheit färben"
|
||||
L["Color by reaction on"] = "Farbe durch Reaktionen auf" -- Needs review
|
||||
L["Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."] = "Farbcode, basierend auf der verbleibenden prozentualen Gesundheit der Einheit. Dies funktioniert auf dem selben Weg wie die Farbe der Gesundheitsleiste, jedoch nur für den Text anstatt für die gesamten Leiste."
|
||||
L["Color code for general situation"] = "Farbcode für normale Situationen"
|
||||
L["Color code for situation"] = "Farbcode für Situationen"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "Farbcode für die Klasse. Benutze [classcolor][class][close] wenn der Klassentext nach der Klasse gefärbt werden soll."
|
||||
L["Color code on aggro"] = "Farbcode bei Aggro"
|
||||
L["Color health by"] = "Gesundheit färben nach"
|
||||
L["Color on aggro"] = "Farbe bei Aggro"
|
||||
L["Colors"] = "Farben"
|
||||
L["Colors the health bar by how happy your pet is."] = "Färbt die Gesundheitsleiste nach der Zufriedenheit Deines Begleiters."
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "Farbe der Gesundheitsleiste, die von einer festgesetzten Farbe bestimmt ist."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "Farbe die angezeigt wird, wenn der Zauber nicht unterbrochen werden kann. Dies wird nur bei PvE Gegnern verwendet."
|
||||
L["Color used when a cast is a channel."] = "Farbe die angezeigt wird, wenn der Zauber kanalisiert wird."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "Farbe die angezeigt wird, wenn ein Zauber entweder vom Zauberer oder einer anderen Einheit unterbrochen wird."
|
||||
L["Color used when a cast is successfully finished."] = "Farbe die angezeigt wird, wenn ein Zauber erfolgreich gewirkt wurde."
|
||||
L["Color used when an unit is casting a spell."] = "Farbe die angezeigt wird, wenn eine Einheit einen Zauber wirkt."
|
||||
L["Column growth"] = "Spaltenwachstum"
|
||||
L["Column spacing"] = "Spaltenabstand"
|
||||
L["Combat alpha"] = "Kampf-Transparenz"
|
||||
L["Combat fader"] = "Kampfausblender"
|
||||
L["Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."] = "Der Kampfausblender blendet alle unbenutzen Fenster aus während diese inaktiv sind und blendet sie wieder ein wenn ein Kampf beginnt."
|
||||
L["Combat/resting status"] = "Kampf/Ruhe Status"
|
||||
L["Combat status"] = "Kampfstatus"
|
||||
L["Combat text"] = "Kampftext"
|
||||
L["Combo points"] = "Kombopunkte"
|
||||
L["Configuration to specific unit frames."] = "Konfiguration für bestimmte Einheitenfenster."
|
||||
L["Create"] = "Erstellen"
|
||||
L["Creature type"] = "Kreaturen-Typ"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "Kreaturen-Typ, gibt Teufelswache zurück, wenn es sich bei der Einheit um eine Teufelswache handel, Wolf wenn es sich um einen Wolf handelt und so weiter."
|
||||
L["Crown indicator for group leaders."] = "Kronen-Indikator für Gruppen-/Schlachtzugsleiter"
|
||||
L["Cur/Max HP (Absolute)"] = "Akt/Max GP (Absolut)"
|
||||
L["Cur/Max HP (Short)"] = "Akt/Max GP (Kurz)"
|
||||
L["Cur/Max HP (Smart)"] = "Akt/Max GP (Intelligent)"
|
||||
L["Cur/Max power (Absolute)"] = "Akt/Max Energie (Absolut)"
|
||||
L["Cur/Max power (Druid)"] = "Akt/Max Energie (Druide)"
|
||||
L["Cur/Max Power (Short)"] = "Akt/Max Energie (Kurz)"
|
||||
L["Cur/Max PP (Smart)"] = "Akt/Max KP (Intelligent)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "Aktuelle und Maximale Gesundheit. Angegeben mit [curhp]/[maxhp], wenn die Einheit Tot oder Offline ist, wird dies stattdessen angezeigt."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "Aktuelle und Maximale Energie. Angegeben mit [curpp]/[maxpp]."
|
||||
L["Current health (Druid/Absolute)"] = "Aktuelle Gesundheit (Druide/Absolut)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "Aktuelle Gesundheit, verwendet ein kurzes Format, 11.500 wird als 11.5k angezeigt, Werte unter 10.000 werden normal angezeigt."
|
||||
L["Current HP (Absolute)"] = "Aktuelle GP (Absolut)"
|
||||
L["Current HP (Short)"] = "Aktuelle GP (Kurz)"
|
||||
L["Current power (Absolute)"] = "Aktuelle Energie (Absolut)"
|
||||
L["Current power (Druid)"] = "Aktuelle Energie (Druide)"
|
||||
L["Current power (Druid/Absolute)"] = "Aktuelle Energie (Druide/Absolut)"
|
||||
L["Current Power (Short)"] = "Akutelle Energie (Kurz)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "Aktuelle Energie, verwendet ein kurzes Format, 12.750 wird als 12.7k angezeigt, Werte unter 10.000 werden normal angezeigt."
|
||||
L["Dark"] = "Dunkel"
|
||||
L["Dead"] = "Tot"
|
||||
L["Debuffs"] = "Debuffs"
|
||||
L["Decimal percent HP"] = "Dezimale prozentuale GP"
|
||||
L["Default color"] = "Standardfarbe"
|
||||
L["Default font color, any color tags inside individual tag texts will override this."] = "Standardfarbe, jeder Farbtag in einem einzelnen Tagtext überschreibt diesen."
|
||||
L["Deficit/Unit Name"] = "Defizit/Einheiten Name"
|
||||
L["Delete"] = "Löschen"
|
||||
L["Delete filter"] = "Filter löschen"
|
||||
L["Descending"] = "Absteigend"
|
||||
L["Disabled"] = "Deaktiviert"
|
||||
L["Disabled in %s"] = "Deaktiviert in %s"
|
||||
L["Disable event discovery"] = "Ereignisentdeckung deaktivieren"
|
||||
L["Disable OmniCC"] = "OmniCC deaktivieren"
|
||||
L["Disables showing OmniCC timers in all Shadowed Unit Frame auras."] = "Deaktiviert die Anzeige von OmniCC Timern in allen Auren von Shadowed Unit Frames."
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "Verhindert, dass das Einheitenfenster sich in ein Fahrzeug ändert wenn der Spieler dies betritt."
|
||||
L["Disable vehicle swap"] = "Fahrzeug-Wechsel deaktivieren"
|
||||
L["Disabling a module on this page disables it while inside %s. Do not disable a module here if you do not want this to happen!."] = "Das Deaktivieren eines Moduls auf dieser Seite, deaktiviert es innerhalb %s. Deaktiviere kein Modul hier, wenn Du nicht möchtest, dass dies passiert!"
|
||||
L["Disabling unit modules in various instances."] = "Einheiten-Module in verschiedenen Instanzen deaktivieren."
|
||||
L["DND"] = "DND"
|
||||
L["DND:%s"] = "DND:%s"
|
||||
L["Documentation"] = "Dokumentation"
|
||||
L["Don't use a filter"] = "Keinen Filter verwenden"
|
||||
L["Down"] = "Runter"
|
||||
L["Druid form"] = "Druidenform"
|
||||
L["Druid form (Short)"] = "Druidenform (Kurz)"
|
||||
L["Druid mana bar"] = "Druiden Manaleiste"
|
||||
L["Due to the nature of fake units, cast bars for %s are not super efficient and can take at most 0.10 seconds to notice a change in cast."] = "Aufgrund von künstlichen Einheiten, sind Zauberleisten für %s nicht super effizient und nimmt meistens nur 0.10 Sekunden in Anspruch, bis das Wirken eines neuen Zaubers bemerkt wird."
|
||||
L["Dungeon role"] = "Dungeon Rolle"
|
||||
L["Edge size"] = "Kantenlänge"
|
||||
L["Editing %s"] = "Bearbeite %s"
|
||||
L["Edit tag"] = "Tag bearbeiten"
|
||||
L["Elite"] = "Elite"
|
||||
L["Empty bar"] = "Leere Leiste"
|
||||
L["Enable buffs"] = "Buffs aktivieren"
|
||||
L["Enable debuffs"] = "Debuffs aktivieren"
|
||||
L["Enabled in %s"] = "Aktiviert in %s"
|
||||
L["Enabled units"] = "Aktivierte Einheiten"
|
||||
L["Enable frequent updates"] = "Regelmäßige Updates aktivieren"
|
||||
L["Enable indicator"] = "Indikator aktivieren"
|
||||
L["Enable quick health"] = "Schnelle Gesundheit aktivieren"
|
||||
L["Enable quick power"] = "Aktiviere schnelle Energie"
|
||||
L["Enable %s"] = "%s aktivieren"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "Aktiviert den Konfigurationsmodus, in welchem Du die Einheitenfenster verschieben und eine Vorschau der Frames sehen kannst."
|
||||
L["Enable temporary enchants"] = "Vorübergehende Verzauberungen aktivieren"
|
||||
L["Enable units"] = "Einheiten aktivieren"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "Das Aktivieren der erweiterten Einstellungen gibt Dir die Möglichkeit mehr Optionen einzustellen. Dies ist vor allem für Personen gedacht, die jedes einzelne Detail verändern möchten. Dies sollte nicht standardmäßig aktiviert sein, da es die Anzahl der Optionen deutlich erhöht."
|
||||
L["Energy"] = "Energie"
|
||||
L["Enlarge your auras"] = "Deine Auren vergrößern"
|
||||
L["Error"] = "Fehler"
|
||||
L["Events"] = "Ereignisse"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "Ereignisse die benutzt werden sollen, um eine Aktualisierung für diesen Tag auszulösen. Trenne jedes Ereignis durch ein einzelnes Leerzeichen."
|
||||
L["Everywhere else"] = "Überall anders"
|
||||
L["Export"] = "Export"
|
||||
L["F"] = "F"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "Lässt Einheiten die sich nicht in Deiner Reichweite befinden verblassen."
|
||||
L["Failed to import layout, error:|n|n%s"] = "Importieren des Layouts fehlgeschlagen, Fehlermeldung:|n|n%s"
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "Laden von ShadowedUF_Options fehlgeschlagen, die Konfiguration kann nicht geöffnet werden. Fehlermeldung: %s"
|
||||
L["Failed to save tag, error:|n %s"] = "Speichern des Tags fehlgeschlagen, Fehler:|n %s"
|
||||
L["Female"] = "Weiblich"
|
||||
L["Filtering both buffs and debuffs"] = "Stärkungs- und Schwächungszauber filtern"
|
||||
L["Filtering buffs only"] = "Nur Stärkungszauber filtern"
|
||||
L["Filtering debuffs only"] = "Nur Debuffs filtern"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "Alle Auren die Du nicht auf andere Spieler oder dich selbst wirken kannst, herausfiltern."
|
||||
L["Filter out any auras that you did not cast yourself."] = "Alle Auren die Du nicht selbst gewirkt hast, herausfiltern."
|
||||
L["Filter out any aura that you cannot cure."] = "Auren die Du nicht reinigen kannst, herausfiltern."
|
||||
L["Filter type"] = "Filter-Typ"
|
||||
L["Finished cast"] = "Gewirkte Zauber"
|
||||
L["Flight"] = "Flug"
|
||||
L["Flips coloring so the bar color is shown as the background color and the background as the bar"] = "Dreht das Einfärben herum, so dass die Leistenfarbe als Hintergrundfarbe und die Hintergrundfarbe als Leistenfarbe angezeigt wird."
|
||||
L["Focus"] = "Fokus"
|
||||
L["Focus Target"] = "Fokus Ziel"
|
||||
L["Font"] = "Schrift"
|
||||
L["Forces a static color to be used for the background of all bars"] = "Erzwingt die Verwendung einer statischen Farbe für die Hintergründe aller Leisten."
|
||||
L["For target/focus"] = "Für Ziel/Fokus"
|
||||
L["Frame"] = "Fenster"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "Fenster-Transparenz, wenn Du nicht im Kampf, kein Ziel und 100% Mana oder Energie hast."
|
||||
L["Frame alpha while this unit is in combat."] = "Fenster-Transparenz, während die Einheit im Kampf ist."
|
||||
L["Frames"] = "Fenster"
|
||||
L["Friendly"] = "Freundlich"
|
||||
L["Friendly spell"] = "Freundlicher Zauber"
|
||||
L["Fuel"] = "Treibstoff"
|
||||
L["Full size after"] = "Volle Größe nach"
|
||||
L["Full size before"] = "Volle Größe bevor"
|
||||
L["General"] = "Allgemein"
|
||||
L["General configuration to all enabled units."] = "Allgemeine Konfiguration für alle aktivierten Einheiten."
|
||||
L["General threat situation"] = "Normale Bedrohungssituation"
|
||||
L["Ghost"] = "Geist"
|
||||
L["Global"] = "Global"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "Gold Kontrollmarkierung - Aktiviert in diesem Gebiet / Graue Kontrollmarkierung - Deaktiviert in diesem Gebiet / Keine Kontrollmarkierung - Verwendet die Standard Einheiteneinstellungen"
|
||||
L["Group by"] = "Gruppieren nach"
|
||||
L["Group %d"] = "Gruppe %d"
|
||||
L["Group number"] = "Gruppennummer"
|
||||
L["Group row spacing"] = "Abstand der Gruppenreihen"
|
||||
L["Groups"] = "Gruppen"
|
||||
L["Groups per row"] = "Gruppen per Reihe"
|
||||
L["Groups to show"] = "Angezeigte Gruppen"
|
||||
L["Growth"] = "Wachstum"
|
||||
L["Guardian bar"] = "Wächterleiste"
|
||||
L["Guild name"] = "Gildenname"
|
||||
L["Half health"] = "Halbes Leben"
|
||||
L["Happiness"] = "Zufriedenheit"
|
||||
L["Health"] = "Gesundheit"
|
||||
L["Health bar"] = "Gesundheitsleiste"
|
||||
L["Health bar color for friendly units."] = "Farbe der Gesundheitsleiste für freundliche Einheiten."
|
||||
L["Health bar color for hostile units."] = "Farbe der Gesundheitsleiste für feindliche Einheiten."
|
||||
L["Health bar color for neutral units."] = "Farbe der Gesundheitsleiste für neutrale Einheiten."
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "Farbe der Gesundheitsleiste für gegnerische Einheiten, die nicht angegriffen werden können."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "Farbe der Gesundheitsleiste zum Anzeigen wie viel Heilung jemand dabei ist zu erhalten."
|
||||
L["Health color"] = "Gesundheitsfarbe"
|
||||
L["Health percent"] = "Gesundheit in Prozent."
|
||||
L["Height"] = "Höhe"
|
||||
L["Help"] = "Hilfe"
|
||||
L["Hide bar when empty"] = "Verstecke leere Leiste"
|
||||
L["Hide Blizzard"] = "Blizzard ausblenden"
|
||||
L["Hide in 6-man raid"] = "In einem 6-Mann-Schlachtzug ausblenden"
|
||||
L["Hide in any raid"] = "In jedem Schlachtzug ausblenden"
|
||||
L["Hide %s"] = "%s verstecken"
|
||||
L["Hide %s frames"] = "Verstecke %s Fenster"
|
||||
L["Hides the cast bar if there is no cast active."] = "Blendet die Zauberleiste aus wenn kein Zauber aktiv ist."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "Verstecke die Abklingzeit für jede Aura, die nicht selbst gewirkt wurde."
|
||||
L["Hide tooltips in combat"] = "Tooltips im Kampf ausblenden"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "Verstecke und zeige verschiedene Aspekte der Standard UI, wie zum Beispiel die Spieler Buff-Fenster."
|
||||
L["High"] = "Hoch"
|
||||
L["High health"] = "Hohe Gesundheit"
|
||||
L["Highlight"] = "Hervorheben"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "Einheiten mit einem Debuff den Du reinigen kannst hervorheben."
|
||||
L["Highlight units that have aggro on any mob."] = "Einheiten die Aggro von irgendeinem Gegner haben hervorheben."
|
||||
L["Highlight units that you are targeting or have focused."] = "Einheiten die Du im Ziel oder Fokus hast hervorheben."
|
||||
L["Highlight units when you mouse over them."] = "Einheiten hervorheben, wenn Du die Maus über sie bewegst."
|
||||
L["Hostile"] = "Gegner"
|
||||
L["Hostile spell"] = "Gegnerischer Zauber"
|
||||
L["How close the frame should clip with the border."] = "Wie nah das Fenster am Rand angeheftet werden soll."
|
||||
L["How far the background should be from the unit frame border."] = "Wie weit weg der Hintergrund vom Einheiten Rahmen entfernt ist."
|
||||
L["How large the background should tile"] = "Die Größe der Kacheln des Hintergrundes"
|
||||
L["How large the edges should be."] = "Wie groß die Ecken sein sollen."
|
||||
L["How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."] = "Wie viele Auren pro Reihen angezeigt werden sollen. Wenn hier bspw. Zwei eingetragen wird, werden Zwei Reihen soweit gefüllt wie per Reihen festgesetzt wurde."
|
||||
L["How many auras to show in a single row."] = "Wie viele Auren in einer einzelnen Zeile angezeigt werden sollen."
|
||||
L["How many groups should be shown per row."] = "Wie viele Gruppen sollen pro Reihe angezeigt werden."
|
||||
L["How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"] = "Wie viele Spieler der Einheit assistieren. Wenn Du dies beispielsweise auf Dich selbst setzt, wird angezeigt, wie viele Spieler Dein aktuelles Ziel anvisieren. Bei der Anzahl wirst Du selbst mit einbezogen!"
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "Wie viele Spieler in Deinem Schlachtzug diese Einheit anvisieren. Wenn Du dies beispielsweise auf Dich selbst setzt, wird angezeigt, wie viele Spieler Dich anvisieren. Bei der Anzahl wirst Du selbst mit einbezogen!"
|
||||
L["How many rows total should be used, rows will be however long the per row value is set at."] = "Wie viele Reihen insgesamt verwendet werden sollen. Reihen werden allerdings nur so lange, wie der Reihen-Wert gesetzt wurde."
|
||||
L["How many seconds between updates.|n[WARNING] By setting the frequency to 0 it will update every single frame redraw, if you want to disable frequent updating uncheck it don't set this to 0."] = "Wie viele Sekunden zwischen den Updates liegen.|n[WARNUNG] Wenn die Häufigkeit auf 0 gesetzt wird, wird jedes einzelne Fenster neu aufgebaut. Wenn Du die regelmäßige Aktualisierung deaktivieren möchtest, setze es nicht auf 0."
|
||||
L["How much spacing should be between each new row of groups."] = "Wie groß der Abstand zwischen jeder neuen Reihe von Gruppen sein soll."
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "Wie viel Abstand zwischen allen Leisten innerhalb eines Einheitenfensters vorausgesetzt werden soll. Negative Werte bewegen diese weiter auseinander, positive Werte bringen sie hingegen näher zusammen. 0 für keinen Abstand."
|
||||
L["How the frames should grow when a new column is added."] = "Wie die Fenster anwachsen sollen wenn eine neue Spalte hinzugefügt wird."
|
||||
L["How the rows should grow when new group members are added."] = "Wie die Reihen anwachsen sollen wenn neue Gruppenmitglieder hinzugefügt werden."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "Wie diese Aura an den Einheitenfenster ausgerichtet sein soll."
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "Wenn die Einheit eingehende Heilung erhält, wird die gesamte Menge der eingehenden Heilung angezeigt. Anderenfalls wird der Name der Einheit angezeigt."
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "Wenn die Einheit ein Spieler ist wird die Klasse angezeigt, wenn es sich um einen NPC handelt, siehst du die Art der Kreatur."
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "Wenn die Einheit ein Spieler ist, wird die Rasse angezeigt. Wenn es sich um einen NPC handelt, siehst du die Art der Kreatur."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "Wenn du die Aura gewirkt hast, wird das Buff-Symbol vergrößert um es hervorzuheben."
|
||||
L["Import"] = "Import"
|
||||
L["Import non-standard module settings"] = "Importiere Nicht-Standard Modul Einstellungen"
|
||||
L["Import unit frame positions"] = "Positionen der Einheitenfenster importieren"
|
||||
L["Import visibility settings"] = "Sichtbarkeitseinstellungen importieren"
|
||||
L["Inactive alpha"] = "Inaktiv-Transparenz"
|
||||
L["Incoming heal"] = "Eingehende Heilung"
|
||||
L["Incoming heal (Absolute)"] = "Eingehende Heilung (Absolut)"
|
||||
L["Incoming heal/Name"] = "Eingehende Heilung/Name"
|
||||
L["Incoming heals"] = "Eingehende Heilungen"
|
||||
L["Incoming heal (Short)"] = "Eingehende Heilung (Kurz)"
|
||||
L["Index"] = "Index"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "Indikator für die Zufriedenheit Deines Begleiters (nur für Jäger)."
|
||||
L["Indicators"] = "Indikatoren"
|
||||
L["In range alpha"] = "In-Reichweite-Transparenz"
|
||||
L["Inset"] = "Eingefügt"
|
||||
L["Inside Center"] = "Innen - Zentriert"
|
||||
L["Inside Center Left"] = "Innen - Links zentriert"
|
||||
L["Inside Center Right"] = "Innen - Rechts zentriert"
|
||||
L["Inside Top Left"] = "Innen - Oben links"
|
||||
L["Inside Top Right"] = "Innen - Oben rechts"
|
||||
L["Interrupted"] = "Unterbrochen"
|
||||
L["Invalid interval entered, must be a number."] = "Ungültiger Interval eingegeben, muss eine Zahl sein."
|
||||
L["Invalid spell \"%s\" entered."] = "Ungültiger Zauber \"%s\" eingegeben."
|
||||
L["Invert colors"] = "Farben umkehren"
|
||||
L["Layout manager"] = "Layout-Manager"
|
||||
L["Leader"] = "Leiter"
|
||||
L["Left"] = "Links"
|
||||
L["Left Bottom"] = "Links unten"
|
||||
L["Left Center"] = "Links zentriert"
|
||||
L["Left text"] = "Linker Text"
|
||||
L["Left Top"] = "Links oben"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "Lässt Dich die Größe der Grundschrift ändern, entweder um sie größer oder kleiner zu machen."
|
||||
L["Level"] = "Level"
|
||||
L["Level (Colored)"] = "Level (Farbig)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "Level %s - %s: %s/%s (%.2f%% erhalten)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "Level %s - %s: %s/%s (%.2f%% erhalten), %s erholt."
|
||||
L["Level without any coloring."] = "Level ohne jegliche Einfärbung."
|
||||
L["Light"] = "Hell"
|
||||
L["Lock frames"] = "Fenster sperren"
|
||||
L["Locks the unit frame positionings hiding the mover boxes."] = "Sperrt die Einheitenfenster und versteckt die Bewegungsboxen."
|
||||
L["Low health"] = "Niedrige Gesundheit"
|
||||
L["M"] = "M"
|
||||
L["Main Assist"] = "Hauptassistent"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "Hauptassistenten werden durch das Blizzard Hauptassistenten-System oder Mods (bspw. oRA3) die dieses verwenden gesetzt."
|
||||
L["Main Assist Target"] = "Hauptassistenten Ziel"
|
||||
L["Main Tank"] = "Haupttank"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "Haupt-Tanks werden durch das Blizzard Haupt-Tank-System oder durch Addons, die dieses verwenden (z.B. oRA3) gesetzt."
|
||||
L["Main Tank Target"] = "Haupttank Ziel"
|
||||
L["Male"] = "Männlich"
|
||||
L["Mana"] = "Mana"
|
||||
L["Manage aura filters"] = "Auren-Filter verwalten"
|
||||
L["Management"] = "Verwaltung"
|
||||
L["Manual position"] = "Manuelle Position"
|
||||
L["Master looter"] = "Plündermeister"
|
||||
L["Max columns"] = "Max. Spalten"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "Max. Gesundheit, verwendet ein kurzes Format, 17.750 wird als 17.7k angezeigt, Werte unter 10.000 werden normal angezeigt."
|
||||
L["Max HP (Absolute)"] = "Max. GP (Absolut)"
|
||||
L["Max HP (Short)"] = "Max. GP (Kurz)"
|
||||
L["Max power (Absolute)"] = "Max. Energie (Absolut)"
|
||||
L["Max power (Short)"] = "Max. Energie (Kurz)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "Max. Energie, verwendet ein kurzes Format, 16.000 wird als 16k angezeigt, Werte unter 10.000 werden normal angezeigt."
|
||||
L["Max rows"] = "Max. Reihen"
|
||||
L["Medium"] = "Mittel"
|
||||
L["Miscellaneous"] = "Verschiedenes"
|
||||
L["Missing HP (Short)"] = "Fehlende GP (Kurz)"
|
||||
L["Missing power (Short)"] = "Fehlende Energie (Kurz)"
|
||||
L["Moonkin"] = "Moonkin"
|
||||
L["Name"] = "Name"
|
||||
L["Name (Abbreviated)"] = "Name (Abgekürzt)"
|
||||
L["Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."] = "Name eines freundlichen Zaubers zum Überprüfen der Reichweite zu befreundeten Einheiten.|n|nDies wird nur für Deine aktuelle Klasse automatisch festgelegt."
|
||||
L["Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."] = "Name eines feindlichen Zaubers zum Überprüfen der Reichweite zu feindlichen Einheiten.|n|nDies wird nur für Deine aktuelle Klasse automatisch festgelegt."
|
||||
L["Neutral"] = "Neutral"
|
||||
L["Never (Disabled)"] = "Nie (Deaktiviert)"
|
||||
L["New filter"] = "Neuer Filter"
|
||||
L["None"] = "Keine"
|
||||
L["NPCs only"] = "Nur NPCs"
|
||||
L["Offline"] = "Offline"
|
||||
L["Offline timer"] = "Offline-Timer"
|
||||
L["Off:%s"] = "Aus:%s"
|
||||
L["On aggro"] = "Bei Aggro"
|
||||
L["On curable debuff"] = "Bei entfernbarem Debuff"
|
||||
L["On mouseover"] = "Bei mouseover"
|
||||
L["Order"] = "Reihenfolge"
|
||||
L["Or you can set a position manually"] = "Oder Du kannst eine Position manuell festlegen."
|
||||
L["Outline"] = "Kontur"
|
||||
L["Out of range alpha"] = "Außer-Reichweite-Transparenz"
|
||||
L["Outside bar limit"] = "Kontur Leistenlimit"
|
||||
L["Override color"] = "Farbe überschreiben"
|
||||
L["Party"] = "Gruppe"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "Gruppenfenster werden ausgeblendet, innerhalb eines Schlachtzugs, unabhängig davon wie viele Leute sich darin befinden."
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "Die Gruppenfenster werden ausgeblendet, während Du Dich in einem Schlachtzug mit mehr als 5 Personen befindest."
|
||||
L["Party instances"] = "Gruppen Instanzen"
|
||||
L["Party Pet"] = "Gruppenbegleiter"
|
||||
L["Party Target"] = "Gruppen Ziel"
|
||||
L["Percentage of width the portrait should use."] = "Prozentsatz der Breite, der für das Portrait verwendet werden soll."
|
||||
L["Percent HP"] = "Prozent GP"
|
||||
L["Percent power"] = "Energie Prozent"
|
||||
L["Per column"] = "Per Spalte"
|
||||
L["Per row"] = "Per Reihe"
|
||||
L["Pet"] = "Begleiter"
|
||||
L["Pet Target"] = "Begleiter Ziel"
|
||||
L["Player"] = "Spieler"
|
||||
L["player cast bar"] = "Spieler Zauberleiste"
|
||||
L["Players only"] = "Nur Spieler"
|
||||
L["Players will be colored by class, "] = "Spieler werden nach ihrer Klasse gefärbt"
|
||||
L["Player threat"] = "Spieler Bedrohung"
|
||||
L["Point"] = "Punkt"
|
||||
L["Portrait"] = "Portrait"
|
||||
L["Portrait type"] = "Portrait-Typ"
|
||||
L["Position"] = "Position"
|
||||
L["Power"] = "Energie"
|
||||
L["Power bar"] = "Energieleiste"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "Verhindert das Einblenden von Einheiten-Tooltips im Kampf."
|
||||
L["Prioritize buffs"] = "Stärkungszauber priorisieren"
|
||||
L["Programming in Lua"] = "Programmierung in Lua"
|
||||
L["PvP Flag"] = "PvP-Markierung"
|
||||
L["PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."] = "PVP-Markierung, Horde für Horde markierte PVPler und Allianz für Allianz markierte PVPler."
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "PVP-Timer"
|
||||
L["Race"] = "Rasse"
|
||||
L["Race (Smart)"] = "Rasse (Intelligent)"
|
||||
L["Rage"] = "Wut"
|
||||
L["Raid"] = "Schlachtzug"
|
||||
L["Raid assisting unit"] = "Schlachtzugsassistenten Einheit"
|
||||
L["Raid instances"] = "Schlachtzugsinstanzen"
|
||||
L["Raid pet"] = "Schlachtzugsbegleiter"
|
||||
L["Raid role"] = "Schlachtzugsrolle"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "Schlachtzugrollen-Indikator, fügt ein Schild-Indikator für Haupttanks und ein Schwertsymbol für Hauptassistenten hinzu."
|
||||
L["Raid target"] = "Schlachtzugziel"
|
||||
L["Raid target indicator."] = "Schlachtzugziel-Indikator"
|
||||
L["Raid targeting unit"] = "Schlachtzugziel Einheit"
|
||||
L["Range indicator"] = "Reichweiten-Indikator"
|
||||
L["Range spells"] = "Zauber"
|
||||
L["Rank 1"] = "Rang 1"
|
||||
L["Rare"] = "Rar"
|
||||
L["Rare Elite"] = "Rar Elite"
|
||||
L["Rare indicator"] = "Rar-Indikator"
|
||||
L["Ready status"] = "Bereitschaftscheck"
|
||||
L["Ready status of group members."] = "Bereitschaftscheck der Gruppenmitglieder."
|
||||
L["Relative point"] = "Relativer Punkt"
|
||||
L["Resources"] = "Quellen"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "Gibt einen Farbcode für die Bedrohungssituation mit Deinem Ziel wieder: Rot für Aggro, Orange für hohe Bedrohung und Gelb für Vorsichtig."
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "Gibt einen Farbcode für Deine allgemeine Bedrohungssituation bei allen Einheiten wieder: Rot für Aggro, Orange für hohe Bedrohung und Gelb für vorsichtig sein."
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "Gibt für Dein aktuelles Ziel die Bedrohung in einem Prozentsatz wieder. Immer zwischen 0 - 100%."
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "Gibt die aktuelle Gesundheit als Prozentsatz wieder (wenn die Einheit tot oder offline ist wird dies angezeigt)."
|
||||
L["Returns current power as a percentage."] = "Gibt die aktuelle Energie als Prozentsatz wieder."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "Gibt ein + wieder, wenn es sich bei der Einheit um einen Elite- oder raren Elite-Mob handelt."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "Gibt Rar wieder, wenn es sich bei der Einheit um einen Elite- oder raren Elite-Mob handelt."
|
||||
L["Returns text based on the units general threat situation: Aggro for Aggro, High for being close to taking aggro, and Medium as a warning to be wary.|nThis cannot be used on target of target or focus target types of units."] = "Gibt einen Text wieder, basierend auf der allgemeinen Bedrohungssituation der Einheiten: Aggro für Aggro, Hoch für nah am Aggro bekommen und Mittel als eine allgemeine Warnung vorsichtig zu sein.|nDies kann nicht für Einheiten von Ziel des Ziels oder Fokus Ziel verwendet werden."
|
||||
L["Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."] = "Gibt einen Text wieder, basierend auf Deiner Bedrohungssituation mit deinem Ziel: Aggro für Aggro, Hoch für nah am Aggro ziehen und Mittel als allgemeine Warnung."
|
||||
L["Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."] = "Gibt einen Text wieder, basierend auf Deiner Bedrohungssituation mit deinem Ziel: Aggro für Aggro, Hoch für nah am Aggro bekommen und Mittel als eine allgemeine Warnung vorsichtig zu sein."
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "Gibt einen Farbcode wieder, basierend auf dem Level der Einheiten verglichen mit Deinem. Wenn Du sie nicht angreifen kannst, wird keine Farbe ausgegeben."
|
||||
L["Returns the color code for the units threat situation in general: Red for Aggro, Orange for High threat and Yellow to watch out.|nThis cannot be used on target of target or focus target types of units."] = "Gibt einen Farbcode für die allgemeine Bedrohungssituation der Einheiten wieder: Rot für Aggro, Orange für hohe Bedrohung und Gelb für Vorsichtig.|nDies kann nicht für Einheiten von Ziel des Ziels oder Fokus Ziel verwendet werden."
|
||||
L["Returns the scaled threat percentage for the unit, if you put this on a party member you would see the percentage of how close they are to getting any from any hostile mobs. Always 0 - 100%.|nThis cannot be used on target of target or focus target types of units."] = "Gibt die Bedrohung in einem Prozentsatz für die Einheit wieder. Wenn Du dies auf ein Gruppenmitglied setzt, würdest Du in Prozenten sehen, wie nah sie sind Aggro irgendeines feindlichen Gegners zu erhalten. Immer zwischen 0 - 100%.|Dies kann nicht bei Einheiten von Ziel des Ziels oder Fokus Ziel verwendet werden."
|
||||
L["Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."] = "Gibt die aktuelle Form der Einheit wieder, wenn sie ein Druide ist. Katze für Katzenform, Moonkin für Moonkin und so weiter."
|
||||
L["Returns the units sex."] = "Gibt das Geschlecht der Einheit wieder."
|
||||
L["Right"] = "Rechts"
|
||||
L["Right Bottom"] = "Rechts unten"
|
||||
L["Right Center"] = "Rechts zentriert"
|
||||
L["Right text"] = "Rechter Text"
|
||||
L["Right Top"] = "Rechts oben"
|
||||
L["Role the unit is playing in dungeons formed through the Looking For Dungeon system."] = "Die Rolle, die die Einheit in Instanzen übernimmt, die über das LFD-System erstellt werden."
|
||||
L["Row growth"] = "Reihenwachstum"
|
||||
L["Row offset"] = "Reihen-Verschiebung"
|
||||
L["rune bar"] = "Runenleiste"
|
||||
L["Rune bar"] = "Runenleiste"
|
||||
L["Runic Power"] = "Runenmacht"
|
||||
L["Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."] = "Dasselbe wie [color:sit], außer das es nur Rot ausgibt, wenn Du Aggro hast, anstatt einem Übergang von Gelb -> Orange -> Rot."
|
||||
L["Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."] = "Dasselbe wie [unit:color:sit], außer das es nur Rot ausgibt, wenn die Einheit Aggro hat, anstatt einem Übergang von Gelb -> Orange -> Rot."
|
||||
L["Scale"] = "Skalierung"
|
||||
L["Scaled threat percent"] = "Skaliert die Bedrohungsprozente"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "Skalierung für Auren die du gewirkt hast. Jede Zahl über 100% ist größer als Standard, jede Zahl niedriger als 100% ist kleiner als Standard."
|
||||
L["Screen"] = "Bildschirm"
|
||||
L["Search"] = "Suche"
|
||||
L["Search tags"] = "Tags suchen"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "Siehe unten in der Dokumentation für Informationen und Beispiele für das Erstellen von Tags. Wenn Du nur einfache Lua oder WoW API Informationen möchtest, siehe Dir die Programmieren in Lua und WoW Programmieren Links an."
|
||||
L["Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."] = "Wähle einen Tagtext aus dem linken Menü, um die Tags zu verändern. Breite kürzen, Größenbestimmung und Verschieben kann im aktuellen Menü durchgeführt werden."
|
||||
L["Select the units that you want to modify, any settings changed will change every unit you selected. If you want to anchor or change raid/party unit specific settings you will need to do that through their options.|n|nShift click a unit to select all/unselect all."] = "Wähle die Einheiten aus, die Du bearbeiten möchtest. Alle Einstellungen die verändert werden, werden bei den Einheiten die Du ausgewählt hast verändert. Wenn Du bestimmte Einstellungen für Schlachtzug/Gruppen Einheiten ausrichten oder verändern möchtest, musst Du dies durch ihre Einstellungen tun.|n|nUmschalt-Klick, eine Einheit um alle auszuwählen oder alle abzuwählen."
|
||||
L["Self aura size"] = "Größe eigene Aura"
|
||||
L["Separate raid frames"] = "Seperate Schlachtzugsfenster"
|
||||
L["Set filter zones"] = "Gebiet-Filter setzen"
|
||||
L["Sex"] = "Geschlecht"
|
||||
L["%s frames"] = "%s Fenster"
|
||||
L["Short classification"] = "Kurze Klassifizierung"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "Kurze Klassifizierungen, R für Rar, R+ für raren Elite, + für Elite, B für Boss. Sollte es sich um keine dieser handeln, wird nichts angezeigt."
|
||||
L["Short elite indicator"] = "Kurzer Elite-Indikator"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "Eingehenden Heilwert abkürzen, wenn 13.000 Heilung eintreffen, wird 13k angezeigt."
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "Kurze Version von [druidform], K = Katze, B = Bär, F = Flug und so weiter."
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "Zeige einen Hintergrund hinter den Leisten mit der selben Textur/Farbe, allerdings verblassend."
|
||||
L["Show as bar"] = "Zeige als Leiste"
|
||||
L["Show background"] = "Zeige Hintergrund"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "Zeige Buffs vor Debuffs, wenn sie sich den Ausrichtungspunkt teilen."
|
||||
L["Show castable on other auras only"] = "Nur zauberbare bei anderen Buffs/Debuffs anzeigen"
|
||||
L["Show cast name"] = "Zeige Zaubername"
|
||||
L["Show cast rank"] = "Zeige Zauberrang"
|
||||
L["Show cast time"] = "Zeige Zauberzeit"
|
||||
L["Show curable only"] = "Zeige nur heilbare"
|
||||
L["Show party as raid"] = "Zeige Gruppe als Schlachtzug"
|
||||
L["Show player in party"] = "Zeige Spieler in einer Gruppe"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "Zeigt AFK, DND oder nichts abhängig vom aktuellen Status der Einheit."
|
||||
L["Shows combat feedback, last healing the unit received, last hit did it miss, resist, dodged and so on."] = "Zeigt Kampf-Feedback, die letzte erhaltene Heilung der Einheit, letzter Treffer, den sie verfehlt, widerstanden, ausgewischen ist und so weiter."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "Zeigt aktuelle und maximale Gesundheit in absoluter Form. 17.500 Gesundheit wird auch als 17.500 angezeigt."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "Zeigt aktuelle und maximale Energie in absoluter Form, 18.000 Energie werden auch als 18.000 Energie angezeigt."
|
||||
L["Shows current group number of the unit."] = "Zeige aktuelle Gruppennummer des Spielers."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "Zeigt aktuelle Gesundheit in absoluter Form, 15.000 Gesundheit wird als 15.000 Gesundheit angezeigt."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "Zeigt aktuelle Energie in absoluter Form, 15.000 Energie werden auch als 15.000 Energie angezeigt."
|
||||
L["Shows how long an unit has been AFK or DND."] = "Zeige wie lange ein Spieler AFK oder DND ist."
|
||||
L["Shows how long an unit has been offline."] = "Zeige wie lange ein Spieler offline ist."
|
||||
L["Shows how long until your PVP flag drops, will not show if the flag is manually on or you are in a hostile zone.|n|nThis will only work for yourself, you cannot use it to see the time left on your party or raid."] = "Zeigt wann Deine PVP-Markierung ausläuft. Wird nicht angezeigt wenn die Markierung manuell eingeschaltet wurde oder Du Dich in einem feindlichen Gebiet befindest.|n|nDies funktioniert nur für Dich selbst, Du kannst die verbleibende Zeit Deiner Gruppen- oder Schlachtzugsmitglieder nicht einsehen."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "Zeigt die maximale Gesundheit in absoluter Form, 14.000 Gesundheit werden auch als 14.000 angezeigt."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "Zeigt die maximale Energie in absoluter Form, 13.000 Energie werden auch als 13.000 angezeigt."
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "Zeigt Offline, Tot, Geist oder nichts abhängig vom aktuellen Status der Einheit."
|
||||
L["Show's the units guild name if they are in a guild."] = "Den Gildennamen der Einheiten anzeigen, wenn sie sich in einer Gilde befinden."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "Zeigt die Gesundheit der Einheit als Prozentsatz, gerundet auf die erste Dezimalstelle (z.B. werden 61 von 110 GP als 55.4% angezeigt)."
|
||||
L["Show your auras only"] = "Nur Deine Auren anzeigen"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "Einfache Auren-Filterung durch Ausnahme- und Schwarze Listen."
|
||||
L["Size"] = "Größe"
|
||||
L["Smart level"] = "Intelligentes Level"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "Intelligentes Level, gibt Boss für Bosse wieder, +50 für ein Level 50 Elite-Mob oder nur 80 für ein Level 80."
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Intelligente Nummern formatiert für [curmaxhp], Nummern unter 1.000.000 verbleiben wie sie sind, Nummern über 1.000.000 verwenden die kurze Version wie zum Beispiel 1m."
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Intelligente Nummern formatiert für [curmaxpp], Nummern unter 1.000.000 verbleiben wie sie sind, Nummern über 1.000.000 verwenden die kurze Version wie zum Beispiel 1m."
|
||||
L["%s member"] = "%s Mitglieder"
|
||||
L["Sorting"] = "Sortierung"
|
||||
L["Sort method"] = "Sortierungsmethode"
|
||||
L["Sort order"] = "Sortierungsanordnung"
|
||||
L["Spacing"] = "Abstand"
|
||||
L["Spacing between each row"] = "Abstand zwischen jeder Reihe"
|
||||
L["Splits raid frames into individual frames for each raid group instead of one single frame.|nNOTE! You cannot drag each group frame individualy, but how they grow is set through the column and row growth options."] = "Teilt die Schlachtzugsfenster in einzelne Fenster für jede Schlachtzugsgruppe, anstatt ein einzelnes Fenster.|nBEACHTE! Du kannst nicht jedes Gruppenfenster einzeln verschieben, aber wie sie aufgebaut sind, durch die Spalten und Reihen Einstellungen."
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (%.2f%% erhalten)"
|
||||
L["Static"] = "Statisch"
|
||||
L["Status"] = "Status"
|
||||
L["Status indicator, shows if the unit is currently in combat. For the player it will also show if you are rested."] = "Status-Indikator, zeigt ob die Einheit sich aktuell im Kampf befindet. Für Spieler zeigt es ebenso, ob sie ausruht sind."
|
||||
L["Style of borders to show for all auras."] = "Stil des Randes, der für alle Auren verwendet wird."
|
||||
L["T"] = "T"
|
||||
L["Tag list"] = "Tag-Liste"
|
||||
L["Tag name"] = "Tag-Name"
|
||||
L["Tags"] = "Tags"
|
||||
L["Tag that you will use to access this code, do not wrap it in brackets or parenthesis it's automatically done. For example, you would enter \"foobar\" and then access it with [foobar]."] = "Tag den Du verwendest zum Abrufen dieses Codes. Füge keine Klammern ein, da dies automatisch getan wird. Wenn Du zum Beispiel \"foobar\" eingibst, wird es mit [foobar] automatisch abgerufen."
|
||||
L["Target"] = "Ziel"
|
||||
L["Target of Target"] = "Ziel des Ziels"
|
||||
L["Target of Target of Target"] = "Ziel des Ziel des Ziels"
|
||||
L["Temporary enchants"] = "Vorübergehende Verzauberungen"
|
||||
L["Test Aura"] = "Aura testen"
|
||||
L["Test spell"] = "Zauber testen"
|
||||
L["Text"] = "Text"
|
||||
L["Text management"] = "Text-Verwaltung"
|
||||
L["Text name"] = "Text-Name"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "Textname, den Du beim Konfigurieren zum Unterscheiden von diesem Text und weiteren verwenden kannst."
|
||||
L["Text/Tags"] = "Text/Tags"
|
||||
L["The blacklist \"%s\" already exists."] = "Die schwarze Liste \"%s\" existiert bereits."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "Die Auswahlkästchen unten, erlauben Dir das Aktivieren und Deaktivieren von Einheiten."
|
||||
L["The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."] = "Das Spielerfenster wird nicht rücksichtslos versteckt. Du musst dies manuell deaktivieren, entweder komplett oder per Gebiets-Typ."
|
||||
L["The tag \"%s\" already exists."] = "Der Tag \"%s\" existiert bereits."
|
||||
L["The unit frames you see are examples, they are not perfect and do not show all the data they normally would.|n|nYou can hide them by locking them through /shadowuf or clicking the button below."] = "Die Einheitenfenster die Du siehst sind Beispiele, die nicht perfekt sind und auch nicht alle Daten anzeigen, die sie normalerweiße würden.|n|nDu kannst sie durch /shadowuf oder klicken des unteren Buttons sperren."
|
||||
L["The whitelist \"%s\" already exists."] = "Die Ausnahmeliste \"%s\" existiert bereits."
|
||||
L["Thick outline"] = "Dicke Kontur"
|
||||
L["Thin outline"] = "Dünne Kontur"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "Diese Leiste wird automatisch ausgeblendet, wenn Du das Level-Maximum erreicht hast, oder Du gerade keinen Ruf verfolgst."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "Dieser Filter enthält keine Auren. Du musst mittels des oberen Dialogs einige hinzufügen."
|
||||
L["This filter has no aura types set to filter out."] = "Dieser Filter hat keine Auren zum Herausfiltern gesetzt."
|
||||
L["This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."] = "Dies ist eine gute Einführung wie man mit dem Programmieren von Lua beginnen sollte. Obwohl Du nicht alles vollständig lesen musst, ist es jedoch sehr hilfreich zum Verstehen der Grundlagen von Lua Syntax und APIs."
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "Diese Einheit hängt von einer anderen ab um zu funktionieren. Das Deaktivieren von %s wird auch %s deaktivieren."
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "Diese Einheit hat Kinder-Einheiten, die davon abhängig sind. Du musst diese Einheit aktivieren bevor du die Kinder aktivieren kannst."
|
||||
L["This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."] = "Dies deaktiviert die automatische Erkennung der Ereignisse, die dieser Tag benötigt. Du solltest dies unabgehakt lassen, außer Du weißt was Du tust."
|
||||
L["This will override all background colorings for bars including custom set ones."] = "Dies überschreibt alle Hintergrund-Färbungen für alle Leisten, einschließlich den benutzerdefinierten."
|
||||
L["Threat"] = "Bedrohung"
|
||||
L["Threat situation"] = "Bedrohungssituation"
|
||||
L["Tile size"] = "Kachel-Größe"
|
||||
L["Timers for self auras only"] = "Timer nur bei eigenen Auren"
|
||||
L["Top"] = "Oben"
|
||||
L["Top Center"] = "Oben Mitte"
|
||||
L["Top Left"] = "Oben Links"
|
||||
L["Top Right"] = "Oben Rechts"
|
||||
L["Total number of combo points you have on your target."] = "Gesamtzahl der Kombo-Punkte die Du auf dem Ziel hast."
|
||||
L["Totem bar"] = "Totemleiste"
|
||||
L["Travel"] = "Reisen"
|
||||
L["Tree"] = "Baum"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "Schaltet das schnelle Aktualisieren der Energieleiste ein, damit Du noch aktuellere Informationen als normal erhältst."
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "Schaltet die schnelle Aktualisierung der Gesundheitsleisten ein, um noch aktuellere Werte über die Gesundheit zu erhalten."
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "Schaltet dieses Widget in eine Leiste um, die in der Größe und Sortierung wie die Gesundheits- oder Energieleiste verändert werden kann."
|
||||
L["Unattackable hostile"] = "Nicht angreifbare Feinde"
|
||||
L["Unit color code on aggro"] = "Einheit - Farbe bei Aggro"
|
||||
L["Unit colored situation"] = "Einheit - Situation gefärbt"
|
||||
L["Unit configuration"] = "Einheiten Konfiguration"
|
||||
L["Unit faction"] = "Einheiten Fraktion"
|
||||
L["Unit name"] = "Einheitenname"
|
||||
L["Unit name (Class colored)"] = "Einheitenname (Klassenfarben)"
|
||||
L["Unit name colored by class."] = "Einheitenname nach Klasse gefärbt"
|
||||
L["Units"] = "Einheiten"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "Einheiten-Zugehörigkeit, Thrall gibt Horde wieder, König Magni Bronzebart hingegen Allianz."
|
||||
L["Unit scaled threat"] = "Einheit - Skalierte Bedrohung"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "Einheiten-Klassifikation, Rar, Rar-Elite, Elite oder Boss. Sollte es sich um keine dieser handeln, wird nichts angezeigt."
|
||||
L["Unit server"] = "Einheit - Server"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "Einheit - Server, wenn sie von Deinem Server sind, wird nichts angezeigt."
|
||||
L["Unit situation name"] = "Einheit - Situations Name"
|
||||
L["Units per column"] = "Einheiten pro Spalte"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "Einheiten Rasse, Blutelf, Tauren, Troll und so weiter."
|
||||
L["Unlink frames"] = "Frames entsperren"
|
||||
L["Up"] = "Hoch"
|
||||
L["Update interval"] = "Aktualisierungsinterval"
|
||||
L["Using unit settings"] = "Einheiteneinstellungen verwenden"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "Verschiedene Einheiten können auf dieser Seite aktiviert werden, zum Beispiel Schlachtzug oder Gruppen-Ziele."
|
||||
L["Vehicle"] = "Fahrzeug"
|
||||
L["Vehicles"] = "Fahrzeuge"
|
||||
L["View"] = "Ansicht"
|
||||
L["Visibility"] = "Sichtbarkeit"
|
||||
L["WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."] = "WARNUNG: Hiermit trennst Du Fenster voneinander damit Du sie bewegen kannst, ohne dass sich dabei andere Fenster mitbewegen."
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "Wenn der Einheit Gesundheitspunkte fehlen, wird der [missinghp] Tag angezeigt, sollten sie volle Gesundheit haben, wird stattdessen der [name] Tag angezeigt. Dies lässt Dich -1000 sehen wenn ihnen 1000 GP fehlen und ihren Namen wenn sie volle Gesundheit besitzen."
|
||||
L["When this filter is active, apply the filter to buffs."] = "Wenn dieser Filter aktiv ist, diesen auch für Stärkungszauber anwenden."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "Wenn dieser Filter aktiv ist, diesen auch für Schwächungszauber anwenden."
|
||||
L["Where inside the frame the text should be anchored to."] = "Wo innerhalb des Fensters der Text ausgerichtet werden soll."
|
||||
L["Where to anchor the cast name text."] = "Wo der Text der Zaubernamen ausgerichtet werden soll."
|
||||
L["Where to anchor the cast time text."] = "Wo der Text der Zauberzeit ausgerichtet werden soll."
|
||||
L["Whitelist"] = "Ausnahmeliste"
|
||||
L["Whitelist filters"] = "Ausnahmeliste-Filter"
|
||||
L["Whitelists"] = "Ausnahmelisten"
|
||||
L["Whitelists will hide any aura not in the filter group.|nBlacklists will hide auras that are in the filter group."] = "Ausnahmelisten verstecken alle Auren die sich nicht in der Filter Gruppe befinden.|nSchwarze Listen verstecken Auren die sich in der Filter Gruppe befinden."
|
||||
L["Widget size"] = "Widget-Größe"
|
||||
L["Width"] = "Breite"
|
||||
L["Width percent"] = "Breite Prozent"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "Keine Einstellungen von Modulen, die nicht standardmäßig in Shadowed Unit Frames inbegriffen sind importieren."
|
||||
L["Wondering what all of the tabs for the unit configuration mean? Here's some information:|n|n|cfffed000General:|r Portrait, range checker, combat fader, border highlighting|n|cfffed000Frame:|r Unit positioning and frame anchoring|n|cfffed000Bars:|r Health, power, empty and cast bar, and combo point configuration|n|cfffed000Widget size:|r All bar and portrait sizing and ordering options|n|cfffed000Auras:|r All aura configuration for enabling/disabling/enlarging self/etc|n|cfffed000Indicators:|r All indicator configuration|n|cfffed000Text/Tags:|r Tag management as well as text positioning and width settings.|n|n|n*** Frequently looked for options ***|n|n|cfffed000Raid frames by group|r - Unit configuration -> Raid -> Raid -> Separate raid frames|n|cfffed000Class coloring:|r Bars -> Color health by|n|cfffed000Timers on auras:|r You need OmniCC for that|n|cfffed000Showing/Hiding default buff frames:|r Hide Blizzard -> Hide buff frames|n|cfffed000Percentage HP/MP text:|r Tags/Text tab, use the [percenthp] or [percentpp] tags|n|cfffed000Hiding party based on raid|r - Unit configuration -> Party -> Party -> Hide in 6-man raid/Hide in any raid"] = "Verwundert was die ganzen Reiter für die Einheitenkonfiguration bedeuten? Hier sind einige Informationen:|n|n|cfffed000Allgemein:|r Portrait, Reichweitencheck, Kampfausblender, Ränder hervorheben|n|cfffed000Fenster:|r Einheiten Positionierung und Fenster ausrichten|n|cfffed000Leisten:|r Gesundheit, Energie, leere, Zauberleiste und Konfiguration der Kombopunkte|n|cfffed000Widget Größe:|r Alle Optionen zur Größeneinteilung und Anordnung der Leisten und Portraits|n|cfffed000Auren:|r Alle Konfigurationen für Auren zum aktivieren/deaktivieren/eigene vergrößeren/etc|n|cfffed000Indikatoren:|r Alle Konfigurationen für Indikatoren|n|cfffed000Text/Tags:|r Tag-Verwaltung sowie Text-Positionierung und Einstellungen der Breite.|n|n|n*** Häufig gesuchte Einstellungen ***|n|n|cfffed000Schlachtzugsfenster nach Gruppe|r - Einheiten Konfiguration -> Schlachtzug -> Schlachtzug -> Seperate Schlachtzugsfenster|n|cfffed000Klassen-Einfärbung:|r Leisten -> Gesundheit färben bei |n|cfffed000Timern der Auren:|r Du benötigst OmniCC hierfür|n|cfffed000Zeige/Verstecke standard Buff-Fenster:|r Blizzard ausblenden -> Buff-Fenster verstecken|n|cfffed000Prozentualer GP/MP Text:|r Tags/Text-Reiter, verwende die [percenthp] oder [percentpp] Tags|n|cfffed000Verstecke Gruppe basierend auf Schlachtzug|r - Einheiten Konfiguration -> Gruppe -> Gruppe -> In einem 6-Mann-Schlachtzug ausblenden/In jedem Schlachtzug ausblenden"
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "Funktioniert gleich wie %s, aber wird nur in Katzen- oder Bär-Form angezeigt."
|
||||
L["WoW Programming"] = "WoW Programmierung"
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WoW-Programmieren ist eine gute Quelle um herauszufinden, was verschiedene APIs tun und wie man diese abruft."
|
||||
L["X Offset"] = "X-Verschiebung"
|
||||
L["XP/Rep bar"] = "XP/EP Leiste"
|
||||
L["Y Offset"] = "Y-Verschiebung"
|
||||
L["You can add additional text with tags enabled using this configuration, note that any additional text added (or removed) effects all units, removing text will reset their settings as well.|n|nKeep in mind, you cannot delete the default text included with the units."] = "Du kannst zusätzlich Text mit aktivierten Tags hinzufügen mit dieser Konfiguration. Beachte, dass jeder zusätzliche hinzugefügte Text (oder entfernte) sich auf alle Einheiten auswirkt. Texte entfernen setzt ebenso all ihre Einstellungen zurück.|n|nBedenke, dass Du keinen Standard Text löschen kannst, der in den Einheiten inbegriffen ist."
|
||||
L["You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."] = "Du kannst neue benutzerdefinierte Tags über diese Seite hinzufügen. Wenn Du sehen möchtest, welche Tags im Text verwendet werden, schaue unter dem Text-Reiter für eine Einheitenkonfiguration."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "Du kannst mehr Informationen zum Erstellen von benutzerdefinierten Tags im \"Hilfe\"-Reiter weiter oben finden."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above.|nSUF will attempt to automatically detect what events your tag will need, so you do not generally need to fill out the events field."] = "Du kannst mehr Informationen über Erstellen von eigenen benutzerdefinierten Tags in dem oberen \"Hilfe\"-Reiter finden.|nSUF wird versuchen automatisch zu erkennen welche Ereignisse Dein Tag benötigt, sodass Du üblicherweise nicht die Ereignisfelder ausfüllen musst."
|
||||
L["You can import another Shadowed Unit Frame users configuration by entering the export code they gave you below. This will backup your old layout to \"Import Backup\".|n|nIt will take 30-60 seconds for it to load your layout when you paste it in, please by patient."] = "Du kannst andere Benutzer Konfigurationen von Shadowed Unit Frames importieren, indem Du den exportierten Code den sie Dir gegeben haben unten einfügst. Dein aktuelles Layout wird unter \"Importiere Backup\" gesichert.|n|nNach dem Einfügen Deines neuen Layouts, wird es ca. 30-60 Sekunden geladen, bitte habe Geduld."
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "Du kannst diesen Tag nicht bearbeiten, da es einer der inbegriffenen Standard Tags dieses Addons ist. Diese Funktion ist hier um ein Beispiel für Deine eigenen benutzerdefinierten Tags bereitzustellen."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "Du kannst diesen Tag nicht \"%s\" nennen, Tag-Namen dürfen keine Klammern beinhalten."
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "Hier kannst Du festlegen, welche Einheitenfenster, welche Filter-Gruppe und in welchem Gebietstyp verwendet werden soll. Wenn Du festlegen möchtest, welche Aura in welche Gruppe soll, dann schaue unter der \"Auren-Filter verwalten\" Option."
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "Du hast bisher keinen Filter dieser Art hinzugefügt. Vor dem Nutzen dieser Seite, musst du einen Filter in der Verwaltung erstellen."
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "Du bist einem Kampf beigetreten, alle Fenster wurden gesperrt. Wenn Du den Kampf wieder verlassen hast, musst Du erneut /shadowuf eingeben, um sie wieder zu entsperren."
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "Du musst die Ereignisse festlegen zum Ausführen. Du kannst nur Buchstaben und Unterstriche eingeben, \"FOO_BAR\" ist zum Beispiel zulässig, \"APPLE_5_ORANGE\" nicht, da eine Nummer enthalten ist."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "Du musst eine Nummer die 0 oder höher ist eingeben. Negative Nummern sind nicht erlaubt."
|
||||
L["You must enter a tag name."] = "Du musst einen Tag-Namen eingeben."
|
||||
L["You must wrap your code in a function."] = "Du musst Deinen Code in eine Funktion umbrechen."
|
||||
L["Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."] = "Dein aktives Layout ist ein Profil, welches für Backup importieren verwendet wird. Dies kann nicht durch einen Import überschrieben werden. Wechsel Dein Profil in irgendein anderes und versuche es erneut."
|
||||
L["Your code must be wrapped in a function, for example, if you were to make a tag to return the units name you would do:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"] = "Dein Code muss in eine Funktion umgebrochen werden. Wenn Du beispielsweise einen Tag erstellst um den Einheitenname auszugeben, würdest Du folgendes tun:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "Du musst einen Auren-Filter erstellen, bevor Du festlegen kannst, bei welcher Einheit die Auren-Filterung aktiviert sein soll."
|
||||
L["You will need to do a /console reloadui before a hidden frame becomes visible again.|nPlayer and other unit frames are automatically hidden depending on if you enable the unit in Shadowed Unit Frames."] = "Du musst ein /console reloadui ausführen, bevor ein verstecktes Fenster wieder sichtbar wird.|nSpieler und andere Einheitenfenster sind automatisch versteckt, abhängig davon ob Du die Einheit im Shadowed Unit Frames aktiviert hast."
|
||||
L["Zone configuration"] = "Gebiet Konfiguration"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,689 @@
|
||||
local ShadowUF = select(2, ...)
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."
|
||||
L["Add"] = "Add"
|
||||
L["Add new tag"] = "Add new tag"
|
||||
L["Add new text"] = "Add new text"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "Adds an empty bar that you can put text into as a way of uncluttering other bars."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "Adds rune bars and timers before runes refresh to the player frame."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "Adds %s to the list of units to be modified when you change values in this tab."
|
||||
L["Adds temporary enchants to the buffs for the player."] = "Adds temporary enchants to the buffs for the player."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "Adds totem bars with timers before they expire to the player frame."
|
||||
L["Add tags"] = "Add tags"
|
||||
L["Advanced"] = "Advanced"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "Advanced tag management, allows you to add your own custom tags."
|
||||
L["AFK"] = "AFK"
|
||||
L["AFK:%s"] = "AFK:%s"
|
||||
L["AFK status"] = "AFK status"
|
||||
L["AFK timer"] = "AFK timer"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."
|
||||
L["Aggro"] = "Aggro"
|
||||
L["Allows you to anchor the aura group to another, you can then choose where it will be anchored using the position.|n|nUse this if you want to duplicate the default ui style where buffs and debuffs are separate groups."] = "Allows you to anchor the aura group to another, you can then choose where it will be anchored using the position.|n|nUse this if you want to duplicate the default ui style where buffs and debuffs are separate groups."
|
||||
L["Alpha to use for bar."] = "Alpha to use for bar."
|
||||
L["Alpha to use for bar backgrounds."] = "Alpha to use for bar backgrounds."
|
||||
L["Ammo"] = "Ammo"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."
|
||||
L["Anchor point"] = "Anchor point"
|
||||
L["Anchor to"] = "Anchor to"
|
||||
L["Anchor to another frame"] = "Anchor to another frame"
|
||||
L["Anchor to buffs"] = "Anchor to buffs"
|
||||
L["Anchor to debuffs"] = "Anchor to debuffs"
|
||||
L["Aquatic"] = "Aquatic"
|
||||
L["Arena"] = "Arena"
|
||||
L["Arena Pet"] = "Arena Pet"
|
||||
L["Arenas"] = "Arenas"
|
||||
L["Arena Target"] = "Arena Target"
|
||||
L["Are you sure you want to delete this filter?"] = "Are you sure you want to delete this filter?"
|
||||
L["Are you sure you want to delete this tag?"] = "Are you sure you want to delete this tag?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "Are you sure you want to delete this text? All settings for it will be deleted."
|
||||
L["Ascending"] = "Ascending"
|
||||
L["Aura border style"] = "Aura border style"
|
||||
L["Aura filters"] = "Aura filters"
|
||||
L["Aura name"] = "Aura name"
|
||||
L["Auras"] = "Auras"
|
||||
L["Aura types to filter"] = "Aura types to filter"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "Background"
|
||||
L["Background alpha"] = "Background alpha"
|
||||
L["Background/border"] = "Background/border"
|
||||
L["Background color"] = "Background color"
|
||||
L["Bag indicator for master looters."] = "Bag indicator for master looters."
|
||||
L["Bar alpha"] = "Bar alpha"
|
||||
L["Bars"] = "Bars"
|
||||
L["Bar spacing"] = "Bar spacing"
|
||||
L["Bars with an order higher or lower than the full size options will use the entire unit frame width.|n|nBar orders between those two numbers are shown next to the portrait."] = "Bars with an order higher or lower than the full size options will use the entire unit frame width.|n|nBar orders between those two numbers are shown next to the portrait."
|
||||
L["Bar texture"] = "Bar texture"
|
||||
L["Battlegrounds"] = "Battlegrounds"
|
||||
L["Bear"] = "Bear"
|
||||
L["Blacklist"] = "Blacklist"
|
||||
L["Blacklist filters"] = "Blacklist filters"
|
||||
L["Blacklists"] = "Blacklists"
|
||||
L["Blizzard"] = "Blizzard"
|
||||
L["Border"] = "Border"
|
||||
L["Border alpha"] = "Border alpha"
|
||||
L["Border color"] = "Border color"
|
||||
L["Border highlighting"] = "Border highlighting"
|
||||
L["Border thickness"] = "Border thickness"
|
||||
L["Boss"] = "Boss"
|
||||
L["Boss Target"] = "Boss Target"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."
|
||||
L["Both"] = "Both"
|
||||
L["Bottom"] = "Bottom"
|
||||
L["Bottom Center"] = "Bottom Center"
|
||||
L["Bottom Left"] = "Bottom Left"
|
||||
L["Bottom Right"] = "Bottom Right"
|
||||
L["buff frames"] = "buff frames"
|
||||
L["Buffs"] = "Buffs"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "Cannot find any profiles named \"%s\"."
|
||||
L["Cast"] = "Cast"
|
||||
L["Cast bar"] = "Cast bar"
|
||||
L["Cast icon"] = "Cast icon"
|
||||
L["Casting"] = "Casting"
|
||||
L["Cast interrupted"] = "Cast interrupted"
|
||||
L["Cast name"] = "Cast name"
|
||||
L["Cast time"] = "Cast time"
|
||||
L["Cast uninterruptible"] = "Cast uninterruptible"
|
||||
L["Cat"] = "Cat"
|
||||
L["Category"] = "Category"
|
||||
L["Center"] = "Center"
|
||||
L["Changed profile to %s."] = "Changed profile to %s."
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."
|
||||
L["Channelling"] = "Channelling"
|
||||
L["Child units cannot be dragged, you will have to reposition them through /shadowuf."] = "Child units cannot be dragged, you will have to reposition them through /shadowuf."
|
||||
L["Class"] = "Class"
|
||||
L["Class color tag"] = "Class color tag"
|
||||
L["Classes"] = "Classes"
|
||||
L["Class icon"] = "Class icon"
|
||||
L["Class icon for players."] = "Class icon for players."
|
||||
L["Classificaiton"] = "Classificaiton"
|
||||
L["Classifications"] = "Classifications"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."
|
||||
L["Class (Smart)"] = "Class (Smart)"
|
||||
L["Clip"] = "Clip"
|
||||
L["Close color"] = "Close color"
|
||||
L["Closes a color code, prevents colors from showing up on text that you do not want it to."] = "Closes a color code, prevents colors from showing up on text that you do not want it to."
|
||||
L["Code"] = "Code"
|
||||
L["Color by class"] = "Color by class"
|
||||
L["Color by happiness"] = "Color by happiness"
|
||||
L["Color by reaction on"] = "Color by reaction on"
|
||||
L["Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."] = "Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."
|
||||
L["Color code for general situation"] = "Color code for general situation"
|
||||
L["Color code for situation"] = "Color code for situation"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"
|
||||
L["Color code on aggro"] = "Color code on aggro"
|
||||
L["Color health by"] = "Color health by"
|
||||
L["Color on aggro"] = "Color on aggro"
|
||||
L["Colors"] = "Colors"
|
||||
L["Colors the health bar by how happy your pet is."] = "Colors the health bar by how happy your pet is."
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "Color to use for health bars that are set to be colored by a static color."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "Color used when a cast cannot be interrupted, this is only used for PvE mobs."
|
||||
L["Color used when a cast is a channel."] = "Color used when a cast is a channel."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "Color used when a cast is interrupted either by the caster themselves or by another unit."
|
||||
L["Color used when a cast is successfully finished."] = "Color used when a cast is successfully finished."
|
||||
L["Color used when an unit is casting a spell."] = "Color used when an unit is casting a spell."
|
||||
L["Column growth"] = "Column growth"
|
||||
L["Column spacing"] = "Column spacing"
|
||||
L["Combat alpha"] = "Combat alpha"
|
||||
L["Combat fader"] = "Combat fader"
|
||||
L["Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."] = "Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."
|
||||
L["Combat/resting status"] = "Combat/resting status"
|
||||
L["Combat status"] = "Combat status"
|
||||
L["Combat text"] = "Combat text"
|
||||
L["Combo points"] = "Combo points"
|
||||
L["Configuration to specific unit frames."] = "Configuration to specific unit frames."
|
||||
L["Create"] = "Create"
|
||||
L["Creature type"] = "Creature type"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."
|
||||
L["Crown indicator for group leaders."] = "Crown indicator for group leaders."
|
||||
L["Cur/Max HP (Absolute)"] = "Cur/Max HP (Absolute)"
|
||||
L["Cur/Max HP (Short)"] = "Cur/Max HP (Short)"
|
||||
L["Cur/Max HP (Smart)"] = "Cur/Max HP (Smart)"
|
||||
L["Cur/Max power (Absolute)"] = "Cur/Max power (Absolute)"
|
||||
L["Cur/Max power (Druid)"] = "Cur/Max power (Druid)"
|
||||
L["Cur/Max Power (Short)"] = "Cur/Max Power (Short)"
|
||||
L["Cur/Max PP (Smart)"] = "Cur/Max PP (Smart)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "Current and maximum power, formatted as [curpp]/[maxpp]."
|
||||
L["Current health (Druid/Absolute)"] = "Current health (Druid/Absolute)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."
|
||||
L["Current HP (Absolute)"] = "Current HP (Absolute)"
|
||||
L["Current HP (Short)"] = "Current HP (Short)"
|
||||
L["Current power (Absolute)"] = "Current power (Absolute)"
|
||||
L["Current power (Druid)"] = "Current power (Druid)"
|
||||
L["Current power (Druid/Absolute)"] = "Current power (Druid/Absolute)"
|
||||
L["Current Power (Short)"] = "Current Power (Short)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."
|
||||
L["Dark"] = "Dark"
|
||||
L["Dead"] = "Dead"
|
||||
L["Debuffs"] = "Debuffs"
|
||||
L["Decimal percent HP"] = "Decimal percent HP"
|
||||
L["Default color"] = "Default color"
|
||||
L["Default font color, any color tags inside individual tag texts will override this."] = "Default font color, any color tags inside individual tag texts will override this."
|
||||
L["Deficit/Unit Name"] = "Deficit/Unit Name"
|
||||
L["Delete"] = "Delete"
|
||||
L["Delete filter"] = "Delete filter"
|
||||
L["Descending"] = "Descending"
|
||||
L["Disabled"] = "Disabled"
|
||||
L["Disabled in %s"] = "Disabled in %s"
|
||||
L["Disable event discovery"] = "Disable event discovery"
|
||||
L["Disable OmniCC"] = "Disable OmniCC"
|
||||
L["Disables showing OmniCC timers in all Shadowed Unit Frame auras."] = "Disables showing OmniCC timers in all Shadowed Unit Frame auras."
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "Disables the unit frame from turning into a vehicle when the player enters one."
|
||||
L["Disable vehicle swap"] = "Disable vehicle swap"
|
||||
L["Disabling a module on this page disables it while inside %s. Do not disable a module here if you do not want this to happen!."] = "Disabling a module on this page disables it while inside %s. Do not disable a module here if you do not want this to happen!."
|
||||
L["Disabling unit modules in various instances."] = "Disabling unit modules in various instances."
|
||||
L["DND"] = "DND"
|
||||
L["DND:%s"] = "DND:%s"
|
||||
L["Documentation"] = "Documentation"
|
||||
L["Don't use a filter"] = "Don't use a filter"
|
||||
L["Down"] = "Down"
|
||||
L["Druid form"] = "Druid form"
|
||||
L["Druid form (Short)"] = "Druid form (Short)"
|
||||
L["Druid mana bar"] = "Druid mana bar"
|
||||
L["Due to the nature of fake units, cast bars for %s are not super efficient and can take at most 0.10 seconds to notice a change in cast."] = "Due to the nature of fake units, cast bars for %s are not super efficient and can take at most 0.10 seconds to notice a change in cast."
|
||||
L["Dungeon role"] = "Dungeon role"
|
||||
L["Edge size"] = "Edge size"
|
||||
L["Editing %s"] = "Editing %s"
|
||||
L["Edit tag"] = "Edit tag"
|
||||
L["Elite"] = "Elite"
|
||||
L["Empty bar"] = "Empty bar"
|
||||
L["Enable buffs"] = "Enable buffs"
|
||||
L["Enable debuffs"] = "Enable debuffs"
|
||||
L["Enabled in %s"] = "Enabled in %s"
|
||||
L["Enabled units"] = "Enabled units"
|
||||
L["Enable frequent updates"] = "Enable frequent updates"
|
||||
L["Enable indicator"] = "Enable indicator"
|
||||
L["Enable quick health"] = "Enable quick health"
|
||||
L["Enable quick power"] = "Enable quick power"
|
||||
L["Enable %s"] = "Enable %s"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "Enables configuration mode, letting you move and giving you example frames to setup."
|
||||
L["Enable temporary enchants"] = "Enable temporary enchants"
|
||||
L["Enable units"] = "Enable units"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."
|
||||
L["Energy"] = "Energy"
|
||||
L["Enlarge your auras"] = "Enlarge your auras"
|
||||
L["Error"] = "Error"
|
||||
L["Events"] = "Events"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "Events that should be used to trigger an update of this tag. Separate each event with a single space."
|
||||
L["Everywhere else"] = "Everywhere else"
|
||||
L["Export"] = "Export"
|
||||
L["F"] = "F"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "Fades out the unit frames of people who are not within range of you."
|
||||
L["Failed to import layout, error:|n|n%s"] = "Failed to import layout, error:|n|n%s"
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"
|
||||
L["Failed to save tag, error:|n %s"] = "Failed to save tag, error:|n %s"
|
||||
L["Female"] = "Female"
|
||||
L["Filtering both buffs and debuffs"] = "Filtering both buffs and debuffs"
|
||||
L["Filtering buffs only"] = "Filtering buffs only"
|
||||
L["Filtering debuffs only"] = "Filtering debuffs only"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "Filter out any auras that you cannot cast on another player, or yourself."
|
||||
L["Filter out any auras that you did not cast yourself."] = "Filter out any auras that you did not cast yourself."
|
||||
L["Filter out any aura that you cannot cure."] = "Filter out any aura that you cannot cure."
|
||||
L["Filter type"] = "Filter type"
|
||||
L["Finished cast"] = "Finished cast"
|
||||
L["Flags the tag for frequent updating, it will update the tag on a timer regardless of any events firing."] = "Flags the tag for frequent updating, it will update the tag on a timer regardless of any events firing."
|
||||
L["Flight"] = "Flight"
|
||||
L["Flips coloring so the bar color is shown as the background color and the background as the bar"] = "Flips coloring so the bar color is shown as the background color and the background as the bar"
|
||||
L["Focus"] = "Focus"
|
||||
L["Focus Target"] = "Focus Target"
|
||||
L["Font"] = "Font"
|
||||
L["Forces a static color to be used for the background of all bars"] = "Forces a static color to be used for the background of all bars"
|
||||
L["For target/focus"] = "For target/focus"
|
||||
L["Frame"] = "Frame"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "Frame alpha when you are out of combat while having no target and 100% mana or energy."
|
||||
L["Frame alpha while this unit is in combat."] = "Frame alpha while this unit is in combat."
|
||||
L["Frames"] = "Frames"
|
||||
L["Friendly"] = "Friendly"
|
||||
L["Friendly spell"] = "Friendly spell"
|
||||
L["Fuel"] = "Fuel"
|
||||
L["Full size after"] = "Full size after"
|
||||
L["Full size before"] = "Full size before"
|
||||
L["General"] = "General"
|
||||
L["General configuration to all enabled units."] = "General configuration to all enabled units."
|
||||
L["General threat situation"] = "General threat situation"
|
||||
L["Ghost"] = "Ghost"
|
||||
L["Global"] = "Global"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"
|
||||
L["Group by"] = "Group by"
|
||||
L["Group %d"] = "Group %d"
|
||||
L["Group number"] = "Group number"
|
||||
L["Group row spacing"] = "Group row spacing"
|
||||
L["Groups"] = "Groups"
|
||||
L["Groups per row"] = "Groups per row"
|
||||
L["Groups to show"] = "Groups to show"
|
||||
L["Growth"] = "Growth"
|
||||
L["Guardian bar"] = "Guardian bar"
|
||||
L["Guild name"] = "Guild name"
|
||||
L["Half health"] = "Half health"
|
||||
L["Happiness"] = "Happiness"
|
||||
L["Health"] = "Health"
|
||||
L["Health bar"] = "Health bar"
|
||||
L["Health bar color for friendly units."] = "Health bar color for friendly units."
|
||||
L["Health bar color for hostile units."] = "Health bar color for hostile units."
|
||||
L["Health bar color for neutral units."] = "Health bar color for neutral units."
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "Health bar color to use for hostile units who you cannot attack, used for reaction coloring."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "Health bar color to use to show how much healing someone is about to receive."
|
||||
L["Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."] = "Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."
|
||||
L["Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."] = "Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."
|
||||
L["Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."] = "Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."
|
||||
L["Health color"] = "Health color"
|
||||
L["Health percent"] = "Health percent"
|
||||
L["Height"] = "Height"
|
||||
L["Help"] = "Help"
|
||||
L["Hide bar when empty"] = "Hide bar when empty"
|
||||
L["Hide Blizzard"] = "Hide Blizzard"
|
||||
L["Hide in 6-man raid"] = "Hide in 6-man raid"
|
||||
L["Hide in any raid"] = "Hide in any raid"
|
||||
L["Hide %s"] = "Hide %s"
|
||||
L["Hide %s frames"] = "Hide %s frames"
|
||||
L["Hides the cast bar if there is no cast active."] = "Hides the cast bar if there is no cast active."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "Hides the cooldown ring for any auras that you did not cast."
|
||||
L["Hide tooltips in combat"] = "Hide tooltips in combat"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "Hiding and showing various aspects of the default UI such as the player buff frames."
|
||||
L["High"] = "High"
|
||||
L["High health"] = "High health"
|
||||
L["Highlight"] = "Highlight"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "Highlight units that are debuffed with something you can cure."
|
||||
L["Highlight units that have aggro on any mob."] = "Highlight units that have aggro on any mob."
|
||||
L["Highlight units that you are targeting or have focused."] = "Highlight units that you are targeting or have focused."
|
||||
L["Highlight units when you mouse over them."] = "Highlight units when you mouse over them."
|
||||
L["Hostile"] = "Hostile"
|
||||
L["Hostile spell"] = "Hostile spell"
|
||||
L["How close the frame should clip with the border."] = "How close the frame should clip with the border."
|
||||
L["How far the background should be from the unit frame border."] = "How far the background should be from the unit frame border."
|
||||
L["How large the background should tile"] = "How large the background should tile"
|
||||
L["How large the edges should be."] = "How large the edges should be."
|
||||
L["How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."] = "How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."
|
||||
L["How many auras to show in a single row."] = "How many auras to show in a single row."
|
||||
L["How many groups should be shown per row."] = "How many groups should be shown per row."
|
||||
L["How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"] = "How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"
|
||||
L["How many rows total should be used, rows will be however long the per row value is set at."] = "How many rows total should be used, rows will be however long the per row value is set at."
|
||||
L["How many seconds between updates.|n[WARNING] By setting the frequency to 0 it will update every single frame redraw, if you want to disable frequent updating uncheck it don't set this to 0."] = "How many seconds between updates.|n[WARNING] By setting the frequency to 0 it will update every single frame redraw, if you want to disable frequent updating uncheck it don't set this to 0."
|
||||
L["How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."] = "How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."
|
||||
L["How much spacing should be between each new row of groups."] = "How much spacing should be between each new row of groups."
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."
|
||||
L["How much weight this should use when figuring out the total text width."] = "How much weight this should use when figuring out the total text width."
|
||||
L["How the frames should grow when a new column is added."] = "How the frames should grow when a new column is added."
|
||||
L["How the rows should grow when new group members are added."] = "How the rows should grow when new group members are added."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "How you want this aura to be anchored to the unit frame."
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "If the unit is a player then class is returned, if it's a NPC then the creature type."
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "If the unit is a player then race is returned, if it's a NPC then the creature type."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "If you casted the aura, then the buff icon will be increased in size to make it more visible."
|
||||
L["Import"] = "Import"
|
||||
L["Import non-standard module settings"] = "Import non-standard module settings"
|
||||
L["Import unit frame positions"] = "Import unit frame positions"
|
||||
L["Import visibility settings"] = "Import visibility settings"
|
||||
L["Inactive alpha"] = "Inactive alpha"
|
||||
L["Incoming heal"] = "Incoming heal"
|
||||
L["Incoming heal (Absolute)"] = "Incoming heal (Absolute)"
|
||||
L["Incoming heal/Name"] = "Incoming heal/Name"
|
||||
L["Incoming heals"] = "Incoming heals"
|
||||
L["Incoming heal (Short)"] = "Incoming heal (Short)"
|
||||
L["Index"] = "Index"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "Indicator for your pet's happiness, only applies to Hunters."
|
||||
L["Indicators"] = "Indicators"
|
||||
L["In range alpha"] = "In range alpha"
|
||||
L["Inset"] = "Inset"
|
||||
L["Inside Center"] = "Inside Center"
|
||||
L["Inside Center Left"] = "Inside Center Left"
|
||||
L["Inside Center Right"] = "Inside Center Right"
|
||||
L["Inside Top Left"] = "Inside Top Left"
|
||||
L["Inside Top Right"] = "Inside Top Right"
|
||||
L["Interrupted"] = "Interrupted"
|
||||
L["Invalid interval entered, must be a number."] = "Invalid interval entered, must be a number."
|
||||
L["Invalid spell \"%s\" entered."] = "Invalid spell \"%s\" entered."
|
||||
L["Invert colors"] = "Invert colors"
|
||||
L["Layout manager"] = "Layout manager"
|
||||
L["Leader"] = "Leader"
|
||||
L["Left"] = "Left"
|
||||
L["Left Bottom"] = "Left Bottom"
|
||||
L["Left Center"] = "Left Center"
|
||||
L["Left text"] = "Left text"
|
||||
L["Left Top"] = "Left Top"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "Let's you modify the base font size to either make it larger or smaller."
|
||||
L["Level"] = "Level"
|
||||
L["Level (Colored)"] = "Level (Colored)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "Level %s - %s: %s/%s (%.2f%% done)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "Level %s - %s: %s/%s (%.2f%% done), %s rested."
|
||||
L["Level without any coloring."] = "Level without any coloring."
|
||||
L["Light"] = "Light"
|
||||
L["Lock frames"] = "Lock frames"
|
||||
L["Locks the unit frame positionings hiding the mover boxes."] = "Locks the unit frame positionings hiding the mover boxes."
|
||||
L["Low health"] = "Low health"
|
||||
L["M"] = "M"
|
||||
L["Main Assist"] = "Main Assist"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."
|
||||
L["Main Assist Target"] = "Main Assist Target"
|
||||
L["Main Tank"] = "Main Tank"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."
|
||||
L["Main Tank Target"] = "Main Tank Target"
|
||||
L["Male"] = "Male"
|
||||
L["Mana"] = "Mana"
|
||||
L["Manage aura filters"] = "Manage aura filters"
|
||||
L["Management"] = "Management"
|
||||
L["Manual position"] = "Manual position"
|
||||
L["Master looter"] = "Master looter"
|
||||
L["Max columns"] = "Max columns"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."
|
||||
L["Max HP (Absolute)"] = "Max HP (Absolute)"
|
||||
L["Max HP (Short)"] = "Max HP (Short)"
|
||||
L["Max power (Absolute)"] = "Max power (Absolute)"
|
||||
L["Max power (Short)"] = "Max power (Short)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."
|
||||
L["Max rows"] = "Max rows"
|
||||
L["Medium"] = "Medium"
|
||||
L["Miscellaneous"] = "Miscellaneous"
|
||||
L["Missing HP (Short)"] = "Missing HP (Short)"
|
||||
L["Missing power (Short)"] = "Missing power (Short)"
|
||||
L["Moonkin"] = "Moonkin"
|
||||
L["Name"] = "Name"
|
||||
L["Name (Abbreviated)"] = "Name (Abbreviated)"
|
||||
L["Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."] = "Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."
|
||||
L["Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."] = "Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."
|
||||
L["Neutral"] = "Neutral"
|
||||
L["Never (Disabled)"] = "Never (Disabled)"
|
||||
L["New filter"] = "New filter"
|
||||
L["None"] = "None"
|
||||
L["NPCs only"] = "NPCs only"
|
||||
L["Offline"] = "Offline"
|
||||
L["Offline timer"] = "Offline timer"
|
||||
L["Off:%s"] = "Off:%s"
|
||||
L["On aggro"] = "On aggro"
|
||||
L["On curable debuff"] = "On curable debuff"
|
||||
L["On mouseover"] = "On mouseover"
|
||||
L["Order"] = "Order"
|
||||
L["Or you can set a position manually"] = "Or you can set a position manually"
|
||||
L["Outline"] = "Outline"
|
||||
L["Out of range alpha"] = "Out of range alpha"
|
||||
L["Outside bar limit"] = "Outside bar limit"
|
||||
L["Override color"] = "Override color"
|
||||
L["Party"] = "Party"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "Party frames are hidden while in any sort of raid no matter how many people."
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "Party frames are hidden while in a raid group with more than 5 people inside."
|
||||
L["Party instances"] = "Party instances"
|
||||
L["Party Pet"] = "Party Pet"
|
||||
L["Party Target"] = "Party Target"
|
||||
L["Percentage of width the portrait should use."] = "Percentage of width the portrait should use."
|
||||
L["Percentage value of how far outside the unit frame the incoming heal bar can go. 130% means it will go 30% outside the frame, 100% means it will not go outside."] = "Percentage value of how far outside the unit frame the incoming heal bar can go. 130% means it will go 30% outside the frame, 100% means it will not go outside."
|
||||
L["Percent HP"] = "Percent HP"
|
||||
L["Percent power"] = "Percent power"
|
||||
L["Per column"] = "Per column"
|
||||
L["Per row"] = "Per row"
|
||||
L["Pet"] = "Pet"
|
||||
L["Pet Target"] = "Pet Target"
|
||||
L["Player"] = "Player"
|
||||
L["player cast bar"] = "player cast bar"
|
||||
L["Players only"] = "Players only"
|
||||
L["Players will be colored by class, "] = "Players will be colored by class, "
|
||||
L["Player threat"] = "Player threat"
|
||||
L["Point"] = "Point"
|
||||
L["Portrait"] = "Portrait"
|
||||
L["Portrait type"] = "Portrait type"
|
||||
L["Position"] = "Position"
|
||||
L["Power"] = "Power"
|
||||
L["Power bar"] = "Power bar"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "Prevents unit tooltips from showing while in combat."
|
||||
L["Primary means of coloring the health bar, color on aggro and color by reaction will override this if necessary."] = "Primary means of coloring the health bar, color on aggro and color by reaction will override this if necessary."
|
||||
L["Prioritize buffs"] = "Prioritize buffs"
|
||||
L["Programming in Lua"] = "Programming in Lua"
|
||||
L["PvP Flag"] = "PvP Flag"
|
||||
L["PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."] = "PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "PVP timer"
|
||||
L["Race"] = "Race"
|
||||
L["Race (Smart)"] = "Race (Smart)"
|
||||
L["Rage"] = "Rage"
|
||||
L["Raid"] = "Raid"
|
||||
L["Raid assisting unit"] = "Raid assisting unit"
|
||||
L["Raid instances"] = "Raid instances"
|
||||
L["Raid pet"] = "Raid pet"
|
||||
L["Raid role"] = "Raid role"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."
|
||||
L["Raid target"] = "Raid target"
|
||||
L["Raid target indicator."] = "Raid target indicator."
|
||||
L["Raid targeting unit"] = "Raid targeting unit"
|
||||
L["Range indicator"] = "Range indicator"
|
||||
L["Range spells"] = "Range spells"
|
||||
L["Rank 1"] = "Rank 1"
|
||||
L["Rare"] = "Rare"
|
||||
L["Rare Elite"] = "Rare Elite"
|
||||
L["Rare indicator"] = "Rare indicator"
|
||||
L["Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."] = "Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."
|
||||
L["Reaction color tag"] = "Reaction color tag"
|
||||
L["Ready status"] = "Ready status"
|
||||
L["Ready status of group members."] = "Ready status of group members."
|
||||
L["Relative point"] = "Relative point"
|
||||
L["Resources"] = "Resources"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "Returns current health as a percentage, if the unit is dead or offline than that is shown instead."
|
||||
L["Returns current power as a percentage."] = "Returns current power as a percentage."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "Returns + if the unit is an elite or rare elite mob."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "Returns Rare if the unit is a rare or rare elite mob."
|
||||
L["Returns text based on the units general threat situation: Aggro for Aggro, High for being close to taking aggro, and Medium as a warning to be wary.|nThis cannot be used on target of target or focus target types of units."] = "Returns text based on the units general threat situation: Aggro for Aggro, High for being close to taking aggro, and Medium as a warning to be wary.|nThis cannot be used on target of target or focus target types of units."
|
||||
L["Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."] = "Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."
|
||||
L["Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."] = "Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."
|
||||
L["Returns the color code for the units threat situation in general: Red for Aggro, Orange for High threat and Yellow to watch out.|nThis cannot be used on target of target or focus target types of units."] = "Returns the color code for the units threat situation in general: Red for Aggro, Orange for High threat and Yellow to watch out.|nThis cannot be used on target of target or focus target types of units."
|
||||
L["Returns the scaled threat percentage for the unit, if you put this on a party member you would see the percentage of how close they are to getting any from any hostile mobs. Always 0 - 100%.|nThis cannot be used on target of target or focus target types of units."] = "Returns the scaled threat percentage for the unit, if you put this on a party member you would see the percentage of how close they are to getting any from any hostile mobs. Always 0 - 100%.|nThis cannot be used on target of target or focus target types of units."
|
||||
L["Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."] = "Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."
|
||||
L["Returns the units sex."] = "Returns the units sex."
|
||||
L["Right"] = "Right"
|
||||
L["Right Bottom"] = "Right Bottom"
|
||||
L["Right Center"] = "Right Center"
|
||||
L["Right text"] = "Right text"
|
||||
L["Right Top"] = "Right Top"
|
||||
L["Role the unit is playing in dungeons formed through the Looking For Dungeon system."] = "Role the unit is playing in dungeons formed through the Looking For Dungeon system."
|
||||
L["Row growth"] = "Row growth"
|
||||
L["Row offset"] = "Row offset"
|
||||
L["rune bar"] = "rune bar"
|
||||
L["Rune bar"] = "Rune bar"
|
||||
L["Runic Power"] = "Runic Power"
|
||||
L["Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."] = "Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."
|
||||
L["Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."] = "Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."
|
||||
L["Scale"] = "Scale"
|
||||
L["Scaled threat percent"] = "Scaled threat percent"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."
|
||||
L["Screen"] = "Screen"
|
||||
L["Search"] = "Search"
|
||||
L["Search tags"] = "Search tags"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."
|
||||
L["Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."] = "Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."
|
||||
L["Select the units that you want to modify, any settings changed will change every unit you selected. If you want to anchor or change raid/party unit specific settings you will need to do that through their options.|n|nShift click a unit to select all/unselect all."] = "Select the units that you want to modify, any settings changed will change every unit you selected. If you want to anchor or change raid/party unit specific settings you will need to do that through their options.|n|nShift click a unit to select all/unselect all."
|
||||
L["Self aura size"] = "Self aura size"
|
||||
L["Separate raid frames"] = "Separate raid frames"
|
||||
L["Set filter zones"] = "Set filter zones"
|
||||
L["Sex"] = "Sex"
|
||||
L["%s frames"] = "%s frames"
|
||||
L["Short classification"] = "Short classification"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."
|
||||
L["Short elite indicator"] = "Short elite indicator"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "Show a background behind the bars with the same texture/color but faded out."
|
||||
L["Show as bar"] = "Show as bar"
|
||||
L["Show background"] = "Show background"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "Show buffs before debuffs when sharing the same anchor point."
|
||||
L["Show castable on other auras only"] = "Show castable on other auras only"
|
||||
L["Show cast name"] = "Show cast name"
|
||||
L["Show cast rank"] = "Show cast rank"
|
||||
L["Show cast time"] = "Show cast time"
|
||||
L["Show curable only"] = "Show curable only"
|
||||
L["Show party as raid"] = "Show party as raid"
|
||||
L["Show player in party"] = "Show player in party"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "Shows AFK, DND or nothing depending on the units away status."
|
||||
L["Shows combat feedback, last healing the unit received, last hit did it miss, resist, dodged and so on."] = "Shows combat feedback, last healing the unit received, last hit did it miss, resist, dodged and so on."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."
|
||||
L["Shows current group number of the unit."] = "Shows current group number of the unit."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "Shows current health value in absolute form meaning 15000 health is shown as 15000."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "Shows current power value in absolute form, 15000 power will be displayed as 1500 still."
|
||||
L["Shows how long an unit has been AFK or DND."] = "Shows how long an unit has been AFK or DND."
|
||||
L["Shows how long an unit has been offline."] = "Shows how long an unit has been offline."
|
||||
L["Shows how long until your PVP flag drops, will not show if the flag is manually on or you are in a hostile zone.|n|nThis will only work for yourself, you cannot use it to see the time left on your party or raid."] = "Shows how long until your PVP flag drops, will not show if the flag is manually on or you are in a hostile zone.|n|nThis will only work for yourself, you cannot use it to see the time left on your party or raid."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "Shows maximum health in absolute form, 14000 health is showed as 14000 health."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "Shows maximum power in absolute form, 13000 power is showed as 13000 power."
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "Shows Offline, Dead, Ghost or nothing depending on the units current status."
|
||||
L["Show's the units guild name if they are in a guild."] = "Show's the units guild name if they are in a guild."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."
|
||||
L["Show your auras only"] = "Show your auras only"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "Simple aura filtering by whitelists and blacklists."
|
||||
L["Size"] = "Size"
|
||||
L["Smart level"] = "Smart level"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."
|
||||
L["%s member"] = "%s member"
|
||||
L["Sorting"] = "Sorting"
|
||||
L["Sort method"] = "Sort method"
|
||||
L["Sort order"] = "Sort order"
|
||||
L["Spacing"] = "Spacing"
|
||||
L["Spacing between each row"] = "Spacing between each row"
|
||||
L["Splits raid frames into individual frames for each raid group instead of one single frame.|nNOTE! You cannot drag each group frame individualy, but how they grow is set through the column and row growth options."] = "Splits raid frames into individual frames for each raid group instead of one single frame.|nNOTE! You cannot drag each group frame individualy, but how they grow is set through the column and row growth options."
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (%.2f%% done)"
|
||||
L["Static"] = "Static"
|
||||
L["Status"] = "Status"
|
||||
L["Status indicator, shows if the unit is currently in combat. For the player it will also show if you are rested."] = "Status indicator, shows if the unit is currently in combat. For the player it will also show if you are rested."
|
||||
L["Style of borders to show for all auras."] = "Style of borders to show for all auras."
|
||||
L["T"] = "T"
|
||||
L["Tag list"] = "Tag list"
|
||||
L["Tag name"] = "Tag name"
|
||||
L["Tags"] = "Tags"
|
||||
L["Tag that you will use to access this code, do not wrap it in brackets or parenthesis it's automatically done. For example, you would enter \"foobar\" and then access it with [foobar]."] = "Tag that you will use to access this code, do not wrap it in brackets or parenthesis it's automatically done. For example, you would enter \"foobar\" and then access it with [foobar]."
|
||||
L["Target"] = "Target"
|
||||
L["Target of Target"] = "Target of Target"
|
||||
L["Target of Target of Target"] = "Target of Target of Target"
|
||||
L["Temporary enchants"] = "Temporary enchants"
|
||||
L["Test Aura"] = "Test Aura"
|
||||
L["Test spell"] = "Test spell"
|
||||
L["Text"] = "Text"
|
||||
L["Text management"] = "Text management"
|
||||
L["Text name"] = "Text name"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "Text name that you can use to identify this text from others when configuring."
|
||||
L["Text parent"] = "Text parent"
|
||||
L["Text/Tags"] = "Text/Tags"
|
||||
L["The blacklist \"%s\" already exists."] = "The blacklist \"%s\" already exists."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "The check boxes below will allow you to enable or disable units."
|
||||
L["The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."] = "The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."
|
||||
L["The tag \"%s\" already exists."] = "The tag \"%s\" already exists."
|
||||
L["The unit frames you see are examples, they are not perfect and do not show all the data they normally would.|n|nYou can hide them by locking them through /shadowuf or clicking the button below."] = "The unit frames you see are examples, they are not perfect and do not show all the data they normally would.|n|nYou can hide them by locking them through /shadowuf or clicking the button below."
|
||||
L["The whitelist \"%s\" already exists."] = "The whitelist \"%s\" already exists."
|
||||
L["Thick outline"] = "Thick outline"
|
||||
L["Thin outline"] = "Thin outline"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "This filter has no auras in it, you will have to add some using the dialog above."
|
||||
L["This filter has no aura types set to filter out."] = "This filter has no aura types set to filter out."
|
||||
L["This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."] = "This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "This unit depends on another to work, disabling %s will disable %s."
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "This unit has child units that depend on it, you need to enable this unit before you can enable its children."
|
||||
L["This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."] = "This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."
|
||||
L["This will override all background colorings for bars including custom set ones."] = "This will override all background colorings for bars including custom set ones."
|
||||
L["Threat"] = "Threat"
|
||||
L["Threat situation"] = "Threat situation"
|
||||
L["Tile size"] = "Tile size"
|
||||
L["Timers for self auras only"] = "Timers for self auras only"
|
||||
L["Top"] = "Top"
|
||||
L["Top Center"] = "Top Center"
|
||||
L["Top Left"] = "Top Left"
|
||||
L["Top Right"] = "Top Right"
|
||||
L["Total number of combo points you have on your target."] = "Total number of combo points you have on your target."
|
||||
L["Totem bar"] = "Totem bar"
|
||||
L["Travel"] = "Travel"
|
||||
L["Tree"] = "Tree"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "Turns fast updating of the power bar on giving you more up to date power information than normal."
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "Turns on fast updating of health bars giving you more up to date health info."
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "Turns this widget into a bar that can be resized and ordered just like health and power bars."
|
||||
L["Unattackable hostile"] = "Unattackable hostile"
|
||||
L["Unit color code on aggro"] = "Unit color code on aggro"
|
||||
L["Unit colored situation"] = "Unit colored situation"
|
||||
L["Unit configuration"] = "Unit configuration"
|
||||
L["Unit faction"] = "Unit faction"
|
||||
L["Unit name"] = "Unit name"
|
||||
L["Unit name (Class colored)"] = "Unit name (Class colored)"
|
||||
L["Unit name colored by class."] = "Unit name colored by class."
|
||||
L["Units"] = "Units"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."
|
||||
L["Unit scaled threat"] = "Unit scaled threat"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."
|
||||
L["Unit server"] = "Unit server"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "Unit server, if they are from your server then nothing is shown."
|
||||
L["Unit situation name"] = "Unit situation name"
|
||||
L["Units per column"] = "Units per column"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."
|
||||
L["Unlink frames"] = "Unlink frames"
|
||||
L["Up"] = "Up"
|
||||
L["Update interval"] = "Update interval"
|
||||
L["Using unit settings"] = "Using unit settings"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "Various units can be enabled through this page, such as raid or party targets."
|
||||
L["Vehicle"] = "Vehicle"
|
||||
L["Vehicles"] = "Vehicles"
|
||||
L["View"] = "View"
|
||||
L["Visibility"] = "Visibility"
|
||||
L["WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."] = "WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."
|
||||
L["When this filter is active, apply the filter to buffs."] = "When this filter is active, apply the filter to buffs."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "When this filter is active, apply the filter to debuffs."
|
||||
L["When to color the empty bar by reaction, overriding the default color by option."] = "When to color the empty bar by reaction, overriding the default color by option."
|
||||
L["When to color the health bar by the units reaction, overriding the color health by option."] = "When to color the health bar by the units reaction, overriding the color health by option."
|
||||
L["Where inside the frame the text should be anchored to."] = "Where inside the frame the text should be anchored to."
|
||||
L["Where to anchor the cast name text."] = "Where to anchor the cast name text."
|
||||
L["Where to anchor the cast time text."] = "Where to anchor the cast time text."
|
||||
L["Whitelist"] = "Whitelist"
|
||||
L["Whitelist filters"] = "Whitelist filters"
|
||||
L["Whitelists"] = "Whitelists"
|
||||
L["Whitelists will hide any aura not in the filter group.|nBlacklists will hide auras that are in the filter group."] = "Whitelists will hide any aura not in the filter group.|nBlacklists will hide auras that are in the filter group."
|
||||
L["Widget size"] = "Widget size"
|
||||
L["Width"] = "Width"
|
||||
L["Width percent"] = "Width percent"
|
||||
L["Width weight"] = "Width weight"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "Will not import settings of modules that are not included with Shadowed Unit Frames by default."
|
||||
L["Wondering what all of the tabs for the unit configuration mean? Here's some information:|n|n|cfffed000General:|r Portrait, range checker, combat fader, border highlighting|n|cfffed000Frame:|r Unit positioning and frame anchoring|n|cfffed000Bars:|r Health, power, empty and cast bar, and combo point configuration|n|cfffed000Widget size:|r All bar and portrait sizing and ordering options|n|cfffed000Auras:|r All aura configuration for enabling/disabling/enlarging self/etc|n|cfffed000Indicators:|r All indicator configuration|n|cfffed000Text/Tags:|r Tag management as well as text positioning and width settings.|n|n|n*** Frequently looked for options ***|n|n|cfffed000Raid frames by group|r - Unit configuration -> Raid -> Raid -> Separate raid frames|n|cfffed000Class coloring:|r Bars -> Color health by|n|cfffed000Timers on auras:|r You need OmniCC for that|n|cfffed000Showing/Hiding default buff frames:|r Hide Blizzard -> Hide buff frames|n|cfffed000Percentage HP/MP text:|r Tags/Text tab, use the [percenthp] or [percentpp] tags|n|cfffed000Hiding party based on raid|r - Unit configuration -> Party -> Party -> Hide in 6-man raid/Hide in any raid"] = "Wondering what all of the tabs for the unit configuration mean? Here's some information:|n|n|cfffed000General:|r Portrait, range checker, combat fader, border highlighting|n|cfffed000Frame:|r Unit positioning and frame anchoring|n|cfffed000Bars:|r Health, power, empty and cast bar, and combo point configuration|n|cfffed000Widget size:|r All bar and portrait sizing and ordering options|n|cfffed000Auras:|r All aura configuration for enabling/disabling/enlarging self/etc|n|cfffed000Indicators:|r All indicator configuration|n|cfffed000Text/Tags:|r Tag management as well as text positioning and width settings.|n|n|n*** Frequently looked for options ***|n|n|cfffed000Raid frames by group|r - Unit configuration -> Raid -> Raid -> Separate raid frames|n|cfffed000Class coloring:|r Bars -> Color health by|n|cfffed000Timers on auras:|r You need OmniCC for that|n|cfffed000Showing/Hiding default buff frames:|r Hide Blizzard -> Hide buff frames|n|cfffed000Percentage HP/MP text:|r Tags/Text tab, use the [percenthp] or [percentpp] tags|n|cfffed000Hiding party based on raid|r - Unit configuration -> Party -> Party -> Hide in 6-man raid/Hide in any raid"
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "Works the same as %s, but this is only shown if the unit is in Cat or Bear form."
|
||||
L["WoW Programming"] = "WoW Programming"
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WoW Programming is a good resource for finding out what difference API's do and how to call them."
|
||||
L["X Offset"] = "X Offset"
|
||||
L["XP/Rep bar"] = "XP/Rep bar"
|
||||
L["Y Offset"] = "Y Offset"
|
||||
L["You can add additional text with tags enabled using this configuration, note that any additional text added (or removed) effects all units, removing text will reset their settings as well.|n|nKeep in mind, you cannot delete the default text included with the units."] = "You can add additional text with tags enabled using this configuration, note that any additional text added (or removed) effects all units, removing text will reset their settings as well.|n|nKeep in mind, you cannot delete the default text included with the units."
|
||||
L["You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."] = "You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "You can find more information on creating your own custom tags in the \"Help\" tab above."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above.|nSUF will attempt to automatically detect what events your tag will need, so you do not generally need to fill out the events field."] = "You can find more information on creating your own custom tags in the \"Help\" tab above.|nSUF will attempt to automatically detect what events your tag will need, so you do not generally need to fill out the events field."
|
||||
L["You can import another Shadowed Unit Frame users configuration by entering the export code they gave you below. This will backup your old layout to \"Import Backup\".|n|nIt will take 30-60 seconds for it to load your layout when you paste it in, please by patient."] = "You can import another Shadowed Unit Frame users configuration by entering the export code they gave you below. This will backup your old layout to \"Import Backup\".|n|nIt will take 30-60 seconds for it to load your layout when you paste it in, please by patient."
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "You must enter a number that is 0 or higher, negative numbers are not allowed."
|
||||
L["You must enter a tag name."] = "You must enter a tag name."
|
||||
L["You must wrap your code in a function."] = "You must wrap your code in a function."
|
||||
L["Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."] = "Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."
|
||||
L["Your code must be wrapped in a function, for example, if you were to make a tag to return the units name you would do:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"] = "Your code must be wrapped in a function, for example, if you were to make a tag to return the units name you would do:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "You will need to create an aura filter before you can set which unit to enable aura filtering on."
|
||||
L["You will need to do a /console reloadui before a hidden frame becomes visible again.|nPlayer and other unit frames are automatically hidden depending on if you enable the unit in Shadowed Unit Frames."] = "You will need to do a /console reloadui before a hidden frame becomes visible again.|nPlayer and other unit frames are automatically hidden depending on if you enable the unit in Shadowed Unit Frames."
|
||||
L["Zone configuration"] = "Zone configuration"
|
||||
|
||||
|
||||
ShadowUF.L = L
|
||||
--[===[@debug@
|
||||
ShadowUF.L = setmetatable(ShadowUF.L, {
|
||||
__index = function(tbl, value)
|
||||
rawset(tbl, value, value)
|
||||
return value
|
||||
end,
|
||||
})
|
||||
--@end-debug@]===]
|
||||
@@ -0,0 +1,5 @@
|
||||
if( GetLocale() ~= "esES" ) then return end
|
||||
local L = {}
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,5 @@
|
||||
if( GetLocale() ~= "esMX" ) then return end
|
||||
local L = {}
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,541 @@
|
||||
if( GetLocale() ~= "frFR" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "Raccourci les noms d'unité de plus de 10 caractères. Par exemple, \"Champion sombre-rune\" devient \"C. sombre-rune\" (les premiers mots sont raccourcis de la même façon qu'ils le sont en anglais)"
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "Valeur absolue des soins entrants. Si un soin à 10 000 arrive, 10 000 sera affiché."
|
||||
L["Add"] = "Ajouter"
|
||||
L["Add new tag"] = "Ajout de nouveaux tags"
|
||||
L["Add new text"] = "Ajout d'un nouveau texte"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "Ajoute une barre indiquant combien de temps il reste à vivre à votre goules. Utilisée uniquement si votre goule n'est pas permanente."
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "Ajoute une barre à l'intérieur de la barre de vie indiquant combien de soins quelqu'un va probablement recevoir."
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "Ajoute une barre vide dans laquelle vous pouvez placer du texte afin de soulager les autres barres."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "Ajoute une autre barre de mana au cadre du joueur quand vous êtes en forme d'ours ou de félin."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "Ajoute une barre des runes avec les minuteurs de recharge des runes au cadre du joueur."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "Ajoute %t dans la liste des unités à modifier quand vous effectuez des changements dans cet onglet."
|
||||
L["Adds temporary enchants to the buffs for the player."] = "Ajoute les enchantements temporaires aux buffs du joueur."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "Ajoute une barre des totems avec les minuteurs des expirations des totems au cadre du joueur."
|
||||
L["Add tags"] = "Ajout de tags"
|
||||
L["Advanced"] = "Avancé"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "Gestion avancée des tags, permettant d'ajouter vos propres tags."
|
||||
L["AFK"] = "ABS"
|
||||
L["AFK:%s"] = "ABS:%s"
|
||||
L["AFK status"] = "Statut ABS" -- Needs review
|
||||
L["AFK timer"] = "Minuteur ABS"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "Une fois que vous avez appuyé sur Exporter, vous pouvez donner le code ci-dessous aux autres utilisateurs de Shadowed Unit Frames et ils obtiendront exactement votre disposition."
|
||||
L["Aggro"] = "Aggro"
|
||||
L["Alpha to use for bar backgrounds."] = "Définit la transparence à utiliser pour les arrières-plan des barres."
|
||||
L["Ammo"] = "Munitions"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "Quantité de vie manquante. Si nul, rien n'est affiché. Utilise un format court : -18 500 est remplacé par -18.5k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "Quantité de puissance manquante. Si nul, rien n'est affiché. Utilise un format court : -13 850 est remplacé par 13.8k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Anchor point"] = "Point d'ancrage"
|
||||
L["Anchor to"] = "Ancrer à"
|
||||
L["Anchor to another frame"] = "Ancrer à un autre cadre"
|
||||
L["Anchor to buffs"] = "Ancrer aux buffs"
|
||||
L["Anchor to debuffs"] = "Ancrer aux debuffs"
|
||||
L["Aquatic"] = "Aquatique"
|
||||
L["Arena"] = "Arène"
|
||||
L["Arena Pet"] = "Fam. d'arène"
|
||||
L["Arenas"] = "Arènes"
|
||||
L["Arena Target"] = "Cibles d'arène"
|
||||
L["Are you sure you want to delete this filter?"] = "Êtes-vous sûr de vouloir supprimer ce filtre ?"
|
||||
L["Are you sure you want to delete this tag?"] = "Êtes-vous sûr de vouloir supprimer ce tag ?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "Êtes-vous sûr de vouloir supprimer ce texte ? Tous les paramètres seront supprimés."
|
||||
L["Ascending"] = "Ascendant"
|
||||
L["Aura border style"] = "Style de bordure des auras"
|
||||
L["Aura filters"] = "Filtres d'auras"
|
||||
L["Aura name"] = "Nom de l'aura"
|
||||
L["Auras"] = "Auras"
|
||||
L["Aura types to filter"] = "Types de filtre d'auras"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "Arrière-plan"
|
||||
L["Background alpha"] = "Transp. de l'arrière-plan"
|
||||
L["Background/border"] = "Arrière-plan/bordure"
|
||||
L["Background color"] = "Couleur d'arrière-plan"
|
||||
L["Bag indicator for master looters."] = "Sac-indicateur des maîtres du butin."
|
||||
L["Bars"] = "Barres"
|
||||
L["Bar spacing"] = "Espacement des barres"
|
||||
L["Bar texture"] = "Texture des barres"
|
||||
L["Battlegrounds"] = "Champs de bataille"
|
||||
L["Bear"] = "Ours"
|
||||
L["Blacklist"] = "Liste noire"
|
||||
L["Blacklist filters"] = "Filtres Liste noire"
|
||||
L["Blacklists"] = "Listes noires"
|
||||
L["Blizzard"] = "Blizzard"
|
||||
L["Border"] = "Bordure"
|
||||
L["Border alpha"] = "Transp. de la bordure"
|
||||
L["Border color"] = "Couleur de la bordure"
|
||||
L["Border highlighting"] = "Surbrillance de la bordure"
|
||||
L["Border thickness"] = "Épaisseur de la bordure"
|
||||
L["Boss"] = "Boss"
|
||||
L["Boss Target"] = "Cible des boss"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "Les unités boss ne sont utilisées que dans certains combats, tels que les princes de sang ou la bataille des canonnières. Vous ne les verrez pas à chaque rencontre de boss."
|
||||
L["Both"] = "Les deux"
|
||||
L["Bottom"] = "En bas"
|
||||
L["Bottom Center"] = "En bas au centre"
|
||||
L["Bottom Left"] = "En bas à gauche"
|
||||
L["Bottom Right"] = "En bas à droite"
|
||||
L["buff frames"] = "cadres des buffs"
|
||||
L["Buffs"] = "Buffs"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "Impossible de trouver un profil nommé \"%s\"."
|
||||
L["Cast"] = "Incantation"
|
||||
L["Cast bar"] = "Barre d'incantation"
|
||||
L["Cast icon"] = "Icône d'incantation"
|
||||
L["Casting"] = "Incantation"
|
||||
L["Cast interrupted"] = "Incantation interrompue"
|
||||
L["Cast name"] = "Nom d'incantation"
|
||||
L["Cast time"] = "Durée d'incantation"
|
||||
L["Cast uninterruptible"] = "Incantation non-interruptible"
|
||||
L["Cat"] = "Félin"
|
||||
L["Category"] = "Catégorie"
|
||||
L["Center"] = "Centre"
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "Change la couleur de la barre de vie vers la couleur d'hostilité définie (rouge par défaut) quand l'unité prend l'aggro."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "Change ce widget en barre. Vous pourrez changer la hauteur et l'ordre de la même façon que pour les barres de vie et de puissance."
|
||||
L["Channelling"] = "Canalisation"
|
||||
L["Child units cannot be dragged, you will have to reposition them through /shadowuf."] = "Child units cannot be dragged, you will have to reposition them through /shadowuf."
|
||||
L["Class"] = "Classe"
|
||||
L["Classes"] = "Classes"
|
||||
L["Class icon"] = "Icône de classe"
|
||||
L["Classificaiton"] = "Classification"
|
||||
L["Classifications"] = "Classifications"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "Nom de la classe sans coloration. Utilisez [classcolor][class][close] si vous souhaitez que le nom de la classe soit coloré selon la classe."
|
||||
L["Class (Smart)"] = "Classe (intelligent)"
|
||||
L["Code"] = "Code"
|
||||
L["Color by class"] = "Colorer selon la classe"
|
||||
L["Color by happiness"] = "Colorer selon l'humeur"
|
||||
L["Color by reaction on"] = "Colorer selon la réaction pour"
|
||||
L["Color health by"] = "Colorer la vie par"
|
||||
L["Color on aggro"] = "Colorer à l'aggro"
|
||||
L["Colors"] = "Couleurs"
|
||||
L["Colors the health bar by how happy your pet is."] = "Colore la barre de vie selon l'humeur de votre familier."
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "Couleur à utiliser pour les barres de vie définies pour être colorées par une couleur statique."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "Couleur utilisée quand une incantation ne peut être interrompue. Utilisé uniquement pour les monstres."
|
||||
L["Color used when a cast is a channel."] = "Couleur utilisée quand une incantation est canalisée."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "Couleur utilisée quand une incantation est interrompue soit par l'incantateur lui-même, soit par une autre unité."
|
||||
L["Color used when a cast is successfully finished."] = "Couleur utilisée quand une incantation s'est terminée avec succès."
|
||||
L["Color used when an unit is casting a spell."] = "Couleur utilisée quand une unité est en train d'incanter un sort."
|
||||
L["Column growth"] = "Sens d'ajout des colonnes"
|
||||
L["Column spacing"] = "Espacement des colonnes"
|
||||
L["Combat alpha"] = "Transp. en combat"
|
||||
L["Combat status"] = "Statut du combat"
|
||||
L["Combat text"] = "Texte de combat"
|
||||
L["Combo points"] = "Points de combo"
|
||||
L["Create"] = "Créer"
|
||||
L["Creature type"] = "Type de créature"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "Type de la créature. Renvoie Gangregarde si l'unité est un gangregarde, Loup si c'est un loup, etc."
|
||||
L["Crown indicator for group leaders."] = "Indicateur en forme de couronne pour les chefs de groupe."
|
||||
L["Cur/Max HP (Absolute)"] = "Vie actu./max. (absolue)"
|
||||
L["Cur/Max HP (Short)"] = "Vie actu./max. (courte)"
|
||||
L["Cur/Max HP (Smart)"] = "Vie actu./max. (intelligent)"
|
||||
L["Cur/Max power (Absolute)"] = "Puissance actu./max. (absolue)"
|
||||
L["Cur/Max power (Druid)"] = "Puissance actu./max. (druide)"
|
||||
L["Cur/Max Power (Short)"] = "Puissance actu./max. (courte)"
|
||||
L["Cur/Max PP (Smart)"] = "Puissance actu./max. (intelligent)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "Vie actuelle et maximale, sous la forme [curhp]/[maxhp]. Si l'unité est morte ou hors ligne, ces derniers sont affichés à la place."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "Puissance actuelle et maximale, sous la forme [curpp]/[maxpp]."
|
||||
L["Current health (Druid/Absolute)"] = "Vie actuelle (druide/absolue)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "Vie actuelle dans un format court : 11 500 est remplacé par 11.5k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Current HP (Absolute)"] = "Vie actuelle (absolue)"
|
||||
L["Current HP (Short)"] = "Vie actuelle (court)"
|
||||
L["Current power (Absolute)"] = "Puissance actuelle (absolue)"
|
||||
L["Current power (Druid)"] = "Puissance actuelle (druide)"
|
||||
L["Current power (Druid/Absolute)"] = "Puissance actuelle (druide/absolue)"
|
||||
L["Current Power (Short)"] = "Puissance actuelle (court)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "Puissance actuelle dans un format court : 12 750 est remplacé par 12.7k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Dark"] = "Sombre"
|
||||
L["Dead"] = "Mort"
|
||||
L["Debuffs"] = "Debuffs"
|
||||
L["Default color"] = "Couleur par défaut"
|
||||
L["Deficit/Unit Name"] = "Déficit/Nom de l'unité"
|
||||
L["Delete"] = "Supprimer"
|
||||
L["Descending"] = "Descendant"
|
||||
L["Disabled"] = "Désactivé"
|
||||
L["Disabled in %s"] = "Désactivé en %s"
|
||||
L["Disable OmniCC"] = "Désactiver OmniCC"
|
||||
L["Disables showing OmniCC timers in all Shadowed Unit Frame auras."] = "Désactive l'affichage des minuteurs OmniCC de toutes les auras de Shadowed Unit Frames."
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "Empêche le cadre d'unité de se transformer en véhicule quand le joueur entre dans l'un d'eux."
|
||||
L["DND"] = "NPD"
|
||||
L["DND:%s"] = "NPD:%s"
|
||||
L["Documentation"] = "Documentation"
|
||||
L["Druid form"] = "Forme druidique"
|
||||
L["Druid form (Short)"] = "Forme druidique (court)"
|
||||
L["Druid mana bar"] = "Barre de mana druidique"
|
||||
L["Due to the nature of fake units, cast bars for %s are not super efficient and can take at most 0.10 seconds to notice a change in cast."] = "Étant donnée la nature des fausses unités, les barres d'incantation |2 %s ne sont pas très efficaces et un délai d'au plus 0,10 seconde est nécessaire pour repérer un changement dans l'incantation."
|
||||
L["Dungeon role"] = "Rôle de donjon"
|
||||
L["Elite"] = "Élite"
|
||||
L["Empty bar"] = "Barre vide"
|
||||
L["Enable buffs"] = "Activer les buffs"
|
||||
L["Enable debuffs"] = "Activer les debuffs"
|
||||
L["Enabled in %s"] = "Activé en %s"
|
||||
L["Enabled units"] = "Unités activées"
|
||||
L["Enable frequent updates"] = "Activer les m. à j. fréquentes"
|
||||
L["Enable indicator"] = "Activer l'indicateur"
|
||||
L["Enable %s"] = "Activer %s"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "Active le mode de configuration, vous permettant de déplacer les cadres et donnant également des cadres d'exemple à paramétrer."
|
||||
L["Enable temporary enchants"] = "Activer les enchant. temporaires"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "L'activation des paramètres avancés vous donnera accès à plus d'options de configuration. Conseillé pour les gens qui souhaitent peaufiner la moindre petite chose."
|
||||
L["Energy"] = "Énergie"
|
||||
L["Enlarge your auras"] = "Agrandir vos auras"
|
||||
L["Error"] = "Erreur"
|
||||
L["Events"] = "Événements"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "Les événements qui doivent être utilisées pour déclencher une mise à jour de ce tag. Séparez chaque événement par une espace."
|
||||
L["Everywhere else"] = "Partout ailleurs"
|
||||
L["Export"] = "Exporter"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "Estompe les cadres d'unité des gens qui ne sont pas à votre portée."
|
||||
L["Failed to import layout, error:|n|n%s"] = "Échec de l'importation de la disposition, erreur : |n|n%s"
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "Échec du chargement de ShadowedUF_Options car impossible de charger la configuration. Erreur renvoyée : %s"
|
||||
L["Failed to save tag, error:|n %s"] = "Échec de la sauvegarde du tag, erreur : |n %s"
|
||||
L["Female"] = "Femme"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "N'affiche pas les auras que vous ne pouvez pas incanter sur les autres joueurs ou sur vous-même."
|
||||
L["Filter out any auras that you did not cast yourself."] = "N'affiche pas les auras que vous n'avez pas incanté vous-même."
|
||||
L["Filter out any aura that you cannot cure."] = "N'affiche pas les auras que vous ne pouvez pas guérir."
|
||||
L["Finished cast"] = "Incantation terminée"
|
||||
L["Flight"] = "Vol"
|
||||
L["Focus"] = "Focalisation"
|
||||
L["Focus Target"] = "Cible de la focalisation"
|
||||
L["Font"] = "Police d'écriture"
|
||||
L["Forces a static color to be used for the background of all bars"] = "Force l'utilisation d'une couleur statique pour l'arrière-plan de toutes les barres."
|
||||
L["Frame"] = "Cadre"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "Définit la transparence du cadre quand vous êtes hors combat, tout en ayant aucune cible et 100% de mana ou d'énergie."
|
||||
L["Frame alpha while this unit is in combat."] = "Définit la transparence du cadre quand cette unité est en combat."
|
||||
L["Frames"] = "Cadres"
|
||||
L["Friendly"] = "Amical"
|
||||
L["Friendly spell"] = "Sort bénéfique"
|
||||
L["Fuel"] = "Carburant"
|
||||
L["General"] = "Général"
|
||||
L["General configuration to all enabled units."] = "Configuration générale de toutes les unités activées."
|
||||
L["General threat situation"] = "Situation générale de la menace"
|
||||
L["Ghost"] = "Fantôme"
|
||||
L["Global"] = "Global"
|
||||
L["Group by"] = "Grouper par"
|
||||
L["Group %d"] = "Groupe %d"
|
||||
L["Group number"] = "Numéro de groupe"
|
||||
L["Groups"] = "Groupes"
|
||||
L["Groups per row"] = "Groupes par rangée"
|
||||
L["Groups to show"] = "Groupes à afficher"
|
||||
L["Guardian bar"] = "Barre du gardien"
|
||||
L["Guild name"] = "Nom de guilde"
|
||||
L["Half health"] = "Mi-vie"
|
||||
L["Happiness"] = "Humeur"
|
||||
L["Health"] = "Vie"
|
||||
L["Health bar"] = "Barre de vie"
|
||||
L["Health bar color for friendly units."] = "La couleur de la barre de vie pour les unités amicales."
|
||||
L["Health bar color for hostile units."] = "La couleur de la barre de vie pour les unités hostiles."
|
||||
L["Health bar color for neutral units."] = "La couleur de la barre de vie pour les unités neutres."
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "La couleur de barre de vie à utiliser pour les unités hostiles que vous ne pouvez pas attaquer. Utilisée pour la coloration selon la réaction."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "La couleur de barre de vie à utiliser pour afficher combien de soins quelqu'un est sur le point de recevoir."
|
||||
L["Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."] = "La couleur de la barre de vie utilisée comme couleur de transition de 100% -> 0% sur les joueurs, ainsi que quand votre familier est un peu mécontent."
|
||||
L["Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."] = "La couleur de la barre de vie utilisée comme couleur de transition de 100% -> 50% sur les joueurs, ainsi que quand votre familier est heureux."
|
||||
L["Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."] = "La couleur de la barre de vie utilisée comme couleur de transition de 50% -> 0% sur les joueurs, ainsi que quand votre familier est mécontent."
|
||||
L["Health color"] = "Couleur de vie"
|
||||
L["Health percent"] = "Pourcentage de vie"
|
||||
L["Height"] = "Hauteur"
|
||||
L["Help"] = "Aide"
|
||||
L["Hide bar when empty"] = "Cacher barre si vide"
|
||||
L["Hide Blizzard"] = "Cacher Blizzard"
|
||||
L["Hide in any raid"] = "Cacher ds tous les raids"
|
||||
L["Hide %s"] = "Cacher %s"
|
||||
L["Hide %s frames"] = "Cacher les cadres |2 %s"
|
||||
L["Hides the cast bar if there is no cast active."] = "Cache la barre d'incantation si aucune incantation n'est en cours."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "Cache la spirale de temps de recharge sur toutes les auras que vous n'avez pas lancées."
|
||||
L["Hide tooltips in combat"] = "Cacher bulles en combat"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "Masquage et affichage de divers aspects de l'IU par défaut tel que les cadres des buffs du joueur."
|
||||
L["High health"] = "Vie élevée"
|
||||
L["Highlight"] = "Surbrillance"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "Met en surbrillance les unités qui sont affectées par quelque chose que vous pouvez enlever."
|
||||
L["Highlight units that have aggro on any mob."] = "Met en surbrillance les unités qui ont l'attention d'un monstre."
|
||||
L["Highlight units that you are targeting or have focused."] = "Met en surbrillance les unités que vous avez en cible ou en focalisation."
|
||||
L["Highlight units when you mouse over them."] = "Met en surbrillance les unités que vous survolez avec la souris."
|
||||
L["Hostile"] = "Hostile"
|
||||
L["Hostile spell"] = "Sort hostile"
|
||||
L["How far the background should be from the unit frame border."] = "La distance à laquelle l'arrière-plan doit se trouver par rapport à la bordure du cadre d'unité."
|
||||
L["How many auras to show in a single row."] = "Le nombre d'auras à afficher dans une seule rangée."
|
||||
L["How many groups should be shown per row."] = "Définit le nombre de groupes à afficher par rangée."
|
||||
L["How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"] = "Nombre de joueurs qui soutiennent l'unité. Par exemple, si vous placez ceci sur vous même, cela affichera le nombre de joueurs qui ciblent votre cible. Vous êtes inclus dans le compte !"
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "Nombre de joueurs dans votre raid qui ciblent l'unité. Par exemple, si vous placez ceci sur vous même, cela affichera le nombre de joueurs qui vous ciblent. Vous êtes inclus dans le compte !"
|
||||
L["How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."] = "La partie de la hauteur totale du cadre cette barre doit utiliser. Il s'agit d'une valeur pondérée : plus elle est grande, plus la partie est importante."
|
||||
L["How much spacing should be between each new row of groups."] = "Définit l'espacement entre chaque rangée de groupe."
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "L'espacement entre toutes les barres d'un même cadre d'unité. Les valeurs négatives les éloignent les uns des autres, les valeurs positives les rapprochent. 0 pour n'avoir aucun espacement."
|
||||
L["How much weight this should use when figuring out the total text width."] = "Le poids de ceci lors de la détermination de la largeur totale du texte."
|
||||
L["How the frames should grow when a new column is added."] = "Définit la façon dont les cadres s'étendent quand une nouvelle colonne est ajoutée."
|
||||
L["How the rows should grow when new group members are added."] = "La façon dont les rangées doivent s'étendre quand de nouveaux groupes sont ajoutés."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "La façon dont vous souhaitez que cet aura soit ancré au cadre d'unité."
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "Si l'unité a des soins entrants, ceci affichera la valeur absolue des soins entrants. Le nom de l'unité sera affiché dans le cas contraire."
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "Si l'unité est un joueur, sa classe est renvoyée. S'il s'agit d'un PNJ, son type de créature est renvoyé."
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "Si l'unité est un joueur, sa race est renvoyée. S'il s'agit d'un PNJ, son type de créature est renvoyé."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "Si vous avez incanté l'aura, alors l'icône du buff en question aura une taille augmentée afin qu'elle soit plus visible."
|
||||
L["Import"] = "Importer"
|
||||
L["Inactive alpha"] = "Transp. qd inactif"
|
||||
L["Incoming heal"] = "Soin entrant"
|
||||
L["Incoming heal (Absolute)"] = "Soins entrants (absolu)"
|
||||
L["Incoming heals"] = "Soins entrants"
|
||||
L["Incoming heal (Short)"] = "Soins entrants (court)"
|
||||
L["Index"] = "Index"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "Indicateur de l'humeur de votre familier. Ne s'applique qu'aux chasseurs."
|
||||
L["Indicators"] = "Indicateurs"
|
||||
L["In range alpha"] = "Transp. si à portée"
|
||||
L["Interrupted"] = "Interrompu"
|
||||
L["Invalid interval entered, must be a number."] = "Intervalle entré invalide : doit être un nombre."
|
||||
L["Invalid spell \"%s\" entered."] = "Sort entré \"%s\" invalide."
|
||||
L["Layout manager"] = "Gestionnaire de disposition"
|
||||
L["Leader"] = "Chef"
|
||||
L["Left"] = "À gauche"
|
||||
L["Left Bottom"] = "À gauche en bas"
|
||||
L["Left Center"] = "À gauche au centre"
|
||||
L["Left text"] = "Texte de gauche"
|
||||
L["Left Top"] = "À gauche en haut"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "Vous permet de modifier la taille de police de base afin de la rendre plus grande ou plus petite."
|
||||
L["Level"] = "Niveau"
|
||||
L["Level (Colored)"] = "Niveau (coloré)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "Niveau %s - %s : %s/%s (%.2f%% terminé)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "Niveau %s - %s : %s/%s (%.2f%% terminé), %s reposé."
|
||||
L["Level without any coloring."] = "Le niveau sans aucune coloration."
|
||||
L["Lock frames"] = "Verr. cadres"
|
||||
L["Low health"] = "Vie faible"
|
||||
L["Main Assist"] = "Soutiens principaux"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "Les soutiens principaux sont définis par le système de soutien principal de Blizzard ou par les addons qui l'utilise tel que oRA3."
|
||||
L["Main Assist Target"] = "Cibles des soutiens principaux"
|
||||
L["Main Tank"] = "Tanks principaux"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "Les tanks principaux sont définis par le système de tank principal de Blizzard ou par les addons qui l'utilise tel que oRA3."
|
||||
L["Main Tank Target"] = "Cibles des tanks principaux"
|
||||
L["Male"] = "Homme"
|
||||
L["Mana"] = "Mana"
|
||||
L["Manual position"] = "Position manuelle"
|
||||
L["Master looter"] = "Maître du butin"
|
||||
L["Max columns"] = "Nbre max. de colonnes"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "Vie maximale dans un format court : 17 750 est remplacé par 17.7k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Max HP (Absolute)"] = "Vie max. (absolue)"
|
||||
L["Max HP (Short)"] = "Vie max. (court)"
|
||||
L["Max power (Absolute)"] = "Puissance max. (absolue)"
|
||||
L["Max power (Short)"] = "Puissance max. (court)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "Puissance maximale dans un format court : 17 750 remplacé par 17.7k, et les valeurs inférieures à 10 000 sont affichées telles qu'elles."
|
||||
L["Max rows"] = "Nbre max. de rangées"
|
||||
L["Medium"] = "Moyen"
|
||||
L["Miscellaneous"] = "Divers"
|
||||
L["Missing HP (Short)"] = "Vie manquante (court)"
|
||||
L["Missing power (Short)"] = "Puissance manquante (court)"
|
||||
L["Moonkin"] = "Sélénien"
|
||||
L["Name"] = "Nom"
|
||||
L["Name (Abbreviated)"] = "Nom (abbrévié)"
|
||||
L["Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."] = "Le nom d'un sort bénéfique à utiliser pour vérifier les portées des unités amicales.|n|nDéfinit automatiquement uniquement pour votre classe actuelle."
|
||||
L["Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."] = "Le nom d'un sort offensif à utiliser pour vérifier les portées des unités ennemies.|n|nDéfinit automatiquement uniquement pour votre classe actuelle."
|
||||
L["Neutral"] = "Neutre"
|
||||
L["Never (Disabled)"] = "Jamais (désactivé)"
|
||||
L["New filter"] = "Nouveau filtre"
|
||||
L["None"] = "Aucun"
|
||||
L["NPCs only"] = "PNJs uniquement"
|
||||
L["Offline"] = "Hors ligne"
|
||||
L["Off:%s"] = "Déco:%s"
|
||||
L["On aggro"] = "À l'aggro"
|
||||
L["On mouseover"] = "Au survol de la souris"
|
||||
L["Order"] = "Ordre"
|
||||
L["Or you can set a position manually"] = "Ou vous pouvez définir une position manuellement"
|
||||
L["Outline"] = "Contour"
|
||||
L["Out of range alpha"] = "Transp. si hors de portée"
|
||||
L["Party"] = "Groupe"
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "Cache les cadres du groupe quand vous vous trouvez dans un groupe de raid de plus de 5 personnes."
|
||||
L["Party instances"] = "Instances de groupe"
|
||||
L["Party Pet"] = "Fam. du groupe"
|
||||
L["Party Target"] = "Cibles du groupe"
|
||||
L["Percentage of width the portrait should use."] = "Définit le pourcentage de la largeur que le portrait doit utiliser."
|
||||
L["Percent HP"] = "Pourcentage de vie"
|
||||
L["Percent power"] = "Pourcentage de puissance"
|
||||
L["Per column"] = "Par colonne"
|
||||
L["Per row"] = "Par rangée"
|
||||
L["Pet"] = "Familier"
|
||||
L["Pet Target"] = "Cible du familier"
|
||||
L["Player"] = "Joueur"
|
||||
L["player cast bar"] = "barre d'incant. du joueur"
|
||||
L["Players only"] = "Joueurs uniquement"
|
||||
L["Player threat"] = "Menace du joueur"
|
||||
L["Point"] = "Point"
|
||||
L["Portrait"] = "Portrait"
|
||||
L["Portrait type"] = "Type de portrait"
|
||||
L["Position"] = "Position"
|
||||
L["Power"] = "Puissance"
|
||||
L["Power bar"] = "Barre de puissance"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "Empêche les bulles d'aide des unités de s'afficher quand vous êtes en combat."
|
||||
L["Prioritize buffs"] = "Priorité aux buffs"
|
||||
L["Programming in Lua"] = "Programmer en Lua"
|
||||
L["PvP Flag"] = "Marqueur JcJ"
|
||||
L["PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."] = "Indicateur de marque JcJ. Horde pour les joueurs de la Horde marqués et Alliance pour ceux de l'Alliance."
|
||||
L["PVP:%s"] = "JcJ:%s"
|
||||
L["PVP timer"] = "Minuteur JcJ"
|
||||
L["Race"] = "Race"
|
||||
L["Race (Smart)"] = "Race (intelligent)"
|
||||
L["Rage"] = "Rage"
|
||||
L["Raid"] = "Raid"
|
||||
L["Raid instances"] = "Instances de raid"
|
||||
L["Raid pet"] = "Fam. du raid"
|
||||
L["Raid role"] = "Rôle de raid"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "Indicateur de rôle de raid. Ajoute un bouclier pour les tanks principaux et une épée pour les soutiens principaux."
|
||||
L["Raid target"] = "Cible de raid"
|
||||
L["Raid target indicator."] = "Indicateur de cible de raid"
|
||||
L["Range indicator"] = "Indicateur de portée"
|
||||
L["Range spells"] = "Sorts de portée"
|
||||
L["Rank 1"] = "Rang 1"
|
||||
L["Rare"] = "Rare"
|
||||
L["Rare Elite"] = "Élite rare"
|
||||
L["Rare indicator"] = "Indicateur de rareté"
|
||||
L["Ready status"] = "Statut de l'appel"
|
||||
L["Ready status of group members."] = "Résultats de l'appel des membres du groupe."
|
||||
L["Relative point"] = "Point relatif"
|
||||
L["Resources"] = "Ressources"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "Renvoie un code de couleur indiquant indiquant votre niveau de menace avec votre cible : rouge pour Aggro, orange pour Menace élevée et jaune pour Prudence."
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "Renvoie un code de couleur indiquant votre niveau de menace envers toutes les unités : rouge pour Aggro, orange pour Menace élevée et jaune pour Prudence."
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "Renvoie un pourcentage pondéré de la menace envers votre cible actuelle compris entre 0 et 100%."
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "Renvoie la vie actuelle sous forme de pourcentage, sauf si l'unité est morte ou déconnectée."
|
||||
L["Returns current power as a percentage."] = "Renvoie la puissance actuelle sous forme de pourcentage."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "Renvoie + si l'unité est un monstre élite ou rare élite."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "Renvoie Rare si l'unité est un monstre rare ou rare élite."
|
||||
L["Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."] = "Renvoie un texte de indiquant votre niveau de menace envers toutes les unités : Aggro quand vous avez l'aggro, Élevé quand vous êtes sur le point de reprendre l'aggro et Moyen comme avertissement général."
|
||||
L["Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."] = "Renvoie un texte indiquant indiquant votre niveau de menace avec votre cible : Aggro quand vous avez l'aggro, Élevé quand vous êtes sur le point de reprendre l'aggro et Moyen comme avertissement général."
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "Renvoie un code de couleur basée sur la comparaison du niveau de l'unité par rapport à vous. Si vous ne pouvez pas l'attaquer, aucune code de couleur n'est renvoyé."
|
||||
L["Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."] = "Renvoie la forme actuelle de l'unité s'il s'agit d'un druide (chat, sélénien, etc.)."
|
||||
L["Returns the units sex."] = "Renvoie le sexe de l'unité."
|
||||
L["Right"] = "À droite"
|
||||
L["Right Bottom"] = "À droite en bas"
|
||||
L["Right Center"] = "À droite au centre"
|
||||
L["Right text"] = "Texte de droite"
|
||||
L["Right Top"] = "À droite en haut"
|
||||
L["Role the unit is playing in dungeons formed through the Looking For Dungeon system."] = "Le rôle que l'unité remplit dans le donjon dans un groupe formé via le système Donjons."
|
||||
L["Row growth"] = "Sens d'ajout des rangées"
|
||||
L["Row offset"] = "Décalage des rangées"
|
||||
L["rune bar"] = "barre des runes"
|
||||
L["Rune bar"] = "Barre des runes"
|
||||
L["Runic Power"] = "Puissance runique"
|
||||
L["Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."] = "Idem que [color:sit], à l'exception qu'il ne renvoie la couleur rouge que si vous avez l'aggro, au lieu d'effectuer la transition jaune -> orange -> rouge."
|
||||
L["Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."] = "Idem que [unit:color:sit], à l'exception qu'il ne renvoie la couleur rouge que si l'unité a l'aggro, au lieu d'effectuer la transition jaune -> orange-> rouge."
|
||||
L["Scale"] = "Échelle"
|
||||
L["Scaled threat percent"] = "Pourcentage de menace pondéré"
|
||||
L["Screen"] = "Écran"
|
||||
L["Search"] = "Rechercher"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "Parcourez la documentation ci-dessous pour obtenir des informations et des exemples sur la création de tags. Si vous souhaitez des informations basiques concernant Lua ou l'API de WoW, reportez-vous aux liens vers Programming in Lua et WoW Programming."
|
||||
L["Separate raid frames"] = "Séparer les cadres de raid"
|
||||
L["Sex"] = "Sexe"
|
||||
L["%s frames"] = "cadres |2 %s"
|
||||
L["Short classification"] = "Classification courte"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "Classification courte : R pour Rare, R+ pour Élite rare, + pour Élite, B pour Boss, et rien du tout si l'unité n'est rien de tout cela."
|
||||
L["Show as bar"] = "Afficher comme barre"
|
||||
L["Show background"] = "Aff. l'arrière-plan"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "Affiche les buffs avant les débuffs quand ces deux types d'auras partagent le même point d'ancrage."
|
||||
L["Show cast name"] = "Aff. nom de l'incant."
|
||||
L["Show cast rank"] = "Aff. rang de l'incant."
|
||||
L["Show cast time"] = "Aff. tps d'incantation"
|
||||
L["Show party as raid"] = "Aff. groupe comme raid"
|
||||
L["Show player in party"] = "Aff. joueur ds groupe"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "Affiche ABS, NPD ou rien du tout selon le statut de l'unité."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "Affiche la vie actuelle et maximale en valeur absolue."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "Affiche la puissance actuelle et maximale en valeur absolue."
|
||||
L["Shows current group number of the unit."] = "Affiche le numéro de groupe actuel de l'unité."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "Affiche les points de vie actuels de la vie en valeur absolue."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "Affiche les points de puissance actuels puissance en valeur absolue."
|
||||
L["Shows how long an unit has been AFK or DND."] = "Indique depuis combien de temps une unité est ABS ou en mode NPD."
|
||||
L["Shows how long an unit has been offline."] = "Affiche depuis combien de temps une unité est hors ligne."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "Affiche les points de vie maximaux en valeur absolue."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "Affiche les points de puissance maximaux en valeur absolue."
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "Affiche Hors-ligne, Mort, Fantôme ou rien du tout selon le statut de l'unité."
|
||||
L["Show's the units guild name if they are in a guild."] = "Affiche le nom de la guilde de l'unité si elle en a une."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "Affiche la vie de l'unité comme pourcentage arrondi à la première décimale."
|
||||
L["Show your auras only"] = "N'afficher que vos auras"
|
||||
L["Size"] = "Taille"
|
||||
L["Smart level"] = "Niveau intelligent"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "Niveau intelligent : renvoie Boss pour les boss, +50 pour un monstre élite de niveau 50 ou juste 80 pour un niveau 80."
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Affichage intelligent des nombres pour [curmaxhp]. Ceux inférieurs à 1 000 000 sont laissés tels quels, ceux supérieurs utiliseront la version courte du type 1m."
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "Affichage intelligent des nombres pour [curmaxpp]. Ceux inférieurs à 1 000 000 sont laissés tels quels, ceux supérieurs utiliseront la version courte du type 1m."
|
||||
L["%s member"] = "membre |2 %s"
|
||||
L["Sort method"] = "Méthode de tri"
|
||||
L["Sort order"] = "Ordre de tri"
|
||||
L["Spacing"] = "Espacement"
|
||||
L["Spacing between each row"] = "Espacement entre chaque rangée"
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s) : %s/%s (%.2f%% terminé)"
|
||||
L["Static"] = "Statique"
|
||||
L["Status"] = "Statut"
|
||||
L["Style of borders to show for all auras."] = "Le style des bordures à afficher pour toutes les auras."
|
||||
L["Tag list"] = "Liste des tags"
|
||||
L["Tag name"] = "Nom du tag"
|
||||
L["Tags"] = "Tags"
|
||||
L["Target"] = "Cible"
|
||||
L["Target of Target"] = "Cible de la cible"
|
||||
L["Target of Target of Target"] = "Cible de la cible de la cible"
|
||||
L["Temporary enchants"] = "Enchantements temporaires"
|
||||
L["Test Aura"] = "Aura de test"
|
||||
L["Test spell"] = "Sort de test"
|
||||
L["Text"] = "Texte"
|
||||
L["Text management"] = "Gestion du texte"
|
||||
L["Text name"] = "Nom du texte"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "Un nom de texte que vous pouvez utiliser pour identifier ce texte parmi d'autres lors de la configuration."
|
||||
L["Text parent"] = "Texte parent"
|
||||
L["Text/Tags"] = "Texte/Tags"
|
||||
L["The blacklist \"%s\" already exists."] = "La liste noire \"%s\" existe déjà."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "Les cases à cocher ci-dessous vous permettront d'activer ou de désactiver des unités."
|
||||
L["The tag \"%s\" already exists."] = "Le tag \"%s\" existe déjà."
|
||||
L["The whitelist \"%s\" already exists."] = "La liste blanche \"%s\" existe déjà."
|
||||
L["Thick outline"] = "Contour épais"
|
||||
L["Thin outline"] = "Contour mince"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "Cette barre se cachera automatiquement quand vous atteindrez le niveau maximal, ou si vous ne suivez aucune réputation."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "Ce filtre ne contient aucune aura. Ajoutez en au moins une ci-dessus."
|
||||
L["This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."] = "Il s'agit d'un bon guide sur la façon de s'initier à la programmation en Lua. Bien que vous ne devez pas tout lire, il est très utile pour comprendre les bases de la syntaxe et des APIs Lua."
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "Cette unité dépend d'une autre pour fonctionner : désactiver %s désactivera %s."
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "Cette unité possède des unités-filles qui dépendent d'elle : vous devez activer cette unité avant de pouvoir activer ses filles."
|
||||
L["Threat"] = "Menace"
|
||||
L["Top"] = "En haut"
|
||||
L["Top Center"] = "En haut au centre"
|
||||
L["Top Left"] = "En haut à gauche"
|
||||
L["Top Right"] = "En haut à droite"
|
||||
L["Total number of combo points you have on your target."] = "Nombre total de points de combo que vous avez sur votre cible."
|
||||
L["Totem bar"] = "Barre des totems"
|
||||
L["Travel"] = "Voyage"
|
||||
L["Tree"] = "Arbre"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "L'activation de la mise à jour rapide de la barre de puissance vous donne des informations sur la puissance beaucoup plus à jour."
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "L'activation de la mise à jour rapide des barres de vie vous donne des informations sur la vie beaucoup plus à jour."
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "Transforme ce widget en barre qui peut être redimensionnée et ordonnée de la même façon que les barres de vie et de puissance."
|
||||
L["Unattackable hostile"] = "Hostile inattaquable"
|
||||
L["Unit faction"] = "Faction de l'unité"
|
||||
L["Unit name"] = "Nom de l'unité"
|
||||
L["Unit name (Class colored)"] = "Nom de l'unité (coloré selon la classe)"
|
||||
L["Unit name colored by class."] = "Nom de l'unité coloré selon la classe."
|
||||
L["Units"] = "Unités"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "Faction de l'unité : Thrall renvoie Horde, tandis que Magni Barbe-de-bronze renvoie Alliance."
|
||||
L["Unit scaled threat"] = "Menace pondérée de l'unité"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "Type de l'unité : Rare, Élite rare, Élite, Boss, ou rien du tout si rien de tout cela."
|
||||
L["Unit server"] = "Serveur de l'unité"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "Serveur de l'unité. Si l'unité provient de votre serveur, rien n'est affiché."
|
||||
L["Units per column"] = "Unités par colonne"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "Race de l'unité : Elfe de sang, Tauren, etc."
|
||||
L["Update interval"] = "Intervalle de m. à j."
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "De nombreuses unités peuvent être activés grâce à cette page, telles que les unités de raid ou les cibles du groupe."
|
||||
L["Vehicle"] = "Véhicule"
|
||||
L["Vehicles"] = "Véhicules"
|
||||
L["View"] = "Vue"
|
||||
L["Visibility"] = "Visibilité"
|
||||
L["When this filter is active, apply the filter to buffs."] = "Quand ce filtre est actif, applique le filtre aux buffs."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "Quand ce filtre est actif, applique le filtre aux debuffs."
|
||||
L["Where inside the frame the text should be anchored to."] = "L'endroit à l'intérieur du cadre où le texte doit être ancré."
|
||||
L["Where to anchor the cast name text."] = "L'endroit où ancrer le texte du nom de l'incantation."
|
||||
L["Where to anchor the cast time text."] = "L'endroit où ancrer le texte de la durée d'incantation."
|
||||
L["Whitelist"] = "Liste blanche"
|
||||
L["Whitelists"] = "Listes blanches"
|
||||
L["Widget size"] = "Taille du widget"
|
||||
L["Width"] = "Largeur"
|
||||
L["Width percent"] = "%tage de la largeur"
|
||||
L["Width weight"] = "Poids en largeur"
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "Fonctionne de la même façon que %s, mais n'est affiche que si l'unité est en forme de félin ou d'ours."
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WoW Programming est un bon outil pour trouver ce que font les différentes API et comment y faire appel."
|
||||
L["X Offset"] = "Décalage en X"
|
||||
L["XP/Rep bar"] = "Barre d'EXP/de réput."
|
||||
L["Y Offset"] = "Décalage en Y"
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "Vous pouvez trouver plus d'informations sur la façon de créer vos propres tags dans l'onglet \"Aide\" ci-dessus."
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "Vous ne pouvez pas éditer ce tag car il s'agit d'un des tags par défaut de cet addon. Cette fonction est présente afin de fournir un exemple pour vos propres tags."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "Vous ne pouvez pas nommer un tag \"%s\" : les noms de tag ne peuvent contenir de crochets ou de parenthèses."
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "Vous venez d'entrer en combat, les cadres d'unité ont été verrouillées. Une fois que vous êtes sorti de combat, vous devrez les déverrouiller à nouveau via la commande /shadowuf"
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "Vous devez définir les événements à déclencher en utilisant uniquement des lettres et des tirets bas. Par exemple, \"FOO_BAR\" est valide, tandis que \"APPLE_5_ORANGE\" ne l'est pas car il contient un nombre."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "Vous devez entrer un nombre supérieur à 0 : les nombres négatifs ne sont pas autorisés."
|
||||
L["You must enter a tag name."] = "Vous devez entrer un nom de tag."
|
||||
L["You must wrap your code in a function."] = "Vous devez placer votre code dans une fonction."
|
||||
L["Zone configuration"] = "Config. selon zone"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,604 @@
|
||||
if( GetLocale() ~= "koKR" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "영문 10글자 이상의 이름을 줄여씁니다. \"Dark Rune Champion\" 을 \"D.R.Champion\" 으로 \"Dark Rune Commoner\" 를 \"D.R.Commoner\" 형식으로..."
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "받는 치유량을 절대값으로 사용, 만약 10,000의 치유를 받는 다면 10,000으로 표시합니다."
|
||||
L["Add"] = "추가"
|
||||
L["Add new tag"] = "새로운 태그 추가"
|
||||
L["Add new text"] = "새로운 형식 추가"
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "체력바안에 다른사람으로 부터 치유받는 치유량을 나타내는 바를 추가합니다."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "플레이어 창에서 곰폼이나 표범폼일때 마나의 획득량을 보기 위해 마나바를 추가합니다."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "룬바와 타이머를 플레이어 창에서 룬이 재생성 되기전까지 추가합니다."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "이 탭에서 값을 바꿀때 공통적으로 사용될 유닛 목록의 %s 을 추가합니다."
|
||||
L["Adds temporary enchants to the buffs for the player."] = "임시적으로 플레이어를 위한 강화버프를 추가합니다."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "토템바를 플레이어 창에서 사라지기 전까지 타이머와 함께 추가합니다."
|
||||
L["Add tags"] = "형식들 추가"
|
||||
L["Advanced"] = "고급 옵션"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "고급 태그 관리, 태그를 추가하거나 태그들을 수정할 수 있습니다."
|
||||
L["AFK"] = "자리비움"
|
||||
L["AFK:%s"] = "자리비움: %s"
|
||||
L["AFK status"] = "자리비움 상태"
|
||||
L["AFK timer"] = "자리비움 타이머"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "내보내기를 누른 후, 다른 유저에게 설정을 보내줄 수 있으며, 보다 정확한 화면배치의 정보를 얻을 수 있을 것입니다."
|
||||
L["Aggro"] = "어그로"
|
||||
L["Alpha to use for bar backgrounds."] = "바 배경에 투명값을 사용합니다."
|
||||
L["Ammo"] = "탄약류"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "체력이 감소되는 총량을 보여줍니다. 만약 감소가 없으면 보여지지 않습니다. 간단한 형식으로 -18500의 10000미만 값은 -18.5k 형식으로 보여줍니다."
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "파워가 감소되는 총량을 보여줍니다. 만약 감소가 없으면 보여지지 않습니다. 간단한 형식으로 -13850의 10000미만 값은 -13.8k로 보여줍니다."
|
||||
L["Anchor point"] = "고정 지점"
|
||||
L["Anchor to"] = "고정"
|
||||
L["Anchor to another frame"] = "다른 프레임에 고정"
|
||||
L["Anchor to buffs"] = "버프들에 고정"
|
||||
L["Anchor to debuffs"] = "디버프들에 고정"
|
||||
L["Arena"] = "투기장"
|
||||
L["Arena Pet"] = "투기장 소환수"
|
||||
L["Arenas"] = "투기장 지역"
|
||||
L["Arena Target"] = "투기장 대상"
|
||||
L["Are you sure you want to delete this filter?"] = "현재 필터를 지우길 원하십니까?"
|
||||
L["Are you sure you want to delete this tag?"] = "현재 태그를 삭제하길 원하십니까?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "현재 형식을 삭제하길 원하십니까? 만약, 삭제하면 해당 설정이 함께 삭제됩니다."
|
||||
L["Ascending"] = "순차적(차례대로)"
|
||||
L["Aura border style"] = "오라 외각선 스타일"
|
||||
L["Aura filters"] = "오라 필터"
|
||||
L["Aura name"] = "오라 이름"
|
||||
L["Auras"] = "오라"
|
||||
L["Aura types to filter"] = "필터할 오라 종류"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "배경"
|
||||
L["Background alpha"] = "배경 투명값"
|
||||
L["Background/border"] = "배경/외각선"
|
||||
L["Background color"] = "배경 색상"
|
||||
L["Bag indicator for master looters."] = "담당자 룻 표시를 위한 가방 지시기"
|
||||
L["Bars"] = "바"
|
||||
L["Bar spacing"] = "바 간격"
|
||||
L["Bar texture"] = "바 무늬"
|
||||
L["Battlegrounds"] = "전장 지역"
|
||||
L["Bear"] = "곰"
|
||||
L["Blacklist"] = "차단목록"
|
||||
L["Blacklist filters"] = "차단목록 필터"
|
||||
L["Blacklists"] = "차단목록들"
|
||||
L["Blizzard"] = "블리자드창"
|
||||
L["Border"] = "외각선"
|
||||
L["Border alpha"] = "외각선 투명화"
|
||||
L["Border color"] = "외각선 색상"
|
||||
L["Border highlighting"] = "외각선 강조"
|
||||
L["Border thickness"] = "외각선 두께"
|
||||
L["Boss"] = "보스"
|
||||
L["Boss Target"] = "보스 대상"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "모든 보스의 상황을 볼 수 없을 경우, 피의 공작 의회 또는 얼음왕관 비행선 전투등 특정적인 보스전에서 사용됩니다."
|
||||
L["Both"] = "함께"
|
||||
L["Bottom"] = "하단"
|
||||
L["Bottom Center"] = "하단 중앙"
|
||||
L["Bottom Left"] = "하단 왼쪽"
|
||||
L["Bottom Right"] = "하단 오른쪽"
|
||||
L["buff frames"] = "버프 창"
|
||||
L["Buffs"] = "버프"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "\"%s\" 이름을 가진 프로필을 발견할 수 없습니다."
|
||||
L["Cast"] = "시전"
|
||||
L["Cast bar"] = "시전 바"
|
||||
L["Cast icon"] = "주문 아이콘"
|
||||
L["Casting"] = "시전중"
|
||||
L["Cast interrupted"] = "시전 차단"
|
||||
L["Cast name"] = "주문 이름"
|
||||
L["Cast time"] = "시전 시간"
|
||||
L["Cast uninterruptible"] = "시전 차단불가"
|
||||
L["Cat"] = "표범"
|
||||
L["Category"] = "카테고리"
|
||||
L["Center"] = "중앙"
|
||||
L["Changed profile to %s."] = "%s의 프로필로 바뀌었습니다."
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "유닛이 어그로를 획득할 경우에 체력바를 적대적 색상(기본값:빨간색)으로 바꿉니다."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "바의 위젯의 높이와 순서를 체력바나 파워바를 바꾸듯이 바꿉니다."
|
||||
L["Channelling"] = "채널링"
|
||||
L["Class"] = "직업"
|
||||
L["Class color tag"] = "직업 색상 태그"
|
||||
L["Classes"] = "직업"
|
||||
L["Class icon"] = "직업 아이콘"
|
||||
L["Classificaiton"] = "유닛 등급"
|
||||
L["Classifications"] = "유닛 등급"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "직업 색상이 없는 이름, 직업에 의한 색상으로 직업이름을 원하는 경우 [classcolor][class][close] 을 사용합니다."
|
||||
L["Class (Smart)"] = "직업 (Smart)"
|
||||
L["Clip"] = "외각선 간격"
|
||||
L["Close color"] = "색상 닫기"
|
||||
L["Closes a color code, prevents colors from showing up on text that you do not want it to."] = "글자에 특별한 색을 입힌 뒤 해당 색이 사용되는것을 방지하기 위해서 색상 코드를 닫습니다."
|
||||
L["Code"] = "코드"
|
||||
L["Color by class"] = "직업별 색상"
|
||||
L["Color by happiness"] = "만족도의 색상"
|
||||
L["Color by reaction on"] = "반응에 의한 색상"
|
||||
L["Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."] = "유닛의 HP에 남은 백분율로 하는 색상 코드, 이것은 체력 설정의 색상과 같은 방식으로 작동합니다. 하지만, 전체바 대신에 글자에만 적용됩니다."
|
||||
L["Color code for general situation"] = "일반적인 상태 색상 코드"
|
||||
L["Color code for situation"] = "상태를 위한 색상 코드"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "직업에 의한 색상을 직업 글자로 사용하고 싶을 경우 [classcolor][class][close] 를 사용하면 직업을 위한 색상을 코드입니다."
|
||||
L["Color code on aggro"] = "어그로 상태 색상 코드"
|
||||
L["Color health by"] = "체력 색상의 기준"
|
||||
L["Color on aggro"] = "어그로 상태 색상"
|
||||
L["Colors"] = "색상"
|
||||
L["Colors the health bar by how happy your pet is."] = "소환수가 얼마나 행복한지를 체력바의 색상으로 표시"
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "체력 바에 고정적인 색상으로 사용할 경우 쓰이는 색상."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "차단불가 주문을 시전 할 경우 사용되는 색상, 이 것은 오직 PvE 몹에만 해당 됩니다."
|
||||
L["Color used when a cast is a channel."] = "채널링 주문을 시전할 때의 색상."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "주문이 시전자 스스로 혹은 다른 유닛에 의해 차단이 될 경우 사용되는 색상입니다."
|
||||
L["Color used when a cast is successfully finished."] = "주문이 성공적으로 시전되었을 때 사용되는 색상입니다."
|
||||
L["Color used when an unit is casting a spell."] = "유닛이 주문을 시전할때의 색상입니다."
|
||||
L["Column growth"] = "칸(열) 확장"
|
||||
L["Column spacing"] = "칸(열) 간격"
|
||||
L["Combat alpha"] = "전투중 투명값"
|
||||
L["Combat fader"] = "전투중 조절값"
|
||||
L["Combat/resting status"] = "전투/휴식 상태"
|
||||
L["Combat status"] = "전투 상황"
|
||||
L["Combat text"] = "전투 메세지"
|
||||
L["Combo points"] = "연계 포인트"
|
||||
L["Configuration to specific unit frames."] = "SUF 모듈의 개별적인 설정"
|
||||
L["Create"] = "만들기"
|
||||
L["Creature type"] = "소환수 타입"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "소환수 타입, 유닛이 펠가드일 경우 펠가드로, 늑대면 늑대로 표시"
|
||||
L["Crown indicator for group leaders."] = "파티장의 왕관 지시기."
|
||||
L["Cur/Max HP (Absolute)"] = "현재/최대 HP (절대값)"
|
||||
L["Cur/Max HP (Short)"] = "현재/최대 HP (짧게)"
|
||||
L["Cur/Max HP (Smart)"] = "현재/최대 HP (Smart)"
|
||||
L["Cur/Max power (Absolute)"] = "현재/최대 파워 (절대값)"
|
||||
L["Cur/Max power (Druid)"] = "현재/최대 파워 (드루이드)"
|
||||
L["Cur/Max Power (Short)"] = "현재/최대 파워 (짧게)"
|
||||
L["Cur/Max PP (Smart)"] = "현재/최대 PP (Smart)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "현재 그리고 최대 체력을 [curhp]/[maxhp] 의 형식으로 사용합니다. 만약, 대상이 죽거나 오프라인일 경우 관련 형식으로 대체 됩니다."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "현재 그리고 최대 파워를 [curpp]/[maxpp] 의 형식으로 사용합니다."
|
||||
L["Current health (Druid/Absolute)"] = "현재 체력 (드루이드/절대값)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "현재 체력을 간단한 형식으로 11500의 10000미만 값은 11.5k로 보여줍니다."
|
||||
L["Current HP (Absolute)"] = "현재 HP (절대값)"
|
||||
L["Current HP (Short)"] = "현재 HP (짧게)"
|
||||
L["Current power (Absolute)"] = "현재 파워(절대값)"
|
||||
L["Current power (Druid)"] = "현재 파워(드루이드)"
|
||||
L["Current power (Druid/Absolute)"] = "현재 파워(드루이드/절대값)"
|
||||
L["Current Power (Short)"] = "현재 Power (짧게)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "현재 파워를 간단한 형식으로 12750의 10000미만 값은 12.7k로 보여줍니다."
|
||||
L["Dark"] = "어둡게"
|
||||
L["Dead"] = "죽음"
|
||||
L["Debuffs"] = "디버프"
|
||||
L["Decimal percent HP"] = "소수점 백분율 HP"
|
||||
L["Deficit/Unit Name"] = "손실/플레이어 이름"
|
||||
L["Delete"] = "삭제"
|
||||
L["Delete filter"] = "필터 삭제"
|
||||
L["Descending"] = "역순(거꾸로)"
|
||||
L["Disabled"] = "비활성(끔)"
|
||||
L["Disabled in %s"] = "%s 비활성(꺼짐)."
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "플레이어가 탈것을 탈 때 유닛창으로 변환되는것을 비활성화합니다."
|
||||
L["Disable vehicle swap"] = "탈 것 전환 비활성"
|
||||
L["Disabling unit modules in various instances."] = "특정 던전 혹은 지역에서 사용하거나 혹은 사용하지 않을 모듈 설정"
|
||||
L["DND"] = "다른용무중"
|
||||
L["DND:%s"] = "다른용무:%s"
|
||||
L["Documentation"] = "문서"
|
||||
L["Don't use a filter"] = "필터를 사용하지 않습니다."
|
||||
L["Down"] = "아래"
|
||||
L["Druid form"] = "드루이드 폼"
|
||||
L["Druid form (Short)"] = "드루이드 폼(짧게)"
|
||||
L["Druid mana bar"] = "드루이드 마나 바"
|
||||
L["Dungeon role"] = "던전 난이도"
|
||||
L["Edge size"] = "외각선 크기"
|
||||
L["Editing %s"] = "%s 수정"
|
||||
L["Edit tag"] = "태그 수정"
|
||||
L["Elite"] = "정예"
|
||||
L["Empty bar"] = "빈공간 바"
|
||||
L["Enable buffs"] = "버프 사용"
|
||||
L["Enable debuffs"] = "디버프 사용"
|
||||
L["Enabled in %s"] = "%s 안에서 사용"
|
||||
L["Enabled units"] = "허용할 SUF 모듈"
|
||||
L["Enable frequent updates"] = "빠른 업데이트 사용"
|
||||
L["Enable indicator"] = "지시기 사용"
|
||||
L["Enable quick health"] = "빠른 체력 사용"
|
||||
L["Enable quick power"] = "빠른 파워 사용"
|
||||
L["Enable %s"] = "%s 사용"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "설정 화면 허용. 이동 가능한 예제 프레임으로 화면배치를 설정할 수 있습니다."
|
||||
L["Enable temporary enchants"] = "임시적인 강화효과 사용"
|
||||
L["Enable units"] = "허용할 SUF 모듈"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "고급 및 추가 설정을 위한 옵션입니다. 기본적인 설정만을 이용하려면 체크하지 마세요."
|
||||
L["Energy"] = "기력"
|
||||
L["Enlarge your auras"] = "자신의 오라 확대"
|
||||
L["Error"] = "에러"
|
||||
L["Events"] = "이벤트"
|
||||
L["Export"] = "내보내기"
|
||||
L["F"] = "F"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "당신의 거리안에 있지 않는 유닛창을 점점 사라지게 합니다."
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = [=[ShadowedUF_Options 로딩 실패, 설정을 불러들 일 수가 없습니다. 에러: %s
|
||||
]=]
|
||||
L["Female"] = "여자"
|
||||
L["Filtering both buffs and debuffs"] = "버프와 디버프를 함께 필터링"
|
||||
L["Filtering buffs only"] = "버프만 필터링"
|
||||
L["Filtering debuffs only"] = "디버프만 필터링"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "자기자신이나 다른 플레이어에게 시전할 수 없는 오라를 필터로 사용합니다."
|
||||
L["Filter out any auras that you did not cast yourself."] = "자신이 시전하지 않는 오라를 필터로 사용합니다."
|
||||
L["Filter out any aura that you cannot cure."] = "자신이 해제할 수 없는 오라를 필터로 씁니다."
|
||||
L["Filter type"] = "필터 타입"
|
||||
L["Finished cast"] = "시전 종료"
|
||||
L["Flight"] = "비행"
|
||||
L["Focus"] = "주시 대상"
|
||||
L["Focus Target"] = "주시대상의 대상"
|
||||
L["Font"] = "글꼴"
|
||||
L["Forces a static color to be used for the background of all bars"] = "모든 바의 배경에서 해당 색상을 강제로 사용하도록 합니다."
|
||||
L["For target/focus"] = "대상/주시대상"
|
||||
L["Frame"] = "창"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "전투중이 아니거나 혹은 타겟이 없을 때 그리고 마나 혹은 기력이 100%일 때 프레임 투명도를 사용합니다."
|
||||
L["Frame alpha while this unit is in combat."] = "대상이 전투중일 경우 창 투명화."
|
||||
L["Frames"] = "창"
|
||||
L["Friendly"] = "우호적"
|
||||
L["Friendly spell"] = "우호적인 주문"
|
||||
L["Fuel"] = "연료"
|
||||
L["Full size after"] = "전체 크기 이후"
|
||||
L["Full size before"] = "전체 크기 이전"
|
||||
L["General"] = "일반"
|
||||
L["General configuration to all enabled units."] = "허용한 유닛들의 일반적인 설정."
|
||||
L["General threat situation"] = "일반적인 위협수준 상태"
|
||||
L["Ghost"] = "유령"
|
||||
L["Global"] = "공통"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "노란 체크마크 - 이 지역에서 사용 / 회색 체크마크 - 이 지역에서 사용안함 / 체크마크 없음 - 기본 유닛 설정 사용"
|
||||
L["Group by"] = "그룹" -- Needs review
|
||||
L["Group %d"] = "파티 %d"
|
||||
L["Group number"] = "파티 번호"
|
||||
L["Group row spacing"] = "파티 줄 간격"
|
||||
L["Groups"] = "파티"
|
||||
L["Groups per row"] = "줄 당 파티"
|
||||
L["Groups to show"] = "파티 보기"
|
||||
L["Growth"] = "성장"
|
||||
L["Guardian bar"] = "가디언 바"
|
||||
L["Guild name"] = "길드 이름"
|
||||
L["Half health"] = "중간 체력"
|
||||
L["Happiness"] = "만족도"
|
||||
L["Health"] = "체력"
|
||||
L["Health bar"] = "체력 바"
|
||||
L["Health bar color for friendly units."] = "우호적 유닛들의 체력 바 색상"
|
||||
L["Health bar color for hostile units."] = "적대적 유닛들의 체력 바 색상"
|
||||
L["Health bar color for neutral units."] = "중립적 유닛들의 체력 바 색상"
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "공격할 수 없을 적대적 유닛의 재설정되는 색상입니다."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "누군가 어느 정도의 치유를 받고 있는지 볼 경우 사용되는 체력 바 색상입니다."
|
||||
L["Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."] = "체력이 100% -> 0%로 이동되는 동안 사용되는 바 색상, 또한 당신의 소환수가 불행함을 느낄 때 사용됩니다."
|
||||
L["Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."] = "체력이 100% -> 50%까지 일 경우에 사용되는 바 색상, 또한 당신의 소환수가 행복할 때 사용됩니다."
|
||||
L["Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."] = "체력이 50% -> 0%까지 이동되는 동안 사용되는 바 색상, 또한 당신의 소환수가 매우 불행함을 느낄 때 사용됩니다."
|
||||
L["Health color"] = "체력 색상"
|
||||
L["Health percent"] = "체력 백분율"
|
||||
L["Height"] = "높이"
|
||||
L["Help"] = "도움말"
|
||||
L["Hide bar when empty"] = "바 자동 숨기기"
|
||||
L["Hide Blizzard"] = "블리자드창 숨기기"
|
||||
L["Hide in 6-man raid"] = "6인이하 공격대일 경우 숨기기"
|
||||
L["Hide in any raid"] = "모든 공격대 숨기기"
|
||||
L["Hide %s"] = "%s 숨기기"
|
||||
L["Hide %s frames"] = "%s 창 숨기기"
|
||||
L["Hides the cast bar if there is no cast active."] = "만약 시전중이 아닐 경우 시전바를 숨깁니다."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "자신이 시전하지 않는 오라의 재사용 울림을 숨깁니다."
|
||||
L["Hide tooltips in combat"] = "전투중 툴팁 숨기기"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "블리자드 기본 UI등을 보이게 하거나 숨기게 하는 설정을 할 수 있습니다."
|
||||
L["High"] = "높은"
|
||||
L["High health"] = "높은 체력"
|
||||
L["Highlight"] = "강조"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "당신이 해제가능한 디버프가 있을 경우 유닛을 강조합니다."
|
||||
L["Highlight units that have aggro on any mob."] = "어떠한 몹의 어그로를 획득했을 경우 유닛을 강조합니다."
|
||||
L["Highlight units that you are targeting or have focused."] = "당신의 대상이거나 주시하고 있을 경우 유닛을 강조합니다."
|
||||
L["Highlight units when you mouse over them."] = "당신의 마우스를 올려놓을 경우 유닛을 강조합니다."
|
||||
L["Hostile"] = "적대적"
|
||||
L["Hostile spell"] = "적대적 주문"
|
||||
L["How close the frame should clip with the border."] = "프레임 외각선과의 간격을 조절합니다."
|
||||
L["How far the background should be from the unit frame border."] = "유닛 프레임의 외각선으로부터의 배경 삽입 위치."
|
||||
L["How large the background should tile"] = "배경의 크기를 조정."
|
||||
L["How large the edges should be."] = "외각선의 크기를 조정."
|
||||
L["How many auras to show in a single row."] = "얼마나 많은 오라를 단일 열에 보여줍니다."
|
||||
L["How many groups should be shown per row."] = "줄 당 보여지는 파티수입니다."
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "유닛에 얼마나 많은 사람들이 대상을 하고 있는지 보여줍니다. 예를 들어 자신을 선택하면 얼마나 많은 사람들이 당신을 대상으로 하고 있는지 보여줍니다. 이 숫자는 당신자신도 포함입니다!"
|
||||
L["How much spacing should be between each new row of groups."] = "새로운 파티들의 줄 간격을 조절합니다."
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "유닛프레임 내의 바 사이 간격. 값이 높을수록 바끼리 가까워지며, 값이 낮을수록 바끼리 멀어집니다. 0 은 간격값을 없앨경우 해당됩니다."
|
||||
L["How the frames should grow when a new column is added."] = "새로운 열이 추가되면 창이 성장하는 방법입니다."
|
||||
L["How the rows should grow when new group members are added."] = "새로운 파티원이 추가될 때 열을 성장합니다."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "오라를 유닛프레임에 고정시킵니다."
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "만약 유닛에 치유주문이 들어오면, 유닛이름이 보여지더라도 절대적인 치유값을 보여줍니다."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "당신이 오라를 시전하면 버프 아이콘의 크기가 보기 쉽게 커집니다."
|
||||
L["Import"] = "가져오기"
|
||||
L["Import non-standard module settings"] = "비공식 모듈 설정 가져오기"
|
||||
L["Import unit frame positions"] = "유닛프레임 위치정보 가져오기"
|
||||
L["Import visibility settings"] = "속성 설정 가져오기"
|
||||
L["Inactive alpha"] = "투명화 비활성"
|
||||
L["Incoming heal"] = "받는 치유량"
|
||||
L["Incoming heal/Name"] = "받는 치유량/이름"
|
||||
L["Incoming heals"] = "받는 치유량들"
|
||||
L["Incoming heal (Short)"] = "받는 치유량 (짧게)"
|
||||
L["Index"] = "색인"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "사냥꾼에게만 적용되는 소환수의 행복도의 지시기입니다."
|
||||
L["Indicators"] = "지시기"
|
||||
L["In range alpha"] = "거리에 따른 투명도"
|
||||
L["Inset"] = "삽입"
|
||||
L["Inside Center"] = "내부 중앙"
|
||||
L["Inside Center Left"] = "내부 중앙 왼쪽"
|
||||
L["Inside Center Right"] = "내부 중앙 오른쪽"
|
||||
L["Inside Top Left"] = "내부 상단 왼쪽"
|
||||
L["Inside Top Right"] = "내부 상단 오른쪽"
|
||||
L["Interrupted"] = "차단(방해)"
|
||||
L["Invalid interval entered, must be a number."] = "인식불가능한 간격이 들어있습니다. 숫자가 들어있어야 합니다."
|
||||
L["Invalid spell \"%s\" entered."] = "인식불가능한 주문 \"%s\"이 들어있습니다."
|
||||
L["Layout manager"] = "화면배치 관리"
|
||||
L["Leader"] = "파티장"
|
||||
L["Left"] = "왼쪽"
|
||||
L["Left Bottom"] = "왼쪽 하단"
|
||||
L["Left Center"] = "왼쪽 중앙"
|
||||
L["Left text"] = "왼쪽 형식"
|
||||
L["Left Top"] = "왼쪽 상단"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "기본적인 글꼴 크기를 크거나 작게 변경합니다."
|
||||
L["Level"] = "레벨"
|
||||
L["Level (Colored)"] = "레벨 (색상화된)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "레벨 %s - %s: %s/%s (현재 %.2f%%)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "레벨 %s - %s: %s/%s (현재 %.2f%%), 휴식경험치 %s."
|
||||
L["Level without any coloring."] = "모든 색을 제외한 레벨."
|
||||
L["Light"] = "밝게"
|
||||
L["Lock frames"] = "창 잠금"
|
||||
L["Low health"] = "낮은 체력"
|
||||
L["M"] = "M"
|
||||
L["Main Assist"] = "메인 지원"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "메인 지원은 블리자드 지원 공격 전담 시스템 또는 oRA3같은 애드온을 사용하여 설정됩니다."
|
||||
L["Main Assist Target"] = "메인 지원 대상"
|
||||
L["Main Tank"] = "메인 탱커"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "메인 탱커는 블리자드 방어 전담 또는 oRA3같은 애드온을 사용하여 설정됩니다."
|
||||
L["Main Tank Target"] = "메인 탱커 대상"
|
||||
L["Male"] = "남자"
|
||||
L["Mana"] = "마나"
|
||||
L["Manage aura filters"] = "오라 필터들 관리"
|
||||
L["Management"] = "관리하기"
|
||||
L["Manual position"] = "수동 위치"
|
||||
L["Master looter"] = "담당자 획득자"
|
||||
L["Max columns"] = "최대 칸수"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "현재 체력을 간단한 형식으로 17750의 10000미만 값은 17.7k로 보여줍니다."
|
||||
L["Max HP (Absolute)"] = "최대 HP (절대값)"
|
||||
L["Max HP (Short)"] = "최대 HP (짧게)"
|
||||
L["Max power (Absolute)"] = "최대 파워(절대값)"
|
||||
L["Max power (Short)"] = "최대 파워(짧게)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "최대 파워를 간단한 형식으로 16000의 10000미만 값은 16k로 보여줍니다."
|
||||
L["Max rows"] = "최대 줄수"
|
||||
L["Medium"] = "중간"
|
||||
L["Miscellaneous"] = "기타설정"
|
||||
L["Missing HP (Short)"] = "손실 HP(짧게)"
|
||||
L["Missing power (Short)"] = "손실 파워(짧게)"
|
||||
L["Moonkin"] = "달빛 야수"
|
||||
L["Name"] = "이름"
|
||||
L["Name (Abbreviated)"] = "이름 (약식)"
|
||||
L["Neutral"] = "중립적"
|
||||
L["Never (Disabled)"] = "절대 (사용불가)"
|
||||
L["New filter"] = "새로운 필터"
|
||||
L["None"] = "없음"
|
||||
L["NPCs only"] = "NPC들만"
|
||||
L["Offline"] = "오프라인"
|
||||
L["Offline timer"] = "오프라인 타이머"
|
||||
L["Off:%s"] = "오프:%s"
|
||||
L["On aggro"] = "어그로 획득"
|
||||
L["On curable debuff"] = "해제 가능한 디버프"
|
||||
L["On mouseover"] = "마우스오버"
|
||||
L["Order"] = "층 레벨"
|
||||
L["Or you can set a position manually"] = "또는 수동적인 위치 설정"
|
||||
L["Outline"] = "폰트 외각선"
|
||||
L["Out of range alpha"] = "거리 벗어난 투명도"
|
||||
L["Outside bar limit"] = "외곽 바 한계"
|
||||
L["Override color"] = "추가 할 색상"
|
||||
L["Party"] = "파티"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "인원수와 상관없이 공격대 구성시 파티창을 숨깁니다."
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "5명 이상의 공격대 구성시 파티창을 숨깁니다."
|
||||
L["Party instances"] = "5인 던전"
|
||||
L["Party Pet"] = "파티 소환수"
|
||||
L["Party Target"] = "파티 대상"
|
||||
L["Percentage of width the portrait should use."] = "사용가능한 초상화 너비의 백분율"
|
||||
L["Percentage value of how far outside the unit frame the incoming heal bar can go. 130% means it will go 30% outside the frame, 100% means it will not go outside."] = "받는 치유량을 유닛프레임에 표시 할 한계 백분율 값. 130%일 경우 30%는 프레임 밖에 표시하며, 100% 일 경우 프레임밖에 표시하지 않습니다."
|
||||
L["Percent HP"] = "HP 백분율"
|
||||
L["Percent power"] = "파워 백분율"
|
||||
L["Per column"] = "칸(단위) 당"
|
||||
L["Per row"] = "줄(단위) 당"
|
||||
L["Pet"] = "소환수"
|
||||
L["Pet Target"] = "소환수 대상"
|
||||
L["Player"] = "플레이어"
|
||||
L["player cast bar"] = "플레이어 시전 바"
|
||||
L["Players only"] = "플레이어만"
|
||||
L["Players will be colored by class, "] = "플레이어는 직업에 의해 색상화 됩니다."
|
||||
L["Player threat"] = "플레이어 위협수준"
|
||||
L["Point"] = "포인트"
|
||||
L["Portrait"] = "초상화"
|
||||
L["Portrait type"] = "초상화 형태"
|
||||
L["Position"] = "위치"
|
||||
L["Power"] = "파워"
|
||||
L["Power bar"] = "파워 바"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "전투 중 툴팁이 보이는 것을 방지합니다."
|
||||
L["Prioritize buffs"] = "우선 순위 버프"
|
||||
L["PvP Flag"] = "PvP 깃발"
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "PVP 타이머"
|
||||
L["Race"] = "종족"
|
||||
L["Race (Smart)"] = "종족 (Smart)"
|
||||
L["Rage"] = "분노"
|
||||
L["Raid"] = "공격대"
|
||||
L["Raid assisting unit"] = "공격대 지원 유닛"
|
||||
L["Raid instances"] = "공격대 던전"
|
||||
L["Raid role"] = "공격대 난이도"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "공격대 지시기입니다. 메인탱커는 방패모양이고, 지원담당은 칼모양입니다."
|
||||
L["Raid target"] = "공격대 대상"
|
||||
L["Raid target indicator."] = "공격대 대상 지시기."
|
||||
L["Raid targeting unit"] = "공격대 대상 유닛"
|
||||
L["Range indicator"] = "거리 지시기"
|
||||
L["Range spells"] = "원거리 주문들"
|
||||
L["Rare"] = "희귀"
|
||||
L["Rare Elite"] = "희귀 정예"
|
||||
L["Rare indicator"] = "희귀 지시기"
|
||||
L["Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."] = "재설정 색상 코드, 반응에 의한 유닛 이름을 색상화 할 경우에 [reactcolor][name][close] 를 사용합니다."
|
||||
L["Reaction color tag"] = "재설정 색상 태그"
|
||||
L["Ready status"] = "준비 상황"
|
||||
L["Ready status of group members."] = "파티원의 전투 준비 상황."
|
||||
L["Resources"] = "참고자료"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "대상의 위협수준 상태(어그로획득-빨강색, 높은 위협수준-주황색, 조심스러운 위협수준-노란색)에 따라 색상코드를 돌려줍니다. "
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "모든 유닛들의 일반적인 위협수준(어그로획득-빨강색, 높은 위협수준-주황색, 조심스러운 위협수준-노란색)의색상 코드를 돌려줍니다. 어그로 획득의 빨간색, 높은 위협수준의 오렌지 색 그리고 안전한 수준의 노란 색."
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "자신의 타켓의 위협수준을 변경된 백분율(항상 0-100%)로 돌려줍니다."
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "현재 체력에 백분율로 표시된 것들을 죽거나 오프라인 상태일 경우에는 그 상태로 표시합니다."
|
||||
L["Returns current power as a percentage."] = "현재 파워를 백분율로 돌려줍니다."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "만약 대상 유닛이 정예 혹은 희귀 정예 몹일 경우 +로 되돌려줍니다."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "만약 대상 유닛이 정예 혹은 희귀 정예 몹일 경우 희귀로 되돌려줍니다."
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "자신과 유닛레벨을 비교한 색상코드를 돌려 줍니다. 만약 대신이 그들을 공격한다면 색상이 없이 돌려줍니다."
|
||||
L["Returns the units sex."] = "유닛 성별 되돌리기."
|
||||
L["Right"] = "오른쪽"
|
||||
L["Right Bottom"] = "오른쪽 하단"
|
||||
L["Right Center"] = "오른쪽 중앙"
|
||||
L["Right text"] = "오른쪽 형식"
|
||||
L["Right Top"] = "오른쪽 상단"
|
||||
L["Row growth"] = "열 성장"
|
||||
L["Row offset"] = "행 좌표"
|
||||
L["rune bar"] = "룬 바"
|
||||
L["Rune bar"] = "룬 바"
|
||||
L["Runic Power"] = "룬 파워"
|
||||
L["Scale"] = "크기비율"
|
||||
L["Scaled threat percent"] = "위협 백분율의 크기비율"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "당신이 시전한 오라의 크기비율을 정합니다. 숫자가 100%보다 크면 기본크기보다 커지고, 100%보다 작으면 기본크기보다 작아집니다."
|
||||
L["Screen"] = "화면"
|
||||
L["Search"] = "찾기"
|
||||
L["Search tags"] = "태그 찾기"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "태그를 제작하기전, 관련 정보나 혹은 예제들을 참고하세요. 기본적인 Lua 또는 Wow API의 정보들을 원한다면 Programming in Lua와 Wow Programming 링크를 참고하세요."
|
||||
L["Self aura size"] = "자신의 오라 크기"
|
||||
L["Separate raid frames"] = "공격대 창 분리"
|
||||
L["Set filter zones"] = "필터 지역 설정"
|
||||
L["Sex"] = "성별"
|
||||
L["%s frames"] = "%s 창"
|
||||
L["Short classification"] = "짧은 등급 표시"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "짧은 등급 표시, R은 희귀, R+는 희귀 정예, + 는 정예, B는 보스, 해당사항이 없다면 보이지 않습니다."
|
||||
L["Short elite indicator"] = "짧은 정예 지시기"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "받는 치유량을 짧게 표시, 만약 13,000의 치유를 받는 다면 1.3k로 표시합니다."
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "[드루이드 폼]의 짧은 버전, C = 캣, B = 곰, F = 날것 및 기타등등"
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "숨겨진 바의 배경을 같은 무늬/색상으로 보지만 점점 사라지게 됩니다."
|
||||
L["Show as bar"] = "바 보기"
|
||||
L["Show background"] = "배경 보기"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "같은 고정위치를 공유할 때 디버프 보다 버프를 보입니다."
|
||||
L["Show castable on other auras only"] = "시전가능한 다른 오라만 보기"
|
||||
L["Show cast name"] = "주문 이름 보기"
|
||||
L["Show cast rank"] = "주문 레벨 보기"
|
||||
L["Show cast time"] = "시전 시간 보기"
|
||||
L["Show curable only"] = "해제할 수 있는 것만 보기"
|
||||
L["Show party as raid"] = "공격대일 때 파티 보기"
|
||||
L["Show player in party"] = "파티 안의 플레이어 보기"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "자리비움, 다른용무중 등의 상태를 보여줍니다."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "현재/최대 체력을 절대값으로 보여주는 형식이며, 17500의 체력은 17500 그대로 보여줍니다."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "현재와 최대 파워를 절대값 형식으로 파워가 18000이면 18000 그대로 보여줍니다."
|
||||
L["Shows current group number of the unit."] = "유닛이 현재 몇 번째 파티에 속해있는지 보여줍니다."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "현재의 체력을 절대값으로 보여주는 형식이며, 15000의 체력을 15000 그대로 보여줍니다."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "현재파워를 절대값 형식으로 파워가 18000이면 18000 그대로 보여줍니다."
|
||||
L["Shows how long an unit has been AFK or DND."] = "유닛이 얼마나 오랫동안 자리비움 혹은 다른용무중인지 보여줍니다."
|
||||
L["Shows how long an unit has been offline."] = "유닛이 얼마나 오랫동안 오프라인인지 보여줍니다."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "최대 체력의 절대값으로 보여주는 형식이며, 14000의 체력을 14000 그대로 보여줍니다."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "최대파워를 절대값 형식으로 파워가 13000이면 13000 그대로 보여줍니다"
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "오프라인, 죽음, 유령 등의 현재 상태를 보여줍니다."
|
||||
L["Show's the units guild name if they are in a guild."] = "대상이 길드에 가입되어 있을 경우 길드 이름을 보여줍니다."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "체력의 백분율을 첫번째 소수점까지 보여줍니다. 전체체력 110중에 61남아 있으면 55.4%형식으로 보여줍니다."
|
||||
L["Show your auras only"] = "자신의 오러만 보기"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "허용목록 및 차단목록에 의한 간단한 오라 필터링입니다."
|
||||
L["Size"] = "크기"
|
||||
L["Smart level"] = "영리한 레벨 표시"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "영리한 레벨 표시, 보스들을 보스로 값을 되돌려주며, 50레벨등의 정예몹을 +50으로, 또는 80레벨을 80레벨등으로 변환해줍니다."
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "[curmaxhp] 를 위한 간단한 숫자 형식입니다. 1,000,000미만의 수는 그대로 보여지고, 1,000,000이상의 수는 1m같은 짧은 형식으로 보여집니다."
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "[curmaxhp] 를 위한 간단한 숫자 형식입니다. 1,000,000미만의 수는 그대로 보여지고, 1,000,000이상의 수는 1m같은 짧은 형식으로 보여집니다."
|
||||
L["%s member"] = "%s 멤버"
|
||||
L["Sorting"] = "정리"
|
||||
L["Sort method"] = "정렬 방법"
|
||||
L["Sort order"] = "계층 정리"
|
||||
L["Spacing"] = "간격"
|
||||
L["Spacing between each row"] = "각각 열사이의 간격"
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (현재 %.2f%%)"
|
||||
L["Static"] = "일반 체력"
|
||||
L["Status"] = "Status"
|
||||
L["Style of borders to show for all auras."] = "보여지는 모든 오라들에 외각선 스타일을 만듭니다."
|
||||
L["T"] = "T"
|
||||
L["Tag list"] = "태그 목록"
|
||||
L["Tag name"] = "태그 이름"
|
||||
L["Tags"] = "태그들"
|
||||
L["Target"] = "대상"
|
||||
L["Target of Target"] = "대상의 대상"
|
||||
L["Target of Target of Target"] = "대상의 대상의 대상"
|
||||
L["Temporary enchants"] = "임시적인 강화효과"
|
||||
L["Test Aura"] = "오라 테스트"
|
||||
L["Test spell"] = "주문 테스트"
|
||||
L["Text"] = "형식"
|
||||
L["Text management"] = "형식 관리하기"
|
||||
L["Text name"] = "형식 이름"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "다른 설정을 사용할 때 쓸 형식을 만들기 위해 형식 이름을 규정합니다."
|
||||
L["Text parent"] = "형식 위치"
|
||||
L["Text/Tags"] = "형식/태그"
|
||||
L["The blacklist \"%s\" already exists."] = "차단목록 \"%s\" 이미 존재합니다."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "아래의 체크박스들은 유닛을 사용하게 하거나 사용하지 못하게 합니다."
|
||||
L["The tag \"%s\" already exists."] = "태그 \"%s\" 는 이미 존재합니다."
|
||||
L["The whitelist \"%s\" already exists."] = "허용목록 \"%s\"는 이미 존재합니다."
|
||||
L["Thick outline"] = "두꺼운 외각선"
|
||||
L["Thin outline"] = "얇은 외각선"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "이 바는 레벨 갭에 갇히거나, 더이상 평판추적을 하지 않을 경우 자동적으로 숨겨집니다."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "현재 필터는 필터링할 오라가 없습니다. 다이얼로그 팝업창에 추가할 오라를 입력하시면 됩니다."
|
||||
L["This filter has no aura types set to filter out."] = "현재 필터에서는 필터링할 오라가 없습니다."
|
||||
L["This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."] = "Lua 프로그래밍을 어떻게 시작할 것인가, 그리고 기본적인 Lua 문법이나 API들을 충분히 이해하는데 좋은 길잡이가 될 것입니다."
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "이 모듈은 상호작용하는 모듈이며, %s 모듈을 비활성화 하면 %s 모듈도 비활성화 됩니다."
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "이 모듈은 하위 모듈과 상호작용하는 모듈이며, 하위 모듈을 활성화 하기 위해선 이 모듈을 먼저 활성화 해야 합니다."
|
||||
L["This will override all background colorings for bars including custom set ones."] = "모든 배경 색상에 다음 색상을 추가해서 하나의 셋트로 만듭니다."
|
||||
L["Threat"] = "위협수준"
|
||||
L["Threat situation"] = "위협 상황"
|
||||
L["Tile size"] = "타일 크기"
|
||||
L["Timers for self auras only"] = "자신 오라만의 타이머"
|
||||
L["Top"] = "상단"
|
||||
L["Top Center"] = "상단 중앙"
|
||||
L["Top Left"] = "상단 왼쪽"
|
||||
L["Top Right"] = "상단 오른쪽"
|
||||
L["Total number of combo points you have on your target."] = "당신의 연계 포인트 수."
|
||||
L["Totem bar"] = "토템 바"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "보통보다 파워의 업데이트를 더 빠르게 파워바에 돌려줍니다."
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "체력 정보의 업데이트를 더욱 빠르게 체력바로 돌려줍니다."
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "바에 있는 위젯의 크기 및 순서를 체력바나 파워파의 처럼 돌려줍니다."
|
||||
L["Unattackable hostile"] = "공격불가인 적대적관계"
|
||||
L["Unit color code on aggro"] = "어그로 획득시 유닛 색상 코드"
|
||||
L["Unit colored situation"] = "상태에 따른 유닛 색상"
|
||||
L["Unit configuration"] = "유닛 설정"
|
||||
L["Unit faction"] = "유닛 진영"
|
||||
L["Unit name"] = "유닛 이름"
|
||||
L["Unit name (Class colored)"] = "유닛 이름 (직업 색상화된)"
|
||||
L["Unit name colored by class."] = "직업 색상화된 유닛 이름"
|
||||
L["Units"] = "구성"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "유닛 계열, 쓰랄일 경우 호드 반환, 마그니 브론즈비어드일 경우 얼라이언스 반환."
|
||||
L["Unit scaled threat"] = "크기변경된 위협 유닛"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "유닛 등급, 만약 다음에 해당되지 않는다면 표시되지 않습니다. 희귀, 희귀 정예, 정예, 보스."
|
||||
L["Unit server"] = "유닛 서버"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "만약 당신과 동일한 서버에서 왔다면 유닛 서버를 표시되지 않습니다."
|
||||
L["Unit situation name"] = "유닛 상태 이름"
|
||||
L["Units per column"] = "칸 당 유닛수"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "유닛 종족, 블러드 엘프, 타우렌, 트롤(불행히도) 등등."
|
||||
L["Unlink frames"] = "프레임 연결해제"
|
||||
L["Up"] = "위"
|
||||
L["Update interval"] = "업데이트 간격"
|
||||
L["Using unit settings"] = "구성 설정을 사용"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "이 페이지를 통해 다양한 유닛의 설정할 수 있습니다."
|
||||
L["Vehicle"] = "탈 것"
|
||||
L["Vehicles"] = "탈 것들"
|
||||
L["View"] = "보기"
|
||||
L["Visibility"] = "지역별 프레임 속성"
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "유닛의 체력이 감소 할 때, [missinghp] 태그가 보여질 때, 체력이 가득차 있을때에는 [name] 태그가 보여집니다. -1000이 보이면 1000의 HP가 줄어든것입니다. 하지만 그들의 이름은 계속 보일것입니다." -- Needs review
|
||||
L["When this filter is active, apply the filter to buffs."] = "이 필터를 활성화 하면, 버프 필터에 적용됩니다."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "이 필터를 활성화 하면, 디버프 필터에 적용됩니다."
|
||||
L["When to color the empty bar by reaction, overriding the default color by option."] = "빈바가 반응에 의해 색상화 될 때, 설정에 의한 색을 우선 보여줍니다."
|
||||
L["When to color the health bar by the units reaction, overriding the color health by option."] = "체력바가 유닛의 반응에 의해 색상화 될 때, 설정에 의한 색을 우선 보여줍니다."
|
||||
L["Where inside the frame the text should be anchored to."] = "프레임 안에 문구를 어떠한 곳에 고정할 것인지 정합니다."
|
||||
L["Where to anchor the cast name text."] = "주문 이름 문구에 고정합니다."
|
||||
L["Where to anchor the cast time text."] = "시전 시간 문구에 고정합니다."
|
||||
L["Whitelist"] = "허용목록"
|
||||
L["Whitelist filters"] = "허용목록 필터"
|
||||
L["Whitelists"] = "허용목록들"
|
||||
L["Widget size"] = "위젯 크기"
|
||||
L["Width"] = "너비"
|
||||
L["Width percent"] = "너비 백분율"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "Shadowed Unit Frames에 포함되어 있지않은 모듈의 설정을 포함시킬경우 체크하세요."
|
||||
L["WoW Programming"] = "외우 프로그래밍"
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WoW Programming은 다른 API의 사용법이나 어떻게 호출하는지에 관한 좋은 참고자료가 될 것입니다."
|
||||
L["X Offset"] = "X 좌표"
|
||||
L["XP/Rep bar"] = "경험치/평판 바"
|
||||
L["Y Offset"] = "Y 좌표"
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "당신만의 태그 제작에 관한 추가적인 정보를 찾고 싶다면, \"도움말\" 탭을 참고하셔요."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "태그 이름에 괄호나 대괄호가 포함되어 있지 않아, \"%s\" 이름 태그를 사용할 수 없습니다."
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "유닛 프레임의 필터 그룹을 어느 지역에 따라 어떤 필터 그룹을 사용할 것인지 설정할 수 있습니다. 만약 오라들을 변경하고 싶다면, \"오라 그룹 관리\" 설정을 보면 됩니다."
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "이 유형의 필터에 아직 추가된 것이 없으므로, 이 페이지를 사용하기 전에 관리하기 부분에서 새로운 것을 만들어야 합니다."
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "전투중이 되면 유닛프레임은 잠기게 됩니다. 전투가 끝나면 /shadowuf를 입력하여 해제할 수 있습니다."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "0이나 더 큰 숫자를 입력해야 합니다. 음수는 입력할 수 없습니다."
|
||||
L["You must enter a tag name."] = "반드시 태그 이름을 입력해야합니다."
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "설정한 오라 필터링을 사용하기 위해 오라 필터를 만들어야 합니다. "
|
||||
L["Zone configuration"] = "지역 설정"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,600 @@
|
||||
if( GetLocale() ~= "ruRU" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "Сокращение названий объектов у которых оно длиннее чем 10 букв, \"Dark Rune Champion\" станет \"D.R.Champion\" и \"Dark Rune Commoner\" станет \"D.R.Commoner\"."
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "Полное значение входящего исцеления, если входящее исцеление проходит на 10,000 оно так и будет отображаться как 10,000."
|
||||
L["Add"] = "Добавить"
|
||||
L["Add new tag"] = "Добавить новый тег"
|
||||
L["Add new text"] = "Добавить новый текст"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "Добавляет полосу, отображающую сколько времени осталось до исчезновения вурдалака; используется только если у вас нет постоянного вурдалака."
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "Добавляет еще одну полосу в полосу здоровья, которая показывает, на сколько игрок будет вылечен входящим исцелением."
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "Добавляет пустую полосу, куда вы можете поместить текст."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "Если вы находитесь в форме кошки или медведя, тогда добавляется полоска отображающая количество вашей маны."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "Добавляет к рамке игрока полосы рун и таймеры обновления рун."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "Добавляет фрейм %s в список модифицируемых фреймов, при изменении значения в данной вкладке."
|
||||
L["Adds temporary enchants to the buffs for the player."] = "Добавляет временные улучшения/зачарования к баффам игрока."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "Добавляет к рамке игрока полосы тотемов с их таймерами."
|
||||
L["Add tags"] = "Добавить теги"
|
||||
L["Advanced"] = "Расширенные"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "Расширенное управление тегами, позволяет вам добавить ваши собственные пользовательские теги."
|
||||
L["AFK"] = "АФК"
|
||||
L["AFK:%s"] = "АФК:%s"
|
||||
L["AFK status"] = "АФК статус"
|
||||
L["AFK timer"] = "АФК таймер"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "После того, как вы проделаете экспорт, вы можете передать код, размещенный ниже, другим пользователям Shadowed Unit Frames, и они получат вашу точную расстановку вёрстки фреймов."
|
||||
L["Aggro"] = "Угроза"
|
||||
L["Alpha to use for bar."] = "Прозрачность полосы."
|
||||
L["Alpha to use for bar backgrounds."] = "Прозрачность фона полос."
|
||||
L["Ammo"] = "Боеприпасы"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "Значение убывания здоровья, если здоровье полное, ничего не отображается. Используется формат сокращения, -18500 отображается как -18.5k, значения ниже 10000 не форматируются."
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "Значение убывания энергии, если энергия полна, ничего не отображается. Используется формат сокращения, -13850 отображается как 13.8k, значения ниже 10000 не форматируются."
|
||||
L["Anchor point"] = "Точка привязки"
|
||||
L["Anchor to"] = "Привязка к"
|
||||
L["Anchor to another frame"] = "Привязка к другой рамке"
|
||||
L["Anchor to buffs"] = "Привязка к баффам"
|
||||
L["Anchor to debuffs"] = "Привязка к дебаффам"
|
||||
L["Aquatic"] = "Водяной"
|
||||
L["Arena"] = "Арена"
|
||||
L["Arena Pet"] = "Питомец на арене"
|
||||
L["Arenas"] = "Арены"
|
||||
L["Arena Target"] = "Цель на арене"
|
||||
L["Are you sure you want to delete this filter?"] = "Вы действительно хотите удалить этот фильтр?"
|
||||
L["Are you sure you want to delete this tag?"] = "Вы действительно хотите удалить этот тег?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "Вы действительно хотите удалить этот текст? Все настройки будут удалены."
|
||||
L["Ascending"] = "Возрастающий"
|
||||
L["Aura border style"] = "Стиль границ аур"
|
||||
L["Aura filters"] = "Фильтры аур"
|
||||
L["Aura name"] = "Название ауры"
|
||||
L["Auras"] = "Ауры"
|
||||
L["Aura types to filter"] = "Типы аур для фильтра"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "Фон"
|
||||
L["Background alpha"] = "Прозрачность фона"
|
||||
L["Background/border"] = "Фон/края"
|
||||
L["Background color"] = "Цвет фона"
|
||||
L["Bag indicator for master looters."] = "Индикатор сумки для ответственного за добычу."
|
||||
L["Bar alpha"] = "Прозрачнос полосы"
|
||||
L["Bars"] = "Полосы"
|
||||
L["Bar spacing"] = "Промежуток полос"
|
||||
L["Bar texture"] = "Текстура полосы"
|
||||
L["Battlegrounds"] = "Поля боя"
|
||||
L["Bear"] = "Медведь"
|
||||
L["Blacklist"] = "Черный список"
|
||||
L["Blacklist filters"] = "Фильтр черного списка"
|
||||
L["Blacklists"] = "Черный список"
|
||||
L["Blizzard"] = "Blizzard"
|
||||
L["Border"] = "Края"
|
||||
L["Border alpha"] = "Прозрачность края"
|
||||
L["Border color"] = "Цвет краев"
|
||||
L["Border highlighting"] = "Подсвечивание краев"
|
||||
L["Border thickness"] = "Толщина края"
|
||||
L["Boss"] = "Босс"
|
||||
L["Boss Target"] = "Цель босса"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "Панели боссов для определенных боев, вроде Кровавого совета или битвы на кораблях, вы не увидите их в остальных боях с боссами." -- Needs review
|
||||
L["Both"] = "Оба"
|
||||
L["Bottom"] = "Внизу"
|
||||
L["Bottom Center"] = "Внизу по центру"
|
||||
L["Bottom Left"] = "Внизу слева"
|
||||
L["Bottom Right"] = "Внизу справа"
|
||||
L["buff frames"] = "область баффов"
|
||||
L["Buffs"] = "Баффы"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "Не удается найти профиль с именем: \"%s\"."
|
||||
L["Cast"] = "Применение"
|
||||
L["Cast bar"] = "Полоса применений"
|
||||
L["Cast icon"] = "Иконка применения"
|
||||
L["Casting"] = "Применение"
|
||||
L["Cast interrupted"] = "Применение прервано"
|
||||
L["Cast name"] = "Название применения"
|
||||
L["Cast time"] = "Время применения"
|
||||
L["Cast uninterruptible"] = "Бесперебойное применение"
|
||||
L["Cat"] = "Кошка"
|
||||
L["Category"] = "Категория"
|
||||
L["Center"] = "В центре"
|
||||
L["Changed profile to %s."] = "Прифиль изменён на: %s."
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "При получении угрозы, изменяет цвет полосы здоровья на цвет враждебно настроенного существа (красный по умолчанию)."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "Изменение эту верстку в полосу, вы сможете изменить высоту и порядок как можно изменять полосы здоровье и энергии."
|
||||
L["Channelling"] = "Направленное"
|
||||
L["Class"] = "Класс"
|
||||
L["Class color tag"] = "тег цвета класса"
|
||||
L["Classes"] = "Классы"
|
||||
L["Class icon"] = "Иконка класса"
|
||||
L["Classificaiton"] = "Классификация"
|
||||
L["Classifications"] = "Классификация"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "Название класса без окраски, используйте [classcolor][class][close] если вы хотите окрасить название класса."
|
||||
L["Class (Smart)"] = "Класс (Smart)"
|
||||
L["Clip"] = "Cрезать"
|
||||
L["Close color"] = "Закрыть цвет"
|
||||
L["Code"] = "Код"
|
||||
L["Color by class"] = "Цвет класса"
|
||||
L["Color by happiness"] = "Цвет по настроению"
|
||||
L["Color by reaction on"] = "Цвет по реакции"
|
||||
L["Color code for general situation"] = "Код цвета общего состояние"
|
||||
L["Color code for situation"] = "Код цвета для состояния"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "Код окраски класса, используйте [classcolor][class][close] если вы хотите чтобы текст класса окрашивался в соответствующий цвет"
|
||||
L["Color code on aggro"] = "Код цвета угрозы"
|
||||
L["Color health by"] = "Цвет здоровья по"
|
||||
L["Color on aggro"] = "Цвет при угрозе"
|
||||
L["Colors"] = "Цвета"
|
||||
L["Colors the health bar by how happy your pet is."] = "Окраска полосы здоровья по настроению питомца."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "Используемый цвет, когда применение не может быть прерванно, этоиспользуется только на PvE существах."
|
||||
L["Color used when a cast is a channel."] = "Используемый цвет при применении направленного заклинания."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "Используемый цвет при прерывании применения самим заклинателем или другим объектом."
|
||||
L["Color used when a cast is successfully finished."] = "Используемый цвет при удачном применении."
|
||||
L["Color used when an unit is casting a spell."] = "Используемый цвет при применении объектом заклинаний."
|
||||
L["Column growth"] = "Возрастание колонок"
|
||||
L["Column spacing"] = "Промежуток колонок"
|
||||
L["Combat alpha"] = "Прозрачность в бою"
|
||||
L["Combat fader"] = "Затухание боя"
|
||||
L["Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."] = "Затухание боя, будет скрывать все ваши рамки, во время бездействия. А во время проявления активности или в бою они будут снова появляться."
|
||||
L["Combat/resting status"] = "Статус боя/отдыха"
|
||||
L["Combat status"] = "Статус боя"
|
||||
L["Combat text"] = "Текст боя"
|
||||
L["Combo points"] = "Приемы в серии"
|
||||
L["Configuration to specific unit frames."] = "Настройка конкретных рамок."
|
||||
L["Create"] = "Создать"
|
||||
L["Creature type"] = "Тип существа"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "Тип создания, выводит надпись Стража Скверны, если это Стража Скверны, Волк, если это Волк и так далее."
|
||||
L["Crown indicator for group leaders."] = "Индикатор короны для рейд лидера."
|
||||
L["Cur/Max HP (Absolute)"] = "Тек/макс ЗД (полное)"
|
||||
L["Cur/Max HP (Short)"] = "Тек/макс ЗД (Коротко)"
|
||||
L["Cur/Max HP (Smart)"] = "Тек/макс ЗД (Smart)"
|
||||
L["Cur/Max power (Absolute)"] = "Тек/макс энергии (полное)"
|
||||
L["Cur/Max power (Druid)"] = "Тек/макс энергии (Друид)"
|
||||
L["Cur/Max Power (Short)"] = "Тек/макс энергии (коротко)"
|
||||
L["Cur/Max PP (Smart)"] = "Тек/макс ЗД (Smart)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "Текущее и максимальное здоровье, используемые параметры [curhp]/[maxhp], также отображается когда игрок умер или вышел из сети."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "Текущая и максимальная энергия, используемые параметры [curpp]/[maxpp]."
|
||||
L["Current health (Druid/Absolute)"] = "Текущее здоровье (друид/полная)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "Текущее здоровье, используется формат сокращения, 11500 отображается как 11.5k, значения ниже 10000 не форматируются."
|
||||
L["Current HP (Absolute)"] = "Текущее ЗД (полное)"
|
||||
L["Current HP (Short)"] = "Текущее ЗД (коротко)"
|
||||
L["Current power (Absolute)"] = "Текущая энергия (полная)"
|
||||
L["Current power (Druid)"] = "Текущая энергия (друид)"
|
||||
L["Current power (Druid/Absolute)"] = "Текущая энергия (друид/полная)"
|
||||
L["Current Power (Short)"] = "Текущая энергия (коротко)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "Текущая энергия, используется формат сокращения, 12750 отображается как 12.7k, значения ниже 10000 не форматируются."
|
||||
L["Dark"] = "Тёмный"
|
||||
L["Dead"] = "Труп"
|
||||
L["Debuffs"] = "Дебаффы"
|
||||
L["Decimal percent HP"] = "Десятичный процент ЗД"
|
||||
L["Deficit/Unit Name"] = "Нехватка/Имя"
|
||||
L["Delete"] = "Удалить"
|
||||
L["Delete filter"] = "Удалить фильтр"
|
||||
L["Descending"] = "Убывающий"
|
||||
L["Disabled"] = "Отключен"
|
||||
L["Disabled in %s"] = "Отключить в %s"
|
||||
L["Disable event discovery"] = "Отключить обнаружение собития"
|
||||
L["Disable vehicle swap"] = "Отключить смену на транспорт"
|
||||
L["DND"] = "ЗНТ"
|
||||
L["DND:%s"] = "ЗНТ:%s"
|
||||
L["Documentation"] = "Документация"
|
||||
L["Don't use a filter"] = "Не использовать фильтр"
|
||||
L["Down"] = "Вниз"
|
||||
L["Druid form"] = "Облик друида"
|
||||
L["Druid form (Short)"] = "Облик друида (коротко)"
|
||||
L["Druid mana bar"] = "Полоса маны друида"
|
||||
L["Dungeon role"] = "Роль в подземелье"
|
||||
L["Edge size"] = "Размер контура"
|
||||
L["Editing %s"] = "Правка %s"
|
||||
L["Edit tag"] = "Править тег"
|
||||
L["Elite"] = "Элита"
|
||||
L["Empty bar"] = "Пустая полоса"
|
||||
L["Enable buffs"] = "Включить баффы"
|
||||
L["Enable debuffs"] = "Включить дебаффы"
|
||||
L["Enabled in %s"] = "Включить в %s"
|
||||
L["Enabled units"] = "Включенные рамки"
|
||||
L["Enable frequent updates"] = "Включить частое обновление"
|
||||
L["Enable indicator"] = "Включить индекатор"
|
||||
L["Enable quick health"] = "Быстрое здоровье"
|
||||
L["Enable quick power"] = "Быстроая энергия"
|
||||
L["Enable %s"] = "Включить %s"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "Включает режим настройки, давая возможность двигать панели и показывая пример расположения панелей." -- Needs review
|
||||
L["Enable temporary enchants"] = "Временные улучшения/зачарования"
|
||||
L["Enable units"] = "Включить рамки"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "Включение расширенных настроек, даёт вам доступ к более продвинутым настройкам. (Для опытных пользователей)."
|
||||
L["Energy"] = "Энергия"
|
||||
L["Enlarge your auras"] = "Увеличить ваши ауры"
|
||||
L["Error"] = "Ошибка"
|
||||
L["Events"] = "События"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "События, которые должны использоваться, чтобы вызвать обновление этого тэга. Отделите каждое событие одиночным пробелом."
|
||||
L["Everywhere else"] = "Кто-то другой" -- Needs review
|
||||
L["Export"] = "Экспорт"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "Затемнение рамок игроков, которые находятся в не досягаемости от вас."
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "Не удалось загрузить ShadowedUF_Options, невозможно открыть настройки. Ошибка: %s"
|
||||
L["Female"] = "Жен."
|
||||
L["Filtering both buffs and debuffs"] = "Фильтрация баффов и дебаффов, вместе"
|
||||
L["Filtering buffs only"] = "Фильтрация только баффов"
|
||||
L["Filtering debuffs only"] = "Фильтрация только дебаффов"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "Отфильтровывает любые эффекты, которые вы не можете применить на другого игрока, или на себя."
|
||||
L["Filter out any auras that you did not cast yourself."] = "Отфильтровывает любые эффекты, которые вы не применяли самостоятельно."
|
||||
L["Filter out any aura that you cannot cure."] = "Отфильтровывает любые эффекты, которые вы не можете излечить."
|
||||
L["Filter type"] = "Тип фильтра"
|
||||
L["Finished cast"] = "Завершонное применение"
|
||||
L["Flight"] = "Летающая"
|
||||
L["Flips coloring so the bar color is shown as the background color and the background as the bar"] = "Перебросить цвета, тоесть цвет полосы будет отображаться как цвет фона, а фон как цвет полосы"
|
||||
L["Focus"] = "Фокус"
|
||||
L["Focus Target"] = "Цель фокуса"
|
||||
L["Font"] = "Шрифт"
|
||||
L["Forces a static color to be used for the background of all bars"] = "Применить использование статического цвета для фона во всех полосах"
|
||||
L["For target/focus"] = "Для цели/фокуса"
|
||||
L["Frame"] = "Рамка"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "Прозрачность рамки вне боя, когда у вас нету цели и значение маны или энергии 100%."
|
||||
L["Frame alpha while this unit is in combat."] = "Прозрачность рамки в бою."
|
||||
L["Frames"] = "Рамки"
|
||||
L["Friendly"] = "Дружелюбные"
|
||||
L["Friendly spell"] = "Дружественное заклинание"
|
||||
L["Fuel"] = "Топливо"
|
||||
L["Full size after"] = "Полный размер после"
|
||||
L["Full size before"] = "Полный размер до"
|
||||
L["General"] = "Общее"
|
||||
L["General configuration to all enabled units."] = "Основные настройки для всех включенных объектов."
|
||||
L["General threat situation"] = "Состояние общей угрозы"
|
||||
L["Ghost"] = "Призрак"
|
||||
L["Global"] = "Основное"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "Золотая галочка - включено в этой зоне / Серая галочка - отключено в эетой зоне / Нет галочки - использовать стандартные настройки"
|
||||
L["Group by"] = "Групировать по"
|
||||
L["Group %d"] = "Группа %d"
|
||||
L["Group number"] = "Номер группы"
|
||||
L["Group row spacing"] = "Промежуток групп"
|
||||
L["Groups"] = "Группы"
|
||||
L["Groups per row"] = "Групп в ряду"
|
||||
L["Groups to show"] = "Показ групп"
|
||||
L["Growth"] = "Возрастание"
|
||||
L["Guild name"] = "Гильдия"
|
||||
L["Half health"] = "Половина здоровья"
|
||||
L["Happiness"] = "Настроение"
|
||||
L["Health"] = "Здоровье"
|
||||
L["Health bar"] = "Полосы здоровья"
|
||||
L["Health bar color for friendly units."] = "Цвет полосы здоровья дружелюбных существ/игроков."
|
||||
L["Health bar color for hostile units."] = "Цвет полосы здоровья враждебныых существ/игроков."
|
||||
L["Health bar color for neutral units."] = "Цвет полосы здоровья равнодушных существ/игроков."
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "Используемый цвет полосы здоровья для враждебных существ/игроков которых вы не можете атаковать, используемое отображение окраски реакции цели."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "Дополнительный цвет(полоса) на полосе здоровья покажыт, входящее исцеление, т.е. на сколько будет исцелен объект."
|
||||
L["Health color"] = "Цвет здоровья"
|
||||
L["Health percent"] = "Процент здоровья"
|
||||
L["Height"] = "Высота"
|
||||
L["Help"] = "Справка"
|
||||
L["Hide bar when empty"] = "Скрыть полосу когда она пуста"
|
||||
L["Hide Blizzard"] = "Hide Blizzard"
|
||||
L["Hide in 6-man raid"] = "Скрыть в рейде из 6-чел"
|
||||
L["Hide in any raid"] = "Скрыть в любом рейде"
|
||||
L["Hide %s"] = "Скрыть %s"
|
||||
L["Hide %s frames"] = "Скрыть рамки %s"
|
||||
L["Hides the cast bar if there is no cast active."] = "Скрывает полосу заклинаний, если нет активного применения заклинания."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "Скрывает время восстановления для всех эффектов, которые вы не применяли."
|
||||
L["Hide tooltips in combat"] = "Скрыть подсказки в бою"
|
||||
L["High"] = "Высокий"
|
||||
L["High health"] = "Много здоровья"
|
||||
L["Highlight"] = "Подсветка"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "Подсвечивать игрока, который паражен отрицательным эффектом который вы можете излечить/рассеять."
|
||||
L["Highlight units that have aggro on any mob."] = "Подсвечивать игрока, на которому угрожает любое существо."
|
||||
L["Highlight units that you are targeting or have focused."] = "Подсвечивать игрока/существо, на которое вы нацелились или взяли в фокус."
|
||||
L["Highlight units when you mouse over them."] = "Подсвечивать игрока, когды вы наводите курсор мыши на него."
|
||||
L["Hostile"] = "Враждебные"
|
||||
L["Hostile spell"] = "Вражеское заклинание"
|
||||
L["How close the frame should clip with the border."] = "Установка срезания от края рамки."
|
||||
L["How far the background should be from the unit frame border."] = "Установка расстояния фона в зависимости от границы рамок."
|
||||
L["How large the background should tile"] = "Изменение размера мазайки фона."
|
||||
L["How large the edges should be."] = "Изменение размера контура."
|
||||
L["How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."] = "Сколько должно отображаться аура в колонке."
|
||||
L["How many auras to show in a single row."] = "Сколько показывать аур в одном ряду."
|
||||
L["How many groups should be shown per row."] = "Сколько групп будут отображаться в одном ряду."
|
||||
L["How many rows total should be used, rows will be however long the per row value is set at."] = "Сколько должно использоваться рядов в общем количестве, все ряды будут одинаковой длины которая установлена в соответствующих опциях."
|
||||
L["How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."] = "Общая высота этой полосы в ремке, это взвешенное значение, чем больше значение тем больше она будет."
|
||||
L["How much spacing should be between each new row of groups."] = "Промежуток между каждым новым рядом группы."
|
||||
L["How much weight this should use when figuring out the total text width."] = "Используемое значение, которое определяется от общей ширины текста."
|
||||
L["How the frames should grow when a new column is added."] = "Установка возрастания рамок, при добавлении новой колонки."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "Установка расположения аур на рамке."
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "Если объект является игроком то будет выводиться его класс, если же НИП, то его тип."
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "Если объект является игроком то будет выводиться его раса, если же НИП, то его тип."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "Если вы применили ауру, то её значок будет увеличен в размере, что сделает её более заметной."
|
||||
L["Import"] = "Импорт"
|
||||
L["Import non-standard module settings"] = "Импорт не-стандартных настроек модуля"
|
||||
L["Import unit frame positions"] = "Импорт расмещения рамок"
|
||||
L["Import visibility settings"] = "Импорт настроек отображения"
|
||||
L["Inactive alpha"] = "Прозрачность в бездействии"
|
||||
L["Incoming heal"] = "Входящее исцеление"
|
||||
L["Incoming heal/Name"] = "Входящее исцеление/назв."
|
||||
L["Incoming heals"] = "Входящие исцеления"
|
||||
L["Incoming heal (Short)"] = "Входящее исцеление (коротко)"
|
||||
L["Index"] = "Индекс"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "Индикатор настроения вашего питомца, применимо только для охотников."
|
||||
L["Indicators"] = "Индикаторы"
|
||||
L["In range alpha"] = "Прозрачность в досягаемости"
|
||||
L["Inside Center"] = "Внутри по центру"
|
||||
L["Inside Center Left"] = "Внутри по центру слева"
|
||||
L["Inside Center Right"] = "Внутри по центру справа"
|
||||
L["Inside Top Left"] = "Внутри вверху слева"
|
||||
L["Inside Top Right"] = "Внутри верху справа"
|
||||
L["Interrupted"] = "Прервано"
|
||||
L["Invalid interval entered, must be a number."] = "Введен неправильный интервал, это должно быть число."
|
||||
L["Invalid spell \"%s\" entered."] = "Введено неверное заклинание \"%s\"."
|
||||
L["Invert colors"] = "Инверсия цветов"
|
||||
L["Layout manager"] = "Управление вёрской"
|
||||
L["Leader"] = "Лидер"
|
||||
L["Left"] = "Слева"
|
||||
L["Left Bottom"] = "Слева внизу"
|
||||
L["Left Center"] = "Слева по центру"
|
||||
L["Left text"] = "Текст слева"
|
||||
L["Left Top"] = "Слева вверху"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "Позволяет изменить базовый размер шрифта либо сделать его больше либо меньше."
|
||||
L["Level"] = "Уровень"
|
||||
L["Level (Colored)"] = "Уровень (Окрашен)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "Уровень %s - %s: %s/%s (%.2f%% готово)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "Уровень %s - %s: %s/%s (%.2f%% готово), %s отдыха."
|
||||
L["Level without any coloring."] = "Уровень без окраски."
|
||||
L["Lock frames"] = "Закрепить рамки"
|
||||
L["Locks the unit frame positionings hiding the mover boxes."] = "Закрепить рамки и скрыть перемещаемые области."
|
||||
L["Low health"] = "Мало здоровья"
|
||||
L["Main Assist"] = "Наводчик"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "Наводчики установлены стандартной Blizzard системой наводчиков или модификациями такими как oRA3."
|
||||
L["Main Assist Target"] = "Цель наводчика"
|
||||
L["Main Tank"] = "Главный танк"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "Главные танки установлены стандартной Blizzard системой главных танков или модификациями такими как oRA3."
|
||||
L["Main Tank Target"] = "Цель главного танка"
|
||||
L["Male"] = "Муж."
|
||||
L["Mana"] = "Мана"
|
||||
L["Manage aura filters"] = "Управление фильтрами аур"
|
||||
L["Management"] = "Управление"
|
||||
L["Manual position"] = "Указать позицию"
|
||||
L["Master looter"] = "Ответственный за добычу"
|
||||
L["Max columns"] = "Макс колонок"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "Макс здоровья, используется формат сокращения, 17750 отображается как 17.7k, значения ниже 10000 не форматируются."
|
||||
L["Max HP (Absolute)"] = "Макс ЗД (полное)"
|
||||
L["Max HP (Short)"] = "Макс ЗД (коротко)"
|
||||
L["Max power (Absolute)"] = "Макс энергии (полное)"
|
||||
L["Max power (Short)"] = "Макс энергии (коротко)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "Макс энергии, используется формат сокращения, 16000 отображается как 16k, vзначения ниже 10000 не форматируются."
|
||||
L["Max rows"] = "Макс рядов"
|
||||
L["Medium"] = "Среднее"
|
||||
L["Miscellaneous"] = "Разное"
|
||||
L["Missing HP (Short)"] = "Нехват ЗД (коротко)"
|
||||
L["Missing power (Short)"] = "Нехват энергии (коротко)"
|
||||
L["Moonkin"] = "Совух"
|
||||
L["Name"] = "Название"
|
||||
L["Name (Abbreviated)"] = "Название (сокр.)"
|
||||
L["Neutral"] = "Нейтральный"
|
||||
L["Never (Disabled)"] = "Никогда (откл.)"
|
||||
L["New filter"] = "Новый фильтр"
|
||||
L["None"] = "Нету"
|
||||
L["NPCs only"] = "Только НИПы"
|
||||
L["Offline"] = "Вышел из сети"
|
||||
L["Offline timer"] = "Таймер выхода из сети"
|
||||
L["Off:%s"] = "Вышел:%s"
|
||||
L["On aggro"] = "При угрозе"
|
||||
L["On curable debuff"] = "При излечимом дебаффе"
|
||||
L["On mouseover"] = "При наводе курсора"
|
||||
L["Order"] = "Порядок"
|
||||
L["Or you can set a position manually"] = "Или же вы можете установить позицию вручную."
|
||||
L["Outline"] = "Контур"
|
||||
L["Out of range alpha"] = "Прозрачность в не досягаемости"
|
||||
L["Outside bar limit"] = "Предел внешней полосы"
|
||||
L["Override color"] = "Замещение цвета"
|
||||
L["Party"] = "Группа"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "Рамки группы будут скрыты, независимо от количества участников в рейде."
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "Рамки группы будут скрыты, если в рейде больше 5 человек."
|
||||
L["Party instances"] = "Групповые подземелья"
|
||||
L["Party Pet"] = "Питомиц группы"
|
||||
L["Party Target"] = "Цель группы"
|
||||
L["Percentage of width the portrait should use."] = "Ширина портрета в процентах."
|
||||
L["Percent HP"] = "Процент ЗД"
|
||||
L["Percent power"] = "Процент энергии"
|
||||
L["Per column"] = "В колонке"
|
||||
L["Per row"] = "В ряду"
|
||||
L["Pet"] = "Питомец"
|
||||
L["Pet Target"] = "Цель питомца"
|
||||
L["Player"] = "Игрок"
|
||||
L["player cast bar"] = "панель применений игрока"
|
||||
L["Players only"] = "Только игроки"
|
||||
L["Players will be colored by class, "] = "Игроки будут окрашены по классу,"
|
||||
L["Player threat"] = "Угроза игрока"
|
||||
L["Point"] = "Точка"
|
||||
L["Portrait"] = "Портрет"
|
||||
L["Portrait type"] = "Тип портрета"
|
||||
L["Position"] = "Позиция"
|
||||
L["Power"] = "Энергия"
|
||||
L["Power bar"] = "Полоса энергии"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "Предотвращает отображение подсказкок во время боя."
|
||||
L["Prioritize buffs"] = "Приоритеты баффам"
|
||||
L["Programming in Lua"] = "Программирование в Lua"
|
||||
L["PvP Flag"] = "Знак PvP"
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "Таймер PVP"
|
||||
L["Race"] = "Раса"
|
||||
L["Race (Smart)"] = "Раса (Smart)"
|
||||
L["Rage"] = "Ярость"
|
||||
L["Raid"] = "Рейд"
|
||||
L["Raid instances"] = "Рейдовые подземелья"
|
||||
L["Raid pet"] = "Питомец рейда"
|
||||
L["Raid role"] = "Роль в рейде"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "Индикатор роли, добавляет индикатор щита для основного танка и меч для наводчика."
|
||||
L["Raid target"] = "Цель рейда"
|
||||
L["Raid target indicator."] = "Индикатор цели рейда"
|
||||
L["Raid targeting unit"] = "Мишень рейда"
|
||||
L["Range indicator"] = "Индикатор ярости"
|
||||
L["Rank 1"] = "Уровень 1"
|
||||
L["Rare"] = "Редкий"
|
||||
L["Rare Elite"] = "Редкий Элита"
|
||||
L["Rare indicator"] = "Индикатор редкого"
|
||||
L["Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."] = "Код окраски реакции, используйте [reactcolor][name][close] для окраски имени игрока/существа в соответствии с его реакцией к вам."
|
||||
L["Reaction color tag"] = "Тег цвета реакции"
|
||||
L["Ready status"] = "Статус готовности"
|
||||
L["Ready status of group members."] = "Статус готовности участников группы."
|
||||
L["Relative point"] = "Относительно точке"
|
||||
L["Resources"] = "Ресурсы"
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "Выводит текущее значение здоровья в процентах, если существо/игрок умер или вышел из сети, тогда вместо процента будет отображаться труп или вышел из сети."
|
||||
L["Returns current power as a percentage."] = "Выводит текущее значение энергии в процентах."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "Выводит + , если объект является существом элитным или редкой элитой."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "Выводит Редкий если объект является существом редким или редкой элитой."
|
||||
L["Returns the units sex."] = "Отображает пол игрока/существа."
|
||||
L["Right"] = "Справа"
|
||||
L["Right Bottom"] = "Справа внизу"
|
||||
L["Right Center"] = "Справа по центру"
|
||||
L["Right text"] = "Текст справа"
|
||||
L["Right Top"] = "Справа верху"
|
||||
L["Row growth"] = "Возрастание ряда"
|
||||
L["Row offset"] = "Смещение ряда"
|
||||
L["rune bar"] = "панель рун"
|
||||
L["Rune bar"] = "Полоса рун"
|
||||
L["Runic Power"] = "Сила рун"
|
||||
L["Scale"] = "Масштаб"
|
||||
L["Scaled threat percent"] = "Нормированный % угрозы"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "Масштаб применяемых вами аур. Любое значение выше 100%, является больше чем стандартное, а любое значение ниже 100%, является меньше чем стандартное."
|
||||
L["Screen"] = "Экран"
|
||||
L["Search"] = "Поиск"
|
||||
L["Search tags"] = "Поиск тегов"
|
||||
L["Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."] = "Выберите текст из панели с лева для его изменения. Используйте эту страницу чтобы установить теги, изменить/сократить их ширину и размер."
|
||||
L["Self aura size"] = "Размер своих аур"
|
||||
L["Separate raid frames"] = "Разделять рамки рейда"
|
||||
L["Set filter zones"] = "Фильтр зон"
|
||||
L["Sex"] = "Пол"
|
||||
L["%s frames"] = "%s фреймы"
|
||||
L["Short classification"] = "Коротко-классификация"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "Сокращение классификации, Редкий - R, Редкий Элита - R+, Элита - +, Босс - B, если у существа нету классификации, то ничего отображаться не будет."
|
||||
L["Short elite indicator"] = "Коротко-индикатор элиты"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "Сокращение значения входящего исцеления, если входит 13,000 исцеления то покажет как 13k."
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "Сокращенная версия [druidform], C = кошка, B = медведь, F = летающий и т.д."
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "Показать фон за полосой с одинаковой текстурой/цветом, но постепенно исчезающий."
|
||||
L["Show as bar"] = "Показать как полосу"
|
||||
L["Show background"] = "Показать фон"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "Показать баффы раньше дебаффов, когда и те и другие используют одну и туже привязку (месторасположение)."
|
||||
L["Show castable on other auras only"] = "Показывать только применяемые ауры другими"
|
||||
L["Show cast name"] = "Показать название"
|
||||
L["Show cast rank"] = "Показать уровень"
|
||||
L["Show cast time"] = "Показать время"
|
||||
L["Show curable only"] = "Показать только излечимые"
|
||||
L["Show party as raid"] = "Показать группу как рейд"
|
||||
L["Show player in party"] = "Показать игрока в группе"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "Показывать метки \"Отсутствует\" или \"Не беспокоить\"."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "Отображает текущее и максимальное значение здоровья, 17500 здоровья будут отображаться как 17500 здоровья."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "Отображает текущее и максимальное значение энергии, 18000 энергии будут отображаться как 18000 энергии."
|
||||
L["Shows current group number of the unit."] = "Показывает текущий номер группы игрока."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "Отображает текущее значение здоровья в чистой форме, т.е. 15000 здоровья будет отображаться как 15000."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "Отображает текущее значение энергии в чистой форме, т.е. 15000 энергии будет отображаться как 15000."
|
||||
L["Shows how long an unit has been AFK or DND."] = "Показывает как долго игрок отсутствует или помечен статусом \"не беспокоить\"."
|
||||
L["Shows how long an unit has been offline."] = "Показывает как долго игрок находится вне сети."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "Отображает максимальное значение здоровья в чистой форме, 14000 здоровья будет отображаться как 14000 здоровья."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "Отображает максимальное значение энергии в чистой форме, 13000 энергии будет отображаться как 13000 энергии."
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "Показывает состояние игрока/существа, труп, призрак, вышел из сети. Остаётся пустым если нету активного состояния."
|
||||
L["Show's the units guild name if they are in a guild."] = "Показывает название гильдии игрока если он состоит в ней."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "Показывает здоровье в процентах с округлением до первого десятичного числа, то есть 61 из 110 здоровья будет показано как 55,4%."
|
||||
L["Show your auras only"] = "Показать только ваши ауры"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "Обычная фильтрация аур с черным списком и белым."
|
||||
L["Size"] = "Размер"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "Разумное отображение уровеня, выводит Босс для боссов, +50 для элитных существ 50 уровня, или просто 80 для 80 уровня."
|
||||
L["%s member"] = "%s участник"
|
||||
L["Sorting"] = "Сортировка"
|
||||
L["Sort method"] = "Способ сортировки"
|
||||
L["Sort order"] = "Порядок сортировки"
|
||||
L["Spacing"] = "Промежуток"
|
||||
L["Spacing between each row"] = "Промежуток между рядами"
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (%.2f%% готово)"
|
||||
L["Static"] = "Статический"
|
||||
L["Status"] = "Статус"
|
||||
L["Style of borders to show for all auras."] = "Стиль границ, отображаемый на всех аурах."
|
||||
L["Tag list"] = "Список тегов"
|
||||
L["Tag name"] = "Название тега"
|
||||
L["Tags"] = "Теги"
|
||||
L["Target"] = "Цель"
|
||||
L["Target of Target"] = "Цель цели"
|
||||
L["Target of Target of Target"] = "Цель цели цели"
|
||||
L["Temporary enchants"] = "Временные усиления/чары"
|
||||
L["Test Aura"] = "Тест аур"
|
||||
L["Test spell"] = "тест заклинания"
|
||||
L["Text"] = "Текст"
|
||||
L["Text management"] = "Управление текстом"
|
||||
L["Text name"] = "Название текста"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "Названия текста, которые поможет идентифицировать его среди других во время настройки."
|
||||
L["Text parent"] = "Родитель текста"
|
||||
L["Text/Tags"] = "Текст/Теги"
|
||||
L["The blacklist \"%s\" already exists."] = "Черный список \"%s\", уже существует."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "Отмечая блоки ниже вы сможете отключить или включить объекты."
|
||||
L["The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."] = "Рамка игрока, невзирая ни на что, не будет скрыта, вам придется вручную отключить ей полностью или в типах зон."
|
||||
L["The tag \"%s\" already exists."] = "Тег \"%s\", уже существует."
|
||||
L["The whitelist \"%s\" already exists."] = "Рекомендательный список \"%s\", уже существует."
|
||||
L["Thick outline"] = "Толстый контур"
|
||||
L["Thin outline"] = "Тонкий контур"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "Эта полоса автоматически скроется, когда вы достигнете максимального уровня или у вас не будет никакой отслеживаемой репутаций."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "Фильтр не имеет аур, вы можете добавить их используя поле ввода вверху."
|
||||
L["This filter has no aura types set to filter out."] = "Фильтр не имеет установленных типов аур для фильтрования."
|
||||
L["This is a good guide on how to get started with programming in Lua, while you do not need to read the entire thing it is a helpful for understanding the basics of Lua syntax and API's."] = "Это хорошее руководство о том, как начать работу с программированием в Lua, вам не обязательно читать все, руководство является полезным для понимания основ синтаксиса Lua и API."
|
||||
L["This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."] = "Это отключит автоматическое обнаружение события, которое будет необходимо для тега, не отмечайте это, если вы не знаете, что вы делаете."
|
||||
L["This will override all background colorings for bars including custom set ones."] = "Включение этой опции, заменит все цвета фона для полос, включая пользовательские."
|
||||
L["Threat"] = "Угроза"
|
||||
L["Threat situation"] = "Состояние угрозы"
|
||||
L["Tile size"] = "Размер мазайки"
|
||||
L["Timers for self auras only"] = "Таймеры только для ваших аур"
|
||||
L["Top"] = "Сверху"
|
||||
L["Top Center"] = "Сверху по центру"
|
||||
L["Top Left"] = "Сверху слева"
|
||||
L["Top Right"] = "Сверху справа"
|
||||
L["Total number of combo points you have on your target."] = "Всего накопившихся приёмов в серии на текущей цели."
|
||||
L["Totem bar"] = "Полоса тотемов"
|
||||
L["Travel"] = "Походный"
|
||||
L["Tree"] = "Дерево"
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "Переключает данный виджет в полосу, которая может быть изменена в размерах и упорядочена как полоса здоровья или энергии."
|
||||
L["Unattackable hostile"] = "Неатакуемые враждебные"
|
||||
L["Unit colored situation"] = "Ситуация окраски объекта"
|
||||
L["Unit configuration"] = "Настройка объекта"
|
||||
L["Unit faction"] = "Фракция объекта"
|
||||
L["Unit name"] = "Имя объекта"
|
||||
L["Unit name (Class colored)"] = "Имя объекта (окраска класса)"
|
||||
L["Unit name colored by class."] = "Окраска названия/имени игрока/существа в соответствии с цветом его класса."
|
||||
L["Units"] = "Рамки"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "Принадлежность игрока/существа, Тралл будет отображаться как Орда, Магни Бронзобород как Альянс."
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "Классификация игрока/существа, Редкий, Редкий Элита, Элита, Босс. Остаётся пустым, если существо не принадлежить какой-либо классификации."
|
||||
L["Unit server"] = "Сервер объекта"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "Сервер объекта, если он с вашего сервера, тогда ничего не будет выводится."
|
||||
L["Unit situation name"] = "Название ситуации объекта"
|
||||
L["Units per column"] = "Рамок в колонке"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "Расса игрока/существа, Кровавый Эльф, Ночной Эльф и т.д."
|
||||
L["Unlink frames"] = "Разъединить рамки"
|
||||
L["Up"] = "Вверху"
|
||||
L["Update interval"] = "Интервал обновления"
|
||||
L["Using unit settings"] = "Использование настроек рамок"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "На этой странице можно включить / выключить различные рамки, такие как рейд или цели группы."
|
||||
L["Vehicle"] = "Транспорт"
|
||||
L["Vehicles"] = "Транспорт"
|
||||
L["View"] = "Просмотр"
|
||||
L["Visibility"] = "Отображение"
|
||||
L["WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."] = "Предупреждение: This will unlink all frames from each other so you can move them without another frame moving with it."
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "Когда игрок/существо теряет здоровье, отображается тег [missinghp], когда значение здоровье максимальное тогда отображается тег [name]. Это позволит вам увидеть -1000 при потере 1000 очков здоровья."
|
||||
L["When this filter is active, apply the filter to buffs."] = "Когда данный фильтр активен, применяется фильтрация баффов."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "Когда данный фильтр активен, применяется фильтрация дебаффов."
|
||||
L["Where inside the frame the text should be anchored to."] = "В каком месте, внутри рамки, должно быть расположен текст."
|
||||
L["Where to anchor the cast name text."] = "Установка расположение текста названия применения."
|
||||
L["Where to anchor the cast time text."] = "Установка расположение текста времени применения."
|
||||
L["Whitelist"] = "Белый список"
|
||||
L["Whitelist filters"] = "Фильтры рекомендательного списка"
|
||||
L["Whitelists"] = "Белые списки"
|
||||
L["Widget size"] = "Размер виджета"
|
||||
L["Width"] = "Ширина"
|
||||
L["Width percent"] = "Ширина в %"
|
||||
L["Width weight"] = "Ширина"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "Настройки модулей которые не входят в состав Shadowed Unit Frames по умолчанию НЕ будут импортироваться."
|
||||
L["Wondering what all of the tabs for the unit configuration mean? Here's some information:|n|n|cfffed000General:|r Portrait, range checker, combat fader, border highlighting|n|cfffed000Frame:|r Unit positioning and frame anchoring|n|cfffed000Bars:|r Health, power, empty and cast bar, and combo point configuration|n|cfffed000Widget size:|r All bar and portrait sizing and ordering options|n|cfffed000Auras:|r All aura configuration for enabling/disabling/enlarging self/etc|n|cfffed000Indicators:|r All indicator configuration|n|cfffed000Text/Tags:|r Tag management as well as text positioning and width settings.|n|n|n*** Frequently looked for options ***|n|n|cfffed000Raid frames by group|r - Unit configuration -> Raid -> Raid -> Separate raid frames|n|cfffed000Class coloring:|r Bars -> Color health by|n|cfffed000Timers on auras:|r You need OmniCC for that|n|cfffed000Showing/Hiding default buff frames:|r Hide Blizzard -> Hide buff frames|n|cfffed000Percentage HP/MP text:|r Tags/Text tab, use the [percenthp] or [percentpp] tags|n|cfffed000Hiding party based on raid|r - Unit configuration -> Party -> Party -> Hide in 6-man raid/Hide in any raid"] = "Хотите знать, что это за вкладки и что в них настраивается? Коротко о них:|n|n|cfffed000Общее:|r Портреты, проверка досягаемости, затухание в бою, подсветка границ|n|cfffed000Рамка:|r Расположение объекта и привязка рамок|n|cfffed000Полосы:|r Настройка полос здоровье, энергие, пустых полос, полос заклинаний и приемов в серии|n|cfffed000Размер виджета:|r Настройка размеров всех полос и портретов а так-же их порядка|n|cfffed000Ауры:|r Настройка аур. Включение/отключение и так делее|n|cfffed000Индикаторы:|r Настройка всех индикаторов|n|cfffed000Текст/Теги:|r Управление тегами, позиционирование текста и настройка ширины.|n|n|cfffed000Рамки рейда по группам|r - Настройка объекта -> Рейд -> Рейд -> Разделять рамки рейда|n|n|n*** Популярные настройки ***|n|n|cfffed000Окраска по классу:|r Полосы -> Цвет здоровья по|n|cfffed000Таймеры на аурах:|r Для этого вам нужен OmniCC|n|cfffed000Отображение стандартной облости баффов:|r Hide Blizzard -> Снемите галку с Скрыть область баффов|n|cfffed000Процентное значение ЗД/М:|r Вкладка Текст/теги, используйте теги [percenthp] или [percentpp]|n|cfffed000Сокрытие группы в рейде|r - Настройка объекта -> Группа -> Группа -> Скрыть в рейде из 6-чел/Скрыть в любом рейде"
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "Работает как и %s, но будет отображаться только тогда когда игрок находиться в облике кошки или медведя."
|
||||
L["WoW Programming"] = "WoW программирование"
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WoW программирование - отличный ресурс, где можно узнать о различных функциях API."
|
||||
L["X Offset"] = "Смещение по X"
|
||||
L["XP/Rep bar"] = "Индикатор опыта/реп."
|
||||
L["Y Offset"] = "Смещение по Y"
|
||||
L["You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."] = "На этой странице вы можете добавить новые пользовательские теги, а также изменить существующие."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "Вы можете найти более подробную информацию о создании собственных пользовательских тегов в вкладке \"Справка \"."
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "Вы не можете изменить этот тег, поскольку он является одним из входящих по умолчанию в состав кода данного аддона. Эта функция здесь, служить примером для вас, в создании пользовательских тегов."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "Вы не можете задать тегу название \"%s\", назване тега не должно содержать символы или скобки."
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "Вы можете установить, к каким рамкам, и какой, следует использовать фильтр группы и в каком типе зоны, если вы хотите изменить ауры, перейдите в ту группу и увидете опцию \"Управление группами аур\"."
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "У вас нет фильтров такого типа, вам нужно создать хоть один в панели управления, до жтого эта страница вам безполезна."
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "Вы должны установить события для срабатывания, вы можете ввести только буквы и символы подчёркивания. К примеру: \"FOO_BAR \" действителен, \"APPLE_5_ORANGE \" нет, потому что оно содержит число."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "Вы должны ввести число 0 и выше, отрицательные цифры не допускается."
|
||||
L["You must enter a tag name."] = "Вы должны ввести название тега."
|
||||
L["You must wrap your code in a function."] = "Вы должны обернуть свой код в функцию."
|
||||
L["Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."] = "Ваша активная вёрстка - это профиль используемый для резервного копирования импорта, и он не может быть перезаписан при импорте. Измените свой профиль на какой-нибудь другой, и попробуйте еще раз."
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "Вам нужно создать фильтр аур, прежде чем установить рамку, к которой будет применяться фильтрация аур."
|
||||
L["Zone configuration"] = "Настройка зон"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,671 @@
|
||||
if( GetLocale() ~= "zhCN" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "缩写超过10个单词的头像名字, \"Dark Rune Champion\" 缩写为 \"D.R.Champion\" 或 \"Dark Rune Commoner\" 缩写为 \"D.R.Commoner\"."
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "精确显示接受治疗的治疗量, 如 10,000 治疗量显示为 10,000."
|
||||
L["Add"] = "增加"
|
||||
L["Add new tag"] = "增加新的标签"
|
||||
L["Add new text"] = "增加新的文字"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "在你的食尸鬼计时器上增加一个计时条指示器, 仅用于一个非永久性的食尸鬼."
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "在生命条里增加一个计量条显示接受治疗的预估值."
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "增加一个可以放置文本的空的计量条."
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "当你在熊或猫形态下时在玩家头像上增加一个额外的法力条."
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "在符文刷新之前增加符文条和计时器到玩家头像框体."
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "增加 %s 到头像列表,你可以在这个选项卡里修改参数值。"
|
||||
L["Adds temporary enchants to the buffs for the player."] = "为玩家的Buff增加临时附魔."
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "在到期之前增加带有计时器的图腾条到玩家头像框体."
|
||||
L["Add tags"] = "增加标签"
|
||||
L["Advanced"] = "高级"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "高级标签管理, 允许你添加自定义的标签."
|
||||
L["AFK"] = "AFG"
|
||||
L["AFK:%s"] = "AFK:%s"
|
||||
L["AFK status"] = "AFK 状态"
|
||||
L["AFK timer"] = "AFK 计时器"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "你点击输出后, 你可以复制下面的代码给其他ShadowedUF用户来使用你的布局方式."
|
||||
L["Aggro"] = "获得仇恨"
|
||||
L["Allows you to anchor the aura group to another, you can then choose where it will be anchored using the position.|n|nUse this if you want to duplicate the default ui style where buffs and debuffs are separate groups."] = "允许你定位锚点光环组到另一个, 然后可以选择要使用的锚点位置.|n|n你可以使用这个来复制那些在Buff和Debuff在不同分组的默认UI样式."
|
||||
L["Alpha to use for bar."] = "计量条要使用的透明度."
|
||||
L["Alpha to use for bar backgrounds."] = "计量条背景所使用的透明度."
|
||||
L["Ammo"] = "弹药"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "缺损生命值的总数, 如果没有缺损则不会显示。使用一个短的格式, -18500 显示为 -18.5k, 低于 10000 的生命值则不会被格式化。"
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "缺损能力值的总数, 如果没有缺损则不会显示。使用一个短的格式, -13850 显示为 13.8k, 低于 10000 的能力值则不会被格式化。"
|
||||
L["Anchor point"] = "锚点"
|
||||
L["Anchor to"] = "锚点定位到"
|
||||
L["Anchor to another frame"] = "定位到其他框体"
|
||||
L["Anchor to buffs"] = "锚点定位到Buff"
|
||||
L["Anchor to debuffs"] = "锚点定位到Debuff"
|
||||
L["Aquatic"] = "水栖"
|
||||
L["Arena"] = "竞技场"
|
||||
L["Arena Pet"] = "竞技场宠物"
|
||||
L["Arenas"] = "竞技场"
|
||||
L["Arena Target"] = "竞技场目标"
|
||||
L["Are you sure you want to delete this filter?"] = "你是否确定删除这个过滤器?"
|
||||
L["Are you sure you want to delete this tag?"] = "你是否确定删除这个标签?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "你是否确定删除这个文字? 有关这个的所有设置将被删除"
|
||||
L["Ascending"] = "上升"
|
||||
L["Aura border style"] = "光环边框样式"
|
||||
L["Aura filters"] = "光环过滤器"
|
||||
L["Aura name"] = "光环名字"
|
||||
L["Auras"] = "光环"
|
||||
L["Aura types to filter"] = "要过滤的光环类型"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "背景"
|
||||
L["Background alpha"] = "背景透明度"
|
||||
L["Background/border"] = "背景/边框"
|
||||
L["Background color"] = "背景颜色"
|
||||
L["Bag indicator for master looters."] = "主拾取的背包指示器."
|
||||
L["Bar alpha"] = "计量条透明度"
|
||||
L["Bars"] = "计量条"
|
||||
L["Bar spacing"] = "计量条间距"
|
||||
L["Bar texture"] = "背景材质"
|
||||
L["Battlegrounds"] = "战场"
|
||||
L["Bear"] = "熊"
|
||||
L["Blacklist"] = "黑名单"
|
||||
L["Blacklist filters"] = "黑名单过滤器"
|
||||
L["Blacklists"] = "黑名单"
|
||||
L["Blizzard"] = "暴雪"
|
||||
L["Border"] = "边框"
|
||||
L["Border alpha"] = "边框透明度"
|
||||
L["Border color"] = "边框颜色"
|
||||
L["Border highlighting"] = "边框高亮"
|
||||
L["Border thickness"] = "边框厚度"
|
||||
L["Boss"] = "首领"
|
||||
L["Boss Target"] = "首领目标"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "首领单位仅作为某些战斗情况,如鲜血议会或炮艇大战,你不会在每个首领战看到他们。"
|
||||
L["Both"] = "全部"
|
||||
L["Bottom"] = "底部"
|
||||
L["Bottom Center"] = "底部居中"
|
||||
L["Bottom Left"] = "底部左边"
|
||||
L["Bottom Right"] = "底部右边"
|
||||
L["buff frames"] = "buff 框体"
|
||||
L["Buffs"] = "Buff"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "不能找到名为\" %s\"的配置文件."
|
||||
L["Cast"] = "施法"
|
||||
L["Cast bar"] = "施法条"
|
||||
L["Cast icon"] = "施法图标"
|
||||
L["Casting"] = "施法中"
|
||||
L["Cast interrupted"] = "施法打断"
|
||||
L["Cast name"] = "施法名"
|
||||
L["Cast time"] = "施法时间"
|
||||
L["Cast uninterruptible"] = "施法不可打断"
|
||||
L["Cat"] = "猫"
|
||||
L["Category"] = "分类"
|
||||
L["Center"] = "居中"
|
||||
L["Changed profile to %s."] = "修改配置文件到 %s."
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "当单位获得仇恨时改变生命条颜色为敌对颜色 (默认为红色)."
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "修改这个小组件为计量条, 你可以像修改生命条和能力条一样修改高度和顺序."
|
||||
L["Channelling"] = "通道法术"
|
||||
L["Child units cannot be dragged, you will have to reposition them through /shadowuf."] = "子单位不能被拖动, 你必须通过 /shadowuf 来重新定位."
|
||||
L["Class"] = "职业"
|
||||
L["Class color tag"] = "职业颜色标签"
|
||||
L["Classes"] = "职业"
|
||||
L["Class icon"] = "职业图标"
|
||||
L["Classificaiton"] = "职业类别"
|
||||
L["Classifications"] = "职业类别"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "职业未着色的名字, 如果你想按职业着色名字请使用 [classcolor][class][close] ."
|
||||
L["Class (Smart)"] = "职业 (简洁)"
|
||||
L["Clip"] = "内间距"
|
||||
L["Close color"] = "关闭颜色"
|
||||
L["Closes a color code, prevents colors from showing up on text that you do not want it to."] = "关闭一个颜色代码,阻止那些你不想要的显示在文字上的颜色。"
|
||||
L["Code"] = "代码"
|
||||
L["Color by class"] = "按职业着色"
|
||||
L["Color by happiness"] = "按快乐值着色"
|
||||
L["Color by reaction on"] = "按反应类型着色"
|
||||
L["Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."] = "按单位的剩余生命值百分比着色代码."
|
||||
L["Color code for general situation"] = "一般情况下的着色代码"
|
||||
L["Color code for situation"] = "某些情况下的着色代码"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "按职业着色代码, 使用 [classcolor][class][close] 如果你想按职业着色职业文字"
|
||||
L["Color code on aggro"] = "获得仇恨的着色代码"
|
||||
L["Color health by"] = "着色血量按"
|
||||
L["Color on aggro"] = "着色获得仇恨"
|
||||
L["Colors"] = "颜色"
|
||||
L["Colors the health bar by how happy your pet is."] = "按你的宠物的快乐值着色生命条."
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "生命值设置为着色为固定颜色的生命条颜色."
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "当施法不可打断所使用的颜色, 这个仅能用在 PvE 怪物上."
|
||||
L["Color used when a cast is a channel."] = "当施法是通道法术所使用的颜色."
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "当可以被自身和其他人打断的施法所使用的颜色."
|
||||
L["Color used when a cast is successfully finished."] = "当成功施法完成所使用的颜色."
|
||||
L["Color used when an unit is casting a spell."] = "当施放一个法术时所使用的颜色."
|
||||
L["Column growth"] = "列的增长方向"
|
||||
L["Column spacing"] = "列之间的距离"
|
||||
L["Combat alpha"] = "战斗透明度"
|
||||
L["Combat fader"] = "战斗渐隐"
|
||||
L["Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."] = "战斗渐隐将渐隐你的所有的头像, 并当你进入战斗或单位激活后恢复透明度."
|
||||
L["Combat/resting status"] = "战斗/休息状态"
|
||||
L["Combat status"] = "战斗状态"
|
||||
L["Combat text"] = "战斗文字"
|
||||
L["Combo points"] = "连击点数"
|
||||
L["Configuration to specific unit frames."] = "特殊头像框体的配置."
|
||||
L["Create"] = "创建"
|
||||
L["Creature type"] = "创建类型"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "可以创建的类型, 如单位是恶魔守卫则返回一个恶魔守卫的值."
|
||||
L["Crown indicator for group leaders."] = "队伍领袖的皇冠指示器."
|
||||
L["Cur/Max HP (Absolute)"] = "当前/最大 血量 (绝对值)"
|
||||
L["Cur/Max HP (Short)"] = "当前/最大 血量 (短格式)"
|
||||
L["Cur/Max HP (Smart)"] = "当前/最大 血量 (简洁)"
|
||||
L["Cur/Max power (Absolute)"] = "当前/最大 能力值 (绝对值)"
|
||||
L["Cur/Max power (Druid)"] = "当前/最大 能量值 (德鲁伊)"
|
||||
L["Cur/Max Power (Short)"] = "当前/最大 能力值 (短格式)"
|
||||
L["Cur/Max PP (Smart)"] = "当前/最大 能力值 (简洁)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "当前和最大生命值, 格式化为 [curhp]/[maxhp], 如果已死亡或离线则显示相应的状态."
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "当前和最大能力值, 格式化为 [curhp]/[maxhp]."
|
||||
L["Current health (Druid/Absolute)"] = "当前生命值 (德鲁伊/绝对值)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "当前生命值, 使用一个短的格式文本, 11500 被格式化为 11.5k, 低于 10000 的值则保持现状."
|
||||
L["Current HP (Absolute)"] = "当前血量 (绝对值)"
|
||||
L["Current HP (Short)"] = "当前血量 (短格式)"
|
||||
L["Current power (Absolute)"] = "当前能力值 (绝对值)"
|
||||
L["Current power (Druid)"] = "当前能力值 (德鲁伊)"
|
||||
L["Current power (Druid/Absolute)"] = "当前能力值 (德鲁伊/绝对值)"
|
||||
L["Current Power (Short)"] = "当前能力值 (短格式)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "当前能力值, 使用一个短的格式文本, 12750 被格式化为 12.7k, 低于 10000 的值则保持现状."
|
||||
L["Dark"] = "深色"
|
||||
L["Dead"] = "死亡"
|
||||
L["Debuffs"] = "Debuff"
|
||||
L["Decimal percent HP"] = "十进制百分比生命值"
|
||||
L["Deficit/Unit Name"] = "亏损/头像名字"
|
||||
L["Delete"] = "删除"
|
||||
L["Delete filter"] = "删除过滤器"
|
||||
L["Descending"] = "降序"
|
||||
L["Disabled"] = "禁用"
|
||||
L["Disabled in %s"] = "在 %s 中禁用"
|
||||
L["Disable event discovery"] = "禁用事件探索"
|
||||
L["Disable OmniCC"] = "禁用 OmniCC"
|
||||
L["Disables showing OmniCC timers in all Shadowed Unit Frame auras."] = "在所有 ShadowedUF 头像的Buff或Debuff上禁止显示 OmniCC 计时器。"
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "当玩家进入一个载具时禁止头像转换为载具."
|
||||
L["Disable vehicle swap"] = "禁用载具切换"
|
||||
L["Disabling a module on this page disables it while inside %s. Do not disable a module here if you do not want this to happen!."] = "当在 %s 时禁用一个模块. 如果你不想请不要禁用!."
|
||||
L["Disabling unit modules in various instances."] = "在各种不同副本禁用头像模块."
|
||||
L["DND"] = "勿打扰"
|
||||
L["DND:%s"] = "勿打扰:%s"
|
||||
L["Documentation"] = "说明文档"
|
||||
L["Don't use a filter"] = "不使用过滤器"
|
||||
L["Down"] = "下"
|
||||
L["Druid form"] = "德鲁伊形态"
|
||||
L["Druid form (Short)"] = "德鲁伊形态 (短格式)"
|
||||
L["Druid mana bar"] = "德鲁伊法力条"
|
||||
L["Dungeon role"] = "5人副本角色"
|
||||
L["Edge size"] = "边角大小"
|
||||
L["Editing %s"] = "正在编辑 %s"
|
||||
L["Edit tag"] = "编辑标签"
|
||||
L["Elite"] = "精英"
|
||||
L["Empty bar"] = "空计量条"
|
||||
L["Enable buffs"] = "启用Buff"
|
||||
L["Enable debuffs"] = "启用Debuff"
|
||||
L["Enabled in %s"] = "在 %s 中启用"
|
||||
L["Enabled units"] = "启用单位"
|
||||
L["Enable frequent updates"] = "启用频繁刷新"
|
||||
L["Enable indicator"] = "启用指示器"
|
||||
L["Enable quick health"] = "启用快速生命显示"
|
||||
L["Enable quick power"] = "启用快速能力显示"
|
||||
L["Enable %s"] = "启用 %s"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "启用配置模式, 可以移动并给出样板框体来设置."
|
||||
L["Enable temporary enchants"] = "启用临时附魔"
|
||||
L["Enable units"] = "启用头像"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "启用高级设置将可以获得更多的配置选项。 这个意味着你可以调整每个单独的东西。 默认为不启用。"
|
||||
L["Energy"] = "能量"
|
||||
L["Enlarge your auras"] = "放大你的光环(Buff和Debuff)"
|
||||
L["Error"] = "错误"
|
||||
L["Events"] = "事件"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "用来触发这个标签更新的事件. 用一个单独的间隔来分开每个事件."
|
||||
L["Everywhere else"] = "其他任何地方"
|
||||
L["Export"] = "导出"
|
||||
L["F"] = "F"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "当目标超出你的距离范围内则淡化头像, 仅能作用于在你的队伍中的成员."
|
||||
L["Failed to import layout, error:|n|n%s"] = "导入布局失败, 错误::|n|n%s"
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "加载 ShadowedUF_Options 失败,不能打开配置。错误返回:%s"
|
||||
L["Failed to save tag, error:|n %s"] = "保存标签失败, 错误:|n %s"
|
||||
L["Female"] = "女性"
|
||||
L["Filtering both buffs and debuffs"] = "过滤Buff和Debuff"
|
||||
L["Filtering buffs only"] = "仅过滤Buff"
|
||||
L["Filtering debuffs only"] = "仅过滤Debuff"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "过滤掉你不能施放到其他玩家或自身的任何Buff或Debuff."
|
||||
L["Filter out any auras that you did not cast yourself."] = "过滤掉你不能施法到自身的任何Buff或Debuff."
|
||||
L["Filter out any aura that you cannot cure."] = "过滤掉你不能治愈的任何Buff或Debuff."
|
||||
L["Filter type"] = "过滤类型"
|
||||
L["Finished cast"] = "完成施法"
|
||||
L["Flags the tag for frequent updating, it will update the tag on a timer regardless of any events firing."] = "标记标签为频繁刷新."
|
||||
L["Flight"] = "飞行"
|
||||
L["Flips coloring so the bar color is shown as the background color and the background as the bar"] = "反转颜色后计量条颜色将显示为背景颜色, 背景颜色将显示为计量条颜色"
|
||||
L["Focus"] = "焦点"
|
||||
L["Focus Target"] = "焦点目标"
|
||||
L["Font"] = "字体"
|
||||
L["Forces a static color to be used for the background of all bars"] = "强制一种颜色应用到所有计量条的背景色上"
|
||||
L["For target/focus"] = "作用于目标/焦点"
|
||||
L["Frame"] = "框体"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "当你脱离战斗状态并没有目标而且是100%法力或者能量时的框体透明度."
|
||||
L["Frame alpha while this unit is in combat."] = "当这个单位在战斗状态中时的框体透明度."
|
||||
L["Frames"] = "框体"
|
||||
L["Friendly"] = "友善"
|
||||
L["Friendly spell"] = "友方法术"
|
||||
L["Fuel"] = "燃料"
|
||||
L["Full size after"] = "在之后全尺寸"
|
||||
L["Full size before"] = "在之前全尺寸"
|
||||
L["General"] = "综合"
|
||||
L["General configuration to all enabled units."] = "所有已启用头像的综合配置."
|
||||
L["General threat situation"] = "综合仇恨条件"
|
||||
L["Ghost"] = "灵魂"
|
||||
L["Global"] = "全局"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "金色选中标记 - 在这个区域启用 / 灰色选中标记 - 在这个区域禁用 / 没有选中标记 - 使用默认头像设置"
|
||||
L["Group by"] = "分组按"
|
||||
L["Group %d"] = "队伍 %d"
|
||||
L["Group number"] = "队伍数字"
|
||||
L["Group row spacing"] = "队伍行间距"
|
||||
L["Groups"] = "队伍"
|
||||
L["Groups per row"] = "每行的队伍"
|
||||
L["Groups to show"] = "要显示的队伍"
|
||||
L["Growth"] = "增长"
|
||||
L["Guardian bar"] = "守护者计时条"
|
||||
L["Guild name"] = "公会名字"
|
||||
L["Half health"] = "半血"
|
||||
L["Happiness"] = "欢乐度"
|
||||
L["Health"] = "生命"
|
||||
L["Health bar"] = "生命条"
|
||||
L["Health bar color for friendly units."] = "友善单位的生命条颜色."
|
||||
L["Health bar color for hostile units."] = "敌对单位的生命条颜色."
|
||||
L["Health bar color for neutral units."] = "中立单位的生命条颜色."
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "你不能攻击的敌对目标所使用的生命条颜色, 被用作反应颜色."
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "某玩家将要接受的治疗量的生命条颜色."
|
||||
L["Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."] = "生命条颜色按从 100% -> 0% 的过渡来着色, 也可以作用于你的宠物欢乐度."
|
||||
L["Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."] = "生命条颜色按从 100% -> 50% 的过渡来着色, 也可以作用于你的宠物欢乐度."
|
||||
L["Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."] = "生命条颜色按从 50% -> 00% 的过渡来着色, 也可以作用于你的宠物欢乐度."
|
||||
L["Health color"] = "生命值颜色"
|
||||
L["Health percent"] = "生命值百分比(%)"
|
||||
L["Height"] = "高"
|
||||
L["Help"] = "帮助"
|
||||
L["Hide bar when empty"] = "当计量条为空时隐藏"
|
||||
L["Hide Blizzard"] = "隐藏暴雪默认框体"
|
||||
L["Hide in 6-man raid"] = "6人团队中隐藏"
|
||||
L["Hide in any raid"] = "任何团队中隐藏"
|
||||
L["Hide %s"] = "隐藏 %s"
|
||||
L["Hide %s frames"] = "隐藏 %s 框体"
|
||||
L["Hides the cast bar if there is no cast active."] = "如果当前没有施法动作则隐藏施法条."
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "隐藏你不能施放的任何Buff或Debuff的冷却显示."
|
||||
L["Hide tooltips in combat"] = "战斗中隐藏提示讯息"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "隐藏和显示默认的UI框体如玩家Buff框体."
|
||||
L["High"] = "高"
|
||||
L["High health"] = "高生命值"
|
||||
L["Highlight"] = "高亮"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "高亮你可以治愈的被施放了Debuff的头像框体."
|
||||
L["Highlight units that have aggro on any mob."] = "高亮获得任何怪物触怒的头像框体."
|
||||
L["Highlight units that you are targeting or have focused."] = "高亮你的当前目标或被设为焦点的头像框体."
|
||||
L["Highlight units when you mouse over them."] = "高亮当你的滑鼠移动到的头像框体."
|
||||
L["Hostile"] = "敌对"
|
||||
L["Hostile spell"] = "敌对法术"
|
||||
L["How close the frame should clip with the border."] = "头像和边框的间距."
|
||||
L["How far the background should be from the unit frame border."] = "背景和头像边框的距离."
|
||||
L["How large the background should tile"] = "背景平铺的大小"
|
||||
L["How large the edges should be."] = "边角的大小."
|
||||
L["How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."] = "每一列的Buff/Debuff数量示例, 输入 2 将创建两个行."
|
||||
L["How many auras to show in a single row."] = "每一行显示的Buff/Debuff数量."
|
||||
L["How many groups should be shown per row."] = "每行显示的队伍数量"
|
||||
L["How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"] = "有多少人在协助这个单位, 例如如果你将这个设置为你自己则将显示与哦多少人以你的目标为目标. 这个数目包括你自身!"
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "你的团队有多少人以这个单位为目标, 例如如果你将这个设置为你自己则将显示有多少人以你为目标. 这个数目包括你自身!"
|
||||
L["How many rows total should be used, rows will be however long the per row value is set at."] = "要用到的行数量总数."
|
||||
L["How many seconds between updates.|n[WARNING] By setting the frequency to 0 it will update every single frame redraw, if you want to disable frequent updating uncheck it don't set this to 0."] = "更新间隔的秒数..|n[警告] 设置频率为0后将会在每次单个框体重绘后更新, 如果你想要禁用频繁更新请反选并不要设置为."
|
||||
L["How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."] = "这个计量条获得的框体总体高度, 这是一个加权值, 设置更高将获得更多."
|
||||
L["How much spacing should be between each new row of groups."] = "每个队伍行之间的间距"
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "在一个头像中所有计量条之间的间距, 负值为更远, 正值为更近, 0为无间距."
|
||||
L["How much weight this should use when figuring out the total text width."] = "当合计到总的文字宽度时使用的宽度."
|
||||
L["How the frames should grow when a new column is added."] = "当一个新的列被加入时行的增长方向."
|
||||
L["How the rows should grow when new group members are added."] = "当新的队伍成员加入时框体的增长方向."
|
||||
L["How you want this aura to be anchored to the unit frame."] = "你想要这个Buff/Debuff定位到头像框体的方式."
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "如果这个单位获得治疗, 将显示获得治疗的精确值, 否则则显示单位名字."
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "如果单位为玩家则显示职业, 如果是NPC则显示NPC类型."
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "如果单位为玩家则显示种族, 如果是NPC则显示NPC类型."
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "如果你施放了这个Buff/Debuff, 那么这个Buff图标将放大尺寸."
|
||||
L["Import"] = "导入"
|
||||
L["Import non-standard module settings"] = "导入非标准模块的设置"
|
||||
L["Import unit frame positions"] = "导入头像位置"
|
||||
L["Import visibility settings"] = "导入可见性设置"
|
||||
L["Inactive alpha"] = "未激活透明度"
|
||||
L["Incoming heal"] = "接受的治疗"
|
||||
L["Incoming heal/Name"] = "接受治疗/名字"
|
||||
L["Incoming heals"] = "接受的治疗"
|
||||
L["Incoming heal (Short)"] = "接受治疗 (短格式)"
|
||||
L["Index"] = "索引"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "你的宠物的快乐值指示器, 仅作用于猎人."
|
||||
L["Indicators"] = "指示器"
|
||||
L["In range alpha"] = "在距离范围内透明度"
|
||||
L["Inset"] = "插入"
|
||||
L["Inside Center"] = "内部居中"
|
||||
L["Inside Center Left"] = "内部居中靠左"
|
||||
L["Inside Center Right"] = "内部居中靠右"
|
||||
L["Inside Top Left"] = "内部顶端靠左"
|
||||
L["Inside Top Right"] = "内部顶端靠右"
|
||||
L["Interrupted"] = "已打断"
|
||||
L["Invalid interval entered, must be a number."] = "必须输入一个数字."
|
||||
L["Invalid spell \"%s\" entered."] = "输入的 \"%s\" 法术不可用."
|
||||
L["Invert colors"] = "反转颜色"
|
||||
L["Layout manager"] = "布局管理器"
|
||||
L["Leader"] = "领袖"
|
||||
L["Left"] = "左边"
|
||||
L["Left Bottom"] = "左边底部"
|
||||
L["Left Center"] = "左边居中"
|
||||
L["Left text"] = "左边文字"
|
||||
L["Left Top"] = "左边顶部"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "让你修改基础字型的大小."
|
||||
L["Level"] = "等级"
|
||||
L["Level (Colored)"] = "等级 (着色)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "等级 %s - %s: %s/%s (%.2f%% 已完成)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "等级 %s - %s: %s/%s (%.2f%% 已完成), %s 双倍经验."
|
||||
L["Level without any coloring."] = "等级不使用任何颜色。"
|
||||
L["Light"] = "明亮"
|
||||
L["Lock frames"] = "锁定框体"
|
||||
L["Locks the unit frame positionings hiding the mover boxes."] = "锁定框体位置."
|
||||
L["Low health"] = "低生命值"
|
||||
L["M"] = "M"
|
||||
L["Main Assist"] = "主助理"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "由暴雪主助理系统或如同oRA3等插件设置的主助理."
|
||||
L["Main Assist Target"] = "主助理目标"
|
||||
L["Main Tank"] = "主坦克"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "由暴雪主坦克系统或如同oRA3等插件设置的主坦克."
|
||||
L["Main Tank Target"] = "主坦克目标"
|
||||
L["Male"] = "男性"
|
||||
L["Mana"] = "法力"
|
||||
L["Manage aura filters"] = "管理光环过滤器"
|
||||
L["Management"] = "管理"
|
||||
L["Manual position"] = "自定义位置"
|
||||
L["Master looter"] = "主拾取"
|
||||
L["Max columns"] = "最大列数量"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "最大生命值, 使用一个短的格式文本, 17750 被格式化为 17.7k, 低于 10000 的值则保持现状."
|
||||
L["Max HP (Absolute)"] = "最大生命值 (绝对值)"
|
||||
L["Max HP (Short)"] = "最大生命值 (短格式)"
|
||||
L["Max power (Absolute)"] = "最大能力值 (绝对值)"
|
||||
L["Max power (Short)"] = "最大能力值 (短格式)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "最大能力值, 使用一个短的格式文本, 16000 被格式化为 16k, 低于 10000 的值则保持现状."
|
||||
L["Max rows"] = "最大行数量"
|
||||
L["Medium"] = "中"
|
||||
L["Miscellaneous"] = "杂项"
|
||||
L["Missing HP (Short)"] = "缺失的生命值 (短格式)"
|
||||
L["Missing power (Short)"] = "缺失的能力值 (短格式)"
|
||||
L["Moonkin"] = "枭兽"
|
||||
L["Name"] = "名字"
|
||||
L["Name (Abbreviated)"] = "名字 (缩写)"
|
||||
L["Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."] = "用来检测距离的友方法术名字.|n|n这个仅为你的当前职业自动设置."
|
||||
L["Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."] = "用来检测距离的敌对法术名字.|n|n这个仅为你的当前职业自动设置."
|
||||
L["Neutral"] = "中立"
|
||||
L["Never (Disabled)"] = "从不 (禁用)"
|
||||
L["New filter"] = "新的过滤器"
|
||||
L["None"] = "无"
|
||||
L["NPCs only"] = "仅NPC"
|
||||
L["Offline"] = "离线"
|
||||
L["Offline timer"] = "离线计时器"
|
||||
L["Off:%s"] = "离线:%s"
|
||||
L["On aggro"] = "在获得目标"
|
||||
L["On curable debuff"] = "有可治愈的Debuff"
|
||||
L["On mouseover"] = "在鼠标悬停"
|
||||
L["Order"] = "顺序"
|
||||
L["Or you can set a position manually"] = "或者你可以手动设置位置"
|
||||
L["Outline"] = "描边"
|
||||
L["Out of range alpha"] = "超出距离透明度"
|
||||
L["Outside bar limit"] = "外围计量条限制"
|
||||
L["Override color"] = "覆盖颜色"
|
||||
L["Party"] = "小队"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "当在一个任何人数的团队中时小队框体将被隐藏."
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "当在一个超过5人的团队中时小队框体将被隐藏."
|
||||
L["Party instances"] = "小队副本"
|
||||
L["Party Pet"] = "小队宠物"
|
||||
L["Party Target"] = "小队目标"
|
||||
L["Percentage of width the portrait should use."] = "肖像使用的宽度百分比."
|
||||
L["Percentage value of how far outside the unit frame the incoming heal bar can go. 130% means it will go 30% outside the frame, 100% means it will not go outside."] = "接受治疗条超出头像框体的百分比值. 130% 意味着将超出 30% , 100% 意味着不超出."
|
||||
L["Percent HP"] = "百分比生命值"
|
||||
L["Percent power"] = "百分比能力值"
|
||||
L["Per column"] = "每栏"
|
||||
L["Per row"] = "每行"
|
||||
L["Pet"] = "宠物"
|
||||
L["Pet Target"] = "宠物目标"
|
||||
L["Player"] = "玩家"
|
||||
L["player cast bar"] = "玩家施法条"
|
||||
L["Players only"] = "仅玩家"
|
||||
L["Players will be colored by class, "] = "玩家将按职业着色"
|
||||
L["Player threat"] = "玩家仇恨"
|
||||
L["Point"] = "定位"
|
||||
L["Portrait"] = "肖像"
|
||||
L["Portrait type"] = "肖像类型"
|
||||
L["Position"] = "位置"
|
||||
L["Power"] = "能力"
|
||||
L["Power bar"] = "能力条"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "当在战斗中禁用鼠标提示."
|
||||
L["Primary means of coloring the health bar, color on aggro and color by reaction will override this if necessary."] = "生命条的初始颜色, 获得仇恨或按反应类型如果需要可以覆盖这个颜色."
|
||||
L["Prioritize buffs"] = "优先Buff"
|
||||
L["Programming in Lua"] = "Lua 编程"
|
||||
L["PvP Flag"] = "PvP 标识"
|
||||
L["PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."] = "PVP 标识指示器, 为开启PVP的显示联盟或者部落标识."
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "PVP 计时器"
|
||||
L["Race"] = "种族"
|
||||
L["Race (Smart)"] = "种族 (简洁)"
|
||||
L["Rage"] = "怒气"
|
||||
L["Raid"] = "团队"
|
||||
L["Raid assisting unit"] = "团队协助单位"
|
||||
L["Raid instances"] = "团队副本"
|
||||
L["Raid pet"] = "团队宠物"
|
||||
L["Raid role"] = "团队角色"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "团队角色指示器, 主坦克显示盾, 主助理显示剑."
|
||||
L["Raid target"] = "团队目标"
|
||||
L["Raid target indicator."] = "团队目标指示器."
|
||||
L["Raid targeting unit"] = "团队目标单位"
|
||||
L["Range indicator"] = "距离指示器"
|
||||
L["Range spells"] = "距离法术"
|
||||
L["Rank 1"] = "等级 1"
|
||||
L["Rare"] = "稀有"
|
||||
L["Rare Elite"] = "稀有精英"
|
||||
L["Rare indicator"] = "稀有指示器"
|
||||
L["Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."] = "感应颜色代码, 使用 [reactcolor][name][close] 来按他们的反应类型着色头像名字."
|
||||
L["Reaction color tag"] = "感应颜色标签"
|
||||
L["Ready status"] = "准备就绪状态"
|
||||
L["Ready status of group members."] = "队伍成员的就绪状态."
|
||||
L["Relative point"] = "相对定位"
|
||||
L["Resources"] = "来源"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "按你的目标的仇恨值情况显示颜色:红色为获得仇恨,橘红为高仇恨值,黄色为提醒留意仇恨。"
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "按所有单位的仇恨值情况显示颜色: 红色为获得仇恨, 橘红为高仇恨值黄色为提醒留意仇恨."
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "对于你的当前目标的仇恨值百分比, 显示为 0 - 100%."
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "用百分比显示当前生命值, 如果已死亡或离线则显示相应的状态."
|
||||
L["Returns current power as a percentage."] = "用百分比显示当前能力值."
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "如果是精英或稀有精英怪则显示 + ."
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "如果是稀有或者稀有精英怪则显示 Rare ."
|
||||
L["Returns text based on the units general threat situation: Aggro for Aggro, High for being close to taking aggro, and Medium as a warning to be wary.|nThis cannot be used on target of target or focus target types of units."] = "基于单位的一般仇恨值情况显示文字:Aggro 为获得目标, High 为高仇恨, Medium 为小心仇恨.|n这个不能被用作目标的目标或焦点的目标等类型单位."
|
||||
L["Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."] = "按你对所有单位的仇恨值情况显示文字: 获得仇恨为获得仇恨, 高为高仇恨值, 中为提醒留意仇恨."
|
||||
L["Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."] = "按你的目标的仇恨值情况显示颜色: 获得仇恨为获得仇恨, 高为高仇恨值, 中为提醒留意仇恨."
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "基于目标相对于你的等级的颜色代码. 如果你不能攻击他那么不会显示颜色."
|
||||
L["Returns the color code for the units threat situation in general: Red for Aggro, Orange for High threat and Yellow to watch out.|nThis cannot be used on target of target or focus target types of units."] = "显示单位的仇恨值的颜色代码:红色 为获得目标, 橘红色 为高仇恨, 黄色 为小心仇恨.|n这个不能被用作目标的目标或焦点的目标等类型单位."
|
||||
L["Returns the scaled threat percentage for the unit, if you put this on a party member you would see the percentage of how close they are to getting any from any hostile mobs. Always 0 - 100%.|nThis cannot be used on target of target or focus target types of units."] = "显示单位的可缩放的仇恨值百分比, 如果你将这个放到一个小队成员身上你将看到他们对任何敌对怪物的仇恨百分比. 百分比在0-100%之间.|n这个不能被用作目标的目标或焦点的目标等类型单位."
|
||||
L["Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."] = "如果是德鲁伊显示当前的形态, 猫、枭兽、熊等等."
|
||||
L["Returns the units sex."] = "显示单位性别."
|
||||
L["Right"] = "右边"
|
||||
L["Right Bottom"] = "右边底部"
|
||||
L["Right Center"] = "右边居中"
|
||||
L["Right text"] = "右边文字"
|
||||
L["Right Top"] = "右边顶部"
|
||||
L["Role the unit is playing in dungeons formed through the Looking For Dungeon system."] = "玩家正在进行通过寻求地下城系统形式的5人地下城."
|
||||
L["Row growth"] = "行增长方向"
|
||||
L["Row offset"] = "行坐标"
|
||||
L["rune bar"] = "符文条"
|
||||
L["Rune bar"] = "符文条"
|
||||
L["Runic Power"] = "符文能量"
|
||||
L["Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."] = "如果你获得仇恨仅显示红色, 不再显示黄 --> 橘红 --> 红色"
|
||||
L["Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."] = "如果单位获得仇恨仅显示红色, 不再显示黄 --> 橘红 --> 红色"
|
||||
L["Scale"] = "缩放"
|
||||
L["Scaled threat percent"] = "缩放仇恨值百分比"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "你施放的Buff或Debuff缩放值, 任何高于 100% 的值都比预设值大, 任何低于 100% 的值都比预设值小."
|
||||
L["Screen"] = "屏幕"
|
||||
L["Search"] = "搜索"
|
||||
L["Search tags"] = "搜寻标签"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "查看下面创建标签的说明文档和示例,如果你仅想要基本的 Lua 或 WoW API 信息请查看 Programming in Lua 和 WoW Programming 链接。"
|
||||
L["Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."] = "从左侧面板选择一个标签文本来修改标签. 在当前面板可以修剪宽度, 尺寸和坐标."
|
||||
L["Select the units that you want to modify, any settings changed will change every unit you selected. If you want to anchor or change raid/party unit specific settings you will need to do that through their options.|n|nShift click a unit to select all/unselect all."] = "选择你想要更改的单位, 任何设置的改变都会改变你已选择的单位. 如果你想要锚点定位或修改团队/小队单位的特定设置你需要通过他们的选项的实现.|n|nShift + 点击一个单位来选择全部或反选全部."
|
||||
L["Self aura size"] = "自身Buff或Debuff大小"
|
||||
L["Separate raid frames"] = "独立团队框体"
|
||||
L["Set filter zones"] = "设置过滤区域"
|
||||
L["Sex"] = "性别"
|
||||
L["%s frames"] = "%s 框体"
|
||||
L["Short classification"] = "短的职业类别显示"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "短的职业类别显示, R 为 稀有, R+ 为稀有精英, + 为精英, B 为首领, 如果不是这些特殊怪则不显示."
|
||||
L["Short elite indicator"] = "短的精英指示器"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "短格式显示接受的治疗量, 如 13,000 显示为 13k."
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "[druidform] 标签的短格式, C = 猫, B = 熊, F = 飞行 等等."
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "在计量条的背后显示一个相同材质和颜色的背景, 但是该背景将被淡化."
|
||||
L["Show as bar"] = "显示为计量条"
|
||||
L["Show background"] = "显示背景"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "当公用一个相同的锚点定位时, Buff 将显示在 Debuff 之前."
|
||||
L["Show castable on other auras only"] = "进显示可施放在其他光环(Buff/Debuff)上的"
|
||||
L["Show cast name"] = "显示施法名字"
|
||||
L["Show cast rank"] = "显示施法等级"
|
||||
L["Show cast time"] = "显示施法事件"
|
||||
L["Show curable only"] = "仅显示可医治的"
|
||||
L["Show party as raid"] = "显示小队为团队"
|
||||
L["Show player in party"] = "在小队显示玩家"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "根据单位离开状态来显示 (AFK), (勿打扰) 或不显示任何东西."
|
||||
L["Shows combat feedback, last healing the unit received, last hit did it miss, resist, dodged and so on."] = "显示战斗信息, 最后接受的治疗, 最后的命中与否, 抵抗, 躲闪等等."
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "用精确格式显示当前和最大生命值, 17500 生命值将显示为 17500."
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "用精确格式显示当前和最大能力值, 18000 法力将被显示为 18000."
|
||||
L["Shows current group number of the unit."] = "显示这个单位的当前队伍编号."
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "用精确格式显示当前的生命值, 15000 生命值将显示为 15000."
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "用精确格式显示当前的能力值, 15000 法力将显示为 15000."
|
||||
L["Shows how long an unit has been AFK or DND."] = "显示AFK或者勿打扰状态的时间."
|
||||
L["Shows how long an unit has been offline."] = "显示离线的时间."
|
||||
L["Shows how long until your PVP flag drops, will not show if the flag is manually on or you are in a hostile zone.|n|nThis will only work for yourself, you cannot use it to see the time left on your party or raid."] = "显示PVP标记消失的时间, 不会在手动开启PVP或在一个敌对区域中显示.|n|n这个仅对你自身有效, 你不能使用他来查看你的小队或团队的PVP标记消失时间."
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "用精确格式显示最大的生命值, 14000 生命值将显示为 14000."
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "用精确格式显示最大的能力, 143000 法力值将显示为 13000."
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "根据单位当前状态来显示离线, 死亡, 灵魂状态或不显示任何东西."
|
||||
L["Show's the units guild name if they are in a guild."] = "如果有公会则显示单位所在的公会名字."
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "使用一个小数点的百分比来显示生命值, 这意味著 61 / 110 生命值将显示为 55.4%."
|
||||
L["Show your auras only"] = "仅显示你的光环(Buff/Debuff)"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "简单的Buff和Debuff过滤器."
|
||||
L["Size"] = "大小"
|
||||
L["Smart level"] = "等级的简洁格式"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "简洁的等级显示, 首领显示为 Boss , 等级50的精英怪显示为 +50 , 等级80显示为 80 ."
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "[curmaxhp] 的简洁数字格式, 低于1,000,000 将如此显示,高于 1,000,000 的数字将显示短格式如 1m。"
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "[curmaxpp] 的简洁数字格式, 低于1,000,000 将如此显示,高于 1,000,000 的数字将显示短格式如 1m。"
|
||||
L["%s member"] = "%s 成员"
|
||||
L["Sorting"] = "分类"
|
||||
L["Sort method"] = "分类方式"
|
||||
L["Sort order"] = "分类顺序"
|
||||
L["Spacing"] = "距离"
|
||||
L["Spacing between each row"] = "每行之间的距离"
|
||||
L["Splits raid frames into individual frames for each raid group instead of one single frame.|nNOTE! You cannot drag each group frame individualy, but how they grow is set through the column and row growth options."] = "为每个团队队伍分割团队框体到单独的框体.|n请注意! 你不能拖曳单独的每个队伍框体, 但可以通过在行和列增长选项中设置他们的增长方向."
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (%.2f%% 已完成)"
|
||||
L["Static"] = "静态"
|
||||
L["Status"] = "状态"
|
||||
L["Style of borders to show for all auras."] = "所有光环边框的显示样式."
|
||||
L["T"] = "T"
|
||||
L["Tag list"] = "标签列表"
|
||||
L["Tag name"] = "标签名字"
|
||||
L["Tags"] = "标签"
|
||||
L["Tag that you will use to access this code, do not wrap it in brackets or parenthesis it's automatically done. For example, you would enter \"foobar\" and then access it with [foobar]."] = "你用来访问这个代码的标签, 不要使用方或者圆括号, 他会自动填充. 例如, 你输入 \"foobar\" 就会自动通过 [foobar] 来访问."
|
||||
L["Target"] = "目标"
|
||||
L["Target of Target"] = "目标的目标"
|
||||
L["Target of Target of Target"] = "目标的目标的目标"
|
||||
L["Temporary enchants"] = "临时附魔"
|
||||
L["Test Aura"] = "测试光环"
|
||||
L["Test spell"] = "测试法术"
|
||||
L["Text"] = "文字"
|
||||
L["Text management"] = "文字管理"
|
||||
L["Text name"] = "文字名字"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "你可以在配置时用来定义来自于其他文字的文字名字."
|
||||
L["Text parent"] = "文字来源"
|
||||
L["Text/Tags"] = "文本/标签"
|
||||
L["The blacklist \"%s\" already exists."] = "黑名单 \"%s\" 已经存在."
|
||||
L["The check boxes below will allow you to enable or disable units."] = "下面的复选框允许你启用或禁用头像."
|
||||
L["The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."] = "玩家框体将不被隐藏,你必须通过完全或由区域类型来手动禁用。"
|
||||
L["The tag \"%s\" already exists."] = "这个标签 \"%s\" 已存在."
|
||||
L["The unit frames you see are examples, they are not perfect and do not show all the data they normally would.|n|nYou can hide them by locking them through /shadowuf or clicking the button below."] = "你看到的头像仅是范例, 他们不是那么完美并且不会显示应该显示的所有数据.|n|n你可以通过命令行 /shadowuf或点击下面的按钮锁定来隐藏他们."
|
||||
L["The whitelist \"%s\" already exists."] = "白名单 \"%s\" 已经存在."
|
||||
L["Thick outline"] = "粗描边"
|
||||
L["Thin outline"] = "细描边"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "这个计量条会在当你达到顶级时自动隐藏, 或者你当前没有追踪任何声望时自动隐藏."
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "这个过滤器内没有光环, 你可以使用上面的对话框来添加."
|
||||
L["This filter has no aura types set to filter out."] = "这个过滤器没有要过滤的光环类型."
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "这个头像必须依靠另一个才能正常工作, 禁用 %s 将同时禁用 %s."
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "这个头像有子头像, 你需要首先启用他的子头像来启用这个头像."
|
||||
L["This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."] = "这个将禁用这个标签需要事件的自动探测, 你应当保持这个未被选中除非你知道你在做什么."
|
||||
L["This will override all background colorings for bars including custom set ones."] = "这个将覆盖所有计量条的背景颜色, 包括自定义设置的."
|
||||
L["Threat"] = "仇恨"
|
||||
L["Threat situation"] = "仇恨情况"
|
||||
L["Tile size"] = "标题大小"
|
||||
L["Timers for self auras only"] = "仅显示自身光环(Buff和Debuff)的计时器"
|
||||
L["Top"] = "顶部"
|
||||
L["Top Center"] = "顶部居中"
|
||||
L["Top Left"] = "顶部靠左"
|
||||
L["Top Right"] = "顶部靠右"
|
||||
L["Total number of combo points you have on your target."] = "你在你的目标身上的连击点数的总数."
|
||||
L["Totem bar"] = "图腾条"
|
||||
L["Travel"] = "旅行"
|
||||
L["Tree"] = "树"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "开启快速刷新能力条."
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "开启快速刷新生命条."
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "改变这个组件为一个计量条, 可以被调整大小或者像生命条和能力条一样被排序."
|
||||
L["Unattackable hostile"] = "不可攻击的敌对单位"
|
||||
L["Unit color code on aggro"] = "获得仇恨的单位颜色代码"
|
||||
L["Unit colored situation"] = "单位着色情况"
|
||||
L["Unit configuration"] = "头像配置"
|
||||
L["Unit faction"] = "单位阵营"
|
||||
L["Unit name"] = "单位名字"
|
||||
L["Unit name (Class colored)"] = "单位名字 (按职业着色)"
|
||||
L["Unit name colored by class."] = "按职业着色单位名字"
|
||||
L["Units"] = "单位"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "单位阵营, 萨尔将显示为部落, 麦格尼·铜须将显示为联盟."
|
||||
L["Unit scaled threat"] = "单位比例仇恨"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "单位分级显示, 稀有, 稀有精英, 精英, 首领, 如果不是这些特殊怪则不显示."
|
||||
L["Unit server"] = "单位所在服务器"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "单位所在服务器, 如果是同一个服务器则不显示."
|
||||
L["Unit situation name"] = "单位情况名字"
|
||||
L["Units per column"] = "每行单位数"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "单位的种族."
|
||||
L["Unlink frames"] = "脱离框体"
|
||||
L["Up"] = "向上"
|
||||
L["Update interval"] = "刷新间隔"
|
||||
L["Using unit settings"] = "使用单位设置"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "你可以在这个页面启用不同的头像, 如团队或小队目标."
|
||||
L["Vehicle"] = "载具"
|
||||
L["Vehicles"] = "垂直"
|
||||
L["View"] = "查看"
|
||||
L["Visibility"] = "可见性"
|
||||
L["WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."] = "警告: 这个将解开所有框体之间的链接."
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "当单位正在少血, [missinghp] 标签将显示, 当这单位满血 [name] 标签将显示. 这个会让你看到 -1000 当他们少了 1000 血量, 满血时将只显示名字."
|
||||
L["When this filter is active, apply the filter to buffs."] = "当这个过滤器激活时, 过滤Buff."
|
||||
L["When this filter is active, apply the filter to debuffs."] = "当这个过滤器激活时, 过滤Debuff."
|
||||
L["When to color the empty bar by reaction, overriding the default color by option."] = "何时按目标对你的反应类型着色空的计量条, 覆盖选项的默认颜色When to color the empty bar by reaction, overriding the default color by option."
|
||||
L["When to color the health bar by the units reaction, overriding the color health by option."] = "何时按目标对你的反应类型着色血量条, 覆盖选项的默认血量颜色."
|
||||
L["Where inside the frame the text should be anchored to."] = "这个框体内文字锚点的定位."
|
||||
L["Where to anchor the cast name text."] = "施法名字文字锚点的定位."
|
||||
L["Where to anchor the cast time text."] = "施法事件文字锚点的定位."
|
||||
L["Whitelist"] = "白名单"
|
||||
L["Whitelist filters"] = "白名单过滤器"
|
||||
L["Whitelists"] = "白名单"
|
||||
L["Whitelists will hide any aura not in the filter group.|nBlacklists will hide auras that are in the filter group."] = "白名单将隐藏任何不在过滤分组的Buff或Debuff.|n黑名单将隐藏所有在过滤分组的Buff或Debuff."
|
||||
L["Widget size"] = "头像组件大小"
|
||||
L["Width"] = "宽"
|
||||
L["Width percent"] = "宽度百分比"
|
||||
L["Width weight"] = "宽度加权"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "默认值为将不会导入那些不在Shadowed Unit Frames内的模块设置."
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "和 %s 效果一样, 但这个仅当单位是猫或熊形态时显示."
|
||||
L["WoW Programming"] = "WoW 编程"
|
||||
L["X Offset"] = "X 坐标"
|
||||
L["XP/Rep bar"] = "经验/声望条"
|
||||
L["Y Offset"] = "Y 坐标"
|
||||
L["You can add additional text with tags enabled using this configuration, note that any additional text added (or removed) effects all units, removing text will reset their settings as well.|n|nKeep in mind, you cannot delete the default text included with the units."] = "你可以使用这个配置来通过标签添加额外的文本, 请注意任何额外的文本添加(或移除)将影响到所有的单位, 移除文本也将会重置他们的设定..|n|n请记住, 你不能在单位里面删除默认文本."
|
||||
L["You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."] = "你可以通过这个页面来增加新的自定义标签, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "你可以在上面的\"帮助\"选项卡里找到更多的关于创建自定义标签的讯息."
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above.|nSUF will attempt to automatically detect what events your tag will need, so you do not generally need to fill out the events field."] = "你可以在上面的\"帮助\"标签里找到有关如何创建自定义标签的更多信息.|nSUF 将尝试自动检测你的标签需要什么事件, 所以你不一定需要填写事件区域."
|
||||
L["You can import another Shadowed Unit Frame users configuration by entering the export code they gave you below. This will backup your old layout to \"Import Backup\".|n|nIt will take 30-60 seconds for it to load your layout when you paste it in, please by patient."] = "你可以在下面通过输入代码来导入另一个 Shadowed Unit Frame 用户的配置. 这个将备份你的旧有的布局到 \"导入备份\"中.|n|n你粘贴后将花费30-60秒的时间来加载, 请耐心等待."
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "你不能编辑这个标签因为这个是预设的标签中的一员. 这有一个为你提供一个自定义标签的示例."
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "你不能命名一个标签 \"%s\", 标签名字不能包含方括号或者圆括号."
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "你可以在这里设置在不同的区域类型和过滤器分组条件下使用的头像, 如果你想要改变光环分组你可以查看 \"管理光环分组\" 选项."
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "你还没有添加这个类型的任何过滤器, 你必须先到管理面板创建一个."
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "你已进入战斗, 头像框体已被锁定. 当你离开战斗后你可能需要通过命令/shadowuf来重新解锁."
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "你只能输入字母和下划线, 如 \"FOO_BAR\" 为可用, 而\"APPLE_5_ORANGE\" 不可以因为包含了一个数字."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "你必须输入一个大于 0 的数字, 不允许为负数."
|
||||
L["You must enter a tag name."] = "你必须输入一个标签名字."
|
||||
L["You must wrap your code in a function."] = "你必须包装你的代码在一个函数内。"
|
||||
L["Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."] = "你的已激活布局已被用作导入备份的配置文件, 这个不能被导入所覆盖. 修改你的配置文件并再次尝试."
|
||||
L["Your code must be wrapped in a function, for example, if you were to make a tag to return the units name you would do:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"] = "你的代码必须包括在一个函数中, 比如, 如果你使一个标签显示头像的名字你需要这样做:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "在你设置需要过滤光环的单位前你必须创建一个光环过滤器."
|
||||
L["You will need to do a /console reloadui before a hidden frame becomes visible again.|nPlayer and other unit frames are automatically hidden depending on if you enable the unit in Shadowed Unit Frames."] = "在隐藏框体重新变为可见之前你需要通过命令行 /console reloadui 来重载插件.|n玩家和其他的头像将依据你是否在插件里启用来自动隐藏."
|
||||
L["Zone configuration"] = "区域配置"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
@@ -0,0 +1,660 @@
|
||||
if( GetLocale() ~= "zhTW" ) then return end
|
||||
local L = {}
|
||||
L["2D"] = "2D"
|
||||
L["3D"] = "3D"
|
||||
L["A"] = "A"
|
||||
L["Abbreviates unit names above 10 characters, \"Dark Rune Champion\" becomes \"D.R.Champion\" and \"Dark Rune Commoner\" becomes \"D.R.Commoner\"."] = "簡化單位名稱需10個位元以上,'Dark Rune Champion'顯示為'D.R.Champion'或'Dark Rune Commoner'顯示為'D.R.Commoner'。"
|
||||
L["Absolute incoming heal value, if 10,000 healing is incoming it will show 10,000."] = "顯示完整的治療量,如10,000治療量則顯示為10,000。"
|
||||
L["Add"] = "新增"
|
||||
L["Add new tag"] = "新增新標籤"
|
||||
L["Add new text"] = "新增新文字"
|
||||
L["Adds a bar indicating how much time is left on your ghoul timer, only used if you do not have a permanent ghoul."] = "為你的食屍鬼計時器上新增存活多久的計時條,僅用於非永久性的食屍鬼。"
|
||||
L["Adds a bar inside the health bar indicating how much healing someone is estimated to be receiving."] = "在生命條中新增預估治療量的計量條也包含其他人的治療。"
|
||||
L["Adds an empty bar that you can put text into as a way of uncluttering other bars."] = "增加一個空的計量條,你可以在裡面輸入文字並用來整理其他的計量條。"
|
||||
L["Adds another mana bar to the player frame when you are in Bear or Cat form showing you how much mana you have."] = "當你處於巨熊或獵豹形態時新增額外的法力條玩家框架上。"
|
||||
L["Adds rune bars and timers before runes refresh to the player frame."] = "在符文刷新前新增符文條和計時器到玩家框架上。"
|
||||
L["Adds %s to the list of units to be modified when you change values in this tab."] = "當你變更此標籤的數值時新增%s到單位清單中進行修改。"
|
||||
L["Adds temporary enchants to the buffs for the player."] = "為玩家的增益新增暫時性附魔效果。"
|
||||
L["Adds totem bars with timers before they expire to the player frame."] = "在圖騰結束前新增圖騰條的計時器到玩家框架上。"
|
||||
L["Add tags"] = "新增標籤"
|
||||
L["Advanced"] = "進階"
|
||||
L["Advanced tag management, allows you to add your own custom tags."] = "進階標籤管理,允許你新增自訂的標籤。"
|
||||
L["AFK"] = "暫離"
|
||||
L["AFK:%s"] = "暫離:%s"
|
||||
L["AFK status"] = "暫離狀態"
|
||||
L["AFK timer"] = "暫離計時器"
|
||||
L["After you hit export, you can give the below code to other Shadowed Unit Frames users and they will get your exact layout."] = "點擊匯出後,你可以複製以下的代碼給其他SUF使用者並獲得你的版面編排。"
|
||||
L["Aggro"] = "獲得仇恨"
|
||||
L["Alpha to use for bar."] = "計量條使用的透明度。"
|
||||
L["Alpha to use for bar backgrounds."] = "計量條背景使用的透明度。"
|
||||
L["Ammo"] = "彈藥"
|
||||
L["Amount of health missing, if none is missing nothing is shown. Uses a short format, -18500 is shown as -18.5k, values below 10000 are formatted as is."] = "生命損失值,如果沒有損失則不顯示。使用簡化格式-18500顯示為-18.5k,低於10000的生命值則不簡化。"
|
||||
L["Amount of power missing, if none is missing nothing is shown. Uses a short format, -13850 is shown as 13.8k, values below 10000 are formatted as is."] = "動能損失值,如果沒有損失則不顯示。使用簡化格式-13850顯示為-13.8k,低於10000的動能值則不簡化。"
|
||||
L["Anchor point"] = "定位處"
|
||||
L["Anchor to"] = "定位到"
|
||||
L["Anchor to another frame"] = "定位到其他框架"
|
||||
L["Anchor to buffs"] = "定位到增益"
|
||||
L["Anchor to debuffs"] = "定位到減益"
|
||||
L["Aquatic"] = "水棲"
|
||||
L["Arena"] = "競技場"
|
||||
L["Arena Pet"] = "競技場寵物"
|
||||
L["Arenas"] = "競技場"
|
||||
L["Arena Target"] = "競技場目標"
|
||||
L["Are you sure you want to delete this filter?"] = "你確定你要刪除這個篩選?"
|
||||
L["Are you sure you want to delete this tag?"] = "你確定你要刪除這個標籤?"
|
||||
L["Are you sure you want to delete this text? All settings for it will be deleted."] = "你確定你要刪除這個文字?相關的所有設定將會被刪除。"
|
||||
L["Ascending"] = "遞增"
|
||||
L["Aura border style"] = "光環邊框樣式"
|
||||
L["Aura filters"] = "光環篩選"
|
||||
L["Aura name"] = "光環名稱"
|
||||
L["Auras"] = "光環"
|
||||
L["Aura types to filter"] = "篩選光環類型"
|
||||
L["B"] = "B"
|
||||
L["Background"] = "背景"
|
||||
L["Background alpha"] = "背景透明度"
|
||||
L["Background/border"] = "背景/邊框"
|
||||
L["Background color"] = "背景着色"
|
||||
L["Bag indicator for master looters."] = "隊長分配的背包標記。"
|
||||
L["Bar alpha"] = "計量調透明度"
|
||||
L["Bars"] = "計量條"
|
||||
L["Bar spacing"] = "計量條間隔"
|
||||
L["Bar texture"] = "背景材質"
|
||||
L["Battlegrounds"] = "戰場"
|
||||
L["Bear"] = "巨熊"
|
||||
L["Blacklist"] = "黑名單"
|
||||
L["Blacklist filters"] = "黑名單篩選"
|
||||
L["Blacklists"] = "黑名單"
|
||||
L["Blizzard"] = "Blizzard"
|
||||
L["Border"] = "邊框"
|
||||
L["Border alpha"] = "邊框透明度"
|
||||
L["Border color"] = "邊框顏色"
|
||||
L["Border highlighting"] = "邊框高亮"
|
||||
L["Border thickness"] = "邊框厚度"
|
||||
L["Boss"] = "首領"
|
||||
L["Boss Target"] = "首領目標"
|
||||
L["Boss units are for only certain fights, such as Blood Princes or the Gunship battle, you will not see them for every boss fight."] = "首領單位框架只在特定戰如血親王議會及砲艇戰中看到,你並不會在每個首領戰中看到它。"
|
||||
L["Both"] = "兩者"
|
||||
L["Bottom"] = "底部"
|
||||
L["Bottom Center"] = "底部中間"
|
||||
L["Bottom Left"] = "底部左邊"
|
||||
L["Bottom Right"] = "底部右邊"
|
||||
L["buff frames"] = "buff 框體"
|
||||
L["Buffs"] = "增益"
|
||||
L["C"] = "C"
|
||||
L["Cannot find any profiles named \"%s\"."] = "未能發現 \"%s\" 設置檔"
|
||||
L["Cast"] = "施法"
|
||||
L["Cast bar"] = "施法條"
|
||||
L["Cast icon"] = "施法圖示"
|
||||
L["Casting"] = "施法中"
|
||||
L["Cast interrupted"] = "已中斷施法"
|
||||
L["Cast name"] = "施法名稱"
|
||||
L["Cast time"] = "施法時間"
|
||||
L["Cast uninterruptible"] = "無法中斷施法"
|
||||
L["Cat"] = "獵豹"
|
||||
L["Category"] = "類別"
|
||||
L["Center"] = "中間"
|
||||
L["Changed profile to %s."] = "更改設置檔為 %s"
|
||||
L["Changes the health bar to the set hostile color (Red by default) when the unit takes aggro."] = "當單位獲得仇恨時變更生命條顏色為敵對顏色(預設為紅色)。"
|
||||
L["Changes this widget into a bar, you will be able to change the height and ordering like you can change health and power bars."] = "變更這個小設定到計量條,你可以像修改生命條和動能條那樣修改高度和排列。"
|
||||
L["Channelling"] = "引導性"
|
||||
L["Child units cannot be dragged, you will have to reposition them through /shadowuf."] = "無法拖曳子單位,你必須透過 /shadowuf 來重新定位它。"
|
||||
L["Class"] = "職業"
|
||||
L["Class color tag"] = "職業着色標籤"
|
||||
L["Classes"] = "職業"
|
||||
L["Class icon"] = "職業圖示"
|
||||
L["Classificaiton"] = "職業類別"
|
||||
L["Classifications"] = "職業類別"
|
||||
L["Class name without coloring, use [classcolor][class][close] if you want the class name to be colored by class."] = "未著色的職業名稱,請使用 [classcolor][class][close] 如果你想依照職業顏色的話。"
|
||||
L["Class (Smart)"] = "職業 (智能)"
|
||||
L["Clip"] = "內間距"
|
||||
L["Close color"] = "關閉着色"
|
||||
L["Closes a color code, prevents colors from showing up on text that you do not want it to."] = "關閉一個顏色代碼,你不想要使用在文字上的着色將不會顯示。"
|
||||
L["Code"] = "代碼"
|
||||
L["Color by class"] = "依照職業着色"
|
||||
L["Color by happiness"] = "依照快樂值着色"
|
||||
L["Color by reaction on"] = "依照對應類型着色"
|
||||
L["Color code based on percentage of HP left on the unit, this works the same way as the color by health option. But for text instead of the entire bar."] = "依照單位的階段性生命值百分比着色,這與生命值選項相同,僅影響計量條上的文字。"
|
||||
L["Color code for general situation"] = "一般情況下的顏色代碼"
|
||||
L["Color code for situation"] = "某種情況下的顏色代碼"
|
||||
L["Color code for the class, use [classcolor][class][close] if you want the class text to be colored by class"] = "職業的顏色代碼,請使用 [classcolor][class][close] 如果妳想按職業著色職業文字"
|
||||
L["Color code on aggro"] = "獲得仇恨的顏色代碼"
|
||||
L["Color health by"] = "生命值着色依照"
|
||||
L["Color on aggro"] = "獲得仇恨着色"
|
||||
L["Colors"] = "着色"
|
||||
L["Colors the health bar by how happy your pet is."] = "依照妳的寵物快樂值着色生命條。"
|
||||
L["Color to use for health bars that are set to be colored by a static color."] = "為生命值着色並設定為固定顏色。"
|
||||
L["Color used when a cast cannot be interrupted, this is only used for PvE mobs."] = "當施法無法中斷時所使用的顏色,僅用於PvE怪物身上。"
|
||||
L["Color used when a cast is a channel."] = "當施法為引導性法術時所使用的顏色。"
|
||||
L["Color used when a cast is interrupted either by the caster themselves or by another unit."] = "當施法可以被自已和其他人中斷時所使用的顏色。"
|
||||
L["Color used when a cast is successfully finished."] = "當施法成功時所使用的顏色。"
|
||||
L["Color used when an unit is casting a spell."] = "當單位施放法術時所使用的顏色。"
|
||||
L["Column growth"] = "列的增長方向"
|
||||
L["Column spacing"] = "列之間的距離"
|
||||
L["Combat alpha"] = "戰鬥透明度"
|
||||
L["Combat fader"] = "戰鬥淡出"
|
||||
L["Combat fader will fade out all your frames while they are inactive and fade them back in once you are in combat or active."] = "戰鬥淡出將淡出所有你的框架,並在你進入戰鬥或活動後恢復。"
|
||||
L["Combat/resting status"] = "戰鬥/休息狀態"
|
||||
L["Combat status"] = "戰鬥狀態"
|
||||
L["Combat text"] = "戰鬥文字"
|
||||
L["Combo points"] = "連擊點數"
|
||||
L["Configuration to specific unit frames."] = "特定單位框架的配置。"
|
||||
L["Create"] = "建立"
|
||||
L["Creature type"] = "生物類型"
|
||||
L["Creature type, returns Felguard if the unit is a Felguard, Wolf if it's a Wolf and so on."] = "生物類型,如果單位是惡魔守衛則為惡魔守衛,如果是狼則為狼。"
|
||||
L["Crown indicator for group leaders."] = "隊長的皇冠標記。"
|
||||
L["Cur/Max HP (Absolute)"] = "當前/最大生命值(完整)"
|
||||
L["Cur/Max HP (Short)"] = "當前/最大生命值(簡化)"
|
||||
L["Cur/Max HP (Smart)"] = "當前/最大生命值(智能)"
|
||||
L["Cur/Max power (Absolute)"] = "當前/最大動能值(完整)"
|
||||
L["Cur/Max power (Druid)"] = "當前/最大動能值(德魯伊)"
|
||||
L["Cur/Max Power (Short)"] = "當前/最大動能值(簡化)"
|
||||
L["Cur/Max PP (Smart)"] = "當前/最大動能值(智能)"
|
||||
L["Current and maximum health, formatted as [curhp]/[maxhp], if the unit is dead or offline then that is shown instead."] = "當前和最大生命值,格式為[curhp]/[maxhp],如果單位死亡或離線則由此代替顯示。"
|
||||
L["Current and maximum power, formatted as [curpp]/[maxpp]."] = "當前和最大動能值,格式為[curhp]/[maxhp]。"
|
||||
L["Current health (Druid/Absolute)"] = "當前生命值 (德魯伊/完整)"
|
||||
L["Current health, uses a short format, 11500 is formatted as 11.5k, values below 10000 are formatted as is."] = "當前生命值,使用簡化格式11500顯示為11.5k,低於10000的生命值則不簡化。"
|
||||
L["Current HP (Absolute)"] = "當前生命值(完整)"
|
||||
L["Current HP (Short)"] = "當前生命值(簡化)"
|
||||
L["Current power (Absolute)"] = "當前動能值(完整)"
|
||||
L["Current power (Druid)"] = "當前動能值(德魯伊)"
|
||||
L["Current power (Druid/Absolute)"] = "當前動能值(德魯伊/完整)"
|
||||
L["Current Power (Short)"] = "當前動能值(簡化)"
|
||||
L["Current power, uses a short format, 12750 is formatted as 12.7k, values below 10000 are formatted as is."] = "當前動能值,使用簡化格式12750顯示為12.7k,低於10000的動能值則不簡化。"
|
||||
L["Dark"] = "暗色"
|
||||
L["Dead"] = "死亡"
|
||||
L["Debuffs"] = "減益"
|
||||
L["Decimal percent HP"] = "十進制百分比生命值"
|
||||
L["Deficit/Unit Name"] = "損失值/單位名稱"
|
||||
L["Delete"] = "刪除"
|
||||
L["Delete filter"] = "刪除篩選"
|
||||
L["Descending"] = "遞減"
|
||||
L["Disabled"] = "已停用"
|
||||
L["Disabled in %s"] = "在%s已停用"
|
||||
L["Disable event discovery"] = "停用檢測事件"
|
||||
L["Disable OmniCC"] = "禁用OmniCC計時UI"
|
||||
L["Disables showing OmniCC timers in all Shadowed Unit Frame auras."] = "在目標框架BUFF位不顯示OmniCC的計時"
|
||||
L["Disables the unit frame from turning into a vehicle when the player enters one."] = "當玩家進入載具時停用單位框架轉換為載具。"
|
||||
L["Disable vehicle swap"] = "停用載具轉換"
|
||||
L["Disabling a module on this page disables it while inside %s. Do not disable a module here if you do not want this to happen!."] = "當進入%s時停用此頁面上的一個模組。如果你不希望這種事情發生的話就不要停用!。"
|
||||
L["Disabling unit modules in various instances."] = "在各種不同副本中停用單位模組。"
|
||||
L["DND"] = "勿擾"
|
||||
L["DND:%s"] = "勿擾:%s"
|
||||
L["Documentation"] = "使用說明"
|
||||
L["Don't use a filter"] = "不使用篩選"
|
||||
L["Down"] = "下"
|
||||
L["Druid form"] = "德魯伊形態"
|
||||
L["Druid form (Short)"] = "德魯伊形態(簡化)"
|
||||
L["Druid mana bar"] = "德魯伊法力條"
|
||||
L["Dungeon role"] = "地城角色"
|
||||
L["Edge size"] = "邊緣大小"
|
||||
L["Editing %s"] = "正在編輯%s"
|
||||
L["Edit tag"] = "編輯標籤"
|
||||
L["Elite"] = "精英"
|
||||
L["Empty bar"] = "空計量條"
|
||||
L["Enable buffs"] = "啟用增益"
|
||||
L["Enable debuffs"] = "啟用減益"
|
||||
L["Enabled in %s"] = "在%s已啟用"
|
||||
L["Enabled units"] = "已啟用單位"
|
||||
L["Enable frequent updates"] = "啟用刷新頻率"
|
||||
L["Enable indicator"] = "啟用標記"
|
||||
L["Enable quick health"] = "啟用快速顯示生命值"
|
||||
L["Enable quick power"] = "啟用快速顯示動能值"
|
||||
L["Enable %s"] = "啟用%s"
|
||||
L["Enables configuration mode, letting you move and giving you example frames to setup."] = "啟用配置模組,讓你設定並移動框架樣板。"
|
||||
L["Enable temporary enchants"] = "啟用暫時性附魔"
|
||||
L["Enable units"] = "啟用單位"
|
||||
L["Enabling advanced settings will give you access to more configuration options. This is meant for people who want to tweak every single thing, and should not be enabled by default as it increases the options."] = "啟用進階設定讓你使用更多的配置選項,你可以調整細部結構,預設為不啟用。"
|
||||
L["Energy"] = "能量"
|
||||
L["Enlarge your auras"] = "放大你的光環"
|
||||
L["Error"] = "錯誤"
|
||||
L["Events"] = "事件"
|
||||
L["Events that should be used to trigger an update of this tag. Separate each event with a single space."] = "用來觸發此更新標籤的事件,用單獨的區隔來分開每個事件。"
|
||||
L["Everywhere else"] = "其他任何地方"
|
||||
L["Export"] = "匯出"
|
||||
L["F"] = "F"
|
||||
L["Fades out the unit frames of people who are not within range of you."] = "當有人超出你的距離範圍時淡出單位框架。"
|
||||
L["Failed to import layout, error:|n|n%s"] = "匯入版面編排失敗,錯誤:|n|n%s"
|
||||
L["Failed to load ShadowedUF_Options, cannot open configuration. Error returned: %s"] = "載入ShadowedUF_Options失敗,無法開啟配置。錯誤返回:%s"
|
||||
L["Failed to save tag, error:|n %s"] = "儲存標記失敗,錯誤|n %s"
|
||||
L["Female"] = "女性"
|
||||
L["Filtering both buffs and debuffs"] = "篩選增益和減益兩者"
|
||||
L["Filtering buffs only"] = "僅篩選增益"
|
||||
L["Filtering debuffs only"] = "僅篩選減益"
|
||||
L["Filter out any auras that you cannot cast on another player, or yourself."] = "篩選掉你不能施放在其他玩家或自己的任何光環。"
|
||||
L["Filter out any auras that you did not cast yourself."] = "篩選掉你不能施放在自己的任何光環。"
|
||||
L["Filter out any aura that you cannot cure."] = "篩選掉你不能消除的任何光環。"
|
||||
L["Filter type"] = "篩選類型"
|
||||
L["Finished cast"] = "完成施法"
|
||||
L["Flags the tag for frequent updating, it will update the tag on a timer regardless of any events firing."] = "標記標籤為刷新頻率。不論任何事件它將為計時器不斷刷新。"
|
||||
L["Flight"] = "飛行"
|
||||
L["Flips coloring so the bar color is shown as the background color and the background as the bar"] = "反轉顏色為計量條顏色變成背景顏色,而背景顏色變成計量條顏色"
|
||||
L["Focus"] = "專注"
|
||||
L["Focus Target"] = "專注目標"
|
||||
L["Font"] = "字型"
|
||||
L["Forces a static color to be used for the background of all bars"] = "為所有計量條的背景使用固定顏色"
|
||||
L["For target/focus"] = "於目標/專注"
|
||||
L["Frame"] = "框架"
|
||||
L["Frame alpha when you are out of combat while having no target and 100% mana or energy."] = "當你沒有目標且100%法力或能量時脫離戰鬥後的框架透明度。"
|
||||
L["Frame alpha while this unit is in combat."] = "當此單位在戰鬥中時的框架透明度。"
|
||||
L["Frames"] = "框架"
|
||||
L["Friendly"] = "友好"
|
||||
L["Friendly spell"] = "友好法術"
|
||||
L["Fuel"] = "燃料"
|
||||
L["Full size after"] = "全尺寸後"
|
||||
L["Full size before"] = "全尺寸前"
|
||||
L["General"] = "一般"
|
||||
L["General configuration to all enabled units."] = "所有已啟用單位的一般配置。"
|
||||
L["General threat situation"] = "一般仇恨條件"
|
||||
L["Ghost"] = "靈魂"
|
||||
L["Global"] = "總體"
|
||||
L["Gold checkmark - Enabled in this zone / Grey checkmark - Disabled in this zone / No checkmark - Use the default unit settings"] = "金色勾選 - 在此地區已啟用 / 灰色勾選 - 在此地區已停用 / 沒有勾選 - 使用預設的單位設定"
|
||||
L["Group by"] = "小隊依照"
|
||||
L["Group %d"] = "小隊 %d"
|
||||
L["Group number"] = "小隊"
|
||||
L["Group row spacing"] = "小隊間間距"
|
||||
L["Groups"] = "小隊"
|
||||
L["Groups per row"] = "每行小隊"
|
||||
L["Groups to show"] = "顯示小隊"
|
||||
L["Growth"] = "增長"
|
||||
L["Guardian bar"] = "護衛計時條"
|
||||
L["Guild name"] = "公會名稱"
|
||||
L["Half health"] = "一半的生命值"
|
||||
L["Happiness"] = "快樂值"
|
||||
L["Health"] = "生命值"
|
||||
L["Health bar"] = "生命條"
|
||||
L["Health bar color for friendly units."] = "友好單位的生命條顏色。"
|
||||
L["Health bar color for hostile units."] = "敵對單位的生命條顏色。"
|
||||
L["Health bar color for neutral units."] = "中立單位的生命條顏色。"
|
||||
L["Health bar color to use for hostile units who you cannot attack, used for reaction coloring."] = "你不能攻擊使用敵對生命條顏色的單位,用於對應着色。"
|
||||
L["Health bar color to use to show how much healing someone is about to receive."] = "生命條顏色用來顯示其他人的多少治療量。"
|
||||
L["Health bar color used as the transitional color for 100% -> 0% on players, as well as when your pet is mildly unhappy."] = "生命條顏色從100%->0%的過渡來着色,也可用於你的寵物快樂值。"
|
||||
L["Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."] = "生命條顏色從100%->50%的過渡來着色,也可用於你的寵物快樂值。"
|
||||
L["Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."] = "生命條顏色從50%->100%的過渡來着色,也可用於你的寵物快樂值。"
|
||||
L["Health color"] = "生命值顏色"
|
||||
L["Health percent"] = "生命值百分比"
|
||||
L["Height"] = "高"
|
||||
L["Help"] = "幫助"
|
||||
L["Hide bar when empty"] = "當計量條為空時隱藏"
|
||||
L["Hide Blizzard"] = "隱藏Blizzard框架"
|
||||
L["Hide in 6-man raid"] = "6人團隊中內隱藏"
|
||||
L["Hide in any raid"] = "任何團隊中隱藏"
|
||||
L["Hide %s"] = "隱藏%s"
|
||||
L["Hide %s frames"] = "隱藏%s框架"
|
||||
L["Hides the cast bar if there is no cast active."] = "如果當前沒有施法動作則隱藏施法條。"
|
||||
L["Hides the cooldown ring for any auras that you did not cast."] = "為你不能施放的任何光環隱藏冷卻計時。"
|
||||
L["Hide tooltips in combat"] = "戰鬥中隱藏提示訊息"
|
||||
L["Hiding and showing various aspects of the default UI such as the player buff frames."] = "隱藏和顯示各種預設的插件框架如玩家增益框架。"
|
||||
L["High"] = "高"
|
||||
L["High health"] = "高生命值"
|
||||
L["Highlight"] = "高亮"
|
||||
L["Highlight units that are debuffed with something you can cure."] = "高亮你可以消除減益的單位。"
|
||||
L["Highlight units that have aggro on any mob."] = "高亮獲得怪物仇恨的單位。"
|
||||
L["Highlight units that you are targeting or have focused."] = "高亮你當前或專注目標的單位。"
|
||||
L["Highlight units when you mouse over them."] = "當你的滑鼠移動到單位時高亮。"
|
||||
L["Hostile"] = "敵對"
|
||||
L["Hostile spell"] = "敵對法術"
|
||||
L["How close the frame should clip with the border."] = "框架和邊框的間距。"
|
||||
L["How far the background should be from the unit frame border."] = "背景和單位框架邊框的距離。"
|
||||
L["How large the background should tile"] = "背景並列的大小"
|
||||
L["How large the edges should be."] = "邊緣的大小。"
|
||||
L["How many auras per a column for example, entering two her will create two rows that are filled up to whatever per row is set as."] = "樣板中每列顯示多少光環,輸入2將創建兩行而每行均可設定。"
|
||||
L["How many auras to show in a single row."] = "單行顯示多少光環。"
|
||||
L["How many groups should be shown per row."] = "每行顯示多少小隊。"
|
||||
L["How many people are assisting the unit, for example if you put this on yourself it will show how many people are targeting your target. This includes you in the count!"] = "樣板中顯示多少人助攻此單位,如果你的目標為你自己則將顯示多少人的目標為你的目標。也包含你自己!"
|
||||
L["How many people in your raid are targeting the unit, for example if you put this on yourself it will show how many people are targeting you. This includes you in the count!"] = "樣板中顯示你的團隊有多少人的目標為此單位,如果你的目標為你自己則將顯示多少人以你為目標。也包含你自己!"
|
||||
L["How many rows total should be used, rows will be however long the per row value is set at."] = "顯示多少總行數,不管你設定每行數為多少。"
|
||||
L["How much of the frames total height this bar should get, this is a weighted value, the higher it is the more it gets."] = "此計量條應獲得多少框架總高度,這是個比重,設定更高將獲得更多。"
|
||||
L["How much spacing should be between each new row of groups."] = "在小隊每個新行中需要多少間距。"
|
||||
L["How much spacing should be provided between all of the bars inside a unit frame, negative values move them farther apart, positive values bring them closer together. 0 for no spacing."] = "在單位框架中所有計量條之間需要多少間距,負值為更遠,正值為更近,0為無間距。"
|
||||
L["How much weight this should use when figuring out the total text width."] = "當計算出總文字寬度時應使用多少比重。"
|
||||
L["How the frames should grow when a new column is added."] = "當新增一個新列時框架的增長方向為何。"
|
||||
L["How the rows should grow when new group members are added."] = "當新加入隊伍成員時框架的增長方向為何。"
|
||||
L["How you want this aura to be anchored to the unit frame."] = "你要此光環定位到單位框架的何處。"
|
||||
L["If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."] = "如果此單位受到治療,它將顯示完整治療量,否則顯示單位名稱。"
|
||||
L["If the unit is a player then class is returned, if it's a NPC then the creature type."] = "如果單位為玩家則顯示職業,如果是NPC則顯示NPC類型。"
|
||||
L["If the unit is a player then race is returned, if it's a NPC then the creature type."] = "如果單位為玩家則顯示種族,如果是NPC則顯示NPC類型。"
|
||||
L["If you casted the aura, then the buff icon will be increased in size to make it more visible."] = "如果你施放此光環,那麽此增益圖示將會被放大尺寸。"
|
||||
L["Import"] = "匯入"
|
||||
L["Import non-standard module settings"] = "匯入非標準設定的模組"
|
||||
L["Import unit frame positions"] = "匯入單位框架位置"
|
||||
L["Import visibility settings"] = "匯入可見的設定"
|
||||
L["Inactive alpha"] = "無效的透明度"
|
||||
L["Incoming heal"] = "受到的治療"
|
||||
L["Incoming heal/Name"] = "受到治療/名字"
|
||||
L["Incoming heals"] = "受到的治療量"
|
||||
L["Incoming heal (Short)"] = "受到治療(簡化)"
|
||||
L["Index"] = "索引"
|
||||
L["Indicator for your pet's happiness, only applies to Hunters."] = "為你的寵物的快樂值標記,僅用於獵人。"
|
||||
L["Indicators"] = "標記"
|
||||
L["In range alpha"] = "在距離內的透明度"
|
||||
L["Inset"] = "插入"
|
||||
L["Inside Center"] = "內部居中"
|
||||
L["Inside Center Left"] = "內部居中靠左"
|
||||
L["Inside Center Right"] = "內部居中靠右"
|
||||
L["Inside Top Left"] = "內部頂部靠左"
|
||||
L["Inside Top Right"] = "內部頂部靠右"
|
||||
L["Interrupted"] = "已中斷"
|
||||
L["Invalid interval entered, must be a number."] = "無效的輸入,必須為數字。"
|
||||
L["Invalid spell \"%s\" entered."] = "無效的\"%s\"法術輸入。"
|
||||
L["Invert colors"] = "反轉顏色"
|
||||
L["Layout manager"] = "版面編排管理"
|
||||
L["Leader"] = "隊長"
|
||||
L["Left"] = "左邊"
|
||||
L["Left Bottom"] = "左邊底部"
|
||||
L["Left Center"] = "左邊居中"
|
||||
L["Left text"] = "左邊文字"
|
||||
L["Left Top"] = "左邊頂部"
|
||||
L["Let's you modify the base font size to either make it larger or smaller."] = "讓妳可以修改基本的字型大小,不是變大就是變小。"
|
||||
L["Level"] = "等級"
|
||||
L["Level (Colored)"] = "等級(已着色)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done)"] = "等級%s - %s:%s/%s(%.2f%%已完成)"
|
||||
L["Level %s - %s: %s/%s (%.2f%% done), %s rested."] = "等級%s - %s:%s/%s(%.2f%%已完成),%s休息經驗值。"
|
||||
L["Level without any coloring."] = "等級不使用任何着色。"
|
||||
L["Light"] = "亮度"
|
||||
L["Lock frames"] = "鎖定框架"
|
||||
L["Locks the unit frame positionings hiding the mover boxes."] = "鎖定框架位置。"
|
||||
L["Low health"] = "低生命值"
|
||||
L["M"] = "M"
|
||||
L["Main Assist"] = "主助攻"
|
||||
L["Main Assists's are set by the Blizzard Main Assist system or mods that use them such as oRA3."] = "使用Blizzard系統或使用oRA3等插件設定主助攻。"
|
||||
L["Main Assist Target"] = "主助攻目標"
|
||||
L["Main Tank"] = "主坦克"
|
||||
L["Main Tank's are set by the Blizzard Main Tank system or mods that use them such as oRA3."] = "使用Blizzard系統或使用oRA3等插件設定主坦克。"
|
||||
L["Main Tank Target"] = "主坦克目標"
|
||||
L["Male"] = "男性"
|
||||
L["Mana"] = "法力"
|
||||
L["Manage aura filters"] = "管理光環篩選"
|
||||
L["Management"] = "管理"
|
||||
L["Manual position"] = "手動位置"
|
||||
L["Master looter"] = "隊長分配"
|
||||
L["Max columns"] = "最大列數量"
|
||||
L["Max health, uses a short format, 17750 is formatted as 17.7k, values below 10000 are formatted as is."] = "最大生命值,使用簡化格式17750顯示為17.7k,低於10000的生命值則不簡化。"
|
||||
L["Max HP (Absolute)"] = "最大生命值(完整)"
|
||||
L["Max HP (Short)"] = "最大生命值(簡化)"
|
||||
L["Max power (Absolute)"] = "最大動能值(完整)"
|
||||
L["Max power (Short)"] = "最大動能值(簡化)"
|
||||
L["Max power, uses a short format, 16000 is formatted as 16k, values below 10000 are formatted as is."] = "最大動能值,使用簡化格式16000顯示為16k,低於10000的動能值則不簡化。"
|
||||
L["Max rows"] = "最大行數"
|
||||
L["Medium"] = "中"
|
||||
L["Miscellaneous"] = "雜項"
|
||||
L["Missing HP (Short)"] = "生命損失值(簡化)"
|
||||
L["Missing power (Short)"] = "動能損失值(簡化)"
|
||||
L["Moonkin"] = "梟獸"
|
||||
L["Name"] = "名稱"
|
||||
L["Name (Abbreviated)"] = "名稱(縮寫)"
|
||||
L["Name of a friendly spell to check range on friendlies.|n|nThis is automatically set for your current class only."] = "偵測友方友好法術的範圍。|n|n僅依照你當前的職業自動設定。"
|
||||
L["Name of a hostile spell to check range on enemies.|n|nThis is automatically set for your current class only."] = "偵測敵方敵對法術的範圍。|n|n僅依照你當前的職業自動設定。"
|
||||
L["Neutral"] = "中立"
|
||||
L["Never (Disabled)"] = "從不(停用)"
|
||||
L["New filter"] = "新篩選"
|
||||
L["None"] = "無"
|
||||
L["NPCs only"] = "僅NPC"
|
||||
L["Offline"] = "離線"
|
||||
L["Offline timer"] = "離線計時器"
|
||||
L["Off:%s"] = "離線:%s"
|
||||
L["On aggro"] = "在獲得仇恨"
|
||||
L["On curable debuff"] = "在消除減益"
|
||||
L["On mouseover"] = "在鼠標懸停"
|
||||
L["Order"] = "排列"
|
||||
L["Or you can set a position manually"] = "或你可手動設定位置"
|
||||
L["Outline"] = "細體"
|
||||
L["Out of range alpha"] = "超出距離透明度"
|
||||
L["Outside bar limit"] = "外圍計量條限制"
|
||||
L["Override color"] = "覆蓋顏色"
|
||||
L["Party"] = "隊伍"
|
||||
L["Party frames are hidden while in any sort of raid no matter how many people."] = "當在任何人數的團隊中時隱藏隊伍框架。"
|
||||
L["Party frames are hidden while in a raid group with more than 5 people inside."] = "當在超過5人的團隊中時隱藏隊伍框架。"
|
||||
L["Party instances"] = "隊伍副本"
|
||||
L["Party Pet"] = "隊伍寵物"
|
||||
L["Party Target"] = "隊伍目標"
|
||||
L["Percentage of width the portrait should use."] = "頭像使用的寬度百分比。"
|
||||
L["Percentage value of how far outside the unit frame the incoming heal bar can go. 130% means it will go 30% outside the frame, 100% means it will not go outside."] = "距離單位框架超過多遠的百分比值才能治療。130%意指超過30%,100%意指不超過。"
|
||||
L["Percent HP"] = "百分比生命值"
|
||||
L["Percent power"] = "百分比能力值"
|
||||
L["Per column"] = "每欄"
|
||||
L["Per row"] = "每行"
|
||||
L["Pet"] = "寵物"
|
||||
L["Pet Target"] = "寵物目標"
|
||||
L["Player"] = "玩家"
|
||||
L["player cast bar"] = "玩家施法條"
|
||||
L["Players only"] = "僅玩家"
|
||||
L["Players will be colored by class, "] = "玩家將使用職業着色。"
|
||||
L["Player threat"] = "玩家仇恨"
|
||||
L["Point"] = "點"
|
||||
L["Portrait"] = "頭像"
|
||||
L["Portrait type"] = "頭像類型"
|
||||
L["Position"] = "位置"
|
||||
L["Power"] = "動能"
|
||||
L["Power bar"] = "動能條"
|
||||
L["Prevents unit tooltips from showing while in combat."] = "當在戰鬥中時顯示頭像單位的提示訊息。"
|
||||
L["Primary means of coloring the health bar, color on aggro and color by reaction will override this if necessary."] = "主要的生命條顏色,如果有必要則獲得仇恨或按對應類型的顏色可覆蓋。"
|
||||
L["Prioritize buffs"] = "優先增益"
|
||||
L["Programming in Lua"] = "編輯Lua"
|
||||
L["PvP Flag"] = "PvP標記"
|
||||
L["PVP flag indicator, Horde for Horde flagged pvpers and Alliance for Alliance flagged pvpers."] = "PVP標記,部落PVP為部落標記及聯盟PVP為聯盟標記。"
|
||||
L["PVP:%s"] = "PVP:%s"
|
||||
L["PVP timer"] = "PVP計時器"
|
||||
L["Race"] = "種族"
|
||||
L["Race (Smart)"] = "種族(智能)"
|
||||
L["Rage"] = "怒氣"
|
||||
L["Raid"] = "團隊"
|
||||
L["Raid assisting unit"] = "團隊助攻單位"
|
||||
L["Raid instances"] = "團隊副本"
|
||||
L["Raid pet"] = "團隊寵物"
|
||||
L["Raid role"] = "團隊角色"
|
||||
L["Raid role indicator, adds a shield indicator for main tanks and a sword icon for main assists."] = "團隊角色標記,主坦克顯示為盾,主助攻顯示為劍。"
|
||||
L["Raid target"] = "團隊目標"
|
||||
L["Raid target indicator."] = "團隊目標標記。"
|
||||
L["Raid targeting unit"] = "團隊目標單位"
|
||||
L["Range indicator"] = "距離標記"
|
||||
L["Range spells"] = "距離法術"
|
||||
L["Rank 1"] = "等級 1"
|
||||
L["Rare"] = "稀有"
|
||||
L["Rare Elite"] = "稀有精英"
|
||||
L["Rare indicator"] = "稀有標記"
|
||||
L["Reaction color code, use [reactcolor][name][close] to color the units name by their reaction."] = "對應顏色代碼,依照對應的單位名稱顏色來使用[reactcolor][name][close]。"
|
||||
L["Reaction color tag"] = "對應顏色標籤"
|
||||
L["Ready status"] = "準備就緒狀態"
|
||||
L["Ready status of group members."] = "小隊成員的準備就緒狀態。"
|
||||
L["Relative point"] = "相對點"
|
||||
L["Resources"] = "來源"
|
||||
L["Returns a color code of the threat situation with your target: Red for Aggro, Orange for High threat and Yellow to be careful."] = "依照你的目標的仇恨情況來對應顏色代碼,紅色為獲得仇恨,橘色為高仇恨及黃色為注意仇恨。"
|
||||
L["Returns a color code of your general threat situation on all units: Red for Aggro, Orange for High threat and Yellow to watch out."] = "依照所有單位的仇恨情況來對應顏色代碼:紅色為獲得仇恨,橘色為高仇恨及黃色為注意仇恨。"
|
||||
L["Returns a scaled threat percent of your aggro on your current target, always 0 - 100%."] = "在你的當前目標顯示你的仇恨值百分比0-100%。"
|
||||
L["Returns current health as a percentage, if the unit is dead or offline than that is shown instead."] = "顯示當前生命值百分比,如果單位已死亡或離線則顯示對應的狀態。"
|
||||
L["Returns current power as a percentage."] = "顯示當前動能值百分比。"
|
||||
L["Returns + if the unit is an elite or rare elite mob."] = "如果單位為精英或稀有精英怪則顯示+。"
|
||||
L["Returns Rare if the unit is a rare or rare elite mob."] = "如果是稀有或者稀有精英怪則顯示稀有。"
|
||||
L["Returns text based on your general threat situation on all units: Aggro for Aggro, High for being near to pulling aggro and Medium as a general warning."] = "依照所有單位的一般仇恨情況顯示文字:獲得仇恨為獲得仇恨,高為拉高仇恨,中為一般警告。"
|
||||
L["Returns text based on your threat situation with your target: Aggro for Aggro, High for being close to taking aggro, and Medium as a general warning to be wary."] = "依照你的目標的仇恨情況顯示顏色:獲得仇恨為獲得仇恨,高為接近坦克仇恨,中為警告注意仇恨。"
|
||||
L["Returns the color code based off of the units level compared to yours. If you cannot attack them then no color is returned."] = "依照目標相對於你的等級來對應顏色代碼。如果你不能攻擊他們則不對應顏色。"
|
||||
L["Returns the units current form if they are a druid, Cat for Cat Form, Moonkin for Moonkin and so on."] = "顯示單位的當前形態如果為德魯伊,獵豹為獵豹形態,梟獸為梟獸形態等等。"
|
||||
L["Returns the units sex."] = "顯示單位性別。"
|
||||
L["Right"] = "右邊"
|
||||
L["Right Bottom"] = "右邊底部"
|
||||
L["Right Center"] = "右邊居中"
|
||||
L["Right text"] = "右邊文字"
|
||||
L["Right Top"] = "右邊頂部"
|
||||
L["Role the unit is playing in dungeons formed through the Looking For Dungeon system."] = "玩家正在進行地城其角色標記由尋求地城系統鎖定。"
|
||||
L["Row growth"] = "行增長方向"
|
||||
L["Row offset"] = "行坐標"
|
||||
L["rune bar"] = "符文條"
|
||||
L["Rune bar"] = "符文條"
|
||||
L["Runic Power"] = "符能"
|
||||
L["Same as [color:sit] except it only returns red if you have aggro, rather than transiting from yellow -> orange -> red."] = "等同於[color:sit]如果你獲得仇恨除了只顯示紅色,不再顯示黃-->橘-->紅"
|
||||
L["Same as [unit:color:sit] except it only returns red if the unit has aggro, rather than transiting from yellow -> orange -> red."] = "等同於[unit:color:sit]如果單位獲得仇恨除了只顯示紅色,不再顯示黃-->橘-->紅"
|
||||
L["Scale"] = "比例"
|
||||
L["Scaled threat percent"] = "仇恨百分比比例"
|
||||
L["Scale for auras that you casted, any number above 100% is bigger tahn default, any number below 100% is smaller than default."] = "你施放的光環比例,任何高於100%的都比預設值大,任何低於100%的都比預設值小。"
|
||||
L["Screen"] = "螢幕"
|
||||
L["Search"] = "搜尋"
|
||||
L["Search tags"] = "搜尋標籤"
|
||||
L["See the documentation below for information and examples on creating tags, if you just want basic Lua or WoW API information then see the Programming in Lua and WoW Programming links."] = "查看下列的使用說明來為資訊及樣板建立標籤,如果你只想要基本的Lua或WoW API資訊請查看Lua編譯及WoW編譯的連結。"
|
||||
L["Selecting a tag text from the left panel to change tags. Truncating width, sizing, and offsets can be done in the current panel."] = "從左邊面板選擇一個標籤文字來修改標籤。在當前面板可以修改寬度,大小和坐標。"
|
||||
L["Self aura size"] = "自己的光環大小"
|
||||
L["Separate raid frames"] = "獨立團隊框架"
|
||||
L["Set filter zones"] = "設定篩選地區"
|
||||
L["Sex"] = "性別"
|
||||
L["%s frames"] = "%s框架"
|
||||
L["Short classification"] = "簡化職業類別"
|
||||
L["Short classifications, R for Rare, R+ for Rare Elite, + for Elite, B for boss, nothing is shown if they aren't any of those."] = "簡化職業類別,R為稀有,R+為稀有精英,+為精英,B為首領,如果都沒有這些則不顯示。"
|
||||
L["Short elite indicator"] = "簡化精英標記"
|
||||
L["Shorten incoming heal value, if 13,000 healing is incoming it will show 13k."] = "簡化顯示受到治療量,如13,000治療量顯示為13k。"
|
||||
L["Short version of [druidform], C = Cat, B = Bear, F = Flight and so on."] = "簡化[druidform]的形式,C=獵豹,B=熊,F=飛行等等。"
|
||||
L["Show a background behind the bars with the same texture/color but faded out."] = "顯示相同材質和顏色的背景在計量條的後面但淡出。"
|
||||
L["Show as bar"] = "計量條中顯示"
|
||||
L["Show background"] = "顯示背景"
|
||||
L["Show buffs before debuffs when sharing the same anchor point."] = "當定位在相同錨點時,增益顯示在減益前面。"
|
||||
L["Show castable on other auras only"] = "只顯示可施放的其他光環"
|
||||
L["Show cast name"] = "顯示施法名稱"
|
||||
L["Show cast rank"] = "顯示施法等級"
|
||||
L["Show cast time"] = "顯示施法時間"
|
||||
L["Show curable only"] = "只顯示可消除的"
|
||||
L["Show party as raid"] = "團隊中顯示隊伍"
|
||||
L["Show player in party"] = "隊伍中顯示玩家"
|
||||
L["Shows AFK, DND or nothing depending on the units away status."] = "依照單位暫離狀態來顯示暫離,勿擾或不顯示任何東西。"
|
||||
L["Shows combat feedback, last healing the unit received, last hit did it miss, resist, dodged and so on."] = "顯示戰鬥反饋,單位受到的最後治療量,最後是否有治療到,抵抗,免疫等等。"
|
||||
L["Shows current and maximum health in absolute form, 17500 health will be showed as 17500 health."] = "顯示完整當前和最大生命值,17500的生命值顯示為17500。"
|
||||
L["Shows current and maximum power in absolute form, 18000 power will be showed as 18000 power."] = "顯示完整當前和最大能力值,18000的動能值顯示為18000。"
|
||||
L["Shows current group number of the unit."] = "顯示單位的當前小隊編號。"
|
||||
L["Shows current health value in absolute form meaning 15000 health is shown as 15000."] = "顯示完整當前生命值,15000的生命值顯示為15000。"
|
||||
L["Shows current power value in absolute form, 15000 power will be displayed as 1500 still."] = "顯示完整當前動能值,15000的動能值顯示為15000。"
|
||||
L["Shows how long an unit has been AFK or DND."] = "顯示單位暫離或勿擾多久。"
|
||||
L["Shows how long an unit has been offline."] = "顯示單位離線多久。"
|
||||
L["Shows maximum health in absolute form, 14000 health is showed as 14000 health."] = "顯示完整最大生命值,14000生命值顯示為14000。"
|
||||
L["Shows maximum power in absolute form, 13000 power is showed as 13000 power."] = "顯示完整最大動能值,143000動能值顯示為13000。"
|
||||
L["Shows Offline, Dead, Ghost or nothing depending on the units current status."] = "依照單位當前狀態來顯示離線,死亡,靈魂或不顯示任何東西。"
|
||||
L["Show's the units guild name if they are in a guild."] = "如果有公會則顯示單位的公會名稱。"
|
||||
L["Shows the units health as a percentage rounded to the first decimal, meaning 61 out of 110 health is shown as 55.4%."] = "使用壹個小數點的百分比來顯示生命值, 這意味著 61 / 110 生命值將顯示為 55.4%."
|
||||
L["Show your auras only"] = "只顯示你的光環"
|
||||
L["Simple aura filtering by whitelists and blacklists."] = "簡易的增益和減益篩選於白名單和黑名單。"
|
||||
L["Size"] = "大小"
|
||||
L["Smart level"] = "智能等級"
|
||||
L["Smart level, returns Boss for bosses, +50 for a level 50 elite mob, or just 80 for a level 80."] = "智能等級,首領顯示為首領,等級50的精英怪顯示為+50,等級80顯示為80。"
|
||||
L["Smart number formating for [curmaxhp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "為[curmaxhp]顯示智能數值,數值低於1,000,000顯示為此,數值高於1,000,000顯示為1m。"
|
||||
L["Smart number formating for [curmaxpp], numbers below 1,000,000 are left as is, numbers above 1,000,000 will use the short version such as 1m."] = "為[curmaxpp]顯示智能數值,數值低於1,000,000顯示為此,數值高於1,000,000顯示為1m。"
|
||||
L["%s member"] = "%s成員"
|
||||
L["Sorting"] = "分類"
|
||||
L["Sort method"] = "分類方式"
|
||||
L["Sort order"] = "分類排列"
|
||||
L["Spacing"] = "間隔"
|
||||
L["Spacing between each row"] = "每行之間的間隔"
|
||||
L["%s (%s): %s/%s (%.2f%% done)"] = "%s (%s): %s/%s (%.2f%% 已完成)"
|
||||
L["Static"] = "休息"
|
||||
L["Status"] = "狀態"
|
||||
L["Style of borders to show for all auras."] = "為所有光環邊框顯示樣式。"
|
||||
L["T"] = "T"
|
||||
L["Tag list"] = "標籤清單"
|
||||
L["Tag name"] = "標籤名稱"
|
||||
L["Tags"] = "標籤"
|
||||
L["Tag that you will use to access this code, do not wrap it in brackets or parenthesis it's automatically done. For example, you would enter \"foobar\" and then access it with [foobar]."] = "你用來存取此代碼的標籤,不要使用方或圓括號,它會自動加入。例如,你輸入\"foobar\"就會自動變成[foobar]來存取。"
|
||||
L["Target"] = "目標"
|
||||
L["Target of Target"] = "目標的目標"
|
||||
L["Target of Target of Target"] = "目標的目標的目標"
|
||||
L["Temporary enchants"] = "暫時性附魔"
|
||||
L["Test Aura"] = "測試光環"
|
||||
L["Test spell"] = "測試法術"
|
||||
L["Text"] = "文字"
|
||||
L["Text management"] = "文字管理"
|
||||
L["Text name"] = "文字名稱"
|
||||
L["Text name that you can use to identify this text from others when configuring."] = "你可以從其他的使用此識別文字來配置文字名稱。"
|
||||
L["Text parent"] = "文字來源"
|
||||
L["Text/Tags"] = "文字/標籤"
|
||||
L["The blacklist \"%s\" already exists."] = "\"%s\"已經存在於黑名單。"
|
||||
L["The check boxes below will allow you to enable or disable units."] = "下列的勾選框允許你啟用或停用單位。"
|
||||
L["The player frame will not be hidden regardless, you will have to manually disable it either entirely or per zone type."] = "無論此玩家框架是否會被隱藏,你將可以完全或每個地區輸入手動停用它。"
|
||||
L["The tag \"%s\" already exists."] = "\"%s\"已存在於此標籤。"
|
||||
L["The whitelist \"%s\" already exists."] = "\"%s\"已經存在於白名單。"
|
||||
L["Thick outline"] = "粗體"
|
||||
L["Thin outline"] = "細體"
|
||||
L["This bar will automatically hide when you are at the level cap, or you do not have any reputations tracked."] = "當你達到頂級或你沒有追蹤任何聲望時自動隱藏此計量條。"
|
||||
L["This filter has no auras in it, you will have to add some using the dialog above."] = "沒有光環在篩選中,你必須使用上面的對話框來新增。"
|
||||
L["This filter has no aura types set to filter out."] = "在篩選中設定要篩選的光環類型。"
|
||||
L["This unit depends on another to work, disabling %s will disable %s."] = "此單位必須依靠另一個才能顯示,停用%s也同時停用%s。"
|
||||
L["This unit has child units that depend on it, you need to enable this unit before you can enable its children."] = "有子單位依靠在此單位,你需要在啟用子單位之前先啟用此單位。"
|
||||
L["This will disable the automatic detection of what events this tag will need, you should leave this unchecked unless you know what you are doing."] = "這將停用自動檢測什麼事件需要此標記功能,你應保持這個未勾選除非你知道你在做什麽。"
|
||||
L["This will override all background colorings for bars including custom set ones."] = "這將覆蓋所有計量條的背景顏色,包括自訂設定的。"
|
||||
L["Threat"] = "仇恨"
|
||||
L["Threat situation"] = "仇恨情況"
|
||||
L["Tile size"] = "標題大小"
|
||||
L["Timers for self auras only"] = "只為自己的光環顯示計時器"
|
||||
L["Top"] = "頂部"
|
||||
L["Top Center"] = "頂部居中"
|
||||
L["Top Left"] = "頂部靠左"
|
||||
L["Top Right"] = "頂部靠右"
|
||||
L["Total number of combo points you have on your target."] = "你在你的目標身上的總連擊點數。"
|
||||
L["Totem bar"] = "圖騰條"
|
||||
L["Travel"] = "旅行"
|
||||
L["Tree"] = "樹"
|
||||
L["Turns fast updating of the power bar on giving you more up to date power information than normal."] = "開啟快速刷新動能條,讓你有更多關於動能的資訊。"
|
||||
L["Turns on fast updating of health bars giving you more up to date health info."] = "開啟快速刷新生命條,讓你有更多關於生命的資訊。"
|
||||
L["Turns this widget into a bar that can be resized and ordered just like health and power bars."] = "改變計量條的比重,可以調整排列就像生命條和動能條一樣。"
|
||||
L["Unattackable hostile"] = "不可攻擊的敵對單位"
|
||||
L["Unit color code on aggro"] = "獲得仇恨的單位顏色代碼"
|
||||
L["Unit colored situation"] = "單位着色情況"
|
||||
L["Unit configuration"] = "單位配置"
|
||||
L["Unit faction"] = "單位陣營"
|
||||
L["Unit name"] = "單位名稱"
|
||||
L["Unit name (Class colored)"] = "單位名稱(職業着色)"
|
||||
L["Unit name colored by class."] = "依照職業着色單位名稱。"
|
||||
L["Units"] = "單位"
|
||||
L["Units alignment, Thrall will return Horde, Magni Bronzebeard will return Alliance."] = "單位陣營,如薩爾顯示為部落,麥格尼·銅須顯示為聯盟。"
|
||||
L["Unit scaled threat"] = "單位仇恨比例"
|
||||
L["Units classification, Rare, Rare Elite, Elite, Boss, nothing is shown if they aren't any of those."] = "單位類別,稀有,稀有精英,精英,首領,如果不是這些則不顯示。"
|
||||
L["Unit server"] = "單位伺服器"
|
||||
L["Unit server, if they are from your server then nothing is shown."] = "單位伺服器,如果來自同伺服器則不顯示。"
|
||||
L["Unit situation name"] = "單位情況名稱"
|
||||
L["Units per column"] = "每行單位數"
|
||||
L["Units race, Blood Elf, Tauren, Troll (unfortunately) and so on."] = "單位種族,血精靈,牛頭人,食人妖 (被遺忘者)等等。"
|
||||
L["Unlink frames"] = "脫離框架"
|
||||
L["Up"] = "上"
|
||||
L["Update interval"] = "刷新間隔"
|
||||
L["Using unit settings"] = "使用單位設定"
|
||||
L["Various units can be enabled through this page, such as raid or party targets."] = "各種單位可透過此頁面啟用,如團隊或隊伍的目標。"
|
||||
L["Vehicle"] = "載具"
|
||||
L["Vehicles"] = "垂直"
|
||||
L["View"] = "查看"
|
||||
L["Visibility"] = "可見性"
|
||||
L["WARNING: This will unlink all frames from each other so you can move them without another frame moving with it."] = "警告:這將解除所有框架之間的連結,所以你可以移動任何框架到任何地方。"
|
||||
L["When the unit is mising health, the [missinghp] tag is shown, when they are at full health then the [name] tag is shown. This lets you see -1000 when they are missing 1000 HP, but their name when they are not missing any."] = "當單位的生命損失時,將顯示[missinghp]標籤。當單位生命恢復時,將顯示[name]標籤。當生命損失1000時則顯示為-1000,當生命無損失時則顯示為名稱。"
|
||||
L["When this filter is active, apply the filter to buffs."] = "當此篩選執行時,篩選增益。"
|
||||
L["When this filter is active, apply the filter to debuffs."] = "當此篩選執行時,篩選減益。"
|
||||
L["When to color the empty bar by reaction, overriding the default color by option."] = "當空的計量條顏色確認時,覆蓋選項的預設顏色。"
|
||||
L["When to color the health bar by the units reaction, overriding the color health by option."] = "當單位的生命條顏色確認時,覆蓋選項的預設生命條顏色。"
|
||||
L["Where inside the frame the text should be anchored to."] = "框架內文字定位何處。"
|
||||
L["Where to anchor the cast name text."] = "施法名稱文字定位何處。"
|
||||
L["Where to anchor the cast time text."] = "施法時間文字定位何處。"
|
||||
L["Whitelist"] = "白名單"
|
||||
L["Whitelist filters"] = "白名單篩選"
|
||||
L["Whitelists"] = "白名單"
|
||||
L["Widget size"] = "比重大小"
|
||||
L["Width"] = "寬"
|
||||
L["Width percent"] = "寬度百分比"
|
||||
L["Width weight"] = "寬度比重"
|
||||
L["Will not import settings of modules that are not included with Shadowed Unit Frames by default."] = "預設值為不會匯入那些不在Shadowed Unit Frames內的模組設定。"
|
||||
L["Works the same as %s, but this is only shown if the unit is in Cat or Bear form."] = "和%s效果一樣,但只在單位是獵豹或巨熊形態時顯示。"
|
||||
L["WoW Programming"] = "WoW編譯"
|
||||
L["WoW Programming is a good resource for finding out what difference API's do and how to call them."] = "WOW編譯是一個不同於API的執行能力並如何呼叫他們。"
|
||||
L["X Offset"] = "X坐標"
|
||||
L["XP/Rep bar"] = "經驗/聲望條"
|
||||
L["Y Offset"] = "Y坐標"
|
||||
L["You can add new custom tags through this page, if you're looking to change what tags are used in text look under the Text tab for an Units configuration."] = "你可以在此頁面新增新的自訂標籤,為單位配置變更你想看到什麼標籤使用於文字標籤下的文字。"
|
||||
L["You can find more information on creating your own custom tags in the \"Help\" tab above."] = "在上面的\"幫助\"標籤上你可以找到更多關於建立自訂標籤的資訊。"
|
||||
L["You can import another Shadowed Unit Frame users configuration by entering the export code they gave you below. This will backup your old layout to \"Import Backup\".|n|nIt will take 30-60 seconds for it to load your layout when you paste it in, please by patient."] = "你可以在下面匯入其他玩家所匯出的Shadowed Unit Frame的代碼,這將備份你原本的版面編排到\"匯入備份\"中。|n|n這需要30-60秒來載入,請耐心等待。"
|
||||
L["You cannot edit this tag because it is one of the default ones included in this mod. This function is here to provide an example for your own custom tags."] = "你不能編輯此標籤因為這是預設標籤中的一個。這有函數提供自訂標籤的範例給你。"
|
||||
L["You cannot name a tag \"%s\", tag names should contain no brackets or parenthesis."] = "你不能命名\"%s\"的標籤,標籤名稱不能包含方括號或圓括號。"
|
||||
L["You can set what unit frame should use what filter group and in what zone type here, if you want to change what auras goes into what group then see the \"Manage aura groups\" option."] = "你可以在什麼地區類型中設定什麼單位框架使用什麼篩選組,如果妳想要變更光環到哪個光環組可查看\"管理光環分組\"選項。"
|
||||
L["You do not have any filters of this type added yet, you will have to create one in the management panel before this page is useful."] = "你還沒新增此類型的任何篩選,你必須先在管理頁面建立一個。"
|
||||
L["You have entered combat, unit frames have been locked. Once you leave combat you will need to unlock them again through /shadowuf."] = "你已進入戰鬥,單位框架已被鎖定。當你離開戰鬥後你需要透過命令/shadowuf來解鎖。"
|
||||
L["You have to set the events to fire, you can only enter letters and underscores, \"FOO_BAR\" for example is valid, \"APPLE_5_ORANGE\" is not because it contains a number."] = "妳只能輸入字母和下劃線, 如 \"FOO_BAR\" 為可用, 而\"APPLE_5_ORANGE\" 不可以因為包含了壹個數字."
|
||||
L["You must enter a number that is 0 or higher, negative numbers are not allowed."] = "你必須輸入一個>=0的值,不可為負數。"
|
||||
L["You must enter a tag name."] = "你必須輸入一個標籤名稱。"
|
||||
L["You must wrap your code in a function."] = "你必須在函數中包裝你的代碼。"
|
||||
L["Your active layout is the profile used for import backup, this cannot be overwritten by an import. Change your profiles to something else and try again."] = "妳的已激活布局已被用作導入備份的配置文件, 這個不能被導入所覆蓋. 修改妳的配置文件並再次嘗試."
|
||||
L["Your code must be wrapped in a function, for example, if you were to make a tag to return the units name you would do:|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"] = "你的代碼必須包含在函數中,例如,你要在單位名稱中顯示標記你必須這樣寫::|n|nfunction(unit, unitOwner)|nreturn UnitName(unitOwner)|nend"
|
||||
L["You will need to create an aura filter before you can set which unit to enable aura filtering on."] = "在妳設置需要過濾光環的單位前妳必須創建壹個光環過濾器."
|
||||
L["You will need to do a /console reloadui before a hidden frame becomes visible again.|nPlayer and other unit frames are automatically hidden depending on if you enable the unit in Shadowed Unit Frames."] = "隱藏框架在刺變為可見時你必須先執行/console reloadui重載插件。|n玩家和其他單位框架是否自動隱藏將取決於你在Shadowed Unit Frames中有無啟用該單位。"
|
||||
L["Zone configuration"] = "地區配置"
|
||||
|
||||
local ShadowUF = select(2, ...)
|
||||
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
|
||||
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,610 @@
|
||||
local Auras = {}
|
||||
local stealableColor = {r = 1, g = 1, b = 1}
|
||||
local playerUnits = {player = true, vehicle = true, pet = true}
|
||||
local mainHand, offHand = {time = 0}, {time = 0}
|
||||
local tempEnchantScan
|
||||
ShadowUF:RegisterModule(Auras, "auras", ShadowUF.L["Auras"])
|
||||
|
||||
function Auras:OnEnable(frame)
|
||||
frame.auras = frame.auras or {}
|
||||
|
||||
frame:RegisterNormalEvent("PLAYER_ENTERING_WORLD", self, "Update")
|
||||
frame:RegisterUnitEvent("UNIT_AURA", self, "Update")
|
||||
frame:RegisterUpdateFunc(self, "Update")
|
||||
|
||||
self:UpdateFilter(frame)
|
||||
end
|
||||
|
||||
function Auras:OnDisable(frame)
|
||||
frame:UnregisterAll(self)
|
||||
end
|
||||
|
||||
-- Aura positioning code
|
||||
-- Definitely some of the more unusual code I've done, not sure I really like this method
|
||||
-- but it does allow more flexibility with how things are anchored without me having to hardcode the 10 different growth methods
|
||||
local function load(text)
|
||||
local result, err = loadstring(text)
|
||||
if( err ) then
|
||||
error(err, 3)
|
||||
return nil
|
||||
end
|
||||
|
||||
return result()
|
||||
end
|
||||
|
||||
local positionData = setmetatable({}, {
|
||||
__index = function(tbl, index)
|
||||
local data = {}
|
||||
local columnGrowth = ShadowUF.Layout:GetColumnGrowth(index)
|
||||
local auraGrowth = ShadowUF.Layout:GetAuraGrowth(index)
|
||||
data.xMod = (columnGrowth == "RIGHT" or auraGrowth == "RIGHT") and 1 or -1
|
||||
data.yMod = (columnGrowth ~= "TOP" and auraGrowth ~= "TOP") and -1 or 1
|
||||
|
||||
local auraX, colX, auraY, colY, xOffset, yOffset, initialXOffset, initialYOffset = 0, 0, 0, 0, "", "", "", ""
|
||||
if( columnGrowth == "LEFT" or columnGrowth == "RIGHT" ) then
|
||||
colX = 1
|
||||
xOffset = " + offset"
|
||||
initialXOffset = string.format(" + (%d * offset)", data.xMod)
|
||||
auraY = 3
|
||||
data.isSideGrowth = true
|
||||
elseif( columnGrowth == "TOP" or columnGrowth == "BOTTOM" ) then
|
||||
colY = 2
|
||||
yOffset = " + offset"
|
||||
initialYOffset = string.format(" + (%d * offset)", data.yMod)
|
||||
auraX = 2
|
||||
end
|
||||
|
||||
data.initialAnchor = load(string.format([[return function(button, offset)
|
||||
button:ClearAllPoints()
|
||||
button:SetPoint(button.point, button.anchorTo, button.relativePoint, button.xOffset%s, button.yOffset%s)
|
||||
end]], initialXOffset, initialYOffset))
|
||||
data.column = load(string.format([[return function(button, positionTo, offset)
|
||||
button:ClearAllPoints()
|
||||
button:SetPoint("%s", positionTo, "%s", %d * (%d%s), %d * (%d%s)) end
|
||||
]], ShadowUF.Layout:ReverseDirection(columnGrowth), columnGrowth, data.xMod, colX, xOffset, data.yMod, colY, yOffset))
|
||||
data.aura = load(string.format([[return function(button, positionTo)
|
||||
button:ClearAllPoints()
|
||||
button:SetPoint("%s", positionTo, "%s", %d, %d) end
|
||||
]], ShadowUF.Layout:ReverseDirection(auraGrowth), auraGrowth, data.xMod * auraX, data.yMod * auraY))
|
||||
|
||||
tbl[index] = data
|
||||
return tbl[index]
|
||||
end,
|
||||
})
|
||||
|
||||
local function positionButton(id, group, config)
|
||||
local position = positionData[group.forcedAnchorPoint or config.anchorPoint]
|
||||
local button = group.buttons[id]
|
||||
button.isAuraAnchor = nil
|
||||
|
||||
-- Alright, in order to find out where an aura group is going to be anchored to certain buttons need
|
||||
-- to be flagged as suitable anchors visually, this speeds it up bcause this data is cached and doesn't
|
||||
-- have to be recalculated unless auras are specifically changed
|
||||
if( id > 1 ) then
|
||||
if( position.isSideGrowth and id <= config.perRow ) then
|
||||
button.isAuraAnchor = true
|
||||
end
|
||||
|
||||
if( id % config.perRow == 1 or config.perRow == 1 ) then
|
||||
position.column(button, group.buttons[id - config.perRow], 0)
|
||||
|
||||
if( not position.isSideGrowth ) then
|
||||
button.isAuraAnchor = true
|
||||
end
|
||||
else
|
||||
position.aura(button, group.buttons[id - 1])
|
||||
end
|
||||
else
|
||||
button.isAuraAnchor = true
|
||||
button.point = ShadowUF.Layout:GetPoint(config.anchorPoint)
|
||||
button.relativePoint = ShadowUF.Layout:GetRelative(config.anchorPoint)
|
||||
button.xOffset = config.x + (position.xMod * ShadowUF.db.profile.backdrop.inset)
|
||||
button.yOffset = config.y + (position.yMod * ShadowUF.db.profile.backdrop.inset)
|
||||
button.anchorTo = group.anchorTo
|
||||
|
||||
position.initialAnchor(button, 0)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local columnsHaveScale = {}
|
||||
local function positionAllButtons(group, config)
|
||||
local position = positionData[group.forcedAnchorPoint or config.anchorPoint]
|
||||
|
||||
-- Figure out which columns have scaling so we can work out positioning
|
||||
local columnID = 0
|
||||
for id, button in pairs(group.buttons) do
|
||||
if( id % config.perRow == 1 or config.perRow == 1 ) then
|
||||
columnID = columnID + 1
|
||||
columnsHaveScale[columnID] = nil
|
||||
end
|
||||
|
||||
if( not columnsHaveScale[columnID] and button.isSelfScaled ) then
|
||||
local size = math.ceil(button:GetSize() * button:GetScale())
|
||||
columnsHaveScale[columnID] = columnsHaveScale[columnID] and math.max(size, columnsHaveScale[columnID]) or size
|
||||
end
|
||||
end
|
||||
|
||||
local columnID = 1
|
||||
for id, button in pairs(group.buttons) do
|
||||
if( id > 1 ) then
|
||||
if( id % config.perRow == 1 or config.perRow == 1 ) then
|
||||
columnID = columnID + 1
|
||||
|
||||
local anchorButton = group.buttons[id - config.perRow]
|
||||
local previousScale, currentScale = columnsHaveScale[columnID - 1], columnsHaveScale[columnID]
|
||||
local offset = 0
|
||||
-- Previous column has a scaled aura, and the button we are anchoring to is not scaled
|
||||
if( previousScale and not anchorButton.isSelfScaled ) then
|
||||
offset = (previousScale / 4)
|
||||
end
|
||||
|
||||
-- Current column has a scaled aura, and the button isn't scaled
|
||||
if( currentScale and not button.isSelfScaled ) then
|
||||
offset = offset + (currentScale / 4)
|
||||
end
|
||||
|
||||
-- Current anchor is scaled, previous is not
|
||||
if( button.isSelfScaled and not anchorButton.isSelfScaled ) then
|
||||
offset = offset - (currentScale / 6)
|
||||
end
|
||||
|
||||
-- At least one of them is scaled
|
||||
if( ( not button.isSelfScaled or not anchorButton.isSelfScaled ) and offset > 0 ) then
|
||||
offset = offset + 1
|
||||
end
|
||||
|
||||
--print(columnID, math.ceil(offset))
|
||||
position.column(button, anchorButton, math.ceil(offset))
|
||||
else
|
||||
position.aura(button, group.buttons[id - 1])
|
||||
end
|
||||
-- If the initial column is self scaled, but the initial anchor isn't, will have to reposition it
|
||||
elseif( columnsHaveScale[columnID] ) then
|
||||
local offset = math.ceil(columnsHaveScale[columnID] / 8)
|
||||
if( button.isSelfScaled ) then
|
||||
offset = -(offset / 2)
|
||||
else
|
||||
offset = offset + 2
|
||||
end
|
||||
|
||||
--print(1, offset)
|
||||
position.initialAnchor(button, offset)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Aura button functions
|
||||
-- Updates the X seconds left on aura tooltip while it's shown
|
||||
local function updateTooltip(self)
|
||||
if( GameTooltip:IsOwned(self) ) then
|
||||
GameTooltip:SetUnitAura(self.unit, self.auraID, self.filter)
|
||||
end
|
||||
end
|
||||
|
||||
local function showTooltip(self)
|
||||
if( not ShadowUF.db.profile.locked ) then return end
|
||||
|
||||
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT")
|
||||
if( self.filter == "TEMP" ) then
|
||||
GameTooltip:SetInventoryItem("player", self.auraID)
|
||||
self:SetScript("OnUpdate", nil)
|
||||
else
|
||||
GameTooltip:SetUnitAura(self.unit, self.auraID, self.filter)
|
||||
self:SetScript("OnUpdate", updateTooltip)
|
||||
end
|
||||
end
|
||||
|
||||
local function hideTooltip(self)
|
||||
self:SetScript("OnUpdate", nil)
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
|
||||
local function cancelBuff(self)
|
||||
if( not ShadowUF.db.profile.locked ) then return end
|
||||
|
||||
if( self.filter == "TEMP" ) then
|
||||
CancelItemTempEnchantment(self.auraID - 15)
|
||||
else
|
||||
CancelUnitBuff(self.unit, self.auraID, self.filter)
|
||||
end
|
||||
end
|
||||
|
||||
local function updateButton(id, group, config)
|
||||
local button = group.buttons[id]
|
||||
if( not button ) then
|
||||
group.buttons[id] = CreateFrame("Button", nil, group)
|
||||
|
||||
button = group.buttons[id]
|
||||
button:SetScript("OnEnter", showTooltip)
|
||||
button:SetScript("OnLeave", hideTooltip)
|
||||
button:SetScript("OnClick", cancelBuff)
|
||||
button:RegisterForClicks("RightButtonUp")
|
||||
|
||||
button.cooldown = CreateFrame("Cooldown", nil, button)
|
||||
button.cooldown:SetAllPoints(button)
|
||||
button.cooldown:SetReverse(true)
|
||||
button.cooldown:SetFrameLevel(7)
|
||||
button.cooldown:Hide()
|
||||
|
||||
button.stack = button:CreateFontString(nil, "OVERLAY")
|
||||
button.stack:SetFont("Interface\\AddOns\\ShadowedUnitFrames\\media\\fonts\\Myriad Condensed Web.ttf", 10, "OUTLINE")
|
||||
button.stack:SetShadowColor(0, 0, 0, 1.0)
|
||||
button.stack:SetShadowOffset(0.50, -0.50)
|
||||
button.stack:SetHeight(1)
|
||||
button.stack:SetWidth(1)
|
||||
button.stack:SetAllPoints(button)
|
||||
button.stack:SetJustifyV("BOTTOM")
|
||||
button.stack:SetJustifyH("RIGHT")
|
||||
|
||||
button.border = button:CreateTexture(nil, "OVERLAY")
|
||||
button.border:SetPoint("CENTER", button)
|
||||
|
||||
button.icon = button:CreateTexture(nil, "BACKGROUND")
|
||||
button.icon:SetAllPoints(button)
|
||||
button.icon:SetTexCoord(0.07, 0.93, 0.07, 0.93)
|
||||
end
|
||||
|
||||
if( ShadowUF.db.profile.auras.borderType == "" ) then
|
||||
button.border:Hide()
|
||||
elseif( ShadowUF.db.profile.auras.borderType == "blizzard" ) then
|
||||
button.border:SetTexture("Interface\\Buttons\\UI-Debuff-Overlays")
|
||||
button.border:SetTexCoord(0.296875, 0.5703125, 0, 0.515625)
|
||||
button.border:Show()
|
||||
else
|
||||
button.border:SetTexture("Interface\\AddOns\\ShadowedUnitFrames\\media\\textures\\border-" .. ShadowUF.db.profile.auras.borderType)
|
||||
button.border:SetTexCoord(0, 1, 0, 1)
|
||||
button.border:Show()
|
||||
end
|
||||
|
||||
-- Set the button sizing
|
||||
button.cooldown.noCooldownCount = ShadowUF.db.profile.omnicc
|
||||
button:SetHeight(config.size)
|
||||
button:SetWidth(config.size)
|
||||
button.border:SetHeight(config.size + 1)
|
||||
button.border:SetWidth(config.size + 1)
|
||||
button:ClearAllPoints()
|
||||
button:Hide()
|
||||
|
||||
-- Position the button quickly
|
||||
positionButton(id, group, config)
|
||||
end
|
||||
|
||||
-- Let the mover access this for creating aura things
|
||||
Auras.updateButton = updateButton
|
||||
|
||||
-- Create an aura anchor as well as the buttons to contain it
|
||||
local function updateGroup(self, type, config, reverseConfig)
|
||||
self.auras[type] = self.auras[type] or CreateFrame("Frame", nil, self.highFrame)
|
||||
|
||||
local group = self.auras[type]
|
||||
group.buttons = group.buttons or {}
|
||||
|
||||
group.maxAuras = config.perRow * config.maxRows
|
||||
group.totalAuras = 0
|
||||
group.temporaryEnchants = 0
|
||||
group.type = type
|
||||
group.parent = self
|
||||
group.anchorTo = self
|
||||
group:SetFrameLevel(5)
|
||||
group:Show()
|
||||
|
||||
-- If debuffs are anchored to buffs, debuffs need to grow however buffs do
|
||||
if( config.anchorOn and reverseConfig.enabled ) then
|
||||
group.forcedAnchorPoint = reverseConfig.anchorPoint
|
||||
end
|
||||
|
||||
if( self.unit == "player" ) then
|
||||
mainHand.time = 0
|
||||
offHand.time = 0
|
||||
|
||||
group:SetScript("OnUpdate", config.temporary and tempEnchantScan or nil)
|
||||
else
|
||||
group:SetScript("OnUpdate", nil)
|
||||
end
|
||||
|
||||
-- Update filters used for the anchor
|
||||
group.filter = group.type == "buffs" and "HELPFUL" or group.type == "debuffs" and "HARMFUL" or ""
|
||||
|
||||
-- This is a bit of an odd filter, when used with a HELPFUL filter, it will only return buffs you can cast on group members
|
||||
-- When used with HARMFUL it will only return debuffs you can cure
|
||||
if( config.raid ) then
|
||||
group.filter = group.filter .. "|RAID"
|
||||
end
|
||||
|
||||
for id, button in pairs(group.buttons) do
|
||||
updateButton(id, group, config)
|
||||
end
|
||||
end
|
||||
|
||||
-- Update aura positions based off of configuration
|
||||
function Auras:OnLayoutApplied(frame, config)
|
||||
if( frame.auras ) then
|
||||
if( frame.auras.buffs ) then
|
||||
for _, button in pairs(frame.auras.buffs.buttons) do
|
||||
button:Hide()
|
||||
end
|
||||
end
|
||||
if( frame.auras.debuffs ) then
|
||||
for _, button in pairs(frame.auras.debuffs.buttons) do
|
||||
button:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if( not frame.visibility.auras ) then return end
|
||||
|
||||
if( config.auras.buffs.enabled ) then
|
||||
updateGroup(frame, "buffs", config.auras.buffs, config.auras.debuffs)
|
||||
end
|
||||
|
||||
if( config.auras.debuffs.enabled ) then
|
||||
updateGroup(frame, "debuffs", config.auras.debuffs, config.auras.buffs)
|
||||
end
|
||||
|
||||
-- Anchor an aura group to another aura group
|
||||
frame.auras.anchorAurasOn = nil
|
||||
if( config.auras.buffs.enabled and config.auras.debuffs.enabled ) then
|
||||
if( config.auras.buffs.anchorOn ) then
|
||||
frame.auras.anchorAurasOn = frame.auras.debuffs
|
||||
frame.auras.anchorAurasChild = frame.auras.buffs
|
||||
elseif( config.auras.debuffs.anchorOn ) then
|
||||
frame.auras.anchorAurasOn = frame.auras.buffs
|
||||
frame.auras.anchorAurasChild = frame.auras.debuffs
|
||||
end
|
||||
end
|
||||
|
||||
-- Check if either auras are anchored to each other
|
||||
if( config.auras.buffs.anchorPoint == config.auras.debuffs.anchorPoint and config.auras.buffs.enabled and config.auras.debuffs.enabled and not config.auras.buffs.anchorOn and not config.auras.debuffs.anchorOn ) then
|
||||
frame.auras.anchor = frame.auras[config.auras.buffs.prioritize and "buffs" or "debuffs"]
|
||||
frame.auras.primary = config.auras.buffs.prioritize and "buffs" or "debuffs"
|
||||
frame.auras.secondary = frame.auras.primary == "buffs" and "debuffs" or "buffs"
|
||||
else
|
||||
frame.auras.anchor = nil
|
||||
end
|
||||
|
||||
self:UpdateFilter(frame)
|
||||
end
|
||||
|
||||
-- Temporary enchant support
|
||||
local timeElapsed = 0
|
||||
local function updateTemporaryEnchant(frame, slot, tempData, hasEnchant, timeLeft, charges)
|
||||
-- If there's less than a 750 millisecond differences in the times, we don't need to bother updating.
|
||||
-- Any sort of enchant takes more than 0.750 seconds to cast so it's impossible for the user to have two
|
||||
-- temporary enchants with that little difference, as totems don't really give pulsing auras anymore.
|
||||
if( tempData.has and ( timeLeft < tempData.time and ( tempData.time - timeLeft ) < 750 ) and charges == tempData.charges ) then return false end
|
||||
|
||||
-- Some trickys magic, we can't get the start time of temporary enchants easily.
|
||||
-- So will save the first time we find when a new enchant is added
|
||||
if( timeLeft > tempData.time or not tempData.has ) then
|
||||
tempData.startTime = GetTime()
|
||||
end
|
||||
|
||||
tempData.has = hasEnchant
|
||||
tempData.time = timeLeft
|
||||
tempData.charges = charges
|
||||
|
||||
local config = ShadowUF.db.profile.units[frame.parent.unitType].auras[frame.type]
|
||||
|
||||
-- Create any buttons we need
|
||||
if( #(frame.buttons) < frame.temporaryEnchants ) then
|
||||
updateButton(frame.temporaryEnchants, frame, config)
|
||||
end
|
||||
|
||||
local button = frame.buttons[frame.temporaryEnchants]
|
||||
|
||||
-- Purple border
|
||||
button.border:SetVertexColor(0.50, 0, 0.50)
|
||||
|
||||
-- Show the cooldown ring
|
||||
if( not ShadowUF.db.profile.auras.disableCooldown ) then
|
||||
button.cooldown:SetCooldown(tempData.startTime, timeLeft / 1000)
|
||||
button.cooldown:Show()
|
||||
end
|
||||
|
||||
-- Enlarge our own auras
|
||||
if( config.enlargeSelf and caster == ShadowUF.playerUnit ) then
|
||||
button.isSelfScaled = true
|
||||
button:SetScale(config.selfScale)
|
||||
else
|
||||
button.isSelfScaled = nil
|
||||
button:SetScale(1)
|
||||
end
|
||||
|
||||
-- Size it
|
||||
button:SetHeight(config.size)
|
||||
button:SetWidth(config.size)
|
||||
button.border:SetHeight(config.size + 1)
|
||||
button.border:SetWidth(config.size + 1)
|
||||
|
||||
-- Stack + icon + show! Never understood why, auras sometimes return 1 for stack even if they don't stack
|
||||
button.auraID = slot
|
||||
button.filter = "TEMP"
|
||||
button.unit = nil
|
||||
button.columnHasScaled = nil
|
||||
button.previousHasScale = nil
|
||||
button.icon:SetTexture(GetInventoryItemTexture("player", slot))
|
||||
button.stack:SetText(charges > 1 and charges or "")
|
||||
button:Show()
|
||||
end
|
||||
|
||||
-- Unfortunately, temporary enchants have basically no support beyond hacks. So we will hack!
|
||||
tempEnchantScan = function(self, elapsed)
|
||||
timeElapsed = timeElapsed + elapsed
|
||||
if( timeElapsed < 0.50 ) then return end
|
||||
timeElapsed = timeElapsed - 0.50
|
||||
|
||||
local hasMain, mainTimeLeft, mainCharges, hasOff, offTimeLeft, offCharges = GetWeaponEnchantInfo()
|
||||
self.temporaryEnchants = 0
|
||||
|
||||
if( hasMain ) then
|
||||
self.temporaryEnchants = self.temporaryEnchants + 1
|
||||
updateTemporaryEnchant(self, 16, mainHand, hasMain, mainTimeLeft or 0, mainCharges)
|
||||
mainHand.time = mainTimeLeft or 0
|
||||
end
|
||||
|
||||
mainHand.has = hasMain
|
||||
|
||||
if( hasOff and self.temporaryEnchants < self.maxAuras ) then
|
||||
self.temporaryEnchants = self.temporaryEnchants + 1
|
||||
updateTemporaryEnchant(self, 17, offHand, hasOff, offTimeLeft or 0, offCharges)
|
||||
offHand.time = offTimeLeft or 0
|
||||
end
|
||||
|
||||
offHand.has = hasOff
|
||||
|
||||
-- Update if totals changed
|
||||
if( self.lastTemporary ~= self.temporaryEnchants ) then
|
||||
self.lastTemporary = self.temporaryEnchants
|
||||
Auras:Update(self.parent)
|
||||
end
|
||||
end
|
||||
|
||||
-- Nice and simple, don't need to do a full update because either this is called in an OnEnable or
|
||||
-- the zone monitor will handle it all cleanly. The fun part of this code is aura filtering itself takes 10 seconds
|
||||
-- but making the configuration clean takes two weeks and another 2-3 days of implementing
|
||||
-- This isn't actually filled with data, it's just to stop any errors from triggering if no filter is added
|
||||
local filterDefault = {}
|
||||
function Auras:UpdateFilter(frame)
|
||||
local zone = select(2, IsInInstance())
|
||||
local id = zone .. frame.unitType
|
||||
|
||||
local white = ShadowUF.db.profile.filters.zonewhite[zone .. frame.unitType]
|
||||
local black = ShadowUF.db.profile.filters.zoneblack[zone .. frame.unitType]
|
||||
frame.auras.whitelist = white and ShadowUF.db.profile.filters.whitelists[white] or filterDefault
|
||||
frame.auras.blacklist = black and ShadowUF.db.profile.filters.blacklists[black] or filterDefault
|
||||
end
|
||||
|
||||
-- Scan for auras
|
||||
local function scan(parent, frame, type, config, filter)
|
||||
if( frame.totalAuras >= frame.maxAuras or not config.enabled ) then return end
|
||||
|
||||
local isFriendly = UnitIsFriend(frame.parent.unit, "player")
|
||||
local index = 0
|
||||
while( true ) do
|
||||
index = index + 1
|
||||
local name, rank, texture, count, auraType, duration, endTime, caster, isStealable = UnitAura(frame.parent.unit, index, filter)
|
||||
if( not name ) then break end
|
||||
|
||||
if( ( not config.player or playerUnits[caster] ) and ( not parent.whitelist[type] and not parent.blacklist[type] or parent.whitelist[type] and parent.whitelist[name] or parent.blacklist[type] and not parent.blacklist[name] ) ) then
|
||||
-- Create any buttons we need
|
||||
frame.totalAuras = frame.totalAuras + 1
|
||||
if( #(frame.buttons) < frame.totalAuras ) then
|
||||
updateButton(frame.totalAuras, frame, ShadowUF.db.profile.units[frame.parent.unitType].auras[frame.type])
|
||||
end
|
||||
|
||||
-- Show debuff border, or a special colored border if it's stealable
|
||||
local button = frame.buttons[frame.totalAuras]
|
||||
if( isStealable and not isFriendly and not ShadowUF.db.profile.auras.disableColor ) then
|
||||
button.border:SetVertexColor(stealableColor.r, stealableColor.g, stealableColor.b)
|
||||
elseif( ( not isFriendly or type == "debuffs" ) and not ShadowUF.db.profile.auras.disableColor ) then
|
||||
local color = auraType and DebuffTypeColor[auraType] or DebuffTypeColor.none
|
||||
button.border:SetVertexColor(color.r, color.g, color.b)
|
||||
else
|
||||
button.border:SetVertexColor(0.60, 0.60, 0.60)
|
||||
end
|
||||
|
||||
-- Show the cooldown ring
|
||||
if( not ShadowUF.db.profile.auras.disableCooldown and duration > 0 and endTime > 0 and ( not config.selfTimers or ( config.selfTimers and playerUnits[caster] ) ) ) then
|
||||
button.cooldown:SetCooldown(endTime - duration, duration)
|
||||
button.cooldown:Show()
|
||||
else
|
||||
button.cooldown:Hide()
|
||||
end
|
||||
|
||||
-- Enlarge our own auras
|
||||
if( config.enlargeSelf and playerUnits[caster] ) then
|
||||
button.isSelfScaled = true
|
||||
button:SetScale(config.selfScale)
|
||||
else
|
||||
button.isSelfScaled = nil
|
||||
button:SetScale(1)
|
||||
end
|
||||
|
||||
-- Size it
|
||||
button:SetHeight(config.size)
|
||||
button:SetWidth(config.size)
|
||||
button.border:SetHeight(config.size + 1)
|
||||
button.border:SetWidth(config.size + 1)
|
||||
|
||||
-- Stack + icon + show! Never understood why, auras sometimes return 1 for stack even if they don't stack
|
||||
button.auraID = index
|
||||
button.filter = filter
|
||||
button.unit = frame.parent.unit
|
||||
button.columnHasScaled = nil
|
||||
button.previousHasScale = nil
|
||||
button.icon:SetTexture(texture)
|
||||
button.stack:SetText(count > 1 and count or "")
|
||||
button:Show()
|
||||
|
||||
-- Too many auras shown break out
|
||||
-- Get down
|
||||
if( frame.totalAuras >= frame.maxAuras ) then break end
|
||||
end
|
||||
end
|
||||
|
||||
for i=frame.totalAuras + 1, #(frame.buttons) do frame.buttons[i]:Hide() end
|
||||
|
||||
-- The default 1.30 scale doesn't need special handling, after that it does
|
||||
if( config.enlargeSelf ) then
|
||||
positionAllButtons(frame, config)
|
||||
end
|
||||
end
|
||||
|
||||
Auras.scan = scan
|
||||
|
||||
local function anchorGroupToGroup(frame, config, group, childConfig, childGroup)
|
||||
-- Child group has nothing in it yet, so don't care
|
||||
if( not childGroup.buttons[1] ) then return end
|
||||
|
||||
-- Group we want to anchor to has nothing in it, takeover the postion
|
||||
if( group.totalAuras == 0 ) then
|
||||
local position = positionData[config.anchorPoint]
|
||||
childGroup.buttons[1]:ClearAllPoints()
|
||||
childGroup.buttons[1]:SetPoint(ShadowUF.Layout:GetPoint(config.anchorPoint), group.anchorTo, ShadowUF.Layout:GetRelative(config.anchorPoint), config.x + (position.xMod * ShadowUF.db.profile.backdrop.inset), config.y + (position.yMod * -ShadowUF.db.profile.backdrop.inset))
|
||||
return
|
||||
end
|
||||
|
||||
local anchorTo
|
||||
for i=#(group.buttons), 1, -1 do
|
||||
local button = group.buttons[i]
|
||||
if( button.isAuraAnchor and button:IsVisible() ) then
|
||||
anchorTo = button
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
local position = positionData[childGroup.forcedAnchorPoint or childConfig.anchorPoint]
|
||||
if( position.isSideGrowth ) then
|
||||
position.aura(childGroup.buttons[1], anchorTo)
|
||||
else
|
||||
position.column(childGroup.buttons[1], anchorTo, 2)
|
||||
end
|
||||
end
|
||||
|
||||
Auras.anchorGroupToGroup = anchorGroupToGroup
|
||||
|
||||
-- Do an update and figure out what we need to scan
|
||||
function Auras:Update(frame)
|
||||
local config = ShadowUF.db.profile.units[frame.unitType].auras
|
||||
if( frame.auras.anchor ) then
|
||||
frame.auras.anchor.totalAuras = frame.auras.anchor.temporaryEnchants
|
||||
|
||||
scan(frame.auras, frame.auras.anchor, frame.auras.primary, config[frame.auras.primary], frame.auras[frame.auras.primary].filter)
|
||||
scan(frame.auras, frame.auras.anchor, frame.auras.secondary, config[frame.auras.secondary], frame.auras[frame.auras.secondary].filter)
|
||||
else
|
||||
if( config.buffs.enabled ) then
|
||||
frame.auras.buffs.totalAuras = frame.auras.buffs.temporaryEnchants
|
||||
scan(frame.auras, frame.auras.buffs, "buffs", config.buffs, frame.auras.buffs.filter)
|
||||
end
|
||||
|
||||
if( config.debuffs.enabled ) then
|
||||
frame.auras.debuffs.totalAuras = 0
|
||||
scan(frame.auras, frame.auras.debuffs, "debuffs", config.debuffs, frame.auras.debuffs.filter)
|
||||
end
|
||||
|
||||
if( frame.auras.anchorAurasOn ) then
|
||||
anchorGroupToGroup(frame, config[frame.auras.anchorAurasOn.type], frame.auras.anchorAurasOn, config[frame.auras.anchorAurasChild.type], frame.auras.anchorAurasChild)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,464 @@
|
||||
local Cast = {}
|
||||
local L = ShadowUF.L
|
||||
local FADE_TIME = 0.30
|
||||
local FAKE_UPDATE_TIME = 0.10
|
||||
|
||||
ShadowUF:RegisterModule(Cast, "castBar", L["Cast bar"], true)
|
||||
|
||||
-- I'm not really thrilled with this method of detecting fake unit casts, mostly because it's inefficient and ugly
|
||||
local function monitorFakeCast(self, elapsed)
|
||||
self.timeElapsed = self.timeElapsed + elapsed
|
||||
if( self.timeElapsed <= FAKE_UPDATE_TIME ) then return end
|
||||
self.timeElapsed = self.timeElapsed - FAKE_UPDATE_TIME
|
||||
|
||||
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo(self.parent.unit)
|
||||
local isChannelled
|
||||
if( not spell ) then
|
||||
spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitChannelInfo(self.parent.unit)
|
||||
isChannelled = true
|
||||
end
|
||||
|
||||
-- Cast started
|
||||
if( not self.endTime and endTime ) then
|
||||
self.endTime = endTime
|
||||
self.notInterruptible = notInterruptible
|
||||
self.spellName = spell
|
||||
Cast:UpdateCast(self.parent, self.parent.unit, isChannelled, spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible)
|
||||
-- Cast stopped
|
||||
elseif( self.endTime and not endTime ) then
|
||||
if( GetTime() <= (self.endTime / 1000) ) then
|
||||
Cast:EventInterruptCast(self.parent, nil, self.parent.unit, self.spellName)
|
||||
end
|
||||
|
||||
self.notInterruptible = nil
|
||||
self.spellName = nil
|
||||
self.endTime = nil
|
||||
return
|
||||
end
|
||||
|
||||
-- Cast delayed
|
||||
if( self.endTime and endTime ~= self.endTime ) then
|
||||
self.endTime = endTime
|
||||
Cast:UpdateDelay(self.parent, spell, rank, displayName, icon, startTime, endTime)
|
||||
end
|
||||
|
||||
-- Cast interruptible status changed
|
||||
if( self.spellName and self.notInterruptible ~= notInterruptible ) then
|
||||
self.notInterruptible = notInterruptible
|
||||
if( notInterruptible ) then
|
||||
Cast:EventUninterruptible(self.parent)
|
||||
else
|
||||
Cast:EventInterruptible(self.parent)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function updateFakeUnitCast(self)
|
||||
self.endTime = nil
|
||||
self.notInterruptible = nil
|
||||
self.spellName = nil
|
||||
|
||||
monitorFakeCast(self, FAKE_UPDATE_TIME)
|
||||
end
|
||||
|
||||
function Cast:OnEnable(frame)
|
||||
if( not frame.castBar ) then
|
||||
frame.castBar = CreateFrame("Frame", nil, frame)
|
||||
frame.castBar.bar = ShadowUF.Units:CreateBar(frame)
|
||||
frame.castBar.background = frame.castBar.bar.background
|
||||
frame.castBar.bar.parent = frame
|
||||
|
||||
frame.castBar.icon = frame.castBar.bar:CreateTexture(nil, "ARTWORK")
|
||||
frame.castBar.bar.name = frame.castBar.bar:CreateFontString(nil, "ARTWORK")
|
||||
frame.castBar.bar.time = frame.castBar.bar:CreateFontString(nil, "ARTWORK")
|
||||
end
|
||||
|
||||
if( ShadowUF.fakeUnits[frame.unitType] ) then
|
||||
frame.castBar.monitor = frame.castBar.monitor or CreateFrame("Frame", nil, frame)
|
||||
frame.castBar.monitor.timeElapsed = 0
|
||||
frame.castBar.monitor.parent = frame
|
||||
frame.castBar.monitor:SetScript("OnUpdate", monitorFakeCast)
|
||||
frame.castBar.monitor:SetScript("OnShow", updateFakeUnitCast)
|
||||
frame.castBar.monitor:Show()
|
||||
return
|
||||
end
|
||||
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_START", self, "EventUpdateCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_STOP", self, "EventStopCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", self, "EventStopCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_INTERRUPTED", self, "EventInterruptCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_DELAYED", self, "EventDelayCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", self, "EventCastSucceeded")
|
||||
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_CHANNEL_START", self, "EventUpdateChannel")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_CHANNEL_STOP", self, "EventStopCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_CHANNEL_INTERRUPTED", self, "EventInterruptCast")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", self, "EventDelayChannel")
|
||||
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_INTERRUPTIBLE", self, "EventInterruptible")
|
||||
frame:RegisterUnitEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", self, "EventUninterruptible")
|
||||
|
||||
frame:RegisterUpdateFunc(self, "UpdateCurrentCast")
|
||||
end
|
||||
|
||||
function Cast:OnLayoutApplied(frame, config)
|
||||
if( not frame.visibility.castBar ) then return end
|
||||
|
||||
-- Set textures
|
||||
frame.castBar.bar:SetStatusBarTexture(ShadowUF.Layout.mediaPath.statusbar)
|
||||
frame.castBar.bar:SetStatusBarColor(0, 0, 0, 0)
|
||||
frame.castBar.bar:GetStatusBarTexture():SetHorizTile(false)
|
||||
frame.castBar.background:SetVertexColor(0, 0, 0, 0)
|
||||
frame.castBar.background:SetHorizTile(false)
|
||||
|
||||
-- Setup the main bar + icon
|
||||
frame.castBar.bar:ClearAllPoints()
|
||||
frame.castBar.bar:SetHeight(frame.castBar:GetHeight())
|
||||
frame.castBar.bar:SetValue(0)
|
||||
frame.castBar.bar:SetMinMaxValues(0, 1)
|
||||
|
||||
-- Use the entire bars width and show the icon
|
||||
if( config.castBar.icon == "HIDE" ) then
|
||||
frame.castBar.bar:SetWidth(frame.castBar:GetWidth())
|
||||
frame.castBar.bar:SetAllPoints(frame.castBar)
|
||||
frame.castBar.icon:Hide()
|
||||
-- Shift the bar to the side and show an icon
|
||||
else
|
||||
frame.castBar.bar:SetWidth(frame.castBar:GetWidth() - frame.castBar:GetHeight())
|
||||
frame.castBar.icon:ClearAllPoints()
|
||||
frame.castBar.icon:SetWidth(frame.castBar:GetHeight())
|
||||
frame.castBar.icon:SetHeight(frame.castBar:GetHeight())
|
||||
frame.castBar.icon:Show()
|
||||
|
||||
if( config.castBar.icon == "LEFT" ) then
|
||||
frame.castBar.bar:SetPoint("TOPLEFT", frame.castBar, "TOPLEFT", frame.castBar:GetHeight() + 1, 0)
|
||||
frame.castBar.icon:SetPoint("TOPRIGHT", frame.castBar.bar, "TOPLEFT", -1, 0)
|
||||
else
|
||||
frame.castBar.bar:SetPoint("TOPLEFT", frame.castBar, "TOPLEFT", 1, 0)
|
||||
frame.castBar.icon:SetPoint("TOPLEFT", frame.castBar.bar, "TOPRIGHT", 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
-- Set the font at the very least, so it doesn't error when we set text on it even if it isn't being shown
|
||||
ShadowUF.Layout:ToggleVisibility(frame.castBar.bar.name, config.castBar.name.enabled)
|
||||
if( config.castBar.name.enabled ) then
|
||||
frame.castBar.bar.name:SetParent(frame.highFrame)
|
||||
frame.castBar.bar.name:SetWidth(frame.castBar.bar:GetWidth() * 0.75)
|
||||
frame.castBar.bar.name:SetHeight(ShadowUF.db.profile.font.size + 1)
|
||||
frame.castBar.bar.name:SetJustifyH(ShadowUF.Layout:GetJustify(config.castBar.name))
|
||||
|
||||
ShadowUF.Layout:AnchorFrame(frame.castBar.bar, frame.castBar.bar.name, config.castBar.name)
|
||||
ShadowUF.Layout:SetupFontString(frame.castBar.bar.name, config.castBar.name.size)
|
||||
end
|
||||
|
||||
ShadowUF.Layout:ToggleVisibility(frame.castBar.bar.time, config.castBar.time.enabled)
|
||||
if( config.castBar.time.enabled ) then
|
||||
frame.castBar.bar.time:SetParent(frame.highFrame)
|
||||
frame.castBar.bar.time:SetWidth(frame.castBar.bar:GetWidth() * 0.25)
|
||||
frame.castBar.bar.time:SetHeight(ShadowUF.db.profile.font.size + 1)
|
||||
frame.castBar.bar.time:SetJustifyH(ShadowUF.Layout:GetJustify(config.castBar.time))
|
||||
|
||||
ShadowUF.Layout:AnchorFrame(frame.castBar.bar, frame.castBar.bar.time, config.castBar.time)
|
||||
ShadowUF.Layout:SetupFontString(frame.castBar.bar.time, config.castBar.time.size)
|
||||
end
|
||||
|
||||
-- So we don't have to check the entire thing in an OnUpdate
|
||||
frame.castBar.bar.time.enabled = config.castBar.time.enabled
|
||||
|
||||
if( config.castBar.autoHide and not UnitCastingInfo(frame.unit) and not UnitChannelInfo(frame.unit) ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", false)
|
||||
end
|
||||
end
|
||||
|
||||
function Cast:OnDisable(frame, unit)
|
||||
frame:UnregisterAll(self)
|
||||
|
||||
if( frame.castBar ) then
|
||||
if( frame.castBar.monitor ) then frame.castBar.monitor:Hide() end
|
||||
frame.castBar.bar.name:Hide()
|
||||
frame.castBar.bar.time:Hide()
|
||||
frame.castBar.bar:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Easy coloring
|
||||
local function setBarColor(self, r, g, b)
|
||||
self:SetStatusBarColor(r, g, b, ShadowUF.db.profile.bars.alpha)
|
||||
|
||||
if( not self.background.overrideColor ) then
|
||||
self.background:SetVertexColor(r, g, b, ShadowUF.db.profile.bars.backgroundAlpha)
|
||||
end
|
||||
end
|
||||
|
||||
-- Cast OnUpdates
|
||||
local function fadeOnUpdate(self, elapsed)
|
||||
self.fadeElapsed = self.fadeElapsed - elapsed
|
||||
|
||||
if( self.fadeElapsed <= 0 ) then
|
||||
self.fadeElapsed = nil
|
||||
self.name:Hide()
|
||||
self.time:Hide()
|
||||
self:Hide()
|
||||
|
||||
local frame = self:GetParent()
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.autoHide ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", false)
|
||||
end
|
||||
else
|
||||
local alpha = self.fadeElapsed / self.fadeStart
|
||||
self:SetAlpha(alpha)
|
||||
self.time:SetAlpha(alpha)
|
||||
self.name:SetAlpha(alpha)
|
||||
end
|
||||
end
|
||||
|
||||
local function castOnUpdate(self, elapsed)
|
||||
local time = GetTime()
|
||||
self.elapsed = self.elapsed + (time - self.lastUpdate)
|
||||
self.lastUpdate = time
|
||||
self:SetValue(self.elapsed)
|
||||
|
||||
if( self.elapsed <= 0 ) then
|
||||
self.elapsed = 0
|
||||
end
|
||||
|
||||
if( self.time.enabled ) then
|
||||
local timeLeft = self.endSeconds - self.elapsed
|
||||
if( timeLeft <= 0 ) then
|
||||
self.time:SetText("0.0")
|
||||
elseif( self.pushback == 0 ) then
|
||||
self.time:SetFormattedText("%.1f", timeLeft)
|
||||
else
|
||||
self.time:SetFormattedText("|cffff0000%.1f|r %.1f", self.pushback, timeLeft)
|
||||
end
|
||||
end
|
||||
|
||||
-- Cast finished, do a quick fade
|
||||
if( self.elapsed >= self.endSeconds ) then
|
||||
setBarColor(self, ShadowUF.db.profile.castColors.finished.r, ShadowUF.db.profile.castColors.finished.g, ShadowUF.db.profile.castColors.finished.b)
|
||||
|
||||
self.spellName = nil
|
||||
self.fadeElapsed = FADE_TIME
|
||||
self.fadeStart = FADE_TIME
|
||||
self:SetScript("OnUpdate", fadeOnUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
local function channelOnUpdate(self, elapsed)
|
||||
local time = GetTime()
|
||||
self.elapsed = self.elapsed - (time - self.lastUpdate)
|
||||
self.lastUpdate = time
|
||||
self:SetValue(self.elapsed)
|
||||
|
||||
if( self.elapsed <= 0 ) then
|
||||
self.elapsed = 0
|
||||
end
|
||||
|
||||
if( self.time.enabled ) then
|
||||
if( self.elapsed <= 0 ) then
|
||||
self.time:SetText("0.0")
|
||||
elseif( self.pushback == 0 ) then
|
||||
self.time:SetFormattedText("%.1f", self.elapsed)
|
||||
else
|
||||
self.time:SetFormattedText("|cffff0000%.1f|r %.1f", self.pushback, self.elapsed)
|
||||
end
|
||||
end
|
||||
|
||||
-- Channel finished, do a quick fade
|
||||
if( self.elapsed <= 0 ) then
|
||||
setBarColor(self, ShadowUF.db.profile.castColors.finished.r, ShadowUF.db.profile.castColors.finished.g, ShadowUF.db.profile.castColors.finished.b)
|
||||
|
||||
self.spellName = nil
|
||||
self.fadeElapsed = FADE_TIME
|
||||
self.fadeStart = FADE_TIME
|
||||
self:SetScript("OnUpdate", fadeOnUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
function Cast:UpdateCurrentCast(frame)
|
||||
if( UnitCastingInfo(frame.unit) ) then
|
||||
self:UpdateCast(frame, frame.unit, false, UnitCastingInfo(frame.unit))
|
||||
elseif( UnitChannelInfo(frame.unit) ) then
|
||||
self:UpdateCast(frame, frame.unit, true, UnitChannelInfo(frame.unit))
|
||||
else
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.autoHide ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", false)
|
||||
end
|
||||
|
||||
setBarColor(frame.castBar.bar, 0, 0, 0)
|
||||
|
||||
frame.castBar.bar.spellName = nil
|
||||
frame.castBar.bar.name:Hide()
|
||||
frame.castBar.bar.time:Hide()
|
||||
frame.castBar.bar:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Cast updated/changed
|
||||
function Cast:EventUpdateCast(frame)
|
||||
self:UpdateCast(frame, frame.unit, false, UnitCastingInfo(frame.unit))
|
||||
end
|
||||
|
||||
function Cast:EventDelayCast(frame)
|
||||
self:UpdateDelay(frame, UnitCastingInfo(frame.unit))
|
||||
end
|
||||
|
||||
-- Channel updated/changed
|
||||
function Cast:EventUpdateChannel(frame)
|
||||
self:UpdateCast(frame, frame.unit, true, UnitChannelInfo(frame.unit))
|
||||
end
|
||||
|
||||
function Cast:EventDelayChannel(frame)
|
||||
self:UpdateDelay(frame, UnitChannelInfo(frame.unit))
|
||||
end
|
||||
|
||||
-- Cast finished
|
||||
function Cast:EventStopCast(frame, event, unit, spell)
|
||||
local cast = frame.castBar.bar
|
||||
if( cast.spellName ~= spell or ( event == "UNIT_SPELLCAST_FAILED" and cast.isChannelled ) ) then return end
|
||||
if( cast.time.enabled ) then
|
||||
cast.time:SetText("0.0")
|
||||
end
|
||||
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.interrupted.r, ShadowUF.db.profile.castColors.interrupted.g, ShadowUF.db.profile.castColors.interrupted.b)
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.autoHide ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", true)
|
||||
end
|
||||
|
||||
cast.spellName = nil
|
||||
cast.fadeElapsed = FADE_TIME
|
||||
cast.fadeStart = FADE_TIME
|
||||
cast:SetScript("OnUpdate", fadeOnUpdate)
|
||||
cast:SetMinMaxValues(0, 1)
|
||||
cast:SetValue(1)
|
||||
cast:Show()
|
||||
end
|
||||
|
||||
-- Cast interrupted
|
||||
function Cast:EventInterruptCast(frame, event, unit, spell)
|
||||
local cast = frame.castBar.bar
|
||||
if( cast.spellName ~= spell ) then return end
|
||||
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.interrupted.r, ShadowUF.db.profile.castColors.interrupted.g, ShadowUF.db.profile.castColors.interrupted.b)
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.autoHide ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", true)
|
||||
end
|
||||
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.name.enabled ) then
|
||||
cast.name:SetText(L["Interrupted"])
|
||||
end
|
||||
|
||||
cast.spellName = nil
|
||||
cast.fadeElapsed = FADE_TIME + 0.20
|
||||
cast.fadeStart = cast.fadeElapsed
|
||||
cast:SetScript("OnUpdate", fadeOnUpdate)
|
||||
cast:SetMinMaxValues(0, 1)
|
||||
cast:SetValue(1)
|
||||
cast:Show()
|
||||
end
|
||||
|
||||
-- Cast succeeded
|
||||
function Cast:EventCastSucceeded(frame, unit, spell)
|
||||
local cast = frame.castBar.bar
|
||||
if( not cast.isChannelled and cast.spellName == spell ) then
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.finished.r, ShadowUF.db.profile.castColors.finished.g, ShadowUF.db.profile.castColors.finished.b)
|
||||
end
|
||||
end
|
||||
|
||||
-- Interruptible status changed
|
||||
function Cast:EventInterruptible(frame)
|
||||
local cast = frame.castBar.bar
|
||||
if( cast.isChannelled ) then
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.channel.r, ShadowUF.db.profile.castColors.channel.g, ShadowUF.db.profile.castColors.channel.b)
|
||||
else
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.cast.r, ShadowUF.db.profile.castColors.cast.g, ShadowUF.db.profile.castColors.cast.b)
|
||||
end
|
||||
end
|
||||
|
||||
function Cast:EventUninterruptible(frame)
|
||||
setBarColor(frame.castBar.bar, ShadowUF.db.profile.castColors.uninterruptible.r, ShadowUF.db.profile.castColors.uninterruptible.g, ShadowUF.db.profile.castColors.uninterruptible.b)
|
||||
end
|
||||
|
||||
function Cast:UpdateDelay(frame, spell, rank, displayName, icon, startTime, endTime)
|
||||
if( not spell or not frame.castBar.bar.startTime ) then return end
|
||||
local cast = frame.castBar.bar
|
||||
startTime = startTime / 1000
|
||||
endTime = endTime / 1000
|
||||
|
||||
-- For a channel, delay is a negative value so using plus is fine here
|
||||
local delay = startTime - cast.startTime
|
||||
if( not cast.isChannelled ) then
|
||||
cast.endSeconds = cast.endSeconds + delay
|
||||
cast:SetMinMaxValues(0, cast.endSeconds)
|
||||
else
|
||||
cast.elapsed = cast.elapsed + delay
|
||||
end
|
||||
|
||||
cast.pushback = cast.pushback + delay
|
||||
cast.lastUpdate = GetTime()
|
||||
cast.startTime = startTime
|
||||
cast.endTime = endTime
|
||||
end
|
||||
|
||||
-- Update the actual bar
|
||||
function Cast:UpdateCast(frame, unit, channelled, spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible)
|
||||
if( not spell ) then return end
|
||||
local cast = frame.castBar.bar
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.autoHide ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "castBar", true)
|
||||
end
|
||||
|
||||
-- Set casted spell
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.name.enabled ) then
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.name.rank and rank and rank ~= "" ) then
|
||||
cast.name:SetFormattedText("%s (%s)", spell, rank)
|
||||
cast.name:SetAlpha(ShadowUF.db.profile.bars.alpha)
|
||||
cast.name:Show()
|
||||
else
|
||||
cast.name:SetText(spell)
|
||||
cast.name:SetAlpha(ShadowUF.db.profile.bars.alpha)
|
||||
cast.name:Show()
|
||||
end
|
||||
end
|
||||
|
||||
-- Show cast time
|
||||
if( cast.time.enabled ) then
|
||||
cast.time:SetAlpha(1)
|
||||
cast.time:Show()
|
||||
end
|
||||
|
||||
-- Set spell icon
|
||||
if( ShadowUF.db.profile.units[frame.unitType].castBar.icon ~= "HIDE" ) then
|
||||
frame.castBar.icon:SetTexture(icon)
|
||||
frame.castBar.icon:Show()
|
||||
end
|
||||
|
||||
-- Setup cast info
|
||||
cast.isChannelled = channelled
|
||||
cast.startTime = startTime / 1000
|
||||
cast.endTime = endTime / 1000
|
||||
cast.endSeconds = cast.endTime - cast.startTime
|
||||
cast.elapsed = cast.isChannelled and cast.endSeconds or 0
|
||||
cast.spellName = spell
|
||||
cast.spellRank = rank
|
||||
cast.pushback = 0
|
||||
cast.lastUpdate = cast.startTime
|
||||
cast:SetMinMaxValues(0, cast.endSeconds)
|
||||
cast:SetValue(cast.elapsed)
|
||||
cast:SetAlpha(ShadowUF.db.profile.bars.alpha)
|
||||
cast:Show()
|
||||
|
||||
if( cast.isChannelled ) then
|
||||
cast:SetScript("OnUpdate", channelOnUpdate)
|
||||
else
|
||||
cast:SetScript("OnUpdate", castOnUpdate)
|
||||
end
|
||||
|
||||
if( notInterruptible ) then
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.uninterruptible.r, ShadowUF.db.profile.castColors.uninterruptible.g, ShadowUF.db.profile.castColors.uninterruptible.b)
|
||||
elseif( cast.isChannelled ) then
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.channel.r, ShadowUF.db.profile.castColors.channel.g, ShadowUF.db.profile.castColors.channel.b)
|
||||
else
|
||||
setBarColor(cast, ShadowUF.db.profile.castColors.cast.r, ShadowUF.db.profile.castColors.cast.g, ShadowUF.db.profile.castColors.cast.b)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
local Combat = {}
|
||||
ShadowUF:RegisterModule(Combat, "combatText", ShadowUF.L["Combat text"])
|
||||
|
||||
function Combat:OnEnable(frame)
|
||||
if( not frame.combatText ) then
|
||||
frame.combatText = CreateFrame("Frame", nil, frame.highFrame)
|
||||
frame.combatText:SetFrameStrata("HIGH")
|
||||
frame.combatText.feedbackText = frame.combatText:CreateFontString(nil, "ARTWORK")
|
||||
frame.combatText.feedbackText:SetPoint("CENTER", frame.combatText, "CENTER", 0, 0)
|
||||
frame.combatText:SetFrameLevel(frame.topFrameLevel)
|
||||
|
||||
frame.combatText.feedbackStartTime = 0
|
||||
frame.combatText:SetScript("OnUpdate", CombatFeedback_OnUpdate)
|
||||
frame.combatText:SetHeight(1)
|
||||
frame.combatText:SetWidth(1)
|
||||
end
|
||||
|
||||
frame:RegisterUnitEvent("UNIT_COMBAT", self, "Update")
|
||||
end
|
||||
|
||||
function Combat:OnLayoutApplied(frame, config)
|
||||
-- Update feedback text
|
||||
ShadowUF.Layout:ToggleVisibility(frame.combatText, frame.visibility.combatText)
|
||||
if( frame.visibility.combatText ) then
|
||||
frame.combatText.feedbackFontHeight = ShadowUF.db.profile.font.size + 1
|
||||
frame.combatText.fontPath = ShadowUF.Layout.mediaPath.font
|
||||
|
||||
ShadowUF.Layout:SetupFontString(frame.combatText.feedbackText, 1)
|
||||
ShadowUF.Layout:AnchorFrame(frame, frame.combatText, config.combatText)
|
||||
end
|
||||
end
|
||||
|
||||
function Combat:OnDisable(frame)
|
||||
frame:UnregisterAll(self)
|
||||
end
|
||||
|
||||
function Combat:Update(frame, event, unit, type, ...)
|
||||
CombatFeedback_OnCombatEvent(frame.combatText, type, ...)
|
||||
if( type == "IMMUNE" ) then
|
||||
frame.combatText.feedbackText:SetTextHeight(frame.combatText.feedbackFontHeight * 0.75)
|
||||
end
|
||||
|
||||
-- Increasing the font size will make the text look pixelated, however scaling it up will make it look smooth and awesome
|
||||
frame.combatText:SetScale(frame.combatText.feedbackText:GetStringHeight() / ShadowUF.db.profile.font.size)
|
||||
frame.combatText.feedbackText:SetFont(frame.combatText.fontPath, ShadowUF.db.profile.font.size, "OUTLINE")
|
||||
end
|
||||
@@ -0,0 +1,128 @@
|
||||
local Combo = {}
|
||||
ShadowUF:RegisterModule(Combo, "comboPoints", ShadowUF.L["Combo points"])
|
||||
|
||||
function Combo:OnEnable(frame)
|
||||
frame.comboPoints = frame.comboPoints or CreateFrame("Frame", nil, frame)
|
||||
frame:RegisterNormalEvent("UNIT_COMBO_POINTS", self, "Update")
|
||||
frame:RegisterUpdateFunc(self, "Update")
|
||||
end
|
||||
|
||||
function Combo:OnLayoutApplied(frame, config)
|
||||
-- Not a bar so set the containers frame configuration
|
||||
if( config.comboPoints and not config.comboPoints.isBar ) then
|
||||
ShadowUF.Layout:ToggleVisibility(frame.comboPoints, frame.visibility.comboPoints)
|
||||
end
|
||||
|
||||
if( not frame.visibility.comboPoints ) then return end
|
||||
|
||||
-- Hide the active combo points
|
||||
if( frame.comboPoints.points ) then
|
||||
for _, texture in pairs(frame.comboPoints.points) do
|
||||
texture:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Setup for bar display!
|
||||
if( config.comboPoints.isBar ) then
|
||||
frame.comboPoints.blocks = frame.comboPoints.blocks or {}
|
||||
frame.comboPoints.points = frame.comboPoints.blocks
|
||||
|
||||
-- Position bars, the 5 accounts for borders
|
||||
local blockWidth = (frame.comboPoints:GetWidth() - 4 ) / MAX_COMBO_POINTS
|
||||
for id=1, MAX_COMBO_POINTS do
|
||||
frame.comboPoints.blocks[id] = frame.comboPoints.blocks[id] or frame.comboPoints:CreateTexture(nil, "OVERLAY")
|
||||
local texture = frame.comboPoints.blocks[id]
|
||||
texture:SetVertexColor(1, 0.80, 0)
|
||||
texture:SetHorizTile(false)
|
||||
texture:SetTexture(ShadowUF.Layout.mediaPath.statusbar)
|
||||
texture:SetHeight(frame.comboPoints:GetHeight())
|
||||
texture:SetWidth(blockWidth)
|
||||
texture:ClearAllPoints()
|
||||
|
||||
if( config.comboPoints.growth == "LEFT" ) then
|
||||
if( id > 1 ) then
|
||||
texture:SetPoint("TOPRIGHT", frame.comboPoints.blocks[id - 1], "TOPLEFT", -1, 0)
|
||||
else
|
||||
texture:SetPoint("TOPRIGHT", frame.comboPoints, "TOPRIGHT", 0, 0)
|
||||
end
|
||||
else
|
||||
if( id > 1 ) then
|
||||
texture:SetPoint("TOPLEFT", frame.comboPoints.blocks[id - 1], "TOPRIGHT", 1, 0)
|
||||
else
|
||||
texture:SetPoint("TOPLEFT", frame.comboPoints, "TOPLEFT", 0, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- guess not, will have to do icons :(
|
||||
else
|
||||
local point, relativePoint
|
||||
local x, y = 0, 0
|
||||
|
||||
if( config.comboPoints.growth == "LEFT" ) then
|
||||
point, relativePoint = "BOTTOMRIGHT", "BOTTOMLEFT"
|
||||
x = config.comboPoints.spacing
|
||||
elseif( config.comboPoints.growth == "RIGHT" ) then
|
||||
point, relativePoint = "BOTTOMLEFT", "BOTTOMRIGHT"
|
||||
x = config.comboPoints.spacing
|
||||
elseif( config.comboPoints.growth == "UP" ) then
|
||||
point, relativePoint = "BOTTOMLEFT", "TOPLEFT"
|
||||
y = config.comboPoints.spacing
|
||||
elseif( config.comboPoints.growth == "DOWN" ) then
|
||||
point, relativePoint = "TOPLEFT", "BOTTOMLEFT"
|
||||
y = config.comboPoints.spacing
|
||||
end
|
||||
|
||||
|
||||
frame.comboPoints.icons = frame.comboPoints.icons or {}
|
||||
frame.comboPoints.points = frame.comboPoints.icons
|
||||
|
||||
for id=1, MAX_COMBO_POINTS do
|
||||
frame.comboPoints.icons[id] = frame.comboPoints.icons[id] or frame.comboPoints:CreateTexture(nil, "OVERLAY")
|
||||
local texture = frame.comboPoints.icons[id]
|
||||
texture:SetTexture("Interface\\AddOns\\ShadowedUnitFrames\\media\\textures\\combo")
|
||||
texture:SetHeight(config.comboPoints.size)
|
||||
texture:SetWidth(config.comboPoints.size)
|
||||
|
||||
if( id > 1 ) then
|
||||
texture:ClearAllPoints()
|
||||
texture:SetPoint(point, frame.comboPoints.icons[id - 1], relativePoint, x, y)
|
||||
else
|
||||
texture:ClearAllPoints()
|
||||
texture:SetPoint("CENTER", frame.comboPoints, "CENTER", 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
-- Position the main frame
|
||||
frame.comboPoints:SetHeight(0.1)
|
||||
frame.comboPoints:SetWidth(0.1)
|
||||
|
||||
ShadowUF.Layout:AnchorFrame(frame, frame.comboPoints, config.comboPoints)
|
||||
end
|
||||
end
|
||||
|
||||
function Combo:OnDisable(frame)
|
||||
frame:UnregisterAll(self)
|
||||
end
|
||||
|
||||
function Combo:Update(frame)
|
||||
-- For Malygos dragons, they also self cast their CP on themselves, which is why we check CP on ourself!
|
||||
local playerUnit = UnitHasVehicleUI("player") and "vehicle" or "player"
|
||||
local points = GetComboPoints(playerUnit)
|
||||
if( points == 0 ) then
|
||||
points = GetComboPoints(playerUnit, playerUnit)
|
||||
end
|
||||
|
||||
-- Bar display, hide it if we don't have any combo points
|
||||
if( ShadowUF.db.profile.units[frame.unitType].comboPoints.isBar ) then
|
||||
ShadowUF.Layout:SetBarVisibility(frame, "comboPoints", points > 0)
|
||||
end
|
||||
|
||||
for id, pointTexture in pairs(frame.comboPoints.points) do
|
||||
if( id <= points ) then
|
||||
pointTexture:Show()
|
||||
else
|
||||
pointTexture:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||