farmbuyer@1: --[[ farmbuyer@1: This is exactly the same as the normal CheckBox widget, rev 21, but with a farmbuyer@1: different font string choice for the text label. (The same one as used for farmbuyer@1: the "description" string, by coincidence.) There's no way to cleanly change farmbuyer@1: *and restore* the font strings without a pile of (possibly chained) OnRelease farmbuyer@1: hooks, which just makes more noise in the problem domain. farmbuyer@1: - farmbuyer farmbuyer@1: ]] farmbuyer@1: farmbuyer@1: --[[----------------------------------------------------------------------------- farmbuyer@1: Checkbox Widget farmbuyer@1: -------------------------------------------------------------------------------]] farmbuyer@1: local Type, Version = "CheckBoxSmallLabel", 21 farmbuyer@1: local AceGUI = LibStub and LibStub("AceGUI-3.0", true) farmbuyer@1: if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end farmbuyer@1: farmbuyer@1: -- Lua APIs farmbuyer@1: local select, pairs = select, pairs farmbuyer@1: farmbuyer@1: -- WoW APIs farmbuyer@1: local PlaySound = PlaySound farmbuyer@1: local CreateFrame, UIParent = CreateFrame, UIParent farmbuyer@1: farmbuyer@1: -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded farmbuyer@1: -- List them here for Mikk's FindGlobals script farmbuyer@1: -- GLOBALS: SetDesaturation, GameFontHighlight farmbuyer@1: farmbuyer@1: --[[----------------------------------------------------------------------------- farmbuyer@1: Support functions farmbuyer@1: -------------------------------------------------------------------------------]] farmbuyer@1: local function AlignImage(self) farmbuyer@1: local img = self.image:GetTexture() farmbuyer@1: self.text:ClearAllPoints() farmbuyer@1: if not img then farmbuyer@1: self.text:SetPoint("LEFT", self.checkbg, "RIGHT") farmbuyer@1: self.text:SetPoint("RIGHT") farmbuyer@1: else farmbuyer@1: self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0) farmbuyer@1: self.text:SetPoint("RIGHT") farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: --[[----------------------------------------------------------------------------- farmbuyer@1: Scripts farmbuyer@1: -------------------------------------------------------------------------------]] farmbuyer@1: local function Control_OnEnter(frame) farmbuyer@1: frame.obj:Fire("OnEnter") farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function Control_OnLeave(frame) farmbuyer@1: frame.obj:Fire("OnLeave") farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function CheckBox_OnMouseDown(frame) farmbuyer@1: local self = frame.obj farmbuyer@1: if not self.disabled then farmbuyer@1: if self.image:GetTexture() then farmbuyer@1: self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1) farmbuyer@1: else farmbuyer@1: self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: AceGUI:ClearFocus() farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function CheckBox_OnMouseUp(frame) farmbuyer@1: local self = frame.obj farmbuyer@1: if not self.disabled then farmbuyer@1: self:ToggleChecked() farmbuyer@1: farmbuyer@1: if self.checked then farmbuyer@1: PlaySound("igMainMenuOptionCheckBoxOn") farmbuyer@1: else -- for both nil and false (tristate) farmbuyer@1: PlaySound("igMainMenuOptionCheckBoxOff") farmbuyer@1: end farmbuyer@1: farmbuyer@1: self:Fire("OnValueChanged", self.checked) farmbuyer@1: AlignImage(self) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: --[[----------------------------------------------------------------------------- farmbuyer@1: Methods farmbuyer@1: -------------------------------------------------------------------------------]] farmbuyer@1: local methods = { farmbuyer@1: ["OnAcquire"] = function(self) farmbuyer@1: self:SetType() farmbuyer@1: self:SetValue(false) farmbuyer@1: self:SetTriState(nil) farmbuyer@1: -- height is calculated from the width and required space for the description farmbuyer@1: self:SetWidth(200) farmbuyer@1: self:SetImage() farmbuyer@1: self:SetDisabled(nil) farmbuyer@1: self:SetDescription(nil) farmbuyer@1: end, farmbuyer@1: farmbuyer@1: -- ["OnRelease"] = nil, farmbuyer@1: farmbuyer@1: ["OnWidthSet"] = function(self, width) farmbuyer@1: if self.desc then farmbuyer@1: self.desc:SetWidth(width - 30) farmbuyer@1: if self.desc:GetText() and self.desc:GetText() ~= "" then farmbuyer@1: self:SetHeight(28 + self.desc:GetHeight()) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetDisabled"] = function(self, disabled) farmbuyer@1: self.disabled = disabled farmbuyer@1: if disabled then farmbuyer@1: self.frame:Disable() farmbuyer@1: self.text:SetTextColor(0.5, 0.5, 0.5) farmbuyer@1: SetDesaturation(self.check, true) farmbuyer@1: else farmbuyer@1: self.frame:Enable() farmbuyer@1: self.text:SetTextColor(1, 1, 1) farmbuyer@1: if self.tristate and self.checked == nil then farmbuyer@1: SetDesaturation(self.check, true) farmbuyer@1: else farmbuyer@1: SetDesaturation(self.check, false) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetValue"] = function(self,value) farmbuyer@1: local check = self.check farmbuyer@1: self.checked = value farmbuyer@1: if value then farmbuyer@1: SetDesaturation(self.check, false) farmbuyer@1: self.check:Show() farmbuyer@1: else farmbuyer@1: --Nil is the unknown tristate value farmbuyer@1: if self.tristate and value == nil then farmbuyer@1: SetDesaturation(self.check, true) farmbuyer@1: self.check:Show() farmbuyer@1: else farmbuyer@1: SetDesaturation(self.check, false) farmbuyer@1: self.check:Hide() farmbuyer@1: end farmbuyer@1: end farmbuyer@1: self:SetDisabled(self.disabled) farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["GetValue"] = function(self) farmbuyer@1: return self.checked farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetTriState"] = function(self, enabled) farmbuyer@1: self.tristate = enabled farmbuyer@1: self:SetValue(self:GetValue()) farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetType"] = function(self, type) farmbuyer@1: local checkbg = self.checkbg farmbuyer@1: local check = self.check farmbuyer@1: local highlight = self.highlight farmbuyer@1: farmbuyer@1: local size farmbuyer@1: if type == "radio" then farmbuyer@1: size = 16 farmbuyer@1: checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton") farmbuyer@1: checkbg:SetTexCoord(0, 0.25, 0, 1) farmbuyer@1: check:SetTexture("Interface\\Buttons\\UI-RadioButton") farmbuyer@1: check:SetTexCoord(0.25, 0.5, 0, 1) farmbuyer@1: check:SetBlendMode("ADD") farmbuyer@1: highlight:SetTexture("Interface\\Buttons\\UI-RadioButton") farmbuyer@1: highlight:SetTexCoord(0.5, 0.75, 0, 1) farmbuyer@1: else farmbuyer@1: size = 24 farmbuyer@1: checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") farmbuyer@1: checkbg:SetTexCoord(0, 1, 0, 1) farmbuyer@1: check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") farmbuyer@1: check:SetTexCoord(0, 1, 0, 1) farmbuyer@1: check:SetBlendMode("BLEND") farmbuyer@1: highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") farmbuyer@1: highlight:SetTexCoord(0, 1, 0, 1) farmbuyer@1: end farmbuyer@1: checkbg:SetHeight(size) farmbuyer@1: checkbg:SetWidth(size) farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["ToggleChecked"] = function(self) farmbuyer@1: local value = self:GetValue() farmbuyer@1: if self.tristate then farmbuyer@1: --cycle in true, nil, false order farmbuyer@1: if value then farmbuyer@1: self:SetValue(nil) farmbuyer@1: elseif value == nil then farmbuyer@1: self:SetValue(false) farmbuyer@1: else farmbuyer@1: self:SetValue(true) farmbuyer@1: end farmbuyer@1: else farmbuyer@1: self:SetValue(not self:GetValue()) farmbuyer@1: end farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetLabel"] = function(self, label) farmbuyer@1: self.text:SetText(label) farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetDescription"] = function(self, desc) farmbuyer@1: if desc then farmbuyer@1: if not self.desc then farmbuyer@1: local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") farmbuyer@1: desc:ClearAllPoints() farmbuyer@1: desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21) farmbuyer@1: desc:SetWidth(self.frame.width - 30) farmbuyer@1: desc:SetJustifyH("LEFT") farmbuyer@1: desc:SetJustifyV("TOP") farmbuyer@1: self.desc = desc farmbuyer@1: end farmbuyer@1: self.desc:Show() farmbuyer@1: --self.text:SetFontObject(GameFontNormal) farmbuyer@1: self.desc:SetText(desc) farmbuyer@1: self:SetHeight(28 + self.desc:GetHeight()) farmbuyer@1: else farmbuyer@1: if self.desc then farmbuyer@1: self.desc:SetText("") farmbuyer@1: self.desc:Hide() farmbuyer@1: end farmbuyer@1: --self.text:SetFontObject(GameFontHighlight) farmbuyer@1: self:SetHeight(24) farmbuyer@1: end farmbuyer@1: end, farmbuyer@1: farmbuyer@1: ["SetImage"] = function(self, path, ...) farmbuyer@1: local image = self.image farmbuyer@1: image:SetTexture(path) farmbuyer@1: farmbuyer@1: if image:GetTexture() then farmbuyer@1: local n = select("#", ...) farmbuyer@1: if n == 4 or n == 8 then farmbuyer@1: image:SetTexCoord(...) farmbuyer@1: else farmbuyer@1: image:SetTexCoord(0, 1, 0, 1) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: AlignImage(self) farmbuyer@1: end farmbuyer@1: } farmbuyer@1: farmbuyer@1: --[[----------------------------------------------------------------------------- farmbuyer@1: Constructor farmbuyer@1: -------------------------------------------------------------------------------]] farmbuyer@1: local function Constructor() farmbuyer@1: local frame = CreateFrame("Button", nil, UIParent) farmbuyer@1: frame:Hide() farmbuyer@1: farmbuyer@1: frame:EnableMouse(true) farmbuyer@1: frame:SetScript("OnEnter", Control_OnEnter) farmbuyer@1: frame:SetScript("OnLeave", Control_OnLeave) farmbuyer@1: frame:SetScript("OnMouseDown", CheckBox_OnMouseDown) farmbuyer@1: frame:SetScript("OnMouseUp", CheckBox_OnMouseUp) farmbuyer@1: farmbuyer@1: local checkbg = frame:CreateTexture(nil, "ARTWORK") farmbuyer@1: checkbg:SetWidth(24) farmbuyer@1: checkbg:SetHeight(24) farmbuyer@1: checkbg:SetPoint("TOPLEFT") farmbuyer@1: checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") farmbuyer@1: farmbuyer@1: local check = frame:CreateTexture(nil, "OVERLAY") farmbuyer@1: check:SetAllPoints(checkbg) farmbuyer@1: check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") farmbuyer@1: farmbuyer@1: --local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") farmbuyer@1: local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") farmbuyer@1: text:SetJustifyH("LEFT") farmbuyer@1: text:SetHeight(18) farmbuyer@1: text:SetPoint("LEFT", checkbg, "RIGHT") farmbuyer@1: text:SetPoint("RIGHT") farmbuyer@1: farmbuyer@1: local highlight = frame:CreateTexture(nil, "HIGHLIGHT") farmbuyer@1: highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") farmbuyer@1: highlight:SetBlendMode("ADD") farmbuyer@1: highlight:SetAllPoints(checkbg) farmbuyer@1: farmbuyer@1: local image = frame:CreateTexture(nil, "OVERLAY") farmbuyer@1: image:SetHeight(16) farmbuyer@1: image:SetWidth(16) farmbuyer@1: image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0) farmbuyer@1: farmbuyer@1: local widget = { farmbuyer@1: checkbg = checkbg, farmbuyer@1: check = check, farmbuyer@1: text = text, farmbuyer@1: highlight = highlight, farmbuyer@1: image = image, farmbuyer@1: frame = frame, farmbuyer@1: type = Type farmbuyer@1: } farmbuyer@1: for method, func in pairs(methods) do farmbuyer@1: widget[method] = func farmbuyer@1: end farmbuyer@1: farmbuyer@1: return AceGUI:RegisterAsWidget(widget) farmbuyer@1: end farmbuyer@1: farmbuyer@1: AceGUI:RegisterWidgetType(Type, Constructor, Version)