Skip to content

Instantly share code, notes, and snippets.

@Meorawr
Created June 28, 2020 11:12
Show Gist options
  • Save Meorawr/873d8e767826f210b0f16b9adc392a13 to your computer and use it in GitHub Desktop.
Save Meorawr/873d8e767826f210b0f16b9adc392a13 to your computer and use it in GitHub Desktop.
ButtonGroupMixin
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);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment