Mercurial > wow > reaction
diff Bar.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 | ReAction_Bar.lua@f1e838841ce1 |
children | 0d95ce7a9ec2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Bar.lua Mon Mar 17 18:24:53 2008 +0000 @@ -0,0 +1,146 @@ +local ReAction = ReAction +local L = ReAction.L +local _G = _G +local CreateFrame = CreateFrame + +-- update ReAction revision if this file is newer +local revision = tonumber(("$Revision: 1 $"):match("%d+")) +if revision > ReAction.revision then + Reaction.revision = revision +end + +------ BAR CLASS ------ +local Bar = { _classID = {} } + +local function Constructor( self, name, config ) + self.name, self.config = name, config + + if type(config) ~= "table" then + error("ReAction.Bar: config table required") + end + + local f = CreateFrame("Frame",nil,config.parent or UIParent,"SecureStateDriverTemplate") + f:SetFrameStrata("MEDIUM") + config.width = config.width or 400 + config.height = config.height or 80 + f:SetWidth(config.width) + f:SetWidth(config.height) + + self.frame = f + self:RefreshLayout() + self:ApplyAnchor() + f:Show() +end + +function Bar:Destroy() + local f = self.frame + f:UnregisterAllEvents() + f:Hide() + f:SetParent(UIParent) + f:ClearAllPoints() + self.labelString = nil + self.controlFrame = nil + self.frame = nil + self.config = nil +end + +function Bar:RefreshLayout() + ReAction:CallMethodOnAllModules("RefreshBar", self) +end + +function Bar:ApplyAnchor() + local f, config = self.frame, self.config + f:SetWidth(config.width) + f:SetHeight(config.height) + local anchor = config.anchor + if anchor then + local anchorTo + if config.anchorTo then + anchorTo = ReAction:GetBar(config.anchorTo) or _G[config.anchorTo] + end + f:SetPoint(anchor, anchorTo, config.relativePoint, config.x or 0, config.y or 0) + else + f:SetPoint("CENTER") + end +end + +function Bar:GetFrame() + return self.frame +end + +function Bar:GetSize() + return self.frame:GetWidth() or 200, self.frame:GetHeight() or 200 +end + +function Bar:SetSize(w,h) + self.config.width = w + self.config.height = 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 +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: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 +end + +function Bar:GetName() + return self.name +end + +function Bar:PlaceButton(f, idx, baseW, baseH) + local r, c, s = self:GetButtonGrid() + local bh, bw = self:GetButtonSize() + local row, col = floor((idx-1)/c), mod((idx-1),c) -- zero-based + local x, y = col*bw + (col+0.5)*s, row*bh + (row+0.5)*s + local scale = bw/baseW + + f:ClearAllPoints() + f:SetPoint("TOPLEFT",x/scale,-y/scale) + f:SetScale(scale) +-- f:Show() +end + + + +------ Export as a class-factory ------ +ReAction.Bar = { + prototype = Bar, + + IsInstance = function(self, x) + return type(x) == "table" and x._classID == Bar._classID + end, + + new = function(self, ...) + local x = { } + for k,v in pairs(Bar) do + x[k] = v + end + Constructor(x, ...) + return x + end +}