TradeSkillMaster/Core/UI/Util/Contacts.lua

164 lines
5.0 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Contacts = TSM.UI.Util:NewPackage("Contacts")
local L = TSM.Include("Locale").GetTable()
local String = TSM.Include("Util.String")
local UIElements = TSM.Include("UI.UIElements")
local private = {
listElements = {},
}
local PLAYER_NAME = UnitName("player")
local PLAYER_NAME_REALM = gsub(PLAYER_NAME.."-"..GetRealmName(), "%s+", "")
local LIST_ENTRIES = {L["Recent"], L["Alts"], L["Friends"], L["Guild"]}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Contacts.ShowDialog(button, input, callback)
input:SetFocused(false)
:Draw()
button:GetBaseElement():ShowDialogFrame(UIElements.New("Frame", "frame")
:SetLayout("VERTICAL")
:SetSize(152, 90)
:AddAnchor("TOP", button:_GetBaseFrame(), "BOTTOM", 0, -6)
:SetBackgroundColor("FRAME_BG", true)
:SetBorderColor("ACTIVE_BG")
:SetContext(input)
:AddChild(UIElements.New("ViewContainer", "contacts")
:SetNavCallback(private.GetContactsContentFrame)
:SetContext(callback)
:AddPath("menu", true)
:AddPath("list")
)
)
end
-- ============================================================================
-- Local Script Handlers
-- ============================================================================
function private.GetContactsContentFrame(viewContainer, path)
if path == "menu" then
return private.GetContactsMenuFrame()
elseif path == "list" then
return private.GetContactListFrame()
else
error("Unexpected path: "..tostring(path))
end
end
function private.GetContactsMenuFrame()
return UIElements.New("Frame", "frame")
:SetLayout("VERTICAL")
:SetPadding(1, 1, 5, 5)
:AddChild(UIElements.New("SelectionList", "list")
:SetBackgroundColor("FRAME_BG")
:SetEntries(LIST_ENTRIES)
:SetScript("OnEntrySelected", private.MenuOnEntrySelected)
)
end
function private.GetContactListFrame()
return UIElements.New("Frame", "frame")
:SetLayout("VERTICAL")
:SetPadding(1, 1, 5, 5)
:AddChild(UIElements.New("Button", "back")
:SetHeight(20)
:SetMargin(8, 0, 0, 0)
:SetFont("BODY_BODY2_BOLD")
:SetJustifyH("LEFT")
:SetText(L["Back"])
:SetScript("OnClick", private.ListBackButtonOnClick)
)
:AddChild(UIElements.New("SelectionList", "list")
:SetBackgroundColor("FRAME_BG")
:SetEntries(private.listElements)
:SetScript("OnEntrySelected", private.ListOnEntrySelected)
)
end
function private.MenuOnEntrySelected(list, name)
private.GenerateListElements(name)
list:GetElement("__parent.__parent.__parent")
:SetHeight(min((#private.listElements + 1) * 20 + 10, 130))
:Draw()
list:GetElement("__parent.__parent")
:SetPath("list", true)
end
function private.ListBackButtonOnClick(button)
button:GetElement("__parent.__parent.__parent")
:SetHeight(90)
:Draw()
button:GetElement("__parent.__parent")
:SetPath("menu", true)
end
function private.ListOnEntrySelected(list, name)
local callback = list:GetElement("__parent.__parent"):GetContext()
local input = list:GetElement("__parent.__parent.__parent"):GetContext()
input:SetValue(name)
:Draw()
if callback then
callback(input)
end
list:GetBaseElement():HideDialog()
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.GenerateListElements(category)
wipe(private.listElements)
if category == L["Recent"] then
for k in pairs(TSM.db.global.mailingOptions.recentlyMailedList) do
local character = Ambiguate(k, "none")
tinsert(private.listElements, character)
end
elseif category == L["Alts"] then
for factionrealm in TSM.db:GetConnectedRealmIterator("realm") do
for _, character in TSM.db:FactionrealmCharacterIterator(factionrealm) do
character = Ambiguate(gsub(strmatch(character, "(.*) "..String.Escape("-")).."-"..gsub(factionrealm, String.Escape("-"), ""), " ", ""), "none")
if character ~= UnitName("player") then
tinsert(private.listElements, character)
end
end
end
elseif category == L["Friends"] then
for i = 1, C_FriendList.GetNumFriends() do
local info = C_FriendList.GetFriendInfoByIndex(i)
if info.name ~= PLAYER_NAME_REALM then
local character = Ambiguate(info.name, "none")
tinsert(private.listElements, character)
end
end
elseif category == L["Guild"] then
for i = 1, GetNumGuildMembers() do
local name = GetGuildRosterInfo(i)
if name ~= PLAYER_NAME_REALM then
local character = Ambiguate(name, "none")
tinsert(private.listElements, character)
end
end
end
sort(private.listElements)
end