1078 lines
30 KiB
Lua
1078 lines
30 KiB
Lua
--[[
|
|
Copyright (C) 2006-2007 Nymbia
|
|
Copyright (C) 2010 Hendrik "Nevcairiel" Leppkes < h.leppkes@gmail.com >
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
]]
|
|
local Quartz3 = LibStub("AceAddon-3.0"):GetAddon("Quartz3")
|
|
local L = LibStub("AceLocale-3.0"):GetLocale("Quartz3")
|
|
|
|
local media = LibStub("LibSharedMedia-3.0")
|
|
local lsmlist = AceGUIWidgetLSMlists
|
|
|
|
----------------------------
|
|
-- Upvalues
|
|
local min, type, format, unpack, setmetatable = math.min, type, string.format, unpack, setmetatable
|
|
local CreateFrame, GetTime, UIParent = CreateFrame, GetTime, UIParent
|
|
local UnitName, UnitCastingInfo, UnitChannelInfo = UnitName, UnitCastingInfo, UnitChannelInfo
|
|
|
|
local CastBarTemplate = CreateFrame("Frame")
|
|
local CastBarTemplate_MT = {__index = CastBarTemplate}
|
|
|
|
local TimeFmt, RomanFmt = Quartz3.Util.TimeFormat, Quartz3.Util.ConvertRankToRomanNumeral
|
|
|
|
local playerName = UnitName("player")
|
|
|
|
local function call(obj, method, ...)
|
|
if type(obj.parent[method]) == "function" then
|
|
return obj.parent[method](obj.parent, obj, ...)
|
|
end
|
|
end
|
|
|
|
----------------------------
|
|
-- Frame Scripts
|
|
|
|
-- OnShow and OnHide are not used by the template
|
|
-- But forward the call to the embeding module, they might use it.
|
|
local function OnShow(self)
|
|
call(self, "OnShow")
|
|
end
|
|
|
|
local function OnHide(self)
|
|
call(self, "OnHide")
|
|
end
|
|
|
|
-- OnUpdate handles the bar movement and the text updates
|
|
local function OnUpdate(self)
|
|
local currentTime = GetTime()
|
|
local startTime, endTime, delay = self.startTime, self.endTime, self.delay
|
|
local db = self.config
|
|
if self.channeling or self.casting then
|
|
local perc, remainingTime, delayFormat, delayFormatTime
|
|
if self.casting then
|
|
local showTime = min(currentTime, endTime)
|
|
remainingTime = endTime - showTime
|
|
perc = (showTime - startTime) / (endTime - startTime)
|
|
|
|
delayFormat, delayFormatTime = "|cffff0000+%.1f|cffffffff %s", "|cffff0000+%.1f|cffffffff %s / %s"
|
|
elseif self.channeling then
|
|
remainingTime = endTime - currentTime
|
|
perc = remainingTime / (endTime - startTime)
|
|
|
|
delayFormat, delayFormatTime = "|cffff0000-%.1f|cffffffff %s", "|cffff0000-%.1f|cffffffff %s / %s"
|
|
end
|
|
|
|
self.Bar:SetValue(perc)
|
|
self.Spark:ClearAllPoints()
|
|
self.Spark:SetPoint("CENTER", self.Bar, "LEFT", perc * db.w, 0)
|
|
|
|
if delay and delay ~= 0 then
|
|
if db.hidecasttime then
|
|
self.TimeText:SetFormattedText("|cffff0000+%.1f|cffffffff %s", delay, format(TimeFmt(remainingTime)))
|
|
else
|
|
self.TimeText:SetFormattedText("|cffff0000+%.1f|cffffffff %s / %s", delay, format(TimeFmt(remainingTime)), format(TimeFmt(endTime - startTime, true)))
|
|
end
|
|
else
|
|
if db.hidecasttime then
|
|
self.TimeText:SetFormattedText(TimeFmt(remainingTime))
|
|
else
|
|
self.TimeText:SetFormattedText("%s / %s", format(TimeFmt(remainingTime)), format(TimeFmt(endTime - startTime, true)))
|
|
end
|
|
end
|
|
|
|
if currentTime > endTime then
|
|
self.casting, self.channeling = nil, nil
|
|
self.fadeOut = true
|
|
self.stopTime = currentTime
|
|
end
|
|
elseif self.fadeOut then
|
|
self.Spark:Hide()
|
|
local alpha
|
|
local stopTime = self.stopTime
|
|
if stopTime then
|
|
alpha = stopTime - currentTime + 1
|
|
else
|
|
alpha = 0
|
|
end
|
|
if alpha >= 1 then
|
|
alpha = 1
|
|
end
|
|
if alpha <= 0 then
|
|
self.stopTime = nil
|
|
self:Hide()
|
|
else
|
|
self:SetAlpha(alpha*db.alpha)
|
|
end
|
|
else
|
|
self:Hide()
|
|
end
|
|
end
|
|
CastBarTemplate.OnUpdate = OnUpdate
|
|
|
|
local function OnEvent(self, event, ...)
|
|
if self[event] then
|
|
self[event](self, event, ...)
|
|
end
|
|
end
|
|
|
|
----------------------------
|
|
-- Template Methods
|
|
|
|
local function SetNameText(self, name, rank)
|
|
local mask, arg = nil, nil
|
|
if self.config.spellrank and rank then
|
|
mask, arg = RomanFmt(rank, self.config.spellrankstyle)
|
|
end
|
|
|
|
if self.config.targetname and self.targetName and self.targetName ~= "" then
|
|
if mask then
|
|
mask = mask .. " -> " .. self.targetName
|
|
else
|
|
name = name .. " -> " .. self.targetName
|
|
end
|
|
end
|
|
if mask then
|
|
self.Text:SetFormattedText(mask, name, arg)
|
|
else
|
|
self.Text:SetText(name)
|
|
end
|
|
end
|
|
CastBarTemplate.SetNameText = SetNameText
|
|
|
|
local function ToggleCastNotInterruptible(self, notInterruptible, init)
|
|
if self.unit == "player" and not init then return end
|
|
local db = self.config
|
|
|
|
if notInterruptible and db.noInterruptChangeColor then
|
|
self.Bar:SetStatusBarColor(unpack(db.noInterruptColor))
|
|
end
|
|
|
|
local r, g, b, a
|
|
if notInterruptible and db.noInterruptChangeBorder then
|
|
self.backdrop.edgeFile = media:Fetch("border", db.noInterruptBorder)
|
|
r,g,b = unpack(db.noInterruptBorderColor)
|
|
a = db.noInterruptBorderAlpha
|
|
else
|
|
self.backdrop.edgeFile = media:Fetch("border", db.border)
|
|
r,g,b = unpack(Quartz3.db.profile.bordercolor)
|
|
a = Quartz3.db.profile.borderalpha
|
|
end
|
|
self:SetBackdrop(self.backdrop)
|
|
self:SetBackdropBorderColor(r, g, b, a)
|
|
|
|
r, g, b = unpack(Quartz3.db.profile.backgroundcolor)
|
|
self:SetBackdropColor(r, g, b, Quartz3.db.profile.backgroundalpha)
|
|
|
|
if self.Shield then
|
|
if notInterruptible and db.noInterruptShield and not db.hideicon then
|
|
self.Shield:Show()
|
|
else
|
|
self.Shield:Hide()
|
|
end
|
|
end
|
|
|
|
self.lastNotInterruptible = notInterruptible
|
|
end
|
|
CastBarTemplate.ToggleCastNotInterruptible = ToggleCastNotInterruptible
|
|
|
|
----------------------------
|
|
-- Event Handlers
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_SENT(event, unit, spell, rank, target)
|
|
if unit ~= self.unit and not (self.unit == "player" and unit == "vehicle") then
|
|
return
|
|
end
|
|
if target then
|
|
self.targetName = target
|
|
else
|
|
-- auto selfcast? is this needed, even?
|
|
self.targetName = playerName
|
|
end
|
|
|
|
call(self, "UNIT_SPELLCAST_SENT", unit, spell, rank, target)
|
|
end
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_START(event, unit)
|
|
if (unit ~= self.unit and not (self.unit == "player" and unit == "vehicle")) or call(self, "PreShowCondition", unit) then
|
|
return
|
|
end
|
|
local db = self.config
|
|
if event == "UNIT_SPELLCAST_START" then
|
|
self.casting, self.channeling = true, nil
|
|
else
|
|
self.casting, self.channeling = nil, true
|
|
end
|
|
|
|
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible
|
|
if self.casting then
|
|
spell, rank, displayName, icon, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo(unit)
|
|
else -- self.channeling
|
|
spell, rank, displayName, icon, startTime, endTime, isTradeSkill, notInterruptible = UnitChannelInfo(unit)
|
|
-- channeling spells sometimes just display "Channeling" - this is not wanted
|
|
displayName = spell
|
|
end
|
|
-- in case this returned nothing
|
|
if not startTime then return end
|
|
|
|
startTime = startTime / 1000
|
|
endTime = endTime / 1000
|
|
self.startTime = startTime
|
|
self.endTime = endTime
|
|
self.delay = 0
|
|
self.fadeOut = nil
|
|
|
|
self.Bar:SetStatusBarColor(unpack(self.casting and Quartz3.db.profile.castingcolor or Quartz3.db.profile.channelingcolor))
|
|
|
|
self.Bar:SetValue(self.casting and 0 or 1)
|
|
self:Show()
|
|
self:SetAlpha(db.alpha)
|
|
|
|
SetNameText(self, displayName, rank)
|
|
|
|
self.Spark:Show()
|
|
|
|
if icon == "Interface\\Icons\\Temp" and Quartz3.db.profile.hidesamwise then
|
|
icon = nil
|
|
end
|
|
self.Icon:SetTexture(icon)
|
|
|
|
local position = db.timetextposition
|
|
if position == "caststart" or position == "castend" then
|
|
if (position == "caststart" and self.casting) or (position == "castend" and self.channeling) then
|
|
self.TimeText:SetPoint("LEFT", self.Bar, "LEFT", db.timetextx, db.timetexty)
|
|
self.TimeText:SetJustifyH("LEFT")
|
|
else
|
|
self.TimeText:SetPoint("RIGHT", self.Bar, "RIGHT", -1 * db.timetextx, db.timetexty)
|
|
self.TimeText:SetJustifyH("RIGHT")
|
|
end
|
|
end
|
|
|
|
ToggleCastNotInterruptible(self, notInterruptible)
|
|
|
|
call(self, "UNIT_SPELLCAST_START", unit)
|
|
end
|
|
CastBarTemplate.UNIT_SPELLCAST_CHANNEL_START = CastBarTemplate.UNIT_SPELLCAST_START
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_STOP(event, unit)
|
|
if not (self.channeling or self.casting) or (unit ~= self.unit and not (self.unit == "player" and unit == "vehicle")) then
|
|
return
|
|
end
|
|
|
|
self.Bar:SetValue(self.casting and 1.0 or 0)
|
|
self.Bar:SetStatusBarColor(unpack(Quartz3.db.profile.completecolor))
|
|
|
|
self.casting, self.channeling = nil, nil
|
|
self.fadeOut = true
|
|
self.stopTime = GetTime()
|
|
|
|
self.TimeText:SetText("")
|
|
|
|
call(self, "UNIT_SPELLCAST_STOP", unit)
|
|
end
|
|
CastBarTemplate.UNIT_SPELLCAST_CHANNEL_STOP = CastBarTemplate.UNIT_SPELLCAST_STOP
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_FAILED(event, unit)
|
|
if self.channeling or self.casting or (unit ~= self.unit and not (self.unit == "player" and unit == "vehicle")) then
|
|
return
|
|
end
|
|
self.fadeOut = true
|
|
if not self.stopTime then
|
|
self.stopTime = GetTime()
|
|
end
|
|
self.Bar:SetValue(1.0)
|
|
self.Bar:SetStatusBarColor(unpack(Quartz3.db.profile.failcolor))
|
|
|
|
self.TimeText:SetText("")
|
|
|
|
call(self, "UNIT_SPELLCAST_FAILED", unit)
|
|
end
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_INTERRUPTED(event, unit)
|
|
if unit ~= self.unit and not (self.unit == "player" and unit == "vehicle") then
|
|
return
|
|
end
|
|
self.casting, self.channeling = nil, nil
|
|
self.fadeOut = true
|
|
if not self.stopTime then
|
|
self.stopTime = GetTime()
|
|
end
|
|
self.Bar:SetValue(1.0)
|
|
self.Bar:SetStatusBarColor(unpack(Quartz3.db.profile.failcolor))
|
|
|
|
self.TimeText:SetText("")
|
|
|
|
call(self, "UNIT_SPELLCAST_INTERRUPTED", unit)
|
|
end
|
|
CastBarTemplate.UNIT_SPELLCAST_CHANNEL_INTERRUPTED = CastBarTemplate.UNIT_SPELLCAST_INTERRUPTED
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_DELAYED(event, unit)
|
|
if unit ~= self.unit and not (self.unit == "player" and unit == "vehicle") or call(self, "PreShowCondition", unit) then
|
|
return
|
|
end
|
|
local oldStart = self.startTime
|
|
local spell, rank, displayName, icon, startTime, endTime
|
|
if self.casting then
|
|
spell, rank, displayName, icon, startTime, endTime = UnitCastingInfo(unit)
|
|
else
|
|
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(unit)
|
|
end
|
|
|
|
if not startTime then
|
|
return self:Hide()
|
|
end
|
|
|
|
startTime = startTime / 1000
|
|
endTime = endTime / 1000
|
|
self.startTime = startTime
|
|
self.endTime = endTime
|
|
|
|
if self.casting then
|
|
self.delay = (self.delay or 0) + (startTime - (oldStart or startTime))
|
|
else
|
|
self.delay = (self.delay or 0) + ((oldStart or startTime) - startTime)
|
|
end
|
|
|
|
call(self, "UNIT_SPELLCAST_DELAYED", unit)
|
|
end
|
|
CastBarTemplate.UNIT_SPELLCAST_CHANNEL_UPDATE = CastBarTemplate.UNIT_SPELLCAST_DELAYED
|
|
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_INTERRUPTIBLE(event, unit)
|
|
if unit ~= self.unit then
|
|
return
|
|
end
|
|
ToggleCastNotInterruptible(self, false)
|
|
end
|
|
|
|
function CastBarTemplate:UNIT_SPELLCAST_NOT_INTERRUPTIBLE(event, unit)
|
|
if unit ~= self.unit then
|
|
return
|
|
end
|
|
ToggleCastNotInterruptible(self, true)
|
|
end
|
|
|
|
function CastBarTemplate:UpdateUnit()
|
|
if UnitCastingInfo(self.unit) then
|
|
self:UNIT_SPELLCAST_START("UNIT_SPELLCAST_START", self.unit)
|
|
elseif UnitChannelInfo(self.unit) then
|
|
self:UNIT_SPELLCAST_START("UNIT_SPELLCAST_CHANNEL_START", self.unit)
|
|
else
|
|
self:Hide()
|
|
end
|
|
end
|
|
|
|
function CastBarTemplate:SetConfig(config)
|
|
self.config = config
|
|
end
|
|
|
|
function CastBarTemplate:ApplySettings()
|
|
local db = self.config
|
|
|
|
self:ClearAllPoints()
|
|
if not db.x then
|
|
db.x = (UIParent:GetWidth() / 2 - (db.w * db.scale) / 2) / db.scale
|
|
end
|
|
self:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", db.x, db.y)
|
|
self:SetWidth(db.w + 10)
|
|
self:SetHeight(db.h + 10)
|
|
self:SetAlpha(db.alpha)
|
|
self:SetScale(db.scale)
|
|
|
|
ToggleCastNotInterruptible(self, self.lastNotInterruptible, true)
|
|
|
|
self.Bar:ClearAllPoints()
|
|
self.Bar:SetPoint("CENTER",self,"CENTER")
|
|
self.Bar:SetWidth(db.w)
|
|
self.Bar:SetHeight(db.h)
|
|
self.Bar:SetStatusBarTexture(media:Fetch("statusbar", db.texture))
|
|
self.Bar:GetStatusBarTexture():SetHorizTile(false)
|
|
self.Bar:GetStatusBarTexture():SetVertTile(false)
|
|
self.Bar:SetMinMaxValues(0, 1)
|
|
|
|
if db.hidetimetext then
|
|
self.TimeText:Hide()
|
|
else
|
|
self.TimeText:Show()
|
|
self.TimeText:ClearAllPoints()
|
|
self.TimeText:SetWidth(db.w)
|
|
local position = db.timetextposition
|
|
if position == "left" then
|
|
self.TimeText:SetPoint("LEFT", self.Bar, "LEFT", db.timetextx, db.timetexty)
|
|
self.TimeText:SetJustifyH("LEFT")
|
|
elseif position == "center" then
|
|
self.TimeText:SetPoint("CENTER", self.Bar, "CENTER", db.timetextx, db.timetexty)
|
|
self.TimeText:SetJustifyH("CENTER")
|
|
elseif position == "right" then
|
|
self.TimeText:SetPoint("RIGHT", self.Bar, "RIGHT", -1 * db.timetextx, db.timetexty)
|
|
self.TimeText:SetJustifyH("RIGHT")
|
|
end -- L["Cast Start Side"], L["Cast End Side"] -- handled at runtime
|
|
end
|
|
self.TimeText:SetFont(media:Fetch("font", db.font), db.timefontsize)
|
|
self.TimeText:SetShadowColor( 0, 0, 0, 1)
|
|
self.TimeText:SetShadowOffset( 0.8, -0.8 )
|
|
self.TimeText:SetTextColor(unpack(Quartz3.db.profile.timetextcolor))
|
|
self.TimeText:SetNonSpaceWrap(false)
|
|
self.TimeText:SetHeight(db.h)
|
|
|
|
local temptext = self.TimeText:GetText()
|
|
if db.hidecasttime then
|
|
self.TimeText:SetFormattedText(TimeFmt(10))
|
|
else
|
|
self.TimeText:SetFormattedText("%s / %s", format(TimeFmt(10)), format(TimeFmt(10, true)))
|
|
end
|
|
local normaltimewidth = self.TimeText:GetStringWidth()
|
|
self.TimeText:SetText(temptext)
|
|
|
|
if db.hidenametext then
|
|
self.Text:Hide()
|
|
else
|
|
self.Text:Show()
|
|
self.Text:ClearAllPoints()
|
|
local position = db.nametextposition
|
|
if position == "left" then
|
|
self.Text:SetPoint("LEFT", self.Bar, "LEFT", db.nametextx, db.nametexty)
|
|
self.Text:SetJustifyH("LEFT")
|
|
if db.hidetimetext or db.timetextposition ~= "right" then
|
|
self.Text:SetWidth(db.w)
|
|
else
|
|
self.Text:SetWidth(db.w - normaltimewidth - 5)
|
|
end
|
|
elseif position == "center" then
|
|
self.Text:SetPoint("CENTER", self.Bar, "CENTER", db.nametextx, db.nametexty)
|
|
self.Text:SetJustifyH("CENTER")
|
|
else -- L["Right"]
|
|
self.Text:SetPoint("RIGHT", self.Bar, "RIGHT", -1 * db.nametextx, db.nametexty)
|
|
self.Text:SetJustifyH("RIGHT")
|
|
if db.hidetimetext or db.timetextposition ~= "left" then
|
|
self.Text:SetWidth(db.w)
|
|
else
|
|
self.Text:SetWidth(db.w - normaltimewidth - 5)
|
|
end
|
|
end
|
|
end
|
|
self.Text:SetFont(media:Fetch("font", db.font), db.fontsize)
|
|
self.Text:SetShadowColor( 0, 0, 0, 1)
|
|
self.Text:SetShadowOffset( 0.8, -0.8 )
|
|
self.Text:SetTextColor(unpack(Quartz3.db.profile.spelltextcolor))
|
|
self.Text:SetNonSpaceWrap(false)
|
|
self.Text:SetHeight(db.h)
|
|
|
|
if db.hideicon then
|
|
self.Icon:Hide()
|
|
else
|
|
self.Icon:Show()
|
|
self.Icon:ClearAllPoints()
|
|
if db.iconposition == "left" then
|
|
self.Icon:SetPoint("RIGHT", self.Bar, "LEFT", -1 * db.icongap, 0)
|
|
else --L["Right"]
|
|
self.Icon:SetPoint("LEFT", self.Bar, "RIGHT", db.icongap, 0)
|
|
end
|
|
self.Icon:SetWidth(db.h)
|
|
self.Icon:SetHeight(db.h)
|
|
self.Icon:SetTexCoord(0.07, 0.93, 0.07, 0.93)
|
|
self.Icon:SetAlpha(db.iconalpha)
|
|
end
|
|
|
|
self.Spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
|
|
self.Spark:SetVertexColor(unpack(Quartz3.db.profile.sparkcolor))
|
|
self.Spark:SetBlendMode("ADD")
|
|
self.Spark:SetWidth(20)
|
|
self.Spark:SetHeight(db.h*2.2)
|
|
end
|
|
|
|
function CastBarTemplate:RegisterEvents()
|
|
if self.unit == "player" then
|
|
self:RegisterEvent("UNIT_SPELLCAST_SENT")
|
|
end
|
|
self:RegisterEvent("UNIT_SPELLCAST_START")
|
|
self:RegisterEvent("UNIT_SPELLCAST_STOP")
|
|
self:RegisterEvent("UNIT_SPELLCAST_FAILED")
|
|
self:RegisterEvent("UNIT_SPELLCAST_DELAYED")
|
|
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_INTERRUPTED")
|
|
if self.unit ~= "player" then
|
|
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE")
|
|
self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE")
|
|
end
|
|
|
|
media.RegisterCallback(self, "LibSharedMedia_SetGlobal", function(mtype, override)
|
|
if mtype == "statusbar" then
|
|
self.Bar:SetStatusBarTexture(media:Fetch("statusbar", override))
|
|
end
|
|
end)
|
|
|
|
media.RegisterCallback(self, "LibSharedMedia_Registered", function(mtype, key)
|
|
if mtype == "statusbar" and key == self.config.texture then
|
|
self.Bar:SetStatusBarTexture(media:Fetch("statusbar", self.config.texture))
|
|
end
|
|
end)
|
|
end
|
|
|
|
function CastBarTemplate:UnregisterEvents()
|
|
self:UnregisterAllEvents()
|
|
media.UnregisterCallback(self, "LibSharedMedia_SetGlobal")
|
|
media.UnregisterCallback(self, "LibSharedMedia_Registered")
|
|
end
|
|
|
|
do
|
|
local function dragstart(self)
|
|
self:StartMoving()
|
|
end
|
|
|
|
local function dragstop(self)
|
|
self.config.x = self:GetLeft()
|
|
self.config.y = self:GetBottom()
|
|
self:StopMovingOrSizing()
|
|
end
|
|
|
|
local function nothing(self)
|
|
self:SetAlpha(self.config.alpha)
|
|
end
|
|
|
|
function CastBarTemplate:Unlock()
|
|
self:Show()
|
|
self:EnableMouse(true)
|
|
self:SetScript("OnDragStart", dragstart)
|
|
self:SetScript("OnDragStop", dragstop)
|
|
self:SetAlpha(1)
|
|
self.Hide = nothing
|
|
self.Icon:SetTexture("Interface\\Icons\\Temp")
|
|
self.Text:SetText(self.unit)
|
|
end
|
|
|
|
function CastBarTemplate:Lock()
|
|
self.Hide = nil
|
|
self:EnableMouse(false)
|
|
self:SetScript("OnDragStart", nil)
|
|
self:SetScript("OnDragStop", nil)
|
|
if not (self.channeling or self.casting) then
|
|
self:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
----------------------------
|
|
-- Options
|
|
|
|
do
|
|
local function getBar(info)
|
|
return Quartz3.CastBarTemplate.bars[info[1]]
|
|
end
|
|
|
|
local function hideiconoptions(info)
|
|
local db = getBar(info).config
|
|
return db.hideicon
|
|
end
|
|
|
|
local function hidetimetextoptions(info)
|
|
local db = getBar(info).config
|
|
return db.hidetimetext
|
|
end
|
|
|
|
local function hidecasttimeprecision(info)
|
|
local db = getBar(info).config
|
|
return db.hidetimetext or db.hidecasttime
|
|
end
|
|
|
|
local function hidenametextoptions(info)
|
|
local db = getBar(info).config
|
|
return db.hidenametext
|
|
end
|
|
|
|
local function hidespellrankstyle(info)
|
|
local db = getBar(info).config
|
|
return db.hidenametext or not db.spellrank
|
|
end
|
|
|
|
local function noInterruptChangeBorder(info)
|
|
local db = getBar(info).config
|
|
return not db.noInterruptChangeBorder
|
|
end
|
|
|
|
local function noInterruptChangeColor(info)
|
|
local db = getBar(info).config
|
|
return not db.noInterruptChangeColor
|
|
end
|
|
|
|
local function icondisabled(info)
|
|
local db = getBar(info).config
|
|
return db.hideicon
|
|
end
|
|
|
|
local function snapToCenter(info, v)
|
|
local bar = getBar(info)
|
|
local scale = bar.config.scale
|
|
if v == "horizontal" then
|
|
bar.config.x = (UIParent:GetWidth() / 2 - (bar.config.w * scale) / 2) / scale
|
|
else -- L["Vertical"]
|
|
bar.config.y = (UIParent:GetHeight() / 2 - (bar.config.h * scale) / 2) / scale
|
|
end
|
|
bar:ApplySettings()
|
|
end
|
|
|
|
local function copySettings(info, v)
|
|
local bar = getBar(info)
|
|
local from = Quartz3:GetModule(v)
|
|
Quartz3:CopySettings(from.db.profile, bar.config)
|
|
bar:ApplySettings()
|
|
end
|
|
|
|
local function getEnabled(info)
|
|
local bar = getBar(info)
|
|
return Quartz3:GetModuleEnabled(bar.modName)
|
|
end
|
|
|
|
local function setEnabled(info, v)
|
|
local bar = getBar(info)
|
|
return Quartz3:SetModuleEnabled(bar.modName, v)
|
|
end
|
|
|
|
local function getOpt(info)
|
|
local db = getBar(info).config
|
|
return db[info[#info]]
|
|
end
|
|
|
|
local function setOpt(info, value)
|
|
local bar = getBar(info)
|
|
bar.config[info[#info]] = value
|
|
bar:ApplySettings()
|
|
end
|
|
|
|
local function getColor(info)
|
|
return unpack(getOpt(info))
|
|
end
|
|
|
|
local function setColor(info, ...)
|
|
setOpt(info, {...})
|
|
end
|
|
|
|
function CastBarTemplate:CreateOptions()
|
|
local options = {
|
|
type = "group",
|
|
name = self.localizedName,
|
|
get = getOpt,
|
|
set = setOpt,
|
|
args = {
|
|
toggle = {
|
|
type = "toggle",
|
|
name = L["Enable"],
|
|
desc = L["Enable"],
|
|
get = getEnabled,
|
|
set = setEnabled,
|
|
order = 99,
|
|
width = "full",
|
|
},
|
|
h = {
|
|
type = "range",
|
|
name = L["Height"],
|
|
desc = L["Height"],
|
|
min = 10, max = 50, step = 1,
|
|
order = 200,
|
|
},
|
|
w = {
|
|
type = "range",
|
|
name = L["Width"],
|
|
desc = L["Width"],
|
|
min = 50, max = 1500, bigStep = 5,
|
|
order = 200,
|
|
},
|
|
x = {
|
|
type = "range",
|
|
name = L["X"],
|
|
desc = L["Set an exact X value for this bar's position."],
|
|
min = -2560, max = 2560, bigStep = 1,
|
|
order = 200,
|
|
},
|
|
y = {
|
|
type = "range",
|
|
name = L["Y"],
|
|
desc = L["Set an exact Y value for this bar's position."],
|
|
min = -1600, max = 1600, bigStep = 1,
|
|
order = 200,
|
|
},
|
|
scale = {
|
|
type = "range",
|
|
name = L["Scale"],
|
|
desc = L["Scale"],
|
|
min = 0.2, max = 1, bigStep = 0.025,
|
|
order = 201,
|
|
},
|
|
alpha = {
|
|
type = "range",
|
|
name = L["Alpha"],
|
|
desc = L["Alpha"],
|
|
isPercent = true,
|
|
min = 0.1, max = 1, bigStep = 0.025,
|
|
order = 202,
|
|
},
|
|
icon = {
|
|
type = "header",
|
|
name = L["Icon"],
|
|
order = 300,
|
|
},
|
|
hideicon = {
|
|
type = "toggle",
|
|
name = L["Hide Icon"],
|
|
desc = L["Hide Spell Cast Icon"],
|
|
order = 301,
|
|
},
|
|
iconposition = {
|
|
type = "select",
|
|
name = L["Icon Position"],
|
|
desc = L["Set where the Spell Cast icon appears"],
|
|
disabled = hideiconoptions,
|
|
values = {["left"] = L["Left"], ["right"] = L["Right"]},
|
|
order = 301,
|
|
},
|
|
iconalpha = {
|
|
type = "range",
|
|
name = L["Icon Alpha"],
|
|
desc = L["Set the Spell Cast icon alpha"],
|
|
isPercent = true,
|
|
min = 0.1, max = 1, bigStep = 0.025,
|
|
order = 302,
|
|
disabled = hideiconoptions,
|
|
},
|
|
icongap = {
|
|
type = "range",
|
|
name = L["Icon Gap"],
|
|
desc = L["Space between the cast bar and the icon."],
|
|
min = -35, max = 35, bigStep = 1,
|
|
order = 302,
|
|
disabled = hideiconoptions,
|
|
},
|
|
fonthead = {
|
|
type = "header",
|
|
name = L["Font and Text"],
|
|
order = 398,
|
|
},
|
|
font = {
|
|
type = "select",
|
|
dialogControl = "LSM30_Font",
|
|
name = L["Font"],
|
|
desc = L["Set the font used in the Name and Time texts"],
|
|
values = lsmlist.font,
|
|
order = 399,
|
|
},
|
|
nlfont = {
|
|
type = "description",
|
|
name = "",
|
|
order = 400,
|
|
},
|
|
hidenametext = {
|
|
type = "toggle",
|
|
name = L["Hide Spell Name"],
|
|
desc = L["Disable the text that displays the spell name/rank"],
|
|
order = 401,
|
|
},
|
|
nlname = {
|
|
type = "description",
|
|
name = "",
|
|
order = 403,
|
|
},
|
|
nametextposition = {
|
|
type = "select",
|
|
name = L["Spell Name Position"],
|
|
desc = L["Set the alignment of the spell name text"],
|
|
values = {["left"] = L["Left"], ["right"] = L["Right"], ["center"] = L["Center"]},
|
|
disabled = hidenametextoptions,
|
|
order = 404,
|
|
},
|
|
fontsize = {
|
|
type = "range",
|
|
name = L["Spell Name Font Size"],
|
|
desc = L["Set the size of the spell name text"],
|
|
min = 7, max = 20, step = 1,
|
|
order = 405,
|
|
disabled = hidenametextoptions,
|
|
},
|
|
nametextx = {
|
|
type = "range",
|
|
name = L["Spell Name X Offset"],
|
|
desc = L["Adjust the X position of the spell name text"],
|
|
min = -35, max = 35, step = 1,
|
|
disabled = hidenametextoptions,
|
|
order = 406,
|
|
},
|
|
nametexty = {
|
|
type = "range",
|
|
name = L["Spell Name Y Offset"],
|
|
desc = L["Adjust the Y position of the name text"],
|
|
min = -35, max = 35, step = 1,
|
|
disabled = hidenametextoptions,
|
|
order = 407,
|
|
},
|
|
spellrank = {
|
|
type = "toggle",
|
|
name = L["Spell Rank"],
|
|
desc = L["Display the rank of spellcasts alongside their name"],
|
|
disabled = hidenametextoptions,
|
|
order = 408,
|
|
},
|
|
spellrankstyle = {
|
|
type = "select",
|
|
name = L["Spell Rank Style"],
|
|
desc = L["Set the display style of the spell rank"],
|
|
disabled = hidespellrankstyle,
|
|
values = {["number"] = L["Number"], ["roman"] = L["Roman"], ["full"] = L["Full Text"], ["romanfull"] = L["Roman Full Text"]},
|
|
order = 409,
|
|
},
|
|
hidetimetext = {
|
|
type = "toggle",
|
|
name = L["Hide Time Text"],
|
|
desc = L["Disable the text that displays the time remaining on your cast"],
|
|
order = 411,
|
|
},
|
|
hidecasttime = {
|
|
type = "toggle",
|
|
name = L["Hide Cast Time"],
|
|
desc = L["Disable the text that displays the total cast time"],
|
|
disabled = hidetimetextoptions,
|
|
order = 412,
|
|
},
|
|
timefontsize = {
|
|
type = "range",
|
|
name = L["Time Font Size"],
|
|
desc = L["Set the size of the time text"],
|
|
min = 7, max = 20, step = 1,
|
|
order = 414,
|
|
disabled = hidetimetextoptions,
|
|
},
|
|
timetextposition = {
|
|
type = "select",
|
|
name = L["Time Text Position"],
|
|
desc = L["Set the alignment of the time text"],
|
|
values = {["left"] = L["Left"], ["right"] = L["Right"], ["center"] = L["Center"], ["caststart"] = L["Cast Start Side"], ["castend"] = L["Cast End Side"]},
|
|
disabled = hidetimetextoptions,
|
|
order = 415,
|
|
},
|
|
timetextx = {
|
|
type = "range",
|
|
name = L["Time Text X Offset"],
|
|
desc = L["Adjust the X position of the time text"],
|
|
min = -35, max = 35, step = 1,
|
|
disabled = hidetimetextoptions,
|
|
order = 416,
|
|
},
|
|
timetexty = {
|
|
type = "range",
|
|
name = L["Time Text Y Offset"],
|
|
desc = L["Adjust the Y position of the time text"],
|
|
min = -35, max = 35, step = 1,
|
|
disabled = hidetimetextoptions,
|
|
order = 417,
|
|
},
|
|
textureheader = {
|
|
type = "header",
|
|
name = L["Texture and Border"],
|
|
order = 450,
|
|
},
|
|
texture = {
|
|
type = "select",
|
|
dialogControl = "LSM30_Statusbar",
|
|
name = L["Texture"],
|
|
desc = L["Set the Cast Bar Texture"],
|
|
values = lsmlist.statusbar,
|
|
order = 451,
|
|
},
|
|
border = {
|
|
type = "select",
|
|
dialogControl = "LSM30_Border",
|
|
name = L["Border"],
|
|
desc = L["Set the border style"],
|
|
values = lsmlist.border,
|
|
order = 452,
|
|
},
|
|
noInterruptGroup = {
|
|
type = "group",
|
|
name = L["No interrupt cast bars"],
|
|
dialogInline = true,
|
|
order = 455,
|
|
args = {
|
|
noInterruptChangeBorder = {
|
|
type = "toggle",
|
|
name = L["Change Border Style"],
|
|
desc = L["Adjust the Border Style for non-interruptible Cast Bars"],
|
|
order = 1,
|
|
},
|
|
noInterruptBorder = {
|
|
type = "select",
|
|
name = L["Border"],
|
|
desc = L["Set the border style for no interrupt casting bars"],
|
|
dialogControl = "LSM30_Border",
|
|
values = lsmlist.border,
|
|
order = 2,
|
|
disabled = noInterruptChangeBorder,
|
|
},
|
|
noInterruptBorderColor = {
|
|
type = "color",
|
|
name = L["Border Color"],
|
|
desc = L["Set the color of the no interrupt casting bar border"],
|
|
get = getColor,
|
|
set = setColor,
|
|
order = 3,
|
|
disabled = noInterruptChangeBorder,
|
|
},
|
|
noInterruptBorderAlpha = {
|
|
type = "range",
|
|
name = L["Border Alpha"],
|
|
desc = L["Set the alpha of the no interrupt casting bar border"],
|
|
isPercent = true,
|
|
min = 0, max = 1, bigStep = 0.025,
|
|
order = 4,
|
|
disabled = noInterruptChangeBorder,
|
|
},
|
|
noInterruptChangeColor = {
|
|
type = "toggle",
|
|
name = L["Change Color"],
|
|
desc = L["Change the color of non-interruptible Cast Bars"],
|
|
order = 10,
|
|
},
|
|
noInterruptColor = {
|
|
type = "color",
|
|
name = L["Cast Bar Color"],
|
|
desc = L["Configure the color of the cast bar."],
|
|
disabled = noInterruptChangeColor,
|
|
set = setColor,
|
|
get = getColor,
|
|
order = 11,
|
|
},
|
|
noInterruptShield = {
|
|
type = "toggle",
|
|
name = L["Show Shield Icon"],
|
|
desc = L["Show the Shield Icon on non-interruptible Cast Bars"],
|
|
disabled = icondisabled,
|
|
},
|
|
},
|
|
},
|
|
toolheader = {
|
|
type = "header",
|
|
name = L["Tools"],
|
|
order = 500,
|
|
},
|
|
snaptocenter = {
|
|
type = "select",
|
|
name = L["Snap to Center"],
|
|
desc = L["Move the CastBar to center of the screen along the specified axis"],
|
|
get = false,
|
|
set = snapToCenter,
|
|
values = {["horizontal"] = L["Horizontal"], ["vertical"] = L["Vertical"]},
|
|
order = 503,
|
|
},
|
|
copysettings = {
|
|
type = "select",
|
|
name = L["Copy Settings From"],
|
|
desc = L["Select a bar from which to copy settings"],
|
|
get = false,
|
|
set = copySettings,
|
|
values = {["Target"] = L["Target"], ["Focus"] = L["Focus"], ["Pet"] = L["Pet"], ["Player"] = L["Player"]},
|
|
order = 504
|
|
}
|
|
}
|
|
}
|
|
return options
|
|
end
|
|
end
|
|
|
|
Quartz3.CastBarTemplate = {}
|
|
Quartz3.CastBarTemplate.defaults = {
|
|
--x = -- applied automatically in applySettings()
|
|
y = 180,
|
|
h = 25,
|
|
w = 250,
|
|
scale = 1,
|
|
texture = "Blizzard",
|
|
hideicon = false,
|
|
alpha = 1,
|
|
iconalpha = 0.9,
|
|
iconposition = "left",
|
|
icongap = 4,
|
|
hidenametext = false,
|
|
nametextposition = "left",
|
|
timetextposition = "right",
|
|
font = "Friz Quadrata TT",
|
|
fontsize = 14,
|
|
hidetimetext = false,
|
|
hidecasttime = false,
|
|
timefontsize = 12,
|
|
targetname = false,
|
|
spellrank = false,
|
|
spellrankstyle = "roman",
|
|
border = "Blizzard Tooltip",
|
|
nametextx = 3,
|
|
nametexty = 0,
|
|
timetextx = 3,
|
|
timetexty = 0,
|
|
|
|
noInterruptBorderChange = false,
|
|
noInterruptBorder = "Tooltip enlarged",
|
|
noInterruptBorderColor = {0.71, 0.73, 0.71}, -- Default color chosen by playing around with settings, rounded to 2 significant digits
|
|
noInterruptBorderAlpha = 1,
|
|
noInterruptColorChange = false,
|
|
noInterruptColor = {1.0, 0.49, 0},
|
|
noInterruptShield = true,
|
|
}
|
|
Quartz3.CastBarTemplate.template = CastBarTemplate
|
|
Quartz3.CastBarTemplate.bars = {}
|
|
function Quartz3.CastBarTemplate:new(parent, unit, name, localizedName, config)
|
|
local frameName = "Quartz3CastBar" .. name
|
|
local bar = setmetatable(CreateFrame("Frame", frameName, UIParent), CastBarTemplate_MT)
|
|
bar.unit = unit
|
|
bar.parent = parent
|
|
bar.config = config
|
|
bar.modName = name
|
|
bar.localizedName = localizedName
|
|
bar.locked = true
|
|
|
|
Quartz3.CastBarTemplate.bars[name] = bar
|
|
|
|
bar:SetFrameStrata("MEDIUM")
|
|
bar:SetScript("OnShow", OnShow)
|
|
bar:SetScript("OnHide", OnHide)
|
|
bar:SetScript("OnUpdate", OnUpdate)
|
|
bar:SetScript("OnEvent", OnEvent)
|
|
bar:SetMovable(true)
|
|
bar:RegisterForDrag("LeftButton")
|
|
bar:SetClampedToScreen(true)
|
|
|
|
bar.Bar = CreateFrame("StatusBar", nil, bar)
|
|
bar.Text = bar.Bar:CreateFontString(nil, "OVERLAY")
|
|
bar.TimeText = bar.Bar:CreateFontString(nil, "OVERLAY")
|
|
bar.Icon = bar.Bar:CreateTexture(nil, "DIALOG")
|
|
bar.Spark = bar.Bar:CreateTexture(nil, "OVERLAY")
|
|
if unit ~= "player" then
|
|
bar.Shield = bar.Bar:CreateTexture(nil, "ARTWORK")
|
|
bar.Shield:SetTexture("Interface\\CastingBar\\UI-CastingBar-Small-Shield")
|
|
bar.Shield:SetTexCoord(0, 36/256, 0, 1)
|
|
bar.Shield:SetWidth(36)
|
|
bar.Shield:SetHeight(64)
|
|
bar.Shield:SetPoint("CENTER", bar.Icon, "CENTER", -2, -1)
|
|
bar.Shield:Hide()
|
|
end
|
|
|
|
bar.lastNotInterruptible = false
|
|
|
|
bar.backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
|
tile = true, tileSize = 16, edgeSize = 16, --edgeFile = "", -- set by ApplySettings
|
|
insets = {left = 4, right = 4, top = 4, bottom = 4} }
|
|
bar:Hide()
|
|
|
|
return bar
|
|
end
|