diff ReAction.lua @ 28:21bcaf8215ff

- converted to Ace3 - rearranged file layout - configGUI menus not working right now
author Flick <flickerstreak@gmail.com>
date Mon, 17 Mar 2008 18:24:53 +0000
parents f1e838841ce1
children 0d95ce7a9ec2
line wrap: on
line diff
--- a/ReAction.lua	Tue Mar 11 21:39:34 2008 +0000
+++ b/ReAction.lua	Mon Mar 17 18:24:53 2008 +0000
@@ -1,95 +1,19 @@
---[[
-  ReAction Add-On main file. 
-  Performs add-on and library initialization and setup.
---]]
+-- ReAction.lua
+-- See modules/ReAction_ModuleTemplate for Module API listing
+-- See Bar.lua for Bar object listing
 
------- LOCALIZATION ----------
-local L = AceLibrary("AceLocale-2.2"):new("ReAction")
-
-
------- GLOBAL VARIABLES ------
--- 'ReAction' is exported as a global.
-ReAction = AceLibrary("AceAddon-2.0"):new(
-  "AceModuleCore-2.0",
-  "AceEvent-2.0",
-  "AceDB-2.0"
-)
--- global variable strings for integration with WoW keybindings dialog (see bindings.xml)
-BINDING_HEADER_REACTION             = L["ReAction"]
-BINDING_NAME_REACTION_TOGGLELOCK    = L["Toggle ReAction Bar Lock"]
-BINDING_NAME_REACTION_TOGGLEKEYBIND = L["ReAction Keybinding Mode"]
-
+------ LIBRARIES ------
+local L = LibStub("AceLocale-3.0"):GetLocale("ReAction")
 
 ------ CORE ------
-local ReAction = ReAction
+local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction" )
 ReAction.revision = tonumber(("$Revision: 1 $"):match("%d+"))
 ReAction.L = L
 
+------ GLOBALS ------
+_G["ReAction"] = ReAction
 
-
--- from AceAddon-2.0
-function ReAction:OnInitialize()
-  self:RegisterDB("ReActionDB")
-end
-
--- from AceAddon-2.0
-function ReAction:OnEnable()
-
-end
-
--- from AceAddon-2.0
-function ReAction:OnDisable()
-
-end
-
--- from AceDB-2.0
-function ReAction:OnProfileEnable()
-
-end
-
--- from AceDB-2.0
-function ReAction:OnProfileDisable()
-
-end
-
--- from AceModuleCore-2.0
-function ReAction:OnModuleEnable(module)
-  -- this handles initialization ordering issues with ReAction_Bar
-  local barMod = self:GetModule("Bar")
-  if barMod and module.ApplyToBar then
-    for _, b in pairs(barMod.bars) do
-      if b then
-        module:ApplyToBar(b)
-      end
-    end
-  end
-end
-
--- from AceModuleCore-2.0
-function ReAction:OnModuleDisable(module)
-  local barMod = self:GetModule("Bar")
-  if barMod and module.RemoveFromBar then
-    for _, b in pairs(barMod.bars) do
-      if b then
-        module:RemoveFromBar(b)
-      end
-    end
-  end
-end
-
---[[
-  Module API (see bar.lua for usage)
-
-  module:ApplyToBar(bar)
-  module:RemoveFromBar(bar)
-  module:RefreshBar(bar)
-  module:ApplyConfigMode(mode,listOfBars)
-  module:GetBarNameModifier(bar)
-  module:EraseBarConfig(barName)
-]]--
-
-
--- debugging
+------ DEBUGGING ------
 ReAction.debug = true
 if ReAction.debug then
   ReAction.print = function(msg)
@@ -100,3 +24,204 @@
   ReAction.print = function() end
 end
 
