完成焦点等开发

This commit is contained in:
rucky
2026-03-31 18:03:23 +08:00
parent c7dd0f4848
commit 6e18269bfd
34 changed files with 6803 additions and 542 deletions

235
Mail.lua
View File

@@ -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
--------------------------------------------------------------------------------