Mercurial > wow > reaction
comparison Bar.lua @ 68:fcb5dad031f9
State transitions now working. Keybind toggle states, stance switching, etc.
Hide bar is the only working state property, but the config is there for page #, re-anchoring, re-scaling, and keybind override.
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Tue, 03 Jun 2008 22:57:34 +0000 |
| parents | 768be7eb22a0 |
| children | 2c12e2b1752e |
comparison
equal
deleted
inserted
replaced
| 67:84721edaa749 | 68:fcb5dad031f9 |
|---|---|
| 19 ------ BAR CLASS ------ | 19 ------ BAR CLASS ------ |
| 20 local Bar = { _classID = {} } | 20 local Bar = { _classID = {} } |
| 21 | 21 |
| 22 local function Constructor( self, name, config ) | 22 local function Constructor( self, name, config ) |
| 23 self.name, self.config = name, config | 23 self.name, self.config = name, config |
| 24 self.buttons = setmetatable({},{__mode="k"}) | |
| 24 | 25 |
| 25 if type(config) ~= "table" then | 26 if type(config) ~= "table" then |
| 26 error("ReAction.Bar: config table required") | 27 error("ReAction.Bar: config table required") |
| 27 end | 28 end |
| 28 | 29 |
| 29 local parent = config.parent and (ReAction:GetBar(config.parent) or _G[config.parent]) or UIParent | 30 local parent = config.parent and (ReAction:GetBar(config.parent) or _G[config.parent]) or UIParent |
| 30 local f = CreateFrame("Frame",nil,parent,"SecureStateDriverTemplate") | 31 local f = CreateFrame("Frame",nil,parent,"SecureStateHeaderTemplate") |
| 31 f:SetFrameStrata("MEDIUM") | 32 f:SetFrameStrata("MEDIUM") |
| 32 config.width = config.width or 480 | 33 config.width = config.width or 480 |
| 33 config.height = config.height or 40 | 34 config.height = config.height or 40 |
| 34 f:SetWidth(config.width) | 35 f:SetWidth(config.width) |
| 35 f:SetWidth(config.height) | 36 f:SetWidth(config.height) |
| 36 | 37 |
| 37 ReAction.RegisterCallback(self, "OnConfigModeChanged") | 38 ReAction.RegisterCallback(self, "OnConfigModeChanged") |
| 38 | 39 |
| 39 self.frame = f | 40 self.frame = f |
| 40 self:RefreshLayout() | |
| 41 self:ApplyAnchor() | 41 self:ApplyAnchor() |
| 42 f:Show() | 42 f:Show() |
| 43 self:RefreshLayout() | |
| 43 end | 44 end |
| 44 | 45 |
| 45 function Bar:Destroy() | 46 function Bar:Destroy() |
| 46 local f = self.frame | 47 local f = self.frame |
| 47 f:UnregisterAllEvents() | 48 f:UnregisterAllEvents() |
| 163 local scale = bw/baseW | 164 local scale = bw/baseW |
| 164 | 165 |
| 165 f:ClearAllPoints() | 166 f:ClearAllPoints() |
| 166 f:SetPoint("TOPLEFT",x/scale,-y/scale) | 167 f:SetPoint("TOPLEFT",x/scale,-y/scale) |
| 167 f:SetScale(scale) | 168 f:SetScale(scale) |
| 168 end | 169 self.buttons[f] = true |
| 169 | 170 end |
| 170 | 171 |
| 171 | 172 function Bar:GetNumPages() |
| 172 | 173 return self.config.nPages or 1 |
| 173 | 174 end |
| 174 | 175 |
| 176 function Bar:SetHideStates(s) | |
| 177 for f in pairs(self.buttons) do | |
| 178 if f:GetParent() == self.frame then | |
| 179 f:SetAttribute("hidestates",s) | |
| 180 end | |
| 181 end | |
| 182 SecureStateHeader_Refresh(self.frame) | |
| 183 end | |
| 184 | |
| 185 function Bar:SetStateKeybind(keybind, state, defaultstate) | |
| 186 -- use a tiny offscreen button to get around making the bar itself a clickable button | |
| 187 local f = self.statebuttonframe | |
| 188 local off = ("%s_off"):format(state) | |
| 189 if keybind then | |
| 190 if not f then | |
| 191 f = CreateFrame("Button",self:GetName().."_statebutton",UIParent,"SecureActionButtonTemplate") | |
| 192 f:SetPoint("BOTTOMRIGHT",UIParent,"TOPLEFT") | |
| 193 f:SetWidth(1) | |
| 194 f:SetHeight(1) | |
| 195 f:SetAttribute("attribute-name", "state") | |
| 196 f:SetAttribute("attribute-frame",self.frame) | |
| 197 f:SetAttribute("stateheader",self.frame) | |
| 198 f:Show() | |
| 199 self.statebuttonframe = f | |
| 200 end | |
| 201 -- map two virtual buttons to toggle between the state and the default | |
| 202 f:SetAttribute(("statebutton-%s"):format(state),("%s:%s;%s"):format(state,off,state)) | |
| 203 f:SetAttribute(("type-%s"):format(state),"attribute") | |
| 204 f:SetAttribute(("type-%s"):format(off),"attribute") | |
| 205 f:SetAttribute(("attribute-value-%s"):format(state), state) | |
| 206 f:SetAttribute(("attribute-value-%s"):format(off), defaultstate) | |
| 207 SetBindingClick(keybind, f:GetName(), state) | |
| 208 elseif f then | |
| 209 f:SetAttribute(("type-%s"):format(state),ATTRIBUTE_NOOP) | |
| 210 f:SetAttribute(("type-%s"):format(off),ATTRIBUTE_NOOP) | |
| 211 end | |
| 212 end | |
| 213 | |
| 214 function Bar:SetStatePageMap(state, map) -- map is a { ["statename"] = pagenumber } table | |
| 215 local f = self.frame | |
| 216 local tmp = { } | |
| 217 for s, p in pairs(map) do | |
| 218 table.insert(tmp, ("%s:%d"):format(s,p)) | |
| 219 end | |
| 220 local spec = table.concat(tmp,";") | |
| 221 f:SetAttribute("statebutton",spec) | |
| 222 end | |
| 223 | |
| 224 function Bar:SetStateKeybindOverrideMap(states) -- 'states' is an array of state-names that should have keybind overrides enabled | |
| 225 local f = self.frame | |
| 226 for i = 1, #states do | |
| 227 local s = states[i] | |
| 228 states[i] = ("%s:%s"):format(s,s) | |
| 229 end | |
| 230 table.insert(states,"_default") | |
| 231 f:SetAttribute("statebindings",table.concat(states,";")) | |
| 232 for b in pairs(self.buttons) do | |
| 233 -- TODO: signal child frames that they should | |
| 234 -- maintain multiple bindings | |
| 235 end | |
| 236 end | |
| 175 | 237 |
| 176 -- | 238 -- |
| 177 -- Bar config overlay | 239 -- Bar config overlay |
| 178 -- | 240 -- |
| 179 local CreateControls | 241 local CreateControls |
