view ReAction.lua @ 1:c11ca1d8ed91

Version 0.1
author Flick <flickerstreak@gmail.com>
date Tue, 20 Mar 2007 21:03:57 +0000
parents
children 8e0ff8ae4c08
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"

-- ReAction addon setup via Ace 2
ReAction = AceLibrary("AceAddon-2.0"):new(
  "AceConsole-2.0",
  "AceEvent-2.0",
  "AceDB-2.0",
  "FuBarPlugin-2.0"
)

-- FuBar plugin setup
ReAction.hasIcon = false
ReAction.hasNoColor = true
ReAction.defaultPosition = "RIGHT"
ReAction.defaultMinimapPosition = 240 -- degrees
ReAction.OnMenuRequest = 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")
  
  AceLibrary("Dewdrop-2.0"):InjectAceOptionsTable(self, ReActionProfileMenuOptions)
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
  else
    self:SetupBars()
  end
end

function ReAction:OnDisable()
  self:Lock()
end

function ReAction:OnProfileEnable()
  -- handle profile switching
  self:SetupBars()
  self:Lock()
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 )
  self.locked = lock and true or false -- force data integrity
  if not self.locked then
    self:Print("Buttons disabled while unlocked")
  end
  for _, bar in ipairs(self.bars) do
    if self.locked then bar:HideControls() else bar:ShowControls() 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 )
  self.db.profile.hideArt = hide and true or false -- force data integrity
  self:HideArt()
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:Hide()
    f:ClearAllPoints()
    f:SetParent(ReActionButtonRecycler)
    f:UnregisterAllEvents()
  end
end


-- Reset bars to defaults
function ReAction:ResetBars()
  self.db.profile.bars = ReActionProfileDefaults.bars
  self:SetupBars()
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
  for id, info in ipairs(self.db.profile.bars) do
    if self.bars[id] then self.bars[id]:Destroy() end -- remove old version of bar if switching profiles
    self.bars[id] = ReBar:new(info, id)
  end
  
  -- remove excess bars
  while #self.bars > #self.db.profile.bars do
    table.remove(self.bars):Destroy()
  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 ipairs(self.bars) do
    bar:ApplyAnchor()
  end
end


function ReAction:NewBar()
  local c = ReActionBarConfigDefaults
  table.insert(self.bars, ReBar:new(c, #self.bars + 1))
  table.insert(self.db.profile.bars, c) 
  self:Unlock()
end


function ReAction:DeleteBar(id)
  if self.bars[id] then
    table.remove(self.bars, id):Destroy()
    table.remove( self.db.profile.bars, id )
  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", "ReAction bar lock", "text2", self.locked and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r")
	tablet:SetHint("|cffcc6600Shift-Click|r to toggle action bar lock. Right-click for options.")
end

function ReAction:OnClick(button)
	if IsShiftKeyDown() then
	  self:ToggleLocked()
	end
	self:UpdateDisplay()
end