refactoring and some bugfixes

This commit is contained in:
Manuel Simon Hirsig
2016-08-11 17:55:47 +02:00
parent 28b174d44c
commit daeff3b15d
+330 -347
View File
@@ -1,75 +1,78 @@
Postal = CreateFrame('Frame', nil, MailFrame)
Postal:SetScript('OnUpdate', function()
local self = CreateFrame('Frame', nil, MailFrame)
Postal = self
self:SetScript('OnUpdate', function()
this:UPDATE()
end)
Postal:SetScript('OnEvent', function()
self:SetScript('OnEvent', function()
this[event](this)
end)
Postal:RegisterEvent('ADDON_LOADED')
for _, event in {'ADDON_LOADED', 'VARIABLES_LOADED', 'UI_ERROR_MESSAGE', 'CURSOR_UPDATE', 'MAIL_CLOSED', 'MAIL_SEND_SUCCESS'} do
self:RegisterEvent(event)
end
local ATTACHMENTS_MAX = 21
local ATTACHMENTS_PER_ROW_SEND = 7
local ATTACHMENTS_MAX_ROWS_SEND = 3
self.hook, self.orig = {}, {}
function self:Hook(...)
for i=1,arg.n do
self.orig[arg[i]] = getglobal(arg[i])
setglobal(arg[i], self.hook[arg[i]])
end
end
do
local state
function Postal:UPDATE()
if state and state.p() then
function self:UPDATE()
if state and state.predicate() then
local callback = state.callback
state = nil
return callback()
end
if self.SendMail_State and self.SendMail_Ready then
self:SendMail_Send()
end
end
function Postal:When(p, callback)
function self:When(predicate, callback)
state = {
p = p,
predicate = predicate,
callback = callback,
}
end
function Postal:Wait(callback)
function self:Wait(callback)
state = {
p = function() return true end,
predicate = function() return true end,
callback = callback,
}
end
function Postal:Kill()
function self:Kill()
state = nil
end
end
do
local lastPickedUp
local cursorItem
function Postal:CURSOR_UPDATE()
lastPickedUp = nil
function self:CURSOR_UPDATE()
cursorItem = nil
end
function Postal:CursorItem()
return CursorHasItem() and lastPickedUp
function self:GetCursorItem()
return cursorItem
end
function Postal.PickupContainerItem(bag, slot)
local item = {bag, slot}
if Postal:SendMail_Attached(item) then
return
end
Postal:Wait(function()
lastPickedUp = item
function self:SetCursorItem(item) -- TODO
self:Wait(function()
cursorItem = item
end)
return Postal.PickupContainerItem_Orig(unpack(item))
end
end
function Postal:MAIL_CLOSED()
self:Inbox_Abort()
self.SendMail_State = nil
function self:MAIL_CLOSED()
self:Abort()
self.Inbox_selectedItems = {}
self:SendMail_Clear()
-- Hides the minimap unread mail button if there are no unread mail on closing the mailbox.
@@ -82,27 +85,23 @@ function Postal:MAIL_CLOSED()
MiniMapMailFrame:Hide()
end
function Postal:MAIL_SEND_SUCCESS()
function self:MAIL_SEND_SUCCESS()
self.SendMail_Ready = true
end
function Postal:UI_ERROR_MESSAGE()
function self:UI_ERROR_MESSAGE()
if self.Inbox_Opening then
if arg1 == ERR_INV_FULL then
self:Print('Postal: Inventory full. Aborting.', 1, 0, 0)
self:Inbox_Abort()
self:Print('Inventory full. Aborting.', 1, 0, 0)
self:Abort()
elseif arg1 == ERR_ITEM_MAX_COUNT then
self:Print('Postal: You already have the maximum amount of that item. Skipping.', 1, 0, 0)
self:Print('You already have the maximum amount of that item. Skipping.', 1, 0, 0)
self.Inbox_Skip = true
end
end
end
function Postal:Print(msg, r, g, b)
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b)
end
function Postal:ADDON_LOADED()
function self:ADDON_LOADED()
if arg1 ~= 'Postal' then
return
end
@@ -119,12 +118,6 @@ function Postal:ADDON_LOADED()
CreateFrame('GameTooltip', 'PostalTooltip', nil, 'GameTooltipTemplate')
PostalTooltip:SetOwner(WorldFrame, 'ANCHOR_NONE')
self:RegisterEvent('VARIABLES_LOADED')
self:RegisterEvent('UI_ERROR_MESSAGE')
self:RegisterEvent('MAIL_SEND_SUCCESS')
self:RegisterEvent('MAIL_CLOSED')
self:RegisterEvent('CURSOR_UPDATE')
SendMailFrame:CreateTexture('PostalHorizontalBarLeft', 'BACKGROUND')
PostalHorizontalBarLeft:SetTexture([[Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar]])
PostalHorizontalBarLeft:SetWidth(256)
@@ -154,24 +147,7 @@ function Postal:ADDON_LOADED()
SendMailSendMoneyButton:SetPoint('TOPLEFT', SendMailMoney, 'TOPRIGHT', 0, 12)
end
PostalMailButton:SetScript('OnClick', function()
Postal:Inbox_Abort()
local attachments = self:SendMail_Attachments()
self.SendMail_State = {
first = true,
to = SendMailNameEditBox:GetText(),
subject = PostalSubjectEditBox:GetText(),
body = SendMailBodyEditBox:GetText(),
money = MoneyInputFrame_GetCopper(SendMailMoney),
cod = SendMailCODButton:GetChecked(),
attachments = attachments,
total = getn(attachments),
}
self:SendMail_Clear()
SendMailFrame_Update()
end)
PostalMailButton:SetScript('OnClick', self.PostalMailButton_OnClick)
-- hack to avoid automatic subject setting/button enabling
SendMailMailButton:Hide()
@@ -195,45 +171,162 @@ function Postal:ADDON_LOADED()
self.SendMail_Ready = true
end
function Postal:VARIABLES_LOADED()
self.PickupContainerItem_Orig = PickupContainerItem
PickupContainerItem = self.PickupContainerItem
self.SplitContainerItem_Orig = SplitContainerItem
SplitContainerItem = self.SplitContainerItem
self.UseContainerItem_Orig = UseContainerItem
UseContainerItem = self.UseContainerItem
self.ClickSendMailItemButton_Orig = ClickSendMailItemButton
ClickSendMailItemButton = self.ClickSendMailItemButton
self.SendMailFrame_Update_Orig = SendMailFrame_Update
SendMailFrame_Update = self.SendMailFrame_Update
self.SendMailFrame_CanSend_Orig = SendMailFrame_CanSend
SendMailFrame_CanSend = self.SendMailFrame_CanSend
self.SetItemButtonDesaturated_Orig = SetItemButtonDesaturated
SetItemButtonDesaturated = self.SetItemButtonDesaturated
self.InboxFrame_OnClick_Orig = InboxFrame_OnClick
InboxFrame_OnClick = self.InboxFrame_OnClick
self.InboxFrameItem_OnEnter_Orig = InboxFrameItem_OnEnter
InboxFrameItem_OnEnter = self.InboxFrameItem_OnEnter
self.InboxFrame_Update_Orig = InboxFrame_Update
InboxFrame_Update = self.InboxFrame_Update
function self:VARIABLES_LOADED()
self:Hook(
'InboxFrame_Update','InboxFrame_OnClick', 'InboxFrameItem_OnEnter',
'SendMailFrame_Update', 'SendMailFrame_CanSend', 'ClickSendMailItemButton', 'SetItemButtonDesaturated', 'PickupContainerItem', 'SplitContainerItem', 'UseContainerItem'
)
end
function Postal.SendMailFrame_Update()
function self:Print(msg, r, g, b)
DEFAULT_CHAT_FRAME:AddMessage('Postal: '..msg, r, g, b)
end
function self:Present(value)
return value ~= nil and {[value]=true} or {}
end
function self:Abort()
self:Kill()
self.Inbox_Opening = false
self:Inbox_Lock()
end
function self.hook.InboxFrame_Update()
self.orig.InboxFrame_Update()
for i=1,7 do
local index = (i + (InboxFrame.pageNum - 1) * 7)
if index > GetInboxNumItems() then
getglobal('PostalBoxItem'..i..'CB'):Hide()
else
getglobal('PostalBoxItem'..i..'CB'):Show()
getglobal('PostalBoxItem'..i..'CB'):SetChecked(self.Inbox_selectedItems[index])
end
end
self:Inbox_Lock()
end
function self.hook.InboxFrame_OnClick(index)
if self.Inbox_Opening then
this:SetChecked(nil)
else
return self.orig.InboxFrame_OnClick(index)
end
end
function self.hook.InboxFrameItem_OnEnter()
local tooltipSet
GameTooltip:SetOwner(this, 'ANCHOR_RIGHT')
if this.index then
if GetInboxItem(this.index) then
GameTooltip:SetInboxItem(this.index)
tooltipSet = true
end
end
if this.money then
GameTooltip:AddLine(ENCLOSED_MONEY, '', 1, 1, 1)
SetTooltipMoney(GameTooltip, this.money)
SetMoneyFrameColor('GameTooltipMoneyFrame', HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
elseif this.cod then
GameTooltip:AddLine(COD_AMOUNT, '', 1, 1, 1)
SetTooltipMoney(GameTooltip, this.cod)
if this.cod > GetMoney() then
SetMoneyFrameColor('GameTooltipMoneyFrame', RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
else
SetMoneyFrameColor('GameTooltipMoneyFrame', HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
end
end
if tooltipSet and (this.money or this.cod) then
GameTooltip:SetHeight(GameTooltip:GetHeight()+getglobal('GameTooltipTextLeft' .. GameTooltip:NumLines()):GetHeight())
if GameTooltipMoneyFrame:IsVisible() then
GameTooltip:SetHeight(GameTooltip:GetHeight()+GameTooltipMoneyFrame:GetHeight())
end
end
GameTooltip:Show()
end
function self:Inbox_SetSelected()
local index = this:GetID() + (InboxFrame.pageNum - 1) * 7
self.Inbox_selectedItems[index] = this:GetChecked()
end
function self:Inbox_OpenSelected(all)
self:Abort()
local selected = {}
if all then
for i = 1,GetInboxNumItems() do
tinsert(selected, i)
end
else
for i, _ in self.Inbox_selectedItems do
tinsert(selected, i)
end
sort(selected)
end
self.Inbox_selectedItems = {}
self.Inbox_Opening = true
self:Inbox_Lock()
self:Inbox_OpenMail(selected)
end
function self:Inbox_OpenMail(selected)
if getn(selected) == 0 then
self.Inbox_Opening = false
self:Inbox_Lock()
else
self:Inbox_OpenItem(selected[1], GetInboxNumItems(), selected)
end
end
function self:Inbox_OpenItem(i, inboxCount, selected)
self:Wait(function()
local _, _, _, _, money, COD, _, item = GetInboxHeaderInfo(i)
local newInboxCount = GetInboxNumItems()
if newInboxCount < inboxCount or COD > 0 or self.Inbox_Skip then
self.Inbox_Skip = false
tremove(selected, 1)
if newInboxCount < inboxCount then
for j, _ in selected do
selected[j] = selected[j] - 1
end
end
return self:Inbox_OpenMail(selected)
elseif item then
TakeInboxItem(i)
self:When(function() return not ({GetInboxHeaderInfo(i)})[8] or GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
elseif money > 0 then
TakeInboxMoney(i)
self:When(function() return ({GetInboxHeaderInfo(i)})[5] == 0 or GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
else
DeleteInboxItem(i)
self:When(function() return GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
end
end)
end
function self:Inbox_Lock()
for i=1,7 do
getglobal('MailItem'..i..'ButtonIcon'):SetDesaturated(self.Inbox_Opening)
if self.Inbox_Opening then
getglobal('MailItem'..i..'Button'):SetChecked(nil)
end
end
end
function self.hook.SendMailFrame_Update()
local itemCount = 0
local itemTitle
local gap
-- local last = 0
local last = Postal:SendMail_NumAttachments()
local last = self:SendMail_NumAttachments()
for i=1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment' .. i)
@@ -257,7 +350,7 @@ function Postal.SendMailFrame_Update()
end
end
if Postal:SendMail_NumAttachments() > 0 then
if self:SendMail_NumAttachments() > 0 then
SendMailCODButton:Enable()
SendMailCODButtonText:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b)
else
@@ -266,7 +359,7 @@ function Postal.SendMailFrame_Update()
SendMailCODButtonText:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b)
end
MoneyFrame_Update('SendMailCostMoneyFrame', GetSendMailPrice() * max(1, Postal:SendMail_NumAttachments()))
MoneyFrame_Update('SendMailCostMoneyFrame', GetSendMailPrice() * max(1, self:SendMail_NumAttachments()))
-- Determine how many rows of attachments to show
local itemRowCount = 1
@@ -340,7 +433,89 @@ function Postal.SendMailFrame_Update()
SendMailFrame_CanSend()
end
function Postal:SendMail_Attached(item)
function self.hook.SendMailFrame_CanSend()
if strlen(SendMailNameEditBox:GetText()) > 0 and (SendMailSendMoneyButton:GetChecked() and MoneyInputFrame_GetCopper(SendMailMoney) or 0) + GetSendMailPrice() * max(1, self:SendMail_NumAttachments()) <= GetMoney() then
PostalMailButton:Enable()
else
PostalMailButton:Disable()
end
end
function self.hook.ClickSendMailItemButton()
self:SendMail_AttachItem(self:GetCursorItem())
ClearCursor()
end
function self.hook.SetItemButtonDesaturated(itemButton, locked)
local item = {itemButton:GetParent():GetID(), itemButton:GetID()}
return self.orig.SetItemButtonDesaturated(itemButton, self:SendMail_Attached(item) or locked)
end
function self.hook.PickupContainerItem(...)
local item = {arg[1], arg[2]}
if self:SendMail_Attached(item) then
return
end
self:SetCursorItem(item)
return self.orig.PickupContainerItem(unpack(arg))
end
function self.hook.SplitContainerItem(...)
local item = {arg[1], arg[2]}
if self:SendMail_Attached(item) then
return
end
return self.orig.SplitContainerItem(unpack(arg))
end
function self.hook.UseContainerItem(...)
local item = {arg[1], arg[2]}
if self:SendMail_Attached(item) then
return
end
if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() then
return self.orig.UseContainerItem(unpack(arg))
elseif SendMailFrame:IsVisible() then
self:SendMail_AttachItem(item)
self.orig.PickupContainerItem(unpack(arg)) -- for the lock changed event
ClearCursor()
elseif TradeFrame:IsVisible() then
for i=1,6 do
if not GetTradePlayerItemLink(i) then
self.orig.PickupContainerItem(unpack(arg))
ClickTradeButton(i)
return
end
end
else
return self.orig.UseContainerItem(unpack(arg))
end
end
function self.PostalMailButton_OnClick()
self:Abort()
self.SendMail_State = {
to = SendMailNameEditBox:GetText(),
subject = PostalSubjectEditBox:GetText(),
body = SendMailBodyEditBox:GetText(),
money = MoneyInputFrame_GetCopper(SendMailMoney),
cod = SendMailCODButton:GetChecked(),
attachments = self:SendMail_Attachments(),
numMessages = max(1, self:SendMail_NumAttachments()),
}
self:SendMail_Clear()
SendMailFrame_Update()
self:When(function()
return self.SendMail_Ready
end, function()
self:SendMail_Send()
end)
end
function self:SendMail_Attached(item)
for i=1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment' .. i)
if btn.item and btn.item[1] == item[1] and btn.item[2] == item[2] then
@@ -357,32 +532,33 @@ function Postal:SendMail_Attached(item)
end
end
function Postal:AttachmentButton_OnClick()
local buttonItem = this.item
local cursorItem = self:CursorItem()
if cursorItem then
ClearCursor()
if not self:SendMail_Mailable(cursorItem) then
return self:Print('Postal: Cannot attach item.', 1, 0.5, 0)
end
this.item = cursorItem
function self:AttachmentButton_OnClick()
local attachedItem = this.item
local cursorItem = self:GetCursorItem()
if cursorItem and not self:SendMail_Mailable(cursorItem) then
return self:Print('Cannot attach item.', 1, 0.5, 0)
end
this.item = cursorItem
ClearCursor()
if buttonItem then
this.item = nil
PickupContainerItem(unpack(buttonItem))
if attachedItem then
if arg1 == 'LeftButton' then
self:SetCursorItem(attachedItem)
end
self.orig.PickupContainerItem(unpack(attachedItem))
if arg1 ~= 'LeftButton' then
ClearCursor() -- for the lock changed event
end
end
SendMailFrame_Update()
end
-- requires an item lock changed event for a proper update
function Postal:SendMail_AttachItem(item)
function self:SendMail_AttachItem(item)
if not self:SendMail_Mailable(item) then
return self:Print('Postal: Cannot attach item.', 1, 0.5, 0)
return self:Print('Cannot attach item.', 1, 0.5, 0)
end
for i = 1,ATTACHMENTS_MAX do
for i=1,ATTACHMENTS_MAX do
if not getglobal('PostalAttachment'..i).item then
getglobal('PostalAttachment'..i).item = item
SendMailFrame_Update()
@@ -391,55 +567,7 @@ function Postal:SendMail_AttachItem(item)
end
end
-- handle the weird built-in mail body textbox onclick
function Postal.ClickSendMailItemButton()
Postal:SendMail_AttachItem(Postal:CursorItem())
ClearCursor()
end
function Postal.SetItemButtonDesaturated(itemButton, locked)
local item = { itemButton:GetParent():GetID(), itemButton:GetID() }
if Postal:SendMail_Attached(item) then
return Postal.SetItemButtonDesaturated_Orig(itemButton, true)
end
return Postal.SetItemButtonDesaturated_Orig(itemButton, locked)
end
function Postal.UseContainerItem(...)
local item = {arg[1], arg[2]}
if Postal:SendMail_Attached(item) then
return
end
if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() then
Postal.UseContainerItem_Orig(unpack(arg))
elseif SendMailFrame:IsVisible() then
Postal:SendMail_AttachItem(item)
Postal.PickupContainerItem_Orig(unpack(arg))
ClearCursor()
elseif TradeFrame:IsVisible() then
for i=1,6 do
if not GetTradePlayerItemLink(i) then
Postal.PickupContainerItem_Orig(unpack(arg))
ClickTradeButton(i)
return
end
end
else
Postal.UseContainerItem_Orig(unpack(arg))
end
end
function Postal.SplitContainerItem(...)
local item = {arg[1], arg[2]}
if Postal:SendMail_Attached(item) then
return
end
return Postal.SplitContainerItem_Orig(unpack(arg))
end
function Postal:SendMail_Mailable(item)
function self:SendMail_Mailable(item)
PostalTooltip:SetBagItem(unpack(item))
for i=1,PostalTooltip:NumLines() do
local text = getglobal('PostalTooltipTextLeft' .. i):GetText()
@@ -450,7 +578,7 @@ function Postal:SendMail_Mailable(item)
return true
end
function Postal:SendMail_NumAttachments()
function self:SendMail_NumAttachments()
local num = 0
for i=1,ATTACHMENTS_MAX do
if getglobal('PostalAttachment'..i).item then
@@ -460,10 +588,10 @@ function Postal:SendMail_NumAttachments()
return num
end
function Postal:SendMail_Attachments()
function self:SendMail_Attachments()
local arr = {}
for i = 1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment' .. i)
for i=1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment'..i)
if btn.item then
tinsert(arr, btn.item)
end
@@ -471,7 +599,7 @@ function Postal:SendMail_Attachments()
return arr
end
function Postal:SendMail_Clear()
function self:SendMail_Clear()
for i=1,ATTACHMENTS_MAX do
getglobal('PostalAttachment'..i).item = nil
end
@@ -484,187 +612,42 @@ function Postal:SendMail_Clear()
SendMailRadioButton_OnClick(1)
end
function Postal.SendMailFrame_CanSend()
if strlen(SendMailNameEditBox:GetText()) > 0 and (SendMailSendMoneyButton:GetChecked() and MoneyInputFrame_GetCopper(SendMailMoney) or 0) + GetSendMailPrice() * max(1, Postal:SendMail_NumAttachments()) <= GetMoney() then
PostalMailButton:Enable()
else
PostalMailButton:Disable()
function self:SendMail_Send()
for item in self:Present(tremove(self.SendMail_State.attachments, 1)) do
ClearCursor()
self.orig.ClickSendMailItemButton()
ClearCursor()
self.orig.PickupContainerItem(unpack(item))
self.orig.ClickSendMailItemButton()
if not GetSendMailItem() then
return self:Print('Unknown error. Aborting.', 1, 0, 0)
end
end
end
function Postal:SendMail_Send()
local item = tremove(self.SendMail_State.attachments, 1)
if item or self.SendMail_State.first then
local subject = self.SendMail_State.subject
subject = subject ~= '' and subject or '[No Subject]'
if self.SendMail_State.total > 1 then
subject = subject..format(' (Part %d of %d)', self.SendMail_State.total - getn(self.SendMail_State.attachments), self.SendMail_State.total)
for amount in self:Present(self.SendMail_State.money) do
self.SendMail_State.money = nil
if self.SendMail_State.cod then
SetSendMailCOD(amount)
else
SetSendMailMoney(amount)
end
end
if item then
ClearCursor()
self.ClickSendMailItemButton_Orig()
ClearCursor()
self.PickupContainerItem_Orig(unpack(item))
self.ClickSendMailItemButton_Orig()
local subject = self.SendMail_State.subject
subject = subject ~= '' and subject or '[No Subject]'
if self.SendMail_State.numMessages > 1 then
subject = subject..format(' (Part %d of %d)', self.SendMail_State.numMessages - getn(self.SendMail_State.attachments), self.SendMail_State.numMessages)
end
if not GetSendMailItem() then
return self:Print('Postal: An error occured in POSTAL. This might be related to lag, trying to send items with an item placed in the normal send mail window, or trying to send items that cannot be sent.', 1, 0, 0)
end
end
SendMail(self.SendMail_State.to, subject, self.SendMail_State.body)
self.SendMail_Ready = false
if self.SendMail_State.first then
self.SendMail_State.first = false
if self.SendMail_State.money then
if self.SendMail_State.cod then
SetSendMailCOD(self.SendMail_State.money)
else
SetSendMailMoney(self.SendMail_State.money)
end
end
end
self.SendMail_Ready = nil
return SendMail(self.SendMail_State.to, subject, self.SendMail_State.body)
else
self.SendMail_State = nil
if getn(self.SendMail_State.attachments) > 0 then
self:When(function()
return self.SendMail_Ready
end, function()
self:SendMail_Send()
end)
end
end
function Postal.InboxFrameItem_OnEnter()
local tooltipSet
GameTooltip:SetOwner(this, 'ANCHOR_RIGHT')
if this.index then
if GetInboxItem(this.index) then
GameTooltip:SetInboxItem(this.index)
tooltipSet = true
end
end
if this.money then
GameTooltip:AddLine(ENCLOSED_MONEY, '', 1, 1, 1)
SetTooltipMoney(GameTooltip, this.money)
SetMoneyFrameColor('GameTooltipMoneyFrame', HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
elseif this.cod then
GameTooltip:AddLine(COD_AMOUNT, '', 1, 1, 1)
SetTooltipMoney(GameTooltip, this.cod)
if this.cod > GetMoney() then
SetMoneyFrameColor('GameTooltipMoneyFrame', RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
else
SetMoneyFrameColor('GameTooltipMoneyFrame', HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
end
end
if tooltipSet and (this.money or this.cod) then
GameTooltip:SetHeight(GameTooltip:GetHeight()+getglobal('GameTooltipTextLeft' .. GameTooltip:NumLines()):GetHeight())
if GameTooltipMoneyFrame:IsVisible() then
GameTooltip:SetHeight(GameTooltip:GetHeight()+GameTooltipMoneyFrame:GetHeight())
end
end
GameTooltip:Show()
end
function Postal:Inbox_SetSelected()
local index = this:GetID() + (InboxFrame.pageNum - 1) * 7
self.Inbox_selectedItems[index] = this:GetChecked()
end
function Postal:Inbox_OpenSelected(all)
self.SendMail_State = nil
local selected = {}
if all then
for i = 1,GetInboxNumItems() do
tinsert(selected, i)
end
else
for i, _ in self.Inbox_selectedItems do
tinsert(selected, i)
end
sort(selected)
end
self.Inbox_selectedItems = {}
self.Inbox_Opening = true
self:Inbox_Lock()
self:Inbox_OpenMail(selected)
end
function Postal:Inbox_OpenMail(selected)
if getn(selected) == 0 then
self.Inbox_Opening = false
self:Inbox_Lock()
else
self:Inbox_OpenItem(selected[1], GetInboxNumItems(), selected)
end
end
function Postal:Inbox_OpenItem(i, inboxCount, selected)
self:Wait(function()
local _, _, _, _, money, COD, _, item = GetInboxHeaderInfo(i)
local newInboxCount = GetInboxNumItems()
if newInboxCount < inboxCount or COD > 0 or self.Inbox_Skip then
self.Inbox_Skip = false
tremove(selected, 1)
if newInboxCount < inboxCount then
for j, _ in selected do
selected[j] = selected[j] - 1
end
end
return self:Inbox_OpenMail(selected)
elseif item then
TakeInboxItem(i)
self:When(function() return not ({GetInboxHeaderInfo(i)})[8] or GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
elseif money > 0 then
TakeInboxMoney(i)
self:When(function() return ({GetInboxHeaderInfo(i)})[5] == 0 or GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
else
DeleteInboxItem(i)
self:When(function() return GetInboxNumItems() < inboxCount or self.Inbox_Skip end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
end
end)
end
function Postal.InboxFrame_Update()
Postal.InboxFrame_Update_Orig()
for i = 1,7 do
local index = (i + (InboxFrame.pageNum - 1) * 7)
if index > GetInboxNumItems() then
getglobal('PostalBoxItem'..i..'CB'):Hide()
else
getglobal('PostalBoxItem'..i..'CB'):Show()
getglobal('PostalBoxItem'..i..'CB'):SetChecked(Postal.Inbox_selectedItems[index])
end
end
Postal:Inbox_Lock()
end
function Postal:Inbox_Lock()
for i=1,7 do
getglobal('MailItem'..i..'ButtonIcon'):SetDesaturated(self.Inbox_Opening)
if self.Inbox_Opening then
getglobal('MailItem'..i..'Button'):SetChecked(nil)
end
end
end
function Postal.InboxFrame_OnClick(index)
if Postal.Inbox_Opening then
this:SetChecked(nil)
return
else
return Postal.InboxFrame_OnClick_Orig(index)
end
end
function Postal:Inbox_Abort()
self:Kill()
self.Inbox_Opening = false
self:Inbox_Lock()
self.Inbox_selectedItems = {}
end