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)
|