comparison classes/Bar.lua @ 155:806a61b331a0

Pushed the state implementation into Bar
author Flick <flickerstreak@gmail.com>
date Fri, 15 May 2009 22:38:19 +0000
parents df67685b340e
children 611e6ce08717
comparison
equal deleted inserted replaced
154:df67685b340e 155:806a61b331a0
7 local format = string.format 7 local format = string.format
8 8
9 ReAction:UpdateRevision("$Revision$") 9 ReAction:UpdateRevision("$Revision$")
10 10
11 local KB = LibStub("LibKeyBound-1.0") 11 local KB = LibStub("LibKeyBound-1.0")
12
13 ---- Secure snippets ----
14 local _reaction_init =
15 [[
16 anchorKeys = newtable("point","relPoint","x","y")
17
18 state = nil
19 set_state = nil
20 state_override = nil
21
22 showAll = false
23 hidden = false
24
25 defaultAlpha = 1.0
26 defaultScale = 1.0
27 defaultAnchor = newtable()
28
29 activeStates = newtable()
30 settings = newtable()
31 extensions = newtable()
32 ]]
33
34 local _reaction_refresh =
35 [[
36 local oldState = state
37 state = state_override or set_state or state
38
39 if state then
40 local settings = settings[state]
41 if settings then
42 -- show/hide
43 local h = settings.hide and not showAll
44 if h ~= hidden then
45 if h then
46 self:Hide()
47 else
48 self:Show()
49 end
50 hidden = h
51 end
52 -- re-anchor
53 local old_anchor = activeStates.anchor
54 activeStates.anchor = settings.anchorEnable and state
55 if old_anchor ~= activeStates.anchor or not set_state then
56 if activeStates.anchor then
57 if settings.anchorPoint then
58 self:ClearAllPoints()
59 local f = self:GetAttribute("frameref-anchor-"..state)
60 if f then
61 self:SetPoint(settings.anchorPoint, f, settings.anchorRelPoint, settings.anchorX, settings.anchorY)
62 end
63 end
64 elseif defaultAnchor.point then
65 self:ClearAllPoints()
66 self:SetPoint(defaultAnchor.point, defaultAnchor.frame,
67 defaultAnchor.relPoint, defaultAnchor.x, defaultAnchor.y)
68 end
69 end
70 -- re-scale
71 local old_scale = activeStates.scale
72 activeStates.scale = settings.enableScale and state
73 if old_scale ~= activeStates.scale or not set_state then
74 self:SetScale(activeStates.scale and settings.scale or defaultScale)
75 end
76 -- alpha
77 local old_alpha = activeStates.alpha
78 activeStates.alpha = settings.enableAlpha and state
79 if old_alpha ~= activeStates.alpha or not set_state then
80 self:SetAlpha(activeStates.alpha and settings.alpha or defaultAlpha)
81 end
82 end
83 end
84
85 for _, attr in pairs(extensions) do
86 control:RunAttribute(attr)
87 end
88
89 control:ChildUpdate()
90
91 if showAll then
92 control:CallMethod("UpdateHiddenLabel", state and settings[state] and settings[state].hide)
93 end
94
95 if oldState ~= state then
96 control:CallMethod("StateRefresh", state)
97 end
98 ]]
99
100 local _onstate_reaction = -- function( self, stateid, newstate )
101 [[
102 set_state = newstate
103 ]] .. _reaction_refresh
104
105 local _onstate_showgrid = -- function( self, stateid, newstate )
106 [[
107 control:ChildUpdate(stateid,newstate)
108 control:CallMethod("UpdateShowGrid")
109 ]]
110
111 local _onstate_unitexists = -- function( self, stateid, newstate )
112 [[
113
114 ]] .. _reaction_refresh
115
116 local _onclick = -- function( self, button, down )
117 [[
118 if state_override == button then
119 state_override = nil -- toggle
120 else
121 state_override = button
122 end
123 ]] .. _reaction_refresh
124
12 125
13 ---- Bar class ---- 126 ---- Bar class ----
14 local Bar = { } 127 local Bar = { }
15 local weak = { __mode = "k" } 128 local weak = { __mode = "k" }
16 local frameList = { } 129 local frameList = { }
49 f:SetHeight(self.height) 162 f:SetHeight(self.height)
50 f:SetAlpha(config.alpha or 1.0) 163 f:SetAlpha(config.alpha or 1.0)
51 f:Show() 164 f:Show()
52 f:EnableMouse(false) 165 f:EnableMouse(false)
53 f:SetClampedToScreen(true) 166 f:SetClampedToScreen(true)
54
55 f:SetAttribute("_onstate-showgrid",
56 -- function(self,stateid,newstate)
57 [[
58 control:ChildUpdate(stateid,newstate)
59 control:CallMethod("UpdateShowGrid")
60 ]])
61 f.UpdateShowGrid = function(frame)
62 for button in self:IterateButtons() do
63 button:UpdateShowGrid()
64 end
65 end
66 ReAction.gridProxy:AddFrame(f) 167 ReAction.gridProxy:AddFrame(f)
168
169 -- secure handlers
170 f:Execute(_reaction_init)
171 f:SetAttribute("_onstate-reaction", _onstate_reaction)
172 f:SetAttribute("_onstate-showgrid", _onstate_showgrid)
173 f:SetAttribute("_onstate-unitexists", _onstate_unitexists)
174 f:SetAttribute("_onclick", _onclick)
175
176 -- secure handler CallMethod()s
177 f.UpdateShowGrid = function() self:UpdateShowGrid() end
178 f.StateRefresh = function() self:RefreshControls() end
179 f.UpdateHiddenLabel = function(f,hidden) self:SetLabelSubtext(hidden and L["Hidden"]) end
67 180
68 -- Override the default frame accessor to provide strict read-only access 181 -- Override the default frame accessor to provide strict read-only access
69 function self:GetFrame() 182 function self:GetFrame()
70 return f 183 return f
71 end 184 end
213 end 326 end
214 327
215 function Bar:SetAlpha(value) 328 function Bar:SetAlpha(value)
216 self.config.alpha = value 329 self.config.alpha = value
217 self:GetFrame():SetAlpha(value or 1.0) 330 self:GetFrame():SetAlpha(value or 1.0)
331 self:UpdateDefaultStateAlpha()
218 ReAction:RefreshBar(self) 332 ReAction:RefreshBar(self)
219 end 333 end
220 334
221 -- iterator returns button, idx and does NOT iterate in index order
222 function Bar:IterateButtons() 335 function Bar:IterateButtons()
336 -- iterator returns button, idx and does NOT iterate in index order
223 return pairs(self.buttons) 337 return pairs(self.buttons)
224 end 338 end
225 339
226 -- 340 --
227 -- Methods 341 -- Methods
228 -- 342 --
229 343
230 function Bar:SetConfigMode(mode) 344 function Bar:SetConfigMode(mode)
345 self:SetSecureData("showAll",mode)
346 self:UpdateUnitWatch()
231 self:ShowControls(mode) 347 self:ShowControls(mode)
232 if self.unitwatch then
233 if mode then
234 UnregisterUnitWatch(self:GetFrame())
235 self:GetFrame():Show()
236 else
237 RegisterUnitWatch(self:GetFrame())
238 end
239 end
240 for b in self:IterateButtons() do 348 for b in self:IterateButtons() do
241 b:ShowGridTemp(mode) 349 b:ShowGridTemp(mode)
242 b:UpdateActionIDLabel(mode) 350 b:UpdateActionIDLabel(mode)
243 end 351 end
244 end 352 end
245 353
246 function Bar:SetKeybindMode(mode) 354 function Bar:SetKeybindMode(mode)
247 if self.unitwatch then 355 self:SetSecureData("showAll",mode)
248 if mode then 356 self:UpdateUnitWatch()
249 UnregisterUnitWatch(self:GetFrame())
250 self:GetFrame():Show()
251 else
252 RegisterUnitWatch(self:GetFrame())
253 end
254 end
255 for b in self:IterateButtons() do 357 for b in self:IterateButtons() do
256 b:SetKeybindMode(mode) 358 b:SetKeybindMode(mode)
257 end 359 end
258 end 360 end
259 361
279 local fr = a or f:GetParent() 381 local fr = a or f:GetParent()
280 f:SetPoint(p, a or f:GetParent(), c.relpoint, c.x or 0, c.y or 0) 382 f:SetPoint(p, a or f:GetParent(), c.relpoint, c.x or 0, c.y or 0)
281 else 383 else
282 f:SetPoint("CENTER") 384 f:SetPoint("CENTER")
283 end 385 end
386
387 self:UpdateDefaultStateAnchor()
284 end 388 end
285 389
286 function Bar:ClipNButtons( n ) 390 function Bar:ClipNButtons( n )
287 local cfg = self.config 391 local cfg = self.config
288 local r = cfg.btnRows or 1 392 local r = cfg.btnRows or 1
329 433
330 function Bar:SkinButton() 434 function Bar:SkinButton()
331 -- does nothing by default 435 -- does nothing by default
332 end 436 end
333 437
438 function Bar:UpdateShowGrid()
439 for button in self:IterateButtons() do
440 button:UpdateShowGrid()
441 end
442 end
443
444 function Bar:UpdateUnitWatch()
445 if self.unitwatch then
446 if self.unitwatchActive and (ReAction:GetConfigMode() or ReAction:GetKeybindMode()) then
447 UnregisterUnitWatch(self:GetFrame())
448 self.unitwatchActive = false
449 elseif not self.unitwatchActive then
450 RegisterUnitWatch(self:GetFrame())
451 self.unitwatchActive = true
452 end
453 self:RefreshSecureState()
454 end
455 end
456
334 function Bar:ShowControls(show) 457 function Bar:ShowControls(show)
335 local f = self.overlay
336 if show then 458 if show then
337 if not f then 459 if not self.overlay then
338 f = Bar.Overlay:New(self) -- see Overlay.lua 460 self.overlay = Bar.Overlay:New(self) -- see Overlay.lua
339 self.overlay = f 461 end
340 end 462 self.overlay:Show()
341 f:Show() 463 self:RefreshSecureState()
342 elseif f then 464 elseif self.overlay then
343 f:Hide() 465 self.overlay:Hide()
344 end 466 end
345 end 467 end
346 468
347 function Bar:RefreshControls() 469 function Bar:RefreshControls()
348 if self.overlay and self.overlay:IsShown() then 470 if self.overlay and self.overlay:IsShown() then
358 480
359 -- 481 --
360 -- Secure state functions 482 -- Secure state functions
361 -- 483 --
362 484
485 function Bar:GetSecureState()
486 local env = GetManagedEnvironment(self:GetFrame())
487 return env and env.state
488 end
489
490 function Bar:GetStateProperty(state, propname)
491 -- override in modules/State.lua for now
492 end
493
494 function Bar:SetStateProperty(state, propname, value)
495 -- override in modules/State.lua for now
496 end
497
498 function Bar:RefreshSecureState()
499 self:GetFrame():Execute(_reaction_refresh)
500 end
501
502 -- usage: SetSecureData(globalname, [tblkey1, tblkey2, ...], value)
503 function Bar:SetSecureData( ... )
504 local n = select('#',...)
505 if n < 2 then
506 error("ReAction.Bar:SetSecureData() requires at least 2 arguments")
507 end
508 local f = self:GetFrame()
509 f:SetAttribute("data-depth",n-1)
510 f:SetAttribute("data-value",select(n,...))
511 for i = 1, n-1 do
512 local key = select(i,...)
513 if key == nil then
514 error("ReAction.Bar:SetSecureData() - nil table key in argument list (#"..i..")")
515 end
516 f:SetAttribute("data-key-"..i, key)
517 end
518 f:Execute(
519 [[
520 local n = self:GetAttribute("data-depth")
521 if n > 0 then
522 local value = self:GetAttribute("data-value")
523 local t = _G
524 for i = 1, n do
525 local key = self:GetAttribute("data-key-"..i)
526 if not key then return end
527 if not t[key] then
528 t[key] = newtable()
529 end
530 if i == n then
531 t[key] = value
532 else
533 t = t[key]
534 end
535 end
536 end
537 ]])
538 self:RefreshSecureState()
539 end
540
541 function Bar:SetSecureStateData( state, key, value )
542 self:SetSecureData("settings",state,key,value)
543 end
544
545 -- sets a snippet to be run as an extension to _onstate-reaction
546 function Bar:SetSecureStateExtension( id, snippet )
547 if id == nil then
548 error("ReAction.Bar:SetSecureStateExtension() requires an id")
549 end
550 local f = self:GetFrame()
551 f:SetAttribute("input-secure-ext-id",id)
552 f:SetAttribute("secure-ext-"..id,snippet)
553 f:Execute(
554 [[
555 local id = self:GetAttribute("input-secure-ext-id")
556 if id then
557 extensions[id] = self:GetAttribute("secure-ext-"..id) or nil
558 end
559 ]])
560 self:RefreshSecureState()
561 end
562
563 function Bar:SetFrameRef( name, refFrame )
564 if refFrame then
565 local _, explicit = refFrame:IsProtected()
566 if not explicit then
567 refFrame = nil
568 end
569 end
570 if refFrame then
571 self:GetFrame():SetFrameRef(name,refFrame)
572 else
573 self:GetFrame():SetAttribute("frameref-"..name,nil)
574 end
575 end
576
577 function Bar:SetStateDriver( rule )
578 if rule then
579 RegisterStateDriver(self:GetFrame(),"reaction",rule)
580 elseif self.statedriver then
581 UnregisterStateDriver(self:GetFrame(),"reaction")
582 end
583 self.statedriver = rule
584 self:RefreshSecureState()
585 end
586
363 -- pass unit=nil to set up the unit elsewhere, if you want something more complex 587 -- pass unit=nil to set up the unit elsewhere, if you want something more complex
364 function Bar:RegisterUnitWatch( unit, enable ) 588 function Bar:RegisterUnitWatch( unit, enable )
365 local f = self:GetFrame() 589 local f = self:GetFrame()
366 if unit then 590 if unit then
367 f:SetAttribute("unit",unit) 591 f:SetAttribute("unit",unit)
368 end 592 end
369 if not ReAction:GetConfigMode() then
370 if enable then
371 RegisterUnitWatch(f)
372 elseif self.unitwatch then
373 UnregisterUnitWatch(f)
374 end
375 end
376 self.unitwatch = enable 593 self.unitwatch = enable
377 end 594 self:UpdateUnitWatch()
378 595 end
596
597 -- set a keybind to push a value into "state-reaction" attribute
598 function Bar:SetStateKeybind( key, state )
599 local f = self:GetFrame()
600 local binds = self.statebinds
601 if not binds then
602 binds = { }
603 self.statebinds = binds
604 end
605
606 -- clear the old binding, if any
607 if binds[state] then
608 SetOverrideBinding(f, false, binds[state], nil)
609 end
610
611 if key then
612 SetOverrideBinding(f, false, key, state, nil) -- state name is virtual mouse button
613 end
614 binds[state] = key
615 end
616
617 function Bar:GetStateKeybind( state )
618 if self.statebinds and state then
619 return self.statebinds[state]
620 end
621 end
622
623 function Bar:UpdateDefaultStateAnchor()
624 local point, frame, relPoint, x, y = self:GetAnchor()
625 local f = self:GetFrame()
626 f:SetAttribute("defaultAnchor-point",point)
627 f:SetAttribute("defaultAnchor-relPoint",relPoint)
628 f:SetAttribute("defaultAnchor-x",x)
629 f:SetAttribute("defaultAnchor-y",y)
630 self:SetFrameRef("defaultAnchor",_G[frame or "UIParent"])
631 f:Execute([[
632 for _, k in pairs(anchorKeys) do
633 defaultAnchor[k] = self:GetAttribute("defaultAnchor-"..k)
634 end
635 defaultAnchor.frame = self:GetAttribute("frameref-defaultAnchor")
636 ]])
637 end
638
639 function Bar:UpdateDefaultStateAlpha()
640 local f = self:GetFrame()
641 f:SetAttribute("defaultAlpha",self:GetAlpha())
642 f:Execute([[
643 defaultAlpha = self:GetAttribute("defaultAlpha")
644 ]])
645 end