From 7de890f9123640e4fb7d63fbbe985e53e80e2e0c Mon Sep 17 00:00:00 2001 From: Hendrik Leppkes Date: Sun, 22 Jun 2008 00:24:42 +0000 Subject: [PATCH] revert some changes to the action button code again to resolve a weird issue with moving spells (once again its not possible to move actions in combat) --- ActionBarPrototype.lua | 7 +- ActionBarStates.lua | 4 +- ActionBars.lua | 4 +- Bar.lua | 2 - Button.lua | 476 +++++++++++++++++++++++++++++++++-------- Options.lua | 4 +- 6 files changed, 403 insertions(+), 94 deletions(-) diff --git a/ActionBarPrototype.lua b/ActionBarPrototype.lua index a66416b..c0ff434 100644 --- a/ActionBarPrototype.lua +++ b/ActionBarPrototype.lua @@ -171,9 +171,10 @@ function ActionBar:UpdateButtons(numbuttons) -- show active buttons for i = 1, numbuttons do - self:SetAttribute("addchild", buttons[i]) + buttons[i]:SetParent(self) + buttons[i]:SetLevels() buttons[i]:Show() - buttons[i]:Update() + buttons[i]:UpdateAction(true) end -- hide inactive buttons @@ -256,7 +257,7 @@ function ActionBar:SetHideHotkey(state) if state ~= nil then self.config.hidehotkey = state end - self:ForAll("UpdateHotkey") + self:ForAll("Update") end function ActionBar:GetHideHotkey() diff --git a/ActionBarStates.lua b/ActionBarStates.lua index bc83b99..0ec6185 100644 --- a/ActionBarStates.lua +++ b/ActionBarStates.lua @@ -342,7 +342,9 @@ function ActionBar:UpdateStates() self:ApplyStateButton() SecureStateHeader_Refresh(self) - self:SetAttribute("state", self:GetAttribute("state-page")) + + local newState = self:GetAttribute("state-page") + self:SetAttribute("state", newState) self:ApplyVisibilityDriver() end diff --git a/ActionBars.lua b/ActionBars.lua index f56b371..4fe895f 100644 --- a/ActionBars.lua +++ b/ActionBars.lua @@ -183,7 +183,7 @@ function BT4ActionBars:ReassignBindings() local frame = self.actionbars[1] ClearOverrideBindings(frame) for i = 1,min(#frame.buttons, 12) do - local button, real_button = ("ACTIONBUTTON%d"):format(i), ("BT4Button%d"):format(i) + local button, real_button = ("ACTIONBUTTON%d"):format(i), ("BT4Button%dSecure"):format(i) for k=1, select('#', GetBindingKey(button)) do local key = select(k, GetBindingKey(button)) SetOverrideBindingClick(frame, false, key, real_button) @@ -192,7 +192,7 @@ function BT4ActionBars:ReassignBindings() for i = 1, 120 do -- rename old bindings from Secure to only = ATTACK_BUTTON_FLASH_TIME ) then + if overtime >= ATTACK_BUTTON_FLASH_TIME then overtime = 0 end self.flashtime = ATTACK_BUTTON_FLASH_TIME - overtime - + local flashTexture = self.flash - if ( flashTexture:IsShown() ) then + if flashTexture:IsVisible() then flashTexture:Hide() else flashTexture:Show() @@ -90,16 +170,16 @@ function onUpdate(self, elapsed) end end - if ( self.rangeTimer ) then + if self.rangeTimer then self.rangeTimer = self.rangeTimer - elapsed - if self.rangeTimer <= 0 then local valid = IsActionInRange(self.action) - local shown = (self.hotkey:GetText() == RANGE_INDICATOR and oor == "hotkey") - if valid and shown then - self.hotkey:Show() - elseif shown then - self.hotkey:Hide() + local hotkey = self.hotkey + local hkshown = (hotkey:GetText() == RANGE_INDICATOR and oor == "hotkey") + if valid and hkshown then + hotkey:Show() + elseif hkshown then + hotkey:Hide() end self.outOfRange = (valid == 0) self:UpdateUsable() @@ -150,50 +230,86 @@ function Button:SetStateAction(state, action) self:SetAttribute(("*action-S%dRight"):format(state), action) end +function Button:CalculateAction() + return SecureButton_GetModifiedAttribute(self, "action", SecureButton_GetEffectiveButton(self)) or 1 +end + function Button:GetActionID() return self.action end -function Button:BlizzCall(func, ...) - local oldThis = this - this = self - func(...) - this = oldThis -end - -orig_ActionButton_UpdateUsable = ActionButton_UpdateUsable -ActionButton_UpdateUsable = function(...) if this.BT4 then this:UpdateUsable() else return orig_ActionButton_UpdateUsable(...) end end -function Button:UpdateUsable() - local isUsable, notEnoughMana = IsUsableAction(self.action) - local icon, hotkey = self.icon, self.hotkey - if not oor then - oor = Bartender4.db.profile.outofrange - oorcolor, oomcolor = Bartender4.db.profile.colors.range, Bartender4.db.profile.colors.mana - end - - if oor == "button" and self.outOfRange then - icon:SetVertexColor(oorcolor.r, oorcolor.g, oorcolor.b) - hotkey:SetVertexColor(1.0, 1.0, 1.0) - else - if oor == "hotkey" and self.outOfRange then - hotkey:SetVertexColor(oorcolor.r, oorcolor.g, oorcolor.b) - else - hotkey:SetVertexColor(1.0, 1.0, 1.0) - end - - if isUsable then - icon:SetVertexColor(1.0, 1.0, 1.0) - elseif notEnoughMana then - icon:SetVertexColor(oomcolor.r, oomcolor.g, oomcolor.b) - else - icon:SetVertexColor(0.4, 0.4, 0.4) - end +function Button:UpdateAction(force) + local action = self:CalculateAction() + if action ~= self.action or force then + self.action = action + self:Update() end end function Button:Update() - oor = nil - self:BlizzCall(ActionButton_Update) + local action = self.action + self:UpdateIcon() + self:UpdateCount() + self:UpdateHotkeys() + if ( HasAction(action) ) then + self:RegisterActionEvents() + + self:UpdateState() + self:UpdateUsable(true) + self:UpdateCooldown() + self:UpdateFlash() + + self:ShowButton() + self:SetScript("OnUpdate", onUpdate) + else + self:UnregisterActionEvents() + + self.cooldown:Hide() + + if ( self.showgrid == 0 and not self.parent.config.showgrid ) then + self:HideButton() + end + + self:SetScript("OnUpdate", nil) + end + + if ( IsEquippedAction(action) ) then + self.border:SetVertexColor(0, 1.0, 0, 0.75) + self.border:Show() + else + self.border:Hide() + end + + if ( GameTooltip:GetOwner() == self) then + self:SetTooltip() + end + + if not IsConsumableAction(action) and not IsStackableAction(action) and not self.parent.config.hidemacrotext then + self.macroName:SetText(GetActionText(action)) + else + self.macroName:SetText("") + end + +end + +function Button:UpdateIcon() + local texture = GetActionTexture(self.action) + if ( texture ) then + self.rangeTimer = -1 + self.icon:SetTexture(texture) + self.icon:Show() + self.normalTexture:SetTexture("Interface\\Buttons\\UI-Quickslot2") + self.normalTexture:SetTexCoord(0, 0, 0, 0) + self.iconTex = texture + else + self.rangeTimer = nil + self.icon:Hide() + self.cooldown:Hide() + self.normalTexture:SetTexture("Interface\\Buttons\\UI-Quickslot") + self.normalTexture:SetTexCoord(-0.15, 1.15, -0.15, 1.17) + self.hotkey:SetVertexColor(0.6, 0.6, 0.6) + self.iconTex = nil + end if self.parent.config.hidemacrotext then self.macroName:Hide() else @@ -201,9 +317,16 @@ function Button:Update() end end -orig_ActionButton_UpdateHotkeys = ActionButton_UpdateHotkeys -ActionButton_UpdateHotkeys = function(...) if this.BT4 then Button.UpdateHotkey(this) else orig_ActionButton_UpdateHotkeys(...) end end -function Button:UpdateHotkey() +function Button:UpdateCount() + local action = self.action + if ( IsConsumableAction(action) or IsStackableAction(action) ) then + self.count:SetText(GetActionCount(action)) + else + self.count:SetText("") + end +end + +function Button:UpdateHotkeys() local key = self:GetHotkey() or "" local hotkey = self.hotkey @@ -275,20 +398,205 @@ function Button:GetActionName() return format(actionTmpl, self.parent.id, self.rid) end -function Button:ShowGrid() - if not self.gridShown then - self.gridShown = true - self:SetAttribute("showgrid", self:GetAttribute("showgrid") + 1) +function Button:UpdateState() + local action = self.action + if ( IsCurrentAction(action) or IsAutoRepeatAction(action) ) then + self:SetChecked(1) + else + self:SetChecked(0) end - ActionButton_ShowGrid(self) +end + +function Button:UpdateUsable(force) + local isUsable, notEnoughMana = IsUsableAction(self.action) + local icon, hotkey = self.icon, self.hotkey + if force or not oor then + oor = Bartender4.db.profile.outofrange + oorcolor, oomcolor = Bartender4.db.profile.colors.range, Bartender4.db.profile.colors.mana + end + + if oor == "button" and self.outOfRange then + icon:SetVertexColor(oorcolor.r, oorcolor.g, oorcolor.b) + hotkey:SetVertexColor(1.0, 1.0, 1.0) + else + if oor == "hotkey" and self.outOfRange then + hotkey:SetVertexColor(oorcolor.r, oorcolor.g, oorcolor.b) + else + hotkey:SetVertexColor(1.0, 1.0, 1.0) + end + + if isUsable then + icon:SetVertexColor(1.0, 1.0, 1.0) + elseif notEnoughMana then + icon:SetVertexColor(oomcolor.r, oomcolor.g, oomcolor.b) + else + icon:SetVertexColor(0.4, 0.4, 0.4) + end + end +end + +function Button:UpdateCooldown() + local start, duration, enable = GetActionCooldown(self.action) + CooldownFrame_SetTimer(self.cooldown, start, duration, enable) +end + +function Button:UpdateFlash() + local action = self.action + if ( (IsAttackAction(action) and IsCurrentAction(action)) or IsAutoRepeatAction(action) ) then + self:StartFlash() + else + self:StopFlash() + end +end + +function Button:StartFlash() + self.flashing = 1 + self.flashtime = 0 + self:UpdateState() +end + +function Button:StopFlash() + self.flashing = 0 + self.flash:Hide() + self:UpdateState() +end + +function Button:SetTooltip() + if ( GetCVar("UberTooltips") == "1" ) then + GameTooltip_SetDefaultAnchor(GameTooltip, self) + else + GameTooltip:SetOwner(self, "ANCHOR_RIGHT") + end + + if ( GameTooltip:SetAction(self.action) ) then + self.UpdateTooltip = self.SetTooltip + else + self.UpdateTooltip = nil + end +end + +function Button:ShowButton() + if self.Proxy:IsShown() then return end + self.pushedTexture:SetTexture(self.textureCache.pushed) + self.highlightTexture:SetTexture(self.textureCache.highlight) + + self.Proxy:Show() +end + +function Button:HideButton() + if not self.Proxy:IsShown() then return end + self.textureCache.pushed = self.pushedTexture:GetTexture() + self.textureCache.highlight = self.highlightTexture:GetTexture() + + self.pushedTexture:SetTexture("") + self.highlightTexture:SetTexture("") + + self.Proxy:Hide() +end + +function Button:ShowGrid() + self.showgrid = self.showgrid + 1 + + self:ShowButton() end function Button:HideGrid() - if self.gridShown then - self.gridShown = nil - self:SetAttribute("showgrid", self:GetAttribute("showgrid") - 1) + if self.showgrid > 0 then self.showgrid = self.showgrid - 1 end + if ( self.showgrid == 0 and not HasAction(self.action) and not self.parent.config.showgrid ) then + self:HideButton() + end +end + +function Button:RegisterButtonEvents() + self:RegisterEvent("ACTIONBAR_SLOT_CHANGED") + self:RegisterEvent("PLAYER_ENTERING_WORLD") + self:RegisterEvent("ACTIONBAR_PAGE_CHANGED") + self:RegisterEvent("ACTIONBAR_SHOWGRID") + self:RegisterEvent("ACTIONBAR_HIDEGRID") + self:RegisterEvent("UPDATE_BINDINGS") + self:RegisterEvent("UPDATE_SHAPESHIFT_FORM") +end + +local actionevents = { + "PLAYER_TARGET_CHANGED", + "ACTIONBAR_UPDATE_STATE", + "ACTIONBAR_UPDATE_USABLE", + "ACTIONBAR_UPDATE_COOLDOWN", + --"UPDATE_INVENTORY_ALERTS", + --"PLAYER_AURAS_CHANGED", + "CRAFT_SHOW", + "CRAFT_CLOSE", + "TRADE_SKILL_SHOW", + "TRADE_SKILL_CLOSE", + "PLAYER_ENTER_COMBAT", + "PLAYER_LEAVE_COMBAT", + "START_AUTOREPEAT_SPELL", + "STOP_AUTOREPEAT_SPELL", +} + +function Button:RegisterActionEvents() + if self.eventsregistered then return end + self.eventsregistered = true + + for _, event in ipairs(actionevents) do + self:RegisterEvent(event) + end +end + +function Button:UnregisterActionEvents() + if not self.eventsregistered then return end + self.eventsregistered = nil + + for _, event in ipairs(actionevents) do + self:UnregisterEvent(event) + end +end + +function Button:EventHandler(event, arg1) + if ( event == "ACTIONBAR_SLOT_CHANGED" ) then + if ( arg1 == 0 or arg1 == self.action ) then + self:Update() + end + elseif ( event == "PLAYER_ENTERING_WORLD" ) then + self:Update() + elseif ( event == "ACTIONBAR_PAGE_CHANGED" or event == "UPDATE_BONUS_ACTIONBAR" ) then + self:UpdateAction() + elseif ( event == "ACTIONBAR_SHOWGRID" ) then + self:ShowGrid() + elseif ( event == "ACTIONBAR_HIDEGRID" ) then + self:HideGrid() + elseif ( event == "UPDATE_BINDINGS" ) then + self:UpdateHotkeys() + elseif not self.eventsregistered then + return + -- Action Event Handlers, only set when the button actually has an action + elseif ( event == "PLAYER_TARGET_CHANGED" ) then + self.rangeTimer = -1 + elseif ( event == "ACTIONBAR_UPDATE_STATE" ) then + self:UpdateState() + elseif ( event == "ACTIONBAR_UPDATE_USABLE" ) then + self:UpdateUsable() + elseif ( event == "ACTIONBAR_UPDATE_COOLDOWN" ) then + self:UpdateCooldown() + elseif ( event == "CRAFT_SHOW" or event == "CRAFT_CLOSE" or event == "TRADE_SKILL_SHOW" or event == "TRADE_SKILL_CLOSE" ) then + self:UpdateState() + elseif ( event == "PLAYER_ENTER_COMBAT" ) then + if ( IsAttackAction(self.action) ) then + self:StartFlash() + end + elseif ( event == "PLAYER_LEAVE_COMBAT" ) then + if ( IsAttackAction(self.action) ) then + self:StopFlash() + end + elseif ( event == "START_AUTOREPEAT_SPELL" ) then + if ( IsAutoRepeatAction(self.action) ) then + self:StartFlash() + end + elseif ( event == "STOP_AUTOREPEAT_SPELL" ) then + if ( self.flashing == 1 and not IsAttackAction(self.action) ) then + self:StopFlash() + end end - ActionButton_HideGrid(self) end function Button:ClearSetPoint(...) diff --git a/Options.lua b/Options.lua index 118ab01..e9330bb 100644 --- a/Options.lua +++ b/Options.lua @@ -34,14 +34,14 @@ local function getOptions() get = function() return Bartender4.Locked end, set = function(info, value) Bartender4[value and "Lock" or "Unlock"](Bartender4) end, }, - --[[buttonlock = { + buttonlock = { order = 2, type = "toggle", name = "Button Lock", desc = "Lock the buttons.", get = getFunc, set = setFunc, - },--]] + }, bars = { order = 20, type = "group",