|
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
|