完成焦点等开发
This commit is contained in:
235
Mail.lua
235
Mail.lua
@@ -10,6 +10,9 @@ SFrames = SFrames or {}
|
||||
SFrames.Mail = {}
|
||||
local ML = SFrames.Mail
|
||||
SFramesDB = SFramesDB or {}
|
||||
if SFramesDB.mailContacts == nil then
|
||||
SFramesDB.mailContacts = {}
|
||||
end
|
||||
|
||||
-- Save original Blizzard functions BEFORE other addons (TurtleMail etc.) hook them.
|
||||
-- File-level locals are captured at load time, which is before later-alphabetical addons.
|
||||
@@ -219,6 +222,8 @@ local function CreateActionBtn(parent, text, w)
|
||||
end
|
||||
end)
|
||||
|
||||
btn:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
||||
|
||||
return btn
|
||||
end
|
||||
|
||||
@@ -1223,13 +1228,178 @@ local function BuildSendPanel()
|
||||
local labelW = 50
|
||||
local ebW = L.W - L.PAD * 2 - labelW - 6
|
||||
local toLabel = sp:CreateFontString(nil, "OVERLAY")
|
||||
toLabel:SetFont(font, 11, "OUTLINE"); toLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -6)
|
||||
toLabel:SetFont(font, 11, "OUTLINE"); toLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -32)
|
||||
toLabel:SetWidth(labelW); toLabel:SetJustifyH("RIGHT")
|
||||
toLabel:SetText("收件人:"); toLabel:SetTextColor(T.labelText[1], T.labelText[2], T.labelText[3])
|
||||
local toEB = CreateStyledEditBox(sp, ebW, 22)
|
||||
toEB:SetPoint("LEFT", toLabel, "RIGHT", 6, 0)
|
||||
f.toEditBox = toEB
|
||||
|
||||
-- Contact buttons
|
||||
local addContactBtn = CreateActionBtn(sp, "添加", 30)
|
||||
addContactBtn:SetHeight(22); addContactBtn:SetPoint("TOPRIGHT", sp, "TOPRIGHT", -L.PAD, -6)
|
||||
addContactBtn:SetScript("OnClick", function()
|
||||
local name = f.toEditBox:GetText()
|
||||
if name and name ~= "" then
|
||||
if not SFramesDB then
|
||||
SFramesDB = {}
|
||||
end
|
||||
if not SFramesDB.mailContacts then
|
||||
SFramesDB.mailContacts = {}
|
||||
end
|
||||
SFramesDB.mailContacts[name] = true
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88[Nanami-Mail]|r 已添加常用联系人: " .. name)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Contact management frame
|
||||
local contactFrame
|
||||
local function CreateContactFrame()
|
||||
if contactFrame then return end
|
||||
|
||||
contactFrame = CreateFrame("Frame", "SFramesMailContactFrame", UIParent)
|
||||
if not contactFrame then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFF6666[Nanami-Mail]|r 创建联系人管理窗口失败")
|
||||
return
|
||||
end
|
||||
contactFrame:SetWidth(250)
|
||||
contactFrame:SetHeight(300)
|
||||
contactFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||
contactFrame:SetBackdrop({
|
||||
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 12,
|
||||
insets = { left = 3, right = 3, top = 3, bottom = 3 }
|
||||
})
|
||||
contactFrame:SetBackdropColor(0.1, 0.1, 0.1, 0.95)
|
||||
contactFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
|
||||
contactFrame:SetFrameStrata("DIALOG")
|
||||
contactFrame:SetMovable(true)
|
||||
contactFrame:EnableMouse(true)
|
||||
contactFrame:RegisterForDrag("LeftButton")
|
||||
contactFrame:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||
contactFrame:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
|
||||
contactFrame:Hide()
|
||||
|
||||
-- Title
|
||||
local title = contactFrame:CreateFontString(nil, "OVERLAY")
|
||||
title:SetFont(GetFont(), 12, "OUTLINE")
|
||||
title:SetPoint("TOP", contactFrame, "TOP", 0, -10)
|
||||
title:SetText("|cFFFFCC00常用联系人管理|r")
|
||||
|
||||
-- Close button
|
||||
local closeBtn = CreateActionBtn(contactFrame, "X", 20)
|
||||
closeBtn:SetHeight(20)
|
||||
closeBtn:SetPoint("TOPRIGHT", contactFrame, "TOPRIGHT", -5, -5)
|
||||
closeBtn:SetScript("OnClick", function() contactFrame:Hide() end)
|
||||
|
||||
-- Scroll frame
|
||||
local scrollFrame = CreateFrame("ScrollFrame", nil, contactFrame)
|
||||
if not scrollFrame then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFF6666[Nanami-Mail]|r 创建滚动框架失败")
|
||||
return
|
||||
end
|
||||
scrollFrame:SetWidth(230)
|
||||
scrollFrame:SetHeight(240)
|
||||
scrollFrame:SetPoint("TOPLEFT", contactFrame, "TOPLEFT", 10, -30)
|
||||
|
||||
local scrollChild = CreateFrame("Frame", nil, scrollFrame)
|
||||
if not scrollChild then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFF6666[Nanami-Mail]|r 创建滚动子框架失败")
|
||||
return
|
||||
end
|
||||
scrollChild:SetWidth(210)
|
||||
scrollChild:SetHeight(1)
|
||||
scrollFrame:SetScrollChild(scrollChild)
|
||||
|
||||
-- Refresh function
|
||||
contactFrame.Refresh = function()
|
||||
if not SFramesDB then SFramesDB = {} end
|
||||
if not SFramesDB.mailContacts then SFramesDB.mailContacts = {} end
|
||||
|
||||
-- Clear existing buttons
|
||||
for _, child in ipairs({scrollChild:GetChildren()}) do
|
||||
child:Hide()
|
||||
child:SetParent(nil)
|
||||
child = nil
|
||||
end
|
||||
|
||||
-- Create contact buttons
|
||||
local contacts = SFramesDB.mailContacts
|
||||
local y = 0
|
||||
for name in pairs(contacts) do
|
||||
local contactBtn = CreateActionBtn(scrollChild, name, 180)
|
||||
contactBtn:SetHeight(20)
|
||||
contactBtn:SetPoint("TOPLEFT", scrollChild, "TOPLEFT", 0, -y)
|
||||
contactBtn.contactName = name
|
||||
contactBtn:SetScript("OnClick", function()
|
||||
if this.contactName and f.toEditBox then
|
||||
f.toEditBox:SetText(this.contactName)
|
||||
contactFrame:Hide()
|
||||
end
|
||||
end)
|
||||
|
||||
local deleteBtn = CreateActionBtn(scrollChild, "×", 20)
|
||||
deleteBtn:SetHeight(20)
|
||||
deleteBtn:SetPoint("LEFT", contactBtn, "RIGHT", 5, 0)
|
||||
deleteBtn.contactName = name
|
||||
deleteBtn:SetScript("OnClick", function()
|
||||
if this.contactName then
|
||||
SFramesDB.mailContacts[this.contactName] = nil
|
||||
contactFrame:Refresh()
|
||||
end
|
||||
end)
|
||||
|
||||
y = y + 25
|
||||
end
|
||||
|
||||
scrollChild:SetHeight(math.max(1, y))
|
||||
|
||||
-- No contacts message
|
||||
if not next(contacts) then
|
||||
local noContacts = scrollChild:CreateFontString(nil, "OVERLAY")
|
||||
noContacts:SetFont(GetFont(), 11, "OUTLINE")
|
||||
noContacts:SetPoint("TOP", scrollChild, "TOP", 0, -10)
|
||||
noContacts:SetText("|cFF999999常用联系人列表为空|r")
|
||||
end
|
||||
end
|
||||
|
||||
-- Add contact section
|
||||
local addLabel = contactFrame:CreateFontString(nil, "OVERLAY")
|
||||
addLabel:SetFont(GetFont(), 11, "OUTLINE")
|
||||
addLabel:SetPoint("BOTTOMLEFT", contactFrame, "BOTTOMLEFT", 10, 40)
|
||||
addLabel:SetText("添加新联系人:")
|
||||
|
||||
local addEditBox = CreateStyledEditBox(contactFrame, 150, 20)
|
||||
addEditBox:SetPoint("BOTTOMLEFT", contactFrame, "BOTTOMLEFT", 10, 15)
|
||||
|
||||
local addBtn = CreateActionBtn(contactFrame, "添加", 60)
|
||||
addBtn:SetHeight(20)
|
||||
addBtn:SetPoint("BOTTOMRIGHT", contactFrame, "BOTTOMRIGHT", -10, 15)
|
||||
addBtn:SetScript("OnClick", function()
|
||||
local name = addEditBox:GetText()
|
||||
if name and name ~= "" then
|
||||
if not SFramesDB then SFramesDB = {} end
|
||||
if not SFramesDB.mailContacts then SFramesDB.mailContacts = {} end
|
||||
SFramesDB.mailContacts[name] = true
|
||||
addEditBox:SetText("")
|
||||
contactFrame:Refresh()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local manageContactBtn = CreateActionBtn(sp, "管理", 30)
|
||||
manageContactBtn:SetHeight(22); manageContactBtn:SetPoint("RIGHT", addContactBtn, "LEFT", -4, 0)
|
||||
manageContactBtn:SetScript("OnClick", function()
|
||||
CreateContactFrame()
|
||||
if contactFrame then
|
||||
contactFrame:Refresh()
|
||||
contactFrame:Show()
|
||||
else
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFF6666[Nanami-Mail]|r 无法创建联系人管理窗口")
|
||||
end
|
||||
end)
|
||||
|
||||
-- Autocomplete dropdown for recipient
|
||||
local AC_MAX = 8
|
||||
local acBox = CreateFrame("Frame", "SFramesMailAutoComplete", f)
|
||||
@@ -1297,6 +1467,13 @@ local function BuildSendPanel()
|
||||
seen[name] = true
|
||||
end
|
||||
|
||||
-- Add mail contacts first
|
||||
if SFramesDB and SFramesDB.mailContacts then
|
||||
for name in pairs(SFramesDB.mailContacts) do
|
||||
addName(name, "contact")
|
||||
end
|
||||
end
|
||||
|
||||
for fi = 1, GetNumFriends() do
|
||||
local name = GetFriendInfo(fi)
|
||||
addName(name, "friend")
|
||||
@@ -1318,7 +1495,9 @@ local function BuildSendPanel()
|
||||
local r = results[ai]
|
||||
local col = T.whoColor
|
||||
local tag = ""
|
||||
if r.source == "friend" then
|
||||
if r.source == "contact" then
|
||||
col = { 1, 1, 0.3 }; tag = " |cFFFFCC00[常用]|r"
|
||||
elseif r.source == "friend" then
|
||||
col = T.friendColor; tag = " |cFF66FF88[好友]|r"
|
||||
elseif r.source == "guild" then
|
||||
col = T.guildColor; tag = " |cFF66CCFF[公会]|r"
|
||||
@@ -1343,7 +1522,7 @@ local function BuildSendPanel()
|
||||
|
||||
-- Subject (second line, aligned with recipient)
|
||||
local subLabel = sp:CreateFontString(nil, "OVERLAY")
|
||||
subLabel:SetFont(font, 11, "OUTLINE"); subLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -32)
|
||||
subLabel:SetFont(font, 11, "OUTLINE"); subLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -60)
|
||||
subLabel:SetWidth(labelW); subLabel:SetJustifyH("RIGHT")
|
||||
subLabel:SetText("主题:"); subLabel:SetTextColor(T.labelText[1], T.labelText[2], T.labelText[3])
|
||||
local subEB = CreateStyledEditBox(sp, ebW, 22)
|
||||
@@ -1355,7 +1534,7 @@ local function BuildSendPanel()
|
||||
|
||||
-- Body
|
||||
local bodyLabel = sp:CreateFontString(nil, "OVERLAY")
|
||||
bodyLabel:SetFont(font, 11, "OUTLINE"); bodyLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -58)
|
||||
bodyLabel:SetFont(font, 11, "OUTLINE"); bodyLabel:SetPoint("TOPLEFT", sp, "TOPLEFT", L.PAD, -88)
|
||||
bodyLabel:SetText("正文:"); bodyLabel:SetTextColor(T.labelText[1], T.labelText[2], T.labelText[3])
|
||||
|
||||
local bsf = CreateFrame("ScrollFrame", "SFramesMailBodyScroll", sp, "UIPanelScrollFrameTemplate")
|
||||
@@ -1620,6 +1799,54 @@ function ML:ShowSendPanel()
|
||||
ML:UpdateSendPanel()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Slash commands for mail contacts
|
||||
--------------------------------------------------------------------------------
|
||||
SLASH_MAILCONTACT1 = "/mailcontact"
|
||||
SLASH_MAILCONTACT2 = "/mailcontacts"
|
||||
SlashCmdList["MAILCONTACT"] = function(msg)
|
||||
if not SFramesDB then
|
||||
SFramesDB = {}
|
||||
end
|
||||
if not SFramesDB.mailContacts then
|
||||
SFramesDB.mailContacts = {}
|
||||
end
|
||||
|
||||
local cmd, arg = string.match(msg, "^(%S*)%s*(.-)$")
|
||||
cmd = string.lower(cmd)
|
||||
|
||||
if cmd == "add" and arg ~= "" then
|
||||
SFramesDB.mailContacts[arg] = true
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88[Nanami-Mail]|r 已添加常用联系人: " .. arg)
|
||||
elseif cmd == "remove" and arg ~= "" then
|
||||
if SFramesDB.mailContacts[arg] then
|
||||
SFramesDB.mailContacts[arg] = nil
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88[Nanami-Mail]|r 已删除常用联系人: " .. arg)
|
||||
else
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFF6666[Nanami-Mail]|r 常用联系人中不存在: " .. arg)
|
||||
end
|
||||
elseif cmd == "list" then
|
||||
local contacts = SFramesDB.mailContacts
|
||||
if next(contacts) then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFCC00[Nanami-Mail]|r 常用联系人列表:")
|
||||
for name in pairs(contacts) do
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88- |r" .. name)
|
||||
end
|
||||
else
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFCC00[Nanami-Mail]|r 常用联系人列表为空")
|
||||
end
|
||||
elseif cmd == "clear" then
|
||||
SFramesDB.mailContacts = {}
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88[Nanami-Mail]|r 已清空常用联系人列表")
|
||||
else
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFCC00[Nanami-Mail]|r 常用联系人命令:")
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88/mailcontact add <name>|r - 添加常用联系人")
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88/mailcontact remove <name>|r - 删除常用联系人")
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88/mailcontact list|r - 查看常用联系人列表")
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cFF66FF88/mailcontact clear|r - 清空常用联系人列表")
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Bootstrap
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user