From 39f0ac463fc7f5a4e65a3f5c4b9abc985bef10e7 Mon Sep 17 00:00:00 2001 From: James Whitehead II Date: Thu, 24 Jan 2008 07:32:22 +0000 Subject: [PATCH] * Adding PerfectRaid_Highlight.lua --- PerfectRaid_Highlight.lua | 246 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 PerfectRaid_Highlight.lua diff --git a/PerfectRaid_Highlight.lua b/PerfectRaid_Highlight.lua new file mode 100644 index 0000000..68127f7 --- /dev/null +++ b/PerfectRaid_Highlight.lua @@ -0,0 +1,246 @@ +--[[------------------------------------------------------------------------- + Copyright (c) 2008, Jim Whitehead II + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of PerfectRaid nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---------------------------------------------------------------------------]] + +local Highlight = PerfectRaid:NewModule("PerfectRaid-Highlight") +local L = PerfectRaidLocals +local utils, frames + +-- Initialization functions +function Highlight:Initialize() + PerfectRaid.defaults.profile.buffs = {} + + frames = PerfectRaid.frames + utils = PerfectRaid.utils + self:RegisterMessage("DONGLE_PROFILE_CREATED") + self:RegisterMessage("PERFECTRAID_TAB_CHANGED") +end + +function Highlight:Enable() + self:RegisterMessage("PERFECTRAID_DEBUFFTYPE_GAINED") + self:RegisterMessage("PERFECTRAID_DEBUFFTYPE_LOST") +end + +-- Create the backdrop, and the OnEnter/OnLeave scripts +local backdrop = { + bgFile = "Interface\\AddOns\\PerfectRaid\\images\\bgFile", + tile = true, tileSize = 32, + insets = { + left = 6, + right = 6, + }, +} + +local function OnEnter(frame) + local opt = PerfectRaid.db.profile.highlight + if opt.tooltip then + if frame.unit then + GameTooltip:SetOwner(frame, "ANCHOR_BOTTOMRIGHT") + GameTooltip:SetUnit(frame.unit) + end + end + + if opt.mouseover then + frame:SetBackdropColor(0.9, 0.9, 0.9, 0.3) + end +end + +local function OnLeave(frame) + GameTooltip:Hide() + Highlight:UpdateUnit(nil, frame) +end + +function Highlight:UpdateButtonLayout(button, options) + button:SetBackdrop(backdrop) + button:SetBackdropColor(0,0,0,0) + + button:SetScript("OnEnter", OnEnter) + button:SetScript("OnLeave", OnLeave) +end + +-- Handle the buff events as they come across, and keep track of who has what buffs. +local BIT_CURSE = 1 +local BIT_MAGIC = 2 +local BIT_POISON = 4 +local BIT_DISEASE = 8 + +local status = setmetatable({}, {__index=function(t,k) rawset(t, k, 0); return 0 end}) + +function Highlight:PERFECTRAID_DEBUFFTYPE_GAINED(msg, unit, type) + if type == "Disease" then + status[unit] = status[unit] + BIT_DISEASE + elseif type == "Poison" then + status[unit] = status[unit] + BIT_POISON + elseif type == "Magic" then + status[unit] = status[unit] + BIT_MAGIC + elseif type == "Curse" then + status[unit] = status[unit] + BIT_CURSE + end +end + +function Highlight:PERFECTRAID_DEBUFFTYPE_LOST(msg, unit, type) + if type == "Disease" then + status[unit] = status[unit] - BIT_DISEASE + elseif type == "Poison" then + status[unit] = status[unit] - BIT_POISON + elseif type == "Magic" then + status[unit] = status[unit] - BIT_MAGIC + elseif type == "Curse" then + status[unit] = status[unit] - BIT_CURSE + end + + if status[unit] < 0 then + status[unit] = 0 + end +end + +function Highlight:UpdateUnit(unit, frame) + -- Check to see if we need to change the backdrop + local opt = PerfectRaid.db.profile.highlight + + local r,g,b,a + local statnum = status[unit] + + if opt.disease and statnum > BIT_DISEASE then + r,g,b,a = 0.6,0.4,0,0.7 + elseif opt.poison and statnum > BIT_POISON then + r,g,b,a = 0,0.6,0,0.7 + elseif opt.magic and statnum > BIT_MAGIC then + r,g,b,a = 0.2,0.6,1,0.7 + elseif opt.curse and statnum > BIT_CURSE then + r,g,b,a = 0.6,0,1,0.7 + else + r,g,b,a = 0,0,0,0 + end + + if frame then + frame:SetBackdropColor(r,g,b,a) + else + for frame in pairs(frames[unit]) do + frame:SetBackdropColor(r,g,b,a) + end + end +end + +local options +function Highlight:CreateOptions(opt) + local Buffs = PerfectRaid:HasModule("PerfectRaid-Buffs") + + options = CreateFrame("Frame", "PROptions_Highlight", PROptions) + + opt:AddOptionsTab("Highlight", options) + + options.widgets = {} + + local check = CreateFrame("CheckButton", "PRHighlight_Mouseover", options, "PRCheckTemplate") + check.Label:SetText(L["Highlight on mouseover"]) + table.insert(options.widgets, check) + + local check = CreateFrame("CheckButton", "PRHighlight_Tooltip", options, "PRCheckTemplate") + check.Label:SetText(L["Show unit tooltip on mouseover"]) + table.insert(options.widgets, check) + + local check = CreateFrame("CheckButton", "PRHighlight_Disease", options, "PRCheckTemplate") + check.Label:SetText(L["Highlight when diseased"]) + table.insert(options.widgets, check) + + local check = CreateFrame("CheckButton", "PRHighlight_Curse", options, "PRCheckTemplate") + check.Label:SetText(L["Highlight when cursed"]) + table.insert(options.widgets, check) + + local check = CreateFrame("CheckButton", "PRHighlight_Magic", options, "PRCheckTemplate") + check.Label:SetText(L["Highlight when magic debuffed"]) + table.insert(options.widgets, check) + + local check = CreateFrame("CheckButton", "PRHighlight_Poison", options, "PRCheckTemplate") + check.Label:SetText(L["Highlight when poisoned"]) + table.insert(options.widgets, check) + + local cancel = CreateFrame("Button", "PRHighlight_Cancel", options, "PRButtonTemplate") + cancel:SetText(L["Cancel"]) + cancel:SetPoint("BOTTOMRIGHT", 0, 5) + cancel:SetScript("OnClick", function() options:CancelOptions() end) + cancel:Show() + + local save = CreateFrame("Button", "PRHighlight_Save", options, "PRButtonTemplate") + save:SetText(L["Save"]) + save:SetPoint("BOTTOMRIGHT", cancel, "BOTTOMLEFT", -10, 0) + save:SetScript("OnClick", function() options:SaveOptions() end) + save:Show() + + function options:SaveOptions() + local mouseover = PRHighlight_Mouseover:GetChecked() and true or false + local tooltip = PRHighlight_Tooltip:GetChecked() and true or false + local disease = PRHighlight_Disease:GetChecked() and true or false + local curse = PRHighlight_Curse:GetChecked() and true or false + local magic = PRHighlight_Magic:GetChecked() and true or false + local poison = PRHighlight_Poison:GetChecked() and true or false + + PerfectRaid.db.profile.highlight.mouseover = mouseover + PerfectRaid.db.profile.highlight.tooltip = tooltip + PerfectRaid.db.profile.highlight.disease = disease + PerfectRaid.db.profile.highlight.curse = curse + PerfectRaid.db.profile.highlight.magic = magic + PerfectRaid.db.profile.highlight.poison = poison + + -- Trigger update here + for unit in pairs(frames) do + Highlight:UpdateUnit(unit) + end + end + + function options:CancelOptions() + local opt = PerfectRaid.db.profile.highlight + + PRHighlight_Mouseover:SetChecked(opt.mouseover) + PRHighlight_Tooltip:SetChecked(opt.tooltip) + PRHighlight_Disease:SetChecked(opt.disease) + PRHighlight_Curse:SetChecked(opt.curse) + PRHighlight_Magic:SetChecked(opt.magic) + PRHighlight_Poison:SetChecked(opt.poison) + + -- Trigger update here + for unit in pairs(frames) do + Highlight:UpdateUnit(unit) + end + end + + -- Force an update when tab is clicked + options:SetScript("OnShow", options.CancelOptions) + + for idx,widget in ipairs(options.widgets) do + widget:Show() + if idx == 1 then + widget:SetPoint("TOPLEFT", 0, 0) + else + widget:SetPoint("TOPLEFT", options.widgets[idx - 1], "BOTTOMLEFT", 0, -15) + end + end +end -- 1.7.9.5