You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
925 lines
36 KiB
925 lines
36 KiB
|
5 years ago
|
--========================================================--
|
||
|
|
-- Scorpio Action Button Indicator --
|
||
|
|
-- --
|
||
|
|
-- Author : kurapica125@outlook.com --
|
||
|
|
-- Create Date : 2021/06/19 --
|
||
|
|
--========================================================--
|
||
|
|
|
||
|
|
--========================================================--
|
||
|
|
Scorpio"Scorpio.Secure.SecureActionButton.Indicator" "1.0.0"
|
||
|
|
--========================================================--
|
||
|
|
|
||
|
|
namespace "Scorpio.Secure.SecureActionButton"
|
||
|
|
|
||
|
|
import "System.Reactive"
|
||
|
|
|
||
|
|
------------------------------------------------------------
|
||
|
|
-- Help Service --
|
||
|
|
------------------------------------------------------------
|
||
|
|
AUTOCAST_SPEEDS = { 2, 4, 6, 8 }
|
||
|
|
AUTOCAST_TIMERS = { 0, 0, 0, 0 }
|
||
|
|
|
||
|
|
AUTO_CAST_SHINES = {}
|
||
|
|
|
||
|
|
__Service__(true)
|
||
|
|
function AutoCastShineService()
|
||
|
|
local prev = GetTime()
|
||
|
|
|
||
|
|
while true do
|
||
|
|
local hasShine = false
|
||
|
|
local now = GetTime()
|
||
|
|
local elapsed = now - prev
|
||
|
|
prev = now
|
||
|
|
|
||
|
|
for i in pairs(AUTOCAST_TIMERS) do
|
||
|
|
AUTOCAST_TIMERS[i] = AUTOCAST_TIMERS[i] + elapsed
|
||
|
|
if AUTOCAST_TIMERS[i] > AUTOCAST_SPEEDS[i] * 4 then
|
||
|
|
AUTOCAST_TIMERS[i] = 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for shine in pairs(AUTO_CAST_SHINES) do
|
||
|
|
hasShine = true
|
||
|
|
local distance = shine:GetWidth()
|
||
|
|
|
||
|
|
for i = 1, 4 do
|
||
|
|
local timer = AUTOCAST_TIMERS[i]
|
||
|
|
local speed = AUTOCAST_SPEEDS[i]
|
||
|
|
|
||
|
|
if ( timer <= speed ) then
|
||
|
|
local basePosition = timer/speed*distance
|
||
|
|
shine[0+i]:SetPoint("CENTER", shine, "TOPLEFT", basePosition, 0)
|
||
|
|
shine[4+i]:SetPoint("CENTER", shine, "BOTTOMRIGHT", -basePosition, 0)
|
||
|
|
shine[8+i]:SetPoint("CENTER", shine, "TOPRIGHT", 0, -basePosition)
|
||
|
|
shine[12+i]:SetPoint("CENTER", shine, "BOTTOMLEFT", 0, basePosition)
|
||
|
|
elseif ( timer <= speed*2 ) then
|
||
|
|
local basePosition = (timer-speed)/speed*distance
|
||
|
|
shine[0+i]:SetPoint("CENTER", shine, "TOPRIGHT", 0, -basePosition)
|
||
|
|
shine[4+i]:SetPoint("CENTER", shine, "BOTTOMLEFT", 0, basePosition)
|
||
|
|
shine[8+i]:SetPoint("CENTER", shine, "BOTTOMRIGHT", -basePosition, 0)
|
||
|
|
shine[12+i]:SetPoint("CENTER", shine, "TOPLEFT", basePosition, 0)
|
||
|
|
elseif ( timer <= speed*3 ) then
|
||
|
|
local basePosition = (timer-speed*2)/speed*distance
|
||
|
|
shine[0+i]:SetPoint("CENTER", shine, "BOTTOMRIGHT", -basePosition, 0)
|
||
|
|
shine[4+i]:SetPoint("CENTER", shine, "TOPLEFT", basePosition, 0)
|
||
|
|
shine[8+i]:SetPoint("CENTER", shine, "BOTTOMLEFT", 0, basePosition)
|
||
|
|
shine[12+i]:SetPoint("CENTER", shine, "TOPRIGHT", 0, -basePosition)
|
||
|
|
else
|
||
|
|
local basePosition = (timer-speed*3)/speed*distance
|
||
|
|
shine[0+i]:SetPoint("CENTER", shine, "BOTTOMLEFT", 0, basePosition)
|
||
|
|
shine[4+i]:SetPoint("CENTER", shine, "TOPRIGHT", 0, -basePosition)
|
||
|
|
shine[8+i]:SetPoint("CENTER", shine, "TOPLEFT", basePosition, 0)
|
||
|
|
shine[12+i]:SetPoint("CENTER", shine, "BOTTOMRIGHT", -basePosition, 0)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not hasShine then
|
||
|
|
NextEvent("SCORPIO_SAB_AUTO_CAST_SHINE")
|
||
|
|
prev = GetTime()
|
||
|
|
end
|
||
|
|
|
||
|
|
Next()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function RegisterAutoCastShine(self)
|
||
|
|
if self.IsAutoCast then
|
||
|
|
if not next(AUTO_CAST_SHINES) then FireSystemEvent("SCORPIO_SAB_AUTO_CAST_SHINE") end
|
||
|
|
AUTO_CAST_SHINES[self] = true
|
||
|
|
else
|
||
|
|
AUTO_CAST_SHINES[self] = nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
------------------------------------------------------------
|
||
|
|
-- Indicator --
|
||
|
|
------------------------------------------------------------
|
||
|
|
__Sealed__()
|
||
|
|
class "SpellActivationAlert" (function(_ENV)
|
||
|
|
inherit "Frame"
|
||
|
|
|
||
|
|
__Sealed__() enum "AinmationState" { "STOP", "IN", "OUT" }
|
||
|
|
|
||
|
|
__Bubbling__{ ["OuterGlowOver.Out"] = "OnFinished" }
|
||
|
|
event "OnFinished"
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Helpers --
|
||
|
|
------------------------------------------------------
|
||
|
|
local hiddenFrame = CreateFrame("Frame") hiddenFrame:Hide()
|
||
|
|
local recycle = Recycle(SpellActivationAlert, "Scorpio_SpellActivationAlert%d", hiddenFrame)
|
||
|
|
|
||
|
|
local function ChangeAntsSize(self)
|
||
|
|
local w, h = self:GetSize()
|
||
|
|
self:GetChild("Ants"):SetSize(w * 0.85, h * 0.85)
|
||
|
|
end
|
||
|
|
|
||
|
|
local function OnFinished(self)
|
||
|
|
return recycle(self)
|
||
|
|
end
|
||
|
|
|
||
|
|
function recycle:OnInit(alert)
|
||
|
|
alert.OnFinished = OnFinished
|
||
|
|
end
|
||
|
|
|
||
|
|
function recycle:OnPop(alert)
|
||
|
|
alert:Show()
|
||
|
|
end
|
||
|
|
|
||
|
|
function recycle:OnPush(alert)
|
||
|
|
alert.AinmationState = "STOP"
|
||
|
|
alert:SetParent(hiddenFrame)
|
||
|
|
alert:ClearAllPoints()
|
||
|
|
alert:Hide()
|
||
|
|
end
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Static Property --
|
||
|
|
------------------------------------------------------
|
||
|
|
__Static__() property "Pool" { set = false, default = recycle }
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Observable Property --
|
||
|
|
------------------------------------------------------
|
||
|
|
--- The animation state
|
||
|
|
__Observable__()
|
||
|
|
property "AinmationState" { type = AinmationState, default = "STOP", handler = function(self, val) return val == "IN" and Next(ChangeAntsSize, self) end }
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Constructor --
|
||
|
|
------------------------------------------------------
|
||
|
|
__Template__{
|
||
|
|
Spark = Texture,
|
||
|
|
InnerGlow = Texture,
|
||
|
|
InnerGlowOver = Texture,
|
||
|
|
OuterGlow = Texture,
|
||
|
|
OuterGlowOver = Texture,
|
||
|
|
Ants = Texture,
|
||
|
|
|
||
|
|
{
|
||
|
|
Spark = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Scale1 = Scale,
|
||
|
|
Scale2 = Scale,
|
||
|
|
Alpha1 = Alpha,
|
||
|
|
Alpha2 = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
InnerGlow = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Scale = Scale,
|
||
|
|
Alpha = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
InnerGlowOver = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Scale = Scale,
|
||
|
|
Alpha = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
OuterGlow = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
Out = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Scale = Scale
|
||
|
|
},
|
||
|
|
Out = {
|
||
|
|
Alpha = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
OuterGlowOver = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
Out = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Scale = Scale,
|
||
|
|
Alpha = Alpha,
|
||
|
|
},
|
||
|
|
Out = {
|
||
|
|
Alpha1 = Alpha,
|
||
|
|
Alpha2 = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
Ants = {
|
||
|
|
In = AnimationGroup,
|
||
|
|
Out = AnimationGroup,
|
||
|
|
{
|
||
|
|
In = {
|
||
|
|
Alpha = Alpha,
|
||
|
|
},
|
||
|
|
Out = {
|
||
|
|
Alpha = Alpha,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function __ctor(self)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
__Sealed__() __ChildProperty__(SecureActionButton, "AutoCastShine")
|
||
|
|
class "AutoCastShine" (function(_ENV)
|
||
|
|
inherit "Frame"
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Property --
|
||
|
|
------------------------------------------------------
|
||
|
|
property "IsAutoCast" { type = Boolean, handler = RegisterAutoCastShine }
|
||
|
|
|
||
|
|
------------------------------------------------------
|
||
|
|
-- Constructor --
|
||
|
|
------------------------------------------------------
|
||
|
|
function __ctor(self)
|
||
|
|
for i = 1, 16 do
|
||
|
|
local part = Texture("part"..i, self, "BACKGROUND")
|
||
|
|
part:SetTexture([[Interface\ItemSocketingFrame\UI-ItemSockets]])
|
||
|
|
part:SetBlendMode("ADD")
|
||
|
|
part:SetTexCoord(0.3984375, 0.4453125, 0.40234375, 0.44921875)
|
||
|
|
part:SetPoint("CENTER")
|
||
|
|
|
||
|
|
local size = i%4 == 1 and 13
|
||
|
|
or i%4 == 2 and 10
|
||
|
|
or i%4 == 3 and 7
|
||
|
|
or 4
|
||
|
|
part:SetSize(size, size)
|
||
|
|
|
||
|
|
self[i] = part
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
--- SpellActivationAlert
|
||
|
|
UI.Property {
|
||
|
|
name = "SpellActivationAlert",
|
||
|
|
require = SecureActionButton,
|
||
|
|
type = Boolean,
|
||
|
|
default = false,
|
||
|
|
set = function(self, value)
|
||
|
|
local alert = self.__SpellActivationAlert
|
||
|
|
if value then
|
||
|
|
if not alert then
|
||
|
|
alert = SpellActivationAlert.Pool()
|
||
|
|
local w, h = self:GetSize()
|
||
|
|
|
||
|
|
alert:SetParent(self)
|
||
|
|
alert:ClearAllPoints()
|
||
|
|
alert:SetPoint("CENTER")
|
||
|
|
alert:SetSize(w * 1.4, h * 1.4)
|
||
|
|
self.__SpellActivationAlert = alert
|
||
|
|
end
|
||
|
|
|
||
|
|
alert.AinmationState= "IN"
|
||
|
|
else
|
||
|
|
if alert then
|
||
|
|
alert.AinmationState = "OUT"
|
||
|
|
self.__SpellActivationAlert = nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The bottom background texture
|
||
|
|
UI.Property {
|
||
|
|
name = "CountLabel",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = FontString,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The bottom background texture
|
||
|
|
UI.Property {
|
||
|
|
name = "NameLabel",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = FontString,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The bottom background texture
|
||
|
|
UI.Property {
|
||
|
|
name = "HotKeyLabel",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = FontString,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The flash texture
|
||
|
|
UI.Property {
|
||
|
|
name = "FlashTexture",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The equipped item texture
|
||
|
|
UI.Property {
|
||
|
|
name = "EquippedItemTexture",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The flyout border
|
||
|
|
UI.Property {
|
||
|
|
name = "FlyoutBorder",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The flyout border shadow
|
||
|
|
UI.Property {
|
||
|
|
name = "FlyoutBorderShadow",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- The flyout arrow
|
||
|
|
UI.Property {
|
||
|
|
name = "FlyoutArrow",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The Auto castable texture
|
||
|
|
UI.Property {
|
||
|
|
name = "AutoCastableTexture",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The search overlay texture
|
||
|
|
UI.Property {
|
||
|
|
name = "SearchOverlay",
|
||
|
|
require = SecureActionButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The quest icon texture
|
||
|
|
UI.Property {
|
||
|
|
name = "IconQuestTexture",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The junk icon texture
|
||
|
|
UI.Property {
|
||
|
|
name = "JunkIcon",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The new item texture
|
||
|
|
UI.Property {
|
||
|
|
name = "NewItemTexture",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The battlepay item texture
|
||
|
|
UI.Property {
|
||
|
|
name = "BattlepayItemTexture",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The glow flash
|
||
|
|
UI.Property {
|
||
|
|
name = "GlowFlashTexture",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
--- The upgrade icon
|
||
|
|
UI.Property {
|
||
|
|
name = "UpgradeIcon",
|
||
|
|
require = ContainerFrameItemButton,
|
||
|
|
childtype = Texture,
|
||
|
|
}
|
||
|
|
|
||
|
|
------------------------------------------------------------
|
||
|
|
-- Default Style --
|
||
|
|
------------------------------------------------------------
|
||
|
|
local shareAtlas = AtlasType("", true)
|
||
|
|
local antAnimate = AnimateTexCoords(256, 256, 48, 48, 22, 0.01)
|
||
|
|
local usableColor = Color.WHITE
|
||
|
|
local unUsableColor = Color(0.4, 0.4, 0.4)
|
||
|
|
local RANGE_INDICATOR = "●"
|
||
|
|
local isInState = function(s) return s == "IN" end
|
||
|
|
local isOutState = function(s) return s == "OUT" end
|
||
|
|
local isPlaying = function(s) return s ~= "STOP" and antAnimate or nil end
|
||
|
|
local flyoutArrowLocation = { UP = { Anchor("BOTTOM", 0, 0, nil, "TOP") }, DOWN = { Anchor("TOP", 0, 0, nil, "BOTTOM") }, LEFT = { Anchor("RIGHT", 0, 0, nil, "LEFT") }, RIGHT = { Anchor("LEFT", 0, 0, nil, "RIGHT") } }
|
||
|
|
local replaceKey = {
|
||
|
|
['ALT'] = 'A',
|
||
|
|
['CTRL'] = 'C',
|
||
|
|
['SHIFT'] = 'S',
|
||
|
|
['NUMPAD'] = 'N',
|
||
|
|
['PLUS'] = '+',
|
||
|
|
['MINUS'] = '-',
|
||
|
|
['MULTIPLY'] = '*',
|
||
|
|
['DIVIDE'] = '/',
|
||
|
|
['BACKSPACE'] = 'BAK',
|
||
|
|
['BUTTON'] = 'B',
|
||
|
|
['CAPSLOCK'] = 'CAPS',
|
||
|
|
['CLEAR'] = 'CLR',
|
||
|
|
['DELETE'] = 'DEL',
|
||
|
|
['END'] = 'END',
|
||
|
|
['HOME'] = 'HME',
|
||
|
|
['INSERT'] = 'INS',
|
||
|
|
['MOUSEWHEELDOWN'] = 'WD',
|
||
|
|
['MOUSEWHEELUP'] = 'WU',
|
||
|
|
['NUMLOCK'] = 'NL',
|
||
|
|
['PAGEDOWN'] = 'PD',
|
||
|
|
['PAGEUP'] = 'PU',
|
||
|
|
['SCROLLLOCK'] = 'SL',
|
||
|
|
['SPACEBAR'] = 'SP',
|
||
|
|
['SPACE'] = 'SP',
|
||
|
|
['TAB'] = '↦',
|
||
|
|
['DOWNARROW'] = '↓',
|
||
|
|
['LEFTARROW'] = '←',
|
||
|
|
['RIGHTARROW'] = '→',
|
||
|
|
['UPARROW'] = '↑',
|
||
|
|
}
|
||
|
|
|
||
|
|
LE_ITEM_QUALITY_COMMON = _G.LE_ITEM_QUALITY_COMMON or Scorpio.IsRetail and _G.Enum.ItemQuality.Common or 1
|
||
|
|
NEW_ITEM_ATLAS_BY_QUALITY = Toolset.clone(NEW_ITEM_ATLAS_BY_QUALITY, true)
|
||
|
|
BAG_ITEM_QUALITY_COLORS = XDictionary(BAG_ITEM_QUALITY_COLORS):Map(function(k, v) return Color(v.r, v.g, v.b) end):ToTable()
|
||
|
|
DEFAULT_ITEM_ATLAS = "bags-glow-white"
|
||
|
|
|
||
|
|
Style.UpdateSkin("Default", {
|
||
|
|
[SpellActivationAlert] = {
|
||
|
|
frameStrata = "DIALOG",
|
||
|
|
|
||
|
|
Spark = {
|
||
|
|
drawLayer = "BACKGROUND",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlert]],
|
||
|
|
texCoords = RectType(0.00781250, 0.61718750, 0.00390625, 0.26953125),
|
||
|
|
setAllPoints = true,
|
||
|
|
alpha = 0,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Scale1 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
scale = Dimension(1.5, 1.5),
|
||
|
|
},
|
||
|
|
Alpha1 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
fromAlpha = 0,
|
||
|
|
toAlpha = 1,
|
||
|
|
},
|
||
|
|
Scale2 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
startDelay = 0.2,
|
||
|
|
scale = Dimension(0.666666, 0.666666),
|
||
|
|
},
|
||
|
|
Alpha2 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
startDelay = 0.2,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
InnerGlow = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlert]],
|
||
|
|
texCoords = RectType(0.00781250, 0.50781250, 0.27734375, 0.52734375),
|
||
|
|
setAllPoints = true,
|
||
|
|
alpha = 0,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Scale = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromScale = Dimension(0.5, 0.5),
|
||
|
|
toScale = Dimension(1, 1)
|
||
|
|
},
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
startDelay = 0.3,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
InnerGlowOver = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlert]],
|
||
|
|
texCoords = RectType(0.00781250, 0.50781250, 0.53515625, 0.78515625),
|
||
|
|
location = { Anchor("TOPLEFT", 0, 0, "InnerGlow"), Anchor("BOTTOMRIGHT", 0, 0, "InnerGlow") },
|
||
|
|
alpha = 0,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Scale = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromScale = Dimension(0.5, 0.5),
|
||
|
|
toScale = Dimension(1, 1)
|
||
|
|
},
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
OuterGlow = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlert]],
|
||
|
|
texCoords = RectType(0.00781250, 0.50781250, 0.27734375, 0.52734375),
|
||
|
|
setAllPoints = true,
|
||
|
|
alpha = 1,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Scale = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromScale = Dimension(2, 2),
|
||
|
|
toScale = Dimension(1, 1),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
Out = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isOutState),
|
||
|
|
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
startDelay = 0.2,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
OuterGlowOver = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlert]],
|
||
|
|
texCoords = RectType(0.00781250, 0.50781250, 0.53515625, 0.78515625),
|
||
|
|
location = { Anchor("TOPLEFT", 0, 0, "OuterGlow"), Anchor("BOTTOMRIGHT", 0, 0, "OuterGlow") },
|
||
|
|
alpha = 1,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Scale = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromScale = Dimension(2, 2),
|
||
|
|
toScale = Dimension(1, 1),
|
||
|
|
},
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.3,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
Out = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isOutState),
|
||
|
|
|
||
|
|
Alpha1 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
fromAlpha = 0,
|
||
|
|
toAlpha = 1,
|
||
|
|
},
|
||
|
|
Alpha2 = {
|
||
|
|
order = 2,
|
||
|
|
duration = 0.2,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
Ants = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
file = [[Interface\SpellActivationOverlay\IconAlertAnts]],
|
||
|
|
setAllPoints = true,
|
||
|
|
animateTexCoords = Wow.FromUIProperty("AinmationState"):Map(isPlaying),
|
||
|
|
alpha = 1,
|
||
|
|
|
||
|
|
In = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isInState),
|
||
|
|
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
startDelay = 0.2,
|
||
|
|
fromAlpha = 0,
|
||
|
|
toAlpha = 1,
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
Out = {
|
||
|
|
playing = Wow.FromUIProperty("AinmationState"):Map(isOutState),
|
||
|
|
|
||
|
|
Alpha = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.2,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
[SecureActionButton] = {
|
||
|
|
size = Size(36, 36),
|
||
|
|
alpha = Wow.FromUIProperty("GridVisible", "GridAlwaysShow"):Map(function(v, a) return (v or a) and 1 or 0 end),
|
||
|
|
|
||
|
|
NormalTexture = {
|
||
|
|
file = Wow.FromUIProperty("HasAction"):Map(function(v) return v and [[Interface\Buttons\UI-Quickslot2]] or [[Interface\Buttons\UI-Quickslot]] end),
|
||
|
|
location = { Anchor("TOPLEFT", -15, 15), Anchor("BOTTOMRIGHT", 15, -15) },
|
||
|
|
},
|
||
|
|
PushedTexture = {
|
||
|
|
file = [[Interface\Buttons\UI-Quickslot-Depress]],
|
||
|
|
setAllPoints = true,
|
||
|
|
},
|
||
|
|
HighlightTexture = {
|
||
|
|
file = [[Interface\Buttons\ButtonHilight-Square]],
|
||
|
|
setAllPoints = true,
|
||
|
|
alphaMode = "ADD",
|
||
|
|
},
|
||
|
|
CheckedTexture = {
|
||
|
|
file = [[Interface\Buttons\CheckButtonHilight]],
|
||
|
|
setAllPoints = true,
|
||
|
|
alphaMode = "ADD",
|
||
|
|
},
|
||
|
|
IconTexture = {
|
||
|
|
drawLayer = "BACKGROUND",
|
||
|
|
file = Wow.FromUIProperty("Icon"),
|
||
|
|
setAllPoints = true,
|
||
|
|
vertexColor = Wow.FromUIProperty("IsUsable"):Map(function(v) return v and usableColor or unUsableColor end),
|
||
|
|
desaturated = Wow.FromUIProperty("IconLocked"),
|
||
|
|
},
|
||
|
|
CountLabel = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
fontObject = NumberFontNormal,
|
||
|
|
subLevel = 2,
|
||
|
|
justifyH = "RIGHT",
|
||
|
|
location = { Anchor("BOTTOMRIGHT", -2, 2) },
|
||
|
|
text = Wow.FromUIProperty("Count"),
|
||
|
|
},
|
||
|
|
NameLabel = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
fontObject = GameFontHighlightSmallOutline,
|
||
|
|
justifyH = "CENTER",
|
||
|
|
height = 10,
|
||
|
|
location = { Anchor("BOTTOMLEFT", 0, 2), Anchor("BOTTOMRIGHT", 0, 2) },
|
||
|
|
text = Wow.FromUIProperty("Text"),
|
||
|
|
},
|
||
|
|
HotKeyLabel = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
subLevel = 2,
|
||
|
|
fontObject = NumberFontNormal,
|
||
|
|
justifyH = "RIGHT",
|
||
|
|
height = 10,
|
||
|
|
location = { Anchor("TOPLEFT", 1, -3), Anchor("TOPRIGHT", -1, -3) },
|
||
|
|
text = Wow.FromUIProperty("HotKey"):Map(function(val) return val and val:upper():gsub(' ', ''):gsub("%a+", replaceKey) or RANGE_INDICATOR end),
|
||
|
|
vertexColor = Wow.FromUIProperty("InRange"):Map(function(ir) return ir == false and Color.RED or Color.WHITE end),
|
||
|
|
visible = Wow.FromUIProperty("HotKey", "InRange"):Map(function(key, ir) return key or ir ~= nil end),
|
||
|
|
},
|
||
|
|
Cooldown = {
|
||
|
|
setAllPoints = true,
|
||
|
|
cooldown = Wow.FromUIProperty("Cooldown"),
|
||
|
|
},
|
||
|
|
|
||
|
|
-- For non-frequently used
|
||
|
|
SpellActivationAlert = Wow.FromUIProperty("OverlayGlow"),
|
||
|
|
EquippedItemTexture = Wow.FromUIProperty("IsEquippedItem"):Map(function(val) return val and EquippedItemTextureSkin or nil end),
|
||
|
|
FlashTexture = Wow.FromUIProperty("IsAutoAttack"):Map(function(val) return val and FlashTextureSkin or nil end),
|
||
|
|
FlyoutArrow = Wow.FromUIProperty("IsFlyout"):Map(function(val) return val and FlyoutArrowSkin or nil end),
|
||
|
|
FlyoutBorder = Wow.FromUIProperty("IsFlyout"):Map(function(val) return val and FlyoutBorderSkin or nil end),
|
||
|
|
FlyoutBorderShadow = Wow.FromUIProperty("IsFlyout"):Map(function(val) return val and FlyoutBorderShadowSkin or nil end),
|
||
|
|
AutoCastableTexture = Wow.FromUIProperty("IsAutoCastable"):Map(function(val) return val and AutoCastableTextureSkin or nil end),
|
||
|
|
AutoCastShine = Wow.FromUIProperty("IsAutoCastable"):Map(function(val) return val and AutoCastShineSkin or nil end),
|
||
|
|
SearchOverlay = Wow.FromUIProperty("ShowSearchOverlay"):Map(function(val) return val and SearchOverlaySkin or nil end),
|
||
|
|
},
|
||
|
|
|
||
|
|
[ContainerFrameItemButton] = {
|
||
|
|
alpha = 1,
|
||
|
|
|
||
|
|
SearchOverlay = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
setAllPoints = true,
|
||
|
|
color = Color(0, 0, 0, 0.8),
|
||
|
|
visible = Wow.FromUIProperty("ShowSearchOverlay"),
|
||
|
|
},
|
||
|
|
|
||
|
|
NormalTexture = {
|
||
|
|
file = [[Interface\Buttons\UI-Quickslot2]],
|
||
|
|
location = { Anchor("TOPLEFT", -15, 15), Anchor("BOTTOMRIGHT", 15, -15) },
|
||
|
|
},
|
||
|
|
|
||
|
|
UpgradeIcon = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 1,
|
||
|
|
atlas = AtlasType("bags-greenarrow", true),
|
||
|
|
location = { Anchor("TOPLEFT" ) },
|
||
|
|
visible = Wow.FromUIProperty("IsUpgradeItem"):Map(function(val) return val and true or false end),
|
||
|
|
},
|
||
|
|
|
||
|
|
IconQuestTexture = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
setAllPoints = true,
|
||
|
|
file = Wow.FromUIProperty("ItemQuestStatus"):Map(function(val) return val and TEXTURE_ITEM_QUEST_BORDER or TEXTURE_ITEM_QUEST_BANG end),
|
||
|
|
visible = Wow.FromUIProperty("ItemQuestStatus"):Map(function(val) return val ~= nil end),
|
||
|
|
},
|
||
|
|
|
||
|
|
JunkIcon = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 5,
|
||
|
|
atlas = AtlasType("bags-junkcoin", true),
|
||
|
|
location = { Anchor("TOPLEFT", 1, 0) },
|
||
|
|
visible = Wow.FromUIProperty("IsJunk"),
|
||
|
|
},
|
||
|
|
|
||
|
|
EquippedItemTexture = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
location = { Anchor("TOPLEFT", -2, 2), Anchor("BOTTOMRIGHT", 2, -2) },
|
||
|
|
file = Wow.FromUIProperty("IsArtifactRelicItem"):Map(function(val) return val and [[Interface\Artifacts\RelicIconFrame]] or [[Interface\Common\WhiteIconFrame]] end),
|
||
|
|
vertexColor = Wow.FromUIProperty("ItemQuality"):Map(function(val) return val and val >= LE_ITEM_QUALITY_COMMON and BAG_ITEM_QUALITY_COLORS[val] or Color.WHITE end),
|
||
|
|
visible = Wow.FromUIProperty("ItemQuality"):Map(function(val) return val and val >= LE_ITEM_QUALITY_COMMON and BAG_ITEM_QUALITY_COLORS[val] and true or false end),
|
||
|
|
},
|
||
|
|
|
||
|
|
BattlepayItemTexture = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
file = [[Interface\Store\store-item-highlight]],
|
||
|
|
location = { Anchor("CENTER") },
|
||
|
|
visible = Wow.FromUIProperty("IsNewItem", "IsBattlePayItem"):Map(function(new, pay) return new and pay end),
|
||
|
|
},
|
||
|
|
|
||
|
|
NewItemTexture = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
atlas = Wow.FromUIProperty("IsNewItem", "IsBattlePayItem", "ItemQuality"):Map(function(new, pay, quality) shareAtlas.atlas = quality and NEW_ITEM_ATLAS_BY_QUALITY[quality] or DEFAULT_ITEM_ATLAS return shareAtlas end),
|
||
|
|
alpha = 0,
|
||
|
|
alphaMode = "ADD",
|
||
|
|
location = { Anchor("CENTER") },
|
||
|
|
visible = Wow.FromUIProperty("IsNewItem", "IsBattlePayItem"):Map(function(new, pay) return new and not pay end),
|
||
|
|
|
||
|
|
AnimationGroup = {
|
||
|
|
playing = Wow.FromUIProperty("IsNewItem"),
|
||
|
|
toFinalAlpha = true,
|
||
|
|
looping = "REPEAT",
|
||
|
|
|
||
|
|
Alpha1 = {
|
||
|
|
smoothing = "NONE",
|
||
|
|
order = 1,
|
||
|
|
duration = 0.8,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0.4,
|
||
|
|
},
|
||
|
|
|
||
|
|
Alpha2 = {
|
||
|
|
smoothing = "NONE",
|
||
|
|
order = 2,
|
||
|
|
duration = 0.8,
|
||
|
|
fromAlpha = 0.4,
|
||
|
|
toAlpha = 1,
|
||
|
|
}
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
GlowFlashTexture = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
atlas = AtlasType("bags-glow-flash", true),
|
||
|
|
alpha = 0,
|
||
|
|
alphaMode = "ADD",
|
||
|
|
location = { Anchor("CENTER") },
|
||
|
|
|
||
|
|
AnimationGroup = {
|
||
|
|
toFinalAlpha = true,
|
||
|
|
playing = Wow.FromUIProperty("IsNewItem"),
|
||
|
|
|
||
|
|
Alpha = {
|
||
|
|
smoothing = "OUT",
|
||
|
|
duration = 0.6,
|
||
|
|
order = 1,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})
|
||
|
|
|
||
|
|
EquippedItemTextureSkin = {
|
||
|
|
file = [[Interface\Buttons\UI-ActionButton-Border]],
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
alphaMode = "ADD",
|
||
|
|
location = { Anchor("TOPLEFT", -8, 8), Anchor("BOTTOMRIGHT", 8, -8) },
|
||
|
|
vertexColor = Color(0, 1.0, 0, 0.7),
|
||
|
|
}
|
||
|
|
|
||
|
|
FlashTextureSkin = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
subLevel = 1,
|
||
|
|
file = [[Interface\Buttons\UI-QuickslotRed]],
|
||
|
|
setAllPoints = true,
|
||
|
|
alpha = 0,
|
||
|
|
|
||
|
|
AnimationGroup = {
|
||
|
|
playing = Wow.FromUIProperty("IsAutoAttacking"),
|
||
|
|
looping = "REPEAT",
|
||
|
|
|
||
|
|
Alpha1 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.01,
|
||
|
|
fromAlpha = 0,
|
||
|
|
toAlpha = 1,
|
||
|
|
},
|
||
|
|
Alpha2 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.01,
|
||
|
|
startDelay = 0.4,
|
||
|
|
fromAlpha = 1,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
Alpha3 = {
|
||
|
|
order = 1,
|
||
|
|
duration = 0.01,
|
||
|
|
startDelay = 0.8,
|
||
|
|
fromAlpha = 0,
|
||
|
|
toAlpha = 0,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
FlyoutArrowSkin = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
subLevel = 2,
|
||
|
|
file = [[Interface\Buttons\ActionBarFlyoutButton]],
|
||
|
|
texCoords = RectType(0.62500000, 0.98437500, 0.74218750, 0.82812500),
|
||
|
|
size = Size(23, 11),
|
||
|
|
location = Wow.FromUIProperty("FlyoutDirection"):Map(function(dir) return flyoutArrowLocation[dir or "TOP"] end),
|
||
|
|
rotateDegree = Wow.FromUIProperty("FlyoutDirection"):Next():Map(function(dir) return dir == "RIGHT" and 90 or dir == "DOWN" and 180 or dir == "LEFT" and 270 or 0 end),
|
||
|
|
}
|
||
|
|
|
||
|
|
FlyoutBorderSkin = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
subLevel = 1,
|
||
|
|
file = [[Interface\Buttons\ActionBarFlyoutButton]],
|
||
|
|
texCoords = RectType(0.01562500, 0.67187500, 0.39843750, 0.72656250),
|
||
|
|
location = { Anchor("TOPLEFT", -3, 3), Anchor("BOTTOMRIGHT", 3, -3) },
|
||
|
|
visible = Wow.FromUIProperty("Flyouting"),
|
||
|
|
}
|
||
|
|
|
||
|
|
FlyoutBorderShadowSkin = {
|
||
|
|
drawLayer = "ARTWORK",
|
||
|
|
subLevel = 1,
|
||
|
|
file = [[Interface\Buttons\ActionBarFlyoutButton]],
|
||
|
|
texCoords = RectType(0.01562500, 0.76562500, 0.00781250, 0.38281250),
|
||
|
|
location = { Anchor("TOPLEFT", -6, 6), Anchor("BOTTOMRIGHT", 6, -6) },
|
||
|
|
visible = Wow.FromUIProperty("Flyouting"),
|
||
|
|
}
|
||
|
|
|
||
|
|
AutoCastableTextureSkin = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
file = [[Interface\Buttons\UI-AutoCastableOverlay]],
|
||
|
|
location = { Anchor("TOPLEFT", -14, 14), Anchor("BOTTOMRIGHT", 14, -14) },
|
||
|
|
}
|
||
|
|
|
||
|
|
AutoCastShineSkin = {
|
||
|
|
location = { Anchor("TOPLEFT", 1, -1), Anchor("BOTTOMRIGHT", -1, 1) },
|
||
|
|
isAutoCast = Wow.FromUIProperty("IsAutoCasting"),
|
||
|
|
}
|
||
|
|
|
||
|
|
SearchOverlaySkin = {
|
||
|
|
drawLayer = "OVERLAY",
|
||
|
|
subLevel = 2,
|
||
|
|
setAllPoints = true,
|
||
|
|
color = Color(0, 0, 0, 0.8),
|
||
|
|
}
|