2c338f0b3039bc07b8ec0ddde610ac9807e5869a
[wowui.git] / OmaUF / UnitFrames.lua
1 -- RaidFrame.lua
2 local _;
3 local unpack, pairs = unpack, pairs;
4 local format = string.format;
5 local UnitHealthMax, UnitPowerMax = UnitHealthMax, UnitPowerMax;
6 local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch;
7 local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
8 local GameTooltip = nil;
9 local GameTooltip_SetDefaultAnchor = nil;
10
11 local registerEvents = OmaUFEvents.RegisterEvents;
12 local unitEvent = OmaUFEvents.UnitEvent;
13 local createAuraFrame = OmaUFAuras.CreateAuraFrame;
14
15 local Settings = OmaUFSettings;
16 local indSize = Settings.IndSize;
17 local baseColor = Settings.BaseColor;
18 local bgColor = Settings.BgColor;
19 local healthColor = Settings.HealthColor;
20 local shieldColor = Settings.ShieldColor;
21 local shieldhlColor = Settings.ShieldhlColor;
22 local healpredColor = Settings.HealpredColor;
23 local healabsorbColor = Settings.HealabsorbColor;
24 local width, height = Settings.Width, Settings.Height;
25 -- placeholders with visible values when error happens
26 local anchorX, anchorY = 10, 10;
27 local attributes = {};
28
29 local UnitFrames = CreateFrame("Frame", "OmaUnitFrames");
30 local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate";
31
32 local events = {
33     ["player"] = {
34         "UNIT_ENTERED_VEHICLE",
35         "UNIT_EXITED_VEHICLE",
36         "UNIT_PET",
37         "PLAYER_ROLES_ASSIGNED",
38         "PLAYER_ENTERING_WORLD",
39         "PLAYER_LEVEL_UP",
40         "PLAYER_REGEN_DISABLED",
41         "PLAYER_REGEN_ENABLED",
42         "PLAYER_UPDATE_RESTING",
43     },
44     ["target"] = {
45         "UNIT_ENTERED_VEHICLE",
46         "UNIT_EXITED_VEHICLE",
47         "UNIT_PET",
48         "UNIT_LEVEL",
49         "GROUP_ROSTER_UPDATE",
50         "PLAYER_ROLES_ASSIGNED",
51         "PLAYER_ENTERING_WORLD",
52         "PLAYER_TARGET_CHANGED",
53     },
54     ["pet"] = {
55         "UNIT_ENTERED_VEHICLE",
56         "UNIT_EXITED_VEHICLE",
57         "UNIT_PET",
58         "PLAYER_ENTERING_WORLD",
59         "PLAYER_LEVEL_UP",
60         "PLAYER_REGEN_DISABLED",
61         "PLAYER_REGEN_ENABLED",
62     },
63 };
64
65 local M = {};
66 OmaUnitFrames = M;
67
68 local function frameShow(frame)
69     for _, ev in pairs(events[frame.unit]) do
70         frame:RegisterEvent(ev);
71     end
72     registerEvents(frame);
73     unitEvent(frame, "UPDATE_ALL_BARS");
74 end
75
76 local function frameHide(frame)
77     frame:UnregisterAllEvents();
78 end
79
80 local function showTooltip(secure)
81     GameTooltip_SetDefaultAnchor(GameTooltip, secure);
82     GameTooltip:SetUnit(secure:GetAttribute("unit"));
83 end
84
85 local function hideTooltip(secure)
86     GameTooltip:FadeOut();
87 end
88
89 local function setupFrame(frame, secure, unit, width, height)
90     secure:SetAttribute("unit", unit);
91     frame:SetAttribute("unit", unit);
92     frame.unit = unit;
93     frame.displayed = unit;
94     -- hide frame to get initial frameShow call
95     frame:Hide();
96     if unit == "player" then
97         frame.vehicle = "vehicle";
98     else
99         frame.vehicle = unit.."pet";
100     end
101     -- create visuals
102     secure:SetWidth(width+2);
103     secure:SetHeight(height+2);
104     frame:SetWidth(width+2);
105     frame:SetHeight(height+2);
106     frame.width = width;
107     frame.base = frame:CreateTexture(nil, "BACKGROUND");
108     frame.base:SetAllPoints();
109     frame.base:SetColorTexture(1, 1, 1);
110     frame.base:SetVertexColor(unpack(baseColor));
111     frame.healthback = frame:CreateTexture(nil, "BACKGROUND", nil, 1);
112     frame.healthback:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1);
113     frame.healthback:SetPoint("BOTTOMRIGHT", frame, "RIGHT", -1, -5);
114     frame.healthback:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
115     frame.healthback:SetVertexColor(unpack(bgColor));
116     frame.health = frame:CreateTexture(nil, "BORDER");
117     frame.health:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
118     frame.health:SetPoint("TOPLEFT", frame.healthback, "TOPLEFT");
119     frame.health:SetPoint("BOTTOMLEFT", frame.healthback, "BOTTOMLEFT");
120     frame.health:SetVertexColor(unpack(healthColor));
121     frame.health:SetWidth(width);
122     frame.health.max = UnitHealthMax(unit);
123     frame.healthText = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlightLarge");
124     frame.healthText:SetPoint("RIGHT", frame.healthback, "RIGHT", -2, 0);
125     frame.healthText:Hide();
126     frame.manaback = frame:CreateTexture(nil, "BACKGROUND", nil, 1);
127     frame.manaback:SetPoint("TOPLEFT", frame, "LEFT", 1, -5);
128     frame.manaback:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1);
129     frame.manaback:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
130     frame.manaback:SetVertexColor(unpack(bgColor));
131     frame.mana = frame:CreateTexture(nil, "BORDER");
132     frame.mana:SetPoint("TOPLEFT", frame.manaback, "TOPLEFT");
133     frame.mana:SetPoint("BOTTOMLEFT", frame.manaback, "BOTTOMLEFT");
134     frame.mana:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
135     frame.mana:SetWidth(width);
136     frame.mana.max = UnitPowerMax(unit);
137     frame.manaText = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight");
138     frame.manaText:SetPoint("RIGHT", frame.manaback, "RIGHT", -2, 0);
139     frame.manaText:Hide();
140     frame.shield = frame:CreateTexture(nil, "BORDER");
141     frame.shield:SetPoint("TOPLEFT", frame.health, "TOPRIGHT");
142     frame.shield:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT");
143     frame.shield:SetTexture("Interface\\RaidFrame\\Shield-Fill");
144     frame.shield:SetVertexColor(unpack(shieldColor));
145     frame.shield:Hide();
146     frame.shieldhl = frame:CreateTexture(nil, "ARTWORK");
147     frame.shieldhl:SetPoint("TOPLEFT", frame.healthback, "TOPRIGHT", -1, 0);
148     frame.shieldhl:SetPoint("BOTTOMRIGHT", frame.healthback, "BOTTOMRIGHT", 1, 0);
149     frame.shieldhl:SetColorTexture(unpack(shieldhlColor));
150     frame.shieldhl:Hide();
151     frame.healpred = frame:CreateTexture(nil, "ARTWORK");
152     frame.healpred:SetPoint("TOPLEFT", frame.health, "TOPRIGHT");
153     frame.healpred:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT");
154     frame.healpred:SetColorTexture(unpack(healpredColor));
155     frame.healpred:Hide();
156     frame.healabsorb = frame:CreateTexture(nil, "ARTWORK");
157     frame.healabsorb:SetPoint("TOPRIGHT", frame.health, "TOPRIGHT");
158     frame.healabsorb:SetPoint("BOTTOMRIGHT", frame.health, "BOTTOMRIGHT");
159     frame.healabsorb:SetColorTexture(unpack(healabsorbColor));
160     frame.healabsorb:Hide();
161     frame.role = frame:CreateTexture(nil, "OVERLAY");
162     frame.role:SetPoint("TOPLEFT", frame.healthback, "TOPRIGHT", -8, 8);
163     frame.role:SetPoint("BOTTOMRIGHT", frame.healthback, "TOPRIGHT", 8, -8);
164     frame.role:SetTexture("Interface\\LFGFRAME\\UI-LFG-ICON-PORTRAITROLES");
165     frame.role:Hide();
166     frame.status = frame:CreateTexture(nil, "OVERLAY");
167     frame.status:SetPoint("TOPLEFT", frame.manaback, "BOTTOMLEFT", -8, 8);
168     frame.status:SetPoint("BOTTOMRIGHT", frame.manaback, "BOTTOMLEFT", 8, -8);
169     frame.status:SetTexture("Interface\\CHARACTERFRAME\\UI-StateIcon");
170     frame.status:Hide();
171     frame.pvp = frame:CreateTexture(nil, "OVERLAY");
172     frame.pvp:SetPoint("TOPLEFT", frame.manaback, "BOTTOMLEFT", 8, 6);
173     frame.pvp:SetPoint("BOTTOMRIGHT", frame.manaback, "BOTTOMLEFT", 32, -18);
174     frame.pvp:SetTexture("Interface\\TARGETINGFRAME\\UI-PVP-Horde");
175     frame.pvp:Hide();
176     frame.leader = frame:CreateTexture(nil, "OVERLAY");
177     frame.leader:SetPoint("TOPLEFT", frame.healthback, "TOPLEFT", -6, 6);
178     frame.leader:SetPoint("BOTTOMRIGHT", frame.healthback, "TOPLEFT", 6, -6);
179     frame.leader:Hide();
180     if unit ~= "pet" then
181         frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge");
182         frame.name:SetPoint("LEFT", frame.healthback, "LEFT", 2, 1);
183         frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
184         frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
185     end
186     -- set scripts
187     frame:SetScript("OnShow", frameShow);
188     frame:SetScript("OnHide", frameHide);
189     frame:SetScript("OnEvent", unitEvent);
190     secure:SetScript("OnEnter", showTooltip);
191     secure:SetScript("OnLeave", hideTooltip);
192     -- set attributes
193     secure:RegisterForClicks("AnyDown");
194     for attr, val in pairs(attributes) do
195         secure:SetAttribute(attr, val);
196     end
197     -- rest give target and menu
198     secure:SetAttribute("*type1", "target");
199     secure:SetAttribute("*type2", "togglemenu");
200 end
201
202 -- vehicle toggle from Shadowed Unit Frames
203 local vehicletoggle = [=[
204     local unit = self:GetAttribute("unit");
205     if unit and newstate == "vehicle" and not UnitTargetsVehicleInRaidUI(unit) then
206         self:SetAttribute("toggleForVehicle", false);
207     else
208         self:SetAttribute("toggleForVehicle", true);
209     end
210 ]=]
211
212 local function initializePlayer(parent)
213     local secure = CreateFrame("Button", "OmaPlayerSecure", parent, inheritedFrames);
214     local frame = CreateFrame("Frame", "OmaPlayer", parent);
215     local unit = "player";
216     secure:SetPoint("CENTER", parent, "CENTER", -300, -175);
217     frame:SetPoint("CENTER", parent, "CENTER", -300, -175);
218     setupFrame(frame, secure, unit, width, height);
219     RegisterUnitWatch(frame);
220     RegisterUnitWatch(secure);
221     --RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
222     --secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
223 end
224
225 local function initializePet(parent)
226     local secure = CreateFrame("Button", "OmaPetSecure", parent, inheritedFrames);
227     local frame = CreateFrame("Frame", "OmaPet", parent);
228     local unit = "pet";
229     secure:SetPoint("TOPRIGHT", parent, "TOPLEFT", -10, 0);
230     frame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -10, 0);
231     setupFrame(frame, secure, unit, width/2, height/2);
232     RegisterUnitWatch(frame);
233     RegisterUnitWatch(secure);
234 end
235
236 local function initializeTarget(parent)
237     local secure = CreateFrame("Button", "OmaTargetSecure", parent, inheritedFrames);
238     local frame = CreateFrame("Frame", "OmaTarget", parent);
239     local unit = "target";
240     secure:SetPoint("CENTER", parent, "CENTER", 300, -175);
241     frame:SetPoint("CENTER", parent, "CENTER", 300, -175);
242     setupFrame(frame, secure, unit, width, height);
243     createAuraFrame(frame, unit);
244     RegisterUnitWatch(frame);
245     RegisterUnitWatch(secure);
246 end
247
248 local function loadCharSettings()
249     anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY;
250     attributes = Settings.Character.Clickheal;
251 end
252
253 local function initialize()
254     loadCharSettings();
255     -- let other addons hook these to anchor tooltip elsewhere
256     GameTooltip = _G["GameTooltip"];
257     GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
258     initializePlayer(UIParent);
259     initializePet(_G["OmaPlayer"]);
260     initializeTarget(UIParent);
261     -- TODO boss frames, pet frame, (arena frames)
262 end
263
264 local hidden = false;
265 local function hideBlizzardFrames()
266     if hidden then return end
267     hidden = true;
268
269     for _, frame in pairs({PlayerFrame, TargetFrame, TargetFrameToT, PetFrame}) do
270         frame:UnregisterAllEvents();
271         frame.healthbar:UnregisterAllEvents();
272         frame.manabar:UnregisterAllEvents();
273         if frame.spellbar then frame.spellbar:UnregisterAllEvents() end
274         if frame.powerBarAlt then frame.powerBarAlt:UnregisterAllEvents() end
275         frame:Hide();
276     end
277
278     -- TODO create frames for class powers, currently using Simple Holy Power
279     for _, frame in pairs({PlayerFrameAlternateManaBar, ComboFrame,
280             PriestBarFrame, RuneFrame, WarlockPowerFrame, MonkHarmonyBarFrame,
281             PaladinPowerBarFrame, MageArcaneChargesFrame}) do
282         frame:UnregisterAllEvents();
283         frame:Hide();
284     end
285
286     -- from ShadowedUF, re-register vehicle events for default auras
287     PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
288     PlayerFrame:RegisterEvent("UNIT_ENTERING_VEHICLE");
289     PlayerFrame:RegisterEvent("UNIT_ENTERED_VEHICLE");
290     PlayerFrame:RegisterEvent("UNIT_EXITING_VEHICLE");
291     PlayerFrame:RegisterEvent("UNIT_EXITED_VEHICLE");
292     PlayerFrame:SetMovable(true);
293     PlayerFrame:SetUserPlaced(true);
294     PlayerFrame:SetDontSavePosition(true);
295 end
296
297 UnitFrames:RegisterEvent("PLAYER_LOGIN");
298 UnitFrames:SetScript("OnEvent", function(self, event)
299     if event == "PLAYER_LOGIN" then
300         OmaUFLoadChar();
301         hideBlizzardFrames();
302         initialize();
303     end
304 end);