1125 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1125 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- ------------------------------------------------------------------------------ --
 | |
| --                                TradeSkillMaster                                --
 | |
| --                          https://tradeskillmaster.com                          --
 | |
| --    All Rights Reserved - Detailed license information included with addon.     --
 | |
| -- ------------------------------------------------------------------------------ --
 | |
| 
 | |
| local _, TSM = ...
 | |
| local Inbox = TSM.UI.MailingUI:NewPackage("Inbox")
 | |
| local L = TSM.Include("Locale").GetTable()
 | |
| local Delay = TSM.Include("Util.Delay")
 | |
| local Event = TSM.Include("Util.Event")
 | |
| local Money = TSM.Include("Util.Money")
 | |
| local Sound = TSM.Include("Util.Sound")
 | |
| local FSM = TSM.Include("Util.FSM")
 | |
| local Math = TSM.Include("Util.Math")
 | |
| local Theme = TSM.Include("Util.Theme")
 | |
| local ItemInfo = TSM.Include("Service.ItemInfo")
 | |
| local MailTracking = TSM.Include("Service.MailTracking")
 | |
| local Settings = TSM.Include("Service.Settings")
 | |
| local UIElements = TSM.Include("UI.UIElements")
 | |
| local private = {
 | |
| 	settings = nil,
 | |
| 	fsm = nil,
 | |
| 	frame = nil,
 | |
| 	view = nil,
 | |
| 	inboxQuery = nil,
 | |
| 	itemsQuery = nil,
 | |
| 	selectedMail = nil,
 | |
| 	nextUpdate = nil,
 | |
| 	filterText = ""
 | |
| }
 | |
| local PLAYER_NAME = UnitName("player")
 | |
| local MAIL_REFRESH_TIME = TSM.IsWowClassic() and 60 or 15
 | |
| 
 | |
| 
 | |
| 
 | |
| -- ============================================================================
 | |
| -- Module Functions
 | |
| -- ============================================================================
 | |
| 
 | |
| function Inbox.OnInitialize()
 | |
| 	private.settings = Settings.NewView()
 | |
| 		:AddKey("global", "mailingUIContext", "mailsScrollingTable")
 | |
| 		:AddKey("global", "mailingOptions", "openMailSound")
 | |
| 	private.FSMCreate()
 | |
| 	TSM.UI.MailingUI.RegisterTopLevelPage(INBOX, private.GetInboxFrame)
 | |
| end
 | |
| 
 | |
| function Inbox.IsMailOpened()
 | |
| 	if not private.view or not private.view:HasChildById("view") then
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	return private.view:GetElement("view"):GetPath() == "items"
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| -- ============================================================================
 | |
| -- Inbox UI
 | |
| -- ============================================================================
 | |
| 
 | |
| function private.GetInboxFrame()
 | |
| 	TSM.UI.AnalyticsRecordPathChange("mailing", "inbox")
 | |
| 	local frame = UIElements.New("Frame", "frame")
 | |
| 		:SetLayout("VERTICAL")
 | |
| 		:AddChild(UIElements.New("ViewContainer", "view")
 | |
| 			:SetNavCallback(private.GetViewContentFrame)
 | |
| 			:AddPath("mails", true)
 | |
| 			:AddPath("items")
 | |
| 		)
 | |
| 
 | |
| 	private.view = frame
 | |
| 
 | |
| 	return frame
 | |
| end
 | |
| 
 | |
| function private.GetViewContentFrame(viewContainer, path)
 | |
| 	if path == "mails" then
 | |
| 		private.selectedMail = nil
 | |
| 		return private.GetInboxMailsFrame()
 | |
| 	elseif path == "items" then
 | |
| 		return private.GetInboxItemsFrame()
 | |
| 	else
 | |
| 		error("Unexpected path: "..tostring(path))
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.GetInboxMailsFrame()
 | |
| 	private.inboxQuery = private.inboxQuery or TSM.Mailing.Inbox.CreateQuery()
 | |
| 	private.inboxQuery:ResetFilters()
 | |
| 	private.inboxQuery:ResetOrderBy()
 | |
| 	private.inboxQuery:OrderBy("index", true)
 | |
| 
 | |
| 	private.filterText = ""
 | |
| 
 | |
| 	local frame = UIElements.New("Frame", "inbox")
 | |
| 		:SetLayout("VERTICAL")
 | |
