Asa@0: local AceGUI = LibStub("AceGUI-3.0") Asa@0: Asa@0: -- Lua APIs Asa@0: local select = select Asa@0: Asa@0: -- WoW APIs Asa@0: local CreateFrame, UIParent = CreateFrame, UIParent Asa@0: Asa@0: -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded Asa@0: -- List them here for Mikk's FindGlobals script Asa@0: -- GLOBALS: SetDesaturation, GameFontHighlight Asa@0: Asa@0: -------------------------- Asa@0: -- Check Box -- Asa@0: -------------------------- Asa@0: --[[ Asa@0: Events : Asa@0: OnValueChanged Asa@0: Asa@0: ]] Asa@0: do Asa@0: local Type = "CheckBox" Asa@0: local Version = 13 Asa@0: Asa@0: local function OnAcquire(self) Asa@0: self:SetValue(false) Asa@0: self.tristate = nil Asa@0: self:SetHeight(24) Asa@0: self:SetWidth(200) Asa@0: self:SetImage() Asa@0: end Asa@0: Asa@0: local function OnRelease(self) Asa@0: self.frame:ClearAllPoints() Asa@0: self.frame:Hide() Asa@0: self.check:Hide() Asa@0: self.highlight:Hide() Asa@0: self.down = nil Asa@0: self.checked = nil Asa@0: self:SetType() Asa@0: self:SetDisabled(false) Asa@0: self:SetDescription(nil) Asa@0: end Asa@0: Asa@0: local function CheckBox_OnEnter(this) Asa@0: local self = this.obj Asa@0: self.highlight:Show() Asa@0: self:Fire("OnEnter") Asa@0: end Asa@0: Asa@0: local function CheckBox_OnLeave(this) Asa@0: local self = this.obj Asa@0: self.highlight:Hide() Asa@0: self:Fire("OnLeave") Asa@0: end Asa@0: Asa@0: local function CheckBox_OnMouseUp(this) Asa@0: local self = this.obj Asa@0: if not self.disabled then Asa@0: self:ToggleChecked() Asa@0: self:Fire("OnValueChanged",self.checked) Asa@0: self.text:SetPoint("LEFT",self.check,"RIGHT",0,0) Asa@0: end Asa@0: self.down = nil Asa@0: end Asa@0: Asa@0: local function CheckBox_OnMouseDown(this) Asa@0: local self = this.obj Asa@0: if not self.disabled then Asa@0: self.text:SetPoint("LEFT",self.check,"RIGHT",1,-1) Asa@0: self.down = true Asa@0: end Asa@0: AceGUI:ClearFocus() Asa@0: end Asa@0: Asa@0: local function SetDisabled(self,disabled) Asa@0: self.disabled = disabled Asa@0: if disabled then Asa@0: self.frame:Disable() Asa@0: self.text:SetTextColor(0.5,0.5,0.5) Asa@0: SetDesaturation(self.check, true) Asa@0: else Asa@0: self.frame:Enable() Asa@0: self.text:SetTextColor(1,1,1) Asa@0: if self.tristate and self.checked == nil then Asa@0: SetDesaturation(self.check, true) Asa@0: else Asa@0: SetDesaturation(self.check, false) Asa@0: end Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetValue(self,value) Asa@0: local check = self.check Asa@0: self.checked = value Asa@0: if value then Asa@0: SetDesaturation(self.check, false) Asa@0: self.check:Show() Asa@0: else Asa@0: --Nil is the unknown tristate value Asa@0: if self.tristate and value == nil then Asa@0: SetDesaturation(self.check, true) Asa@0: self.check:Show() Asa@0: else Asa@0: SetDesaturation(self.check, false) Asa@0: self.check:Hide() Asa@0: end Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetTriState(self, enabled) Asa@0: self.tristate = enabled Asa@0: self:SetValue(self:GetValue()) Asa@0: end Asa@0: Asa@0: local function GetValue(self) Asa@0: return self.checked Asa@0: end Asa@0: Asa@0: local function SetType(self, type) Asa@0: local checkbg = self.checkbg Asa@0: local check = self.check Asa@0: local highlight = self.highlight Asa@0: Asa@0: if type == "radio" then Asa@0: checkbg:SetHeight(16) Asa@0: checkbg:SetWidth(16) Asa@0: checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton") Asa@0: checkbg:SetTexCoord(0,0.25,0,1) Asa@0: check:SetHeight(16) Asa@0: check:SetWidth(16) Asa@0: check:SetTexture("Interface\\Buttons\\UI-RadioButton") Asa@0: check:SetTexCoord(0.25,0.5,0,1) Asa@0: check:SetBlendMode("ADD") Asa@0: highlight:SetTexture("Interface\\Buttons\\UI-RadioButton") Asa@0: highlight:SetTexCoord(0.5,0.75,0,1) Asa@0: else Asa@0: checkbg:SetHeight(24) Asa@0: checkbg:SetWidth(24) Asa@0: checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") Asa@0: checkbg:SetTexCoord(0,1,0,1) Asa@0: check:SetHeight(24) Asa@0: check:SetWidth(24) Asa@0: check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") Asa@0: check:SetTexCoord(0,1,0,1) Asa@0: check:SetBlendMode("BLEND") Asa@0: highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") Asa@0: highlight:SetTexCoord(0,1,0,1) Asa@0: end Asa@0: end Asa@0: Asa@0: local function ToggleChecked(self) Asa@0: local value = self:GetValue() Asa@0: if self.tristate then Asa@0: --cycle in true, nil, false order Asa@0: if value then Asa@0: self:SetValue(nil) Asa@0: elseif value == nil then Asa@0: self:SetValue(false) Asa@0: else Asa@0: self:SetValue(true) Asa@0: end Asa@0: else Asa@0: self:SetValue(not self:GetValue()) Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetLabel(self, label) Asa@0: self.text:SetText(label) Asa@0: end Asa@0: Asa@0: local function SetDescription(self, desc) Asa@0: if desc then Asa@0: if not self.desc then Asa@0: local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") Asa@0: desc:ClearAllPoints() Asa@0: desc:SetPoint("TOPLEFT", self.check, "TOPRIGHT", 5, -21) Asa@0: desc:SetWidth(self.frame.width - 30) Asa@0: desc:SetJustifyH("LEFT") Asa@0: desc:SetJustifyV("TOP") Asa@0: self.desc = desc Asa@0: end Asa@0: self.desc:Show() Asa@0: --self.text:SetFontObject(GameFontNormal) Asa@0: self.desc:SetText(desc) Asa@0: self:SetHeight(28 + self.desc:GetHeight()) Asa@0: else Asa@0: if self.desc then Asa@0: self.desc:SetText("") Asa@0: self.desc:Hide() Asa@0: end Asa@0: self.text:SetFontObject(GameFontHighlight) Asa@0: self:SetHeight(24) Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetImage(self, path, ...) Asa@0: local image = self.image Asa@0: image:SetTexture(path) Asa@0: Asa@0: if image:GetTexture() then Asa@0: local n = select('#', ...) Asa@0: if n == 4 or n == 8 then Asa@0: image:SetTexCoord(...) Asa@0: else Asa@0: image:SetTexCoord(0, 1, 0, 1) Asa@0: end Asa@0: end Asa@0: self:AlignImage() Asa@0: end Asa@0: Asa@0: local function AlignImage(self) Asa@0: local img = self.image:GetTexture() Asa@0: self.text:ClearAllPoints() Asa@0: if not img then Asa@0: self.text:SetPoint("LEFT", self.check, "RIGHT", 0, 0) Asa@0: self.text:SetPoint("RIGHT", self.frame, "RIGHT", 0, 0) Asa@0: else Asa@0: self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0) Asa@0: self.text:SetPoint("RIGHT", self.frame,"RIGHT", 0, 0) Asa@0: end Asa@0: end Asa@0: Asa@0: local function OnWidthSet(self, width) Asa@0: if self.desc and self.desc:GetText() ~= "" then Asa@0: self.desc:SetWidth(width - 30) Asa@0: self:SetHeight(28 + self.desc:GetHeight()) Asa@0: end Asa@0: end Asa@0: Asa@0: local function Constructor() Asa@0: local frame = CreateFrame("Button",nil,UIParent) Asa@0: local self = {} Asa@0: self.type = Type Asa@0: Asa@0: self.OnRelease = OnRelease Asa@0: self.OnAcquire = OnAcquire Asa@0: Asa@0: self.SetValue = SetValue Asa@0: self.GetValue = GetValue Asa@0: self.SetDisabled = SetDisabled Asa@0: self.SetType = SetType Asa@0: self.ToggleChecked = ToggleChecked Asa@0: self.SetLabel = SetLabel Asa@0: self.SetTriState = SetTriState Asa@0: self.SetDescription = SetDescription Asa@0: self.OnWidthSet = OnWidthSet Asa@0: self.SetImage = SetImage Asa@0: self.AlignImage = AlignImage Asa@0: Asa@0: self.frame = frame Asa@0: frame.obj = self Asa@0: Asa@0: local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight") Asa@0: self.text = text Asa@0: Asa@0: frame:SetScript("OnEnter",CheckBox_OnEnter) Asa@0: frame:SetScript("OnLeave",CheckBox_OnLeave) Asa@0: frame:SetScript("OnMouseUp",CheckBox_OnMouseUp) Asa@0: frame:SetScript("OnMouseDown",CheckBox_OnMouseDown) Asa@0: frame:EnableMouse() Asa@0: local checkbg = frame:CreateTexture(nil,"ARTWORK") Asa@0: self.checkbg = checkbg Asa@0: checkbg:SetWidth(24) Asa@0: checkbg:SetHeight(24) Asa@0: checkbg:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) Asa@0: checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") Asa@0: local check = frame:CreateTexture(nil,"OVERLAY") Asa@0: self.check = check Asa@0: check:SetWidth(24) Asa@0: check:SetHeight(24) Asa@0: check:SetPoint("CENTER",checkbg,"CENTER",0,0) Asa@0: check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") Asa@0: Asa@0: local highlight = frame:CreateTexture(nil, "OVERLAY") Asa@0: self.highlight = highlight Asa@0: highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") Asa@0: highlight:SetBlendMode("ADD") Asa@0: highlight:SetAllPoints(checkbg) Asa@0: highlight:Hide() Asa@0: Asa@0: local image = frame:CreateTexture(nil, "OVERLAY") Asa@0: self.image = image Asa@0: image:SetHeight(16) Asa@0: image:SetWidth(16) Asa@0: image:SetPoint("LEFT", check, "RIGHT", 1, 0) Asa@0: Asa@0: text:SetJustifyH("LEFT") Asa@0: frame:SetHeight(24) Asa@0: frame:SetWidth(200) Asa@0: text:SetHeight(18) Asa@0: text:SetPoint("LEFT",check,"RIGHT",0,0) Asa@0: text:SetPoint("RIGHT",frame,"RIGHT",0,0) Asa@0: Asa@0: AceGUI:RegisterAsWidget(self) Asa@0: return self Asa@0: end Asa@0: Asa@0: AceGUI:RegisterWidgetType(Type,Constructor,Version) Asa@0: end