Mercurial > wow > itemauditor
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 |
