This commit is contained in:
Icarium
2023-03-02 12:15:00 +01:00
committed by GitHub
parent 09e96670f7
commit d40388b8b7
100 changed files with 27008 additions and 0 deletions
+19
View File
@@ -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
File diff suppressed because it is too large Load Diff
@@ -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
]]
File diff suppressed because it is too large Load Diff
@@ -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
+667
View File
@@ -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})
+689
View File
@@ -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@]===]
+5
View File
@@ -0,0 +1,5 @@
if( GetLocale() ~= "esES" ) then return end
local L = {}
local ShadowUF = select(2, ...)
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
+5
View File
@@ -0,0 +1,5 @@
if( GetLocale() ~= "esMX" ) then return end
local L = {}
local ShadowUF = select(2, ...)
ShadowUF.L = setmetatable(L, {__index = ShadowUF.L})
+541
View File
@@ -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})
+604
View File
@@ -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})
+600
View File
@@ -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})
+671
View File
@@ -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})
+660
View File
@@ -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})
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+610
View File
@@ -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
+464
View File
@@ -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
+46
View File
@@ -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
+128
View File
@@ -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