refactoring

This commit is contained in:
Manuel Simon Hirsig
2016-08-03 10:47:21 +02:00
parent 5d41297c51
commit 737072de69
+148 -172
View File
@@ -13,8 +13,8 @@ do
return callback()
end
if self.Send_State and self.Send_Ready then
self:Send_SendMail()
if self.SendMail_State and self.SendMail_Ready then
self:SendMail_Send()
end
end
@@ -37,9 +37,67 @@ do
end
end
do
local lastPickedUp
function Postal:CURSOR_UPDATE()
lastPickedUp = nil
end
function Postal:CursorItem()
return CursorHasItem() and lastPickedUp
end
function Postal:PickupContainerItem(bag, slot)
local item = {bag, slot}
if self:SendMail_Attached(item) then
return
end
self:Wait(function()
lastPickedUp = item
end)
return self.hooks['PickupContainerItem'].orig(unpack(item))
end
end
function Postal:MAIL_CLOSED()
self:Inbox_Abort()
self.SendMail_State = nil
self:SendMail_Clear()
-- Hides the minimap unread mail button if there are no unread mail on closing the mailbox.
-- Does not scan past the first 50 items since only the first 50 are viewable.
for i=1,GetInboxNumItems() do
if not ({GetInboxHeaderInfo(i)})[9] then
return
end
end
MiniMapMailFrame:Hide()
end
function Postal:MAIL_SENDMAIL_SUCCESS()
self.SendMail_Ready = true
end
function Postal: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()
elseif arg1 == ERR_ITEM_MAX_COUNT then
self:Print('Postal: 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:OnEnable()
self:RegisterEvent('UI_ERROR_MESSAGE')
self:RegisterEvent('MAIL_SEND_SUCCESS')
self:RegisterEvent('MAIL_SENDMAIL_SUCCESS')
self:RegisterEvent('MAIL_CLOSED')
self:RegisterEvent('CURSOR_UPDATE')
@@ -84,8 +142,10 @@ function Postal:OnEnable()
end
PostalMailButton:SetScript('OnClick', function()
local attachments = self:Send_Attachments()
self.Send_State = {
Postal:Inbox_Abort()
local attachments = self:SendMail_Attachments()
self.SendMail_State = {
first = true,
to = SendMailNameEditBox:GetText(),
subject = PostalSubjectEditBox:GetText(),
@@ -96,7 +156,7 @@ function Postal:OnEnable()
total = getn(attachments),
}
self:Send_Clear()
self:SendMail_Clear()
SendMailFrame_Update()
end)
@@ -123,19 +183,8 @@ end
function Postal:OnInitialize()
-- Allows the mail frame to be pushed
if UIPanelWindows['MailFrame'] then
UIPanelWindows['MailFrame'].pushable = 1
else
UIPanelWindows['MailFrame'] = { area = 'left', pushable = 1 }
end
-- Close FriendsFrame will close if you try to open a mail with mailframe+friendsframe open
if UIPanelWindows['FriendsFrame'] then
UIPanelWindows['FriendsFrame'].pushable = 2
else
UIPanelWindows['FriendsFrame'] = { area = 'left', pushable = 2 }
end
UIPanelWindows['MailFrame'].pushable = 1
UIPanelWindows['FriendsFrame'].pushable = 2
MailItem1:SetPoint('TOPLEFT', 'InboxFrame', 'TOPLEFT', 48, -80)
for i=1,7 do
@@ -146,10 +195,8 @@ function Postal:OnInitialize()
CreateFrame('GameTooltip', 'PostalTooltip', nil, 'GameTooltipTemplate')
PostalTooltip:SetOwner(WorldFrame, 'ANCHOR_NONE')
self.MiniMapMailFrame_Show_Orig = MiniMapMailFrame.Show
self.Inbox_selectedItems = {}
self.Send_Ready = true
self.SendMail_Ready = true
end
function Postal:SendMailFrame_Update()
@@ -158,7 +205,7 @@ function Postal:SendMailFrame_Update()
local itemTitle
local gap
-- local last = 0
local last = self:Send_NumAttachments()
local last = self:SendMail_NumAttachments()
for i=1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment' .. i)
@@ -182,7 +229,7 @@ function Postal:SendMailFrame_Update()
end
end
if self:Send_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
@@ -191,7 +238,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, self:Send_NumAttachments()))
MoneyFrame_Update('SendMailCostMoneyFrame', GetSendMailPrice() * max(1, self:SendMail_NumAttachments()))
-- Determine how many rows of attachments to show
local itemRowCount = 1
@@ -265,53 +312,26 @@ function Postal:SendMailFrame_Update()
self:SendMailFrame_CanSend()
end
function Postal:MAIL_CLOSED()
self.Send_State = nil
self:Inbox_Abort()
self:Send_Clear()
-- Hides the minimap unread mail button if there are no unread mail on closing the mailbox.
-- Does not scan past the first 50 items since only the first 50 are viewable.
for i=1,GetInboxNumItems() do
if not ({GetInboxHeaderInfo(i)})[9] then
return
end
end
MiniMapMailFrame:Hide()
-- There may be an UPDATE PENDING MAIL event after closing which would make the frame reappear, the following prevents that
local t = GetTime()
MiniMapMailFrame.Show = function()
if GetTime() - t > 2 then
MiniMapMailFrame.Show = self.MiniMapMailFrame_Show_Orig
MiniMapMailFrame:Show()
end
end
end
function Postal:MAIL_SEND_SUCCESS()
self.Send_Ready = true
end
function Postal:ContainerFrameItemButton_OnClick(btn, ignore)
local item = {this:GetParent():GetID(), this:GetID()}
if self:Send_Attached(item) then
if self:SendMail_Attached(item) then
return
else
return self.hooks['ContainerFrameItemButton_OnClick'].orig(btn, ignore)
end
end
function Postal:Send_Attached(item)
function Postal: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
return true
end
end
if not self.Send_State then
if not self.SendMail_State then
return
end
for _, attachment in self.Send_State.attachments do
for _, attachment in self.SendMail_State.attachments do
if attachment.item and attachment.item[1] == item[1] and attachment.item[2] == item[2] then
return true
end
@@ -324,7 +344,7 @@ function Postal:AttachmentButton_OnClick()
if cursorItem then
ClearCursor()
if not self:Send_Mailable(cursorItem) then
if not self:SendMail_Mailable(cursorItem) then
return self:Print('Postal: Cannot attach item.', 1, 0.5, 0)
end
this.item = cursorItem
@@ -339,10 +359,10 @@ function Postal:AttachmentButton_OnClick()
end
-- requires an item lock changed event for a proper update
function Postal:Send_AttachItem(item)
function Postal:SendMail_AttachItem(item)
for i = 1,ATTACHMENTS_MAX do
if not getglobal('PostalAttachment'..i).item then
if not self:Send_Mailable(item) then
if not self:SendMail_Mailable(item) then
return self:Print('Postal: Cannot attach item.', 1, 0.5, 0)
end
getglobal('PostalAttachment'..i).item = item
@@ -354,13 +374,13 @@ end
-- handle the weird built-in mail body textbox onclick
function Postal:ClickSendMailItemButton()
self:Send_AttachItem(self:CursorItem())
self:SendMail_AttachItem(self:CursorItem())
ClearCursor()
end
function Postal:SetItemButtonDesaturated(itemButton, locked)
local item = { itemButton:GetParent():GetID(), itemButton:GetID() }
if self:Send_Attached(item) then
if self:SendMail_Attached(item) then
return self.hooks['SetItemButtonDesaturated'].orig(itemButton, true)
end
return self.hooks['SetItemButtonDesaturated'].orig(itemButton, locked)
@@ -368,14 +388,14 @@ end
function Postal:UseContainerItem(bag, slot)
local item = {bag, slot}
if self:Send_Attached(item) then
if self:SendMail_Attached(item) then
return
end
if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() then
self.hooks['UseContainerItem'].orig(unpack(item))
elseif SendMailFrame:IsVisible() then
self:Send_AttachItem(item)
self:SendMail_AttachItem(item)
self.hooks['PickupContainerItem'].orig(unpack(item))
ClearCursor()
elseif TradeFrame:IsVisible() then
@@ -391,30 +411,7 @@ function Postal:UseContainerItem(bag, slot)
end
end
do
local lastPickedUp
function Postal:CURSOR_UPDATE()
lastPickedUp = nil
end
function Postal:CursorItem()
return CursorHasItem() and lastPickedUp
end
function Postal:PickupContainerItem(bag, slot)
local item = {bag, slot}
if self:Send_Attached(item) then
return
end
self:Wait(function()
lastPickedUp = item
end)
return self.hooks['PickupContainerItem'].orig(unpack(item))
end
end
function Postal:Send_Mailable(item)
function Postal:SendMail_Mailable(item)
-- PostalTooltip:ClearLines() TODO
PostalTooltip:SetBagItem(unpack(item))
for i=1,PostalTooltip:NumLines() do
@@ -426,7 +423,7 @@ function Postal:Send_Mailable(item)
return true
end
function Postal:Send_NumAttachments()
function Postal:SendMail_NumAttachments()
local num = 0
for i=1,ATTACHMENTS_MAX do
if getglobal('PostalAttachment'..i).item then
@@ -436,7 +433,7 @@ function Postal:Send_NumAttachments()
return num
end
function Postal:Send_Attachments()
function Postal:SendMail_Attachments()
local arr = {}
for i = 1,ATTACHMENTS_MAX do
local btn = getglobal('PostalAttachment' .. i)
@@ -447,7 +444,7 @@ function Postal:Send_Attachments()
return arr
end
function Postal:Send_Clear()
function Postal:SendMail_Clear()
for i=1,ATTACHMENTS_MAX do
getglobal('PostalAttachment'..i).item = nil
end
@@ -461,21 +458,21 @@ function Postal:Send_Clear()
end
function Postal:SendMailFrame_CanSend()
if strlen(SendMailNameEditBox:GetText()) > 0 and (SendMailSendMoneyButton:GetChecked() and MoneyInputFrame_GetCopper(SendMailMoney) or 0) + GetSendMailPrice() * max(1, self:Send_NumAttachments()) <= GetMoney() then
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 Postal:Send_SendMail()
local item = tremove(self.Send_State.attachments, 1)
function Postal:SendMail_Send()
local item = tremove(self.SendMail_State.attachments, 1)
if item or self.Send_State.first then
local subject = self.Send_State.subject
if item or self.SendMail_State.first then
local subject = self.SendMail_State.subject
subject = subject ~= '' and subject or '[No Subject]'
if self.Send_State.total > 1 then
subject = subject..format(' (Part %d of %d)', self.Send_State.total - getn(self.Send_State.attachments), self.Send_State.total)
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)
end
if item then
@@ -490,65 +487,24 @@ function Postal:Send_SendMail()
end
end
if self.Send_State.first then
self.Send_State.first = false
if self.SendMail_State.first then
self.SendMail_State.first = false
if self.Send_State.money then
if self.Send_State.cod then
SetSendMailCOD(self.Send_State.money)
if self.SendMail_State.money then
if self.SendMail_State.cod then
SetSendMailCOD(self.SendMail_State.money)
else
SetSendMailMoney(self.Send_State.money)
SetSendMailMoney(self.SendMail_State.money)
end
end
end
self.Send_Ready = nil
return SendMail(self.Send_State.to, subject, self.Send_State.body)
self.SendMail_Ready = nil
return SendMail(self.SendMail_State.to, subject, self.SendMail_State.body)
else
self.Send_State = nil
self.SendMail_State = nil
end
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 then
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 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 end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
else
DeleteInboxItem(i)
self:When(function() return GetInboxNumItems() < inboxCount end, function()
return self:Inbox_OpenItem(i, inboxCount, selected)
end)
end
end)
end
function Postal:InboxFrameItem_OnEnter()
local didSetTooltip
GameTooltip:SetOwner(this, 'ANCHOR_RIGHT')
@@ -580,36 +536,14 @@ function Postal:InboxFrameItem_OnEnter()
GameTooltip:Show()
end
function Postal:UI_ERROR_MESSAGE()
if event == 'UI_ERROR_MESSAGE' and (arg1 == ERR_INV_FULL or arg1 == ERR_ITEM_MAX_COUNT) then
if this.num then
if arg1 == ERR_INV_FULL then
self:Inbox_Abort()
self:Print('Postal: Inventory full. Aborting.', 1, 0, 0)
elseif arg1 == ERR_ITEM_MAX_COUNT then
self:Print('Postal: You already have the maximum amount of that item. Skipping.', 1, 0, 0)
if this.lastVal then
for key, va in this.id do
if va >= this.lastVal then
this.id[key] = va + 1
end
end
end
end
end
end
end
function Postal:Print(msg, r, g, b)
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b)
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
@@ -621,10 +555,52 @@ function Postal:Inbox_OpenSelected(all)
end
sort(selected)
end
self.Inbox_selectedItems = {}
self.Inbox_Opening = true
self:Inbox_Lock()
self:Inbox_OpenMail(selected)
self.Inbox_selectedItems = {}
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()