| 		:AddChild(UIElements.New("Frame", "top")
 | |
| 			:SetLayout("HORIZONTAL")
 | |
| 			:SetPadding(8)
 | |
| 			:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 			:AddChild(UIElements.New("Input", "filterInput")
 | |
| 				:SetHeight(24)
 | |
| 				:SetMargin(0, 8, 0, 0)
 | |
| 				:AllowItemInsert()
 | |
| 				:SetIconTexture("iconPack.18x18/Search")
 | |
| 				:SetClearButtonEnabled(true)
 | |
| 				:SetHintText(L["Search items in mailbox"])
 | |
| 				:SetDisabled(false)
 | |
| 				:SetScript("OnValueChanged", private.SearchOnValueChanged)
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("ActionButton", "reload")
 | |
| 				:SetSize(110, 24)
 | |
| 				:SetFormattedText(L["Reload UI (%d)"], MAIL_REFRESH_TIME)
 | |
| 				:SetScript("OnClick", ReloadUI)
 | |
| 			)
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("QueryScrollingTable", "mails")
 | |
| 			:SetSettingsContext(private.settings, "mailsScrollingTable")
 | |
| 			:GetScrollingTableInfo()
 | |
| 				:NewColumn("items")
 | |
| 					:SetTitle(L["Items"])
 | |
| 					:SetFont("ITEM_BODY3")
 | |
| 					:SetJustifyH("LEFT")
 | |
| 					:SetTextInfo(nil, private.FormatItem)
 | |
| 					:SetTooltipInfo("itemString")
 | |
| 					:SetActionIconInfo(1, 12, private.GetMailTypeIcon)
 | |
| 					:SetTooltipLinkingDisabled(true)
 | |
| 					:DisableHiding()
 | |
| 					:Commit()
 | |
| 				:NewColumn("sender")
 | |
| 					:SetTitle(L["Sender"])
 | |
| 					:SetFont("TABLE_TABLE1")
 | |
| 					:SetJustifyH("LEFT")
 | |
| 					:SetTextInfo("sender")
 | |
| 					:Commit()
 | |
| 				:NewColumn("expires")
 | |
| 					:SetTitle(L["Expires"])
 | |
| 					:SetFont("BODY_BODY3_MEDIUM")
 | |
| 					:SetJustifyH("RIGHT")
 | |
| 					:SetTextInfo("expires", private.FormatDaysLeft)
 | |
| 					:Commit()
 | |
| 				:NewColumn("money")
 | |
| 					:SetTitle(L["Gold"])
 | |
| 					:SetFont("TABLE_TABLE1")
 | |
| 					:SetJustifyH("RIGHT")
 | |
| 					:SetTextInfo(nil, private.FormatMoney)
 | |
| 					:Commit()
 | |
| 				:Commit()
 | |
| 			:SetQuery(private.inboxQuery)
 | |
| 			:SetSelectionDisabled(true)
 | |
| 			:SetScript("OnRowClick", private.QueryOnRowClick)
 | |
| 			:SetScript("OnDataUpdated", private.InboxOnDataUpdated)
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("Texture", "line")
 | |
| 			:SetHeight(2)
 | |
| 			:SetTexture("ACTIVE_BG")
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("Frame", "footer")
 | |
| 			:SetLayout("HORIZONTAL")
 | |
| 			:SetHeight(26)
 | |
| 			:SetBackgroundColor("PRIMARY_BG")
 | |
| 			:AddChild(UIElements.New("Spacer", "spacer"))
 | |
| 			:AddChild(UIElements.New("Text", "mailNum")
 | |
| 				:SetWidth(200)
 | |
| 				:SetFont("BODY_BODY2_MEDIUM")
 | |
| 				:SetJustifyH("RIGHT")
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Texture", "vline")
 | |
| 				:SetWidth(1)
 | |
| 				:SetMargin(8, 8, 3, 3)
 | |
| 				:SetTexture("ACTIVE_BG_ALT")
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Text", "itemNum")
 | |
| 				:SetWidth(130)
 | |
| 				:SetFont("BODY_BODY2_MEDIUM")
 | |
| 				:SetJustifyH("RIGHT")
 | |
| 				:SetText(format(L["%s Items Total"], Theme.GetFeedbackColor("GREEN"):ColorText(0)))
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Texture", "vline")
 | |
| 				:SetWidth(1)
 | |
| 				:SetMargin(8, 8, 3, 3)
 | |
| 				:SetTexture("ACTIVE_BG_ALT")
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "content")
 | |
| 				:SetLayout("HORIZONTAL")
 | |
| 				:SetWidth(190)
 | |
| 				:AddChild(UIElements.New("Spacer", "spacer"))
 | |
| 				:AddChild(UIElements.New("Text", "totalText")
 | |
| 					:SetWidth("AUTO")
 | |
| 					:SetFont("BODY_BODY2_MEDIUM")
 | |
| 					:SetJustifyH("RIGHT")
 | |
| 					:SetText(L["Total Gold"]..": ")
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("Text", "gold")
 | |
| 					:SetWidth("AUTO")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("TABLE_TABLE1")
 | |
| 					:SetJustifyH("RIGHT")
 | |
| 					:SetText(Money.ToString(0))
 | |
| 				)
 | |
| 			)
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("Texture", "line")
 | |
| 			:SetHeight(2)
 | |
| 			:SetTexture("ACTIVE_BG")
 | |
| 		)
 | |
| 	if TSM.IsWowClassic() then
 | |
