diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.lua	Fri Jan 14 00:48:17 2011 +0000
@@ -0,0 +1,433 @@
+local nametag, addon = ...
+
+addon.defaults = {
+	profile = {
+		enable = true,
+		guildcontrol = true,
+	},
+}
+
+
+addon.options = {
+	name = "",
+	type = 'group',
+	childGroups = 'tab',
+	handler = addon,    -- functions listed as strings called as addon:func
+	get = "GetOption",
+	set = "SetOption",
+	args = {
+		general = {
+			name = "General",
+			desc = "General options",
+			type = 'group',
+			order = 10,
+			args = {
+				version = {
+					--name = filled in during OnInit
+					type = 'description',
+					fontSize = "large",
+					cmdHidden = true,
+					width = 'full',
+					order = 1,
+				},
+				enable = {
+					name = "Enable",
+					desc = "Use this addon",
+					type = 'toggle',
+					arg  = "ToggleEnable",
+					order = 5,
+				},
+				guildcontrol = {
+					name = "Guild Control for non-GMs",
+					desc = [[Make the grayed-out Guild Control button activate this addon instead.]],
+					type = 'toggle',
+					order = 10,
+				},
+				break1 = {
+					name = '',
+					type = 'description',
+					cmdHidden = true,
+					width = 'full',
+					order = 14,
+				},
+				popup = {
+					name = "/wrdw",
+					desc = "Toggle WRDW window",
+					type = 'execute',
+					func = function()
+						InterfaceOptionsFrameCancel:Click()
+						HideUIPanel(GameMenuFrame)
+						addon:BuildWindow()
+					end,
+					order = 15,
+				},
+			},
+		},
+		--profiles =   filled in OnInit
+	},
+}
+
+
+-----------------------------------------------------------------------------
+-- other locals
+local AceGUI = LibStub("AceGUI-3.0")
+local st_rowheight         = 25
+local st_displayed_rows    = 15 --math.floor(366/st_rowheight)
+local sidetabs
+local incomplete
+
+-- Remove children widgets without explicitly Release()'ing them.
+local function DisownChildren (container)
+	for i,v in ipairs(container.children) do
+		container.children[i] = nil
+		v.frame:Hide()
+		v.frame:ClearAllPoints()
+	end
+end
+
+
+-----------------------------------------------------------------------------
+addon = LibStub("AceAddon-3.0"):NewAddon(addon, nametag,
+		        "AceConsole-3.0", "AceEvent-3.0")
+
+-- Thanks to jerry for the nifty arg idea.
+function addon:SetOption (info, value)
+	local name = info[#info]
+	self.db.profile[name] = value
+	local arg = info.arg
+	if arg then self[arg](self) end
+end
+
+function addon:GetOption (info)
+	local name = info[#info]
+	return self.db.profile[name]
+end
+
+function addon:OnInitialize()
+	self.db = LibStub("AceDB-3.0"):New("wrdwDB", self.defaults, --[[Default=]]true)
+
+	local AceDBOptions = LibStub("AceDBOptions-3.0", true)
+	if AceDBOptions then
+		self.options.args.profiles = AceDBOptions:GetOptionsTable(self.db)
+		self.options.args.profiles.order = 200
+	end
+
+	self.options.args.general.args.version.name =
+		"|cff30adffVersion " .. (GetAddOnMetadata(nametag, "Version") or "?") .. "|r"
+	LibStub("AceConfig-3.0"):RegisterOptionsTable(nametag, self.options)
+	self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions(nametag, "WhichRankDoesWhat")
+	--self.optionsFrame.okay = function() pattern_editing_safe = false end
+	--self.optionsFrame.refresh = self.optionsFrame.okay
+	--self.optionsFrame.cancel = self.optionsFrame.okay
+
+	self:SetEnabledState(self.db.profile.enable)
+	self.OnInitialize = nil
+end
+
+
+function addon:OnEnable()
+	self:RegisterEvent("GUILD_RANKS_UPDATE")
+	self:RegisterChatCommand("wrdw", "OnChatCommand")
+
+	if (not IsGuildLeader()) and self.db.profile.guildcontrol then
+		local function onclick() addon:BuildWindow() end
+		local function onenter(this) GameTooltip_AddNewbieTip(this, GUILDCONTROL, 1.0, 1.0, 1.0, "/wrdw", 1) end
+		GuildFrame_LoadUI()
+		hooksecurefunc("GuildFrame_CheckPermissions", function()
+			GuildControlButton:Enable()
+			GuildControlButton:SetScript("OnClick", onclick)
+			GuildControlButton:SetScript("OnEnter", onenter)
+		end)
+	end
+end
+
+function addon:OnDisable()
+	self:Print([[You will need to relog or /reload to fully disable this addon.]])
+end
+
+function addon:ToggleEnable()
+	if self.db.profile.enable then
+		self:Enable()
+	else
+		self:Disable()
+	end
+end
+
+function addon:OnChatCommand (input)
+	if not input or input:trim() == "" then
+		if self.display and self.display:IsShown() then
+			self.display:Hide()
+		else
+			self:BuildWindow()
+		end
+	else
+		--LibStub("AceConfigCmd-3.0").HandleCommand(self, "wrdw", nametag, input)
+		LibStub("AceConfigDialog-3.0"):Open(nametag)
+	end
+end
+
+
+-- Something somewhere has changed, redo the cache
+function addon:GUILD_RANKS_UPDATE()
+	self.perms = nil
+	if (not incomplete) and self.display and self.display:IsVisible() then
+		self.display:SetStatusText([[|cffff1010Guild flags have changed!|r  You must close and reopen this window to display the changes.]])
+	end
+end
+
+
+function addon:BuildPerms()
+	assert(UIParentLoadAddOn("Blizzard_GuildControlUI"))
+	local check = "|TInterface\\Buttons\\UI-CheckBox-Check:"..(st_rowheight-2).."|t"
+
+	-- http://www.wowace.com/addons/lib-st/pages/set-data/minimal-dataset-format/
+	local p,v = {}, {}
+	for r = 1, GuildControlGetNumRanks() do
+		GuildControlSetRank(r)
+
+		-- permissions
+		local flags = { GuildControlGetRankFlags() }
+		local row = { GuildControlGetRankName(r) }
+		for c = 1, NUM_RANK_FLAGS do if c ~= 14 then
+			local newcol = #row + 1
+			if c == 15 or c == 16 then
+				local val = GetGuildBankWithdrawGoldLimit()
+				row[newcol] = flags[c] and ((val == -1) and check or val) or ""
+			else
+				row[newcol] = flags[c] and check or ""
+			end
+		end end
+		p[r] = row
+
+		-- guild vault
+		local banktabs = {}
+		for t = 1, GetNumGuildBankTabs() do
+			-- isViewable, canDeposit, editText, numWithdrawals 
+			banktabs[t] = { row[1], GetGuildBankTabPermissions(t) }
+			banktabs[t][2] = banktabs[t][2] and check or ""
+			banktabs[t][3] = banktabs[t][3] and check or ""
+			banktabs[t][4] = banktabs[t][4] and check or ""
+			local withdraw = banktabs[t][5]
+			banktabs[t][5] = (withdraw == -1) and check or (withdraw == 0) and "" or withdraw
+		end
+		v[r] = banktabs
+	end
+	self.perms = p
+	-- This one needs to be turned inside-out to match the data requirements
+	self.vault = {}
+	for t = 1, GetNumGuildBankTabs() do
+		self.vault[t] = {}
+		for r = 1, #v do
+			self.vault[t][r] = v[r][t]
+		end
+	end
+end
+
+
+local function setstatus(txt)  addon.display:SetStatusText(txt)  end
+
+local make_sidetab
+do
+	local lastclicked
+	local function OnClick (thistab)
+		if thistab == lastclicked then return end
+		for i = 1, #sidetabs do
+			sidetabs[i]:SetChecked(false)
+		end
+		thistab:SetChecked(true)  -- should be redundant, but just in case
+		lastclicked = thistab
+		if thistab.callback then
+			thistab:callback(thistab:GetID())
+		end
+	end
+
+	-- Some magic numbers here wrt the index
+	function make_sidetab (index, callback)
+		if not sidetabs then
+			sidetabs = {}
+		end
+
+		local tab = CreateFrame("CheckButton", "WRDWTab"..index, addon.display.frame, "SpellBookSkillLineTabTemplate", index)
+		if index > 1 then
+			tab:SetPoint("TOPLEFT", sidetabs[index-1], "BOTTOMLEFT", 0, -17)
+		else
+			tab:SetNormalTexture("Interface\\SpellBook\\GuildSpellbooktabBG")
+			tab.TabardEmblem:Show()
+			tab.TabardIconFrame:Show()
+			SetLargeGuildTabardTextures("player", tab.TabardEmblem, tab:GetNormalTexture(), tab.TabardIconFrame)
+			tab:SetPoint("TOPLEFT", addon.display.frame, "TOPRIGHT", 0, -17)
+		end
+		tab:SetScript("OnClick", OnClick)
+		--tab:SetChecked(false)  -- is default
+		tab:Show()
+		tab.callback = callback
+		sidetabs[index] = tab
+		return tab
+	end
+
+	function addon:BuildVaultTabs()
+		incomplete = nil
+		local offset = 1   -- number of tabs already made
+		local function pick_a_tab (tab, id)
+			DisownChildren(self.display)
+			self.display:AddChild(self.vault_sts[id-offset])
+		end
+		for t = 1, GetNumGuildBankTabs() do
+			local name, icon = GetGuildBankTabInfo(t)
+			incomplete = incomplete or icon == [[Interface\Icons\INV_Misc_QuestionMark]]
+			local tab = make_sidetab(t+offset, pick_a_tab)
+			tab:SetNormalTexture(icon)
+			tab.tooltip = name
+		end
+		if incomplete then
+			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.]]
+		end
+	end
+end
+
+
+local function st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
+	if (row == nil) or (realrow == nil) then -- mouseover column header
+		setstatus(cellFrame:GetText():gsub('\n',' '))
+		return true
+	end
+	return false  -- continue with default highlighting behavior
+end
+local function st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
+	setstatus("")
+	return false  -- continue with default un-highlighting behavior
+end
+local function st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
+	if (row == nil) or (realrow == nil) then return true end  -- click column header, suppress reordering
+	-- more here?
+	return true  -- do not do anything further
+end
+
+
+function addon:BuildMainST (permissions, parent_frame)
+	-- if this language uses a trailing colon, strip it
+	local tmp = GUILDCONTROL_RANKLABEL:gsub(":$","")
+	local cols = {{
+		name = tmp,
+		width = 10 * #tmp,
+	}}
+	for i = 1, NUM_RANK_FLAGS do if i ~= 14 then
+		table.insert(cols,{
+			name = _G['GUILDCONTROL_OPTION'..i],
+			width = 62,
+		})
+	end end
+
+	local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
+	ST:Hide()
+
+	ST:SetData(permissions, --[[minimal format=]]true)
+	ST:RegisterEvents{
+		OnEnter = st_OnEnter,
+		OnLeave = st_OnLeave,
+		OnClick = st_OnClick,
+		OnDoubleClick = st_OnClick,
+	}
+
+	return ST
+end
+
+function addon:BuildVaultSTs (permissions, parent_frame)
+	self.vault_sts = {}
+	local cols = {
+		self.main_st.st.cols[1],
+		{ name = GUILDCONTROL_VIEW_TAB, width = 80 },
+		{ name = GUILDCONTROL_DEPOSIT_ITEMS, width = 80 },
+		{ name = GUILDCONTROL_UPDATE_TEXT, width = 80 },
+		{ name = GUILDCONTROL_WITHDRAW_ITEMS, width = 150 },
+	}
+
+	for tab = 1, #permissions do
+ 		local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
+		ST:Hide()
+		ST:SetData(permissions[tab], --[[minimal format=]]true)
+		ST:RegisterEvents{
+			OnEnter = st_OnEnter,
+			OnLeave = st_OnLeave,
+			OnClick = st_OnClick,
+			OnDoubleClick = st_OnClick,
+		}
+		self.vault_sts[tab] = ST
+	end
+end
+
+
+function addon:BuildWindow()
+	local need_tabs
+	if self.display then
+		self.display:Hide()
+	else
+		self.display = AceGUI:Create("Frame")
+		self.display:SetTitle("Which Rank Does What")
+		self.display:SetLayout("Fill")
+		self.display:SetStatusTable{
+			width = 1225,
+			height = 500,
+		}
+		self.display:ApplyStatus()
+		self.display:SetCallback("OnClose", function(_d)
+			if incomplete or (not self.perms) then
+				-- stuff changed while open
+				self.perms = nil
+				self.display = nil
+				sidetabs = nil
+				AceGUI:Release(_d)
+			end
+		end)
+		if self.display.EnableResize then
+			self.display:EnableResize(false)
+		end
+		need_tabs = true
+	end
+
+	if not self.perms then
+		need_tabs = true
+		self:BuildPerms()  -- creates self.perms and self.vault
+		DisownChildren(self.display)
+		-- Could be new rows, fewer rows, changed tickboxes... ugh, trying to
+		-- update the scrolltable is a pain.  Throw it out and start over.
+		if self.main_st and self.main_st.st then
+			self.main_st:Release()
+		end
+		if self.vault_sts then for i = 1, #self.vault_sts do
+			if self.vault_sts[i] and self.vault_sts[i].st then
+				self.vault_sts[i]:Release()
+			end
+		end end
+		self.main_st = nil
+		self.vault_sts = nil
+	end
+	if not self.main_st then
+		local st = self:BuildMainST (self.perms, self.display.content)
+		self.main_st = AceGUI:Create("lib-st"):WrapST(st)
+		self.main_st.head_offset = 20
+		--st_widget.tail_offset = 5
+		self.display:AddChild(self.main_st)
+
+		self:BuildVaultSTs (self.vault, self.display.content)
+		for i,st in ipairs(self.vault_sts) do
+			self.vault_sts[i] = AceGUI:Create("lib-st"):WrapST(st)
+			self.vault_sts[i].head_offset = 20
+		end
+	end
+
+	if need_tabs or incomplete then
+		local maintab = make_sidetab(1, function (this, id)
+			DisownChildren(self.display)
+			self.display:AddChild(self.main_st)
+		end)
+		maintab.tooltip = [[Rank permissions]]
+		maintab:SetChecked(true)
+		self:BuildVaultTabs()
+	end
+
+	self.display:Show()
+	return self.display
+end
+
+-- vim:noet