An alternative to using Blizzard's SecureStateDriver for non-secure code. As this code is not secure, modification during combat is not an issue.
State determination is done through Blizzard's own SecureCmdOptionParse function, allowing for full use of macro-style parameters. As new parameters are encountered they are parsed, and the result cached, to determine the best way to keep their state accurate (OnEvent/OnUpdate).
CPU use is kept minimal with a couple of features:
- The parameter parse can detect if a portion of the parameters will never be reached, or if the state can never change, and adjust accordingly.
- Event usage is tracked to ensure that any unused event is unregistered to prevent unnecessary processing.
Example - Hide/Show a frame in/out of combat:
Code:
local frame = CreateFrame('Frame', nil, UIParent)
local function handler(object, method)
object[method](object)
end
local stateDriver = LibStub('LibStateDriver-1.1'):New()
stateDriver:SetCallback(handler)
stateDriver:SetObject(frame)
stateDriver:SetParameters("[combat] Hide; Show")
stateDriver:Enable()
Example - Hide a frame in a raid, dim it in combat or in a party:
Code:
local frame = CreateFrame('Frame', nil, UIParent)
local function handler(object, alpha)
alpha = tonumber(alpha) or 1
if alpha == 0 then
object:Hide()
else
object:SetAlpha(alpha)
object:Show()
end
end
local stateDriver = LibStub('LibStateDriver-1.1'):New(true)
stateDriver:SetCallback(handler)
stateDriver:SetObject(frame)
stateDriver:SetParameters("[group:raid] 0; [combat][group:party] 0.5; 1")
API
stateDriver = lib:New([enable])
Create a new state driver object.
Arguments:
enable - (boolean) If true then the state driver will be enabled upon creation.
Returns:
stateDriver - (table) The state driver object to be used by the calling code (see State Drivers below).
State Drivers
The object returned by lib:New() is an empty table with a metatable that provides several methods. The table itself is not utilized by the library and is completely at the disposal of the calling code to use as needed. The methods provided are:
stateDriver([force])
Trigger an immediate state update of stateDriver. If stateDriver is enabled, or force is set, then a callback is also triggered.
Arguments:
force - (boolean) Indicates to treat stateDriver as enabled even if its not.
stateDriver:Disable()
Stop stateDriver from monitoring for state changes and triggering callbacks. Upon creation stateDriver is automatically disabled unless the enable field was set.
stateDriver:Enable()
Start stateDriver monitoring for state changes and triggering callbacks, also immediately triggers a state update and callback.
callback = stateDriver:GetCallback()
Get the callback function currently assigned to stateDriver.
Returns:
callback - (function or nil) The assigned callback.
object = stateDriver:GetObject()
Get the object (first argument) that is to be passed during stateDriver's callback.
Returns:
object - (any) The assigned object.
parameters = stateDriver:GetParameters()
Get the parameters currently assigned to stateDriver.
Returns:
parameters - (string) The assigned parameters.
state = stateDriver:GetState()
Get the state of stateDriver as determined by the last evaluation of it's assigned parameters.
Returns:
state - (string or nil) The state currently associated with stateDriver.
enabled = stateDriver:IsEnabled()
Get the enabled status of the stateDriver.
Returns:
enabled - (boolean) The current status of stateDriver, true if enabled.
stateDriver:Pack(...)
The inverse function to unpack(stateDriver).
Arguments:
... - (any) The values to be loaded into stateDriver.
stateDriver:Recycle()
Removes the metatable from stateDriver as well as removing all internal references so that it may be be garbage collected.
stateDriver:SetCallback(callback)
Set the function to be called when stateDriver's state changes, defaulting to a dummy function upon creation or if set to nil. The callback function is passed: object, state.
Arguments:
callback - (function or nil) The function to be called when a state change occurs.
stateDriver:SetObject(object)
Set the object (first argument) that is to be passed to stateDriver's callback function, defaulting to stateDriver upon creation or if set to nil.
Arguments:
object - (any) The object to be passed.
stateDriver:SetParameters(parameters)
Set the macro-style parameters that are to be evaluated for stateDriver's state changes, defaulting to "" upon creation or if set to nil. Changing parameters immediately causes the state to be re-evaluated and if it changed a callback is triggered, unless stateDriver is disabled.
Arguments:
parameters - (string or nil) The parameters that are to be monitored for state changes.
stateDriver:Toggle()
Switch the status of stateDriver from enabled to disabled or vice-versa.