annotate main.lua @ 23:176cec42f292 1.4.1

Update TOC.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Sat, 14 Jun 2014 15:40:47 -0400
parents 3a2beea01a28
children
rev   line source
farmbuyer@1 1 local nametag, addon = ...
farmbuyer@3 2 local L = LibStub("AceLocale-3.0"):GetLocale(nametag)
farmbuyer@1 3
farmbuyer@1 4 addon.defaults = {
farmbuyer@1 5 profile = {
farmbuyer@1 6 enable = true,
farmbuyer@1 7 guildcontrol = true,
farmbuyer@1 8 },
farmbuyer@1 9 }
farmbuyer@1 10
farmbuyer@1 11
farmbuyer@1 12 addon.options = {
farmbuyer@1 13 name = "",
farmbuyer@1 14 type = 'group',
farmbuyer@1 15 childGroups = 'tab',
farmbuyer@1 16 handler = addon, -- functions listed as strings called as addon:func
farmbuyer@1 17 get = "GetOption",
farmbuyer@1 18 set = "SetOption",
farmbuyer@1 19 args = {
farmbuyer@1 20 general = {
farmbuyer@3 21 name = GENERAL,
farmbuyer@3 22 desc = L["General options"],
farmbuyer@1 23 type = 'group',
farmbuyer@1 24 order = 10,
farmbuyer@1 25 args = {
farmbuyer@1 26 version = {
farmbuyer@1 27 --name = filled in during OnInit
farmbuyer@1 28 type = 'description',
farmbuyer@1 29 fontSize = "large",
farmbuyer@1 30 cmdHidden = true,
farmbuyer@1 31 width = 'full',
farmbuyer@1 32 order = 1,
farmbuyer@1 33 },
farmbuyer@1 34 enable = {
farmbuyer@3 35 name = ENABLE,
farmbuyer@3 36 desc = L["Use this addon"],
farmbuyer@1 37 type = 'toggle',
farmbuyer@1 38 arg = "ToggleEnable",
farmbuyer@1 39 order = 5,
farmbuyer@1 40 },
farmbuyer@1 41 guildcontrol = {
farmbuyer@3 42 name = L["Guild Control for non-GMs"],
farmbuyer@3 43 desc = L["Make the grayed-out Guild Control button activate this addon instead."],
farmbuyer@1 44 type = 'toggle',
farmbuyer@15 45 width = 'double', -- else it gets cut off
farmbuyer@1 46 order = 10,
farmbuyer@1 47 },
farmbuyer@1 48 break1 = {
farmbuyer@1 49 name = '',
farmbuyer@1 50 type = 'description',
farmbuyer@1 51 cmdHidden = true,
farmbuyer@1 52 width = 'full',
farmbuyer@1 53 order = 14,
farmbuyer@1 54 },
farmbuyer@1 55 popup = {
farmbuyer@1 56 name = "/wrdw",
farmbuyer@3 57 desc = L["Toggle WRDW window"],
farmbuyer@1 58 type = 'execute',
farmbuyer@1 59 func = function()
farmbuyer@1 60 InterfaceOptionsFrameCancel:Click()
farmbuyer@1 61 HideUIPanel(GameMenuFrame)
farmbuyer@1 62 addon:BuildWindow()
farmbuyer@1 63 end,
farmbuyer@1 64 order = 15,
farmbuyer@1 65 },
farmbuyer@1 66 },
farmbuyer@1 67 },
farmbuyer@1 68 --profiles = filled in OnInit
farmbuyer@1 69 },
farmbuyer@1 70 }
farmbuyer@1 71
farmbuyer@1 72
farmbuyer@1 73 -----------------------------------------------------------------------------
farmbuyer@1 74 -- other locals
farmbuyer@1 75 local AceGUI = LibStub("AceGUI-3.0")
farmbuyer@1 76 local st_rowheight = 25
farmbuyer@1 77 local st_displayed_rows = 15 --math.floor(366/st_rowheight)
farmbuyer@15 78 local st_colwidth = 80 --65
farmbuyer@15 79 local cols_per_group = 6
farmbuyer@15 80 local num_flagsets
farmbuyer@1 81 local sidetabs
farmbuyer@1 82 local incomplete
farmbuyer@15 83 local flagmap
farmbuyer@1 84
farmbuyer@15 85 -- Remove children ST widgets without explicitly Release()'ing them. As there
farmbuyer@15 86 -- are no children other than STs, no "normal" widget resources are leaked.
farmbuyer@1 87 local function DisownChildren (container)
farmbuyer@1 88 for i,v in ipairs(container.children) do
farmbuyer@1 89 container.children[i] = nil
farmbuyer@1 90 v.frame:Hide()
farmbuyer@1 91 v.frame:ClearAllPoints()
farmbuyer@1 92 end
farmbuyer@1 93 end
farmbuyer@1 94
farmbuyer@15 95 local function setstatus(txt)
farmbuyer@15 96 addon.display:SetStatusText(txt)
farmbuyer@15 97 addon.tooltip = #txt > 40 and txt or nil
farmbuyer@15 98 end
farmbuyer@15 99
farmbuyer@1 100
farmbuyer@1 101 -----------------------------------------------------------------------------
farmbuyer@1 102 addon = LibStub("AceAddon-3.0"):NewAddon(addon, nametag,
farmbuyer@1 103 "AceConsole-3.0", "AceEvent-3.0")
farmbuyer@1 104
farmbuyer@1 105 -- Thanks to jerry for the nifty arg idea.
farmbuyer@1 106 function addon:SetOption (info, value)
farmbuyer@1 107 local name = info[#info]
farmbuyer@1 108 self.db.profile[name] = value
farmbuyer@1 109 local arg = info.arg
farmbuyer@1 110 if arg then self[arg](self) end
farmbuyer@1 111 end
farmbuyer@1 112
farmbuyer@1 113 function addon:GetOption (info)
farmbuyer@1 114 local name = info[#info]
farmbuyer@1 115 return self.db.profile[name]
farmbuyer@1 116 end
farmbuyer@1 117
farmbuyer@1 118 function addon:OnInitialize()
farmbuyer@1 119 self.db = LibStub("AceDB-3.0"):New("wrdwDB", self.defaults, --[[Default=]]true)
farmbuyer@1 120
farmbuyer@1 121 local AceDBOptions = LibStub("AceDBOptions-3.0", true)
farmbuyer@1 122 if AceDBOptions then
farmbuyer@1 123 self.options.args.profiles = AceDBOptions:GetOptionsTable(self.db)
farmbuyer@1 124 self.options.args.profiles.order = 200
farmbuyer@1 125 end
farmbuyer@1 126
farmbuyer@1 127 self.options.args.general.args.version.name =
farmbuyer@1 128 "|cff30adffVersion " .. (GetAddOnMetadata(nametag, "Version") or "?") .. "|r"
farmbuyer@1 129 LibStub("AceConfig-3.0"):RegisterOptionsTable(nametag, self.options)
farmbuyer@1 130 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions(nametag, "WhichRankDoesWhat")
farmbuyer@1 131 --self.optionsFrame.okay = function() pattern_editing_safe = false end
farmbuyer@1 132 --self.optionsFrame.refresh = self.optionsFrame.okay
farmbuyer@1 133 --self.optionsFrame.cancel = self.optionsFrame.okay
farmbuyer@1 134
farmbuyer@1 135 self:SetEnabledState(self.db.profile.enable)
farmbuyer@1 136 self.OnInitialize = nil
farmbuyer@1 137 end
farmbuyer@1 138
farmbuyer@1 139
farmbuyer@1 140 function addon:OnEnable()
farmbuyer@1 141 self:RegisterEvent("GUILD_RANKS_UPDATE")
farmbuyer@8 142 self:RegisterChatCommand("wrdw", "OnSlashCommand")
farmbuyer@1 143
farmbuyer@7 144 -- Ideally, most of this stuff wouldn't be done at load time at all; this
farmbuyer@7 145 -- whole addon should be LoD.
farmbuyer@1 146 if (not IsGuildLeader()) and self.db.profile.guildcontrol then
farmbuyer@1 147 local function onclick() addon:BuildWindow() end
farmbuyer@1 148 local function onenter(this) GameTooltip_AddNewbieTip(this, GUILDCONTROL, 1.0, 1.0, 1.0, "/wrdw", 1) end
farmbuyer@1 149 GuildFrame_LoadUI()
farmbuyer@4 150 if not NUM_RANK_FLAGS then
farmbuyer@4 151 UIParentLoadAddOn("Blizzard_GuildControlUI")
farmbuyer@4 152 end
farmbuyer@15 153 local function noreallyitsokay()
farmbuyer@1 154 GuildControlButton:Enable()
farmbuyer@1 155 GuildControlButton:SetScript("OnClick", onclick)
farmbuyer@1 156 GuildControlButton:SetScript("OnEnter", onenter)
farmbuyer@15 157 end
farmbuyer@15 158 hooksecurefunc("GuildInfoFrame_UpdatePermissions", noreallyitsokay)
farmbuyer@15 159 -- This doesn't seem to be used anymore...?
farmbuyer@15 160 hooksecurefunc("GuildFrame_CheckPermissions", noreallyitsokay)
farmbuyer@1 161 end
farmbuyer@1 162 end
farmbuyer@1 163
farmbuyer@1 164 function addon:OnDisable()
farmbuyer@3 165 self:Print(L["You will need to relog or /reload to fully disable this addon."])
farmbuyer@1 166 end
farmbuyer@1 167
farmbuyer@1 168 function addon:ToggleEnable()
farmbuyer@1 169 if self.db.profile.enable then
farmbuyer@1 170 self:Enable()
farmbuyer@1 171 else
farmbuyer@1 172 self:Disable()
farmbuyer@1 173 end
farmbuyer@1 174 end
farmbuyer@1 175
farmbuyer@8 176 function addon:OnSlashCommand (input)
farmbuyer@7 177 if not NUM_RANK_FLAGS then -- in case a GM didn't get it loaded earlier
farmbuyer@7 178 GuildFrame_LoadUI()
farmbuyer@7 179 UIParentLoadAddOn("Blizzard_GuildControlUI")
farmbuyer@7 180 end
farmbuyer@1 181 if not input or input:trim() == "" then
farmbuyer@1 182 if self.display and self.display:IsShown() then
farmbuyer@1 183 self.display:Hide()
farmbuyer@1 184 else
farmbuyer@1 185 self:BuildWindow()
farmbuyer@1 186 end
farmbuyer@1 187 else
farmbuyer@1 188 --LibStub("AceConfigCmd-3.0").HandleCommand(self, "wrdw", nametag, input)
farmbuyer@1 189 LibStub("AceConfigDialog-3.0"):Open(nametag)
farmbuyer@1 190 end
farmbuyer@1 191 end
farmbuyer@1 192
farmbuyer@1 193
farmbuyer@1 194 -- Something somewhere has changed, redo the cache
farmbuyer@3 195 do
farmbuyer@15 196 local text = '|cffff1010' .. L["Guild flags have changed!"] .. '|r ' ..
farmbuyer@3 197 L["You must close and reopen this window to display the changes."]
farmbuyer@3 198 function addon:GUILD_RANKS_UPDATE()
farmbuyer@3 199 self.perms = nil
farmbuyer@3 200 if (not incomplete) and self.display and self.display:IsVisible() then
farmbuyer@15 201 setstatus(text)
farmbuyer@3 202 end
farmbuyer@1 203 end
farmbuyer@1 204 end
farmbuyer@1 205
farmbuyer@1 206
farmbuyer@1 207 function addon:BuildPerms()
farmbuyer@1 208 assert(UIParentLoadAddOn("Blizzard_GuildControlUI"))
farmbuyer@2 209 local check = "|TInterface\\Buttons\\UI-CheckBox-Check:"..(st_rowheight+5).."|t"
farmbuyer@1 210
farmbuyer@1 211 -- http://www.wowace.com/addons/lib-st/pages/set-data/minimal-dataset-format/
farmbuyer@1 212 local p,v = {}, {}
farmbuyer@15 213 flagmap = {}
farmbuyer@15 214 num_flagsets = math.floor(NUM_RANK_FLAGS/cols_per_group + 1)
farmbuyer@15 215 for flagset = 1, num_flagsets do
farmbuyer@15 216 p[flagset] = {}
farmbuyer@15 217 end
farmbuyer@15 218
farmbuyer@1 219 for r = 1, GuildControlGetNumRanks() do
farmbuyer@1 220 GuildControlSetRank(r)
farmbuyer@1 221
farmbuyer@15 222 -- permissions (most special handling goes here)
farmbuyer@15 223 -- flag 14 is no longer used
farmbuyer@15 224 -- flags 15 and 16 may have numeric values not just a boolean
farmbuyer@15 225 -- flag 21 is... not included yet, apparently
farmbuyer@1 226 local flags = { GuildControlGetRankFlags() }
farmbuyer@15 227 for flagset = 1, num_flagsets do
farmbuyer@15 228 local row = { GuildControlGetRankName(r) }
farmbuyer@15 229 for c_offset = 1, cols_per_group do while true do
farmbuyer@15 230 local c = (flagset-1) * cols_per_group + c_offset
farmbuyer@15 231 --if c == 14 or c > NUM_RANK_FLAGS then break end
farmbuyer@15 232 if c > NUM_RANK_FLAGS then break end
farmbuyer@15 233 local newcol = #row + 1
farmbuyer@15 234 flagmap[flagset..'x'..newcol] = c
farmbuyer@15 235 if c == 15 or c == 16 then
farmbuyer@15 236 local val = GetGuildBankWithdrawGoldLimit()
farmbuyer@15 237 row[newcol] = flags[c] and ((val == -1) and check or val) or ""
farmbuyer@15 238 elseif c == 14 then
farmbuyer@15 239 row[newcol] = ""
farmbuyer@15 240 else
farmbuyer@15 241 row[newcol] = flags[c] and check or ""
farmbuyer@15 242 end
farmbuyer@15 243 break
farmbuyer@15 244 end end
farmbuyer@15 245 p[flagset][r] = row
farmbuyer@15 246 end
farmbuyer@1 247
farmbuyer@1 248 -- guild vault
farmbuyer@1 249 local banktabs = {}
farmbuyer@1 250 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 251 -- isViewable, canDeposit, editText, numWithdrawals
farmbuyer@15 252 banktabs[t] = { GuildControlGetRankName(r), GetGuildBankTabPermissions(t) }
farmbuyer@1 253 banktabs[t][2] = banktabs[t][2] and check or ""
farmbuyer@1 254 banktabs[t][3] = banktabs[t][3] and check or ""
farmbuyer@1 255 banktabs[t][4] = banktabs[t][4] and check or ""
farmbuyer@1 256 local withdraw = banktabs[t][5]
farmbuyer@1 257 banktabs[t][5] = (withdraw == -1) and check or (withdraw == 0) and "" or withdraw
farmbuyer@1 258 end
farmbuyer@1 259 v[r] = banktabs
farmbuyer@1 260 end
farmbuyer@1 261 self.perms = p
farmbuyer@1 262 -- This one needs to be turned inside-out to match the data requirements
farmbuyer@1 263 self.vault = {}
farmbuyer@1 264 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 265 self.vault[t] = {}
farmbuyer@1 266 for r = 1, #v do
farmbuyer@1 267 self.vault[t][r] = v[r][t]
farmbuyer@1 268 end
farmbuyer@1 269 end
farmbuyer@1 270 end
farmbuyer@1 271
farmbuyer@1 272
farmbuyer@1 273 local make_sidetab
farmbuyer@1 274 do
farmbuyer@1 275 local lastclicked
farmbuyer@1 276 local function OnClick (thistab)
farmbuyer@1 277 if thistab == lastclicked then return end
farmbuyer@1 278 for i = 1, #sidetabs do
farmbuyer@1 279 sidetabs[i]:SetChecked(false)
farmbuyer@1 280 end
farmbuyer@1 281 thistab:SetChecked(true) -- should be redundant, but just in case
farmbuyer@1 282 lastclicked = thistab
farmbuyer@1 283 if thistab.callback then
farmbuyer@1 284 thistab:callback(thistab:GetID())
farmbuyer@1 285 end
farmbuyer@1 286 end
farmbuyer@1 287
farmbuyer@1 288 -- Some magic numbers here wrt the index
farmbuyer@1 289 function make_sidetab (index, callback)
farmbuyer@1 290 if not sidetabs then
farmbuyer@1 291 sidetabs = {}
farmbuyer@1 292 end
farmbuyer@1 293
farmbuyer@1 294 local tab = CreateFrame("CheckButton", "WRDWTab"..index, addon.display.frame, "SpellBookSkillLineTabTemplate", index)
farmbuyer@1 295 if index > 1 then
farmbuyer@1 296 tab:SetPoint("TOPLEFT", sidetabs[index-1], "BOTTOMLEFT", 0, -17)
farmbuyer@1 297 else
farmbuyer@1 298 tab:SetNormalTexture("Interface\\SpellBook\\GuildSpellbooktabBG")
farmbuyer@1 299 tab.TabardEmblem:Show()
farmbuyer@1 300 tab.TabardIconFrame:Show()
farmbuyer@1 301 SetLargeGuildTabardTextures("player", tab.TabardEmblem, tab:GetNormalTexture(), tab.TabardIconFrame)
farmbuyer@1 302 tab:SetPoint("TOPLEFT", addon.display.frame, "TOPRIGHT", 0, -17)
farmbuyer@1 303 end
farmbuyer@1 304 tab:SetScript("OnClick", OnClick)
farmbuyer@1 305 --tab:SetChecked(false) -- is default
farmbuyer@1 306 tab:Show()
farmbuyer@1 307 tab.callback = callback
farmbuyer@1 308 sidetabs[index] = tab
farmbuyer@1 309 return tab
farmbuyer@1 310 end
farmbuyer@1 311
farmbuyer@1 312 function addon:BuildVaultTabs()
farmbuyer@1 313 incomplete = nil
farmbuyer@1 314 local offset = 1 -- number of tabs already made
farmbuyer@1 315 local function pick_a_tab (tab, id)
farmbuyer@1 316 DisownChildren(self.display)
farmbuyer@1 317 self.display:AddChild(self.vault_sts[id-offset])
farmbuyer@15 318 local buttons = self.display:GetUserData("extra buttons")
farmbuyer@15 319 buttons['prev']:Disable()
farmbuyer@15 320 buttons['next']:Disable()
farmbuyer@1 321 end
farmbuyer@1 322 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 323 local name, icon = GetGuildBankTabInfo(t)
farmbuyer@1 324 incomplete = incomplete or icon == [[Interface\Icons\INV_Misc_QuestionMark]]
farmbuyer@1 325 local tab = make_sidetab(t+offset, pick_a_tab)
farmbuyer@1 326 tab:SetNormalTexture(icon)
farmbuyer@1 327 tab.tooltip = name
farmbuyer@1 328 end
farmbuyer@1 329 if incomplete then
farmbuyer@3 330 setstatus(L["Guild vault information is incomplete. Be closer to a vault, and give it some time. You may need to relog and/or open the guild roster/vault to force a client update."])
farmbuyer@1 331 end
farmbuyer@1 332 end
farmbuyer@1 333 end
farmbuyer@1 334
farmbuyer@1 335
farmbuyer@15 336 -- The "closebutton" variable isn't accessible through the widget. I should
farmbuyer@15 337 -- probably just constuct an entire Frame-equse thing by hand instead... gah.
farmbuyer@15 338 local function FIXFRAME (container, ...)
farmbuyer@15 339 for i = 1, select('#',...) do
farmbuyer@15 340 local child = select(i,...)
farmbuyer@15 341 if child:GetObjectType() == "Button" and child:GetText() == CLOSE then
farmbuyer@15 342 container:SetUserData("close button", child)
farmbuyer@15 343 return
farmbuyer@15 344 end
farmbuyer@15 345 end
farmbuyer@15 346 end
farmbuyer@15 347
farmbuyer@15 348 local function adjust_flagset (button)
farmbuyer@15 349 local key = button.button_key
farmbuyer@15 350 assert (key == 'prev' or key == 'next')
farmbuyer@15 351 local flagset = addon.current_main_st
farmbuyer@15 352 if key == 'prev' then
farmbuyer@15 353 flagset = flagset - 1
farmbuyer@15 354 else
farmbuyer@15 355 flagset = flagset + 1
farmbuyer@15 356 end
farmbuyer@15 357 return flagset
farmbuyer@15 358 end
farmbuyer@15 359
farmbuyer@15 360 local function AddedButton_OnEnter (button)
farmbuyer@15 361 -- not very generic, that's okay until we need to be
farmbuyer@15 362 local high = adjust_flagset(button) * cols_per_group
farmbuyer@15 363 local low = high - cols_per_group + 1
farmbuyer@15 364 if high > NUM_RANK_FLAGS then high = NUM_RANK_FLAGS end
farmbuyer@15 365 setstatus(L["Show flag columns %d - %d"]:format(low,high))
farmbuyer@15 366 end
farmbuyer@15 367 local function AddedButton_OnLeave (button)
farmbuyer@15 368 setstatus("")
farmbuyer@15 369 end
farmbuyer@15 370 local function AddedButton_OnClick (button)
farmbuyer@15 371 addon:DoMainST(adjust_flagset(button))
farmbuyer@15 372 -- the buttons may have changed state, adjust their status text
farmbuyer@15 373 if button:IsEnabled() then
farmbuyer@15 374 AddedButton_OnEnter (button)
farmbuyer@15 375 else
farmbuyer@15 376 AddedButton_OnLeave (button)
farmbuyer@15 377 end
farmbuyer@15 378 end
farmbuyer@15 379
farmbuyer@15 380 local function AddButton (container, key, label)
farmbuyer@15 381 assert(not tonumber(key))
farmbuyer@15 382 local all = container:GetUserData("extra buttons") or {}
farmbuyer@15 383 container:SetUserData("extra buttons", all)
farmbuyer@15 384 local n = #all
farmbuyer@15 385 local closebutton = assert(container:GetUserData("close button"), "something horrible")
farmbuyer@15 386 local b = CreateFrame("Button", nil, container.frame, "UIPanelButtonTemplate")
farmbuyer@15 387 b.button_key = key
farmbuyer@15 388 b.obj = self
farmbuyer@15 389 b:SetScript("OnClick", AddedButton_OnClick)
farmbuyer@15 390 b:SetScript("OnEnter", AddedButton_OnEnter)
farmbuyer@15 391 b:SetScript("OnLeave", AddedButton_OnLeave)
farmbuyer@15 392 b:SetText(label)
farmbuyer@15 393 b:SetHeight(20)
farmbuyer@15 394 b:SetWidth(50) -- "Close" is 100
farmbuyer@15 395 b:SetPoint("BOTTOMRIGHT", closebutton, "BOTTOMLEFT", -5, 0)
farmbuyer@15 396 b:Show()
farmbuyer@15 397 all[n+1] = b
farmbuyer@15 398 all[key] = b
farmbuyer@15 399
farmbuyer@15 400 for i = n, 1, -1 do
farmbuyer@15 401 local ob = all[i]
farmbuyer@15 402 ob:ClearAllPoints()
farmbuyer@15 403 ob:SetPoint("BOTTOMRIGHT", all[i+1], "BOTTOMLEFT", -5, 0)
farmbuyer@15 404 end
farmbuyer@15 405 -- The Frame's statusbar is not accessible via the Frame widget itself.
farmbuyer@15 406 -- Which is nice and properly encapsulated and all, but also inconvenient.
farmbuyer@15 407 -- We'll take the long route there.
farmbuyer@15 408 local sb = container.statustext:GetParent()
farmbuyer@15 409 assert (sb.obj == container)
farmbuyer@15 410 sb:ClearAllPoints()
farmbuyer@15 411 sb:SetPoint("BOTTOMLEFT", 15, 15) -- default
farmbuyer@15 412 sb:SetPoint("BOTTOMRIGHT", all[1], "BOTTOMLEFT", -5, 0)
farmbuyer@15 413 end
farmbuyer@15 414
farmbuyer@15 415
farmbuyer@1 416 local function st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 417 if (row == nil) or (realrow == nil) then -- mouseover column header
farmbuyer@1 418 setstatus(cellFrame:GetText():gsub('\n',' '))
farmbuyer@1 419 return true
farmbuyer@1 420 end
farmbuyer@1 421 return false -- continue with default highlighting behavior
farmbuyer@1 422 end
farmbuyer@1 423 local function st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 424 setstatus("")
farmbuyer@1 425 return false -- continue with default un-highlighting behavior
farmbuyer@1 426 end
farmbuyer@1 427 local function st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 428 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
farmbuyer@1 429 -- more here?
farmbuyer@1 430 return true -- do not do anything further
farmbuyer@1 431 end
farmbuyer@1 432
farmbuyer@1 433
farmbuyer@15 434 local function OnEnterStatusBar (container)
farmbuyer@15 435 if not addon.tooltip then return end
farmbuyer@15 436 GameTooltip:SetOwner (container.frame, "ANCHOR_RIGHT")
farmbuyer@15 437 GameTooltip:ClearLines()
farmbuyer@15 438 GameTooltip:AddLine (nametag)
farmbuyer@15 439 GameTooltip:AddLine (addon.tooltip, 0.8, 0.8, 0.8, 1)
farmbuyer@15 440 GameTooltip:Show()
farmbuyer@15 441 end
farmbuyer@15 442
farmbuyer@15 443
farmbuyer@15 444 function addon:BuildMainSTs (permissions, parent_frame)
farmbuyer@15 445 local errtxt = "flagset %d, column %d, failed to map to a flag number"
farmbuyer@1 446 -- if this language uses a trailing colon, strip it
farmbuyer@15 447 local ranklabel = GUILDCONTROL_RANKLABEL:gsub(":$","")
farmbuyer@15 448 self.main_sts = {}
farmbuyer@1 449
farmbuyer@15 450 for flagset = 1, #permissions do
farmbuyer@15 451 local cols = {{
farmbuyer@15 452 name = ranklabel,
farmbuyer@15 453 width = 10 * #ranklabel,
farmbuyer@15 454 }}
farmbuyer@15 455 for c = #cols+1, #permissions[flagset][1] do -- all ranks work here
farmbuyer@15 456 local f = flagmap[flagset..'x'..c]
farmbuyer@15 457 if not f then error(errtxt:format(flagset, c)) end
farmbuyer@15 458 table.insert(cols,{
farmbuyer@15 459 -- the only special handling outside BuildPerms
farmbuyer@15 460 name = _G[f == 14 and 'UNUSED' or 'GUILDCONTROL_OPTION'..f],
farmbuyer@15 461 width = st_colwidth,
farmbuyer@15 462 })
farmbuyer@15 463 end
farmbuyer@1 464
farmbuyer@15 465 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, --[[highlight=]]nil, parent_frame)
farmbuyer@15 466 ST:Hide()
farmbuyer@1 467
farmbuyer@15 468 ST:SetData(permissions[flagset], --[[minimal format=]]true)
farmbuyer@15 469 ST:RegisterEvents{
farmbuyer@15 470 OnEnter = st_OnEnter,
farmbuyer@15 471 OnLeave = st_OnLeave,
farmbuyer@15 472 OnClick = st_OnClick,
farmbuyer@15 473 OnDoubleClick = st_OnClick,
farmbuyer@15 474 }
farmbuyer@15 475 self.main_sts[flagset] = ST
farmbuyer@15 476 end
farmbuyer@1 477 end
farmbuyer@1 478
farmbuyer@1 479 function addon:BuildVaultSTs (permissions, parent_frame)
farmbuyer@1 480 self.vault_sts = {}
farmbuyer@1 481 local cols = {
farmbuyer@15 482 self.main_sts[1].st.cols[1],
farmbuyer@1 483 { name = GUILDCONTROL_VIEW_TAB, width = 80 },
farmbuyer@1 484 { name = GUILDCONTROL_DEPOSIT_ITEMS, width = 80 },
farmbuyer@1 485 { name = GUILDCONTROL_UPDATE_TEXT, width = 80 },
farmbuyer@1 486 { name = GUILDCONTROL_WITHDRAW_ITEMS, width = 150 },
farmbuyer@1 487 }
farmbuyer@1 488
farmbuyer@1 489 for tab = 1, #permissions do
farmbuyer@15 490 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, --[[highlight=]]nil, parent_frame)
farmbuyer@1 491 ST:Hide()
farmbuyer@1 492 ST:SetData(permissions[tab], --[[minimal format=]]true)
farmbuyer@1 493 ST:RegisterEvents{
farmbuyer@1 494 OnEnter = st_OnEnter,
farmbuyer@1 495 OnLeave = st_OnLeave,
farmbuyer@1 496 OnClick = st_OnClick,
farmbuyer@1 497 OnDoubleClick = st_OnClick,
farmbuyer@1 498 }
farmbuyer@1 499 self.vault_sts[tab] = ST
farmbuyer@1 500 end
farmbuyer@1 501 end
farmbuyer@1 502
farmbuyer@1 503
farmbuyer@15 504 function addon:DoMainST (index)
farmbuyer@15 505 self.current_main_st = index
farmbuyer@15 506 DisownChildren(self.display)
farmbuyer@15 507 self.display:AddChild(self.main_sts[index])
farmbuyer@15 508 local buttons = self.display:GetUserData("extra buttons")
farmbuyer@15 509 buttons['prev'][index <= 1 and 'Disable' or 'Enable'](buttons['prev'])
farmbuyer@15 510 buttons['next'][index >= num_flagsets and 'Disable' or 'Enable'](buttons['next'])
farmbuyer@15 511 end
farmbuyer@15 512
farmbuyer@15 513
farmbuyer@8 514 -- Under normal conditions, this massive wodge is built once, and then merely
farmbuyer@8 515 -- :Show'n and :Hide'n. Only if info gets out of date do we release/destroy
farmbuyer@8 516 -- the UI elements and rebuild.
farmbuyer@1 517 function addon:BuildWindow()
farmbuyer@1 518 local need_tabs
farmbuyer@1 519 if self.display then
farmbuyer@1 520 self.display:Hide()
farmbuyer@1 521 else
farmbuyer@1 522 self.display = AceGUI:Create("Frame")
farmbuyer@1 523 self.display:SetTitle("Which Rank Does What")
farmbuyer@1 524 self.display:SetLayout("Fill")
farmbuyer@8 525 self.display:EnableResize(false)
farmbuyer@1 526 self.display:SetStatusTable{
farmbuyer@15 527 width = (st_colwidth+4) * cols_per_group -- flag columns
farmbuyer@4 528 + 105, -- rank label column
farmbuyer@1 529 height = 500,
farmbuyer@1 530 }
farmbuyer@1 531 self.display:ApplyStatus()
farmbuyer@15 532 FIXFRAME (self.display, self.display.frame:GetChildren())
farmbuyer@15 533 AddButton (self.display, 'prev', "<<")
farmbuyer@15 534 AddButton (self.display, 'next', ">>")
farmbuyer@15 535 self.display:SetCallback("OnEnterStatusBar", OnEnterStatusBar)
farmbuyer@15 536 self.display:SetCallback("OnLeaveStatusBar", GameTooltip_Hide)
farmbuyer@1 537 self.display:SetCallback("OnClose", function(_d)
farmbuyer@1 538 if incomplete or (not self.perms) then
farmbuyer@1 539 -- stuff changed while open
farmbuyer@1 540 self.perms = nil
farmbuyer@1 541 self.display = nil
farmbuyer@8 542 if sidetabs then for i,s in ipairs(sidetabs) do
farmbuyer@8 543 s:Hide()
farmbuyer@8 544 s:ClearAllPoints()
farmbuyer@8 545 s:SetParent(nil) -- Blizzard does this too. Huh.
farmbuyer@8 546 end end
farmbuyer@1 547 sidetabs = nil
farmbuyer@15 548 for i,b in ipairs(_d:GetUserData("extra buttons")) do
farmbuyer@15 549 b.obj = nil
farmbuyer@15 550 b:Hide()
farmbuyer@15 551 b:ClearAllPoints()
farmbuyer@15 552 b:SetParent(nil)
farmbuyer@15 553 end
farmbuyer@1 554 AceGUI:Release(_d)
farmbuyer@1 555 end
farmbuyer@1 556 end)
farmbuyer@1 557 need_tabs = true
farmbuyer@1 558 end
farmbuyer@1 559
farmbuyer@1 560 if not self.perms then
farmbuyer@1 561 need_tabs = true
farmbuyer@1 562 self:BuildPerms() -- creates self.perms and self.vault
farmbuyer@1 563 DisownChildren(self.display)
farmbuyer@1 564 -- Could be new rows, fewer rows, changed tickboxes... ugh, trying to
farmbuyer@1 565 -- update the scrolltable is a pain. Throw it out and start over.
farmbuyer@8 566 if sidetabs then for i,s in ipairs(sidetabs) do
farmbuyer@8 567 s:Hide()
farmbuyer@8 568 s:ClearAllPoints()
farmbuyer@8 569 s:SetParent(nil) -- Blizzard does this too. Huh.
farmbuyer@8 570 end end
farmbuyer@15 571 if self.main_sts then for i = 1, #self.main_sts do
farmbuyer@15 572 if self.main_sts[i] and self.main_sts[i].st then
farmbuyer@15 573 self.main_sts[i]:Release()
farmbuyer@15 574 end
farmbuyer@15 575 end end
farmbuyer@1 576 if self.vault_sts then for i = 1, #self.vault_sts do
farmbuyer@1 577 if self.vault_sts[i] and self.vault_sts[i].st then
farmbuyer@1 578 self.vault_sts[i]:Release()
farmbuyer@1 579 end
farmbuyer@1 580 end end
farmbuyer@15 581 self.main_sts = nil
farmbuyer@1 582 self.vault_sts = nil
farmbuyer@1 583 end
farmbuyer@15 584 if not self.main_sts then
farmbuyer@15 585 self:BuildMainSTs (self.perms, self.display.content)
farmbuyer@15 586 for i,st in ipairs(self.main_sts) do
farmbuyer@15 587 self.main_sts[i] = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@15 588 self.main_sts[i].head_offset = 20
farmbuyer@15 589 end
farmbuyer@15 590 self:DoMainST(1)
farmbuyer@1 591
farmbuyer@1 592 self:BuildVaultSTs (self.vault, self.display.content)
farmbuyer@1 593 for i,st in ipairs(self.vault_sts) do
farmbuyer@1 594 self.vault_sts[i] = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@1 595 self.vault_sts[i].head_offset = 20
farmbuyer@1 596 end
farmbuyer@1 597 end
farmbuyer@1 598
farmbuyer@1 599 if need_tabs or incomplete then
farmbuyer@1 600 local maintab = make_sidetab(1, function (this, id)
farmbuyer@15 601 self:DoMainST(self.current_main_st)
farmbuyer@1 602 end)
farmbuyer@1 603 maintab.tooltip = [[Rank permissions]]
farmbuyer@1 604 maintab:SetChecked(true)
farmbuyer@1 605 self:BuildVaultTabs()
farmbuyer@1 606 end
farmbuyer@1 607
farmbuyer@1 608 self.display:Show()
farmbuyer@1 609 return self.display
farmbuyer@1 610 end
farmbuyer@1 611
farmbuyer@1 612 -- vim:noet