355 lines
11 KiB
Lua
355 lines
11 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local Gathering = TSM.UI.CraftingUI:NewPackage("Gathering")
|
|
local L = TSM.Include("Locale").GetTable()
|
|
local TempTable = TSM.Include("Util.TempTable")
|
|
local Table = TSM.Include("Util.Table")
|
|
local ItemInfo = TSM.Include("Service.ItemInfo")
|
|
local Settings = TSM.Include("Service.Settings")
|
|
local UIElements = TSM.Include("UI.UIElements")
|
|
local private = {
|
|
settings = nil,
|
|
frame = nil,
|
|
query = nil,
|
|
}
|
|
local SOURCE_LIST = {
|
|
"vendor",
|
|
"guildBank",
|
|
"alt",
|
|
"altGuildBank",
|
|
"craftProfit",
|
|
"craftNoProfit",
|
|
"auction",
|
|
"auctionDE",
|
|
"auctionCrafting"
|
|
}
|
|
local SOURCE_TEXT_LIST = {
|
|
L["Vendor"],
|
|
L["Guild Bank"],
|
|
L["Alts"],
|
|
L["Alt Guild Bank"],
|
|
L["Craft (Profitable)"],
|
|
L["Craft (Unprofitable)"],
|
|
L["AH"],
|
|
L["AH (Disenchanting)"],
|
|
L["AH (Crafting)"],
|
|
}
|
|
if TSM.IsWowClassic() then
|
|
Table.RemoveByValue(SOURCE_LIST, "guildBank")
|
|
Table.RemoveByValue(SOURCE_LIST, "altGuildBank")
|
|
Table.RemoveByValue(SOURCE_TEXT_LIST, L["Guild Bank"])
|
|
Table.RemoveByValue(SOURCE_TEXT_LIST, L["Alt Guild Bank"])
|
|
end
|
|
assert(#SOURCE_LIST == #SOURCE_TEXT_LIST)
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function Gathering.OnInitialize()
|
|
private.settings = Settings.NewView()
|
|
:AddKey("global", "craftingUIContext", "gatheringDividedContainer")
|
|
:AddKey("global", "craftingUIContext", "gatheringScrollingTable")
|
|
:AddKey("profile", "gatheringOptions", "sources")
|
|
TSM.UI.CraftingUI.RegisterTopLevelPage(L["Gathering"], private.GetGatheringFrame)
|
|
TSM.Crafting.Gathering.SetContextChangedCallback(private.ContextChangedCallback)
|
|
TSM.UI.TaskListUI.RegisterUpdateCallback(private.UpdateButtonState)
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Gathering UI
|
|
-- ============================================================================
|
|
|
|
function private.GetGatheringFrame()
|
|
TSM.UI.AnalyticsRecordPathChange("crafting", "gathering")
|
|
assert(not private.query)
|
|
private.query = TSM.Crafting.Gathering.CreateQuery()
|
|
:SetUpdateCallback(private.UpdateButtonState)
|
|
local frame = UIElements.New("DividedContainer", "gathering")
|
|
:SetMinWidth(284, 200)
|
|
:SetBackgroundColor("PRIMARY_BG")
|
|
:SetSettingsContext(private.settings, "gatheringDividedContainer")
|
|
:SetLeftChild(UIElements.New("ScrollFrame", "setup")
|
|
:SetPadding(12)
|
|
:SetBackgroundColor("PRIMARY_BG_ALT")
|
|
:AddChild(UIElements.New("Text", "title")
|
|
:SetHeight(20)
|
|
:SetMargin(0, 0, 0, 8)
|
|
:SetFont("BODY_BODY1_BOLD")
|
|
:SetText(L["Gathering Setup"])
|
|
)
|
|
:AddChild(UIElements.New("Text", "crafterDropdownLabel")
|
|
:SetHeight(20)
|
|
:SetMargin(0, 0, 0, 2)
|
|
:SetFont("BODY_BODY3_MEDIUM")
|
|
:SetTextColor("INDICATOR")
|
|
:SetText(L["Crafter"])
|
|
)
|
|
:AddChild(UIElements.New("SelectionDropdown", "crafterDropdown")
|
|
:SetHeight(24)
|
|
:SetMargin(0, 0, 0, 8)
|
|
:SetHintText(L["Select crafter"])
|
|
:SetScript("OnSelectionChanged", private.CrafterDropdownOnSelectionChanged)
|
|
)
|
|
:AddChild(UIElements.New("Text", "professionDropdownLabel")
|
|
:SetHeight(20)
|
|
:SetMargin(0, 0, 0, 2)
|
|
:SetFont("BODY_BODY3_MEDIUM")
|
|
:SetTextColor("INDICATOR")
|
|
:SetText(L["Profession"])
|
|
)
|
|
:AddChild(UIElements.New("MultiselectionDropdown", "professionDropdown")
|
|
:SetHeight(24)
|
|
:SetMargin(0, 0, 0, 24)
|
|
:SetHintText(L["Select professions"])
|
|
:SetSelectionText(L["No Professions"], L["%d Professions"], L["All Professions"])
|
|
:SetScript("OnSelectionChanged", private.ProfessionDropdownOnSelectionChanged)
|
|
)
|
|
:AddChild(UIElements.New("Text", "sourcesCategoryText")
|
|
:SetHeight(20)
|
|
:SetMargin(0, 0, 0, 2)
|
|
:SetFont("BODY_BODY3_MEDIUM")
|
|
:SetTextColor("INDICATOR")
|
|
:SetText(L["Sources"])
|
|
)
|
|
:AddChild(UIElements.New("Text", "sourcesDesc")
|
|
:SetHeight(28)
|
|
:SetMargin(0, 0, 0, 4)
|
|
:SetFont("BODY_BODY3_MEDIUM")
|
|
:SetTextColor("TEXT_ALT")
|
|
:SetText(L["Define what priority Gathering gives certain sources."])
|
|
)
|
|
:AddChildrenWithFunction(private.CreateSourceRows)
|
|
)
|
|
:SetRightChild(UIElements.New("Frame", "mats")
|
|
:SetLayout("VERTICAL")
|
|
:SetBackgroundColor("PRIMARY_BG_ALT")
|
|
:AddChild(UIElements.New("Text", "title")
|
|
:SetHeight(20)
|
|
:SetMargin(0, 0, 8, 8)
|
|
:SetFont("BODY_BODY1_BOLD")
|
|
:SetJustifyH("CENTER")
|
|
:SetText(L["Materials to Gather"])
|
|
)
|
|
:AddChild(UIElements.New("QueryScrollingTable", "table")
|
|
:SetSettingsContext(private.settings, "gatheringScrollingTable")
|
|
:GetScrollingTableInfo()
|
|
:NewColumn("name")
|
|
:SetTitle(NAME)
|
|
:SetFont("ITEM_BODY3")
|
|
:SetJustifyH("LEFT")
|
|
:SetIconSize(12)
|
|
:SetTextInfo("itemString", TSM.UI.GetColoredItemName)
|
|
:SetIconInfo("itemString", ItemInfo.GetTexture)
|
|
:SetTooltipInfo("itemString")
|
|
:SetSortInfo("name")
|
|
:DisableHiding()
|
|
:Commit()
|
|
:NewColumn("sources")
|
|
:SetTitle(L["Sources"])
|
|
:SetFont("BODY_BODY3")
|
|
:SetJustifyH("LEFT")
|
|
:SetTextInfo("sourcesStr", private.MatsGetSourcesStrText)
|
|
:SetSortInfo("sourcesStr")
|
|
:Commit()
|
|
:NewColumn("have")
|
|
:SetTitle(L["Have"])
|
|
:SetFont("TABLE_TABLE1")
|
|
:SetJustifyH("RIGHT")
|
|
:SetTextInfo("numHave")
|
|
:SetSortInfo("numHave")
|
|
:Commit()
|
|
:NewColumn("need")
|
|
:SetTitle(NEED)
|
|
:SetFont("TABLE_TABLE1")
|
|
:SetJustifyH("RIGHT")
|
|
:SetTextInfo("numNeed")
|
|
:SetSortInfo("numNeed")
|
|
:Commit()
|
|
:Commit()
|
|
:SetQuery(TSM.Crafting.Gathering.CreateQuery()
|
|
:InnerJoin(ItemInfo.GetDBForJoin(), "itemString")
|
|
:OrderBy("name", true)
|
|
)
|
|
:SetSelectionDisabled(true)
|
|
:SetAutoReleaseQuery(true)
|
|
)
|
|
:AddChild(UIElements.New("Texture", "headerTopLine")
|
|
:SetHeight(2)
|
|
:SetTexture("ACTIVE_BG")
|
|
)
|
|
:AddChild(UIElements.New("ActionButton", "openTaskListBtn")
|
|
:SetHeight(26)
|
|
:SetMargin(8)
|
|
:SetScript("OnClick", TSM.UI.TaskListUI.Toggle)
|
|
)
|
|
)
|
|
:SetScript("OnUpdate", private.FrameOnUpdate)
|
|
:SetScript("OnHide", private.FrameOnHide)
|
|
private.frame = frame
|
|
return frame
|
|
end
|
|
|
|
function private.MatsGetSourcesStrText(str)
|
|
str = gsub(str, "/[^,]+", "")
|
|
for i = 1, #SOURCE_LIST do
|
|
str = gsub(str, SOURCE_LIST[i], SOURCE_TEXT_LIST[i])
|
|
end
|
|
return str
|
|
end
|
|
|
|
function private.CreateSourceRows(frame)
|
|
for i = 1, #SOURCE_LIST do
|
|
frame:AddChild(UIElements.New("Frame", "sourceFrame"..i)
|
|
:SetLayout("HORIZONTAL")
|
|
:SetHeight(24)
|
|
:SetMargin(0, 0, 8, 0)
|
|
:AddChild(UIElements.New("Text", "label")
|
|
:SetFont("BODY_BODY3_MEDIUM")
|
|
:SetTextColor((i > #private.settings.sources + 1) and "TEXT_ALT+DISABLED" or "TEXT_ALT")
|
|
:SetFormattedText(L["SOURCE %d"], i)
|
|
)
|
|
:AddChild(UIElements.New("SelectionDropdown", "dropdown")
|
|
:SetWidth(188)
|
|
:SetContext(i)
|
|
:SetHintText(L["Select a Source"])
|
|
:SetScript("OnSelectionChanged", private.SourceDropdownOnSelectionChanged)
|
|
)
|
|
)
|
|
end
|
|
private.UpdateSourceRows(frame)
|
|
end
|
|
|
|
function private.UpdateSourceRows(setupFrame)
|
|
if TSM.IsWowClassic() then
|
|
Table.RemoveByValue(private.settings.sources, "guildBank")
|
|
Table.RemoveByValue(private.settings.sources, "altGuildBank")
|
|
end
|
|
local texts = TempTable.Acquire()
|
|
local sources = TempTable.Acquire()
|
|
for i = 1, #SOURCE_LIST do
|
|
wipe(texts)
|
|
wipe(sources)
|
|
for j = 1, #SOURCE_LIST do
|
|
local index = Table.KeyByValue(private.settings.sources, SOURCE_LIST[j])
|
|
if not index or index >= i then
|
|
tinsert(texts, SOURCE_TEXT_LIST[j])
|
|
tinsert(sources, SOURCE_LIST[j])
|
|
end
|
|
end
|
|
if i <= #private.settings.sources then
|
|
tinsert(texts, "<"..strupper(REMOVE)..">")
|
|
tinsert(sources, "")
|
|
end
|
|
setupFrame:GetElement("sourceFrame"..i..".label")
|
|
:SetTextColor((i > #private.settings.sources + 1) and "TEXT_ALT+DISABLED" or "TEXT_ALT")
|
|
setupFrame:GetElement("sourceFrame"..i..".dropdown")
|
|
:SetItems(texts, sources)
|
|
:SetDisabled(i > #private.settings.sources + 1)
|
|
:SetHintText(L["Select a Source"])
|
|
:SetSelectedItemByKey(private.settings.sources[i], true)
|
|
end
|
|
TempTable.Release(texts)
|
|
TempTable.Release(sources)
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Local Script Handlers
|
|
-- ============================================================================
|
|
|
|
function private.FrameOnUpdate(frame)
|
|
private.UpdateButtonState()
|
|
frame:SetScript("OnUpdate", nil)
|
|
private.ContextChangedCallback()
|
|
end
|
|
|
|
function private.FrameOnHide(frame)
|
|
assert(frame == private.frame)
|
|
private.frame = nil
|
|
private.query:Release()
|
|
private.query = nil
|
|
end
|
|
|
|
function private.CrafterDropdownOnSelectionChanged(dropdown)
|
|
TSM.Crafting.Gathering.SetCrafter(dropdown:GetSelectedItem() or "")
|
|
dropdown:GetElement("__parent.professionDropdown")
|
|
:SetItems(TSM.Crafting.Gathering.GetProfessionList())
|
|
:SetSelectedItems(TSM.Crafting.Gathering.GetProfessions())
|
|
:Draw()
|
|
end
|
|
|
|
function private.ProfessionDropdownOnSelectionChanged(dropdown)
|
|
local professions = TempTable.Acquire()
|
|
dropdown:GetSelectedItems(professions)
|
|
TSM.Crafting.Gathering.SetProfessions(professions)
|
|
TempTable.Release(professions)
|
|
end
|
|
|
|
function private.SourceDropdownOnSelectionChanged(dropdown)
|
|
local index = dropdown:GetContext()
|
|
local source = dropdown:GetSelectedItemKey()
|
|
if source == "" then
|
|
tremove(private.settings.sources, index)
|
|
else
|
|
private.settings.sources[index] = source
|
|
for i = #private.settings.sources, index + 1, -1 do
|
|
if private.settings.sources[i] == source then
|
|
tremove(private.settings.sources, i)
|
|
end
|
|
end
|
|
end
|
|
local setupFrame = dropdown:GetParentElement():GetParentElement()
|
|
private.UpdateSourceRows(setupFrame)
|
|
setupFrame:Draw()
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Private Helper Functions
|
|
-- ============================================================================
|
|
|
|
function private.ContextChangedCallback()
|
|
if not private.frame then
|
|
return
|
|
end
|
|
|
|
private.frame:GetElement("setup.crafterDropdown")
|
|
:SetItems(TSM.Crafting.Gathering.GetCrafterList())
|
|
:SetSelectedItem(TSM.Crafting.Gathering.GetCrafter())
|
|
:Draw()
|
|
private.frame:GetElement("setup.professionDropdown")
|
|
:SetItems(TSM.Crafting.Gathering.GetProfessionList())
|
|
:SetSelectedItems(TSM.Crafting.Gathering.GetProfessions())
|
|
:Draw()
|
|
end
|
|
|
|
function private.UpdateButtonState()
|
|
if not private.frame then
|
|
return
|
|
end
|
|
local button = private.frame:GetElement("mats.openTaskListBtn")
|
|
if private.query:Count() == 0 then
|
|
button:SetText(L["No Materials to Gather"])
|
|
button:SetDisabled(true)
|
|
elseif TSM.UI.TaskListUI.IsVisible() then
|
|
button:SetText(L["Tasks Added to Task List"])
|
|
button:SetDisabled(true)
|
|
else
|
|
button:SetText(L["Open Task List"])
|
|
button:SetDisabled(false)
|
|
end
|
|
button:Draw()
|
|
end
|