Asa@0
|
1 --[[ $Id: AceGUIWidget-DropDown-Items.lua 877 2009-11-02 15:56:50Z nevcairiel $ ]]--
|
Asa@0
|
2
|
Asa@0
|
3 local AceGUI = LibStub("AceGUI-3.0")
|
Asa@0
|
4
|
Asa@0
|
5 -- Lua APIs
|
Asa@0
|
6 local select, assert = select, assert
|
Asa@0
|
7
|
Asa@0
|
8 -- WoW APIs
|
Asa@0
|
9 local CreateFrame = CreateFrame
|
Asa@0
|
10
|
Asa@0
|
11 local function fixlevels(parent,...)
|
Asa@0
|
12 local i = 1
|
Asa@0
|
13 local child = select(i, ...)
|
Asa@0
|
14 while child do
|
Asa@0
|
15 child:SetFrameLevel(parent:GetFrameLevel()+1)
|
Asa@0
|
16 fixlevels(child, child:GetChildren())
|
Asa@0
|
17 i = i + 1
|
Asa@0
|
18 child = select(i, ...)
|
Asa@0
|
19 end
|
Asa@0
|
20 end
|
Asa@0
|
21
|
Asa@0
|
22 local function fixstrata(strata, parent, ...)
|
Asa@0
|
23 local i = 1
|
Asa@0
|
24 local child = select(i, ...)
|
Asa@0
|
25 parent:SetFrameStrata(strata)
|
Asa@0
|
26 while child do
|
Asa@0
|
27 fixstrata(strata, child, child:GetChildren())
|
Asa@0
|
28 i = i + 1
|
Asa@0
|
29 child = select(i, ...)
|
Asa@0
|
30 end
|
Asa@0
|
31 end
|
Asa@0
|
32
|
Asa@0
|
33 -- ItemBase is the base "class" for all dropdown items.
|
Asa@0
|
34 -- Each item has to use ItemBase.Create(widgetType) to
|
Asa@0
|
35 -- create an initial 'self' value.
|
Asa@0
|
36 -- ItemBase will add common functions and ui event handlers.
|
Asa@0
|
37 -- Be sure to keep basic usage when you override functions.
|
Asa@0
|
38
|
Asa@0
|
39 local ItemBase = {
|
Asa@0
|
40 -- NOTE: The ItemBase version is added to each item's version number
|
Asa@0
|
41 -- to ensure proper updates on ItemBase changes.
|
Asa@0
|
42 -- Use at least 1000er steps.
|
Asa@0
|
43 version = 1000,
|
Asa@0
|
44 counter = 0,
|
Asa@0
|
45 }
|
Asa@0
|
46
|
Asa@0
|
47 function ItemBase.Frame_OnEnter(this)
|
Asa@0
|
48 local self = this.obj
|
Asa@0
|
49
|
Asa@0
|
50 if self.useHighlight then
|
Asa@0
|
51 self.highlight:Show()
|
Asa@0
|
52 end
|
Asa@0
|
53 self:Fire("OnEnter")
|
Asa@0
|
54
|
Asa@0
|
55 if self.specialOnEnter then
|
Asa@0
|
56 self.specialOnEnter(self)
|
Asa@0
|
57 end
|
Asa@0
|
58 end
|
Asa@0
|
59
|
Asa@0
|
60 function ItemBase.Frame_OnLeave(this)
|
Asa@0
|
61 local self = this.obj
|
Asa@0
|
62
|
Asa@0
|
63 self.highlight:Hide()
|
Asa@0
|
64 self:Fire("OnLeave")
|
Asa@0
|
65
|
Asa@0
|
66 if self.specialOnLeave then
|
Asa@0
|
67 self.specialOnLeave(self)
|
Asa@0
|
68 end
|
Asa@0
|
69 end
|
Asa@0
|
70
|
Asa@0
|
71 -- exported, AceGUI callback
|
Asa@0
|
72 function ItemBase.OnAcquire(self)
|
Asa@0
|
73 self.frame:SetToplevel(true)
|
Asa@0
|
74 self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
Asa@0
|
75 end
|
Asa@0
|
76
|
Asa@0
|
77 -- exported, AceGUI callback
|
Asa@0
|
78 function ItemBase.OnRelease(self)
|
Asa@0
|
79 self:SetDisabled(false)
|
Asa@0
|
80 self.pullout = nil
|
Asa@0
|
81 self.frame:SetParent(nil)
|
Asa@0
|
82 self.frame:ClearAllPoints()
|
Asa@0
|
83 self.frame:Hide()
|
Asa@0
|
84 end
|
Asa@0
|
85
|
Asa@0
|
86 -- exported
|
Asa@0
|
87 -- NOTE: this is called by a Dropdown-Pullout.
|
Asa@0
|
88 -- Do not call this method directly
|
Asa@0
|
89 function ItemBase.SetPullout(self, pullout)
|
Asa@0
|
90 self.pullout = pullout
|
Asa@0
|
91
|
Asa@0
|
92 self.frame:SetParent(nil)
|
Asa@0
|
93 self.frame:SetParent(pullout.itemFrame)
|
Asa@0
|
94 self.parent = pullout.itemFrame
|
Asa@0
|
95 fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
|
Asa@0
|
96 end
|
Asa@0
|
97
|
Asa@0
|
98 -- exported
|
Asa@0
|
99 function ItemBase.SetText(self, text)
|
Asa@0
|
100 self.text:SetText(text or "")
|
Asa@0
|
101 end
|
Asa@0
|
102
|
Asa@0
|
103 -- exported
|
Asa@0
|
104 function ItemBase.GetText(self)
|
Asa@0
|
105 return self.text:GetText()
|
Asa@0
|
106 end
|
Asa@0
|
107
|
Asa@0
|
108 -- exported
|
Asa@0
|
109 function ItemBase.SetPoint(self, ...)
|
Asa@0
|
110 self.frame:SetPoint(...)
|
Asa@0
|
111 end
|
Asa@0
|
112
|
Asa@0
|
113 -- exported
|
Asa@0
|
114 function ItemBase.Show(self)
|
Asa@0
|
115 self.frame:Show()
|
Asa@0
|
116 end
|
Asa@0
|
117
|
Asa@0
|
118 -- exported
|
Asa@0
|
119 function ItemBase.Hide(self)
|
Asa@0
|
120 self.frame:Hide()
|
Asa@0
|
121 end
|
Asa@0
|
122
|
Asa@0
|
123 -- exported
|
Asa@0
|
124 function ItemBase.SetDisabled(self, disabled)
|
Asa@0
|
125 self.disabled = disabled
|
Asa@0
|
126 if disabled then
|
Asa@0
|
127 self.useHighlight = false
|
Asa@0
|
128 self.text:SetTextColor(.5, .5, .5)
|
Asa@0
|
129 else
|
Asa@0
|
130 self.useHighlight = true
|
Asa@0
|
131 self.text:SetTextColor(1, 1, 1)
|
Asa@0
|
132 end
|
Asa@0
|
133 end
|
Asa@0
|
134
|
Asa@0
|
135 -- exported
|
Asa@0
|
136 -- NOTE: this is called by a Dropdown-Pullout.
|
Asa@0
|
137 -- Do not call this method directly
|
Asa@0
|
138 function ItemBase.SetOnLeave(self, func)
|
Asa@0
|
139 self.specialOnLeave = func
|
Asa@0
|
140 end
|
Asa@0
|
141
|
Asa@0
|
142 -- exported
|
Asa@0
|
143 -- NOTE: this is called by a Dropdown-Pullout.
|
Asa@0
|
144 -- Do not call this method directly
|
Asa@0
|
145 function ItemBase.SetOnEnter(self, func)
|
Asa@0
|
146 self.specialOnEnter = func
|
Asa@0
|
147 end
|
Asa@0
|
148
|
Asa@0
|
149 function ItemBase.Create(type)
|
Asa@0
|
150 -- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
|
Asa@0
|
151 local count = AceGUI:GetNextWidgetNum(type)
|
Asa@0
|
152 local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
|
Asa@0
|
153 local self = {}
|
Asa@0
|
154 self.frame = frame
|
Asa@0
|
155 frame.obj = self
|
Asa@0
|
156 self.type = type
|
Asa@0
|
157
|
Asa@0
|
158 self.useHighlight = true
|
Asa@0
|
159
|
Asa@0
|
160 frame:SetHeight(17)
|
Asa@0
|
161 frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
Asa@0
|
162
|
Asa@0
|
163 local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
Asa@0
|
164 text:SetTextColor(1,1,1)
|
Asa@0
|
165 text:SetJustifyH("LEFT")
|
Asa@0
|
166 text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
|
Asa@0
|
167 text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
|
Asa@0
|
168 self.text = text
|
Asa@0
|
169
|
Asa@0
|
170 local highlight = frame:CreateTexture(nil, "OVERLAY")
|
Asa@0
|
171 highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
Asa@0
|
172 highlight:SetBlendMode("ADD")
|
Asa@0
|
173 highlight:SetHeight(14)
|
Asa@0
|
174 highlight:ClearAllPoints()
|
Asa@0
|
175 highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
|
Asa@0
|
176 highlight:SetPoint("LEFT",frame,"LEFT",5,0)
|
Asa@0
|
177 highlight:Hide()
|
Asa@0
|
178 self.highlight = highlight
|
Asa@0
|
179
|
Asa@0
|
180 local check = frame:CreateTexture("OVERLAY")
|
Asa@0
|
181 check:SetWidth(16)
|
Asa@0
|
182 check:SetHeight(16)
|
Asa@0
|
183 check:SetPoint("LEFT",frame,"LEFT",3,-1)
|
Asa@0
|
184 check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
Asa@0
|
185 check:Hide()
|
Asa@0
|
186 self.check = check
|
Asa@0
|
187
|
Asa@0
|
188 local sub = frame:CreateTexture("OVERLAY")
|
Asa@0
|
189 sub:SetWidth(16)
|
Asa@0
|
190 sub:SetHeight(16)
|
Asa@0
|
191 sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
|
Asa@0
|
192 sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
|
Asa@0
|
193 sub:Hide()
|
Asa@0
|
194 self.sub = sub
|
Asa@0
|
195
|
Asa@0
|
196 frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
|
Asa@0
|
197 frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
|
Asa@0
|
198
|
Asa@0
|
199 self.OnAcquire = ItemBase.OnAcquire
|
Asa@0
|
200 self.OnRelease = ItemBase.OnRelease
|
Asa@0
|
201
|
Asa@0
|
202 self.SetPullout = ItemBase.SetPullout
|
Asa@0
|
203 self.GetText = ItemBase.GetText
|
Asa@0
|
204 self.SetText = ItemBase.SetText
|
Asa@0
|
205 self.SetDisabled = ItemBase.SetDisabled
|
Asa@0
|
206
|
Asa@0
|
207 self.SetPoint = ItemBase.SetPoint
|
Asa@0
|
208 self.Show = ItemBase.Show
|
Asa@0
|
209 self.Hide = ItemBase.Hide
|
Asa@0
|
210
|
Asa@0
|
211 self.SetOnLeave = ItemBase.SetOnLeave
|
Asa@0
|
212 self.SetOnEnter = ItemBase.SetOnEnter
|
Asa@0
|
213
|
Asa@0
|
214 return self
|
Asa@0
|
215 end
|
Asa@0
|
216
|
Asa@0
|
217 --[[
|
Asa@0
|
218 Template for items:
|
Asa@0
|
219
|
Asa@0
|
220 -- Item:
|
Asa@0
|
221 --
|
Asa@0
|
222 do
|
Asa@0
|
223 local widgetType = "Dropdown-Item-"
|
Asa@0
|
224 local widgetVersion = 1
|
Asa@0
|
225
|
Asa@0
|
226 local function Constructor()
|
Asa@0
|
227 local self = ItemBase.Create(widgetType)
|
Asa@0
|
228
|
Asa@0
|
229 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
230 return self
|
Asa@0
|
231 end
|
Asa@0
|
232
|
Asa@0
|
233 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
234 end
|
Asa@0
|
235 --]]
|
Asa@0
|
236
|
Asa@0
|
237 -- Item: Header
|
Asa@0
|
238 -- A single text entry.
|
Asa@0
|
239 -- Special: Different text color and no highlight
|
Asa@0
|
240 do
|
Asa@0
|
241 local widgetType = "Dropdown-Item-Header"
|
Asa@0
|
242 local widgetVersion = 1
|
Asa@0
|
243
|
Asa@0
|
244 local function OnEnter(this)
|
Asa@0
|
245 local self = this.obj
|
Asa@0
|
246 self:Fire("OnEnter")
|
Asa@0
|
247
|
Asa@0
|
248 if self.specialOnEnter then
|
Asa@0
|
249 self.specialOnEnter(self)
|
Asa@0
|
250 end
|
Asa@0
|
251 end
|
Asa@0
|
252
|
Asa@0
|
253 local function OnLeave(this)
|
Asa@0
|
254 local self = this.obj
|
Asa@0
|
255 self:Fire("OnLeave")
|
Asa@0
|
256
|
Asa@0
|
257 if self.specialOnLeave then
|
Asa@0
|
258 self.specialOnLeave(self)
|
Asa@0
|
259 end
|
Asa@0
|
260 end
|
Asa@0
|
261
|
Asa@0
|
262 -- exported, override
|
Asa@0
|
263 local function SetDisabled(self, disabled)
|
Asa@0
|
264 ItemBase.SetDisabled(self, disabled)
|
Asa@0
|
265 if not disabled then
|
Asa@0
|
266 self.text:SetTextColor(1, 1, 0)
|
Asa@0
|
267 end
|
Asa@0
|
268 end
|
Asa@0
|
269
|
Asa@0
|
270 local function Constructor()
|
Asa@0
|
271 local self = ItemBase.Create(widgetType)
|
Asa@0
|
272
|
Asa@0
|
273 self.SetDisabled = SetDisabled
|
Asa@0
|
274
|
Asa@0
|
275 self.frame:SetScript("OnEnter", OnEnter)
|
Asa@0
|
276 self.frame:SetScript("OnLeave", OnLeave)
|
Asa@0
|
277
|
Asa@0
|
278 self.text:SetTextColor(1, 1, 0)
|
Asa@0
|
279
|
Asa@0
|
280 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
281 return self
|
Asa@0
|
282 end
|
Asa@0
|
283
|
Asa@0
|
284 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
285 end
|
Asa@0
|
286
|
Asa@0
|
287 -- Item: Execute
|
Asa@0
|
288 -- A simple button
|
Asa@0
|
289 do
|
Asa@0
|
290 local widgetType = "Dropdown-Item-Execute"
|
Asa@0
|
291 local widgetVersion = 1
|
Asa@0
|
292
|
Asa@0
|
293 local function Frame_OnClick(this, button)
|
Asa@0
|
294 local self = this.obj
|
Asa@0
|
295 if self.disabled then return end
|
Asa@0
|
296 self:Fire("OnClick")
|
Asa@0
|
297 if self.pullout then
|
Asa@0
|
298 self.pullout:Close()
|
Asa@0
|
299 end
|
Asa@0
|
300 end
|
Asa@0
|
301
|
Asa@0
|
302 local function Constructor()
|
Asa@0
|
303 local self = ItemBase.Create(widgetType)
|
Asa@0
|
304
|
Asa@0
|
305 self.frame:SetScript("OnClick", Frame_OnClick)
|
Asa@0
|
306
|
Asa@0
|
307 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
308 return self
|
Asa@0
|
309 end
|
Asa@0
|
310
|
Asa@0
|
311 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
312 end
|
Asa@0
|
313
|
Asa@0
|
314 -- Item: Toggle
|
Asa@0
|
315 -- Some sort of checkbox for dropdown menus.
|
Asa@0
|
316 -- Does not close the pullout on click.
|
Asa@0
|
317 do
|
Asa@0
|
318 local widgetType = "Dropdown-Item-Toggle"
|
Asa@0
|
319 local widgetVersion = 2
|
Asa@0
|
320
|
Asa@0
|
321 local function UpdateToggle(self)
|
Asa@0
|
322 if self.value then
|
Asa@0
|
323 self.check:Show()
|
Asa@0
|
324 else
|
Asa@0
|
325 self.check:Hide()
|
Asa@0
|
326 end
|
Asa@0
|
327 end
|
Asa@0
|
328
|
Asa@0
|
329 local function OnRelease(self)
|
Asa@0
|
330 ItemBase.OnRelease(self)
|
Asa@0
|
331 self:SetValue(nil)
|
Asa@0
|
332 end
|
Asa@0
|
333
|
Asa@0
|
334 local function Frame_OnClick(this, button)
|
Asa@0
|
335 local self = this.obj
|
Asa@0
|
336 if self.disabled then return end
|
Asa@0
|
337 self.value = not self.value
|
Asa@0
|
338 UpdateToggle(self)
|
Asa@0
|
339 self:Fire("OnValueChanged", self.value)
|
Asa@0
|
340 end
|
Asa@0
|
341
|
Asa@0
|
342 -- exported
|
Asa@0
|
343 local function SetValue(self, value)
|
Asa@0
|
344 self.value = value
|
Asa@0
|
345 UpdateToggle(self)
|
Asa@0
|
346 end
|
Asa@0
|
347
|
Asa@0
|
348 -- exported
|
Asa@0
|
349 local function GetValue(self)
|
Asa@0
|
350 return self.value
|
Asa@0
|
351 end
|
Asa@0
|
352
|
Asa@0
|
353 local function Constructor()
|
Asa@0
|
354 local self = ItemBase.Create(widgetType)
|
Asa@0
|
355
|
Asa@0
|
356 self.frame:SetScript("OnClick", Frame_OnClick)
|
Asa@0
|
357
|
Asa@0
|
358 self.SetValue = SetValue
|
Asa@0
|
359 self.GetValue = GetValue
|
Asa@0
|
360 self.OnRelease = OnRelease
|
Asa@0
|
361
|
Asa@0
|
362 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
363 return self
|
Asa@0
|
364 end
|
Asa@0
|
365
|
Asa@0
|
366 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
367 end
|
Asa@0
|
368
|
Asa@0
|
369 -- Item: Menu
|
Asa@0
|
370 -- Shows a submenu on mouse over
|
Asa@0
|
371 -- Does not close the pullout on click
|
Asa@0
|
372 do
|
Asa@0
|
373 local widgetType = "Dropdown-Item-Menu"
|
Asa@0
|
374 local widgetVersion = 2
|
Asa@0
|
375
|
Asa@0
|
376 local function OnEnter(this)
|
Asa@0
|
377 local self = this.obj
|
Asa@0
|
378 self:Fire("OnEnter")
|
Asa@0
|
379
|
Asa@0
|
380 if self.specialOnEnter then
|
Asa@0
|
381 self.specialOnEnter(self)
|
Asa@0
|
382 end
|
Asa@0
|
383
|
Asa@0
|
384 self.highlight:Show()
|
Asa@0
|
385
|
Asa@0
|
386 if not self.disabled and self.submenu then
|
Asa@0
|
387 self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
|
Asa@0
|
388 end
|
Asa@0
|
389 end
|
Asa@0
|
390
|
Asa@0
|
391 local function OnHide(this)
|
Asa@0
|
392 local self = this.obj
|
Asa@0
|
393 if self.submenu then
|
Asa@0
|
394 self.submenu:Close()
|
Asa@0
|
395 end
|
Asa@0
|
396 end
|
Asa@0
|
397
|
Asa@0
|
398 -- exported
|
Asa@0
|
399 local function SetMenu(self, menu)
|
Asa@0
|
400 assert(menu.type == "Dropdown-Pullout")
|
Asa@0
|
401 self.submenu = menu
|
Asa@0
|
402 end
|
Asa@0
|
403
|
Asa@0
|
404 -- exported
|
Asa@0
|
405 local function CloseMenu(self)
|
Asa@0
|
406 self.submenu:Close()
|
Asa@0
|
407 end
|
Asa@0
|
408
|
Asa@0
|
409 local function Constructor()
|
Asa@0
|
410 local self = ItemBase.Create(widgetType)
|
Asa@0
|
411
|
Asa@0
|
412 self.sub:Show()
|
Asa@0
|
413
|
Asa@0
|
414 self.frame:SetScript("OnEnter", OnEnter)
|
Asa@0
|
415 self.frame:SetScript("OnHide", OnHide)
|
Asa@0
|
416
|
Asa@0
|
417 self.SetMenu = SetMenu
|
Asa@0
|
418 self.CloseMenu = CloseMenu
|
Asa@0
|
419
|
Asa@0
|
420 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
421 return self
|
Asa@0
|
422 end
|
Asa@0
|
423
|
Asa@0
|
424 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
425 end
|
Asa@0
|
426
|
Asa@0
|
427 -- Item: Separator
|
Asa@0
|
428 -- A single line to separate items
|
Asa@0
|
429 do
|
Asa@0
|
430 local widgetType = "Dropdown-Item-Separator"
|
Asa@0
|
431 local widgetVersion = 1
|
Asa@0
|
432
|
Asa@0
|
433 -- exported, override
|
Asa@0
|
434 local function SetDisabled(self, disabled)
|
Asa@0
|
435 ItemBase.SetDisabled(self, disabled)
|
Asa@0
|
436 self.useHighlight = false
|
Asa@0
|
437 end
|
Asa@0
|
438
|
Asa@0
|
439 local function Constructor()
|
Asa@0
|
440 local self = ItemBase.Create(widgetType)
|
Asa@0
|
441
|
Asa@0
|
442 self.SetDisabled = SetDisabled
|
Asa@0
|
443
|
Asa@0
|
444 local line = self.frame:CreateTexture(nil, "OVERLAY")
|
Asa@0
|
445 line:SetHeight(1)
|
Asa@0
|
446 line:SetTexture(.5, .5, .5)
|
Asa@0
|
447 line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
|
Asa@0
|
448 line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
|
Asa@0
|
449
|
Asa@0
|
450 self.text:Hide()
|
Asa@0
|
451
|
Asa@0
|
452 self.useHighlight = false
|
Asa@0
|
453
|
Asa@0
|
454 AceGUI:RegisterAsWidget(self)
|
Asa@0
|
455 return self
|
Asa@0
|
456 end
|
Asa@0
|
457
|
Asa@0
|
458 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
Asa@0
|
459 end
|