annotate AceGUIWidget-CheckBoxSmallLabel.lua @ 151:42dd3076baaf

Initial attempt at tracking bonus rolls and non-loot items. Add more loot-catching patterns, and generalize them a little more. Bonus rolls are tracked by default, non-loot stuff is not. Bonus rolls don't seem to be working, but non-loot definitely is. (It may be that the patterns for bonus rolls are not actually used by the game client, or rather, that the game client does not issue those events for bonus rolls which are not your own. I have yet to win a bonus roll since implementing the code, but one person in LFR claimed to win a bonus item which simply wasn't visible to me at all. More data needed.)
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 09 Jan 2015 19:14:56 -0500
parents fe04f5c4114a
children
rev   line source
farmbuyer@1 1 --[[
farmbuyer@1 2 This is exactly the same as the normal CheckBox widget, rev 21, but with a
farmbuyer@1 3 different font string choice for the text label. (The same one as used for
farmbuyer@1 4 the "description" string, by coincidence.) There's no way to cleanly change
farmbuyer@1 5 *and restore* the font strings without a pile of (possibly chained) OnRelease
farmbuyer@1 6 hooks, which just makes more noise in the problem domain.
farmbuyer@1 7 - farmbuyer
farmbuyer@1 8 ]]
farmbuyer@1 9
farmbuyer@1 10 --[[-----------------------------------------------------------------------------
farmbuyer@1 11 Checkbox Widget
farmbuyer@1 12 -------------------------------------------------------------------------------]]
farmbuyer@1 13 local Type, Version = "CheckBoxSmallLabel", 21
farmbuyer@1 14 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
farmbuyer@1 15 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
farmbuyer@1 16
farmbuyer@1 17 -- Lua APIs
farmbuyer@1 18 local select, pairs = select, pairs
farmbuyer@1 19
farmbuyer@1 20 -- WoW APIs
farmbuyer@1 21 local PlaySound = PlaySound
farmbuyer@1 22 local CreateFrame, UIParent = CreateFrame, UIParent
farmbuyer@1 23
farmbuyer@1 24 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
farmbuyer@1 25 -- List them here for Mikk's FindGlobals script
farmbuyer@1 26 -- GLOBALS: SetDesaturation, GameFontHighlight
farmbuyer@1 27
farmbuyer@1 28 --[[-----------------------------------------------------------------------------
farmbuyer@1 29 Support functions
farmbuyer@1 30 -------------------------------------------------------------------------------]]
farmbuyer@1 31 local function AlignImage(self)
farmbuyer@1 32 local img = self.image:GetTexture()
farmbuyer@1 33 self.text:ClearAllPoints()
farmbuyer@1 34 if not img then
farmbuyer@1 35 self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
farmbuyer@1 36 self.text:SetPoint("RIGHT")
farmbuyer@1 37 else
farmbuyer@1 38 self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
farmbuyer@1 39 self.text:SetPoint("RIGHT")
farmbuyer@1 40 end
farmbuyer@1 41 end
farmbuyer@1 42
farmbuyer@1 43 --[[-----------------------------------------------------------------------------
farmbuyer@1 44 Scripts
farmbuyer@1 45 -------------------------------------------------------------------------------]]
farmbuyer@1 46 local function Control_OnEnter(frame)
farmbuyer@1 47 frame.obj:Fire("OnEnter")
farmbuyer@1 48 end
farmbuyer@1 49
farmbuyer@1 50 local function Control_OnLeave(frame)
farmbuyer@1 51 frame.obj:Fire("OnLeave")
farmbuyer@1 52 end
farmbuyer@1 53
farmbuyer@1 54 local function CheckBox_OnMouseDown(frame)
farmbuyer@1 55 local self = frame.obj
farmbuyer@1 56 if not self.disabled then
farmbuyer@1 57 if self.image:GetTexture() then
farmbuyer@1 58 self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
farmbuyer@1 59 else
farmbuyer@1 60 self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
farmbuyer@1 61 end
farmbuyer@1 62 end
farmbuyer@1 63 AceGUI:ClearFocus()
farmbuyer@1 64 end
farmbuyer@1 65
farmbuyer@1 66 local function CheckBox_OnMouseUp(frame)
farmbuyer@1 67 local self = frame.obj
farmbuyer@1 68 if not self.disabled then
farmbuyer@1 69 self:ToggleChecked()
farmbuyer@1 70
farmbuyer@1 71 if self.checked then
farmbuyer@1 72 PlaySound("igMainMenuOptionCheckBoxOn")
farmbuyer@1 73 else -- for both nil and false (tristate)
farmbuyer@1 74 PlaySound("igMainMenuOptionCheckBoxOff")
farmbuyer@1 75 end
farmbuyer@1 76
farmbuyer@1 77 self:Fire("OnValueChanged", self.checked)
farmbuyer@1 78 AlignImage(self)
farmbuyer@1 79 end
farmbuyer@1 80 end
farmbuyer@1 81
farmbuyer@1 82 --[[-----------------------------------------------------------------------------
farmbuyer@1 83 Methods
farmbuyer@1 84 -------------------------------------------------------------------------------]]
farmbuyer@1 85 local methods = {
farmbuyer@1 86 ["OnAcquire"] = function(self)
farmbuyer@1 87 self:SetType()
farmbuyer@1 88 self:SetValue(false)
farmbuyer@1 89 self:SetTriState(nil)
farmbuyer@1 90 -- height is calculated from the width and required space for the description
farmbuyer@1 91 self:SetWidth(200)
farmbuyer@1 92 self:SetImage()
farmbuyer@1 93 self:SetDisabled(nil)
farmbuyer@1 94 self:SetDescription(nil)
farmbuyer@1 95 end,
farmbuyer@1 96
farmbuyer@1 97 -- ["OnRelease"] = nil,
farmbuyer@1 98
farmbuyer@1 99 ["OnWidthSet"] = function(self, width)
farmbuyer@1 100 if self.desc then
farmbuyer@1 101 self.desc:SetWidth(width - 30)
farmbuyer@1 102 if self.desc:GetText() and self.desc:GetText() ~= "" then
farmbuyer@1 103 self:SetHeight(28 + self.desc:GetHeight())
farmbuyer@1 104 end
farmbuyer@1 105 end
farmbuyer@1 106 end,
farmbuyer@1 107
farmbuyer@1 108 ["SetDisabled"] = function(self, disabled)
farmbuyer@1 109 self.disabled = disabled
farmbuyer@1 110 if disabled then
farmbuyer@1 111 self.frame:Disable()
farmbuyer@1 112 self.text:SetTextColor(0.5, 0.5, 0.5)
farmbuyer@1 113 SetDesaturation(self.check, true)
farmbuyer@102 114 if self.desc then
farmbuyer@102 115 self.desc:SetTextColor(0.5, 0.5, 0.5)
farmbuyer@102 116 end
farmbuyer@1 117 else
farmbuyer@1 118 self.frame:Enable()
farmbuyer@1 119 self.text:SetTextColor(1, 1, 1)
farmbuyer@1 120 if self.tristate and self.checked == nil then
farmbuyer@1 121 SetDesaturation(self.check, true)
farmbuyer@1 122 else
farmbuyer@1 123 SetDesaturation(self.check, false)
farmbuyer@1 124 end
farmbuyer@102 125 if self.desc then
farmbuyer@102 126 self.desc:SetTextColor(1, 1, 1)
farmbuyer@102 127 end
farmbuyer@1 128 end
farmbuyer@1 129 end,
farmbuyer@1 130
farmbuyer@1 131 ["SetValue"] = function(self,value)
farmbuyer@1 132 local check = self.check
farmbuyer@1 133 self.checked = value
farmbuyer@1 134 if value then
farmbuyer@1 135 SetDesaturation(self.check, false)
farmbuyer@1 136 self.check:Show()
farmbuyer@1 137 else
farmbuyer@1 138 --Nil is the unknown tristate value
farmbuyer@1 139 if self.tristate and value == nil then
farmbuyer@1 140 SetDesaturation(self.check, true)
farmbuyer@1 141 self.check:Show()
farmbuyer@1 142 else
farmbuyer@1 143 SetDesaturation(self.check, false)
farmbuyer@1 144 self.check:Hide()
farmbuyer@1 145 end
farmbuyer@1 146 end
farmbuyer@1 147 self:SetDisabled(self.disabled)
farmbuyer@1 148 end,
farmbuyer@1 149
farmbuyer@1 150 ["GetValue"] = function(self)
farmbuyer@1 151 return self.checked
farmbuyer@1 152 end,
farmbuyer@1 153
farmbuyer@1 154 ["SetTriState"] = function(self, enabled)
farmbuyer@1 155 self.tristate = enabled
farmbuyer@1 156 self:SetValue(self:GetValue())
farmbuyer@1 157 end,
farmbuyer@1 158
farmbuyer@1 159 ["SetType"] = function(self, type)
farmbuyer@1 160 local checkbg = self.checkbg
farmbuyer@1 161 local check = self.check
farmbuyer@1 162 local highlight = self.highlight
farmbuyer@1 163
farmbuyer@1 164 local size
farmbuyer@1 165 if type == "radio" then
farmbuyer@1 166 size = 16
farmbuyer@1 167 checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
farmbuyer@1 168 checkbg:SetTexCoord(0, 0.25, 0, 1)
farmbuyer@1 169 check:SetTexture("Interface\\Buttons\\UI-RadioButton")
farmbuyer@1 170 check:SetTexCoord(0.25, 0.5, 0, 1)
farmbuyer@1 171 check:SetBlendMode("ADD")
farmbuyer@1 172 highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
farmbuyer@1 173 highlight:SetTexCoord(0.5, 0.75, 0, 1)
farmbuyer@1 174 else
farmbuyer@1 175 size = 24
farmbuyer@1 176 checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
farmbuyer@1 177 checkbg:SetTexCoord(0, 1, 0, 1)
farmbuyer@1 178 check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
farmbuyer@1 179 check:SetTexCoord(0, 1, 0, 1)
farmbuyer@1 180 check:SetBlendMode("BLEND")
farmbuyer@1 181 highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
farmbuyer@1 182 highlight:SetTexCoord(0, 1, 0, 1)
farmbuyer@1 183 end
farmbuyer@1 184 checkbg:SetHeight(size)
farmbuyer@1 185 checkbg:SetWidth(size)
farmbuyer@1 186 end,
farmbuyer@1 187
farmbuyer@1 188 ["ToggleChecked"] = function(self)
farmbuyer@1 189 local value = self:GetValue()
farmbuyer@1 190 if self.tristate then
farmbuyer@1 191 --cycle in true, nil, false order
farmbuyer@1 192 if value then
farmbuyer@1 193 self:SetValue(nil)
farmbuyer@1 194 elseif value == nil then
farmbuyer@1 195 self:SetValue(false)
farmbuyer@1 196 else
farmbuyer@1 197 self:SetValue(true)
farmbuyer@1 198 end
farmbuyer@1 199 else
farmbuyer@1 200 self:SetValue(not self:GetValue())
farmbuyer@1 201 end
farmbuyer@1 202 end,
farmbuyer@1 203
farmbuyer@1 204 ["SetLabel"] = function(self, label)
farmbuyer@1 205 self.text:SetText(label)
farmbuyer@1 206 end,
farmbuyer@1 207
farmbuyer@1 208 ["SetDescription"] = function(self, desc)
farmbuyer@1 209 if desc then
farmbuyer@1 210 if not self.desc then
farmbuyer@1 211 local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
farmbuyer@1 212 desc:ClearAllPoints()
farmbuyer@1 213 desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
farmbuyer@1 214 desc:SetWidth(self.frame.width - 30)
farmbuyer@1 215 desc:SetJustifyH("LEFT")
farmbuyer@1 216 desc:SetJustifyV("TOP")
farmbuyer@1 217 self.desc = desc
farmbuyer@1 218 end
farmbuyer@1 219 self.desc:Show()
farmbuyer@1 220 --self.text:SetFontObject(GameFontNormal)
farmbuyer@1 221 self.desc:SetText(desc)
farmbuyer@1 222 self:SetHeight(28 + self.desc:GetHeight())
farmbuyer@1 223 else
farmbuyer@1 224 if self.desc then
farmbuyer@1 225 self.desc:SetText("")
farmbuyer@1 226 self.desc:Hide()
farmbuyer@1 227 end
farmbuyer@1 228 --self.text:SetFontObject(GameFontHighlight)
farmbuyer@1 229 self:SetHeight(24)
farmbuyer@1 230 end
farmbuyer@1 231 end,
farmbuyer@1 232
farmbuyer@1 233 ["SetImage"] = function(self, path, ...)
farmbuyer@1 234 local image = self.image
farmbuyer@1 235 image:SetTexture(path)
farmbuyer@1 236
farmbuyer@1 237 if image:GetTexture() then
farmbuyer@1 238 local n = select("#", ...)
farmbuyer@1 239 if n == 4 or n == 8 then
farmbuyer@1 240 image:SetTexCoord(...)
farmbuyer@1 241 else
farmbuyer@1 242 image:SetTexCoord(0, 1, 0, 1)
farmbuyer@1 243 end
farmbuyer@1 244 end
farmbuyer@1 245 AlignImage(self)
farmbuyer@1 246 end
farmbuyer@1 247 }
farmbuyer@1 248
farmbuyer@1 249 --[[-----------------------------------------------------------------------------
farmbuyer@1 250 Constructor
farmbuyer@1 251 -------------------------------------------------------------------------------]]
farmbuyer@1 252 local function Constructor()
farmbuyer@1 253 local frame = CreateFrame("Button", nil, UIParent)
farmbuyer@1 254 frame:Hide()
farmbuyer@1 255
farmbuyer@1 256 frame:EnableMouse(true)
farmbuyer@1 257 frame:SetScript("OnEnter", Control_OnEnter)
farmbuyer@1 258 frame:SetScript("OnLeave", Control_OnLeave)
farmbuyer@1 259 frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
farmbuyer@1 260 frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
farmbuyer@1 261
farmbuyer@1 262 local checkbg = frame:CreateTexture(nil, "ARTWORK")
farmbuyer@1 263 checkbg:SetWidth(24)
farmbuyer@1 264 checkbg:SetHeight(24)
farmbuyer@1 265 checkbg:SetPoint("TOPLEFT")
farmbuyer@1 266 checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
farmbuyer@1 267
farmbuyer@1 268 local check = frame:CreateTexture(nil, "OVERLAY")
farmbuyer@1 269 check:SetAllPoints(checkbg)
farmbuyer@1 270 check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
farmbuyer@1 271
farmbuyer@1 272 --local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
farmbuyer@1 273 local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
farmbuyer@1 274 text:SetJustifyH("LEFT")
farmbuyer@1 275 text:SetHeight(18)
farmbuyer@1 276 text:SetPoint("LEFT", checkbg, "RIGHT")
farmbuyer@1 277 text:SetPoint("RIGHT")
farmbuyer@1 278
farmbuyer@1 279 local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
farmbuyer@1 280 highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
farmbuyer@1 281 highlight:SetBlendMode("ADD")
farmbuyer@1 282 highlight:SetAllPoints(checkbg)
farmbuyer@1 283
farmbuyer@1 284 local image = frame:CreateTexture(nil, "OVERLAY")
farmbuyer@1 285 image:SetHeight(16)
farmbuyer@1 286 image:SetWidth(16)
farmbuyer@1 287 image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
farmbuyer@1 288
farmbuyer@1 289 local widget = {
farmbuyer@1 290 checkbg = checkbg,
farmbuyer@1 291 check = check,
farmbuyer@1 292 text = text,
farmbuyer@1 293 highlight = highlight,
farmbuyer@1 294 image = image,
farmbuyer@1 295 frame = frame,
farmbuyer@1 296 type = Type
farmbuyer@1 297 }
farmbuyer@1 298 for method, func in pairs(methods) do
farmbuyer@1 299 widget[method] = func
farmbuyer@1 300 end
farmbuyer@1 301
farmbuyer@1 302 return AceGUI:RegisterAsWidget(widget)
farmbuyer@1 303 end
farmbuyer@1 304
farmbuyer@1 305 AceGUI:RegisterWidgetType(Type, Constructor, Version)