annotate main.lua @ 1:17a4945d14eb

Initial functioning checkin.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 14 Jan 2011 00:48:17 +0000
parents
children 78ff21480511
rev   line source
farmbuyer@1 1 local nametag, addon = ...
farmbuyer@1 2
farmbuyer@1 3 addon.defaults = {
farmbuyer@1 4 profile = {
farmbuyer@1 5 enable = true,
farmbuyer@1 6 guildcontrol = true,
farmbuyer@1 7 },
farmbuyer@1 8 }
farmbuyer@1 9
farmbuyer@1 10
farmbuyer@1 11 addon.options = {
farmbuyer@1 12 name = "",
farmbuyer@1 13 type = 'group',
farmbuyer@1 14 childGroups = 'tab',
farmbuyer@1 15 handler = addon, -- functions listed as strings called as addon:func
farmbuyer@1 16 get = "GetOption",
farmbuyer@1 17 set = "SetOption",
farmbuyer@1 18 args = {
farmbuyer@1 19 general = {
farmbuyer@1 20 name = "General",
farmbuyer@1 21 desc = "General options",
farmbuyer@1 22 type = 'group',
farmbuyer@1 23 order = 10,
farmbuyer@1 24 args = {
farmbuyer@1 25 version = {
farmbuyer@1 26 --name = filled in during OnInit
farmbuyer@1 27 type = 'description',
farmbuyer@1 28 fontSize = "large",
farmbuyer@1 29 cmdHidden = true,
farmbuyer@1 30 width = 'full',
farmbuyer@1 31 order = 1,
farmbuyer@1 32 },
farmbuyer@1 33 enable = {
farmbuyer@1 34 name = "Enable",
farmbuyer@1 35 desc = "Use this addon",
farmbuyer@1 36 type = 'toggle',
farmbuyer@1 37 arg = "ToggleEnable",
farmbuyer@1 38 order = 5,
farmbuyer@1 39 },
farmbuyer@1 40 guildcontrol = {
farmbuyer@1 41 name = "Guild Control for non-GMs",
farmbuyer@1 42 desc = [[Make the grayed-out Guild Control button activate this addon instead.]],
farmbuyer@1 43 type = 'toggle',
farmbuyer@1 44 order = 10,
farmbuyer@1 45 },
farmbuyer@1 46 break1 = {
farmbuyer@1 47 name = '',
farmbuyer@1 48 type = 'description',
farmbuyer@1 49 cmdHidden = true,
farmbuyer@1 50 width = 'full',
farmbuyer@1 51 order = 14,
farmbuyer@1 52 },
farmbuyer@1 53 popup = {
farmbuyer@1 54 name = "/wrdw",
farmbuyer@1 55 desc = "Toggle WRDW window",
farmbuyer@1 56 type = 'execute',
farmbuyer@1 57 func = function()
farmbuyer@1 58 InterfaceOptionsFrameCancel:Click()
farmbuyer@1 59 HideUIPanel(GameMenuFrame)
farmbuyer@1 60 addon:BuildWindow()
farmbuyer@1 61 end,
farmbuyer@1 62 order = 15,
farmbuyer@1 63 },
farmbuyer@1 64 },
farmbuyer@1 65 },
farmbuyer@1 66 --profiles = filled in OnInit
farmbuyer@1 67 },
farmbuyer@1 68 }
farmbuyer@1 69
farmbuyer@1 70
farmbuyer@1 71 -----------------------------------------------------------------------------
farmbuyer@1 72 -- other locals
farmbuyer@1 73 local AceGUI = LibStub("AceGUI-3.0")
farmbuyer@1 74 local st_rowheight = 25
farmbuyer@1 75 local st_displayed_rows = 15 --math.floor(366/st_rowheight)
farmbuyer@1 76 local sidetabs
farmbuyer@1 77 local incomplete
farmbuyer@1 78
farmbuyer@1 79 -- Remove children widgets without explicitly Release()'ing them.
farmbuyer@1 80 local function DisownChildren (container)
farmbuyer@1 81 for i,v in ipairs(container.children) do
farmbuyer@1 82 container.children[i] = nil
farmbuyer@1 83 v.frame:Hide()
farmbuyer@1 84 v.frame:ClearAllPoints()
farmbuyer@1 85 end
farmbuyer@1 86 end
farmbuyer@1 87
farmbuyer@1 88
farmbuyer@1 89 -----------------------------------------------------------------------------
farmbuyer@1 90 addon = LibStub("AceAddon-3.0"):NewAddon(addon, nametag,
farmbuyer@1 91 "AceConsole-3.0", "AceEvent-3.0")
farmbuyer@1 92
farmbuyer@1 93 -- Thanks to jerry for the nifty arg idea.
farmbuyer@1 94 function addon:SetOption (info, value)
farmbuyer@1 95 local name = info[#info]
farmbuyer@1 96 self.db.profile[name] = value
farmbuyer@1 97 local arg = info.arg
farmbuyer@1 98 if arg then self[arg](self) end
farmbuyer@1 99 end
farmbuyer@1 100
farmbuyer@1 101 function addon:GetOption (info)
farmbuyer@1 102 local name = info[#info]
farmbuyer@1 103 return self.db.profile[name]
farmbuyer@1 104 end
farmbuyer@1 105
farmbuyer@1 106 function addon:OnInitialize()
farmbuyer@1 107 self.db = LibStub("AceDB-3.0"):New("wrdwDB", self.defaults, --[[Default=]]true)
farmbuyer@1 108
farmbuyer@1 109 local AceDBOptions = LibStub("AceDBOptions-3.0", true)
farmbuyer@1 110 if AceDBOptions then
farmbuyer@1 111 self.options.args.profiles = AceDBOptions:GetOptionsTable(self.db)
farmbuyer@1 112 self.options.args.profiles.order = 200
farmbuyer@1 113 end
farmbuyer@1 114
farmbuyer@1 115 self.options.args.general.args.version.name =
farmbuyer@1 116 "|cff30adffVersion " .. (GetAddOnMetadata(nametag, "Version") or "?") .. "|r"
farmbuyer@1 117 LibStub("AceConfig-3.0"):RegisterOptionsTable(nametag, self.options)
farmbuyer@1 118 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions(nametag, "WhichRankDoesWhat")
farmbuyer@1 119 --self.optionsFrame.okay = function() pattern_editing_safe = false end
farmbuyer@1 120 --self.optionsFrame.refresh = self.optionsFrame.okay
farmbuyer@1 121 --self.optionsFrame.cancel = self.optionsFrame.okay
farmbuyer@1 122
farmbuyer@1 123 self:SetEnabledState(self.db.profile.enable)
farmbuyer@1 124 self.OnInitialize = nil
farmbuyer@1 125 end
farmbuyer@1 126
farmbuyer@1 127
farmbuyer@1 128 function addon:OnEnable()
farmbuyer@1 129 self:RegisterEvent("GUILD_RANKS_UPDATE")
farmbuyer@1 130 self:RegisterChatCommand("wrdw", "OnChatCommand")
farmbuyer@1 131
farmbuyer@1 132 if (not IsGuildLeader()) and self.db.profile.guildcontrol then
farmbuyer@1 133 local function onclick() addon:BuildWindow() end
farmbuyer@1 134 local function onenter(this) GameTooltip_AddNewbieTip(this, GUILDCONTROL, 1.0, 1.0, 1.0, "/wrdw", 1) end
farmbuyer@1 135 GuildFrame_LoadUI()
farmbuyer@1 136 hooksecurefunc("GuildFrame_CheckPermissions", function()
farmbuyer@1 137 GuildControlButton:Enable()
farmbuyer@1 138 GuildControlButton:SetScript("OnClick", onclick)
farmbuyer@1 139 GuildControlButton:SetScript("OnEnter", onenter)
farmbuyer@1 140 end)
farmbuyer@1 141 end
farmbuyer@1 142 end
farmbuyer@1 143
farmbuyer@1 144 function addon:OnDisable()
farmbuyer@1 145 self:Print([[You will need to relog or /reload to fully disable this addon.]])
farmbuyer@1 146 end
farmbuyer@1 147
farmbuyer@1 148 function addon:ToggleEnable()
farmbuyer@1 149 if self.db.profile.enable then
farmbuyer@1 150 self:Enable()
farmbuyer@1 151 else
farmbuyer@1 152 self:Disable()
farmbuyer@1 153 end
farmbuyer@1 154 end
farmbuyer@1 155
farmbuyer@1 156 function addon:OnChatCommand (input)
farmbuyer@1 157 if not input or input:trim() == "" then
farmbuyer@1 158 if self.display and self.display:IsShown() then
farmbuyer@1 159 self.display:Hide()
farmbuyer@1 160 else
farmbuyer@1 161 self:BuildWindow()
farmbuyer@1 162 end
farmbuyer@1 163 else
farmbuyer@1 164 --LibStub("AceConfigCmd-3.0").HandleCommand(self, "wrdw", nametag, input)
farmbuyer@1 165 LibStub("AceConfigDialog-3.0"):Open(nametag)
farmbuyer@1 166 end
farmbuyer@1 167 end
farmbuyer@1 168
farmbuyer@1 169
farmbuyer@1 170 -- Something somewhere has changed, redo the cache
farmbuyer@1 171 function addon:GUILD_RANKS_UPDATE()
farmbuyer@1 172 self.perms = nil
farmbuyer@1 173 if (not incomplete) and self.display and self.display:IsVisible() then
farmbuyer@1 174 self.display:SetStatusText([[|cffff1010Guild flags have changed!|r You must close and reopen this window to display the changes.]])
farmbuyer@1 175 end
farmbuyer@1 176 end
farmbuyer@1 177
farmbuyer@1 178
farmbuyer@1 179 function addon:BuildPerms()
farmbuyer@1 180 assert(UIParentLoadAddOn("Blizzard_GuildControlUI"))
farmbuyer@1 181 local check = "|TInterface\\Buttons\\UI-CheckBox-Check:"..(st_rowheight-2).."|t"
farmbuyer@1 182
farmbuyer@1 183 -- http://www.wowace.com/addons/lib-st/pages/set-data/minimal-dataset-format/
farmbuyer@1 184 local p,v = {}, {}
farmbuyer@1 185 for r = 1, GuildControlGetNumRanks() do
farmbuyer@1 186 GuildControlSetRank(r)
farmbuyer@1 187
farmbuyer@1 188 -- permissions
farmbuyer@1 189 local flags = { GuildControlGetRankFlags() }
farmbuyer@1 190 local row = { GuildControlGetRankName(r) }
farmbuyer@1 191 for c = 1, NUM_RANK_FLAGS do if c ~= 14 then
farmbuyer@1 192 local newcol = #row + 1
farmbuyer@1 193 if c == 15 or c == 16 then
farmbuyer@1 194 local val = GetGuildBankWithdrawGoldLimit()
farmbuyer@1 195 row[newcol] = flags[c] and ((val == -1) and check or val) or ""
farmbuyer@1 196 else
farmbuyer@1 197 row[newcol] = flags[c] and check or ""
farmbuyer@1 198 end
farmbuyer@1 199 end end
farmbuyer@1 200 p[r] = row
farmbuyer@1 201
farmbuyer@1 202 -- guild vault
farmbuyer@1 203 local banktabs = {}
farmbuyer@1 204 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 205 -- isViewable, canDeposit, editText, numWithdrawals
farmbuyer@1 206 banktabs[t] = { row[1], GetGuildBankTabPermissions(t) }
farmbuyer@1 207 banktabs[t][2] = banktabs[t][2] and check or ""
farmbuyer@1 208 banktabs[t][3] = banktabs[t][3] and check or ""
farmbuyer@1 209 banktabs[t][4] = banktabs[t][4] and check or ""
farmbuyer@1 210 local withdraw = banktabs[t][5]
farmbuyer@1 211 banktabs[t][5] = (withdraw == -1) and check or (withdraw == 0) and "" or withdraw
farmbuyer@1 212 end
farmbuyer@1 213 v[r] = banktabs
farmbuyer@1 214 end
farmbuyer@1 215 self.perms = p
farmbuyer@1 216 -- This one needs to be turned inside-out to match the data requirements
farmbuyer@1 217 self.vault = {}
farmbuyer@1 218 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 219 self.vault[t] = {}
farmbuyer@1 220 for r = 1, #v do
farmbuyer@1 221 self.vault[t][r] = v[r][t]
farmbuyer@1 222 end
farmbuyer@1 223 end
farmbuyer@1 224 end
farmbuyer@1 225
farmbuyer@1 226
farmbuyer@1 227 local function setstatus(txt) addon.display:SetStatusText(txt) end
farmbuyer@1 228
farmbuyer@1 229 local make_sidetab
farmbuyer@1 230 do
farmbuyer@1 231 local lastclicked
farmbuyer@1 232 local function OnClick (thistab)
farmbuyer@1 233 if thistab == lastclicked then return end
farmbuyer@1 234 for i = 1, #sidetabs do
farmbuyer@1 235 sidetabs[i]:SetChecked(false)
farmbuyer@1 236 end
farmbuyer@1 237 thistab:SetChecked(true) -- should be redundant, but just in case
farmbuyer@1 238 lastclicked = thistab
farmbuyer@1 239 if thistab.callback then
farmbuyer@1 240 thistab:callback(thistab:GetID())
farmbuyer@1 241 end
farmbuyer@1 242 end
farmbuyer@1 243
farmbuyer@1 244 -- Some magic numbers here wrt the index
farmbuyer@1 245 function make_sidetab (index, callback)
farmbuyer@1 246 if not sidetabs then
farmbuyer@1 247 sidetabs = {}
farmbuyer@1 248 end
farmbuyer@1 249
farmbuyer@1 250 local tab = CreateFrame("CheckButton", "WRDWTab"..index, addon.display.frame, "SpellBookSkillLineTabTemplate", index)
farmbuyer@1 251 if index > 1 then
farmbuyer@1 252 tab:SetPoint("TOPLEFT", sidetabs[index-1], "BOTTOMLEFT", 0, -17)
farmbuyer@1 253 else
farmbuyer@1 254 tab:SetNormalTexture("Interface\\SpellBook\\GuildSpellbooktabBG")
farmbuyer@1 255 tab.TabardEmblem:Show()
farmbuyer@1 256 tab.TabardIconFrame:Show()
farmbuyer@1 257 SetLargeGuildTabardTextures("player", tab.TabardEmblem, tab:GetNormalTexture(), tab.TabardIconFrame)
farmbuyer@1 258 tab:SetPoint("TOPLEFT", addon.display.frame, "TOPRIGHT", 0, -17)
farmbuyer@1 259 end
farmbuyer@1 260 tab:SetScript("OnClick", OnClick)
farmbuyer@1 261 --tab:SetChecked(false) -- is default
farmbuyer@1 262 tab:Show()
farmbuyer@1 263 tab.callback = callback
farmbuyer@1 264 sidetabs[index] = tab
farmbuyer@1 265 return tab
farmbuyer@1 266 end
farmbuyer@1 267
farmbuyer@1 268 function addon:BuildVaultTabs()
farmbuyer@1 269 incomplete = nil
farmbuyer@1 270 local offset = 1 -- number of tabs already made
farmbuyer@1 271 local function pick_a_tab (tab, id)
farmbuyer@1 272 DisownChildren(self.display)
farmbuyer@1 273 self.display:AddChild(self.vault_sts[id-offset])
farmbuyer@1 274 end
farmbuyer@1 275 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 276 local name, icon = GetGuildBankTabInfo(t)
farmbuyer@1 277 incomplete = incomplete or icon == [[Interface\Icons\INV_Misc_QuestionMark]]
farmbuyer@1 278 local tab = make_sidetab(t+offset, pick_a_tab)
farmbuyer@1 279 tab:SetNormalTexture(icon)
farmbuyer@1 280 tab.tooltip = name
farmbuyer@1 281 end
farmbuyer@1 282 if incomplete then
farmbuyer@1 283 setstatus[[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 284 end
farmbuyer@1 285 end
farmbuyer@1 286 end
farmbuyer@1 287
farmbuyer@1 288
farmbuyer@1 289 local function st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 290 if (row == nil) or (realrow == nil) then -- mouseover column header
farmbuyer@1 291 setstatus(cellFrame:GetText():gsub('\n',' '))
farmbuyer@1 292 return true
farmbuyer@1 293 end
farmbuyer@1 294 return false -- continue with default highlighting behavior
farmbuyer@1 295 end
farmbuyer@1 296 local function st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 297 setstatus("")
farmbuyer@1 298 return false -- continue with default un-highlighting behavior
farmbuyer@1 299 end
farmbuyer@1 300 local function st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 301 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
farmbuyer@1 302 -- more here?
farmbuyer@1 303 return true -- do not do anything further
farmbuyer@1 304 end
farmbuyer@1 305
farmbuyer@1 306
farmbuyer@1 307 function addon:BuildMainST (permissions, parent_frame)
farmbuyer@1 308 -- if this language uses a trailing colon, strip it
farmbuyer@1 309 local tmp = GUILDCONTROL_RANKLABEL:gsub(":$","")
farmbuyer@1 310 local cols = {{
farmbuyer@1 311 name = tmp,
farmbuyer@1 312 width = 10 * #tmp,
farmbuyer@1 313 }}
farmbuyer@1 314 for i = 1, NUM_RANK_FLAGS do if i ~= 14 then
farmbuyer@1 315 table.insert(cols,{
farmbuyer@1 316 name = _G['GUILDCONTROL_OPTION'..i],
farmbuyer@1 317 width = 62,
farmbuyer@1 318 })
farmbuyer@1 319 end end
farmbuyer@1 320
farmbuyer@1 321 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
farmbuyer@1 322 ST:Hide()
farmbuyer@1 323
farmbuyer@1 324 ST:SetData(permissions, --[[minimal format=]]true)
farmbuyer@1 325 ST:RegisterEvents{
farmbuyer@1 326 OnEnter = st_OnEnter,
farmbuyer@1 327 OnLeave = st_OnLeave,
farmbuyer@1 328 OnClick = st_OnClick,
farmbuyer@1 329 OnDoubleClick = st_OnClick,
farmbuyer@1 330 }
farmbuyer@1 331
farmbuyer@1 332 return ST
farmbuyer@1 333 end
farmbuyer@1 334
farmbuyer@1 335 function addon:BuildVaultSTs (permissions, parent_frame)
farmbuyer@1 336 self.vault_sts = {}
farmbuyer@1 337 local cols = {
farmbuyer@1 338 self.main_st.st.cols[1],
farmbuyer@1 339 { name = GUILDCONTROL_VIEW_TAB, width = 80 },
farmbuyer@1 340 { name = GUILDCONTROL_DEPOSIT_ITEMS, width = 80 },
farmbuyer@1 341 { name = GUILDCONTROL_UPDATE_TEXT, width = 80 },
farmbuyer@1 342 { name = GUILDCONTROL_WITHDRAW_ITEMS, width = 150 },
farmbuyer@1 343 }
farmbuyer@1 344
farmbuyer@1 345 for tab = 1, #permissions do
farmbuyer@1 346 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
farmbuyer@1 347 ST:Hide()
farmbuyer@1 348 ST:SetData(permissions[tab], --[[minimal format=]]true)
farmbuyer@1 349 ST:RegisterEvents{
farmbuyer@1 350 OnEnter = st_OnEnter,
farmbuyer@1 351 OnLeave = st_OnLeave,
farmbuyer@1 352 OnClick = st_OnClick,
farmbuyer@1 353 OnDoubleClick = st_OnClick,
farmbuyer@1 354 }
farmbuyer@1 355 self.vault_sts[tab] = ST
farmbuyer@1 356 end
farmbuyer@1 357 end
farmbuyer@1 358
farmbuyer@1 359
farmbuyer@1 360 function addon:BuildWindow()
farmbuyer@1 361 local need_tabs
farmbuyer@1 362 if self.display then
farmbuyer@1 363 self.display:Hide()
farmbuyer@1 364 else
farmbuyer@1 365 self.display = AceGUI:Create("Frame")
farmbuyer@1 366 self.display:SetTitle("Which Rank Does What")
farmbuyer@1 367 self.display:SetLayout("Fill")
farmbuyer@1 368 self.display:SetStatusTable{
farmbuyer@1 369 width = 1225,
farmbuyer@1 370 height = 500,
farmbuyer@1 371 }
farmbuyer@1 372 self.display:ApplyStatus()
farmbuyer@1 373 self.display:SetCallback("OnClose", function(_d)
farmbuyer@1 374 if incomplete or (not self.perms) then
farmbuyer@1 375 -- stuff changed while open
farmbuyer@1 376 self.perms = nil
farmbuyer@1 377 self.display = nil
farmbuyer@1 378 sidetabs = nil
farmbuyer@1 379 AceGUI:Release(_d)
farmbuyer@1 380 end
farmbuyer@1 381 end)
farmbuyer@1 382 if self.display.EnableResize then
farmbuyer@1 383 self.display:EnableResize(false)
farmbuyer@1 384 end
farmbuyer@1 385 need_tabs = true
farmbuyer@1 386 end
farmbuyer@1 387
farmbuyer@1 388 if not self.perms then
farmbuyer@1 389 need_tabs = true
farmbuyer@1 390 self:BuildPerms() -- creates self.perms and self.vault
farmbuyer@1 391 DisownChildren(self.display)
farmbuyer@1 392 -- Could be new rows, fewer rows, changed tickboxes... ugh, trying to
farmbuyer@1 393 -- update the scrolltable is a pain. Throw it out and start over.
farmbuyer@1 394 if self.main_st and self.main_st.st then
farmbuyer@1 395 self.main_st:Release()
farmbuyer@1 396 end
farmbuyer@1 397 if self.vault_sts then for i = 1, #self.vault_sts do
farmbuyer@1 398 if self.vault_sts[i] and self.vault_sts[i].st then
farmbuyer@1 399 self.vault_sts[i]:Release()
farmbuyer@1 400 end
farmbuyer@1 401 end end
farmbuyer@1 402 self.main_st = nil
farmbuyer@1 403 self.vault_sts = nil
farmbuyer@1 404 end
farmbuyer@1 405 if not self.main_st then
farmbuyer@1 406 local st = self:BuildMainST (self.perms, self.display.content)
farmbuyer@1 407 self.main_st = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@1 408 self.main_st.head_offset = 20
farmbuyer@1 409 --st_widget.tail_offset = 5
farmbuyer@1 410 self.display:AddChild(self.main_st)
farmbuyer@1 411
farmbuyer@1 412 self:BuildVaultSTs (self.vault, self.display.content)
farmbuyer@1 413 for i,st in ipairs(self.vault_sts) do
farmbuyer@1 414 self.vault_sts[i] = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@1 415 self.vault_sts[i].head_offset = 20
farmbuyer@1 416 end
farmbuyer@1 417 end
farmbuyer@1 418
farmbuyer@1 419 if need_tabs or incomplete then
farmbuyer@1 420 local maintab = make_sidetab(1, function (this, id)
farmbuyer@1 421 DisownChildren(self.display)
farmbuyer@1 422 self.display:AddChild(self.main_st)
farmbuyer@1 423 end)
farmbuyer@1 424 maintab.tooltip = [[Rank permissions]]
farmbuyer@1 425 maintab:SetChecked(true)
farmbuyer@1 426 self:BuildVaultTabs()
farmbuyer@1 427 end
farmbuyer@1 428
farmbuyer@1 429 self.display:Show()
farmbuyer@1 430 return self.display
farmbuyer@1 431 end
farmbuyer@1 432
farmbuyer@1 433 -- vim:noet