| 		frame:AddChild(UIElements.New("Frame", "bottom")
 | |
| 			:SetLayout("VERTICAL")
 | |
| 			:SetHeight(74)
 | |
| 			:SetPadding(8)
 | |
| 			:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 			:AddChild(UIElements.New("ActionButton", "openAllMail")
 | |
| 				:SetHeight(26)
 | |
| 				:SetText(L["Open Mail"])
 | |
| 				:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 				:SetModifierText(L["Open All Mail"], "SHIFT")
 | |
| 				:SetModifierText(L["Open Mail Without Money"], "CTRL")
 | |
| 				:SetModifierText(L["Open All Mail Without Money"], "SHIFT", "CTRL")
 | |
| 				:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes and CTRL to not open mail with money attached."])
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "buttons")
 | |
| 				:SetLayout("HORIZONTAL")
 | |
| 				:SetHeight(24)
 | |
| 				:SetMargin(0, 0, 8, 0)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllSales")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["Sold"])
 | |
| 					:SetContext("SALE")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["All Sold"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllBuys")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["Bought"])
 | |
| 					:SetContext("BUY")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["All Bought"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllCancels")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["Cancelled"])
 | |
| 					:SetContext("CANCEL")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["All Cancelled"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllExpires")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["Expired"])
 | |
| 					:SetContext("EXPIRE")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["All Expired"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllOthers")
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["Other"])
 | |
| 					:SetContext("OTHER")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["All Other"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to continue after the inbox refreshes"])
 | |
| 				)
 | |
| 			)
 | |
| 		)
 | |
| 	else
 | |
| 		frame:AddChild(UIElements.New("Frame", "bottom")
 | |
| 			:SetLayout("VERTICAL")
 | |
| 			:SetHeight(74)
 | |
| 			:SetPadding(8)
 | |
| 			:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 			:AddChild(UIElements.New("ActionButton", "openAllMail")
 | |
| 				:SetHeight(26)
 | |
| 				:SetText(L["Open All Mail"])
 | |
| 				:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 				:SetModifierText(L["Open Mail"], "SHIFT")
 | |
| 				:SetModifierText(L["Open All Mail Without Money"], "CTRL")
 | |
| 				:SetModifierText(L["Open Mail Without Money"], "SHIFT", "CTRL")
 | |
| 				:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes and CTRL to not open mail with money attached."])
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "buttons")
 | |
| 				:SetLayout("HORIZONTAL")
 | |
| 				:SetHeight(24)
 | |
| 				:SetMargin(0, 0, 8, 0)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllSales")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["All Sold"])
 | |
| 					:SetContext("SALE")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["Sold"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllBuys")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["All Bought"])
 | |
| 					:SetContext("BUY")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["Bought"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllCancels")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["All Cancelled"])
 | |
| 					:SetContext("CANCEL")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["Cancelled"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllExpires")
 | |
| 					:SetMargin(0, 8, 0, 0)
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["All Expired"])
 | |
| 					:SetContext("EXPIRE")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["Expired"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("ActionButton", "openAllOthers")
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetText(L["All Other"])
 | |
| 					:SetContext("OTHER")
 | |
| 					:SetScript("OnClick", private.OpenBtnOnClick)
 | |
| 					:SetModifierText(L["Other"], "SHIFT")
 | |
| 					:SetTooltip(L["Hold SHIFT to not continue after the inbox refreshes"])
 | |
| 				)
 | |
| 			)
 | |
| 		)
 | |
| 	end
 | |
| 	frame:SetScript("OnUpdate", private.InboxFrameOnUpdate)
 | |
| 	frame:SetScript("OnHide", private.InboxFrameOnHide)
 | |
| 
 | |
| 	private.frame = frame
 | |
| 
 | |
| 	return frame
 | |
| end
 | |
| 
 | |
| function private.GetInboxItemsFrame()
 | |
| 	private.itemsQuery = private.itemsQuery or MailTracking.CreateMailItemQuery()
 | |
| 	private.itemsQuery:ResetFilters()
 | |
| 		:Equal("index", private.selectedMail)
 | |
| 		:OrderBy("itemIndex", true)
 | |
| 
 | |
| 	local _, _, _, isTakeable = GetInboxText(private.selectedMail)
 | |
| 	local _, _, _, _, _, _, _, _, _, _, textCreated = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	local frame = UIElements.New("Frame", "items")
 | |
| 		:SetLayout("VERTICAL")
 | |
| 		:AddChild(UIElements.New("Frame", "content")
 | |
| 			:SetLayout("VERTICAL")
 | |
| 			:SetBackgroundColor("PRIMARY_BG")
 | |
| 			:AddChild(UIElements.New("Frame", "top")
 | |
| 				:SetLayout("HORIZONTAL")
 | |
| 				:SetHeight(40)
 | |
| 				:SetPadding(8)
 | |
| 				:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 				:AddChild(UIElements.New("Frame", "back")
 | |
| 					:SetLayout("VERTICAL")
 | |
| 					:SetWidth(100)
 | |
| 					:AddChild(UIElements.New("ActionButton", "button")
 | |
| 						:SetWidth(64)
 | |
| 						:SetMargin(0, 36, 0, 0)
 | |
| 						:SetIcon("iconPack.14x14/Chevron/Right@180")
 | |
| 						:SetText(BACK)
 | |
| 						:SetScript("OnClick", private.ViewBackButtonOnClick)
 | |
| 					)
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("Text", "title")
 | |
| 					:SetFont("BODY_BODY1_BOLD")
 | |
| 					:SetJustifyH("CENTER")
 | |
| 					:SetText(L["Open Mail"])
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("Frame", "copy")
 | |
| 					:SetLayout("VERTICAL")
 | |
| 					:SetWidth(100)
 | |
| 					:AddChild(UIElements.New("Button", "button")
 | |
| 						:SetFont("BODY_BODY2_MEDIUM")
 | |
| 						:SetIcon("iconPack.14x14/Duplicate", "LEFT")
 | |
| 						:SetText(L["Copy Letter"])
 | |
| 						:SetDisabled(not isTakeable or textCreated)
 | |
| 						:SetScript("OnClick", private.CopyLetterButtonOnClick)
 | |
| 					)
 | |
| 				)
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "header")
 | |
| 				:SetLayout("VERTICAL")
 | |
| 				:SetPadding(12, 12, 4, 6)
 | |
| 				:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 				:AddChild(UIElements.New("Frame", "top")
 | |
| 					:SetLayout("VERTICAL")
 | |
| 					:SetHeight(20)
 | |
| 					:SetMargin(0, 0, 0, 6)
 | |
| 					:AddChild(UIElements.New("Frame", "left")
 | |
| 						:SetLayout("HORIZONTAL")
 | |
| 						:AddChild(UIElements.New("Text", "label")
 | |
| 							:SetWidth("AUTO")
 | |
| 							:SetFont("BODY_BODY2_MEDIUM")
 | |
| 							:SetText(L["From"]..": ")
 | |
| 						)
 | |
| 						:AddChild(UIElements.New("Text", "sender")
 | |
| 							:SetFont("BODY_BODY2")
 | |
| 						)
 | |
| 						:AddChild(UIElements.New("Spacer", "spacer"))
 | |
| 						:AddChild(UIElements.New("ActionButton", "report")
 | |
| 							:SetSize(124, 20)
 | |
| 							:SetFont("BODY_BODY2_MEDIUM")
 | |
| 							:SetText(L["Report Spam"])
 | |
| 							:SetScript("OnClick", private.ReportSpamOnClick)
 | |
| 						)
 | |
| 					)
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("Frame", "bottom")
 | |
| 					:SetLayout("VERTICAL")
 | |
| 					:SetHeight(20)
 | |
| 					:AddChild(UIElements.New("Frame", "left")
 | |
| 						:SetLayout("HORIZONTAL")
 | |
| 						:AddChild(UIElements.New("Text", "label")
 | |
| 							:SetWidth("AUTO")
 | |
| 							:SetFont("BODY_BODY2_MEDIUM")
 | |
| 							:SetText(L["Subject"]..": ")
 | |
| 						)
 | |
| 						:AddChild(UIElements.New("Text", "subject")
 | |
| 							:SetFont("BODY_BODY2")
 | |
| 						)
 | |
| 					)
 | |
| 				)
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Texture", "line")
 | |
| 				:SetHeight(2)
 | |
| 				:SetTexture("ACTIVE_BG")
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "body")
 | |
| 				:SetLayout("VERTICAL")
 | |
| 				:SetPadding(4, 4, 8, 12)
 | |
| 				:AddChild(UIElements.New("MultiLineInput", "input")
 | |
| 					:SetBackgroundColor("PRIMARY_BG")
 | |
| 					:SetFont("BODY_BODY2")
 | |
| 					:SetValue("")
 | |
| 				)
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("Frame", "attachments")
 | |
| 				:SetLayout("VERTICAL")
 | |
| 				:SetHeight(144)
 | |
| 				:SetPadding(12, 12, 0, 8)
 | |
| 				:SetBackgroundColor("PRIMARY_BG")
 | |
| 				:AddChild(UIElements.New("Frame", "header")
 | |
| 					:SetLayout("HORIZONTAL")
 | |
| 					:SetHeight(20)
 | |
| 					:AddChild(UIElements.New("Text", "text")
 | |
| 						:SetWidth("AUTO")
 | |
| 						:SetFont("BODY_BODY2_MEDIUM")
 | |
| 						:SetText(L["Attachments"])
 | |
| 					)
 | |
| 					:AddChild(UIElements.New("Button", "takeAll")
 | |
| 						:SetWidth("AUTO")
 | |
| 						:SetMargin(8, 0, 0, 0)
 | |
| 						:SetFont("BODY_BODY3")
 | |
| 						:SetTextColor("INDICATOR")
 | |
| 						:SetText(L["Move all to Bags"])
 | |
| 						:SetScript("OnClick", private.TakeAllOnClick)
 | |
| 					)
 | |
| 					:AddChild(UIElements.New("Spacer", "spacer"))
 | |
| 					:AddChild(UIElements.New("Text", "cod")
 | |
| 						:SetMargin(0, 5, 0, 0)
 | |
| 						:SetFont("BODY_BODY3_MEDIUM")
 | |
| 						:SetJustifyH("RIGHT")
 | |
| 						:SetText(L["COD"]..":")
 | |
| 					)
 | |
| 					:AddChild(UIElements.New("Text", "codAmount")
 | |
| 						:SetWidth("AUTO")
 | |
| 						:SetMargin(0, 8, 0, 0)
 | |
| 						:SetFont("ITEM_BODY2")
 | |
| 						:SetJustifyH("RIGHT")
 | |
| 					)
 | |
| 				)
 | |
| 				:AddChild(UIElements.New("QueryScrollingTable", "items")
 | |
| 					:SetHeaderHidden(true)
 | |
| 					:GetScrollingTableInfo()
 | |
| 						:NewColumn("items")
 | |
| 							:SetFont("ITEM_BODY3")
 | |
| 							:SetJustifyH("LEFT")
 | |
| 							:SetTextInfo(nil, private.FormatInboxItem)
 | |
| 							:SetIconSize(12)
 | |
| 							:SetIconInfo("itemLink", ItemInfo.GetTexture)
 | |
| 							:SetTooltipInfo(nil, private.GetInboxItemsTooltip)
 | |
| 							:SetTooltipLinkingDisabled(true)
 | |
| 							:Commit()
 | |
| 						:Commit()
 | |
| 					:SetQuery(private.itemsQuery)
 | |
| 					:SetSelectionDisabled(true)
 | |
| 					:SetScript("OnRowClick", private.ItemQueryOnRowClick)
 | |
| 				)
 | |
| 			)
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("Texture", "line")
 | |
| 			:SetHeight(2)
 | |
| 			:SetTexture("ACTIVE_BG")
 | |
| 		)
 | |
| 		:AddChild(UIElements.New("Frame", "footer")
 | |
| 			:SetLayout("HORIZONTAL")
 | |
| 			:SetHeight(42)
 | |
| 			:SetPadding(8)
 | |
| 			:SetBackgroundColor("PRIMARY_BG_ALT")
 | |
| 			:AddChild(UIElements.New("ActionButton", "reply")
 | |
| 				:SetMargin(0, 8, 0, 0)
 | |
| 				:SetFont("BODY_BODY2_MEDIUM")
 | |
| 				:SetText(L["Reply"])
 | |
| 				:SetScript("OnClick", private.ReplyOnClick)
 | |
| 			)
 | |
| 			:AddChild(UIElements.New("ActionButton", "return/send")
 | |
| 				:SetWidth(144)
 | |
| 				:SetFont("BODY_BODY2_MEDIUM")
 | |
| 				:SetText(MAIL_RETURN)
 | |
| 				:SetScript("OnClick", private.DeleteMailOnClick)
 | |
| 			)
 | |
| 		)
 | |
| 
 | |
| 	private.UpdateInboxItemsFrame(frame)
 | |
| 
 | |
| 	return frame
 | |
| end
 | |
| 
 | |
| function private.ViewBackButtonOnClick(button)
 | |
| 	private.filterText = ""
 | |
| 	button:GetElement("__parent.__parent.__parent.__parent.__parent"):SetPath("mails", true)
 | |
| end
 | |
| 
 | |
| function private.CopyLetterButtonOnClick(button)
 | |
| 	TakeInboxTextItem(private.selectedMail)
 | |
| 	button:SetDisabled(true)
 | |
| 		:Draw()
 | |
| end
 | |
| 
 | |
| function private.GetMailTypeIcon(_, data, iconIndex, isMouseOver)
 | |
| 	if iconIndex == 1 then
 | |
| 		local mailType = private.inboxQuery:GetResultRowByUUID(data):GetField("icon")
 | |
| 		local icon = ""
 | |
| 		if mailType == "SALE" then
 | |
| 			icon = "iconPack.12x12/Bid"
 | |
| 		elseif mailType == "BUY" then
 | |
| 			icon = "iconPack.12x12/Shopping"
 | |
| 		elseif mailType == "CANCEL" then
 | |
| 			icon = "iconPack.12x12/Close/Circle"
 | |
| 		elseif mailType == "EXPIRE" then
 | |
| 			icon = "iconPack.12x12/Clock"
 | |
| 		elseif mailType == "OTHER" then
 | |
| 			icon = "iconPack.12x12/Mailing"
 | |
| 		else
 | |
| 			assert(mailType == "")
 | |
| 		end
 | |
| 		return true, icon, true
 | |
| 	else
 | |
| 		error("Invalid index: "..tostring(iconIndex))
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.ItemQueryOnRowClick(scrollingTable, row)
 | |
| 	local index = row:GetField("index")
 | |
| 	local _, _, _, _, _, cod = GetInboxHeaderInfo(index)
 | |
| 	if cod > 0 then
 | |
| 		scrollingTable:GetBaseElement():ShowConfirmationDialog(L["Accept COD?"], format(L["Accepting this item will cost: %s"], Money.ToString(cod)), private.TakeInboxItem, scrollingTable, row)
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	private.TakeInboxItem(scrollingTable, row)
 | |
| end
 | |
| 
 | |
| function private.TakeInboxItem(scrollingTable, row)
 | |
| 	local index = row:GetField("index")
 | |
| 	local itemIndex = row:GetField("itemIndex")
 | |
| 	if private.itemsQuery:Count() == 1 then
 | |
| 		if itemIndex == 0 then
 | |
| 			TakeInboxMoney(index)
 | |
| 		else
 | |
| 			TakeInboxItem(index, row:GetField("itemIndex"))
 | |
| 		end
 | |
| 		scrollingTable:GetElement("__parent.__parent.__parent.__parent"):SetPath("mails", true)
 | |
| 	else
 | |
| 		if itemIndex == 0 then
 | |
| 			TakeInboxMoney(index)
 | |
| 		else
 | |
| 			TakeInboxItem(index, row:GetField("itemIndex"))
 | |
| 		end
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.ReportSpamOnClick(button)
 | |
| 	if not CanComplainInboxItem(private.selectedMail) then
 | |
| 		return
 | |
| 	end
 | |
| 	local _, _, sender = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	local dialog = StaticPopup_Show("CONFIRM_REPORT_SPAM_MAIL", sender)
 | |
| 	if dialog then
 | |
| 		dialog.data = private.selectedMail
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.TakeAllOnClick(button)
 | |
| 	local _, _, _, _, _, cod = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	if cod > 0 then
 | |
| 		button:GetBaseElement():ShowConfirmationDialog(L["Accept COD?"], format(L["Accepting this item will cost: %s"], Money.ToString(cod)), private.AutoLootMailItem, button)
 | |
| 	else
 | |
| 		private.AutoLootMailItem(button)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.AutoLootMailItem(button)
 | |
| 	-- marks the mail as read
 | |
| 	GetInboxText(private.selectedMail)
 | |
| 	AutoLootMailItem(private.selectedMail)
 | |
| 	button:GetElement("__parent.__parent.__parent.__parent.__parent"):SetPath("mails", true)
 | |
| end
 | |
| 
 | |
| function private.ReplyOnClick(button)
 | |
| 	local _, _, sender = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	TSM.UI.MailingUI.Send.SetSendRecipient(sender)
 | |
| 	TSM.UI.MailingUI.SetSelectedTab(L["Send"], true)
 | |
| end
 | |
| 
 | |
| function private.DeleteMailOnClick(button)
 | |
| 	local _, _, _, _, money, _, _, itemCount = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	if InboxItemCanDelete(private.selectedMail) then
 | |
| 		if itemCount and itemCount > 0 then
 | |
| 			return
 | |
| 		elseif money and money > 0 then
 | |
| 			return
 | |
| 		else
 | |
| 			DeleteInboxItem(private.selectedMail)
 | |
| 		end
 | |
| 	else
 | |
| 		ReturnInboxItem(private.selectedMail)
 | |
| 	end
 | |
| 	button:GetElement("__parent.__parent.__parent"):SetPath("mails", true)
 | |
| end
 | |
| 
 | |
| function private.UpdateInboxItemsFrame(frame)
 | |
| 	local _, _, sender, subject, money, cod, _, itemCount, _, _, _, canReply, isGM = GetInboxHeaderInfo(private.selectedMail)
 | |
| 	frame:GetElement("content.header.top.left.sender"):SetText(sender or UNKNOWN)
 | |
| 	frame:GetElement("content.header.bottom.left.subject"):SetText(subject)
 | |
| 
 | |
| 	if isGM then
 | |
| 		frame:GetElement("content.header.top.left.sender"):SetTextColor(Theme.GetBlizzardColor())
 | |
| 			:Draw()
 | |
| 	else
 | |
| 		frame:GetElement("content.header.top.left.sender"):SetTextColor("TEXT_ALT")
 | |
| 			:Draw()
 | |
| 	end
 | |
| 
 | |
| 	if CanComplainInboxItem(private.selectedMail) then
 | |
| 		frame:GetElement("content.header.top.left.report"):Show()
 | |
| 	else
 | |
| 		frame:GetElement("content.header.top.left.report"):Hide()
 | |
| 	end
 | |
| 
 | |
| 	if cod and cod > 0 then
 | |
| 		frame:GetElement("content.attachments.header.cod"):Show()
 | |
| 		frame:GetElement("content.attachments.header.codAmount"):SetText(Money.ToString(cod, Theme.GetFeedbackColor("RED"):GetTextColorPrefix()))
 | |
| 		frame:GetElement("content.attachments.header.codAmount"):Show()
 | |
| 	else
 | |
| 		frame:GetElement("content.attachments.header.cod"):Hide()
 | |
| 		frame:GetElement("content.attachments.header.codAmount"):Hide()
 | |
| 	end
 | |
| 
 | |
| 	if itemCount and itemCount > 0 then
 | |
| 		frame:GetElement("content.attachments.header.takeAll"):Show()
 | |
| 	else
 | |
| 		frame:GetElement("content.attachments.header.takeAll"):Hide()
 | |
| 	end
 | |
| 
 | |
| 	if not sender or not canReply or sender == PLAYER_NAME then
 | |
| 		frame:GetElement("footer.reply"):SetDisabled(true)
 | |
| 	else
 | |
| 		frame:GetElement("footer.reply"):SetDisabled(false)
 | |
| 	end
 | |
| 
 | |
| 	if InboxItemCanDelete(private.selectedMail) then
 | |
| 		frame:GetElement("footer.return/send"):SetText(DELETE)
 | |
| 		if (itemCount and itemCount > 0) or (money and money > 0) then
 | |
| 			frame:GetElement("footer.return/send"):SetDisabled(true)
 | |
| 		else
 | |
| 			frame:GetElement("footer.return/send"):SetDisabled(false)
 | |
| 		end
 | |
| 	else
 | |
| 		frame:GetElement("footer.return/send"):SetText(MAIL_RETURN)
 | |
| 		frame:GetElement("footer.return/send"):SetDisabled(false)
 | |
| 	end
 | |
| 
 | |
| 	local body, _, _, _, isInvoice = GetInboxText(private.selectedMail)
 | |
| 	if isInvoice then
 | |
| 		local invoiceType, itemName, playerName, bid, buyout, deposit, consignment, _, etaHour, etaMin = GetInboxInvoiceInfo(private.selectedMail)
 | |
| 		playerName = playerName or (invoiceType == "buyer" and AUCTION_HOUSE_MAIL_MULTIPLE_SELLERS or AUCTION_HOUSE_MAIL_MULTIPLE_BUYERS)
 | |
| 		local purchaseType = bid == buyout and BUYOUT or HIGH_BIDDER
 | |
| 		if invoiceType == "buyer" then
 | |
| 			body = ITEM_PURCHASED_COLON.." "..itemName.."\n"..SOLD_BY_COLON.." "..playerName.." ("..purchaseType..")".."\n\n"..AMOUNT_PAID_COLON.." "..Money.ToString(bid)
 | |
| 		elseif invoiceType == "seller" then
 | |
| 			body = ITEM_SOLD_COLON.." "..itemName.."\n"..PURCHASED_BY_COLON.." "..playerName.." ("..purchaseType..")".."\n\n"..L["Sale Price"]..": "..Money.ToString(bid).."\n"..L["Deposit"]..": +"..Money.ToString(deposit).."\n"..L["Auction House Cut"]..": -"..Money.ToString(consignment, Theme.GetFeedbackColor("RED"):GetTextColorPrefix()).."\n\n"..AMOUNT_RECEIVED_COLON.." "..Money.ToString(bid + deposit - consignment)
 | |
| 		elseif invoiceType == "seller_temp_invoice" then
 | |
| 			body = ITEM_SOLD_COLON.." "..itemName.."\n"..PURCHASED_BY_COLON.." "..playerName.." ("..purchaseType..")".."\n\n"..AUCTION_INVOICE_PENDING_FUNDS_COLON.." "..Money.ToString(bid + deposit - consignment).."\n"..L["Estimated deliver time"]..": "..GameTime_GetFormattedTime(etaHour, etaMin, true)
 | |
| 		end
 | |
| 	end
 | |
| 	frame:GetElement("content.body.input")
 | |
| 		:SetValue(body or "")
 | |
| 		:Draw()
 | |
| 
 | |
| 	if not body then
 | |
| 		frame:GetElement("content.body.input"):Hide()
 | |
| 		frame:GetElement("content.attachments.header.text"):SetText(L["Attachments"])
 | |
| 		frame:GetElement("content.attachments")
 | |
| 			:SetHeight(nil)
 | |
| 			:Draw()
 | |
| 	elseif private.itemsQuery:Count() == 0 then
 | |
| 		frame:GetElement("content.body.input"):Show()
 | |
| 		frame:GetElement("content.attachments.header.text"):SetText(L["No Attachments"])
 | |
| 		frame:GetElement("content.attachments")
 | |
| 			:SetHeight(48)
 | |
| 			:Draw()
 | |
| 	else
 | |
| 		frame:GetElement("content.body.input"):Show()
 | |
| 		frame:GetElement("content.attachments.header.text"):SetText(L["Attachments"])
 | |
| 		frame:GetElement("content.attachments")
 | |
| 			:SetHeight(144)
 | |
| 			:Draw()
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.FormatInboxItem(row)
 | |
| 	local itemIndex = row:GetField("itemIndex")
 | |
| 	if itemIndex == 0 then
 | |
| 		return L["Gold"]..": "..Money.ToString(row:GetField("itemLink"), Theme.GetFeedbackColor("GREEN"):GetTextColorPrefix())
 | |
| 	end
 | |
| 
 | |
| 	local coloredItem = TSM.UI.GetColoredItemName(row:GetField("itemLink")) or ""
 | |
| 	local quantity = row:GetField("quantity")
 | |
| 
 | |
| 	local item = ""
 | |
| 	if quantity > 1 then
 | |
| 		item = coloredItem..Theme.GetFeedbackColor("YELLOW"):ColorText(" (x"..quantity..")")
 | |
| 	else
 | |
| 		item = coloredItem
 | |
| 	end
 | |
| 
 | |
| 	return item
 | |
| end
 | |
| 
 | |
| 
 | |
| function private.GetInboxItemsTooltip(row)
 | |
| 	return row:GetField("itemIndex") ~= 0 and row:GetField("itemLink")
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| -- ============================================================================
 | |
| -- Local Script Handlers
 | |
| -- ============================================================================
 | |
| 
 | |
| function private.InboxFrameOnUpdate(frame)
 | |
| 	frame:SetScript("OnUpdate", nil)
 | |
| 	private.UpdateCountDown(true)
 | |
| 	Delay.AfterTime("mailUpdateCounter", 0, private.UpdateCountDown, 1)
 | |
| 	private.fsm:ProcessEvent("EV_FRAME_SHOW", frame, private.filterText)
 | |
| end
 | |
| 
 | |
| function private.InboxFrameOnHide(frame)
 | |
| 	assert(frame == private.frame)
 | |
| 	private.frame = nil
 | |
| 
 | |
| 	private.fsm:ProcessEvent("EV_FRAME_HIDE")
 | |
| end
 | |
| 
 | |
| function private.InboxOnDataUpdated()
 | |
| 	if not private.frame then
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	private.fsm:ProcessEvent("EV_MAIL_DATA_UPDATED", private.filterText)
 | |
| end
 | |
| 
 | |
| function private.OpenBtnOnClick(button)
 | |
| 	local filterType = button:GetContext()
 | |
| 	button:SetPressed(true)
 | |
| 	local openAll = nil
 | |
| 	if TSM.IsWowClassic() then
 | |
| 		openAll = IsShiftKeyDown()
 | |
| 	else
 | |
| 		openAll = not IsShiftKeyDown()
 | |
| 	end
 | |
| 	private.fsm:ProcessEvent("EV_BUTTON_CLICKED", openAll, not filterType and IsControlKeyDown(), private.filterText, filterType)
 | |
| end
 | |
| 
 | |
| function private.QueryOnRowClick(scrollingTable, row, button)
 | |
| 	if button ~= "LeftButton" then
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	if IsShiftKeyDown() then
 | |
| 		local index = row:GetField("index")
 | |
| 		local _, _, _, _, _, cod = GetInboxHeaderInfo(index)
 | |
| 		if cod <= 0 then
 | |
| 			-- marks the mail as read
 | |
| 			GetInboxText(index)
 | |
| 			AutoLootMailItem(index)
 | |
| 		end
 | |
| 	else
 | |
| 		TSM.Mailing.Open.KillThread()
 | |
| 		private.selectedMail = row:GetField("index")
 | |
| 		scrollingTable:GetElement("__parent.__parent"):SetPath("items", true)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function private.SearchOnValueChanged(input)
 | |
| 	local text = input:GetValue()
 | |
| 	if text == private.filterText then
 | |
| 		return
 | |
| 	end
 | |
| 	private.filterText = text
 | |
| 
 | |
| 	private.inboxQuery:ResetFilters()
 | |
| 		:Or()
 | |
| 			:Matches("itemList", private.filterText)
 | |
| 			:Matches("subject", private.filterText)
 | |
| 		:End()
 | |
| 
 | |
| 	input:GetElement("__parent.__parent.mails"):UpdateData(true)
 | |
| end
 | |
| 
 | |
| function private.FormatItem(row)
 | |
| 	private.itemsQuery = private.itemsQuery or MailTracking.CreateMailItemQuery()
 | |
| 
 | |
| 	private.itemsQuery:ResetFilters()
 | |
| 		:Equal("index", row:GetField("index"))
 | |
| 		:GreaterThan("itemIndex", 0)
 | |
| 		:ResetOrderBy()
 | |
| 		:OrderBy("itemIndex", true)
 | |
| 
 | |
| 	local items = ""
 | |
| 	local item = nil
 | |
| 	local same = true
 | |
| 	local qty = 0
 | |
| 	for _, itemsRow in private.itemsQuery:Iterator() do
 | |
| 		local coloredItem = TSM.UI.GetColoredItemName(itemsRow:GetField("itemLink")) or ""
 | |
| 		local quantity = itemsRow:GetField("quantity")
 | |
| 
 | |
| 		if not item then
 | |
| 			item = coloredItem
 | |
| 		end
 | |
| 
 | |
| 		if quantity > 1 then
 | |
| 			items = items..coloredItem..Theme.GetFeedbackColor("YELLOW"):ColorText(" (x"..quantity..")")..", "
 | |
| 		else
 | |
| 			items = items..coloredItem..", "
 | |
| 		end
 | |
| 
 | |
| 		if item == coloredItem then
 | |
| 			qty = qty + quantity
 | |
| 		else
 | |
| 			same = false
 | |
| 		end
 | |
| 	end
 | |
| 	items = strtrim(items, ", ")
 | |
| 
 | |
| 	if same and item then
 | |
| 		if qty > 1 then
 | |
| 			items = item..Theme.GetFeedbackColor("YELLOW"):ColorText(" (x"..qty..")")
 | |
| 		else
 | |
| 			items = item
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	if not items or items == "" then
 | |
| 		local subject = row:GetField("subject")
 | |
| 		if subject ~= "" then
 | |
| 			items = gsub(row:GetField("subject"), strtrim(AUCTION_SOLD_MAIL_SUBJECT, "%s.*"), "") or "--"
 | |
| 		else
 | |
| 			local _, _, sender = GetInboxHeaderInfo(row:GetField("index"))
 | |
| 			items = sender or UNKNOWN
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	return items
 | |
| end
 | |
| 
 | |
| function private.FormatDaysLeft(timeLeft)
 | |
| 	local color = nil
 | |
| 	if timeLeft >= 1 then
 | |
| 		if timeLeft <= 5 then
 | |
| 			color = Theme.GetFeedbackColor("YELLOW")
 | |
| 			timeLeft = floor(timeLeft).." "..DAYS
 | |
| 		else
 | |
| 			color = Theme.GetFeedbackColor("GREEN")
 | |
| 			timeLeft = floor(timeLeft).." "..DAYS
 | |
| 		end
 | |
| 	else
 | |
| 		color = Theme.GetFeedbackColor("RED")
 | |
| 		local hoursLeft = floor(timeLeft * 24)
 | |
| 		if hoursLeft > 1 then
 | |
| 			timeLeft = hoursLeft.." "..L["Hrs"]
 | |
| 		elseif hoursLeft == 1 then
 | |
| 			timeLeft = hoursLeft.." "..L["Hr"]
 | |
| 		else
 | |
| 			timeLeft = floor(hoursLeft / 60).." "..L["Min"]
 | |
| 		end
 | |
| 	end
 | |
| 	return color:ColorText(timeLeft)
 | |
| end
 | |
| 
 | |
| function private.FormatMoney(row)
 | |
| 	local money = row:GetField("money")
 | |
| 	local cod = row:GetField("cod")
 | |
| 
 | |
| 	local gold = nil
 | |
| 	if cod > 0 then
 | |
| 		gold = Money.ToString(cod, Theme.GetFeedbackColor("RED"):GetTextColorPrefix())
 | |
| 	elseif money > 0 then
 | |
| 		gold = Money.ToString(money, Theme.GetFeedbackColor("GREEN"):GetTextColorPrefix())
 | |
| 	end
 | |
| 
 | |
| 	return gold or "--"
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| -- ============================================================================
 | |
| -- Private Helper Functions
 | |
| -- ============================================================================
 | |
| 
 | |
| function private.UpdateCountDown(force)
 | |
| 	if not private.frame then
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	local nextUpdate = MAIL_REFRESH_TIME - (time() - TSM.Mailing.Open.GetLastCheckTime())
 | |
| 	if nextUpdate <= 0 then
 | |
| 		nextUpdate = MAIL_REFRESH_TIME
 | |
| 	end
 | |
| 
 | |
| 	if nextUpdate ~= private.nextUpdate or force then
 | |
| 		private.frame:GetElement("top.reload"):SetFormattedText(L["Reload UI (%02d)"], Math.Round(nextUpdate))
 | |
| 			:Draw()
 | |
| 		private.nextUpdate = nextUpdate
 | |
| 	end
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| -- ============================================================================
 | |
| -- FSM
 | |
| -- ============================================================================
 | |
| 
 | |
| function private.FSMCreate()
 | |
| 	local fsmContext = {
 | |
| 		frame = nil,
 | |
| 		opening = false
 | |
| 	}
 | |
| 
 | |
| 	Event.Register("PLAYER_REPORT_SUBMITTED", function()
 | |
| 		if not private.view or not private.view:HasChildById("view") then
 | |
| 			return
 | |
| 		end
 | |
| 		private.view:GetElement("view"):SetPath("mails", true)
 | |
| 	end)
 | |
| 
 | |
| 	local function UpdateText(context, filterText)
 | |
| 		local text = nil
 | |
| 		local numMail, totalMail = GetInboxNumItems()
 | |
| 		if filterText == "" then
 | |
| 			if totalMail > numMail then
 | |
| 				text = L["Showing %s of %d Mails"]
 | |
| 			elseif (numMail == 0 and totalMail == 0) or (numMail == 1 and totalMail == 1) then
 | |
| 				text = L["Showing %s Mail"]
 | |
| 			else
 | |
| 				text = L["Showing all %s Mails"]
 | |
| 			end
 | |
| 		else
 | |
| 			numMail = private.inboxQuery:Count()
 | |
| 			if (numMail == 0 and totalMail == 0) or (numMail == 1 and totalMail == 1) then
 | |
| 				text = L["Showing %s of %d Mail"]
 | |
| 			else
 | |
| 				text = L["Showing %s of %d Mails"]
 | |
| 			end
 | |
| 		end
 | |
| 
 | |
| 		local totalItems, totalGold = 0, 0
 | |
| 		for _, row in private.inboxQuery:Iterator() do
 | |
| 			totalItems = totalItems + row:GetField("itemCount")
 | |
| 			totalGold = totalGold + row:GetField("money")
 | |
| 		end
 | |
| 
 | |
| 		context.frame:GetElement("footer.mailNum")
 | |
| 			:SetText(format(text, Theme.GetFeedbackColor("GREEN"):ColorText(tostring(numMail)), totalMail))
 | |
| 			:Draw()
 | |
| 		context.frame:GetElement("footer.itemNum")
 | |
| 			:SetText(format(L["%s Items Total"], Theme.GetFeedbackColor("GREEN"):ColorText(totalItems)))
 | |
| 		context.frame:GetElement("footer.content.gold")
 | |
| 			:SetText(Money.ToString(totalGold))
 | |
| 
 | |
| 		context.frame:GetElement("footer")
 | |
| 			:Draw()
 | |
| 	end
 | |
| 
 | |
| 	local function UpdateButtons(context)
 | |
| 		if not context.frame or not context.frame:HasChildById("top.filterInput") then
 | |
| 			return
 | |
| 		end
 | |
| 
 | |
| 		if context.opening then
 | |
| 			context.frame:GetElement("bottom.openAllMail")
 | |
| 				:SetDisabled(true)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllSales")
 | |
| 				:SetDisabled(true)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllBuys")
 | |
| 				:SetDisabled(true)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllCancels")
 | |
| 				:SetDisabled(true)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllExpires")
 | |
| 				:SetDisabled(true)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllOthers")
 | |
| 				:SetDisabled(true)
 | |
| 
 | |
| 			context.frame:GetElement("bottom")
 | |
| 				:Draw()
 | |
| 		else
 | |
| 			local all, sales, buys, cancels, expires, other = 0, 0, 0, 0, 0, 0
 | |
| 			for _, row in private.inboxQuery:Iterator() do
 | |
| 				local iconType = row:GetField("icon")
 | |
| 				all = all + 1
 | |
| 				if iconType == "SALE" then
 | |
| 					sales = sales + 1
 | |
| 				elseif iconType == "BUY" then
 | |
| 					buys = buys + 1
 | |
| 				elseif iconType == "CANCEL" then
 | |
| 					cancels = cancels + 1
 | |
| 				elseif iconType == "EXPIRE" then
 | |
| 					expires = expires + 1
 | |
| 				elseif iconType == "OTHER" then
 | |
| 					other = other + 1
 | |
| 				end
 | |
| 			end
 | |
| 
 | |
| 			context.frame:GetElement("bottom.openAllMail")
 | |
| 				:SetDisabled(all == 0)
 | |
| 				:SetPressed(false)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllSales")
 | |
| 				:SetDisabled(sales == 0)
 | |
| 				:SetPressed(false)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllBuys")
 | |
| 				:SetDisabled(buys == 0)
 | |
| 				:SetPressed(false)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllCancels")
 | |
| 				:SetDisabled(cancels == 0)
 | |
| 				:SetPressed(false)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllExpires")
 | |
| 				:SetDisabled(expires == 0)
 | |
| 				:SetPressed(false)
 | |
| 			context.frame:GetElement("bottom.buttons.openAllOthers")
 | |
| 				:SetDisabled(other == 0)
 | |
| 				:SetPressed(false)
 | |
| 
 | |
| 			context.frame:GetElement("bottom")
 | |
| 				:Draw()
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	private.fsm = FSM.New("MAILING_INBOX")
 | |
| 		:AddState(FSM.NewState("ST_HIDDEN")
 | |
| 			:SetOnEnter(function(context)
 | |
| 				TSM.Mailing.Open.KillThread()
 | |
| 				Delay.Cancel("mailUpdateCounter")
 | |
| 				context.frame = nil
 | |
| 			end)
 | |
| 			:AddTransition("ST_SHOWN")
 | |
| 			:AddTransition("ST_HIDDEN")
 | |
| 			:AddEventTransition("EV_FRAME_SHOW", "ST_SHOWN")
 | |
| 		)
 | |
| 		:AddState(FSM.NewState("ST_SHOWN")
 | |
| 			:SetOnEnter(function(context, frame, filterText)
 | |
| 				if not context.frame then
 | |
| 					context.frame = frame
 | |
| 					UpdateText(context, filterText)
 | |
| 					UpdateButtons(context)
 | |
| 				end
 | |
| 			end)
 | |
| 			:AddTransition("ST_HIDDEN")
 | |
| 			:AddTransition("ST_OPENING_START")
 | |
| 			:AddEvent("EV_MAIL_DATA_UPDATED", function(context, filterText)
 | |
| 				UpdateText(context, filterText)
 | |
| 				UpdateButtons(context)
 | |
| 			end)
 | |
| 			:AddEventTransition("EV_BUTTON_CLICKED", "ST_OPENING_START")
 | |
| 		)
 | |
| 		:AddState(FSM.NewState("ST_OPENING_START")
 | |
| 			:SetOnEnter(function(context, autoRefresh, keepMoney, filterText, filterType)
 | |
| 				context.opening = true
 | |
| 				UpdateButtons(context)
 | |
| 				TSM.Mailing.Open.StartOpening(private.FSMOpenCallback, autoRefresh, keepMoney, filterText, filterType)
 | |
| 			end)
 | |
| 			:SetOnExit(function(context)
 | |
| 				context.opening = false
 | |
| 				UpdateButtons(context)
 | |
| 			end)
 | |
| 			:AddTransition("ST_SHOWN")
 | |
| 			:AddTransition("ST_HIDDEN")
 | |
| 			:AddEvent("EV_MAIL_DATA_UPDATED", function(context, filterText)
 | |
| 				UpdateText(context, filterText)
 | |
| 			end)
 | |
| 			:AddEventTransition("EV_OPENING_DONE", "ST_SHOWN")
 | |
| 		)
 | |
| 		:AddDefaultEventTransition("EV_FRAME_HIDE", "ST_HIDDEN")
 | |
| 		:Init("ST_HIDDEN", fsmContext)
 | |
| end
 | |
| 
 | |
| function private.FSMOpenCallback()
 | |
| 	private.fsm:ProcessEvent("EV_OPENING_DONE")
 | |
| 
 | |
| 	Sound.PlaySound(private.settings.openMailSound)
 | |
| end
 |