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.

899 lines
32 KiB

--- ============================ HEADER ============================
--- ======= LOCALIZE =======
-- Addon
local addonName, HR = ...;
-- HeroLib
local HL = HeroLib;
local Cache = HeroCache;
local Unit = HL.Unit;
local Player = Unit.Player;
local Target = Unit.Target;
local Spell = HL.Spell;
local Item = HL.Item;
-- Lua
local pairs = pairs;
local stringlower = string.lower;
local tostring = tostring;
-- File Locals
--- ============================ CONTENT ============================
--- ======= MAIN FRAME =======
HR.MainIconFrame = CreateFrame("Frame", "HeroRotation_MainIconFrame", UIParent);
HR.MainIconPartOverlayFrame = CreateFrame("Frame", "HeroRotation_MainIconPartOverlayFrame", UIParent);
HR.MainIconFrame.Part = {};
HR.MainIconFrame.CooldownFrame = CreateFrame("Cooldown", "HeroRotation_MainIconCooldownFrame", HR.MainIconFrame, "AR_CooldownFrameTemplate");
HR.SmallIconFrame = CreateFrame("Frame", "HeroRotation_SmallIconFrame", UIParent);
HR.LeftIconFrame = CreateFrame("Frame", "HeroRotation_LeftIconFrame", UIParent);
HR.NameplateIconFrame = CreateFrame("Frame", "HeroRotation_NameplateIconFrame", UIParent);
HR.NameplateSuggestedIconFrame = CreateFrame("Frame", "HeroRotation_NameplateSuggestedIconFrame", UIParent);
HR.SuggestedIconFrame = CreateFrame("Frame", "HeroRotation_SuggestedIconFrame", UIParent);
HR.RightSuggestedIconFrame = CreateFrame("Frame", "HeroRotation_RightSuggestedIconFrame", UIParent);
HR.ToggleIconFrame = CreateFrame("Frame", "HeroRotation_ToggleIconFrame", UIParent);
--- ======= MISC =======
-- Reset Textures
local IdleSpellTexture = HR.GetTexture(Spell(999900));
function HR.ResetIcons ()
-- Main Icon
HR.MainIconFrame:Hide();
if HR.GUISettings.General.BlackBorderIcon then HR.MainIconFrame.Backdrop:Hide(); end
HR.MainIconPartOverlayFrame:Hide();
HR.MainIconFrame:HideParts();
-- Small Icons
HR.SmallIconFrame:HideIcons();
HR.CastOffGCDOffset = 1;
-- Left/Nameplate Icons
HR.Nameplate.HideIcons();
HR.CastLeftOffset = 1;
-- Suggested Icon
HR.SuggestedIconFrame:HideIcon();
if HR.GUISettings.General.BlackBorderIcon then HR.SuggestedIconFrame.Backdrop:Hide(); end
HR.CastSuggestedOffset = 1;
-- Right Suggested Icon
HR.RightSuggestedIconFrame:HideIcon();
if HR.GUISettings.General.BlackBorderIcon then HR.RightSuggestedIconFrame.Backdrop:Hide(); end
HR.CastRightSuggestedOffset = 1;
-- Toggle icons
if HR.GUISettings.General.HideToggleIcons then HR.ToggleIconFrame:Hide(); end
if not HR.GUISettings.General.HideToggleIcons then HR.ToggleIconFrame:SetAlpha(HR.GUISettings.General.SetAlpha); end
end
-- Create a Backdrop
function HR:CreateBackdrop (Frame)
if Frame.Backdrop or not HR.GUISettings.General.BlackBorderIcon then return; end
local Backdrop = CreateFrame("Frame", nil, Frame, BackdropTemplateMixin and "BackdropTemplate");
Frame.Backdrop = Backdrop;
Backdrop:ClearAllPoints();
Backdrop:SetPoint("TOPLEFT", Frame, "TOPLEFT", -1, 1);
Backdrop:SetPoint("BOTTOMRIGHT", Frame, "BOTTOMRIGHT", 1, -1);
Backdrop:SetBackdrop({
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
tile = false,
tileSize = 0,
edgeSize = 1,
insets = { left = 0, right = 0, top = 0, bottom = 0 },
});
Backdrop:SetBackdropBorderColor(0, 0, 0);
Backdrop:SetBackdropColor(0, 0, 0, 1);
Backdrop:SetFrameStrata(HR.MainFrame:GetFrameStrata());
if Frame:GetFrameLevel() - 2 >= 0 then
Backdrop:SetFrameLevel(Frame:GetFrameLevel() - 2);
else
Backdrop:SetFrameLevel(0);
end
end
--- ======= MAIN ICON =======
-- Init
function HR.MainIconFrame:Init ()
-- Frame Init
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(64);
self:SetHeight(64);
self:SetPoint("BOTTOMRIGHT", HR.MainFrame, "BOTTOMRIGHT", 0, 0);
-- Texture
self.Texture = self:CreateTexture(nil, "ARTWORK");
self.Texture:SetAllPoints(self);
-- Cooldown
self.CooldownFrame:SetAllPoints(self);
-- Multi-Cast Parts Overlay
HR.MainIconPartOverlayFrame:SetFrameStrata(self:GetFrameStrata());
HR.MainIconPartOverlayFrame:SetFrameLevel(self:GetFrameLevel() + 1);
HR.MainIconPartOverlayFrame:SetWidth(64);
HR.MainIconPartOverlayFrame:SetHeight(64);
HR.MainIconPartOverlayFrame:SetPoint("Left", self, "Left", 0, 0);
HR.MainIconPartOverlayFrame.Texture = HR.MainIconPartOverlayFrame:CreateTexture(nil, "ARTWORK");
HR.MainIconPartOverlayFrame.Texture:SetAllPoints(HR.MainIconPartOverlayFrame);
-- Keybind
local KeybindFrame = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
self.Keybind = KeybindFrame;
KeybindFrame:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE");
KeybindFrame:SetAllPoints(true);
KeybindFrame:SetJustifyH("RIGHT");
KeybindFrame:SetJustifyV("TOP");
KeybindFrame:SetPoint("TOPRIGHT");
KeybindFrame:SetTextColor(0.8,0.8,0.8,1);
KeybindFrame:SetText("");
-- Overlay Text
local TextFrame = self:CreateFontString(nil, "OVERLAY", "GameFontNormal");
self.Text = TextFrame;
TextFrame:SetAllPoints(true);
TextFrame:SetJustifyH("CENTER");
TextFrame:SetJustifyV("CENTER");
TextFrame:SetPoint("CENTER");
TextFrame:SetTextColor(1,1,1,1);
TextFrame:SetText("");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
self.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(self);
end
-- Parts
self:InitParts();
-- Display
self:Show();
end
-- Change Icon
function HR.MainIconFrame:ChangeIcon (Texture, Keybind, Usable, OutofRange, ID)
self.ID = ID
-- Texture
self.Texture:SetTexture(Texture);
if HR.GUISettings.General.NotEnoughManaEnabled and not Usable then
self.Texture:SetVertexColor(0.5, 0.5, 1.0)
elseif OutofRange then
self.Texture:SetVertexColor(1.0, 0.5, 0.5)
else
self.Texture:SetVertexColor(1.0, 1.0, 1.0)
end
self.Texture:SetAllPoints(self);
-- Keybind
if Keybind then
self.Keybind:SetText(Keybind);
self.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey);
else
self.Keybind:SetText("");
end
-- Overlay Text
self.Text:SetText("");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon and not self.Backdrop:IsVisible() then
self.Backdrop:Show();
end
-- Alpha
self:SetAlpha(HR.GUISettings.General.SetAlpha);
-- Display
if not self:IsVisible() then
self:Show();
end
end
-- Set text on frame
function HR.MainIconFrame:OverlayText(Text, FontSize)
local Font = self.Text:GetFont()
if FontSize then
self.Text:SetFont(Font, FontSize)
else
self.Text:SetFont(Font, 12)
end
self.Text:SetText(Text);
end
-- Set a Cooldown Frame
function HR.MainIconFrame:SetCooldown (Start, Duration)
if Start == 0 or Duration == 0 then
self.CooldownFrame:SetCooldown(0, 0);
self.CooldownFrame:Hide();
return;
end
self.CooldownFrame:SetCooldown(Start, Duration);
end
function HR.MainIconFrame:InitParts ()
HR.MainIconPartOverlayFrame:Show();
for i = 1, HR.MaxQueuedCasts do
-- Frame Init
local PartFrame = CreateFrame("Frame", "HeroRotation_MainIconPartFrame"..tostring(i), UIParent);
self.Part[i] = PartFrame;
PartFrame:SetFrameStrata(self:GetFrameStrata());
PartFrame:SetFrameLevel(self:GetFrameLevel() + 1);
PartFrame:SetWidth(64);
PartFrame:SetHeight(64);
PartFrame:SetPoint("Left", self, "Left", 0, 0);
-- Texture
PartFrame.Texture = PartFrame:CreateTexture(nil, "BACKGROUND");
-- Keybind
PartFrame.Keybind = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
PartFrame.Keybind:SetFont("Fonts\\FRIZQT__.TTF", 13, "OUTLINE");
PartFrame.Keybind:SetAllPoints(true);
PartFrame.Keybind:SetJustifyH("RIGHT");
PartFrame.Keybind:SetJustifyV("TOP");
PartFrame.Keybind:SetPoint("TOPRIGHT");
PartFrame.Keybind:SetTextColor(0.8,0.8,0.8,1);
PartFrame.Keybind:SetText("");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
PartFrame.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(PartFrame);
end
-- Display
PartFrame:Show();
end
end
local QueuedCasts, FrameWidth;
function HR.MainIconFrame:SetupParts (Textures, Keybinds)
QueuedCasts = #Textures;
FrameWidth = HR.MainIconPartOverlayFrame.Texture:GetWidth() / QueuedCasts
local ULx, ULy, LLx, LLy, URx, URy, LRx, LRy = HR.MainIconPartOverlayFrame.Texture:GetTexCoord();
for i = 1, QueuedCasts do
local PartFrame = self.Part[i];
-- Size and Position
PartFrame:SetWidth(FrameWidth);
PartFrame:SetHeight(FrameWidth*QueuedCasts);
PartFrame:ClearAllPoints();
local _, AnchorPoint = HR.MainIconPartOverlayFrame.Texture:GetPoint();
if HR.MainIconPartOverlayFrame.__MSQ_NormalColor then
if i == HR.MaxQueuedCasts or i == QueuedCasts then
PartFrame:SetPoint("Center", AnchorPoint, "Center", FrameWidth/(4-QueuedCasts), 0);
else
PartFrame:SetPoint("Center", AnchorPoint, "Center", (FrameWidth/(4-QueuedCasts))*(i-2), 0);
end
else
PartFrame:SetPoint("Left", AnchorPoint, "Left", FrameWidth*(i-1), 0);
end
-- Texture and Backdrop
PartFrame.Texture:SetTexture(Textures[i]);
PartFrame.Texture:SetAllPoints(PartFrame);
if PartFrame.Backdrop then
if HR.MainIconPartOverlayFrame.__MSQ_NormalColor then
PartFrame.Backdrop:Hide();
else
PartFrame.Backdrop:Show();
end
end
local Blackborder = HR.GUISettings.General.BlackBorderIcon and not HR.MainIconPartOverlayFrame.__MSQ_NormalColor;
local leftxslice = ((i-1)/QueuedCasts);
local rightxslice = (i/QueuedCasts);
PartFrame.Texture:SetTexCoord(
i == 1 and (Blackborder and ULx + 0.08 or ULx) or (URx * leftxslice),
i == 1 and (Blackborder and ULy + 0.08 or ULy) or (Blackborder and URy + 0.08 or URy),
i == 1 and (Blackborder and LLx + 0.08 or LLx) or (LRx * leftxslice),
i == 1 and (Blackborder and LLy - 0.08 or LLy) or (Blackborder and LRy - 0.08 or LRy),
(i == QueuedCasts and Blackborder) and (URx * rightxslice) - 0.08 or URx * rightxslice,
Blackborder and URy + 0.08 or URy,
(i == QueuedCasts and Blackborder) and (LRx * rightxslice) - 0.08 or LRx * rightxslice,
Blackborder and LRy - 0.08 or LRy
);
-- Keybind
if Keybinds[i] then
PartFrame.Keybind:SetText(Keybinds[i]);
PartFrame.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey);
else
PartFrame.Keybind:SetText("");
end
-- Display
if not PartFrame:IsVisible() then
HR.MainIconPartOverlayFrame:Show();
PartFrame:Show();
end
end
end
function HR.MainIconFrame:HideParts ()
self.ID = nil
HR.MainIconPartOverlayFrame:Hide();
for i = 1, #self.Part do
self.Part[i].Keybind:SetText("");
self.Part[i]:Hide();
end
end
-- Get Icon spell ID
function HR.MainIconFrame:getIconID ()
if self.ID then
return self.ID
end
return nil
end
--- ======= SMALL ICONS =======
-- Init
function HR.SmallIconFrame:Init ()
-- Frame Container
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(64);
self:SetHeight(32);
self:SetPoint("BOTTOMLEFT", HR.MainIconFrame, "TOPLEFT", 0, HR.GUISettings.General.BlackBorderIcon and 1 or 0);
-- Frames
self.Icon = {};
self:CreateIcons(1, "LEFT");
self:CreateIcons(2, "RIGHT");
-- Display
self:Show();
end
-- Create Small Icons Frames
function HR.SmallIconFrame:CreateIcons (Index, Align)
-- Frame Init
local IconFrame = CreateFrame("Frame", "HeroRotation_SmallIconFrame"..tostring(Index), UIParent);
self.Icon[Index] = IconFrame;
IconFrame:SetFrameStrata(self:GetFrameStrata());
IconFrame:SetFrameLevel(self:GetFrameLevel() - 1);
IconFrame:SetWidth(HR.GUISettings.General.BlackBorderIcon and 30 or 32);
IconFrame:SetHeight(HR.GUISettings.General.BlackBorderIcon and 30 or 32);
IconFrame:SetPoint(Align, self, Align, 0, 0);
-- Texture
IconFrame.Texture = IconFrame:CreateTexture(nil, "ARTWORK");
-- Keybind
local Keybind = IconFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
IconFrame.Keybind = Keybind;
Keybind:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE");
Keybind:SetAllPoints(true);
Keybind:SetJustifyH("RIGHT");
Keybind:SetJustifyV("TOP");
Keybind:SetPoint("TOPRIGHT");
Keybind:SetTextColor(0.8,0.8,0.8,1);
Keybind:SetText("");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
IconFrame.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(IconFrame);
end
-- Display
IconFrame:Show();
end
-- Change Icon
function HR.SmallIconFrame:ChangeIcon (FrameID, Texture, Keybind, OutofRange)
local IconFrame = self.Icon[FrameID];
-- Texture
IconFrame.Texture:SetTexture(Texture);
IconFrame.Texture:SetAllPoints(IconFrame);
-- Out of Range
if OutofRange then
IconFrame.Texture:SetVertexColor(1.0, 0.5, 0.5)
else
IconFrame.Texture:SetVertexColor(1.0, 1.0, 1.0)
end
-- Keybind
if Keybind then
IconFrame.Keybind:SetText(Keybind);
IconFrame.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey * 0.85);
else
IconFrame.Keybind:SetText("");
end
-- Alpha
IconFrame:SetAlpha(HR.GUISettings.General.SetAlpha);
-- Display
if not IconFrame:IsVisible() then
IconFrame:Show();
end
end
-- Get Icon
function HR.SmallIconFrame:GetIcon (FrameID)
local IconFrame = self.Icon[FrameID];
if IconFrame and IconFrame:IsVisible() then
return IconFrame.Texture:GetTexture();
end
return nil;
end
-- Get Keybind
function HR.SmallIconFrame:GetKeybind (FrameID)
local IconFrame = self.Icon[FrameID];
if IconFrame and IconFrame:IsVisible() then
return IconFrame.Keybind:GetText();
end
return "";
end
-- Hide Small Icons
function HR.SmallIconFrame:HideIcons ()
for i = 1, #self.Icon do
self.Icon[i]:Hide();
end
end
--- ======= LEFT ICON =======
-- Init LeftIcon
function HR.LeftIconFrame:Init ()
-- Frame Init
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(48);
self:SetHeight(48);
self:SetPoint("RIGHT", HR.MainIconFrame, "LEFT", HR.GUISettings.General.BlackBorderIcon and -1 or 0, 0);
-- Texture
self.Texture = self:CreateTexture(nil, "BACKGROUND");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
self.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(self);
end
-- Keybind
local KeybindFrame = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
self.Keybind = KeybindFrame;
KeybindFrame:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE");
KeybindFrame:SetAllPoints(true);
KeybindFrame:SetJustifyH("RIGHT");
KeybindFrame:SetJustifyV("TOP");
KeybindFrame:SetPoint("TOPRIGHT");
KeybindFrame:SetTextColor(0.8,0.8,0.8,1);
KeybindFrame:SetText("");
-- Display
self:Show();
end
-- Change Icon
function HR.LeftIconFrame:ChangeIcon (Texture, Keybind)
-- Texture
self.Texture:SetTexture(Texture);
self.Texture:SetAllPoints(self);
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon and not self.Backdrop:IsVisible() then
self.Backdrop:Show();
end
-- Keybind
if Keybind then
self.Keybind:SetText(Keybind);
self.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey);
else
self.Keybind:SetText("");
end
-- Alpha
self:SetAlpha(HR.GUISettings.General.SetAlpha);
-- Display
if not self:IsVisible() then
self:Show();
end
end
--- ======= NAMEPLATES =======
HR.Nameplate = {
MainInitialized = false,
SuggestedInitialized = false
};
-- Add the Icon on Nameplates
function HR.Nameplate.AddIcon (ThisUnit, Object)
if HR.GUISettings.General.NamePlateIconAnchor == "Disable" then return true end
local Token = stringlower(ThisUnit.UnitID);
local Nameplate = C_NamePlate.GetNamePlateForUnit(Token);
if Nameplate then
-- Locals
local ScreenHeight = GetScreenHeight();
local NameplateScaler = (ScreenHeight > 768) and (768 / ScreenHeight) or 1;
local NameplateIconSize = Nameplate:GetHeight() / NameplateScaler;
local HealthBar;
if HR.GUISettings.General.NamePlateIconAnchor == "Life Bar" then
if _G.ElvUI and _G.ElvUI[1].charSettings.profile.nameplates.enable then
HealthBar = Nameplate.unitFrame.Health;
NameplateIconSize = HealthBar:GetWidth() / 3.5;
elseif _G.ShestakUI and _G.ShestakUI[2].nameplate.enable then
HealthBar = Nameplate.unitFrame.Health;
NameplateIconSize = (HealthBar:GetWidth() / NameplateScaler) / 3.5;
else
HealthBar = Nameplate.UnitFrame.healthBar;
NameplateIconSize = (HealthBar:GetWidth() / NameplateScaler) / 3.5;
end
end
local IconFrame = HR.NameplateIconFrame;
-- Init Frame if not already
if not HR.Nameplate.MainInitialized then
-- Frame
IconFrame:SetFrameStrata(Nameplate:GetFrameStrata());
IconFrame:SetFrameLevel(Nameplate:GetFrameLevel() + 50);
IconFrame:SetWidth(NameplateIconSize);
IconFrame:SetHeight(NameplateIconSize);
-- Texture
IconFrame.Texture = IconFrame:CreateTexture(nil, "BACKGROUND");
if HR.GUISettings.General.BlackBorderIcon then
IconFrame.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(IconFrame);
end
HR.Nameplate.MainInitialized = true;
end
-- Set the Texture
IconFrame.Texture:SetTexture(HR.GetTexture(Object));
IconFrame.Texture:SetAllPoints(IconFrame);
local SpellAlpha = 1;
IconFrame.Texture:SetAlpha(SpellAlpha);
IconFrame:ClearAllPoints();
IconFrame:SetAlpha(HR.GUISettings.General.SetAlpha);
if not IconFrame:IsVisible() then
if HR.GUISettings.General.NamePlateIconAnchor == "Life Bar" then
IconFrame:SetPoint("CENTER", HealthBar);
else
IconFrame:SetPoint("CENTER", Nameplate);
end
IconFrame:Show();
end
-- Register the Unit for Error Checks (see Not Facing Unit Blacklist in Events.lua)
HR.LastUnitCycled = ThisUnit;
HR.LastUnitCycledTime = GetTime();
return true;
end
return false;
end
function HR.Nameplate.AddSuggestedIcon (ThisUnit, Object)
if HR.GUISettings.General.NamePlateIconAnchor == "Disable" then return true end
local Token = stringlower(ThisUnit.UnitID);
local Nameplate = C_NamePlate.GetNamePlateForUnit(Token);
if Nameplate then
-- Locals
local ScreenHeight = GetScreenHeight();
local NameplateScaler = (ScreenHeight > 768) and (768 / ScreenHeight) or 1;
local NameplateIconSize = Nameplate:GetHeight() / NameplateScaler;
local HealthBar;
if HR.GUISettings.General.NamePlateIconAnchor == "Life Bar" then
if _G.ElvUI and _G.ElvUI[1].charSettings.profile.nameplates.enable then
HealthBar = Nameplate.unitFrame.Health;
NameplateIconSize = HealthBar:GetWidth() / 3.5;
elseif _G.ShestakUI and _G.ShestakUI[2].nameplate.enable then
HealthBar = Nameplate.unitFrame.Health;
NameplateIconSize = (HealthBar:GetWidth() / NameplateScaler) / 3.5;
else
HealthBar = Nameplate.UnitFrame.healthBar;
NameplateIconSize = (HealthBar:GetWidth() / NameplateScaler) / 3.5;
end
end
local SuggestedIconFrame = HR.NameplateSuggestedIconFrame;
-- Init Frame if not already
if not HR.Nameplate.SuggestedInitialized then
-- Frame
SuggestedIconFrame:SetFrameStrata(Nameplate:GetFrameStrata());
SuggestedIconFrame:SetFrameLevel(Nameplate:GetFrameLevel() + 50);
SuggestedIconFrame:SetWidth(NameplateIconSize);
SuggestedIconFrame:SetHeight(NameplateIconSize);
-- Texture
SuggestedIconFrame.Texture = SuggestedIconFrame:CreateTexture(nil, "BACKGROUND");
if HR.GUISettings.General.BlackBorderIcon then
SuggestedIconFrame.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(SuggestedIconFrame);
end
HR.Nameplate.SuggestedInitialized = true;
end
-- Set the Texture
SuggestedIconFrame.Texture:SetTexture(HR.GetTexture(Object));
SuggestedIconFrame.Texture:SetAllPoints(SuggestedIconFrame);
local SpellAlpha = 1;
SuggestedIconFrame.Texture:SetAlpha(SpellAlpha);
SuggestedIconFrame:ClearAllPoints();
SuggestedIconFrame:SetAlpha(HR.GUISettings.General.SetAlpha);
if not SuggestedIconFrame:IsVisible() then
if HR.GUISettings.General.NamePlateIconAnchor == "Life Bar" then
SuggestedIconFrame:SetPoint("RIGHT", HealthBar);
else
SuggestedIconFrame:SetPoint("RIGHT", Nameplate);
end
SuggestedIconFrame:Show();
end
-- Register the Unit for Error Checks (see Not Facing Unit Blacklist in Events.lua)
HR.LastUnitCycled = ThisUnit;
HR.LastUnitCycledTime = GetTime();
return true;
end
return false;
end
-- Remove Icons
function HR.Nameplate.HideIcons ()
-- Nameplate Icon
HR.NameplateIconFrame:Hide();
-- Left Icon
HR.LeftIconFrame:Hide();
-- Suggested
HR.NameplateSuggestedIconFrame:Hide();
end
--- ======= SUGGESTED ICON =======
-- Init
function HR.SuggestedIconFrame:Init ()
-- Frame Init
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(32);
self:SetHeight(32);
self:SetPoint("BOTTOM", HR.MainIconFrame, "LEFT", -HR.LeftIconFrame:GetWidth()/2, HR.LeftIconFrame:GetHeight()/2+(HR.GUISettings.General.BlackBorderIcon and 3 or 4));
-- Texture
self.Texture = self:CreateTexture(nil, "BACKGROUND");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
self.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(self);
end
-- Keybind
local KeybindFrame = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
self.Keybind = KeybindFrame;
KeybindFrame:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE");
KeybindFrame:SetAllPoints(true);
KeybindFrame:SetJustifyH("RIGHT");
KeybindFrame:SetJustifyV("TOP");
KeybindFrame:SetPoint("TOPRIGHT");
KeybindFrame:SetTextColor(0.8,0.8,0.8,1);
KeybindFrame:SetText("");
-- Display
self:Show();
end
-- Change Icon
function HR.SuggestedIconFrame:ChangeIcon (Texture, Keybind, OutofRange, ID)
self.ID = ID
-- Texture
self.Texture:SetTexture(Texture);
self.Texture:SetAllPoints(self);
-- Out of Range
if OutofRange then
self.Texture:SetVertexColor(1.0, 0.5, 0.5)
else
self.Texture:SetVertexColor(1.0, 1.0, 1.0)
end
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon and not self.Backdrop:IsVisible() then
self.Backdrop:Show();
end
-- Keybind
if Keybind then
self.Keybind:SetText(Keybind);
self.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey * 0.85);
else
self.Keybind:SetText("");
end
-- Alpha
self:SetAlpha(HR.GUISettings.General.SetAlpha);
-- Display
if not self:IsVisible() then
self:Show();
end
end
-- Hide Icon
function HR.SuggestedIconFrame:HideIcon ()
self.ID = nil
HR.SuggestedIconFrame:Hide();
end
-- Get Icon spell ID
function HR.SuggestedIconFrame:getIconID ()
if self.ID then
return self.ID
end
return nil
end
--- ======= RIGHT SUGGESTED ICON =======
-- Init
function HR.RightSuggestedIconFrame:Init ()
-- Frame Init
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(32);
self:SetHeight(32);
self:SetPoint("BOTTOM", HR.MainIconFrame, "LEFT", HR.LeftIconFrame:GetWidth()/2, HR.LeftIconFrame:GetHeight()/2+(HR.GUISettings.General.BlackBorderIcon and 3 or 4));
-- Texture
self.Texture = self:CreateTexture(nil, "BACKGROUND");
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon then
self.Texture:SetTexCoord(.08, .92, .08, .92);
HR:CreateBackdrop(self);
end
-- Keybind
local KeybindFrame = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
self.Keybind = KeybindFrame;
KeybindFrame:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE");
KeybindFrame:SetAllPoints(true);
KeybindFrame:SetJustifyH("RIGHT");
KeybindFrame:SetJustifyV("TOP");
KeybindFrame:SetPoint("TOPRIGHT");
KeybindFrame:SetTextColor(0.8,0.8,0.8,1);
KeybindFrame:SetText("");
-- Display
self:Show();
end
-- Change Icon
function HR.RightSuggestedIconFrame:ChangeIcon (Texture, Keybind, OutofRange, ID)
self.ID = ID
-- Texture
self.Texture:SetTexture(Texture);
self.Texture:SetAllPoints(self);
-- Out of Range
if OutofRange then
self.Texture:SetVertexColor(1.0, 0.5, 0.5)
else
self.Texture:SetVertexColor(1.0, 1.0, 1.0)
end
-- Black Border Icon
if HR.GUISettings.General.BlackBorderIcon and not self.Backdrop:IsVisible() then
self.Backdrop:Show();
end
-- Keybind
if Keybind then
self.Keybind:SetText(Keybind);
self.Keybind:SetScale(HR.GUISettings.Scaling.ScaleHotkey * 0.85);
else
self.Keybind:SetText("");
end
-- Alpha
self:SetAlpha(HR.GUISettings.General.SetAlpha);
-- Display
if not self:IsVisible() then
self:Show();
end
end
-- Hide Icon
function HR.RightSuggestedIconFrame:HideIcon ()
self.ID = nil
HR.RightSuggestedIconFrame:Hide();
end
-- Get Icon spell ID
function HR.RightSuggestedIconFrame:getIconID ()
if self.ID then
return self.ID
end
return nil
end
--- ======= TOGGLES =======
-- Init
function HR.ToggleIconFrame:Init ()
-- Frame Init
self:SetFrameStrata(HR.MainFrame:GetFrameStrata());
self:SetFrameLevel(HR.MainFrame:GetFrameLevel() - 1);
self:SetWidth(64);
self:SetHeight(20);
-- Reset the Anchor if saved data are not valid (i.e. data saved before 7.1.5843)
-- TODO: Remove this part later.
if HeroRotationDB and HeroRotationDB.ButtonsFramePos and type(HeroRotationDB.ButtonsFramePos[2]) ~= "string" then
self:ResetAnchor();
end
-- Anchor based on Settings
if HeroRotationDB and HeroRotationDB.ButtonsFramePos then
self:SetPoint(HeroRotationDB.ButtonsFramePos[1], _G[HeroRotationDB.ButtonsFramePos[2]], HeroRotationDB.ButtonsFramePos[3], HeroRotationDB.ButtonsFramePos[4], HeroRotationDB.ButtonsFramePos[5]);
else
self:SetPoint("TOPLEFT", HR.MainIconFrame, "BOTTOMLEFT", 0, HR.GUISettings.General.BlackBorderIcon and -3 or 0);
end
-- Start Move
local function StartMove (self)
self:StartMoving();
end
self:SetScript("OnMouseDown", StartMove);
-- Stop Move
local function StopMove (self)
self:StopMovingOrSizing();
if not HeroRotationDB then HeroRotationDB = {}; end
local point, relativeTo, relativePoint, xOffset, yOffset, relativeToName;
point, relativeTo, relativePoint, xOffset, yOffset = self:GetPoint();
if not relativeTo then
relativeToName = "UIParent";
else
relativeToName = relativeTo:GetName();
end
HeroRotationDB.ButtonsFramePos = {
point,
relativeToName,
relativePoint,
xOffset,
yOffset
};
end
self:SetScript("OnMouseUp", StopMove);
self:SetScript("OnHide", StopMove);
self:Show();
-- Button Creation
self.Button = {};
self:AddButton("C", 1, "CDs", "cds");
self:AddButton("A", 2, "AoE", "aoe");
self:AddButton("O", 3, "On/Off", "toggle");
end
-- Reset Anchor
function HR.ToggleIconFrame:ResetAnchor ()
self:SetPoint("TOPLEFT", HR.MainIconFrame, "BOTTOMLEFT", 0, HR.GUISettings.General.BlackBorderIcon and -3 or 0);
HeroRotationDB.ButtonsFramePos = false;
end
-- Add a button
function HR.ToggleIconFrame:AddButton (Text, i, Tooltip, CmdArg)
local ButtonFrame = CreateFrame("Button", "$parentButton"..tostring(i), self);
ButtonFrame:SetFrameStrata(self:GetFrameStrata());
ButtonFrame:SetFrameLevel(self:GetFrameLevel() - 1);
ButtonFrame:SetWidth(20);
ButtonFrame:SetHeight(20);
ButtonFrame:SetPoint("LEFT", self, "LEFT", 20*(i-1)+i, 0);
-- Button Tooltip (Optional)
if Tooltip then
ButtonFrame:SetScript("OnEnter",
function ()
Mixin(GameTooltip, BackdropTemplateMixin);
GameTooltip:SetOwner(HR.ToggleIconFrame, "ANCHOR_BOTTOM", 0, 0);
GameTooltip:ClearLines();
GameTooltip:SetBackdropColor(0, 0, 0, 1);
GameTooltip:SetText(Tooltip, nil, nil, nil, 1, true);
GameTooltip:Show();
end
);
ButtonFrame:SetScript("OnLeave",
function ()
GameTooltip:Hide();
end
);
end
-- Button Text
ButtonFrame:SetNormalFontObject("GameFontNormalSmall");
ButtonFrame.text = Text;
-- Button Texture
local NormalTexture = ButtonFrame:CreateTexture();
NormalTexture:SetTexture("Interface/Buttons/UI-Silver-Button-Up");
NormalTexture:SetTexCoord(0, 0.625, 0, 0.7875);
NormalTexture:SetAllPoints();
ButtonFrame:SetNormalTexture(NormalTexture);
local HighlightTexture = ButtonFrame:CreateTexture();
HighlightTexture:SetTexture("Interface/Buttons/UI-Silver-Button-Highlight");
HighlightTexture:SetTexCoord(0, 0.625, 0, 0.7875);
HighlightTexture:SetAllPoints();
ButtonFrame:SetHighlightTexture(HighlightTexture);
local PushedTexture = ButtonFrame:CreateTexture();
PushedTexture:SetTexture("Interface/Buttons/UI-Silver-Button-Down");
PushedTexture:SetTexCoord(0, 0.625, 0, 0.7875);
PushedTexture:SetAllPoints();
ButtonFrame:SetPushedTexture(PushedTexture);
-- Button Setting
if type(HeroRotationCharDB) ~= "table" then
HeroRotationCharDB = {};
end
if type(HeroRotationCharDB.Toggles) ~= "table" then
HeroRotationCharDB.Toggles = {};
end
if type(HeroRotationCharDB.Toggles[i]) ~= "boolean" then
HeroRotationCharDB.Toggles[i] = true;
end
-- OnClick Callback
ButtonFrame:SetScript("OnMouseDown",
function (self, Button)
if Button == "LeftButton" then
HR.CmdHandler(CmdArg);
end
end
);
self.Button[i] = ButtonFrame;
HR.ToggleIconFrame:UpdateButtonText(i);
ButtonFrame:Show();
end
-- Update a button text
function HR.ToggleIconFrame:UpdateButtonText (i)
if HeroRotationCharDB.Toggles[i] then
self.Button[i]:SetFormattedText("|cff00ff00%s|r", self.Button[i].text);
else
self.Button[i]:SetFormattedText("|cffff0000%s|r", self.Button[i].text);
end
end