0e7d6a3 - Split libraries
[wowui.git] / RaidFrameCustomizationConfig / libs / AceGUI-3.0 / widgets / AceGUIWidget-CheckBox.lua
1 --[[-----------------------------------------------------------------------------
2 Checkbox Widget
3 -------------------------------------------------------------------------------]]
4 local Type, Version = "CheckBox", 23
5 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
6 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
7
8 -- Lua APIs
9 local select, pairs = select, pairs
10
11 -- WoW APIs
12 local PlaySound = PlaySound
13 local CreateFrame, UIParent = CreateFrame, UIParent
14
15 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
16 -- List them here for Mikk's FindGlobals script
17 -- GLOBALS: SetDesaturation, GameFontHighlight
18
19 --[[-----------------------------------------------------------------------------
20 Support functions
21 -------------------------------------------------------------------------------]]
22 local function AlignImage(self)
23         local img = self.image:GetTexture()
24         self.text:ClearAllPoints()
25         if not img then
26                 self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
27                 self.text:SetPoint("RIGHT")
28         else
29                 self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
30                 self.text:SetPoint("RIGHT")
31         end
32 end
33
34 --[[-----------------------------------------------------------------------------
35 Scripts
36 -------------------------------------------------------------------------------]]
37 local function Control_OnEnter(frame)
38         frame.obj:Fire("OnEnter")
39 end
40
41 local function Control_OnLeave(frame)
42         frame.obj:Fire("OnLeave")
43 end
44
45 local function CheckBox_OnMouseDown(frame)
46         local self = frame.obj
47         if not self.disabled then
48                 if self.image:GetTexture() then
49                         self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
50                 else
51                         self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
52                 end
53         end
54         AceGUI:ClearFocus()
55 end
56
57 local function CheckBox_OnMouseUp(frame)
58         local self = frame.obj
59         if not self.disabled then
60                 self:ToggleChecked()
61
62                 if self.checked then
63                         PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
64                 else -- for both nil and false (tristate)
65                         PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOff" or 857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
66                 end
67
68                 self:Fire("OnValueChanged", self.checked)
69                 AlignImage(self)
70         end
71 end
72
73 --[[-----------------------------------------------------------------------------
74 Methods
75 -------------------------------------------------------------------------------]]
76 local methods = {
77         ["OnAcquire"] = function(self)
78                 self:SetType()
79                 self:SetValue(false)
80                 self:SetTriState(nil)
81                 -- height is calculated from the width and required space for the description
82                 self:SetWidth(200)
83                 self:SetImage()
84                 self:SetDisabled(nil)
85                 self:SetDescription(nil)
86         end,
87
88         -- ["OnRelease"] = nil,
89
90         ["OnWidthSet"] = function(self, width)
91                 if self.desc then
92                         self.desc:SetWidth(width - 30)
93                         if self.desc:GetText() and self.desc:GetText() ~= "" then
94                                 self:SetHeight(28 + self.desc:GetHeight())
95                         end
96                 end
97         end,
98
99         ["SetDisabled"] = function(self, disabled)
100                 self.disabled = disabled
101                 if disabled then
102                         self.frame:Disable()
103                         self.text:SetTextColor(0.5, 0.5, 0.5)
104                         SetDesaturation(self.check, true)
105                         if self.desc then
106                                 self.desc:SetTextColor(0.5, 0.5, 0.5)
107                         end
108                 else
109                         self.frame:Enable()
110                         self.text:SetTextColor(1, 1, 1)
111                         if self.tristate and self.checked == nil then
112                                 SetDesaturation(self.check, true)
113                         else
114                                 SetDesaturation(self.check, false)
115                         end
116                         if self.desc then
117                                 self.desc:SetTextColor(1, 1, 1)
118                         end
119                 end
120         end,
121
122         ["SetValue"] = function(self,value)
123                 local check = self.check
124                 self.checked = value
125                 if value then
126                         SetDesaturation(self.check, false)
127                         self.check:Show()
128                 else
129                         --Nil is the unknown tristate value
130                         if self.tristate and value == nil then
131                                 SetDesaturation(self.check, true)
132                                 self.check:Show()
133                         else
134                                 SetDesaturation(self.check, false)
135                                 self.check:Hide()
136                         end
137                 end
138                 self:SetDisabled(self.disabled)
139         end,
140
141         ["GetValue"] = function(self)
142                 return self.checked
143         end,
144
145         ["SetTriState"] = function(self, enabled)
146                 self.tristate = enabled
147                 self:SetValue(self:GetValue())
148         end,
149
150         ["SetType"] = function(self, type)
151                 local checkbg = self.checkbg
152                 local check = self.check
153                 local highlight = self.highlight
154
155                 local size
156                 if type == "radio" then
157                         size = 16
158                         checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
159                         checkbg:SetTexCoord(0, 0.25, 0, 1)
160                         check:SetTexture("Interface\\Buttons\\UI-RadioButton")
161                         check:SetTexCoord(0.25, 0.5, 0, 1)
162                         check:SetBlendMode("ADD")
163                         highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
164                         highlight:SetTexCoord(0.5, 0.75, 0, 1)
165                 else
166                         size = 24
167                         checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
168                         checkbg:SetTexCoord(0, 1, 0, 1)
169                         check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
170                         check:SetTexCoord(0, 1, 0, 1)
171                         check:SetBlendMode("BLEND")
172                         highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
173                         highlight:SetTexCoord(0, 1, 0, 1)
174                 end
175                 checkbg:SetHeight(size)
176                 checkbg:SetWidth(size)
177         end,
178
179         ["ToggleChecked"] = function(self)
180                 local value = self:GetValue()
181                 if self.tristate then
182                         --cycle in true, nil, false order
183                         if value then
184                                 self:SetValue(nil)
185                         elseif value == nil then
186                                 self:SetValue(false)
187                         else
188                                 self:SetValue(true)
189                         end
190                 else
191                         self:SetValue(not self:GetValue())
192                 end
193         end,
194
195         ["SetLabel"] = function(self, label)
196                 self.text:SetText(label)
197         end,
198
199         ["SetDescription"] = function(self, desc)
200                 if desc then
201                         if not self.desc then
202                                 local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
203                                 desc:ClearAllPoints()
204                                 desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
205                                 desc:SetWidth(self.frame.width - 30)
206                                 desc:SetJustifyH("LEFT")
207                                 desc:SetJustifyV("TOP")
208                                 self.desc = desc
209                         end
210                         self.desc:Show()
211                         --self.text:SetFontObject(GameFontNormal)
212                         self.desc:SetText(desc)
213                         self:SetHeight(28 + self.desc:GetHeight())
214                 else
215                         if self.desc then
216                                 self.desc:SetText("")
217                                 self.desc:Hide()
218                         end
219                         --self.text:SetFontObject(GameFontHighlight)
220                         self:SetHeight(24)
221                 end
222         end,
223         
224         ["SetImage"] = function(self, path, ...)
225                 local image = self.image
226                 image:SetTexture(path)
227                 
228                 if image:GetTexture() then
229                         local n = select("#", ...)
230                         if n == 4 or n == 8 then
231                                 image:SetTexCoord(...)
232                         else
233                                 image:SetTexCoord(0, 1, 0, 1)
234                         end
235                 end
236                 AlignImage(self)
237         end
238 }
239
240 --[[-----------------------------------------------------------------------------
241 Constructor
242 -------------------------------------------------------------------------------]]
243 local function Constructor()
244         local frame = CreateFrame("Button", nil, UIParent)
245         frame:Hide()
246
247         frame:EnableMouse(true)
248         frame:SetScript("OnEnter", Control_OnEnter)
249         frame:SetScript("OnLeave", Control_OnLeave)
250         frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
251         frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
252
253         local checkbg = frame:CreateTexture(nil, "ARTWORK")
254         checkbg:SetWidth(24)
255         checkbg:SetHeight(24)
256         checkbg:SetPoint("TOPLEFT")
257         checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
258
259         local check = frame:CreateTexture(nil, "OVERLAY")
260         check:SetAllPoints(checkbg)
261         check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
262
263         local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
264         text:SetJustifyH("LEFT")
265         text:SetHeight(18)
266         text:SetPoint("LEFT", checkbg, "RIGHT")
267         text:SetPoint("RIGHT")
268
269         local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
270         highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
271         highlight:SetBlendMode("ADD")
272         highlight:SetAllPoints(checkbg)
273
274         local image = frame:CreateTexture(nil, "OVERLAY")
275         image:SetHeight(16)
276         image:SetWidth(16)
277         image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
278
279         local widget = {
280                 checkbg   = checkbg,
281                 check     = check,
282                 text      = text,
283                 highlight = highlight,
284                 image     = image,
285                 frame     = frame,
286                 type      = Type
287         }
288         for method, func in pairs(methods) do
289                 widget[method] = func
290         end
291
292         return AceGUI:RegisterAsWidget(widget)
293 end
294
295 AceGUI:RegisterWidgetType(Type, Constructor, Version)