Mercurial > wow > reaction
comparison State.lua @ 101:3699d7dad312
added stateful anchoring
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Sat, 25 Oct 2008 18:49:18 +0000 |
parents | a44173c7a82c |
children | 890e4c4ab143 |
comparison
equal
deleted
inserted
replaced
100:9715174ff220 | 101:3699d7dad312 |
---|---|
49 local olhs = tfetch(t[lhs], unpack(path)) or 0 | 49 local olhs = tfetch(t[lhs], unpack(path)) or 0 |
50 local orhs = tfetch(t[rhs], unpack(path)) or 0 | 50 local orhs = tfetch(t[rhs], unpack(path)) or 0 |
51 return olhs < orhs | 51 return olhs < orhs |
52 end) | 52 end) |
53 return r | 53 return r |
54 end | |
55 | |
56 -- set a frame-ref, if the frame is valid, or set nil to the | |
57 -- corresponding attribute | |
58 local function SetFrameRef(frame, name, refFrame) | |
59 if refFrame then | |
60 local _, explicit = refFrame:IsProtected() | |
61 if not explicit then | |
62 refFrame = nil | |
63 end | |
64 end | |
65 if refFrame then | |
66 frame:SetFrameRef(name,refFrame) | |
67 else | |
68 frame:SetAttribute("frameref-"..name,nil) | |
69 end | |
54 end | 70 end |
55 | 71 |
56 | 72 |
57 local InitRules, ApplyStates, CleanupStates, SetProperty, GetProperty, RegisterProperty, ShowAll | 73 local InitRules, ApplyStates, CleanupStates, SetProperty, GetProperty, RegisterProperty, ShowAll |
58 | 74 |
78 end | 94 end |
79 ]], | 95 ]], |
80 | 96 |
81 --keybindState TODO: broken | 97 --keybindState TODO: broken |
82 | 98 |
83 -- the anchoring is handled in a special handler | 99 anchorEnable = |
84 anchorEnable = true, | 100 [[ |
85 --anchorFrame = true, TODO: broken | 101 local old_anchor = anchorstate |
102 anchorstate = (anchorEnable and anchorEnable[state]) and state | |
103 if old_anchor ~= anchorstate or not set_state then | |
104 if anchorstate and anchorPoint then | |
105 if anchorPoint[state] then | |
106 self:ClearAllPoints() | |
107 local f = self:GetAttribute("frameref-anchor-"..anchorstate) | |
108 if f then | |
109 self:SetPoint(anchorPoint[state], f, anchorRelPoint[state], anchorX[state], anchorY[state]) | |
110 end | |
111 end | |
112 elseif defaultAnchor and defaultAnchor.point then | |
113 self:ClearAllPoints() | |
114 self:SetPoint(defaultAnchor.point, defaultAnchor.frame, | |
115 defaultAnchor.relPoint, defaultAnchor.x, defaultAnchor.y) | |
116 end | |
117 end | |
118 ]], | |
119 -- anchorEnable handles all the other bits | |
120 anchorFrame = true, | |
86 anchorPoint = true, | 121 anchorPoint = true, |
87 anchorRelPoint = true, | 122 anchorRelPoint = true, |
88 anchorX = true, | 123 anchorX = true, |
89 anchorY = true, | 124 anchorY = true, |
90 enableScale = true, | 125 enableScale = true, |
110 ]] | 145 ]] |
111 | 146 |
112 local onStateHandler = | 147 local onStateHandler = |
113 -- function _onstate-reaction( self, stateid, newstate ) | 148 -- function _onstate-reaction( self, stateid, newstate ) |
114 [[ | 149 [[ |
115 set_state = newstate or set_state | 150 set_state = newstate |
116 | 151 |
117 local oldState = state | 152 local oldState = state |
118 state = state_override or set_state or state | 153 state = state_override or set_state or state |
119 | |
120 for i = 1, #propfuncs do | 154 for i = 1, #propfuncs do |
121 control:RunAttribute("func-"..propfuncs[i]) | 155 control:RunAttribute("func-"..propfuncs[i]) |
122 end | 156 end |
123 | 157 |
124 if anchorEnable and anchorEnable[state] ~= anchorstate then | |
125 anchorstate = anchorEnable[state] | |
126 control:RunAttribute("func-doanchor") | |
127 end | |
128 | |
129 control:ChildUpdate() | 158 control:ChildUpdate() |
130 ]] | |
131 | |
132 local anchorHandler = | |
133 -- function func-doanchor( self ) | |
134 [[ | |
135 -- TODO | |
136 if anchorstate then | |
137 -- TODO: get anchor data from state tables | |
138 else | |
139 -- TODO: get anchor data from defaults | |
140 end | |
141 ]] | 159 ]] |
142 | 160 |
143 local onClickHandler = | 161 local onClickHandler = |
144 -- function OnClick( self, button, down ) | 162 -- function OnClick( self, button, down ) |
145 [[ | 163 [[ |
184 SetHandlerData(bar, "defaultAnchor", point, "point") | 202 SetHandlerData(bar, "defaultAnchor", point, "point") |
185 SetHandlerData(bar, "defaultAnchor", relPoint, "relPoint") | 203 SetHandlerData(bar, "defaultAnchor", relPoint, "relPoint") |
186 SetHandlerData(bar, "defaultAnchor", x, "x") | 204 SetHandlerData(bar, "defaultAnchor", x, "x") |
187 SetHandlerData(bar, "defaultAnchor", y, "y") | 205 SetHandlerData(bar, "defaultAnchor", y, "y") |
188 | 206 |
189 if frame then | 207 local f = bar:GetFrame() |
190 local f = bar:GetFrame() | 208 SetFrameRef(f, "defaultAnchor", _G[frame or "UIParent"]) |
191 f:SetFrameRef("defaultAnchor", f) | 209 f:Execute( |
192 f:Execute( | 210 [[ |
193 [[ | 211 defaultAnchor.frame = self:GetAttribute("frameref-defaultAnchor") |
194 defaultAnchor.frame = self:GetAttribute("frameref-defaultAnchor") | 212 ]]) |
195 ]]) | |
196 end | |
197 end | 213 end |
198 | 214 |
199 function RefreshState( bar ) | 215 function RefreshState( bar ) |
200 SetDefaultAnchor(bar) | 216 SetDefaultAnchor(bar) |
201 bar:GetFrame():Execute( | 217 bar:GetFrame():Execute( |
223 end | 239 end |
224 end | 240 end |
225 f:SetAttribute("prop-func-list", table.concat(props," ")) | 241 f:SetAttribute("prop-func-list", table.concat(props," ")) |
226 f:Execute(stateHandler_propInit) | 242 f:Execute(stateHandler_propInit) |
227 f:SetAttribute("reaction-refresh", onStateHandler) | 243 f:SetAttribute("reaction-refresh", onStateHandler) |
228 f:SetAttribute("func-doanchor", anchorHandler) | |
229 | 244 |
230 if rule and #rule > 0 then | 245 if rule and #rule > 0 then |
231 f:SetAttribute( "_onstate-reaction", onStateHandler ) | 246 f:SetAttribute( "_onstate-reaction", onStateHandler ) |
232 RegisterStateDriver(f, "reaction", rule) | 247 RegisterStateDriver(f, "reaction", rule) |
233 statedrivers[bar] = rule | 248 statedrivers[bar] = rule |
409 function ApplyStates( bar ) | 424 function ApplyStates( bar ) |
410 local states = tfetch(module.db.profile.bars, bar:GetName(), "states") | 425 local states = tfetch(module.db.profile.bars, bar:GetName(), "states") |
411 if states then | 426 if states then |
412 for propname in pairs(properties) do | 427 for propname in pairs(properties) do |
413 for name, s in pairs(states) do | 428 for name, s in pairs(states) do |
414 SetHandlerData(bar, propname, s[propname], name) | 429 if propname == "anchorFrame" then |
430 SetFrameRef(bar:GetFrame(), "anchor-"..name, _G[s.anchorFrame]) | |
431 else | |
432 SetHandlerData(bar, propname, s[propname], name) | |
433 end | |
415 end | 434 end |
416 end | 435 end |
417 BuildKeybinds(bar, states) | 436 BuildKeybinds(bar, states) |
418 SetHandlerData(bar, "showAll", ReAction:GetConfigMode()) | 437 SetHandlerData(bar, "showAll", ReAction:GetConfigMode()) |
419 SetStateDriver(bar, BuildRule(states)) | 438 SetStateDriver(bar, BuildRule(states)) |
637 order = 92, | 656 order = 92, |
638 type = "group", | 657 type = "group", |
639 inline = true, | 658 inline = true, |
640 args = { | 659 args = { |
641 anchorEnable = { | 660 anchorEnable = { |
642 name = L["Set New Position"], | 661 name = L["Reposition"], |
643 order = 1, | 662 order = 1, |
644 type = "toggle", | 663 type = "toggle", |
645 set = "SetProp", | 664 set = "SetProp", |
646 get = "GetProp", | 665 get = "GetProp", |
647 }, | 666 }, |
648 --[[ TODO: broken | |
649 anchorFrame = { | 667 anchorFrame = { |
650 name = L["Anchor Frame"], | 668 name = L["Anchor Frame"], |
651 order = 2, | 669 order = 2, |
652 type = "select", | 670 type = "select", |
653 values = "GetAnchorFrames", | 671 values = "GetAnchorFrames", |
654 set = ??? | 672 set = "SetAnchorFrame", |
655 get = ??? | 673 get = "GetAnchorFrame", |
656 }, ]] | 674 disabled = "GetAnchorDisabled", |
675 hidden = "GetAnchorDisabled", | |
676 }, | |
657 anchorPoint = { | 677 anchorPoint = { |
658 name = L["Point"], | 678 name = L["Point"], |
659 order = 3, | 679 order = 3, |
660 type = "select", | 680 type = "select", |
661 values = pointTable, | 681 values = pointTable, |
992 ApplyStates(self.bar) | 1012 ApplyStates(self.bar) |
993 end | 1013 end |
994 end | 1014 end |
995 | 1015 |
996 function StateHandler:GetAnchorDisabled() | 1016 function StateHandler:GetAnchorDisabled() |
997 return not GetProperty(self.bar, self:GetName(), "enableAnchor") | 1017 return not GetProperty(self.bar, self:GetName(), "anchorEnable") |
1018 end | |
1019 | |
1020 function StateHandler:GetAnchorFrames(info) | |
1021 self._anchorframes = self._anchorframes or { } | |
1022 table.wipe(self._anchorframes) | |
1023 | |
1024 table.insert(self._anchorframes, "UIParent") | |
1025 for name, bar in ReAction:IterateBars() do | |
1026 table.insert(self._anchorframes, bar:GetFrame():GetName()) | |
1027 end | |
1028 return self._anchorframes | |
1029 end | |
1030 | |
1031 function StateHandler:GetAnchorFrame(info) | |
1032 local value = self:GetProp(info) | |
1033 for k,v in pairs(self._anchorframes) do | |
1034 if v == value then | |
1035 return k | |
1036 end | |
1037 end | |
1038 end | |
1039 | |
1040 function StateHandler:SetAnchorFrame(info, value) | |
1041 local f = _G[self._anchorframes[value]] | |
1042 if f then | |
1043 SetFrameRef(self.bar:GetFrame(), "anchor-"..self:GetName(), f) | |
1044 self:SetProp(info, f:GetName()) | |
1045 end | |
998 end | 1046 end |
999 | 1047 |
1000 function StateHandler:SetAnchorPointProp(info, value) | 1048 function StateHandler:SetAnchorPointProp(info, value) |
1001 self:SetProp(info, value ~= "NONE" and value or nil) | 1049 self:SetProp(info, value ~= "NONE" and value or nil) |
1002 end | 1050 end |