# HG changeset patch # User Flick # Date 1231376247 0 # Node ID 410d036c43b2233fbbd7aefd53c53eb02200d606 # Parent b2fb8f7dc780ae8f964acab3d6a61fb318c6416f - reorganize modularity file structure (part 1) diff -r b2fb8f7dc780 -r 410d036c43b2 Bar.lua --- a/Bar.lua Wed Jan 07 00:57:02 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,245 +0,0 @@ -local ReAction = ReAction -local L = ReAction.L -local _G = _G -local CreateFrame = CreateFrame -local floor = math.floor -local fmod = math.fmod -local format = string.format - -ReAction:UpdateRevision("$Revision$") - -local Bar = { } -local proto = { __index = Bar } -local weak = { __mode = "k" } - -ReAction.Bar = Bar -- export to ReAction - -function Bar:New( name, config ) - if type(config) ~= "table" then - error("ReAction.Bar: config table required") - end - - -- create new self - self = setmetatable( - { - config = config, - name = name, - buttons = setmetatable( { }, weak ), - width = config.width or 480, - height = config.height or 40 - }, - proto ) - - -- The frame type is 'Button' in order to have an OnClick handler. However, the frame itself is - -- not mouse-clickable by the user. - local parent = config.parent and (ReAction:GetBar(config.parent) or _G[config.parent]) or UIParent - local f = CreateFrame("Button", name and format("ReAction-%s",name), parent, - "SecureHandlerStateTemplate, SecureHandlerClickTemplate") - f:SetFrameStrata("MEDIUM") - f:SetWidth(self.width) - f:SetWidth(self.height) - f:SetAlpha(config.alpha or 1.0) - f:Show() - f:EnableMouse(false) - f:SetClampedToScreen(true) - - -- Override the default frame accessor to provide strict read-only access - function self:GetFrame() - return f - end - - self:ApplyAnchor() - ReAction.RegisterCallback(self, "OnConfigModeChanged") - - return self -end - -function Bar:Destroy() - local f = self:GetFrame() - f:UnregisterAllEvents() - ReAction.UnregisterAllCallbacks(self) - f:Hide() - f:SetParent(UIParent) - f:ClearAllPoints() -end - -function Bar:OnConfigModeChanged(event, mode) - self:ShowControls(mode) -- Bar:ShowControls() defined in Overlay.lua -end - -function Bar:ApplyAnchor() - local f = self:GetFrame() - local c = self.config - local p = c.point - - f:SetWidth(c.width) - f:SetHeight(c.height) - f:ClearAllPoints() - - if p then - local a = f:GetParent() - if c.anchor then - local bar = ReAction:GetBar(c.anchor) - if bar then - a = bar:GetFrame() - else - a = _G[c.anchor] - end - end - local fr = a or f:GetParent() - f:SetPoint(p, a or f:GetParent(), c.relpoint, c.x or 0, c.y or 0) - else - f:SetPoint("CENTER") - end -end - -function Bar:SetAnchor(point, frame, relativePoint, x, y) - local c = self.config - c.point = point or c.point - c.anchor = frame or c.anchor - c.relpoint = relativePoint or c.relpoint - c.x = x or c.x - c.y = y or c.y - self:ApplyAnchor() - ReAction:RefreshBar(self) -end - -function Bar:GetAnchor() - local c = self.config - return (c.point or "CENTER"), - (c.anchor or self:GetFrame():GetParent():GetName()), - (c.relpoint or c.point or "CENTER"), - (c.x or 0), - (c.y or 0) -end - -function Bar:GetSize() - local f = self:GetFrame() - return f:GetWidth(), f:GetHeight() -end - -function Bar:SetSize(w,h) - local f = self:GetFrame() - self.config.width = w - self.config.height = h - f:SetWidth(w) - f:SetHeight(h) -end - -function Bar:GetButtonSize() - local w = self.config.btnWidth or 32 - local h = self.config.btnHeight or 32 - -- TODO: get from modules? - return w,h -end - -function Bar:SetButtonSize(w,h) - if w > 0 and h > 0 then - self.config.btnWidth = w - self.config.btnHeight = h - end - ReAction:RefreshBar(self) -end - -function Bar:GetButtonGrid() - local cfg = self.config - local r = cfg.btnRows or 1 - local c = cfg.btnColumns or 1 - local s = cfg.spacing or 4 - return r,c,s -end - -function Bar:GetNumButtons() - local r,c = self:GetButtonGrid() - return r*c -end - -function Bar:SetButtonGrid(r,c,s) - if r > 0 and c > 0 and s > 0 then - local cfg = self.config - cfg.btnRows = r - cfg.btnColumns = c - cfg.spacing = s - end - ReAction:RefreshBar(self) -end - -function Bar:ClipNButtons( n ) - local cfg = self.config - local r = cfg.btnRows or 1 - local c = cfg.btnColumns or 1 - - cfg.btnRows = ceil(n/c) - cfg.btnColumns = min(n,c) -end - -function Bar:GetName() - return self.name -end - -function Bar:GetFrame() - -- this method is included for documentation purposes. It is overridden - -- for each object in the :New() method. - error("Invalid Bar object: used without initialization") -end - --- only ReAction:RenameBar() should call this function. Calling from any other --- context will desync the bar list in the ReAction class. -function Bar:SetName(name) - self.name = name - self:SetLabel(self.name) -- Bar:SetLabel() defined in Overlay.lua -end - -function Bar:GetAlpha() - return self.config.alpha or 1.0 -end - -function Bar:SetAlpha(value) - self.config.alpha = value - self:GetFrame():SetAlpha(value or 1.0) - ReAction:RefreshBar(self) -end - -function Bar:AddButton(idx, button) - local f = self:GetFrame() - - -- store in a weak reverse-index array - self.buttons[button] = idx - - -- Store a properly wrapped reference to the child frame as an attribute - -- (accessible via "frameref-btn#") - f:SetFrameRef(format("btn%d",idx), button:GetFrame()) -end - -function Bar:RemoveButton(button) - local idx = self.buttons[button] - if idx then - self:GetFrame():SetAttribute(format("frameref-btn%d",idx),nil) - self.buttons[button] = nil - end -end - --- iterator returns button, idx and does NOT iterate in index order -function Bar:IterateButtons() - return pairs(self.buttons) -end - -function Bar:PlaceButton(button, baseW, baseH) - local idx = self.buttons[button] - if idx then - local r, c, s = self:GetButtonGrid() - local bh, bw = self:GetButtonSize() - local row, col = floor((idx-1)/c), fmod((idx-1),c) -- zero-based - local x, y = col*bw + (col+0.5)*s, -(row*bh + (row+0.5)*s) - local scale = bw/baseW - local b = button:GetFrame() - - b:ClearAllPoints() - b:SetPoint("TOPLEFT",x/scale,y/scale) - b:SetScale(scale) - end -end - -function Bar:SkinButton() - -- does nothing by default -end \ No newline at end of file diff -r b2fb8f7dc780 -r 410d036c43b2 Bindings.lua --- a/Bindings.lua Wed Jan 07 00:57:02 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -local L = LibStub("AceLocale-3.0"):GetLocale("ReAction") -local _G = _G - -_G["BINDING_HEADER_REACTION"] = L["ReAction"] - -_G["BINDING_NAME_REACTION_TOGGLELOCK"] = L["Toggle ReAction Bar Lock"] -_G["BINDING_NAME_REACTION_TOGGLEKEYBIND"] = L["ReAction Keybinding Mode"] diff -r b2fb8f7dc780 -r 410d036c43b2 LDB.lua --- a/LDB.lua Wed Jan 07 00:57:02 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -local ReAction = ReAction -local L = ReAction.L -local format = string.format - --- Export ReAction launcher to LibDataBroker-aware displays -LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject( "ReAction", - { - type = "launcher", - icon = "Interface\\Icons\\INV_Qiraj_JewelEncased", - - OnClick = function( frame, button ) - if not InCombatLockdown() then - if IsAltKeyDown() then - ReAction:SetKeybindMode( not ReAction:GetKeybindMode() ) - elseif IsShiftKeyDown() then - ReAction:SetConfigMode( not ReAction:GetConfigMode() ) - elseif button == "RightButton" then - ReAction:ShowEditor() - else - ReAction:ShowConfig() - end - else - ReAction:UserError(L["ReAction: can't configure in combat"]) - end - end, - - -- this isn't included in the 'launcher' type LDB spec but it seems all launcher displays use it - OnTooltipShow = function( tooltip ) - tooltip:AddLine(format("|cffffffff%s|r %s",L["Click"],L["for global configuration"])) - tooltip:AddLine(format("|cffffd200%s|r %s",L["Right-click"],L["for bar editor dialog"])) - tooltip:AddLine(format("|cff00ff00%s|r %s",L["Shift-click"],L["to unlock bars"])) - tooltip:AddLine(format("|cff00cccc%s|r %s",L["Alt-click"],L["for keybind mode"])) - end, - - } -) diff -r b2fb8f7dc780 -r 410d036c43b2 Overlay.lua --- a/Overlay.lua Wed Jan 07 00:57:02 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,769 +0,0 @@ -local ReAction = ReAction -local L = ReAction.L -local CreateFrame = CreateFrame -local InCombatLockdown = InCombatLockdown -local floor = math.floor -local min = math.min -local format = string.format -local GameTooltip = GameTooltip -local Bar = ReAction.Bar -local GetSize = Bar.GetSize -local SetSize = Bar.SetSize -local GetButtonSize = Bar.GetButtonSize -local GetButtonGrid = Bar.GetButtonGrid -local SetButtonSize = Bar.SetButtonSize -local SetButtonGrid = Bar.SetButtonGrid -local ApplyAnchor = Bar.ApplyAnchor -local GameTooltipTextRight1 = GameTooltipTextRight1 -local GameTooltipTextRight2 = GameTooltipTextRight2 -local GameTooltipTextRight3 = GameTooltipTextRight3 - -local KB = LibStub("LibKeyBound-1.0") - -ReAction:UpdateRevision("$Revision$") - - --- --- Wrap some of the bar manipulators to make them state-aware --- -local function SetAnchor( bar, point, frame, relPoint, x, y ) - local state = bar:GetState() - if state then - local anchorstate = bar:GetStateProperty(state, "anchorEnable") - if anchorstate then - bar:SetStateProperty(state, "anchorFrame", frame) - bar:SetStateProperty(state, "anchorPoint", point) - bar:SetStateProperty(state, "anchorRelPoint", relPoint) - bar:SetStateProperty(state, "anchorX", x or 0) - bar:SetStateProperty(state, "anchorY", y or 0) - bar:SetAnchor(bar:GetAnchor()) - return - end - end - bar:SetAnchor(point, frame, relPoint, x, y) -end - -local function GetStateScale( bar ) - local state = bar:GetState() - if state and bar:GetStateProperty(state, "enableScale") then - return bar:GetStateProperty(state, "scale") - end -end - -local function SetStateScale( bar, scale ) - local state = bar:GetState() - if state and bar:GetStateProperty(state, "enableScale") then - bar:SetStateProperty(state, "scale", scale) - end -end - - --- --- Bar config overlay --- - -local function GetNormalTextColor() - return 1.0, 1.0, 1.0, 1.0 -end - -local function GetAnchoredTextColor() - return 1.0, 1.0, 1.0, 1.0 -end - -local function GetNormalBgColor() - return 0.7, 0.7, 1.0, 0.3 -end - -local function GetAnchoredBgColor() - return 0.9, 0.2, 0.7, 0.3 -end - -local function StoreSize(bar) - local f = bar:GetFrame() - SetSize( bar, f:GetWidth(), f:GetHeight() ) -end - -local function StoreExtents(bar) - local f = bar:GetFrame() - local p, fr, rp, x, y = f:GetPoint(1) - fr = fr and fr:GetName() or "UIParent" - SetAnchor( bar, p, fr, rp, x, y ) - SetSize( bar, 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 ComputeBarScale(bar) - local w, h = bar.controlFrame:GetWidth() - 8, bar.controlFrame:GetHeight() - 8 - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - - local scaleW = w / (c*(bw+s)) - local scaleH = h / (r*(bh+s)) - local scale = min(scaleW, scaleH) - - if scale > 2.5 then - scale = 2.5 - elseif scale < 0.25 then - scale = 0.25 - end - - return scale -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 + 1, (bh+s)*r + 1) -end - -local function HideGameTooltip() - GameTooltip:Hide() -end - -local anchorInside = { inside = true } -local anchorOutside = { outside = true } -local edges = { "BOTTOM", "TOP", "LEFT", "RIGHT" } -local oppositeEdges = { - TOP = "BOTTOM", - BOTTOM = "TOP", - LEFT = "RIGHT", - RIGHT = "LEFT" -} -local pointsOnEdge = { - BOTTOM = { "BOTTOM", "BOTTOMLEFT", "BOTTOMRIGHT", }, - TOP = { "TOP", "TOPLEFT", "TOPRIGHT", }, - RIGHT = { "RIGHT", "BOTTOMRIGHT", "TOPRIGHT", }, - LEFT = { "LEFT", "BOTTOMLEFT", "TOPLEFT", }, -} -local edgeSelector = { - BOTTOM = 1, -- select x of x,y - TOP = 1, -- select x of x,y - LEFT = 2, -- select y of x,y - RIGHT = 2, -- select y of x,y -} -local snapPoints = { - [anchorOutside] = { - BOTTOMLEFT = {"BOTTOMRIGHT","TOPLEFT","TOPRIGHT"}, - BOTTOM = {"TOP"}, - BOTTOMRIGHT = {"BOTTOMLEFT","TOPRIGHT","TOPLEFT"}, - RIGHT = {"LEFT"}, - TOPRIGHT = {"TOPLEFT","BOTTOMRIGHT","BOTTOMLEFT"}, - TOP = {"BOTTOM"}, - TOPLEFT = {"TOPRIGHT","BOTTOMLEFT","BOTTOMRIGHT"}, - LEFT = {"RIGHT"}, - CENTER = {"CENTER"} - }, - [anchorInside] = { - BOTTOMLEFT = {"BOTTOMLEFT"}, - BOTTOM = {"BOTTOM"}, - BOTTOMRIGHT = {"BOTTOMRIGHT"}, - RIGHT = {"RIGHT"}, - TOPRIGHT = {"TOPRIGHT"}, - TOP = {"TOP"}, - TOPLEFT = {"TOPLEFT"}, - LEFT = {"LEFT"}, - CENTER = {"CENTER"} - } -} -local insidePointOffsetFuncs = { - BOTTOMLEFT = function(x, y) return x, y end, - BOTTOM = function(x, y) return 0, y end, - BOTTOMRIGHT = function(x, y) return -x, y end, - RIGHT = function(x, y) return -x, 0 end, - TOPRIGHT = function(x, y) return -x, -y end, - TOP = function(x, y) return 0, -y end, - TOPLEFT = function(x, y) return x, -y end, - LEFT = function(x, y) return x, 0 end, - CENTER = function(x, y) return x, y end, -} -local pointCoordFuncs = { - BOTTOMLEFT = function(f) return f:GetLeft(), f:GetBottom() end, - BOTTOM = function(f) return nil, f:GetBottom() end, - BOTTOMRIGHT = function(f) return f:GetRight(), f:GetBottom() end, - RIGHT = function(f) return f:GetRight(), nil end, - TOPRIGHT = function(f) return f:GetRight(), f:GetTop() end, - TOP = function(f) return nil, f:GetTop() end, - TOPLEFT = function(f) return f:GetLeft(), f:GetTop() end, - LEFT = function(f) return f:GetLeft(), nil end, - CENTER = function(f) return f:GetCenter() end, -} -local edgeBoundsFuncs = { - BOTTOM = function(f) return f:GetLeft(), f:GetRight() end, - LEFT = function(f) return f:GetBottom(), f:GetTop() end -} -edgeBoundsFuncs.TOP = edgeBoundsFuncs.BOTTOM -edgeBoundsFuncs.RIGHT = edgeBoundsFuncs.LEFT -local cornerTexCoords = { - -- ULx, ULy, LLx, LLy, URx, URy, LRx, LRy - TOPLEFT = { 1, 1, 1, 0, 0, 1, 0, 0 }, - TOPRIGHT = { 1, 0, 0, 0, 1, 1, 0, 1 }, - BOTTOMLEFT = { 0, 1, 1, 1, 0, 0, 1, 0 }, - BOTTOMRIGHT = { 0, 0, 0, 1, 1, 0, 1, 1 }, -} - --- Returns absolute coordinates x,y of the named point 'p' of frame 'f' -local function GetPointCoords( f, p ) - local x, y = pointCoordFuncs[p](f) - if not(x and y) then - local cx, cy = f:GetCenter() - x = x or cx - y = y or cy - end - return x, y -end - - --- Returns true if frame 'f1' can be anchored to frame 'f2' -local function CheckAnchorable( f1, f2 ) - -- can't anchor a frame to itself or to nil - if f1 == f2 or f2 == nil then - return false - end - - -- can always anchor to UIParent - if f2 == UIParent then - return true - end - - -- also can't do circular anchoring of frames - -- walk the anchor chain, which generally shouldn't be that expensive - -- (who nests draggables that deep anyway?) - for i = 1, f2:GetNumPoints() do - local _, f = f2:GetPoint(i) - if not f then f = f2:GetParent() end - return CheckAnchorable(f1,f) - end - - return true -end - --- Returns true if frames f1 and f2 specified edges overlap -local function CheckEdgeOverlap( f1, f2, e ) - local l1, u1 = edgeBoundsFuncs[e](f1) - local l2, u2 = edgeBoundsFuncs[e](f2) - return l1 <= l2 and l2 <= u1 or l2 <= l1 and l1 <= u2 -end - --- Returns true if point p1 on frame f1 overlaps edge e2 on frame f2 -local function CheckPointEdgeOverlap( f1, p1, f2, e2 ) - local l, u = edgeBoundsFuncs[e2](f2) - local x, y = GetPointCoords(f1,p1) - x = select(edgeSelector[e2], x, y) - return l <= x and x <= u -end - --- Returns the distance between corresponding edges. It is --- assumed that the passed in edges e1 and e2 are the same or opposites -local function GetEdgeDistance( f1, f2, e1, e2 ) - local x1, y1 = pointCoordFuncs[e1](f1) - local x2, y2 = pointCoordFuncs[e2](f2) - return math.abs((x1 or y1) - (x2 or y2)) -end - -local globalSnapTargets = { [UIParent] = anchorInside } - -local function GetClosestFrameEdge(f1,f2,a) - local dist, edge, opp - if f2:IsVisible() and CheckAnchorable(f1,f2) then - for _, e in pairs(edges) do - local o = a.inside and e or oppositeEdges[e] - if CheckEdgeOverlap(f1,f2,e) then - local d = GetEdgeDistance(f1, f2, e, o) - if not dist or (d < dist) then - dist, edge, opp = d, e, o - end - end - end - end - return dist, edge, opp -end - -local function GetClosestVisibleEdge( f ) - local r, o, e1, e2 - local a = anchorOutside - for _, b in ReAction:IterateBars() do - local d, e, opp = GetClosestFrameEdge(f,b:GetFrame(),a) - if d and (not r or d < r) then - r, o, e1, e2 = d, b:GetFrame(), e, opp - end - end - for f2, a2 in pairs(globalSnapTargets) do - local d, e, opp = GetClosestFrameEdge(f,f2,a2) - if d and (not r or d < r) then - r, o, e1, e2, a = d, f2, e, opp, a2 - end - end - return o, e1, e2, a -end - -local function GetClosestVisiblePoint(f1) - local f2, e1, e2, a = GetClosestVisibleEdge(f1) - if f2 then - local rsq, p, rp, x, y - -- iterate pointsOnEdge in order and use < to prefer edge centers to corners - for _, p1 in ipairs(pointsOnEdge[e1]) do - if CheckPointEdgeOverlap(f1,p1,f2,e2) then - for _, p2 in pairs(snapPoints[a][p1]) do - local x1, y1 = GetPointCoords(f1,p1) - local x2, y2 = GetPointCoords(f2,p2) - local dx = x1 - x2 - local dy = y1 - y2 - local rsq2 = dx*dx + dy*dy - if not rsq or rsq2 < rsq then - rsq, p, rp, x, y = rsq2, p1, p2, dx, dy - end - end - end - end - return f2, p, rp, x, y - end -end - -local function GetClosestPointSnapped(f1, rx, ry, xOff, yOff) - local o, p, rp, x, y = GetClosestVisiblePoint(f1) - local s = false - - local insideOffsetFunc = p and insidePointOffsetFuncs[p] - local coordFunc = p and pointCoordFuncs[p] - if not insideOffsetFunc or not coordFunc then - return - end - - local sx, sy = insideOffsetFunc(xOff or 0, yOff or 0) - local xx, yy = coordFunc(f1) - if xx and yy then - if math.abs(x) <= rx then - if math.abs(y) <= ry then - x = sx - y = sy - s = true - elseif CheckEdgeOverlap(f1,o,"LEFT") then - x = sx - s = true - end - elseif math.abs(y) <= ry and CheckEdgeOverlap(f1,o,"TOP") then - y = sy - s = true - end - elseif xx then - if math.abs(x) <= rx then - x = sx - s = true - if math.abs(y) <= ry then - y = sy - end - end - elseif yy then - if math.abs(y) <= ry then - y = sy - s = true - if math.abs(x) <= rx then - x = sx - end - end - end - - -- correct for some Lua oddities with doubles - if x == -0 then x = 0 end - if y == -0 then y = 0 end - - if s then - return o, p, rp, math.floor(x), math.floor(y) - end -end - -local function CreateSnapIndicator() - local si = CreateFrame("Frame",nil,UIParent) - si:SetFrameStrata("HIGH") - si:SetHeight(16) - si:SetWidth(16) - local tex = si:CreateTexture() - tex:SetAllPoints() - tex:SetTexture("Interface\\AddOns\\ReAction\\img\\lock") - tex:SetBlendMode("ADD") - tex:SetDrawLayer("OVERLAY") - return si -end - -local si1 = CreateSnapIndicator() -local si2 = CreateSnapIndicator() - -local function DisplaySnapIndicator( f, rx, ry, xOff, yOff ) - local o, p, rp, x, y, snap = GetClosestPointSnapped(f, rx, ry, xOff, yOff) - if o then - si1:ClearAllPoints() - si2:ClearAllPoints() - si1:SetPoint("CENTER", f, p, 0, 0) - local xx, yy = pointCoordFuncs[rp](o) - x = math.abs(x) <=rx and xx and 0 or x - y = math.abs(y) <=ry and yy and 0 or y - si2:SetPoint("CENTER", o, rp, x, y) - si1:Show() - si2:Show() - else - if si1:IsVisible() then - si1:Hide() - si2:Hide() - end - end - return o, p -end - -local function HideSnapIndicator() - if si1:IsVisible() then - si1:Hide() - si2:Hide() - end -end - -local function UpdateLabelString(bar) - local label = bar.controlLabelString - if label then - local name = bar.labelName - if name and bar.labelSubtext then - name = format("%s (%s)", name, bar.labelSubtext) - end - label:SetText(name or "") - end -end - -local function CreateControls(bar) - local f = bar:GetFrame() - - f:SetMovable(true) - f:SetResizable(true) - - -- child of UIParent so that alpha and scale doesn't propagate to it - local overlay = CreateFrame("Button", nil, UIParent) - overlay:EnableMouse(true) - overlay:SetFrameLevel(3) -- set it above the buttons - overlay:SetPoint("TOPLEFT", f, "TOPLEFT", -4, 4) - overlay:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", 4, -4) - overlay: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 = overlay: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 = overlay: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") - local aTex = overlay:CreateTexture(nil,"ARTWORK") - aTex:SetTexture("Interface\\AddOns\\ReAction\\img\\lock") - aTex:SetWidth(16) - aTex:SetHeight(16) - aTex:Hide() - - -- label - local label = overlay:CreateFontString(nil,"OVERLAY","GameFontNormalLarge") - label:SetAllPoints() - label:SetJustifyH("CENTER") - label:SetShadowColor(0,0,0,1) - label:SetShadowOffset(3,-3) - label:SetTextColor(GetNormalTextColor()) - label:SetText(bar:GetName()) - label:Show() - bar.controlLabelString = label -- so that bar:SetLabel() can update it - - local function UpdateAnchorDecoration() - local point, anchor, relPoint, x, y = f:GetPoint(1) - if point then - local ofsx, ofsy = insidePointOffsetFuncs[point](x,y) - if (anchor and anchor ~= UIParent) or (ofsx == 0 and ofsy == 0) then - bgTex:SetTexture( GetAnchoredBgColor() ) - hTex:SetTexture( GetAnchoredBgColor() ) - label:SetTextColor( GetAnchoredTextColor() ) - aTex:ClearAllPoints() - aTex:SetPoint(point) - aTex:Show() - return - end - end - bgTex:SetTexture( GetNormalBgColor() ) - hTex:SetTexture( GetNormalBgColor() ) - label:SetTextColor( GetNormalTextColor() ) - aTex:Hide() - end - - local function StopResize() - f:StopMovingOrSizing() - f.isMoving = false - f:SetScript("OnUpdate",nil) - StoreSize(bar) - ClampToButtons(bar) - ReAction:RefreshOptions() - end - - local function CornerUpdate() - local bw, bh = GetButtonSize(bar) - local r, c, s = GetButtonGrid(bar) - local ss = GetStateScale(bar) - if IsShiftKeyDown() then - if ss then - f:SetMinResize( ((s+bw)*c*0.25)/ss, ((s+bh)*r*0.25)/ss ) - f:SetMaxResize( ((s+bw)*c*2.5 + 1)/ss, ((s+bh)*r*2.5 + 1)/ss ) - scale = ComputeBarScale(bar) - else - f:SetMinResize( (s+12)*c+1, (s+12)*r+1 ) - f:SetMaxResize( (s+128)*c+1, (s+128)*r+1 ) - RecomputeButtonSize(bar) - end - elseif not ss and IsAltKeyDown() then - f:SetMinResize( bw*c, bh*r ) - f:SetMaxResize( 2*bw*c, 2*bh*r ) - RecomputeButtonSpacing(bar) - else - f:SetMinResize( bw+s+1, bh+s+1 ) - f:SetMaxResize( 50*(bw+s)+1, 50*(bh+s)+1 ) - RecomputeGrid(bar) - end - GameTooltipTextRight2:SetText(format("%d x %d",r,c)) - - local ss = GetStateScale(bar) - local state = bar:GetState() - if ss then - GameTooltipTextRight4:SetText(format("%d%%", scale*100)) - else - local size = (bw == bh) and tostring(bw) or format("%d x %d",bw,bh) - GameTooltipTextRight3:SetText(size) - GameTooltipTextRight4:SetText(tostring(s)) - end - end - - -- corner drag handles - for _, point in pairs({"BOTTOMLEFT","TOPLEFT","BOTTOMRIGHT","TOPRIGHT"}) do - local corner = CreateFrame("Frame",nil,overlay) - corner:EnableMouse(true) - corner:SetWidth(16) - corner:SetHeight(16) - corner:SetPoint(point) - - local tex = corner:CreateTexture(nil,"HIGHLIGHT") - tex:SetTexture("Interface\\AddOns\\ReAction\\img\\corner") - tex:SetTexCoord(unpack(cornerTexCoords[point])) - tex:SetBlendMode("ADD") - tex:SetAlpha(0.6) - tex:SetAllPoints() - - corner:SetScript("OnMouseDown", - function(_,btn) - f:SetScript("OnUpdate", CornerUpdate) - f:StartSizing(point) - end - ) - corner:SetScript("OnMouseUp", - function() - local ss = GetStateScale(bar) - if ss then - local state = bar:GetState() - SetStateScale(bar, ComputeBarScale(bar)) - end - StopResize() - end) - corner:SetScript("OnEnter", - function() - local bw, bh = GetButtonSize(bar) - local r, c, s = bar:GetButtonGrid() - local size = (bw == bh) and tostring(bw) or format("%d x %d",bw,bh) - local ss = GetStateScale(bar) - local state = bar:GetState() - GameTooltip:SetOwner(f, "ANCHOR_"..point) - if ss then - GameTooltip:AddLine(format("%s (%s: %s)", bar:GetName(), L["State"], state)) - else - GameTooltip:AddLine(bar:GetName()) - end - GameTooltip:AddDoubleLine(format("|cffcccccc%s|r %s",L["Drag"],L["to add/remove buttons:"]), format("%d x %d",r,c)) - if ss then - GameTooltip:AddLine(L["State Scale Override"]) - GameTooltip:AddDoubleLine(format("|cff00ff00%s|r %s",L["Hold Shift"],L["to change scale:"]), format("%d%%", bar:GetStateProperty(state,"scale")*100)) - else - GameTooltip:AddDoubleLine(format("|cff00ff00%s|r %s",L["Hold Shift"],L["to resize buttons:"]), tostring(floor(size))) - GameTooltip:AddDoubleLine(format("|cff0033cc%s|r %s",L["Hold Alt"], L["to change spacing:"]), tostring(floor(s))) - end - GameTooltip:Show() - end - ) - corner:SetScript("OnLeave", - function() - GameTooltip:Hide() - f:SetScript("OnUpdate",nil) - end - ) - end - - overlay:RegisterForDrag("LeftButton") - overlay:RegisterForClicks("RightButtonUp") - - overlay:SetScript("OnDragStart", - function() - f:StartMoving() - f.isMoving = true - local w,h = bar:GetButtonSize() - f:ClearAllPoints() - UpdateAnchorDecoration() - f:SetScript("OnUpdate", function() - if IsShiftKeyDown() then - local f, p = DisplaySnapIndicator(f,w,h) - else - HideSnapIndicator() - end - end) - end - ) - - local function UpdateDragTooltip() - GameTooltip:SetOwner(f, "ANCHOR_TOPRIGHT") - local ss = GetStateScale(bar) - local state = bar:GetState() - if ss then - GameTooltip:AddLine(format("%s (%s: %s)", bar:GetName(), L["State"], state)) - else - GameTooltip:AddLine(bar:GetName()) - end - GameTooltip:AddLine(format("|cffcccccc%s|r %s",L["Drag"],L["to move"])) - GameTooltip:AddLine(format("|cff00ff00%s|r %s",L["Hold Shift"],L["to anchor to nearby frames"])) - GameTooltip:AddLine(format("|cff00cccc%s|r %s",L["Right-click"],L["for options..."])) - local point, frame, relpoint, x, y = bar:GetFrame():GetPoint(1) - if point then - local ofsx, ofsy = insidePointOffsetFuncs[point](x,y) - if (frame and frame ~= UIParent) or (ofsx == 0 and ofsy == 0) then - frame = frame or UIParent - GameTooltip:AddLine(format("%s <%s>",L["Currently anchored to"],frame:GetName())) - end - end - GameTooltip:Show() - end - - overlay:SetScript("OnDragStop", - function() - f:StopMovingOrSizing() - f.isMoving = false - f:SetScript("OnUpdate",nil) - - if IsShiftKeyDown() then - local w, h = bar:GetButtonSize() - local a, p, rp, x, y = GetClosestPointSnapped(f,w,h) - if a then - f:ClearAllPoints() - f:SetPoint(p,a,rp,x,y) - end - HideSnapIndicator() - end - - StoreExtents(bar) - ReAction:RefreshOptions() - UpdateDragTooltip() - UpdateAnchorDecoration() - end - ) - - overlay:SetScript("OnEnter", - function() - UpdateDragTooltip() - end - ) - - overlay:SetScript("OnLeave", HideGameTooltip) - - overlay:SetScript("OnClick", - function() - ReAction:ShowEditor(bar) - end - ) - - function overlay:LIBKEYBOUND_ENABLED(evt) - self:SetFrameLevel(1) - end - - function overlay:LIBKEYBOUND_DISABLED(evt) - self:SetFrameLevel(3) - end - - function overlay:RefreshControls() - UpdateAnchorDecoration() - end - - overlay:SetScript("OnShow", overlay.RefreshControls) - - KB.RegisterCallback(overlay,"LIBKEYBOUND_ENABLED") - KB.RegisterCallback(overlay,"LIBKEYBOUND_DISABLED") - - if ReAction:GetKeybindMode() then - overlay:SetFrameLevel(1) - end - - bar:SetLabel(bar:GetName()) - UpdateLabelString(bar) - UpdateAnchorDecoration() - - return overlay -end - - --- export methods to the Bar prototype - -function Bar:ShowControls(show) - local f = self.controlFrame - if show then - if not f then - f = CreateControls(self) - self.controlFrame = f - end - f:Show() - elseif f then - f:Hide() - end -end - -function Bar:RefreshControls() - if self.controlFrame and self.controlFrame:IsShown() then - self.controlFrame:RefreshControls() - end -end - -function Bar:SetLabel(name) - self.labelName = name - UpdateLabelString(self) -end - -function Bar:SetLabelSubtext(text) - self.labelSubtext = text - UpdateLabelString(self) -end diff -r b2fb8f7dc780 -r 410d036c43b2 ReAction.lua --- a/ReAction.lua Wed Jan 07 00:57:02 2009 +0000 +++ b/ReAction.lua Thu Jan 08 00:57:27 2009 +0000 @@ -183,13 +183,6 @@ function CallModuleMethod(modulename, method, ...) local m = self:GetModule(modulename,true) - if not m then - LoadAddOn(("ReAction_%s"):format(modulename)) - m = self:GetModule(modulename,true) - if m then - dbprint(("succesfully loaded LOD module: %s"):format(modulename)) - end - end if m then if type(m) == "table" and type(m[method]) == "function" then m[method](m,...) diff -r b2fb8f7dc780 -r 410d036c43b2 ReAction.xml --- a/ReAction.xml Wed Jan 07 00:57:02 2009 +0000 +++ b/ReAction.xml Thu Jan 08 00:57:27 2009 +0000 @@ -6,12 +6,7 @@