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@1
|
114 else
|
farmbuyer@1
|
115 self.frame:Enable()
|
farmbuyer@1
|
116 self.text:SetTextColor(1, 1, 1)
|
farmbuyer@1
|
117 if self.tristate and self.checked == nil then
|
farmbuyer@1
|
118 SetDesaturation(self.check, true)
|
farmbuyer@1
|
119 else
|
farmbuyer@1
|
120 SetDesaturation(self.check, false)
|
farmbuyer@1
|
121 end
|
farmbuyer@1
|
122 end
|
farmbuyer@1
|
123 end,
|
farmbuyer@1
|
124
|
farmbuyer@1
|
125 ["SetValue"] = function(self,value)
|
farmbuyer@1
|
126 local check = self.check
|
farmbuyer@1
|
127 self.checked = value
|
farmbuyer@1
|
128 if value then
|
farmbuyer@1
|
129 SetDesaturation(self.check, false)
|
farmbuyer@1
|
130 self.check:Show()
|
farmbuyer@1
|
131 else
|
farmbuyer@1
|
132 --Nil is the unknown tristate value
|
farmbuyer@1
|
133 if self.tristate and value == nil then
|
farmbuyer@1
|
134 SetDesaturation(self.check, true)
|
farmbuyer@1
|
135 self.check:Show()
|
farmbuyer@1
|
136 else
|
farmbuyer@1
|
137 SetDesaturation(self.check, false)
|
farmbuyer@1
|
138 self.check:Hide()
|
farmbuyer@1
|
139 end
|
farmbuyer@1
|
140 end
|
farmbuyer@1
|
141 self:SetDisabled(self.disabled)
|
farmbuyer@1
|
142 end,
|
farmbuyer@1
|
143
|
farmbuyer@1
|
144 ["GetValue"] = function(self)
|
farmbuyer@1
|
145 return self.checked
|
farmbuyer@1
|
146 end,
|
farmbuyer@1
|
147
|
farmbuyer@1
|
148 ["SetTriState"] = function(self, enabled)
|
farmbuyer@1
|
149 self.tristate = enabled
|
farmbuyer@1
|
150 self:SetValue(self:GetValue())
|
farmbuyer@1
|
151 end,
|
farmbuyer@1
|
152
|
farmbuyer@1
|
153 ["SetType"] = function(self, type)
|
farmbuyer@1
|
154 local checkbg = self.checkbg
|
farmbuyer@1
|
155 local check = self.check
|
farmbuyer@1
|
156 local highlight = self.highlight
|
farmbuyer@1
|
157
|
farmbuyer@1
|
158 local size
|
farmbuyer@1
|
159 if type == "radio" then
|
farmbuyer@1
|
160 size = 16
|
farmbuyer@1
|
161 checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
farmbuyer@1
|
162 checkbg:SetTexCoord(0, 0.25, 0, 1)
|
farmbuyer@1
|
163 check:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
farmbuyer@1
|
164 check:SetTexCoord(0.25, 0.5, 0, 1)
|
farmbuyer@1
|
165 check:SetBlendMode("ADD")
|
farmbuyer@1
|
166 highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
farmbuyer@1
|
167 highlight:SetTexCoord(0.5, 0.75, 0, 1)
|
farmbuyer@1
|
168 else
|
farmbuyer@1
|
169 size = 24
|
farmbuyer@1
|
170 checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
farmbuyer@1
|
171 checkbg:SetTexCoord(0, 1, 0, 1)
|
farmbuyer@1
|
172 check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
farmbuyer@1
|
173 check:SetTexCoord(0, 1, 0, 1)
|
farmbuyer@1
|
174 check:SetBlendMode("BLEND")
|
farmbuyer@1
|
175 highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
farmbuyer@1
|
176 highlight:SetTexCoord(0, 1, 0, 1)
|
farmbuyer@1
|
177 end
|
farmbuyer@1
|
178 checkbg:SetHeight(size)
|
farmbuyer@1
|
179 checkbg:SetWidth(size)
|
farmbuyer@1
|
180 end,
|
farmbuyer@1
|
181
|
farmbuyer@1
|
182 ["ToggleChecked"] = function(self)
|
farmbuyer@1
|
183 local value = self:GetValue()
|
farmbuyer@1
|
184 if self.tristate then
|
farmbuyer@1
|
185 --cycle in true, nil, false order
|
farmbuyer@1
|
186 if value then
|
farmbuyer@1
|
187 self:SetValue(nil)
|
farmbuyer@1
|
188 elseif value == nil then
|
farmbuyer@1
|
189 self:SetValue(false)
|
farmbuyer@1
|
190 else
|
farmbuyer@1
|
191 self:SetValue(true)
|
farmbuyer@1
|
192 end
|
farmbuyer@1
|
193 else
|
farmbuyer@1
|
194 self:SetValue(not self:GetValue())
|
farmbuyer@1
|
195 end
|
farmbuyer@1
|
196 end,
|
farmbuyer@1
|
197
|
farmbuyer@1
|
198 ["SetLabel"] = function(self, label)
|
farmbuyer@1
|
199 self.text:SetText(label)
|
farmbuyer@1
|
200 end,
|
farmbuyer@1
|
201
|
farmbuyer@1
|
202 ["SetDescription"] = function(self, desc)
|
farmbuyer@1
|
203 if desc then
|
farmbuyer@1
|
204 if not self.desc then
|
farmbuyer@1
|
205 local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
farmbuyer@1
|
206 desc:ClearAllPoints()
|
farmbuyer@1
|
207 desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
|
farmbuyer@1
|
208 desc:SetWidth(self.frame.width - 30)
|
farmbuyer@1
|
209 desc:SetJustifyH("LEFT")
|
farmbuyer@1
|
210 desc:SetJustifyV("TOP")
|
farmbuyer@1
|
211 self.desc = desc
|
farmbuyer@1
|
212 end
|
farmbuyer@1
|
213 self.desc:Show()
|
farmbuyer@1
|
214 --self.text:SetFontObject(GameFontNormal)
|
farmbuyer@1
|
215 self.desc:SetText(desc)
|
farmbuyer@1
|
216 self:SetHeight(28 + self.desc:GetHeight())
|
farmbuyer@1
|
217 else
|
farmbuyer@1
|
218 if self.desc then
|
farmbuyer@1
|
219 self.desc:SetText("")
|
farmbuyer@1
|
220 self.desc:Hide()
|
farmbuyer@1
|
221 end
|
farmbuyer@1
|
222 --self.text:SetFontObject(GameFontHighlight)
|
farmbuyer@1
|
223 self:SetHeight(24)
|
farmbuyer@1
|
224 end
|
farmbuyer@1
|
225 end,
|
farmbuyer@1
|
226
|
farmbuyer@1
|
227 ["SetImage"] = function(self, path, ...)
|
farmbuyer@1
|
228 local image = self.image
|
farmbuyer@1
|
229 image:SetTexture(path)
|
farmbuyer@1
|
230
|
farmbuyer@1
|
231 if image:GetTexture() then
|
farmbuyer@1
|
232 local n = select("#", ...)
|
farmbuyer@1
|
233 if n == 4 or n == 8 then
|
farmbuyer@1
|
234 image:SetTexCoord(...)
|
farmbuyer@1
|
235 else
|
farmbuyer@1
|
236 image:SetTexCoord(0, 1, 0, 1)
|
farmbuyer@1
|
237 end
|
farmbuyer@1
|
238 end
|
farmbuyer@1
|
239 AlignImage(self)
|
farmbuyer@1
|
240 end
|
farmbuyer@1
|
241 }
|
farmbuyer@1
|
242
|
farmbuyer@1
|
243 --[[-----------------------------------------------------------------------------
|
farmbuyer@1
|
244 Constructor
|
farmbuyer@1
|
245 -------------------------------------------------------------------------------]]
|
farmbuyer@1
|
246 local function Constructor()
|
farmbuyer@1
|
247 local frame = CreateFrame("Button", nil, UIParent)
|
farmbuyer@1
|
248 frame:Hide()
|
farmbuyer@1
|
249
|
farmbuyer@1
|
250 frame:EnableMouse(true)
|
farmbuyer@1
|
251 frame:SetScript("OnEnter", Control_OnEnter)
|
farmbuyer@1
|
252 frame:SetScript("OnLeave", Control_OnLeave)
|
farmbuyer@1
|
253 frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
|
farmbuyer@1
|
254 frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
|
farmbuyer@1
|
255
|
farmbuyer@1
|
256 local checkbg = frame:CreateTexture(nil, "ARTWORK")
|
farmbuyer@1
|
257 checkbg:SetWidth(24)
|
farmbuyer@1
|
258 checkbg:SetHeight(24)
|
farmbuyer@1
|
259 checkbg:SetPoint("TOPLEFT")
|
farmbuyer@1
|
260 checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
farmbuyer@1
|
261
|
farmbuyer@1
|
262 local check = frame:CreateTexture(nil, "OVERLAY")
|
farmbuyer@1
|
263 check:SetAllPoints(checkbg)
|
farmbuyer@1
|
264 check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
farmbuyer@1
|
265
|
farmbuyer@1
|
266 --local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
|
farmbuyer@1
|
267 local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
farmbuyer@1
|
268 text:SetJustifyH("LEFT")
|
farmbuyer@1
|
269 text:SetHeight(18)
|
farmbuyer@1
|
270 text:SetPoint("LEFT", checkbg, "RIGHT")
|
farmbuyer@1
|
271 text:SetPoint("RIGHT")
|
farmbuyer@1
|
272
|
farmbuyer@1
|
273 local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
farmbuyer@1
|
274 highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
farmbuyer@1
|
275 highlight:SetBlendMode("ADD")
|
farmbuyer@1
|
276 highlight:SetAllPoints(checkbg)
|
farmbuyer@1
|
277
|
farmbuyer@1
|
278 local image = frame:CreateTexture(nil, "OVERLAY")
|
farmbuyer@1
|
279 image:SetHeight(16)
|
farmbuyer@1
|
280 image:SetWidth(16)
|
farmbuyer@1
|
281 image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
|
farmbuyer@1
|
282
|
farmbuyer@1
|
283 local widget = {
|
farmbuyer@1
|
284 checkbg = checkbg,
|
farmbuyer@1
|
285 check = check,
|
farmbuyer@1
|
286 text = text,
|
farmbuyer@1
|
287 highlight = highlight,
|
farmbuyer@1
|
288 image = image,
|
farmbuyer@1
|
289 frame = frame,
|
farmbuyer@1
|
290 type = Type
|
farmbuyer@1
|
291 }
|
farmbuyer@1
|
292 for method, func in pairs(methods) do
|
farmbuyer@1
|
293 widget[method] = func
|
farmbuyer@1
|
294 end
|
farmbuyer@1
|
295
|
farmbuyer@1
|
296 return AceGUI:RegisterAsWidget(widget)
|
farmbuyer@1
|
297 end
|
farmbuyer@1
|
298
|
farmbuyer@1
|
299 AceGUI:RegisterWidgetType(Type, Constructor, Version)
|