|
local ButtonGroupMixin = CreateFromMixins(CallbackRegistryBaseMixin); |
|
|
|
function ButtonGroupMixin:Init() |
|
CallbackRegistryBaseMixin.OnLoad(self); |
|
|
|
self.buttons = {}; |
|
self.selectedButton = nil; |
|
end |
|
|
|
function ButtonGroupMixin:AddButton(button) |
|
if self.buttons[button] then |
|
return; |
|
end |
|
|
|
assert(not self:GetButtonByID(button:GetID()), "Duplicate button ID in group"); |
|
|
|
self.buttons[button] = true; |
|
button:SetScript("OnClick", function() self:SetSelectedButton(button); end); |
|
end |
|
|
|
function ButtonGroupMixin:GetButtonByID(id) |
|
-- Linear search; slow, but are you likely to have many in a group? |
|
for button in pairs(self.buttons) do |
|
if button:GetID() == id then |
|
return button; |
|
end |
|
end |
|
end |
|
|
|
function ButtonGroupMixin:GetSelectedButton() |
|
return self.selectedButton; |
|
end |
|
|
|
function ButtonGroupMixin:GetSelectedID() |
|
if not self.selectedButton then |
|
return nil; |
|
end |
|
|
|
return self.selectedButton:GetID(); |
|
end |
|
|
|
function ButtonGroupMixin:SetSelectedButton(button) |
|
if self.selectedButton == button then |
|
if self.selectedButton then |
|
-- Prevents the UI from toggling it off visually when clicked. |
|
self.selectedButton:SetChecked(true); |
|
end |
|
|
|
return; |
|
end |
|
|
|
if self.selectedButton then |
|
self.selectedButton:SetChecked(false); |
|
end |
|
|
|
self.selectedButton = button; |
|
self.selectedButton:SetChecked(true); |
|
self:TriggerEvent("OnSelectedButtonChanged", self.selectedButton); |
|
self:TriggerEvent("OnSelectedIDChanged", self.selectedButton:GetID()); |
|
end |
|
|
|
function ButtonGroupMixin:SetSelectedID(id) |
|
local button = assert(self:GetButtonByID(id), "No button found with given ID"); |
|
self:SetSelectedButton(button); |
|
end |
|
|
|
-- |
|
-- Example |
|
-- |
|
|
|
local frame = CreateFrame("Frame", nil, UIParent, "BasicFrameTemplate"); |
|
frame:SetPoint("CENTER"); |
|
frame:SetSize(640, 480); |
|
|
|
local button1 = CreateFrame("CheckButton", nil, frame, "UIRadioButtonTemplate"); |
|
button1:SetID(1); |
|
button1:SetPoint("CENTER"); |
|
button1:SetText("Button 1"); |
|
|
|
local button2 = CreateFrame("CheckButton", nil, frame, "UIRadioButtonTemplate"); |
|
button2:SetID(2); |
|
button2:SetPoint("TOP", button1, "BOTTOM"); |
|
button2:SetText("Button 2"); |
|
|
|
local button3 = CreateFrame("CheckButton", nil, frame, "UIRadioButtonTemplate"); |
|
button3:SetID(3); |
|
button3:SetPoint("TOP", button2, "BOTTOM"); |
|
button3:SetText("Button 3"); |
|
|
|
local group = CreateAndInitFromMixin(ButtonGroupMixin); |
|
group:RegisterCallback("OnSelectedButtonChanged", function(...) print("OnSelectedButtonChanged", ...) end); |
|
group:RegisterCallback("OnSelectedIDChanged", function(...) print("OnSelectedIDChanged", ...) end); |
|
group:AddButton(button1); |
|
group:AddButton(button2); |
|
group:AddButton(button3); |