From ed04d0a92d626349b73ca7b6ea267a0f93a1bf10 Mon Sep 17 00:00:00 2001 From: Xinhuan Date: Mon, 13 Oct 2008 12:42:11 +0800 Subject: [PATCH] Add vertical grip to resize columns. Add Test Mode. Add quick right click menu to title bar. --- Localization/enUS.lua | 10 ++- Omen.lua | 200 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 174 insertions(+), 36 deletions(-) diff --git a/Localization/enUS.lua b/Localization/enUS.lua index 1476d75..27fb078 100644 --- a/Localization/enUS.lua +++ b/Localization/enUS.lua @@ -5,6 +5,10 @@ if not L then return end -- Main Omen window L[""] = true L["Test Mode"] = true +L["Enter Test Mode"] = true +L["Exit Test Mode"] = true +L["Unlock Omen"] = true +L["Open Config"] = true -- Warnings L["|cffff0000Error:|r Omen cannot use shake warning if you have turned on nameplates at least once since logging in."] = true @@ -168,6 +172,10 @@ Now Omen3 does none of these, it just shows exactly what Blizzard says everyone' The drawbacks? The frequency of the updates is much slower, and you can only obtain threat from a mob you are in direct combat with, and only if someone is targetting it in your party/raid. The benefits? You can now see threat of NPCs (think Human Kalecgos) on a mob, provided someone in the raid has them targetted. +|cffffd200How do I make Omen3 look like Omen2?|r + +Change the Background Texture and Border Texture both to Blizzard Tooltip, change the Background Color to black (by dragging the luminance bar to the bottom), and the Border Color to blue. + |cffffd200Why does no threat data show on a mob when I target it even though it is in combat?|r The Blizzard threat API does not return threat data on any mob you are not in direct combat with. We suspect this is an effort on Blizzard's part to save bandwidth. @@ -188,7 +196,7 @@ http://forums.wowace.com/showthread.php?t=14249 Xinhuan (Blackrock US Alliance) did. ]] -L["WARRIOR_FAQ"] = [[The following data is obtained from http://www.tankspot.com/forums/f200/39775-wow-3-0-threat-values.html on 2nd Oct 2008 (credits to Satrina). The numbers are for a level 80. +L["WARRIOR_FAQ"] = [[The following data is obtained from |cffffd200http://www.tankspot.com/forums/f200/39775-wow-3-0-threat-values.html|r on 2nd Oct 2008 (credits to Satrina). The numbers are for a level 80. |cffffd200Modifiers|r Battle Stance ________ x 80 diff --git a/Omen.lua b/Omen.lua index ba19e61..972dfa0 100644 --- a/Omen.lua +++ b/Omen.lua @@ -20,10 +20,6 @@ local LSM = LibStub("LibSharedMedia-3.0") _G["Omen"] = Omen --- TODO: Add TPS calculations --- TODO: Code optimizations - - ----------------------------------------------------------------------------- -- Keybinding globals BINDING_HEADER_OMEN = "Omen" @@ -73,6 +69,9 @@ local defaults = { NumBars = 10, CollapseHide = false, Locked = false, + PositionW = 200, + PositionH = 82, + VGrip1 = 120, Background = { Texture = "Blizzard Parchment", BorderTexture = "Blizzard Dialog", @@ -193,13 +192,13 @@ end ----------------------------------------------------------------------------- -- Omen initialization and frame functions -local function startmoving() +local function startmoving(self) if not db.Locked then Omen.Anchor.IsMovingOrSizing = 1 Omen.Anchor:StartMoving() end end -local function stopmoving() +local function stopmoving(self) if Omen.Anchor.IsMovingOrSizing then Omen.Anchor:StopMovingOrSizing() Omen:SetAnchors() @@ -207,10 +206,30 @@ local function stopmoving() Omen.Anchor.IsMovingOrSizing = nil end end -local function sizing() +local function sizing(self) + local w = Omen.Anchor:GetWidth() + db.VGrip1 = w * Omen.Anchor.VGrip1Ratio + if db.VGrip1 < 10 then db.VGrip1 = 10 end + if db.VGrip1 > w - 10 then db.VGrip1 = w - 10 end + Omen.VGrip1:ClearAllPoints() + Omen.VGrip1:SetPoint("TOPLEFT", Omen.BarList, "TOPLEFT", db.VGrip1, 0) + Omen.VGrip1:SetPoint("BOTTOMLEFT", Omen.BarList, "BOTTOMLEFT", db.VGrip1, 0) Omen:ResizeBars() + Omen:ReAnchorLabels() Omen:UpdateBars() end +local function movegrip(self) + local x = GetCursorPosition() / UIParent:GetEffectiveScale() + local x1 = Omen.Anchor:GetLeft() + 10 + local x2 = Omen.Anchor:GetRight() - 10 + if x > x1 and x < x2 then + db.VGrip1 = x - x1 + 10 + Omen.VGrip1:ClearAllPoints() + Omen.VGrip1:SetPoint("TOPLEFT", Omen.BarList, "TOPLEFT", db.VGrip1, 0) + Omen.VGrip1:SetPoint("BOTTOMLEFT", Omen.BarList, "BOTTOMLEFT", db.VGrip1, 0) + end + Omen:ReAnchorLabels() +end function Omen:CreateFrames() -- Create anchor @@ -225,7 +244,7 @@ function Omen:CreateFrames() self.Anchor:SetScript("OnHide", stopmoving) -- Create Title - self.Title = CreateFrame("Frame", "OmenTitle", self.Anchor) + self.Title = CreateFrame("Button", "OmenTitle", self.Anchor) self.Title:SetPoint("TOPLEFT", self.Anchor, "TOPLEFT") self.Title:SetPoint("TOPRIGHT", self.Anchor, "TOPRIGHT") self.Title:SetHeight(16) @@ -233,6 +252,12 @@ function Omen:CreateFrames() self.Title:EnableMouse(true) self.Title:SetScript("OnMouseDown", startmoving) self.Title:SetScript("OnMouseUp", stopmoving) + self.Title:SetScript("OnClick", function(self, button, down) + if button == "RightButton" then + ToggleDropDownMenu(1, nil, Omen_TitleDropDownMenu, self:GetName(), 0, 0) + end + end) + self.Title:RegisterForClicks("RightButtonUp") -- Create Title text self.TitleText = self.Title:CreateFontString(nil, nil, "GameFontNormal") @@ -260,26 +285,45 @@ function Omen:CreateFrames() self.Grip:SetWidth(16) self.Grip:SetHeight(16) self.Grip:SetPoint("BOTTOMRIGHT", self.BarList, "BOTTOMRIGHT", 0, 1) - if db.Locked then - self.Grip:Hide() - end - self.Grip:SetScript("OnMouseDown", function() + self.Grip:SetScript("OnMouseDown", function(self, button) if not db.Locked then - self.Anchor.IsMovingOrSizing = 2 - self.Anchor:SetScript("OnSizeChanged", sizing) - self.Anchor:StartSizing() + Omen.Anchor.IsMovingOrSizing = 2 + Omen.Anchor.VGrip1Ratio = db.VGrip1 / Omen.Anchor:GetWidth() + Omen.Anchor:SetScript("OnSizeChanged", sizing) + Omen.Anchor:StartSizing() end end) - self.Grip:SetScript("OnMouseUp", function() - if self.Anchor.IsMovingOrSizing then - self.Anchor:SetScript("OnSizeChanged", nil) - self.Anchor:StopMovingOrSizing() + self.Grip:SetScript("OnMouseUp", function(self) + if Omen.Anchor.IsMovingOrSizing then + Omen.Anchor:SetScript("OnSizeChanged", nil) + Omen.Anchor:StopMovingOrSizing() sizing() - self:SetAnchors() - self.Anchor.IsMovingOrSizing = nil + Omen:SetAnchors() + Omen.Anchor.IsMovingOrSizing = nil + Omen.Anchor.VGrip1Ratio = nil end end) self.Grip:SetScript("OnHide", self.Grip:GetScript("OnMouseUp")) + + -- Create label resizing vertical grip + self.VGrip1 = CreateFrame("Button", "OmenVResizeGrip1", self.BarList) + self.VGrip1:SetWidth(1) + self.VGrip1:SetPoint("TOPLEFT", self.BarList, "TOPLEFT", db.VGrip1, 0) + self.VGrip1:SetPoint("BOTTOMLEFT", self.BarList, "BOTTOMLEFT", db.VGrip1, 0) + self.VGrip1:SetNormalTexture("Interface\\Tooltips\\UI-Tooltip-Background") + self.VGrip1:SetHighlightTexture("Interface\\Tooltips\\UI-Tooltip-Background") + self.VGrip1:GetNormalTexture():SetVertexColor(1, 1, 1, 0.5) + self.VGrip1:GetHighlightTexture():SetVertexColor(1, 1, 1, 0.5) + self.VGrip1:SetScript("OnMouseDown", function(self) + if not db.Locked then + self:SetScript("OnUpdate", movegrip) + end + end) + self.VGrip1:SetScript("OnMouseUp", function(self) + self:SetScript("OnUpdate", nil) + end) + self.VGrip1:SetScript("OnHide", self.Grip:GetScript("OnMouseUp")) + self.VGrip1:SetFrameLevel(self.BarList:GetFrameLevel() + 2) end function Omen:OnInitialize() @@ -296,6 +340,7 @@ function Omen:OnInitialize() self:UpdateBackdrop() self:UpdateTitleBar() + self:UpdateGrips() self:RegisterEvent("PLAYER_LOGIN") end @@ -386,8 +431,10 @@ function Omen:OnProfileChanged(event, database, newProfileKey) self:SetAnchors(true) self:UpdateBackdrop() self:UpdateTitleBar() + self:UpdateGrips() self:ResizeBars() self:ReAnchorBars() + self:ReAnchorLabels() self:UpdateBarLabelSettings() self:UpdateVisible() self:UpdateBars() @@ -524,6 +571,19 @@ function Omen:UpdateFuBarSettings() end end +function Omen:UpdateGrips() + self.VGrip1:ClearAllPoints() + self.VGrip1:SetPoint("TOPLEFT", self.BarList, "TOPLEFT", db.VGrip1, 0) + self.VGrip1:SetPoint("BOTTOMLEFT", self.BarList, "BOTTOMLEFT", db.VGrip1, 0) + if db.Locked then + self.Grip:Hide() + self.VGrip1:Hide() + else + self.Grip:Show() + self.VGrip1:Show() + end +end + ----------------------------------------------------------------------------- -- Omen warnings @@ -674,12 +734,18 @@ do bar.Text1:SetJustifyH("LEFT") bar.Text1:SetFont(LSM:Fetch("font", db.Bar.Font), db.Bar.FontSize, db.Bar.FontOutline) bar.Text1:SetTextColor(color.r, color.g, color.b, color.a) + bar.Text1:SetWidth(db.VGrip1 - 5) + bar.Text1:SetHeight(db.Bar.FontSize) + bar.Text1:SetNonSpaceWrap(false) bar.Text2 = bar:CreateFontString(nil, nil, "GameFontNormalSmall") bar.Text2:SetPoint("RIGHT", bar, "RIGHT", -5, 1) bar.Text2:SetJustifyH("RIGHT") bar.Text2:SetFont(LSM:Fetch("font", db.Bar.Font), db.Bar.FontSize, db.Bar.FontOutline) bar.Text2:SetTextColor(color.r, color.g, color.b, color.a) + bar.Text2:SetWidth(Omen.BarList:GetWidth() - db.VGrip1 - 5) + bar.Text2:SetHeight(db.Bar.FontSize) + bar.Text2:SetNonSpaceWrap(false) bar.texture = bar:CreateTexture() bar.texture:SetTexture(LSM:Fetch("statusbar", db.Bar.Texture)) @@ -721,9 +787,21 @@ function Omen:UpdateBarLabelSettings() bars[i].Text2:SetFont(font, size, flags) bars[i].Text1:SetTextColor(color.r, color.g, color.b, color.a) bars[i].Text2:SetTextColor(color.r, color.g, color.b, color.a) + bars[i].Text1:SetHeight(size) + bars[i].Text2:SetHeight(size) end end +function Omen:ReAnchorLabels() + local w = db.VGrip1 + local w2 = Omen.BarList:GetWidth() - w + for i = 1, #bars do + bars[i].Text1:SetWidth(w - 5) + bars[i].Text2:SetWidth(w2 - 5) + end +end + + ----------------------------------------------------------------------------- -- Omen event functions @@ -750,7 +828,7 @@ function Omen:PLAYER_TARGET_CHANGED() timers.UpdateBars = nil end - if UnitExists("target") then + if UnitExists("target") or testMode then self:UpdateBars() else self:ClearAll() @@ -1031,20 +1109,22 @@ function Omen:UpdateBars() self.BarList:Show() -- Threat warnings - local pGUID = UnitGUID("player") - local pClass = guidClassLookup[pGUID] - local myThreatPercent = threatTable[pGUID] / tankThreat * 100 - local t = db.Warnings - if lastWarn.mobGUID == mobGUID and myThreatPercent >= t.Threshold and t.Threshold > lastWarn.threatpercent then - if not t.DisableWhileTanking or not (pClass == "WARRIOR" and GetBonusBarOffset() == 2 or - pClass == "DRUID" and GetBonusBarOffset() == 3 or - pClass == "PALADIN" and UnitAura("player", GetSpellInfo(25780)) or - pClass == "DEATHKNIGHT" and GetShapeshiftFormInfo(GetShapeshiftForm()) == "Interface\\Icons\\Spell_Deathknight_FrostPresence") then - self:Warn(t.Sound, t.Flash, t.Shake, t.Message and L["Passed %s%% of %s's threat!"]:format(t.Threshold, guidNameLookup[tankGUID or mobTargetGUID or sortTable[1]])) + if not testMode then + local pGUID = UnitGUID("player") + local pClass = guidClassLookup[pGUID] + local myThreatPercent = threatTable[pGUID] / tankThreat * 100 + local t = db.Warnings + if lastWarn.mobGUID == mobGUID and myThreatPercent >= t.Threshold and t.Threshold > lastWarn.threatpercent then + if not t.DisableWhileTanking or not (pClass == "WARRIOR" and GetBonusBarOffset() == 2 or + pClass == "DRUID" and GetBonusBarOffset() == 3 or + pClass == "PALADIN" and UnitAura("player", GetSpellInfo(25780)) or + pClass == "DEATHKNIGHT" and GetShapeshiftFormInfo(GetShapeshiftForm()) == "Interface\\Icons\\Spell_Deathknight_FrostPresence") then + self:Warn(t.Sound, t.Flash, t.Shake, t.Message and L["Passed %s%% of %s's threat!"]:format(t.Threshold, guidNameLookup[tankGUID or mobTargetGUID or sortTable[1]])) + end end + lastWarn.mobGUID = mobGUID + lastWarn.threatpercent = myThreatPercent end - lastWarn.mobGUID = mobGUID - lastWarn.threatpercent = myThreatPercent end function Omen:ClearAll() @@ -1064,6 +1144,56 @@ function Omen:ClearAll() end +----------------------------------------------------------------------------- +-- Title Right Click menu + +do + local info = {} + local Omen_TitleDropDownMenu = CreateFrame("Frame", "Omen_TitleDropDownMenu") + Omen_TitleDropDownMenu.displayMode = "MENU" + Omen_TitleDropDownMenu.initialize = function(self, level) + if (not level) then return end + for k in pairs(info) do info[k] = nil end + if (level == 1) then + -- Create the title of the menu + info.isTitle = 1 + info.text = "Omen Quick Menu" + info.notCheckable = 1 + UIDropDownMenu_AddButton(info, level) + + info.disabled = nil + info.isTitle = nil + info.notCheckable = nil + info.text = testMode and L["Exit Test Mode"] or L["Enter Test Mode"] + info.func = function() + testMode = not testMode + Omen:UpdateBars() + end + UIDropDownMenu_AddButton(info, level) + + info.text = db.Locked and L["Unlock Omen"] or L["Lock Omen"] + info.func = function() + db.Locked = not db.Locked + Omen:UpdateGrips() + end + UIDropDownMenu_AddButton(info, level) + + info.text = L["Open Config"] + info.func = function() Omen:ShowConfig() end + UIDropDownMenu_AddButton(info, level) + + -- Close menu item + info.text = CLOSE + info.func = CloseDropDownMenus + info.checked = nil + info.arg1 = nil + info.notCheckable = 1 + UIDropDownMenu_AddButton(info, level) + end + end +end + + ----------------------------------------------------------------------------- -- Omen config stuff @@ -1126,7 +1256,7 @@ local options = { order = 7, set = function(info, value) db.Locked = value - if value then Omen.Grip:Hide() else Omen.Grip:Show() end + Omen:UpdateGrips() end, }, Autocollapse = {