# HG changeset patch # User Flick # Date 1347407437 25200 # Node ID 0cb6a99444974f7f09b50c1e3db40764f84b051d # Parent 7c596a5951eeb1434823e6b8dc23e9d0aa1cbec5 Quick hacks for 5.04 - disable hiding VehicleMenuBar frame, whose name changed - GetMultiCastBarOffset() -> GetMultiCastBarIndex()... cleanup before totem bar support is purged - Remove totem bar - fix demon form, vehicle buttons, overridebar buttons (cross fingers) - change possess/vehicle order priority diff -r 7c596a5951ee -r 0cb6a9944497 ActionButton.lua --- a/ActionButton.lua Fri Aug 05 16:27:45 2011 -0700 +++ b/ActionButton.lua Tue Sep 11 16:50:37 2012 -0700 @@ -46,8 +46,9 @@ (doMindControl and mcVehicleState == "mc") then local idx = self:GetAttribute("bar-idx") local maxN = (doVehicle and mcVehicleState == "vehicle") and 7 or 12 + local pageIndex = (doVehicle and mcVehicleState == "vehicle") and 12 or 14 if idx and idx <= maxN then - action = 120 + idx + action = 12*(pageIndex-1) + idx else action = 0 end @@ -642,7 +643,7 @@ ]]) f:SetAttribute("_onstate-mc", _onstate_mc) - RegisterStateDriver(f, "mc", "[vehicleui] vehicle; [bonusbar:5] mc; none") + RegisterStateDriver(f, "mc", "[vehicleui] vehicle; [overridebar] mc; none") f:SetAttribute("lockbuttons",config.lockButtons) f:SetAttribute("lockbuttonscombat",config.lockButtonsCombat) diff -r 7c596a5951ee -r 0cb6a9944497 Bar.lua --- a/Bar.lua Fri Aug 05 16:27:45 2011 -0700 +++ b/Bar.lua Tue Sep 11 16:50:37 2012 -0700 @@ -750,7 +750,7 @@ local ruleformats = { stealth = { format = "stealth", filter = ClassFilter("ROGUE","DRUID") }, nostealth = { format = "nostealth", filter = ClassFilter("ROGUE","DRUID") }, - shadowdance = { format = "bonusbar:2", filter = ClassFilter("ROGUE") }, + shadowdance = { format = "stance:2", filter = ClassFilter("ROGUE") }, shadowform = { format = "form:1", filter = ClassFilter("PRIEST") }, noshadowform = { format = "noform", filter = ClassFilter("PRIEST") }, battle = { format = "stance:1", filter = ClassFilter("WARRIOR") }, @@ -761,7 +761,7 @@ cat = { format = "form:3", filter = ClassFilter("DRUID") }, tree = { format = "form:5", filter = ClassFilter("DRUID") }, moonkin = { format = "form:5", filter = ClassFilter("DRUID") }, - demon = { format = "form:2", filter = ClassFilter("WARLOCK") }, + demon = { format = "form:1", filter = ClassFilter("WARLOCK") }, nodemon = { format = "noform", filter = ClassFilter("WARLOCK") }, pet = { format = "pet" }, nopet = { format = "nopet" }, @@ -776,8 +776,8 @@ solo = { format = "nogroup" }, combat = { format = "combat" }, nocombat = { format = "nocombat" }, - possess = { format = "@vehicle,noexists,bonusbar:5" }, - vehicle = { format = "@vehicle,exists,bonusbar:5" }, + possess = { format = "overridebar" }, + vehicle = { format = "vehicleui" }, } function Bar.InitRuleFormats() diff -r 7c596a5951ee -r 0cb6a9944497 Editor.lua --- a/Editor.lua Fri Aug 05 16:27:45 2011 -0700 +++ b/Editor.lua Tue Sep 11 16:50:37 2012 -0700 @@ -1037,8 +1037,8 @@ { "pet", { {pet = L["With Pet"]}, {nopet = L["Without Pet"]} } }, { "target", { {harm = L["Hostile Target"]}, {help = L["Friendly Target"]}, {notarget = L["No Target"]} } }, { "focus", { {focusharm = L["Hostile Focus"]}, {focushelp = L["Friendly Focus"]}, {nofocus = L["No Focus"]} } }, + { "vehicle", { {vehicle = L["In a Vehicle"]} } }, { "possess", { {possess = L["Mind Control"]} } }, - { "vehicle", { {vehicle = L["In a Vehicle"]} } }, { "group", { {raid = L["Raid"]}, {party = L["Party"]}, {solo = L["Solo"]} } }, { "combat", { {combat = L["In Combat"]}, {nocombat = L["Out of Combat"]} } }, } diff -r 7c596a5951ee -r 0cb6a9944497 MultiCastButton.lua --- a/MultiCastButton.lua Fri Aug 05 16:27:45 2011 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,785 +0,0 @@ -local _, ns = ... -local ReAction = ns.ReAction -local L = ReAction.L -local _G = _G -local CreateFrame = CreateFrame -local format = string.format -local unpack = unpack -local GetCVar = GetCVar -local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor -local InCombatLockdown = InCombatLockdown -local IsUsableSpell = IsUsableSpell -local IsUsableAction = IsUsableAction -local IsSpellKnown = IsSpellKnown -local IsSpellInRange = IsSpellInRange -local IsActionInRange = IsActionInRange -local GetSpellInfo = GetSpellInfo -local GetSpellCooldown = GetSpellCooldown -local GetActionCooldown = GetActionCooldown -local GetSpellTexture = GetSpellTexture -local GetActionTexture = GetActionTexture -local GetMultiCastTotemSpells = GetMultiCastTotemSpells - ---@do-not-package@ ---[[ - Blizzard Constants: - - NUM_MULTI_CAST_BUTTONS_PER_PAGE = 4 - - NUM_MULTI_CAST_PAGES = 3 - - SHAMAN_TOTEM_PRIORITIES = { } -- sets the order of the totems - - TOTEM_MULTI_CAST_SUMMON_SPELLS = { } -- list of summon spellIDs - - TOTEM_MULTI_CAST_RECALL_SPELLS = { } -- list of recall spellIDs - - Blizzard Events: - - UPDATE_MULTI_CAST_ACTIONBAR - - Blizzard APIs: - - GetMultiCastBarOffset() : returns 6 - - - SetMultiCastSpell(actionID, spellID) (protected) OR - SetAttribute("type","multispell") - SetAttribute("action",actionID) - SetAttribute("spell",spellID) - - note: multicast actionID page is NUM_ACTIONBAR_PAGES + GetMultiCastBarOffset(), - so that's action ID 132-144. - - - spell1, spell2, spell3, ... = GetMultiCastTotemSpells(slot) - returns spellIDs for all known totems that fit that slot. This function is available in - the secure environment. - - Blizzard textures: - All the textures for the multicast bar (arrows, empty-slot icons, etc) are part of a single - texture: each texture uses SetTexCoord() to display only a slice of the textures. I suppose - this is to slightly optimize texture load performance, but it makes the UI code more clumsy. - - Each totem button and arrow has a colored border indicating its elemental type. - - TODO: - - make whether to show the colored border configurable (looks really bad with ButtonFacade:Zoomed) - - apply ButtonFacade to the flyout buttons? Or at least zoom the textures slightly? - - use a multiplier with SetTexCoord on totem bar texture? - - Design Notes: - - Only the header has a secure context. All other frames execute in its context. - - - Each button is either type "spell" (summon/recall) or type "action" (totem action IDs are - GetBonusBarOffset()=6, 132-144) with 3 pages of 4 buttons. The paging is controlled by - the summon flyout, which is also paged with the summon spells (the recall button is not paged) - - - A spell list is updated in the secure context at setup time (TODO: redo setup when learning new - spells) with the list of spells known for each slot. - - - Each button (except recall) has an arrow button which appears on mouseover and when clicked - opens the flyout via a wrapped OnClick handler. When the flyout is open, the arrow does not - appear. - - - A single flyout with N+1 (1 slot is to select no totem for the set) flyout-buttons is a child - of the bar. Each time the flyout panel is opened, the individual buttons grab their corresponding - spell/type from the list, according to the slot which opened the flyout. Each button either sets - the current page (summon) or sets a multispell to an actionID via type="multispell". None of them - actually cast any spells (though, I suppose we could modify this so that e.g. configurable - right-click casts the spell). The flyout also has a close button which closes the flyout: the - flyout-open code positions the close button anchored to the last button in the flyout (which - changes dynamically because each slot has a different number of items in the list). - - - Multicast sets are not stances, there's no need (or ability) to handle swapping sets if one of - the summon spells is cast from elsewhere. - - - The default UI has Call of the Elements always selected on UI load. This module remembers the last - selected one and restores it. - - -]]-- ---@end-do-not-package@ - --- --- Secure snippets --- - --- bar -local _bar_init = -- function(self) -[[ - -- set up some globals in the secure environment - flyout = self:GetFrameRef("flyout") - flyoutSlot = nil - summonSlot = self:GetAttribute("summonSlot") - recallSlot = self:GetAttribute("recallSlot") - baseActionID = self:GetAttribute("baseActionID") - slotsPerPage = self:GetAttribute("slotsPerPage") - currentPage = currentPage or self:GetAttribute("lastSummon") or 1 - - totemIDsBySlot = newtable() - for i = 1, slotsPerPage do - totemIDsBySlot[i] = self:GetAttribute("TOTEM_PRIORITY_"..i) - end - - -- these are set up in bar:SetupBar() - flyoutChildren = flyoutChildren or newtable() - summonSpells = summonSpells or newtable() -]] - -local _onstate_multispellpage = -- function(self, stateid, newstate) -[[ - currentPage = tonumber(newstate) - control:CallMethod("UpdateLastSummon",currentPage) - control:ChildUpdate() -]] - - --- buttons -local _childupdate = -- function(self, snippetid, message) -[[ - local t = self:GetAttribute("type") - self:SetAttribute(t, self:GetAttribute(t.."-page"..currentPage)) -]] - -local _onEnter = -- function(self) - -- for whatever reason, RegisterAutoHide is unreliable - -- unless you re-anchor the frame prior to calling it. - -- Even then, it's still not terribly reliable. -[[ - local slot = self:GetAttribute("bar-idx") - local arrow = owner:GetFrameRef("arrow-"..slot) - if arrow and not arrow:IsShown() and not (flyout:IsVisible() and flyoutSlot == slot) then - arrow:ClearAllPoints() - arrow:SetPoint("BOTTOM",self,"TOP",0,0) - arrow:Show() - arrow:RegisterAutoHide(0) - arrow:AddToAutoHide(self) - end -]] - - --- flyout arrow -local _arrow_openFlyout = -- function(self) -[[ - local slot = self:GetAttribute("bar-idx") - local totemID = totemIDsBySlot[slot - (summonSlot or 0)] - if totemID == 0 then - totemID = "summon" - end - - local lastButton, lastPage - for page, b in ipairs(flyoutChildren) do - b:Hide() - b:SetAttribute("totemSlot",totemID) - if slot == summonSlot then - local spellID = self:GetParent():GetAttribute("spell-page"..page) - if spellID then - b:SetAttribute("type","changePage") - b:SetAttribute("spell",spellID) - b:Show() - lastButton = b - lastPage = page - end - else - local spell = select(page, 0, GetMultiCastTotemSpells(totemID) ) - if spell then - b:SetAttribute("type","multispell") - b:SetAttribute("action", baseActionID + (currentPage - 1)*slotsPerPage + totemID) - b:SetAttribute("spell", spell) - b:Show() - lastButton = b - lastPage = page - end - end - end - - local close = owner:GetFrameRef("close") - if lastButton and close then - close:ClearAllPoints() - close:SetPoint("BOTTOM",lastButton,"TOP",0,0) -- TODO: better anchoring - close:Show() - control:CallMethod("UpdateFlyoutTextures",totemID) - end - - flyout:ClearAllPoints() - flyout:SetPoint("BOTTOM",self,"BOTTOM",0,0) -- TODO: better anchoring - if lastPage then - flyout:SetHeight(lastPage * 27 + (close and close:GetHeight() or 0)) - end - flyout:Show() - flyout:RegisterAutoHide(1) -- TODO: configurable - flyout:AddToAutoHide(owner) - flyoutSlot = slot - self:Hide() -]] - -local _closeFlyout = -- function(self) -[[ - flyout:Hide() -]] - - --- flyout child buttons -local _flyout_child_preClick = -- function(self, button, down) -[[ - local button = button - if self:GetAttribute("type") == "changePage" then - owner:SetAttribute("state-multispellpage",self:GetAttribute("index")) - self:GetParent():Hide() - return false - else - return nil, "close" - end -]] - -local _flyout_child_postClick = -- function(self, message, button, down) -[[ - if message == "close" then - self:GetParent():Hide() -- hide flyout after selecting - end -]] - - --- --- The Blizzard totem bar textures are all actually one big texture, --- with texcoord offsets. Shamelessly stolen from FrameXML/MultiCastActionBarFrame.lua --- -local TOTEM_TEXTURE = "Interface\\Buttons\\UI-TotemBar" -local FLYOUT_UP_BUTTON_HL_TCOORDS = { 72/128, 92/128, 88/256, 98/256 } -local FLYOUT_DOWN_BUTTON_HL_TCOORDS = { 72/128, 92/128, 69/256, 79/256 } - -local SLOT_EMPTY_TCOORDS = { - [EARTH_TOTEM_SLOT] = { 66/128, 96/128, 3/256, 33/256 }, - [FIRE_TOTEM_SLOT] = { 67/128, 97/128, 100/256, 130/256 }, - [WATER_TOTEM_SLOT] = { 39/128, 69/128, 209/256, 239/256 }, - [AIR_TOTEM_SLOT] = { 66/128, 96/128, 36/256, 66/256 }, -} - -local SLOT_OVERLAY_TCOORDS = { - [EARTH_TOTEM_SLOT] = { 1/128, 35/128, 172/256, 206/256 }, - [FIRE_TOTEM_SLOT] = { 36/128, 70/128, 172/256, 206/256 }, - [WATER_TOTEM_SLOT] = { 1/128, 35/128, 207/256, 240/256 }, - [AIR_TOTEM_SLOT] = { 36/128, 70/128, 137/256, 171/256 }, -} - -local FLYOUT_UP_BUTTON_TCOORDS = { - ["summon"] = { 99/128, 127/128, 84/256, 102/256 }, - [EARTH_TOTEM_SLOT] = { 99/128, 127/128, 160/256, 178/256 }, - [FIRE_TOTEM_SLOT] = { 99/128, 127/128, 122/256, 140/256 }, - [WATER_TOTEM_SLOT] = { 99/128, 127/128, 199/256, 217/256 }, - [AIR_TOTEM_SLOT] = { 99/128, 127/128, 237/256, 255/256 }, -} - -local FLYOUT_DOWN_BUTTON_TCOORDS = { - ["summon"] = { 99/128, 127/128, 65/256, 83/256 }, - [EARTH_TOTEM_SLOT] = { 99/128, 127/128, 141/256, 159/256 }, - [FIRE_TOTEM_SLOT] = { 99/128, 127/128, 103/256, 121/256 }, - [WATER_TOTEM_SLOT] = { 99/128, 127/128, 180/256, 198/256 }, - [AIR_TOTEM_SLOT] = { 99/128, 127/128, 218/256, 236/256 }, -} - -local FLYOUT_TOP_TCOORDS = { - ["summon"] = { 33/128, 65/128, 1/256, 23/256 }, - [EARTH_TOTEM_SLOT] = { 0/128, 32/128, 46/256, 68/256 }, - [FIRE_TOTEM_SLOT] = { 33/128, 65/128, 46/256, 68/256 }, - [WATER_TOTEM_SLOT] = { 0/128, 32/128, 1/256, 23/256 }, - [AIR_TOTEM_SLOT] = { 0/128, 32/128, 91/256, 113/256 }, -} - -local FLYOUT_MIDDLE_TCOORDS = { - ["summon"] = { 33/128, 65/128, 23/256, 43/256 }, - [EARTH_TOTEM_SLOT] = { 0/128, 32/128, 68/256, 88/256 }, - [FIRE_TOTEM_SLOT] = { 33/128, 65/128, 68/256, 88/256 }, - [WATER_TOTEM_SLOT] = { 0/128, 32/128, 23/256, 43/256 }, - [AIR_TOTEM_SLOT] = { 0/128, 32/128, 113/256, 133/256 }, -} - -local eventList = { - "ACTIONBAR_SLOT_CHANGED", - "ACTIONBAR_UPDATE_STATE", - "ACTIONBAR_UPDATE_USABLE", - "ACTIONBAR_UPDATE_COOLDOWN", - "UPDATE_BINDINGS", - "UPDATE_MULTI_CAST_ACTIONBAR", -} - --- --- MultiCast Button class --- Inherits implementation methods from Action button class, but circumvents the constructor --- and redefines/removes some methods. --- -local buttonTypeID = "Totem" -local Super = ReAction.Button -local Action = ReAction.Button.Action -local MultiCast = setmetatable( - { - defaultBarConfig = { - type = buttonTypeID, - btnWidth = 36, - btnHeight = 36, - btnRows = 1, - btnColumns = 6, - spacing = 3, - buttons = { } - }, - - barType = L["Totem Bar"], - buttonTypeID = buttonTypeID - }, - { __index = Action } ) - -ReAction.Button.MultiCast = MultiCast -ReAction:RegisterBarType(MultiCast) - -function MultiCast:New( btnConfig, bar, idx ) - if idx < 1 or idx > NUM_MULTI_CAST_BUTTONS_PER_PAGE + 2 then - ReAction:UserError(L["All %s buttons are in use for this bar, cannot create any more buttons"]:format(self.barType)) - error(nil) - end - - self = Super.New(self, btnConfig, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) - - if not bar.hasMulticast or idx > bar.maxIndex then - -- Not enough multicast capability to use this button - self:Refresh() - return self - end - - local barFrame = bar:GetFrame() - local f = self:GetFrame() - - -- attributes - local page = (idx == bar.recallSlot) and 1 or bar:GetConfig().lastSummon or 1 - if idx == bar.recallSlot or idx == bar.summonSlot then - f:SetAttribute("type","spell") - local spells = (idx == bar.summonSlot) and TOTEM_MULTI_CAST_SUMMON_SPELLS or TOTEM_MULTI_CAST_RECALL_SPELLS - f:SetAttribute("spell",spells[page]) - for i, spell in ipairs(spells) do - if spell and IsSpellKnown(spell) then - f:SetAttribute("spell-page"..i, spell) - end - end - else - local offset = bar.summonSlot and 1 or 0 - local slot = SHAMAN_TOTEM_PRIORITIES[idx - offset] - local baseAction = barFrame:GetAttribute("baseActionID") + slot - self.totemSlot = slot - f:SetAttribute("type","action") - f:SetAttribute("action", baseAction + (page - 1) * NUM_MULTI_CAST_BUTTONS_PER_PAGE) - for i = 1, NUM_MULTI_CAST_PAGES do - f:SetAttribute("action-page"..i, baseAction + (i-1) * NUM_MULTI_CAST_BUTTONS_PER_PAGE) - end - if not f.overlayTex then - local tx = f:CreateTexture("OVERLAY") - tx:SetTexture(TOTEM_TEXTURE) - tx:SetTexCoord(unpack(SLOT_OVERLAY_TCOORDS[self.totemSlot])) - tx:SetWidth(34) - tx:SetHeight(34) - tx:SetPoint("CENTER") - tx:Show() - f.overlayTex = tx - end - end - f:SetAttribute("bar-idx",idx) - - -- non secure scripts - f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end) - f:SetScript("OnEnter", function(frame) self:OnEnter() end) - f:SetScript("OnLeave", function(frame) self:OnLeave() end) - f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end) - f:SetScript("PostClick", function(frame, ...) self:PostClick(...) end) - - -- secure handlers - if idx ~= bar.recallSlot then - f:SetAttribute("_childupdate",_childupdate) - end - barFrame:WrapScript(f, "OnEnter", _onEnter) - - -- event registration - for _, evt in pairs(eventList) do - f:RegisterEvent(evt) - end - - -- Set up a proxy for the icon texture for use with ButtonFacade - local SetTexCoordRaw = self.frames.icon.SetTexCoord - self.frames.icon.SetTexCoord = function( tx, ... ) - if self:GetIconTexture() == TOTEM_TEXTURE then - SetTexCoordRaw(tx,select(2,self:GetIconTexture())) - else - SetTexCoordRaw(tx,...) - end - end - - -- attach to skinner - bar:SkinButton(self) - - f:Show() - - -- open arrow and flyout background textures - if idx ~= bar.recallSlot then - local arrow = f._arrowFrame or CreateFrame("Button", nil, f, "SecureFrameTemplate") - f._arrowFrame = arrow - arrow:SetWidth(28) - arrow:SetHeight(18) - arrow:SetPoint("BOTTOM",self:GetFrame(),"TOP",0,0) -- TODO: better anchoring - arrow:SetNormalTexture(TOTEM_TEXTURE) - local slot = self.totemSlot or "summon" - arrow:GetNormalTexture():SetTexCoord( unpack(FLYOUT_UP_BUTTON_TCOORDS[slot]) ) - arrow:SetHighlightTexture(TOTEM_TEXTURE) - arrow:GetHighlightTexture():SetTexCoord( unpack(FLYOUT_UP_BUTTON_HL_TCOORDS) ) - arrow:SetAttribute("bar-idx",idx) - arrow:Hide() - barFrame:WrapScript(arrow, "OnClick", _arrow_openFlyout) - barFrame:SetFrameRef("arrow-"..idx,arrow) - end - - self:Refresh() - - return self -end - -function MultiCast:Destroy() - local barFrame = self.bar:GetFrame() - local f = self:GetFrame() - pcall( barFrame.UnwrapScript, barFrame, f, "OnEnter" ) -- ignore errors - if f._arrowFrame then - pcall( barFrame.UnwrapScript, barFrame, f._arrowFrame,"OnClick" ) -- ignore errors - end - Super.Destroy(self) -end - -function MultiCast:Refresh() - Super.Refresh(self) - self:UpdateAction() - - local bar = self.bar - if bar.hasMulticast == true and self.idx <= bar.maxIndex or ReAction:GetConfigMode() then - self:GetFrame():Show() - else - self:GetFrame():Hide() - end -end - -function MultiCast:ShowGrid( show ) -end - -function MultiCast:ShowGridTemp( show ) -end - -function MultiCast:AcquireActionID() -end - -function MultiCast:ReleaseActionID() -end - -function MultiCast:UpdateShowGrid() -end - -function MultiCast:UpdateBorder() -end - -function MultiCast:UpdateMacroText() -end - -function MultiCast:UpdateCount() -end - -function MultiCast:UpdateCheckedState() - local action = self:GetActionID() - if action and IsCurrentAction(action) then - self:GetFrame():SetChecked(1) - else - self:GetFrame():SetChecked(0) - end -end - -function MultiCast:RefreshHasActionAttributes() -end - -function MultiCast:UpdateFlash() -end - -function MultiCast:GetIconTexture() - local tx - if self.spellID then - tx = GetSpellTexture(GetSpellInfo(self.spellID)) - elseif self.actionID then - tx = GetActionTexture(self.actionID) - end - if tx then - return tx - else - return TOTEM_TEXTURE, unpack(SLOT_EMPTY_TCOORDS[self.totemSlot or 1]) - end -end - -function MultiCast:UpdateAction() - local action = self:GetActionID() - if action then - if action ~= self.actionID then - self.actionID = action - self:UpdateAll() - end - else - local spellID = self:GetSpellID() - if spellID ~= self.spellID then - self.spellID = spellID - self:UpdateAll() - end - end -end - -function MultiCast:GetActionID(page) - return self:GetFrame():GetAttribute("action") -end - -function MultiCast:GetSpellID(page) - return self:GetFrame():GetAttribute("spell") -end - -function MultiCast:SetActionID( id ) - error("Can not set action ID of multicast buttons") -end - -function MultiCast:SetTooltip() - local barFrame = self:GetFrame() - if GetCVar("UberTooltips") == "1" then - GameTooltip_SetDefaultAnchor(GameTooltip, barFrame) - else - GameTooltip:SetOwner(barFrame) - end - if self.spellID then - GameTooltip:SetSpellByID(self.spellID,false,true) - elseif self.actionID then - GameTooltip:SetAction(self.actionID) - end -end - -function MultiCast:GetUsable() - if self.spellID then - return IsUsableSpell((GetSpellInfo(self.spellID))) - elseif self.actionID then - return IsUsableAction(self.actionID) - end -end - -function MultiCast:GetInRange() - if self.spellID then - return IsSpellInRange((GetSpellInfo(self.spellID))) == 0 - elseif self.actionID then - return IsActionInRange(self.actionID) == 0 - end -end - -function MultiCast:GetCooldown() - if self.spellID then - return GetSpellCooldown((GetSpellInfo(self.spellID))) - elseif self.actionID then - return GetActionCooldown(self.actionID) - else - return 0, 0, 0 - end -end - -function MultiCast:UPDATE_MULTI_CAST_ACTIONBAR() - self:UpdateAll() -end - - --- --- flyout setup --- -local function ShowFlyoutTooltip(frame) - if GetCVar("UberTooltips") == "1" then - GameTooltip_SetDefaultAnchor(GameTooltip, frame) - else - GameTooltip:SetOwner(frame) - end - local spell = frame:GetAttribute("spell") - if spell == nil or spell == 0 then - GameTooltip:SetText(MULTI_CAST_TOOLTIP_NO_TOTEM, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b) - else - GameTooltip:SetSpellByID(spell,false,true) - end -end - -local function HideFlyoutTooltip() - GameTooltip:Hide() -end - -local function UpdateFlyoutIcon(frame) - local spellID = frame:GetAttribute("spell") - if spellID == 0 or spellID == nil then - frame.icon:SetTexture(TOTEM_TEXTURE) - local slot = tonumber(frame:GetAttribute("totemSlot")) or 1 - frame.icon:SetTexCoord( unpack(SLOT_EMPTY_TCOORDS[slot]) ) - else - frame.icon:SetTexture(GetSpellTexture(GetSpellInfo(spellID))) - frame.icon:SetTexCoord(0,1,0,1) - end -end - -function MultiCast:SetupBar( bar ) - local slot = 0 - local nTotemSlots = 0 - local summonSlot = nil - local recallSlot = nil - - -- figure out the capabilities of the character - for i, spell in ipairs(TOTEM_MULTI_CAST_SUMMON_SPELLS) do - if spell and IsSpellKnown(spell) then - slot = 1 - summonSlot = 1 - end - end - - for i = 1, NUM_MULTI_CAST_BUTTONS_PER_PAGE do - local totem = SHAMAN_TOTEM_PRIORITIES[i]; - if GetTotemInfo(totem) and GetMultiCastTotemSpells(totem) then - nTotemSlots = nTotemSlots + 1 - slot = slot + 1 - end - end - - slot = slot + 1 - for i, spell in ipairs(TOTEM_MULTI_CAST_RECALL_SPELLS) do - if spell and IsSpellKnown(spell) then - recallSlot = slot - end - end - - local maxIndex = nTotemSlots - if summonSlot then - maxIndex = maxIndex + 1 - end - if recallSlot then - maxIndex = maxIndex + 1 - end - - bar.hasMulticast = nTotemSlots > 0 - bar.summonSlot = summonSlot - bar.recallSlot = recallSlot - bar.nTotemSlots = nTotemSlots - bar.maxIndex = maxIndex - - if bar.hasMulticast == false then - Super.SetupBar(self,bar) - return -- no multicast capability - end - - local f = bar:GetFrame() - - -- init bar secure environment - f:SetAttribute("lastSummon", bar:GetConfig().lastSummon) - f:SetAttribute("summonSlot", summonSlot) - f:SetAttribute("recallSlot", recallSlot) - f:SetAttribute("slotsPerPage", NUM_MULTI_CAST_BUTTONS_PER_PAGE) - f:SetAttribute("baseActionID", (NUM_ACTIONBAR_PAGES + GetMultiCastBarOffset() - 1)*NUM_ACTIONBAR_BUTTONS) - for i, p in ipairs(SHAMAN_TOTEM_PRIORITIES) do - f:SetAttribute("TOTEM_PRIORITY_"..i,p) - end - f:SetAttribute("_onstate-multispellpage", _onstate_multispellpage) - - function f:UpdateLastSummon(value) - bar:GetConfig().lastSummon = value - end - - -- create flyout container frame and close arrow - local flyout = bar._flyoutFrame - if not flyout then - flyout = CreateFrame("Frame", nil, f, "SecureFrameTemplate") - bar._flyoutFrame = flyout - f:SetFrameRef("flyout",flyout) - flyout.buttons = { } - flyout:Hide() - flyout:SetWidth(24) - flyout:SetHeight(1) - flyout:SetPoint("BOTTOM",f,"TOP",0,0) - - local close = CreateFrame("Button", nil, flyout, "SecureFrameTemplate") - close:SetWidth(28) - close:SetHeight(18) - close:SetPoint("BOTTOM",flyout,"TOP") - close:SetNormalTexture(TOTEM_TEXTURE) - close:GetNormalTexture():SetTexCoord(unpack(FLYOUT_DOWN_BUTTON_TCOORDS["summon"])) - close:SetHighlightTexture(TOTEM_TEXTURE) - close:GetHighlightTexture():SetTexCoord( unpack(FLYOUT_DOWN_BUTTON_HL_TCOORDS) ) - f:SetFrameRef("close",close) - f:WrapScript(close, "OnClick", _closeFlyout) - close:Show() - - local midTx = flyout:CreateTexture("BACKGROUND") - midTx:SetWidth(32) - midTx:SetHeight(20) - midTx:SetPoint("BOTTOM") - midTx:SetTexture(TOTEM_TEXTURE) - midTx:SetTexCoord(unpack(FLYOUT_MIDDLE_TCOORDS["summon"])) - midTx:Show() - - local topTx = flyout:CreateTexture("BACKGROUND") - topTx:SetWidth(32) - topTx:SetHeight(20) - topTx:SetTexture(TOTEM_TEXTURE) - midTx:SetTexCoord(unpack(FLYOUT_TOP_TCOORDS["summon"])) - topTx:SetPoint("BOTTOM",midTx,"TOP",0,-10) - topTx:Show() - - function flyout:UpdateTextures(slot) - slot = slot or "summon" - close:GetNormalTexture():SetTexCoord(unpack(FLYOUT_DOWN_BUTTON_TCOORDS[slot])) - midTx:ClearAllPoints() - midTx:SetPoint("BOTTOM") - midTx:SetPoint("TOP",close,"BOTTOM",0,0) - midTx:SetTexCoord(unpack(FLYOUT_MIDDLE_TCOORDS[slot])) - topTx:SetTexCoord(unpack(FLYOUT_TOP_TCOORDS[slot])) - end - - -- create flyout buttons - for i = 1, 10 do -- maximum 9 spells + 1 empty slot - local b = CreateFrame("Button",nil,flyout,"SecureActionButtonTemplate") - b:SetWidth(24) - b:SetHeight(24) - local prev = flyout.buttons[i-1] - b:SetPoint("BOTTOM", prev or flyout, prev and "TOP" or "BOTTOM", 0, 3) -- TODO: better anchoring - b.icon = b:CreateTexture("BACKGROUND") - b.icon:SetAllPoints() - b.icon:Show() - b:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square") - b:GetHighlightTexture():SetBlendMode("ADD") - b:EnableMouse(true) - b:RegisterForClicks(bar:GetConfig().clickDown and "AnyDown" or "AnyUp") - b:SetScript("OnShow",UpdateFlyoutIcon) - b:SetScript("OnEnter",ShowFlyoutTooltip) - b:SetScript("OnLeave",HideFlyoutTooltip) - b:SetAttribute("index",i) - f:SetAttribute("flyout-child-idx",i) - f:SetFrameRef("flyout-child",b) - f:Execute([[ - flyoutChildren = flyoutChildren or newtable() - flyoutChildren[self:GetAttribute("flyout-child-idx")] = self:GetFrameRef("flyout-child") - ]]) - f:WrapScript(b, "OnClick", _flyout_child_preClick, _flyout_child_postClick) - b:Show() - flyout.buttons[i] = b - end - end - - -- scale flyout frame - local scale = bar:GetButtonSize() / 36 - flyout:SetScale(scale) - - function f:UpdateFlyoutTextures(slot) - flyout:UpdateTextures(slot) - end - - -- re-execute setup when new spells are loaded - if not f.events_registered then - f:RegisterEvent("UPDATE_MULTI_CAST_ACTIONBAR") - f:RegisterEvent("PLAYER_ENTERING_WORLD") - -- Bar.frame does not use OnEvent - f:SetScript("OnEvent", - function() - if not InCombatLockdown() then - self:SetupBar(bar) - end - end) - f.events_registered = true - end - - f:Execute(_bar_init) - - Super.SetupBar(self,bar) -- create buttons after this is done -end - diff -r 7c596a5951ee -r 0cb6a9944497 Profile.lua --- a/Profile.lua Fri Aug 05 16:27:45 2011 -0700 +++ b/Profile.lua Tue Sep 11 16:50:37 2012 -0700 @@ -1,7 +1,7 @@ local _, ns = ... local ReAction = ns.ReAction -ReAction.PROFILEVERSION_LATEST = 2 +ReAction.PROFILEVERSION_LATEST = 3 ReAction.defaultProfile = { profile = { @@ -139,6 +139,25 @@ db.profile.dbversion = 2 end + + if db.profile.dbversion < 3 then + -- upgrade to v3 + + -- totem multicast bar no longer part of wow + local totem = db:GetNamespace("Totem",true) + if totem then + wipe(totem) + end + + -- remove any bars set as totem bars + for name, bar in pairs(db.profile.bars) do + if bar.type == "Totem" then + db.profile.bars[name] = nil + end + end + + end + db.profile.dbversion = self.PROFILEVERSION_LATEST end diff -r 7c596a5951ee -r 0cb6a9944497 ReAction.lua --- a/ReAction.lua Fri Aug 05 16:27:45 2011 -0700 +++ b/ReAction.lua Tue Sep 11 16:50:37 2012 -0700 @@ -95,7 +95,7 @@ -- It's fairly normal to use the Blizzard vehicle bar, and to have -- your regular buttons in the same location. If you do this, and don't -- bother to hide your buttons, they'll obscure some parts of the vehicle bar. - VehicleMenuBar:SetFrameLevel(VehicleMenuBar:GetFrameLevel()+3) +-- VehicleMenuBar:SetFrameLevel(VehicleMenuBar:GetFrameLevel()+3) self.callbacks = LibStub("CallbackHandler-1.0"):New(self) @@ -354,7 +354,7 @@ for _, f in pairs(blizzFrames) do ManageBlizzFrame(f, self.db.profile.options.hideBlizzardBars) end - ManageBlizzFrame(VehicleMenuBar, self.db.profile.options.hideBlizzardVehicleBar) + --ManageBlizzFrame(VehicleMenuBar, self.db.profile.options.hideBlizzardVehicleBar) end function ReAction:RegisterBarType( class, isDefault ) diff -r 7c596a5951ee -r 0cb6a9944497 ReAction.xml --- a/ReAction.xml Fri Aug 05 16:27:45 2011 -0700 +++ b/ReAction.xml Tue Sep 11 16:50:37 2012 -0700 @@ -15,7 +15,6 @@