Mercurial > wow > reaction
view ReAction.lua @ 2:8e0ff8ae4c08
Version 0.2
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Tue, 20 Mar 2007 21:08:31 +0000 |
parents | c11ca1d8ed91 |
children |
line wrap: on
line source
-- ReAction.lua -- -- Top-level file for the ReAction Action Bar add-on -- -- ReAction is implemented in terms of the Ace 2 library: http://www.wowace.com -- -- key binding label constants BINDING_HEADER_REACTION = "ReAction" BINDING_NAME_REACTION_TOGGLELOCK = "Lock/Unlock ReAction Bars" BINDING_NAME_REBINDER_TOGGLEBINDINGMODE = "Toggle ReAction keybinding mode" -- ReAction addon setup via Ace 2 ReAction = AceLibrary("AceAddon-2.0"):new( "AceConsole-2.0", "AceEvent-2.0", "AceDB-2.0", "FuBarPlugin-2.0" ) local function tcopy(t) local r = { } for k, v in pairs(t) do r[k] = (type(v) == "table" and tcopy(v) or v) end return r end -- FuBar plugin setup ReAction.hasIcon = false ReAction.hasNoColor = true ReAction.hideMenuTitle = true ReAction.defaultPosition = "RIGHT" ReAction.defaultMinimapPosition = 240 -- degrees ReAction.OnMenuRequest = tcopy(ReActionGlobalMenuOptions) -- initial non-persistent state ReAction.locked = true -- localization -- local L = AceLibrary("AceLocale-2.0"):new("ReAction") -- Event handling function ReAction:OnInitialize() self:RegisterChatCommand( {"/reaction", "/rxn"}, ReActionConsoleOptions, "REACTION" ) self:RegisterDB("ReActionDB","ReActionDBPC") self:RegisterDefaults("profile", ReActionProfileDefaults) self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown") self:RegisterEvent("PLAYER_ENTERING_WORLD","HideDefaultBars") end function ReAction:OnEnable() if self.db.profile.firstRunDone ~= true then -- Do some "first-run" setup self.db.profile.firstRunDone = true elseif self.db.profile.disabled == true then -- print some kind of a warning end self:SetupBars() end function ReAction:OnDisable() self:Lock() end function ReAction:OnProfileEnable() -- handle profile switching self:Lock() self:SetupBars() end function ReAction:CombatLockdown() if not self:IsLocked() then self:Lock() UIErrorsFrame:AddMessage("ReAction bars locked when in combat") end end -- lock/unlock ReAction function ReAction:SetLocked( lock ) if lock ~= self.locked then if not lock then self:Print("Buttons disabled while unlocked") end if not lock and InCombatLockdown() then UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) else self.locked = lock and true or false -- force data integrity for _, bar in pairs(self.bars) do if self.locked then bar:HideControls() else bar:ShowControls() end end end end end function ReAction:IsLocked() return self.locked end function ReAction:Lock() self:SetLocked(true) end function ReAction:Unlock() self:SetLocked(false) end function ReAction:ToggleLocked() ReAction:SetLocked( not(self.locked) ) end -- Hide the default Blizzard main bar artwork function ReAction:HideArt() if self.db.profile.hideArt then MainMenuBar:Hide() -- this also hides the bags, xp bar, lag meter, and micro menu buttons. else MainMenuBar:Show() end end function ReAction:IsArtHidden() return self.db.profile.hideArt end function ReAction:SetHideArt( hide ) if InCombatLockdown() then UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) else self.db.profile.hideArt = hide and true or false -- force data integrity self:HideArt() end end function ReAction:ToggleHideArt() self:SetHideArt( not self:IsArtHidden() ) end -- Keybinding color coding function ReAction:SetKeyColorCoding( cc ) self.db.profile.keyColorCode = cc end function ReAction:IsKeyColorCodeEnabled() return self.db.profile.keyColorCode end function ReAction:ToggleKeyColorCoding() self:SetKeyColorCoding(not self.db.profile.keyColorCode) end -- Hide default Blizzard bars local blizzDefaultBars = { ActionButton1, ActionButton2, ActionButton3, ActionButton4, ActionButton5, ActionButton6, ActionButton7, ActionButton8, ActionButton9, ActionButton10, ActionButton11, ActionButton12, BonusActionBarFrame, MultiBarLeft, MultiBarRight, MultiBarBottomLeft, MultiBarBottomRight } function ReAction:HideDefaultBars() for _, f in pairs(blizzDefaultBars) do f:UnregisterAllEvents() f:Hide() f:SetParent(ReActionButtonRecycler) -- I mean it! f:ClearAllPoints() -- no, I really mean it! end end -- Reset bars to defaults function ReAction:ResetBars() if InCombatLockdown() then UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) else self.db.profile.bars = ReActionProfileDefaults.bars self:SetupBars() end end -- re-sync action IDs function ReAction:ResyncActionIDs() -- TODO end -- Bar manipulation ReAction.bars = { } function ReAction:SetupBars() -- hide the default Blizzard art, if configued self:HideArt() -- hide the default Blizzard bars self:HideDefaultBars() -- set up the bars from the profile -- note the use of table.maxn rather than # or ipairs: -- our array of bars can in fact contain holes for id = 1, table.maxn(self.db.profile.bars) do local config = self.db.profile.bars[id] if self.bars[id] then self.bars[id]:Destroy() -- remove old version of bar if switching profiles end if config then self.bars[id] = ReBar:new(config, id) end end -- remove excess bars for id = table.maxn(self.db.profile.bars) + 1, table.maxn(self.bars) do if self.bars[id] then self.bars[id]:Destroy() self.bars[id] = nil end end -- anchor the bars, have to do this in a second pass because -- they might be anchored to each other in a non-ordered way for _, bar in pairs(self.bars) do bar:ApplyAnchor() end end function ReAction:NewBar() if InCombatLockdown() then UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) else local c = tcopy(ReActionBarConfigDefaults) local bar = ReBar:new(c, #self.bars+1) table.insert(self.bars, bar) table.insert(self.db.profile.bars, c) if not self.locked then bar:ShowControls() end end end function ReAction:DeleteBar(id) if InCombatLockdown() then UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) else if self.bars[id] then -- we can't do tremove because each bar ID is encoded into the -- frame names as they're created. Need a nil entry in the table. -- The nice thing is that table.insert in NewBar() will automatically -- find the first nil slot. self.bars[id]:Destroy() self.bars[id] = nil self.db.profile.bars[id] = nil end end end function ReAction:ToggleActionID() if self.showActionIDs then ReActionButton:HideAllActionIDs() else ReActionButton:ShowAllActionIDs() end self.showActionIDs = not self.showActionIDs end function ReAction:IsActionIDVisible() return self.showActionIDs end -- FuBar plugin methods local tablet = AceLibrary("Tablet-2.0") function ReAction:OnTooltipUpdate() local c = tablet:AddCategory("columns", 2) c:AddLine("text", "Bar lock", "text2", self.locked and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") c:AddLine("text", "Button lock", "text2", LOCK_ACTIONBAR == "1" and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") c:AddLine("text", "Kebinding mode", "text2", ReBinder:IsEnabled() and "|cff33ff33On|r" or "|cffffcc00Off|r") tablet:SetHint("|cffffcc00Shift-Click|r for bar lock|n".. "|cff33ff33Alt-Click|r for keybindings|n".. "Right-click for menu") end function ReAction:OnClick(button) if IsShiftKeyDown() then self:ToggleLocked() self:UpdateDisplay() elseif IsAltKeyDown() then ReBinder:ToggleEnabled() end end