164 lines
5.0 KiB
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
|