Mercurial > wow > reaction
diff modules/ReAction_ConfigUI/ReAction_ConfigUI.lua @ 33:c54c481ad0ed
- Moved bar control frame from ConfigUI to Bar
- Added LICENSE.txt
- added profile management options
- other minor cleanup
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Thu, 03 Apr 2008 20:25:40 +0000 |
parents | 0d95ce7a9ec2 |
children | 11ddb9610770 |
line wrap: on
line diff
--- a/modules/ReAction_ConfigUI/ReAction_ConfigUI.lua Thu Apr 03 16:59:16 2008 +0000 +++ b/modules/ReAction_ConfigUI/ReAction_ConfigUI.lua Thu Apr 03 20:25:40 2008 +0000 @@ -1,38 +1,18 @@ --[[ ReAction Configuration UI module - This modules creates and manages ReAction configuration - elements, including: - - - Interface Options panel - - bar dragging and resizing control overlays - - contextual menus - - Individual modules are responsible for populating these - configuration elements via ReAction:RegisterOptions(). The - valid values of 'context' are: - - - 'global' : added to the Global Settings tab - - 'module' : added to the Module Settings tab - - 'bar' : added to the Bar Settings tab - - 'barMenu' : shown on the bar contextual menu - + Hooks into Blizzard Interface Options AddOns panel --]] -- local imports local ReAction = ReAction local L = ReAction.L -local _G = _G -local InCombatLockdown = InCombatLockdown - -local Dewdrop = AceLibrary("Dewdrop-2.0") -- module declaration local moduleID = "ConfigUI" -local module = ReAction:NewModule( moduleID, - "AceEvent-3.0" -) +local module = ReAction:NewModule( moduleID ) +-- options table basic layer module.configOptions = { type = "group", childGroups = "tab", @@ -94,19 +74,20 @@ profile = { } } ) - self:InitializeOptions() - LibStub("AceConfig-3.0"):RegisterOptionsTable("ReAction",self.configOptions) - LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ReAction", "ReAction") - self:RegisterEvent("PLAYER_REGEN_DISABLED") -end -function module:InitializeOptions() for _, m in pairs(ReAction:GetOptions("global")) do for k, v in pairs(m) do self.configOptions.args.global.args[k] = v end end + + self.configOptions.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(ReAction.db) + self.configOptions.args.profile.order = -2 + + LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("ReAction",self.configOptions) + LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ReAction", "ReAction") ReAction.RegisterCallback(self,"OnOptionsRegistered") + ReAction.RegisterCallback(self,"OnOptionsRefreshed") end function module:OnOptionsRegistered(evt, context, module, opts) @@ -125,420 +106,13 @@ end end -function module:PLAYER_REGEN_DISABLED() - if self.configMode == true then - UIErrorsFrame:AddMessage(L["ReAction config mode disabled during combat."]) - self:SetConfigMode(false) - end -end - -function module:SetConfigMode( mode ) - ReAction:CallMethodOnAllBars("ShowControls",mode) - ReAction:CallMethodOnAllModules("ApplyConfigMode",mode,ReAction.bars) - self.configMode = mode -end - -function module:ApplyConfigMode( mode, bars ) - if not(mode) then - -- close open dewdrop menu - local p = Dewdrop:GetOpenedParent() - if p then - for _, bar in pairs(bars) do - if bar then - if p == bar.controlFrame then - Dewdrop:Close() - end - end - end - end - end -end - -local function safecall(module, method, ...) - if module and type(module[method]) == "function" then - return module[method](method, ...) - end +function module:OnOptionsRefreshed(evt) + -- TODO: refresh options frame (just OpenConfig again?) end function module:OpenConfig(bar) - Dewdrop:Close() InterfaceOptionsFrame_OpenToFrame("ReAction") -end - -function module:ApplyToBar(bar) - if self.configMode then - bar:ShowControls(self.configMode) + if bar then + -- TODO: select the correct bar pane end end - -function module:RemoveFromBar(bar) - if bar.controlFrame then - bar.controlFrame:SetParent(UIParent) - bar.controlFrame:ClearAllPoints() - bar.controlFrame:Hide() - bar.controlFrame = nil - end -end - - - - - --- --- Bar config overlay --- --- import some of these for small OnUpdate performance boost -local Bar = ReAction.Bar.prototype -local GetSize = Bar.GetSize -local GetButtonSize = Bar.GetButtonSize -local GetButtonGrid = Bar.GetButtonGrid -local SetSize = Bar.SetSize -local SetButtonSize = Bar.SetButtonSize -local SetButtonGrid = Bar.SetButtonGrid -local ApplyAnchor = Bar.ApplyAnchor -local floor = math.floor -local min = math.min -local format = string.format -local GameTooltip = GameTooltip - -local function StoreExtents(bar) - local f = bar.frame - local point, relativeTo, relativePoint, x, y = f:GetPoint(1) - relativeTo = relativeTo or f:GetParent() - local anchorTo - for name, b in pairs(ReAction.bars) do - if b then - if b:GetFrame() == relativeTo then - anchorTo = name - break - end - end - end - anchorTo = anchorTo or relativeTo:GetName() - local c = bar.config - c.anchor = point - c.anchorTo = anchorTo - c.relativePoint = relativePoint - c.x = x - c.y = y - c.width, c.height = f:GetWidth(), f:GetHeight() -end - -local function RecomputeButtonSize(bar) - local w, h = GetSize(bar) - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - - local scaleW = (floor(w/c) - s) / bw - local scaleH = (floor(h/r) - s) / bh - local scale = min(scaleW, scaleH) - - SetButtonSize(bar, scale * bw, scale * bh, s) -end - -local function RecomputeButtonSpacing(bar) - local w, h = GetSize(bar) - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - - SetButtonGrid(bar,r,c,min(floor(w/c) - bw, floor(h/r) - bh)) -end - -local function RecomputeGrid(bar) - local w, h = GetSize(bar) - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - - SetButtonGrid(bar, floor(h/(bh+s)), floor(w/(bw+s)), s) -end - -local function ClampToButtons(bar) - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - SetSize(bar, (bw+s)*c, (bh+s)*r ) -end - -local function HideGameTooltip() - GameTooltip:Hide() -end - -local function CreateControls(bar) - local f = bar.frame - - f:SetMovable(true) - f:SetResizable(true) - f:SetClampedToScreen(true) - - -- buttons on the bar should be direct children of the bar frame. - -- The control elements need to float on top of this, which we could - -- do with SetFrameLevel() or Raise(), but it's more reliable to do it - -- via frame nesting, hence good old foo's appearance here. - local foo = CreateFrame("Frame",nil,f) - foo:SetAllPoints() - - local control = CreateFrame("Button", nil, foo) - control:EnableMouse(true) - control:SetToplevel(true) - control:SetPoint("TOPLEFT", -4, 4) - control:SetPoint("BOTTOMRIGHT", 4, -4) - control:SetBackdrop({ - edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", - tile = true, - tileSize = 16, - edgeSize = 16, - insets = { left = 0, right = 0, top = 0, bottom = 0 }, - }) - - -- textures - local bgTex = control:CreateTexture(nil,"BACKGROUND") - bgTex:SetTexture(0.7,0.7,1.0,0.2) - bgTex:SetPoint("TOPLEFT",4,-4) - bgTex:SetPoint("BOTTOMRIGHT",-4,4) - local hTex = control:CreateTexture(nil,"HIGHLIGHT") - hTex:SetTexture(0.7,0.7,1.0,0.2) - hTex:SetPoint("TOPLEFT",4,-4) - hTex:SetPoint("BOTTOMRIGHT",-4,4) - hTex:SetBlendMode("ADD") - - -- label - local label = control:CreateFontString(nil,"OVERLAY","GameFontNormalLarge") - label:SetAllPoints() - label:SetJustifyH("CENTER") - label:SetShadowColor(0,0,0,1) - label:SetShadowOffset(2,-2) - label:SetTextColor(1,1,1,1) - label:SetText(bar:GetName()) - label:Show() - bar.controlLabelString = label -- so that bar:SetName() can update it - - local StopResize = function() - f:StopMovingOrSizing() - f.isMoving = false - f:SetScript("OnUpdate",nil) - StoreExtents(bar) - ClampToButtons(bar) - ApplyAnchor(bar) - end - - -- edge drag handles - for _, point in pairs({"LEFT","TOP","RIGHT","BOTTOM"}) do - local edge = CreateFrame("Frame",nil,control) - edge:EnableMouse(true) - edge:SetWidth(8) - edge:SetHeight(8) - if point == "TOP" or point == "BOTTOM" then - edge:SetPoint(point.."LEFT") - edge:SetPoint(point.."RIGHT") - else - edge:SetPoint("TOP"..point) - edge:SetPoint("BOTTOM"..point) - end - local tex = edge:CreateTexture(nil,"HIGHLIGHT") - tex:SetTexture(1.0,0.82,0,0.7) - tex:SetBlendMode("ADD") - tex:SetAllPoints() - edge:RegisterForDrag("LeftButton") - edge:SetScript("OnMouseDown", - function() - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - f:SetMinResize( bw+s+1, bh+s+1 ) - f:StartSizing(point) - f:SetScript("OnUpdate", - function() - RecomputeGrid(bar) - bar:RefreshLayout() - end - ) - end - ) - edge:SetScript("OnMouseUp", StopResize) - edge:SetScript("OnEnter", - function() - GameTooltip:SetOwner(f, "ANCHOR_"..point) - GameTooltip:AddLine(L["Drag to add/remove buttons"]) - GameTooltip:Show() - end - ) - edge:SetScript("OnLeave", HideGameTooltip) - edge:Show() - end - - -- corner drag handles, again nested in an anonymous frame so that they are on top - local foo2 = CreateFrame("Frame",nil,control) - foo2:SetAllPoints(true) - for _, point in pairs({"BOTTOMLEFT","TOPLEFT","BOTTOMRIGHT","TOPRIGHT"}) do - local corner = CreateFrame("Frame",nil,foo2) - corner:EnableMouse(true) - corner:SetWidth(12) - corner:SetHeight(12) - corner:SetPoint(point) - local tex = corner:CreateTexture(nil,"HIGHLIGHT") - tex:SetTexture(1.0,0.82,0,0.7) - tex:SetBlendMode("ADD") - tex:SetAllPoints() - corner:RegisterForDrag("LeftButton","RightButton") - local updateTooltip = function() - local size, size2 = bar:GetButtonSize() - local rows, cols, spacing = bar:GetButtonGrid() - size = (size == size2) and tostring(size) or format("%dx%d",size,size2) - GameTooltipTextRight4:SetText(size) - GameTooltipTextRight5:SetText(tostring(spacing)) - end - corner:SetScript("OnMouseDown", - function(_,btn) - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - if btn == "LeftButton" then -- button resize - f:SetMinResize( (s+12)*c+1, (s+12)*r+1 ) - f:SetScript("OnUpdate", - function() - RecomputeButtonSize(bar) - bar:RefreshLayout() - updateTooltip() - end - ) - elseif btn == "RightButton" then -- spacing resize - f:SetMinResize( bw*c, bh*r ) - f:SetScript("OnUpdate", - function() - RecomputeButtonSpacing(bar) - bar:RefreshLayout() - updateTooltip() - end - ) - end - f:StartSizing(point) - end - ) - corner:SetScript("OnMouseUp",StopResize) - corner:SetScript("OnEnter", - function() - GameTooltip:SetOwner(f, "ANCHOR_"..point) - GameTooltip:AddLine(L["Drag to resize buttons"]) - GameTooltip:AddLine(L["Right-click-drag"]) - GameTooltip:AddLine(L["to change spacing"]) - local size, size2 = bar:GetButtonSize() - local rows, cols, spacing = bar:GetButtonGrid() - size = (size == size2) and tostring(size) or format("%dx%d",size,size2) - GameTooltip:AddDoubleLine(L["Size:"], size) - GameTooltip:AddDoubleLine(L["Spacing:"], tostring(spacing)) - GameTooltip:Show() - end - ) - corner:SetScript("OnLeave", - function() - GameTooltip:Hide() - f:SetScript("OnUpdate",nil) - end - ) - - end - - control:RegisterForDrag("LeftButton") - control:RegisterForClicks("RightButtonDown") - - control:SetScript("OnDragStart", - function() - f:StartMoving() - f.isMoving = true - -- TODO: snap indicator update install - end - ) - - control:SetScript("OnDragStop", - function() - f:StopMovingOrSizing() - f.isMoving = false - f:SetScript("OnUpdate",nil) - -- TODO: snap frame here - StoreExtents(bar) - end - ) - - control:SetScript("OnEnter", - function() - -- add bar type and status information to name - local name = bar.name - for _, m in ReAction:IterateModules() do - local suffix = safecall(m,"GetBarNameModifier",bar) - if suffix then - name = ("%s %s"):format(name,suffix) - end - end - - GameTooltip:SetOwner(f, "ANCHOR_TOPRIGHT") - GameTooltip:AddLine(name) - GameTooltip:AddLine(L["Drag to move"]) - --GameTooltip:AddLine(L["Shift-drag for sticky mode"]) - GameTooltip:AddLine(L["Right-click for options"]) - GameTooltip:Show() - end - ) - - control:SetScript("OnLeave", HideGameTooltip) - - control:SetScript("OnClick", - function() - bar:ShowMenu() - end - ) - - return control -end - -function Bar:ShowControls(show) - if show then - if not self.controlFrame then - self.controlFrame = CreateControls(self) - end - self.controlFrame:Show() - elseif self.controlFrame then - self.controlFrame:Hide() - end -end - -function Bar:ShowMenu() - if not self.menuOpts then - self.menuOpts = { - type = "group", - args = { - openConfig = { - type = "execute", - name = L["Configure..."], - desc = L["Open the configuration dialogue for this bar"], - func = function() module:OpenConfig(self) end, - disabled = InCombatLockdown, - order = 1 - }, - delete = { - type = "execute", - name = L["Delete Bar"], - desc = L["Remove the bar from the current profile"], - func = function() ReAction:EraseBar(self) end, - order = 2 - }, - } - } - end - if self.modMenuOpts == nil then - self.modMenuOpts = { } - end - for _, m in ReAction:IterateModules() do - local opts = safecall(m,"GetBarMenuOptions",self,module) - if opts then - for k, v in pairs(opts) do - self.menuOpts.args[k] = v - end - end - end - Dewdrop:Open(self.controlFrame, "children", self.menuOpts, "cursorX", true, "cursorY", true) -end - -local Bar_SuperSetName = Bar.SetName -function Bar:SetName(name) - Bar_SuperSetName(self,name) - if self.controlLabelString then - self.controlLabelString:SetText(self.name) - end -end