comparison Libs/AceGUI-3.0/widgets/AceGUIWidget-TreeGroup.lua @ 0:169f5211fc7f

First public revision. At this point ItemAuditor watches mail for auctions sold or purchased, watches for buy/sell (money and 1 item type change) and conversions/tradeskills. Milling isn't working yet because there is too much time between the first event and the last event.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 20 May 2010 19:22:19 -0700
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:169f5211fc7f
1 local AceGUI = LibStub("AceGUI-3.0")
2
3 -- Lua APIs
4 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
5 local math_min, math_max, floor = math.min, math.max, floor
6 local select, tremove, unpack = select, table.remove, unpack
7
8 -- WoW APIs
9 local CreateFrame, UIParent = CreateFrame, UIParent
10
11 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
12 -- List them here for Mikk's FindGlobals script
13 -- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
14
15 -- Recycling functions
16 local new, del
17 do
18 local pool = setmetatable({},{__mode='k'})
19 function new()
20 local t = next(pool)
21 if t then
22 pool[t] = nil
23 return t
24 else
25 return {}
26 end
27 end
28 function del(t)
29 for k in pairs(t) do
30 t[k] = nil
31 end
32 pool[t] = true
33 end
34 end
35
36 --------------
37 -- TreeView --
38 --------------
39
40 do
41 local Type = "TreeGroup"
42 local Version = 23
43
44 local DEFAULT_TREE_WIDTH = 175
45 local DEFAULT_TREE_SIZABLE = true
46
47 local PaneBackdrop = {
48 bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
49 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
50 tile = true, tileSize = 16, edgeSize = 16,
51 insets = { left = 3, right = 3, top = 5, bottom = 3 }
52 }
53
54 local DraggerBackdrop = {
55 bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
56 edgeFile = nil,
57 tile = true, tileSize = 16, edgeSize = 0,
58 insets = { left = 3, right = 3, top = 7, bottom = 7 }
59 }
60
61 local function OnAcquire(self)
62 self:SetTreeWidth(DEFAULT_TREE_WIDTH,DEFAULT_TREE_SIZABLE)
63 self:EnableButtonTooltips(true)
64 end
65
66 local function OnRelease(self)
67
68 self.frame:ClearAllPoints()
69 self.frame:Hide()
70 self.status = nil
71 for k, v in pairs(self.localstatus) do
72 if k == "groups" then
73 for k2 in pairs(v) do
74 v[k2] = nil
75 end
76 else
77 self.localstatus[k] = nil
78 end
79 end
80 self.localstatus.scrollvalue = 0
81 self.localstatus.treewidth = DEFAULT_TREE_WIDTH
82 self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
83 end
84
85 local function GetButtonParents(line)
86 local parent = line.parent
87 if parent and parent.value then
88 return parent.value, GetButtonParents(parent)
89 end
90 end
91
92 local function GetButtonUniqueValue(line)
93 local parent = line.parent
94 if parent and parent.value then
95 return GetButtonUniqueValue(parent).."\001"..line.value
96 else
97 return line.value
98 end
99 end
100
101 local function ButtonOnClick(this)
102 local self = this.obj
103 self:Fire("OnClick",this.uniquevalue, this.selected)
104 if not this.selected then
105 self:SetSelected(this.uniquevalue)
106 this.selected = true
107 this:LockHighlight()
108 self:RefreshTree()
109 end
110 AceGUI:ClearFocus()
111 end
112
113 local function ExpandOnClick(this)
114 local button = this.button
115 local self = button.obj
116 local status = (self.status or self.localstatus).groups
117 status[button.uniquevalue] = not status[button.uniquevalue]
118 self:RefreshTree()
119 end
120
121 local function ButtonOnDoubleClick(button)
122 local self = button.obj
123 local status = self.status or self.localstatus
124 local status = (self.status or self.localstatus).groups
125 status[button.uniquevalue] = not status[button.uniquevalue]
126 self:RefreshTree()
127 end
128
129 local function EnableButtonTooltips(self, enable)
130 self.enabletooltips = enable
131 end
132
133 local function Button_OnEnter(this)
134 local self = this.obj
135 self:Fire("OnButtonEnter", this.uniquevalue, this)
136
137 if self.enabletooltips then
138 GameTooltip:SetOwner(this, "ANCHOR_NONE")
139 GameTooltip:SetPoint("LEFT",this,"RIGHT")
140 GameTooltip:SetText(this.text:GetText() or "", 1, .82, 0, 1)
141
142 GameTooltip:Show()
143 end
144 end
145
146 local function Button_OnLeave(this)
147 local self = this.obj
148 self:Fire("OnButtonLeave", this.uniquevalue, this)
149
150 if self.enabletooltips then
151 GameTooltip:Hide()
152 end
153 end
154
155
156 local buttoncount = 1
157 local function CreateButton(self)
158 local button = CreateFrame("Button",("AceGUI30TreeButton%d"):format(buttoncount),self.treeframe, "OptionsListButtonTemplate")
159 buttoncount = buttoncount + 1
160 button.obj = self
161
162 local icon = button:CreateTexture(nil, "OVERLAY")
163 icon:SetWidth(14)
164 icon:SetHeight(14)
165 button.icon = icon
166
167 button:SetScript("OnClick",ButtonOnClick)
168 button:SetScript("OnDoubleClick", ButtonOnDoubleClick)
169 button:SetScript("OnEnter",Button_OnEnter)
170 button:SetScript("OnLeave",Button_OnLeave)
171
172 button.toggle.button = button
173 button.toggle:SetScript("OnClick",ExpandOnClick)
174
175 return button
176 end
177
178 local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
179 local self = button.obj
180 local toggle = button.toggle
181 local frame = self.frame
182 local text = treeline.text or ""
183 local icon = treeline.icon
184 local iconCoords = treeline.iconCoords
185 local level = treeline.level
186 local value = treeline.value
187 local uniquevalue = treeline.uniquevalue
188 local disabled = treeline.disabled
189
190 button.treeline = treeline
191 button.value = value
192 button.uniquevalue = uniquevalue
193 if selected then
194 button:LockHighlight()
195 button.selected = true
196 else
197 button:UnlockHighlight()
198 button.selected = false
199 end
200 local normalTexture = button:GetNormalTexture()
201 local line = button.line
202 button.level = level
203 if ( level == 1 ) then
204 button:SetNormalFontObject("GameFontNormal")
205 button:SetHighlightFontObject("GameFontHighlight")
206 button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
207 else
208 button:SetNormalFontObject("GameFontHighlightSmall")
209 button:SetHighlightFontObject("GameFontHighlightSmall")
210 button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
211 end
212
213 if disabled then
214 button:EnableMouse(false)
215 button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
216 else
217 button.text:SetText(text)
218 button:EnableMouse(true)
219 end
220
221 if icon then
222 button.icon:SetTexture(icon)
223 button.icon:SetPoint("LEFT", button, "LEFT", 8 * level, (level == 1) and 0 or 1)
224 else
225 button.icon:SetTexture(nil)
226 end
227
228 if iconCoords then
229 button.icon:SetTexCoord(unpack(iconCoords))
230 else
231 button.icon:SetTexCoord(0, 1, 0, 1)
232 end
233
234 if canExpand then
235 if not isExpanded then
236 toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
237 toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
238 else
239 toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
240 toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
241 end
242 toggle:Show()
243 else
244 toggle:Hide()
245 end
246 end
247
248
249 local function OnScrollValueChanged(this, value)
250 if this.obj.noupdate then return end
251 local self = this.obj
252 local status = self.status or self.localstatus
253 status.scrollvalue = value
254 self:RefreshTree()
255 AceGUI:ClearFocus()
256 end
257
258 -- called to set an external table to store status in
259 local function SetStatusTable(self, status)
260 assert(type(status) == "table")
261 self.status = status
262 if not status.groups then
263 status.groups = {}
264 end
265 if not status.scrollvalue then
266 status.scrollvalue = 0
267 end
268 if not status.treewidth then
269 status.treewidth = DEFAULT_TREE_WIDTH
270 end
271 if not status.treesizable then
272 status.treesizable = DEFAULT_TREE_SIZABLE
273 end
274 self:SetTreeWidth(status.treewidth,status.treesizable)
275 self:RefreshTree()
276 end
277
278 --sets the tree to be displayed
279 --[[
280 example tree
281
282 Alpha
283 Bravo
284 -Charlie
285 -Delta
286 -Echo
287 Foxtrot
288
289 tree = {
290 {
291 value = "A",
292 text = "Alpha"
293 },
294 {
295 value = "B",
296 text = "Bravo",
297 children = {
298 {
299 value = "C",
300 text = "Charlie"
301 },
302 {
303 value = "D",
304 text = "Delta"
305 children = {
306 {
307 value = "E",
308 text = "Echo"
309 }
310 }
311 }
312 }
313 },
314 {
315 value = "F",
316 text = "Foxtrot"
317 },
318 }
319 ]]
320 local function SetTree(self, tree, filter)
321 self.filter = filter
322 if tree then
323 assert(type(tree) == "table")
324 end
325 self.tree = tree
326 self:RefreshTree()
327 end
328
329 local function ShouldDisplayLevel(tree)
330 local result = false
331 for k, v in ipairs(tree) do
332 if v.children == nil and v.visible ~= false then
333 result = true
334 elseif v.children then
335 result = result or ShouldDisplayLevel(v.children)
336 end
337 if result then return result end
338 end
339 return false
340 end
341
342 local function addLine(self, v, tree, level, parent)
343 local line = new()
344 line.value = v.value
345 line.text = v.text
346 line.icon = v.icon
347 line.iconCoords = v.iconCoords
348 line.disabled = v.disabled
349 line.tree = tree
350 line.level = level
351 line.parent = parent
352 line.visible = v.visible
353 line.uniquevalue = GetButtonUniqueValue(line)
354 if v.children then
355 line.hasChildren = true
356 else
357 line.hasChildren = nil
358 end
359 self.lines[#self.lines+1] = line
360 return line
361 end
362
363 local function BuildLevel(self, tree, level, parent)
364 local groups = (self.status or self.localstatus).groups
365 local hasChildren = self.hasChildren
366
367 for i, v in ipairs(tree) do
368 if v.children then
369 if not self.filter or ShouldDisplayLevel(v.children) then
370 local line = addLine(self, v, tree, level, parent)
371 if groups[line.uniquevalue] then
372 self:BuildLevel(v.children, level+1, line)
373 end
374 end
375 elseif v.visible ~= false or not self.filter then
376 addLine(self, v, tree, level, parent)
377 end
378 end
379 end
380
381 --fire an update after one frame to catch the treeframes height
382 local function FirstFrameUpdate(this)
383 local self = this.obj
384 this:SetScript("OnUpdate",nil)
385 self:RefreshTree()
386 end
387
388 local function ResizeUpdate(this)
389 this.obj:RefreshTree()
390 end
391
392 local function RefreshTree(self)
393 local buttons = self.buttons
394 local lines = self.lines
395
396 for i, v in ipairs(buttons) do
397 v:Hide()
398 end
399 while lines[1] do
400 local t = tremove(lines)
401 for k in pairs(t) do
402 t[k] = nil
403 end
404 del(t)
405 end
406
407 if not self.tree then return end
408 --Build the list of visible entries from the tree and status tables
409 local status = self.status or self.localstatus
410 local groupstatus = status.groups
411 local tree = self.tree
412
413 local treeframe = self.treeframe
414
415 self:BuildLevel(tree, 1)
416
417 local numlines = #lines
418
419 local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
420
421 local first, last
422
423 if numlines <= maxlines then
424 --the whole tree fits in the frame
425 status.scrollvalue = 0
426 self:ShowScroll(false)
427 first, last = 1, numlines
428 else
429 self:ShowScroll(true)
430 --scrolling will be needed
431 self.noupdate = true
432 self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
433 --check if we are scrolled down too far
434 if numlines - status.scrollvalue < maxlines then
435 status.scrollvalue = numlines - maxlines
436 self.scrollbar:SetValue(status.scrollvalue)
437 end
438 self.noupdate = nil
439 first, last = status.scrollvalue+1, status.scrollvalue + maxlines
440 end
441
442 local buttonnum = 1
443 for i = first, last do
444 local line = lines[i]
445 local button = buttons[buttonnum]
446 if not button then
447 button = self:CreateButton()
448
449 buttons[buttonnum] = button
450 button:SetParent(treeframe)
451 button:SetFrameLevel(treeframe:GetFrameLevel()+1)
452 button:ClearAllPoints()
453 if i == 1 then
454 if self.showscroll then
455 button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
456 button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
457 else
458 button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
459 button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
460 end
461 else
462 button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
463 button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
464 end
465 end
466
467 UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
468 button:Show()
469 buttonnum = buttonnum + 1
470 end
471
472 end
473
474 local function SetSelected(self, value)
475 local status = self.status or self.localstatus
476 if status.selected ~= value then
477 status.selected = value
478 self:Fire("OnGroupSelected", value)
479 end
480 end
481
482 local function BuildUniqueValue(...)
483 local n = select('#', ...)
484 if n == 1 then
485 return ...
486 else
487 return (...).."\001"..BuildUniqueValue(select(2,...))
488 end
489 end
490
491 local function Select(self, uniquevalue, ...)
492 self.filter = false
493 local status = self.status or self.localstatus
494 local groups = status.groups
495 for i = 1, select('#', ...) do
496 groups[BuildUniqueValue(select(i, ...))] = true
497 end
498 status.selected = uniquevalue
499 self:RefreshTree()
500 self:Fire("OnGroupSelected", uniquevalue)
501 end
502
503 local function SelectByPath(self, ...)
504 self:Select(BuildUniqueValue(...), ...)
505 end
506
507 --Selects a tree node by UniqueValue
508 local function SelectByValue(self, uniquevalue)
509 self:Select(uniquevalue, ("\001"):split(uniquevalue))
510 end
511
512
513 local function ShowScroll(self, show)
514 self.showscroll = show
515 if show then
516 self.scrollbar:Show()
517 if self.buttons[1] then
518 self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
519 end
520 else
521 self.scrollbar:Hide()
522 if self.buttons[1] then
523 self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
524 end
525 end
526 end
527
528 local function OnWidthSet(self, width)
529 local content = self.content
530 local treeframe = self.treeframe
531 local status = self.status or self.localstatus
532 status.fullwidth = width
533
534 local contentwidth = width - status.treewidth - 20
535 if contentwidth < 0 then
536 contentwidth = 0
537 end
538 content:SetWidth(contentwidth)
539 content.width = contentwidth
540
541 local maxtreewidth = math_min(400, width - 50)
542
543 if maxtreewidth > 100 and status.treewidth > maxtreewidth then
544 self:SetTreeWidth(maxtreewidth, status.treesizable)
545 end
546 treeframe:SetMaxResize(maxtreewidth,1600)
547 end
548
549
550 local function OnHeightSet(self, height)
551 local content = self.content
552 local contentheight = height - 20
553 if contentheight < 0 then
554 contentheight = 0
555 end
556 content:SetHeight(contentheight)
557 content.height = contentheight
558 end
559
560
561 local function TreeOnMouseWheel(this, delta)
562 local self = this.obj
563 if self.showscroll then
564 local scrollbar = self.scrollbar
565 local min, max = scrollbar:GetMinMaxValues()
566 local value = scrollbar:GetValue()
567 local newvalue = math_min(max,math_max(min,value - delta))
568 if value ~= newvalue then
569 scrollbar:SetValue(newvalue)
570 end
571 end
572 end
573
574 local function SetTreeWidth(self, treewidth, resizable)
575 if not resizable then
576 if type(treewidth) == 'number' then
577 resizable = false
578 elseif type(treewidth) == 'boolean' then
579 resizable = treewidth
580 treewidth = DEFAULT_TREE_WIDTH
581 else
582 resizable = false
583 treewidth = DEFAULT_TREE_WIDTH
584 end
585 end
586 self.treeframe:SetWidth(treewidth)
587 self.dragger:EnableMouse(resizable)
588
589 local status = self.status or self.localstatus
590 status.treewidth = treewidth
591 status.treesizable = resizable
592
593 -- recalculate the content width
594 if status.fullwidth then
595 self:OnWidthSet(status.fullwidth)
596 end
597 end
598
599 local function draggerLeave(this)
600 this:SetBackdropColor(1, 1, 1, 0)
601 end
602
603 local function draggerEnter(this)
604 this:SetBackdropColor(1, 1, 1, 0.8)
605 end
606
607 local function draggerDown(this)
608 local treeframe = this:GetParent()
609 treeframe:StartSizing("RIGHT")
610 end
611
612 local function draggerUp(this)
613 local treeframe = this:GetParent()
614 local self = treeframe.obj
615 local frame = treeframe:GetParent()
616 treeframe:StopMovingOrSizing()
617 --treeframe:SetScript("OnUpdate", nil)
618 treeframe:SetUserPlaced(false)
619 --Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
620 treeframe:SetHeight(0)
621 treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
622 treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
623
624 local status = self.status or self.localstatus
625 status.treewidth = treeframe:GetWidth()
626
627 treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
628 -- recalculate the content width
629 treeframe.obj:OnWidthSet(status.fullwidth)
630 -- update the layout of the content
631 treeframe.obj:DoLayout()
632 end
633
634 local function LayoutFinished(self, width, height)
635 if self.noAutoHeight then return end
636 self:SetHeight((height or 0) + 20)
637 end
638
639 local createdcount = 0
640 local function Constructor()
641 local frame = CreateFrame("Frame",nil,UIParent)
642 local self = {}
643 self.type = Type
644 self.lines = {}
645 self.levels = {}
646 self.buttons = {}
647 self.hasChildren = {}
648 self.localstatus = {}
649 self.localstatus.groups = {}
650 self.filter = false
651
652 local treeframe = CreateFrame("Frame",nil,frame)
653 treeframe.obj = self
654 treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
655 treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
656 treeframe:SetWidth(DEFAULT_TREE_WIDTH)
657 treeframe:SetScript("OnUpdate",FirstFrameUpdate)
658 treeframe:SetScript("OnSizeChanged",ResizeUpdate)
659
660 treeframe:EnableMouseWheel(true)
661 treeframe:SetScript("OnMouseWheel", TreeOnMouseWheel)
662 treeframe:SetBackdrop(PaneBackdrop)
663 treeframe:SetBackdropColor(0.1,0.1,0.1,0.5)
664 treeframe:SetBackdropBorderColor(0.4,0.4,0.4)
665
666 treeframe:SetResizable(true)
667 treeframe:SetMinResize(100, 1)
668 treeframe:SetMaxResize(400,1600)
669 local dragger = CreateFrame("Frame", nil, treeframe)
670 dragger:SetWidth(8)
671 dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
672 dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
673 dragger:SetBackdrop(DraggerBackdrop)
674 dragger:SetBackdropColor(1, 1, 1, 0)
675 dragger:SetScript("OnMouseDown", draggerDown)
676 dragger:SetScript("OnMouseUp", draggerUp)
677 dragger:SetScript("OnEnter", draggerEnter)
678 dragger:SetScript("OnLeave", draggerLeave)
679
680 self.dragger = dragger
681 self.treeframe = treeframe
682 self.OnRelease = OnRelease
683 self.OnAcquire = OnAcquire
684
685 self.SetTree = SetTree
686 self.SetTreeWidth = SetTreeWidth
687 self.RefreshTree = RefreshTree
688 self.SetStatusTable = SetStatusTable
689 self.BuildLevel = BuildLevel
690 self.CreateButton = CreateButton
691 self.SetSelected = SetSelected
692 self.ShowScroll = ShowScroll
693 self.SetStatusTable = SetStatusTable
694 self.Select = Select
695 self.SelectByValue = SelectByValue
696 self.SelectByPath = SelectByPath
697 self.OnWidthSet = OnWidthSet
698 self.OnHeightSet = OnHeightSet
699 self.EnableButtonTooltips = EnableButtonTooltips
700 --self.Filter = Filter
701 self.LayoutFinished = LayoutFinished
702
703 self.frame = frame
704 frame.obj = self
705
706 createdcount = createdcount + 1
707 local scrollbar = CreateFrame("Slider",("AceConfigDialogTreeGroup%dScrollBar"):format(createdcount),treeframe,"UIPanelScrollBarTemplate")
708 self.scrollbar = scrollbar
709 local scrollbg = scrollbar:CreateTexture(nil,"BACKGROUND")
710 scrollbg:SetAllPoints(scrollbar)
711 scrollbg:SetTexture(0,0,0,0.4)
712 scrollbar.obj = self
713 self.noupdate = true
714 scrollbar:SetPoint("TOPRIGHT",treeframe,"TOPRIGHT",-10,-26)
715 scrollbar:SetPoint("BOTTOMRIGHT",treeframe,"BOTTOMRIGHT",-10,26)
716 scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
717 scrollbar:SetMinMaxValues(0,0)
718 self.localstatus.scrollvalue = 0
719 scrollbar:SetValueStep(1)
720 scrollbar:SetValue(0)
721 scrollbar:SetWidth(16)
722 self.noupdate = nil
723
724 local border = CreateFrame("Frame",nil,frame)
725 self.border = border
726 border:SetPoint("TOPLEFT",treeframe,"TOPRIGHT", 0,0)
727 border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
728
729 border:SetBackdrop(PaneBackdrop)
730 border:SetBackdropColor(0.1,0.1,0.1,0.5)
731 border:SetBackdropBorderColor(0.4,0.4,0.4)
732
733 --Container Support
734 local content = CreateFrame("Frame",nil,border)
735 self.content = content
736 content.obj = self
737 content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
738 content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
739
740 AceGUI:RegisterAsContainer(self)
741 --AceGUI:RegisterAsWidget(self)
742 return self
743 end
744
745 AceGUI:RegisterWidgetType(Type,Constructor,Version)
746 end