+------ PRIVATE ------
+local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, SafeCall, CheckMethod
+do
+  local pcall = pcall
+  local geterrorhandler = geterrorhandler
+
+  SelectBar = function(x)
+    local bar, name
+    if type(x) == "string" then
+      name = x
+      bar = ReAction:GetBar(name)
+    elseif ReAction.Bar:IsInstance(x) then
+      bar = x
+      for k,v in pairs(ReAction.bars) do
+        if v == bar then
+          name = k
+        end
+      end
+    else
+      error("bad argument to SelectBar")
+    end
+    return bar, name
+  end
+
+  DestroyBar = function(x)
+    local bar, name = SelectBar(x)
+    if name and bar then
+      ReAction.bars[name] = nil
+      ReAction:CallMethodOnAllModules("RemoveFromBar", bar)
+      bar:Destroy()
+    end
+  end
+
+  InitializeBars = function ()
+    if not(ReAction.inited) then
+      for name, config in pairs(ReAction.db.profile.bars) do
+        if config then
+          ReAction:CreateBar(name, config)
+        end
+      end
+      ReAction:CallMethodOnAllBars("ApplyAnchor") -- re-anchor in the case of oddball ordering
+      ReAction.inited = true
+    end
+  end
+
+  TearDownBars = function()
+    for name, bar in pairs(ReAction.bars) do
+      if bar then
+        ReAction.bars[name] = DestroyBar(bar)
+      end
+    end
+    ReAction.inited = false
+  end
+
+  DeepCopy = function(x)
+    if type(x) ~= "table" then
+      return x
+    end
+    local r = {}
+    for k,v in pairs(x) do
+      r[k] = DeepCopy(v)
+    end
+    return r
+  end
+
+  SafeCall = function(f, ...)
+    if f then
+      local success, err = pcall(f,...)
+      if not success then
+        geterrorhandler()(err)
+      end
+    end
+  end
+
+  CheckMethod = function(m)
+    if type(m) == "function" then
+      return m
+    end
+    if type(m) ~= "string" then
+      error("Invalid method")
+    end
+  end
+end
+
+
+------ HANDLERS ------
+function ReAction:OnInitialize()
+  self.db = LibStub("AceDB-3.0"):New("ReAction_DB", 
+    { 
+      profile = {
+        bars = { },
+        defaultBar = { }
+      }
+    }
+    -- default profile is character-specific
+  )
+  self.db.RegisterCallback(self,"OnProfileChanged")
+
+  self.bars = {}
+end
+
+function ReAction:OnEnable()
+  InitializeBars()
+end
+
+function ReAction:OnDisable()
+  TearDownBars()
+end
+
+function ReAction:OnProfileChanged()
+  self.TearDownBars()
+  self.InitializeBars()
+end
+
+function ReAction:OnModuleEnable(module)
+  if module.ApplyToBar then
+    for _, b in pairs(bars) do
+      if b then
+        module:ApplyToBar(b)
+      end
+    end
+  end
+end
+
+function ReAction:OnModuleDisable(module)
+  if module.RemoveFromBar then
+    for _, b in pairs(bars) do
+      if b then
+        module:RemoveFromBar(b)
+      end
+    end
+  end
+end
+
+
+------ API ------
+function ReAction:CallMethodOnAllModules(method, ...)
+  local m = CheckMethod(method)
+  for _, x in self:IterateModules() do
+    if x then
+      SafeCall(m or x[method], x, ...)
+    end
+  end
+end
+
+function ReAction:CallMethodOnAllBars(method,...)
+  local m = CheckMethod(method)
+  for _, x in pairs(self.bars) do
+    if x then
+      SafeCall(m or x[method], x, ...)
+    end
+  end
+end
+
+function ReAction:CreateBar(name, defaultConfig, prefix)
+  local profile = self.db.profile
+  defaultConfig = defaultConfig or profile.defaultBar
+  prefix = prefix or L["Bar "]
+  if not name then
+    i = 1
+    repeat
+      name = prefix..i
+      i = i + 1
+    until self.bars[name] == nil
+  end
+  profile.bars[name] = profile.bars[name] or DeepCopy(defaultConfig)
+  local bar = self.Bar:new( name, profile.bars[name] )  -- ReAction.Bar defined in Bar.lua
+  self:CallMethodOnAllModules("ApplyToBar", bar)
+  self.bars[name] = bar
+  return bar
+end
+
+function ReAction:EraseBar(x)
+  local bar, name = SelectBar(x)
+  if name and bar then
+    DestroyBar(bar)
+    self.db.profile.bars[name] = nil
+    self:CallMethodOnAllModules("EraseBarConfig", name)
+  end
+end
+
+function ReAction:GetBar(name)
+  return self.bars[name]
+end
+
+function ReAction:RenameBar(x, newname)
+  local bar, name = SelectBar(x)
+  if bar and name and newname then
+    if self.bars[newname] then
+      error(L["ReAction: name already in use"])
+    end
+    self.bars[newname] = self.bars[name]
+    self.bars[name] = nil
+    bar.name = newname or ""
+    local cfg = self.db.profile.bars
+    cfg[newname], cfg[name] = cfg[name], nil
+    self:CallMethodOnAllModules("RenameBarConfig", name, newname)
+  end
+end
+
+