Files
benilla-octo/crates/benilla-app/assets/ui/MailFrame.xml
T
SamandClaude Fable 5 a683d5524f the interface code is ours: the transcription debt is paid
- forty files that carried the reference's literal Lua are rewritten as our own expression of the behaviour — worst identical run 61 lines down to 7 — and the README now says exactly that
- the overlap gate measures the code itself across all four reference corpora, and ratchets: the number may only go down
- a lost session ends at the login screen instead of silently re-authenticating and stealing the account back
- a building's skybox is a real model: Caverns of Time's white ceiling becomes its painted nebula and additive stars

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 19:21:03 +07:00

1567 lines
106 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Ui>
<!--
benilla's mail window (decision 0544 P1/P2). The geometry/art/texcoords below are QUOTED
VERBATIM from the reference `MailFrame.xml` (WoW/_extracted_framexml/MailFrame.xml; line cites
inline) — sizes, offsets, anchors, art files, texcoords, insets — adapted ONLY in (a) naming
(every `Foo` → `BenillaFoo`) and (b) feed/intent wiring onto the Era mail API
(`benilla-ui/src/script/mail.rs`) + `crate::ui_mail`'s feed/drain. The house dressing
convention (decisions 0084/0112/0120).
THE LUA IS OURS. The reference's `MailFrame.lua` is the SPECIFICATION — the function names an
addon can call, the event vocabulary, and every branch's observable effect are read off it,
and the line cites in the script block are that file's. How any of it is spelled is this
file's own business, and several pieces are deliberately not spelled its way.
Where the reference inherits a shared template benilla does NOT ship (UIPanelButtonTemplate,
UIPanelCloseButton, ItemButtonTemplate, SmallMoneyFrameTemplate, MoneyInputFrameTemplate,
UIRadioButtonTemplate, FriendsFrameTabTemplate, UIPanelScrollFrameTemplate — grep-verified
MISSING), the template body is inlined with the reference's own geometry/art and the ref
ANCHORS/sizes kept exactly; the tab pair inherits benilla's CharacterFrameTabButtonTemplate at
the reference tab anchors. `MailTextFontNormal`/`GameFontRedSmall` DO ship and are used verbatim.
RENDER APPROXIMATIONS (the only geometry-affecting deviations; every other measurement in the
markup below is the reference's own):
· Unread/read row **desaturation**: the engine has no `SetDesaturation`, so the read icon +
slot ring grey via vertex color (0.5) — ref MailFrame.lua l.130-141's SetVertexColor legs
are exact, only the icon's desaturation is the vertex-grey stand-in.
· The **body scroll**: `OpenMail/SendMailScrollFrame` (296×257 at 21,-97) is transcribed as a
plain Frame at that exact rect with the body FontString/EditBox INSIDE it (no live
scrollbar); a very long letter clips. The stationery backdrop + scrollbar-art geometry are
kept verbatim, and the ref template's slider (UIPanelScrollFrameTemplate) is quoted at
REST as inert art — disabled arrows + parked knob at the ref slider anchors — so the
trough's authored button recesses don't read as holes.
· `<HitRectInsets>` is quoted verbatim for fidelity but is currently inert (the loader
ignores the element).
NAMED OMISSIONS (decision 0544, each a follow-up, NOT rendered): the stationery PICKER
(StationeryPopupFrame, ref l.1122-1304), recipient autocomplete, the auction INVOICE pane's
content (ref l.1556-1727 — the frame is dropped, not just hidden), and the cursor-MONEY
drop onto the send slot. Popup embedded money frames are v1-inert (the shared StaticPopup
engine), so the confirm popups show text only. (The OpenMailLetterButton /
CMSG_MAIL_CREATE_TEXT_ITEM, once on this list, is implemented — ref l.1732-1757.)
-->
<Script><![CDATA[
BENILLA_INBOXITEMS_TO_DISPLAY = 7 -- INBOXITEMS_TO_DISPLAY (ref MailFrame.lua l.1)
BENILLA_MAX_COD_AMOUNT = 10000 -- MAX_COD_AMOUNT (ref l.6)
BENILLA_STATIONERY_PATH = "Interface\\Stationery\\" -- STATIONERY_PATH (ref l.5)
-- The money entry uses the shared BenillaMoneyInput_* kit (MerchantFrame.xml, loaded first) —
-- the send tab's three numeric edit boxes are named SendMailMoneyGold/Silver/Copper.
-- ── Load / event dispatch (ref MailFrame_Onload l.8-24 / MailFrame_OnEvent l.26-62) ──────
function BenillaMailFrame_OnLoad(frame)
frame.pageNum = 1
PanelTemplates_SetNumTabs(frame, 2)
PanelTemplates_SetTab(frame, 1)
frame:RegisterEvent("MAIL_SHOW")
frame:RegisterEvent("MAIL_INBOX_UPDATE")
frame:RegisterEvent("MAIL_CLOSED")
frame:RegisterEvent("MAIL_SEND_SUCCESS")
frame:RegisterEvent("MAIL_FAILED")
-- The send tab's player-money purse (ref SmallMoneyFrameTemplate refreshes itself on
-- PLAYER_MONEY; the merchant-window precedent).
frame:RegisterEvent("PLAYER_MONEY")
end
function MailFrame_OnEvent()
local frame = this
if event == "MAIL_SHOW" then
ShowUIPanel(frame)
if not frame:IsVisible() then
CloseMail()
return
end
OpenBackpack()
SendMailFrame_Update()
MailFrameTab_OnClick(1)
CheckInbox() -- drains to CMSG_GET_MAIL_LIST (throttled app-side, wow-re §5)
elseif event == "MAIL_INBOX_UPDATE" then
InboxFrame_Update()
OpenMail_Update()
elseif event == "MAIL_SEND_SUCCESS" then
-- Fires on a successful send AND, byte-verified, on window open (the compose-tab
-- reset side effect — wow-re §5); either way reset the form + play the page turn.
SendMailFrame_Reset()
PlaySound("igAbiliityPageTurn")
if SendMailFrame.sendMode == "reply" then
MailFrameTab_OnClick(1)
end
elseif event == "MAIL_FAILED" then
-- Fires on EVERY SMSG_SEND_MAIL_RESULT for a send (success included, wow-re §5): its
-- only job is to re-enable the button so the UI never stays blocked.
SendMailMailButton:Enable()
elseif event == "MAIL_CLOSED" then
HideUIPanel(frame)
elseif event == "PLAYER_MONEY" then
-- Repaints the purse AND recolors the postage cost (ref: both money frames
-- self-refresh on this event).
SendMailFrame_Update()
end
end
-- THE TWO SKINS the window wears (ref MailFrameTab_OnClick l.64-93). The inbox is dressed in
-- the item-text parchment, the compose form in the class-trainer panel; four corner slabs
-- and the top-left slab's own offset are the whole of the difference between them, so they
-- are a table here rather than two copies of the same five calls. `$parentTopLeft` and its
-- siblings publish as MailFrameTopLeft…, which is what the corner keys compose.
local mailSkin = {
inbox = {
TopLeft = "Interface\\ItemTextFrame\\UI-ItemText-TopLeft",
TopRight = "Interface\\Spellbook\\UI-SpellbookPanel-TopRight",
BotLeft = "Interface\\ItemTextFrame\\UI-ItemText-BotLeft",
BotRight = "Interface\\Spellbook\\UI-SpellbookPanel-BotRight",
x = 0, y = 0,
},
compose = {
TopLeft = "Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopLeft",
TopRight = "Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopRight",
BotLeft = "Interface\\ClassTrainerFrame\\UI-ClassTrainer-BotLeft",
BotRight = "Interface\\ClassTrainerFrame\\UI-ClassTrainer-BotRight",
-- The trainer art does not sit flush the way the parchment does; the ref's own
-- one-pixel nudge is what lines the two skins' outer edges up.
x = 2, y = -1,
},
}
local mailCorners = { "TopLeft", "TopRight", "BotLeft", "BotRight" }
-- Tab 1 is the inbox; anything else is the compose form.
function MailFrameTab_OnClick(tab)
if not tab then tab = this:GetID() end
PanelTemplates_SetTab(MailFrame, tab)
local reading = (tab == 1)
if reading then
InboxFrame:Show()
SendMailFrame:Hide()
else
InboxFrame:Hide()
SendMailFrame:Show()
end
local skin = reading and mailSkin.inbox or mailSkin.compose
for _, corner in ipairs(mailCorners) do
getglobal("MailFrame" .. corner):SetTexture(skin[corner])
end
MailFrameTopLeft:SetPoint("TOPLEFT", "MailFrame", "TOPLEFT", skin.x, skin.y)
if not reading then
-- Arriving at the form repaints it and clears the mode a Reply had set.
SendMailFrame_Update()
SendMailFrame.sendMode = "send"
end
PlaySound("igSpellBookOpen")
end
-- ── Inbox (ref InboxFrame_Update l.97-199): the row's clickable child is $parentButton, so
-- every getglobal below reads MailItem<i>Button* / MailItem<i>Sender/Subject/ExpireTime. ─
function InboxFrame_Update()
local numItems = GetInboxNumItems()
local index = ((MailFrame.pageNum - 1) * BENILLA_INBOXITEMS_TO_DISPLAY) + 1
for i = 1, BENILLA_INBOXITEMS_TO_DISPLAY do
if index <= numItems then
local packageIcon, stationeryIcon, sender, subject, money, CODAmount, daysLeft, hasItem, wasRead, x, y, z, isGM = GetInboxHeaderInfo(index)
local icon
if packageIcon and not isGM then icon = packageIcon else icon = stationeryIcon end
if not sender then sender = "Unknown" end -- UNKNOWN
local button = getglobal("MailItem"..i.."Button")
button:Show()
button.index = index
button.hasItem = hasItem
getglobal("MailItem"..i.."ButtonIcon"):SetTexture(icon)
local subjectText = getglobal("MailItem"..i.."Subject")
subjectText:SetText(subject)
local senderText = getglobal("MailItem"..i.."Sender")
senderText:SetText(sender)
-- Unread gold / read grey (ref l.130-141; the read icon's SetDesaturation is our
-- vertex-grey stand-in — the engine has no desaturation).
if wasRead then
senderText:SetTextColor(0.75, 0.75, 0.75)
subjectText:SetTextColor(0.75, 0.75, 0.75)
getglobal("MailItem"..i.."ButtonSlot"):SetVertexColor(0.5, 0.5, 0.5)
getglobal("MailItem"..i.."ButtonIcon"):SetVertexColor(0.5, 0.5, 0.5)
else
senderText:SetTextColor(1.0, 0.82, 0) -- NORMAL_FONT_COLOR
subjectText:SetTextColor(1.0, 1.0, 1.0) -- HIGHLIGHT_FONT_COLOR
getglobal("MailItem"..i.."ButtonSlot"):SetVertexColor(1.0, 0.82, 0)
getglobal("MailItem"..i.."ButtonIcon"):SetVertexColor(1, 1, 1)
end
-- Expiry: green whole days, red under a day (ref l.142-149: GetText("DAYS_ABBR")
-- pluralizes — DAYS_ABBR "Day" / DAYS_ABBR_P1 "Days", GlobalStrings l.895-896;
-- the sub-day SecondsToTime is approximated as "< 1 day").
local expireTime = getglobal("MailItem"..i.."ExpireTime")
if daysLeft >= 1 then
local days = math.floor(daysLeft)
expireTime:SetText(string.format("|cff20ff20%d %s|r", days, days == 1 and "Day" or "Days"))
else
expireTime:SetText("|cffff2020< 1 day|r")
end
-- The expiry tooltip (ref l.150-155).
if InboxItemCanDelete(index) then
expireTime.tooltip = "Time until message is deleted" -- TIME_UNTIL_DELETED
else
expireTime.tooltip = "Time until message is returned" -- TIME_UNTIL_RETURNED
end
expireTime:Show()
-- COD tag (ref l.157-164) + money field.
if CODAmount > 0 then
getglobal("MailItem"..i.."ButtonCOD"):Show()
button.cod = CODAmount
else
getglobal("MailItem"..i.."ButtonCOD"):Hide()
button.cod = nil
end
if money > 0 then button.money = money else button.money = nil end
if InboxFrame.openMailID == index then
button:SetChecked(1)
else
button:SetChecked(nil)
end
else
getglobal("MailItem"..i.."Button"):Hide()
getglobal("MailItem"..i.."Sender"):SetText("")
getglobal("MailItem"..i.."Subject"):SetText("")
getglobal("MailItem"..i.."ExpireTime"):Hide()
end
index = index + 1
end
-- Page arrows (ref l.188-198): back is dead on the first page, forward is dead once
-- this page reaches the end of the list. `lastOnPage` is the list index this page's
-- last row would carry if it were full.
local lastOnPage = MailFrame.pageNum * BENILLA_INBOXITEMS_TO_DISPLAY
if MailFrame.pageNum == 1 then InboxPrevPageButton:Disable() else InboxPrevPageButton:Enable() end
if lastOnPage < numItems then InboxNextPageButton:Enable() else InboxNextPageButton:Disable() end
-- InboxCurrentPage is declared in the ref XML (l.329) but NO reference Lua ever writes
-- it — the real 1.12 window shows nothing there, so neither do we.
end
-- Row click: open / close the letter (ref InboxFrame_OnClick l.201-213; this = the button).
function InboxFrame_OnClick(index)
if this:GetChecked() then
InboxFrame.openMailID = index
OpenMail_Update()
ShowUIPanel(OpenMailFrame)
PlaySound("igSpellBookOpen")
else
InboxFrame.openMailID = 0
HideUIPanel(OpenMailFrame)
end
InboxFrame_Update()
end
-- Row hover: the enclosed item (SetInboxItem) + the enclosed-money / COD lines (ref
-- InboxFrameItem_OnEnter l.215-240; this = the button).
function InboxFrameItem_OnEnter()
local button = this
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
if button.hasItem then
GameTooltip:SetInboxItem(button.index)
end
if button.money then
if button.hasItem then GameTooltip:AddLine(" ") end
GameTooltip:AddLine("Enclosed amount", "", 1, 1, 1) -- ENCLOSED_MONEY
SetTooltipMoney(GameTooltip, button.money)
elseif button.cod then
if button.hasItem then GameTooltip:AddLine(" ") end
GameTooltip:AddLine("Cash on Delivery Amount:", "", 1, 1, 1) -- COD_AMOUNT
SetTooltipMoney(GameTooltip, button.cod)
end
GameTooltip:Show()
end
function InboxNextPage()
PlaySound("igMainMenuOptionCheckBoxOn")
MailFrame.pageNum = MailFrame.pageNum + 1
InboxFrame_Update()
end
function InboxPrevPage()
PlaySound("igMainMenuOptionCheckBoxOn")
MailFrame.pageNum = MailFrame.pageNum - 1
InboxFrame_Update()
end
-- ── Open letter (ref OpenMailFrame_OnHide l.256-272 / OpenMail_Update l.274-432) ─────────
function OpenMailFrame_OnHide()
StaticPopup_Hide("DELETE_MAIL")
if not InboxFrame.openMailID or InboxFrame.openMailID == 0 then
InboxFrame_Update()
PlaySound("igSpellBookClose")
return
end
local pkg, sta, sender, subject, money, cod, days, itemID, wasRead, wasReturned, textCreated = GetInboxHeaderInfo(InboxFrame.openMailID)
if money == 0 and not itemID and textCreated then
DeleteInboxItem(InboxFrame.openMailID)
end
InboxFrame.openMailID = 0
InboxFrame_Update()
PlaySound("igSpellBookClose")
end
function OpenMail_Update()
local id = InboxFrame.openMailID
if not id or id == 0 then return end
local packageIcon, stationeryIcon, sender, subject, money, CODAmount, daysLeft, hasItem, wasRead, wasReturned, textCreated, canReply = GetInboxHeaderInfo(id)
if not sender or not canReply then
OpenMailReplyButton:Disable()
else
OpenMailReplyButton:Enable()
end
if not sender then sender = "Unknown" end
OpenMailSender:SetText(sender)
OpenMailSubject:SetText(subject)
OpenMailFrameIcon:SetTexture(stationeryIcon) -- ref SetPortraitToTexture l.174
local bodyText, texture, isTakeable, isInvoice = GetInboxText(id)
OpenMailBodyText:SetText(bodyText)
if texture then
OpenStationeryBackgroundLeft:SetTexture(BENILLA_STATIONERY_PATH..texture.."1")
OpenStationeryBackgroundRight:SetTexture(BENILLA_STATIONERY_PATH..texture.."2")
end
local hasAttachments
-- The letter button — "make a permanent copy" (ref l.364-376): a takeable body not yet
-- copied shows the stationery icon; the package button chains off its RIGHT, else
-- collapses onto its LEFT so the row stays packed.
if isTakeable and not textCreated then
getglobal("OpenMailLetterButtonIcon"):SetTexture(stationeryIcon)
OpenMailLetterButton:Enable()
OpenMailLetterButton:Show()
OpenMailPackageButton:SetPoint("LEFT", "OpenMailLetterButton", "RIGHT", 10, 0)
hasAttachments = 1
else
OpenMailLetterButton:Hide()
OpenMailPackageButton:SetPoint("LEFT", "OpenMailLetterButton", "LEFT", 0, 0)
end
local name, itemTexture, count, quality, canUse = GetInboxItem(id)
if name then
OpenMailFrame.itemName = name
getglobal("OpenMailPackageButtonIcon"):SetTexture(itemTexture)
if (count or 1) > 1 then
getglobal("OpenMailPackageButtonCount"):SetText(count)
else
getglobal("OpenMailPackageButtonCount"):SetText("")
end
if canUse then
getglobal("OpenMailPackageButtonIcon"):SetVertexColor(1, 1, 1)
else
getglobal("OpenMailPackageButtonIcon"):SetVertexColor(1.0, 0.1, 0.1)
end
OpenMailPackageButton:Enable()
OpenMailPackageButton:Show()
OpenMailMoneyButton:SetPoint("LEFT", "OpenMailPackageButton", "RIGHT", 10, 0)
hasAttachments = 1
else
OpenMailFrame.itemName = nil
OpenMailPackageButton:Hide()
OpenMailMoneyButton:SetPoint("LEFT", "OpenMailPackageButton", "LEFT", 0, 0)
end
if CODAmount > 0 then OpenMailFrame.cod = CODAmount else OpenMailFrame.cod = nil end
if money == 0 then
OpenMailMoneyButton:Hide()
OpenMailFrame.money = nil
else
getglobal("OpenMailMoneyButtonIcon"):SetTexture("Interface\\Icons\\INV_Misc_Coin_01")
OpenMailMoneyButton:Enable()
OpenMailMoneyButton:Show()
OpenMailFrame.money = money
hasAttachments = 1
end
if InboxItemCanDelete(id) then
OpenMailDeleteButton:SetText("Delete") -- DELETE
else
OpenMailDeleteButton:SetText("Return") -- MAIL_RETURN
end
-- The caption + its two positions (ref l.422-431: BOTTOM -68,123 attachments / -5,123 none).
if hasAttachments then
OpenMailAttachmentText:SetText("Take Attachments:") -- TAKE_ATTACHMENTS
OpenMailAttachmentText:SetTextColor(1, 1, 1)
OpenMailAttachmentText:SetPoint("BOTTOM", "OpenMailFrame", "BOTTOM", -68, 123)
else
OpenMailAttachmentText:SetText("No Attachments") -- NO_ATTACHMENTS
OpenMailAttachmentText:SetTextColor(0.5, 0.5, 0.5)
OpenMailAttachmentText:SetPoint("BOTTOM", "OpenMailFrame", "BOTTOM", -5, 123)
end
end
-- Reply → Send tab, prefilled "RE: " (ref OpenMail_Reply l.434-447).
function OpenMail_Reply()
MailFrameTab_OnClick(2)
SendMailNameEditBox:SetText(OpenMailSender:GetText())
local subject = OpenMailSubject:GetText()
local prefix = "RE: " -- MAIL_REPLY_PREFIX.." "
if string.sub(subject, 1, string.len(prefix)) ~= prefix then
subject = prefix..subject
end
SendMailSubjectEditBox:SetText(subject)
SendMailBodyEditBox:SetFocus()
SendMailFrame.sendMode = "reply"
end
function OpenMail_Delete()
local id = InboxFrame.openMailID
if InboxItemCanDelete(id) then
if OpenMailFrame.itemName then
StaticPopup_Show("DELETE_MAIL", OpenMailFrame.itemName)
return
elseif OpenMailFrame.money then
StaticPopup_Show("DELETE_MONEY")
return
else
DeleteInboxItem(id)
end
else
ReturnInboxItem(id)
StaticPopup_Hide("COD_CONFIRMATION")
end
InboxFrame.openMailID = 0
HideUIPanel(OpenMailFrame)
end
function BenillaOpenMailMoneyButton_OnClick()
TakeInboxMoney(InboxFrame.openMailID)
end
-- Hovering the coins shows the plain money tooltip (ref OpenMailMoneyButton OnEnter
-- l.1823-1829: no header line, just the amount).
function BenillaOpenMailMoneyButton_OnEnter(button)
if OpenMailFrame.money then
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
SetTooltipMoney(GameTooltip, OpenMailFrame.money)
GameTooltip:Show()
end
end
-- The letter button: copy the body into a bag item (ref OpenMailLetterButton OnClick
-- l.1744-1747 → CMSG_MAIL_CREATE_TEXT_ITEM; the OK result stamps COPIED server-side, and
-- the list re-sync hides the button via textCreated).
function BenillaOpenMailLetterButton_OnClick()
TakeInboxTextItem(InboxFrame.openMailID)
PlaySound("igMainMenuOptionCheckBoxOn")
end
-- Take the item; a COD parcel confirms first (ref OpenMailPackageButton OnClick l.1778-1787).
function BenillaOpenMailPackageButton_OnClick()
if OpenMailFrame.cod then
StaticPopup_Show("COD_CONFIRMATION")
else
TakeInboxItem(InboxFrame.openMailID)
end
PlaySound("igMainMenuOptionCheckBoxOn")
end
function OpenMailPackage_OnEnter()
local button = this
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
GameTooltip:SetInboxItem(InboxFrame.openMailID)
if OpenMailFrame.cod then
SetTooltipMoney(GameTooltip, OpenMailFrame.cod)
end
GameTooltip:Show()
end
-- ── Send tab (ref SendMail* l.484-611 / l.936-960) ──────────────────────────────────────
function SendMailMailButton_OnClick()
local copper = BenillaMoneyInput_GetCopper("SendMailMoney")
if SendMailSendMoneyButton:GetChecked() then
SetSendMailCOD(0)
if copper > 0 then
StaticPopup_Show("SEND_MONEY", SendMailNameEditBox:GetText())
this:Disable()
return
end
SetSendMailMoney(0)
else
SetSendMailMoney(0)
SetSendMailCOD(copper)
end
SendMailFrame_SendMail()
this:Disable()
end
function SendMailFrame_SendMail()
SendMail(SendMailNameEditBox:GetText(), SendMailSubjectEditBox:GetText(), SendMailBodyEditBox:GetText())
end
function SendMailFrame_Update()
local itemName, itemTexture, stackCount, quality = GetSendMailItem()
getglobal("SendMailPackageButtonIcon"):SetTexture(itemTexture)
if (stackCount or 1) <= 1 then stackCount = "" end
if itemName then
SendMailCODButton:Enable()
SendMailCODButtonText:SetTextColor(1.0, 0.82, 0)
if SendMailSubjectEditBox:GetText() == "" or SendMailSubjectEditBox:GetText() == SendMailFrame.previousItem then
SendMailSubjectEditBox:SetText(itemName)
SendMailFrame.previousItem = itemName
end
else
if SendMailSubjectEditBox:GetText() == SendMailFrame.previousItem then
SendMailSubjectEditBox:SetText("")
end
SendMailFrame.previousItem = ""
SendMailRadioButton_OnClick(1)
SendMailCODButton:Disable()
SendMailCODButtonText:SetTextColor(0.5, 0.5, 0.5)
end
getglobal("SendMailPackageButtonCount"):SetText(stackCount)
BenillaMoney_Set("SendMailMoneyFrame", GetMoney())
-- The 30c postage (ref l.542-547); red when it exceeds the purse.
BenillaMoney_Set("SendMailCost", GetSendMailPrice())
if GetSendMailPrice() > GetMoney() then
BenillaMoney_SetColor("SendMailCost", 1.0, 0.1, 0.1)
else
BenillaMoney_SetColor("SendMailCost", 1.0, 1.0, 1.0)
end
SendMailFrame_CanSend()
end
function SendMailFrame_Reset()
SendMailNameEditBox:SetText("")
SendMailSubjectEditBox:SetText("")
SendMailBodyEditBox:SetText("")
BenillaMoneyInput_ResetMoney("SendMailMoney")
SendMailRadioButton_OnClick(1)
SendMailFrame_Update()
end
-- SendMailFrame_CanSend (ref l.564-598): name + subject required (stationery is always the
-- default here — the picker is omitted); a COD send additionally caps at 10,000g.
function SendMailFrame_CanSend()
local checks = 0
local checksRequired = 2
if string.len(SendMailNameEditBox:GetText()) > 0 then checks = checks + 1 end
if string.len(SendMailSubjectEditBox:GetText()) > 0 then checks = checks + 1 end
if SendMailCODButton:GetChecked() then
checksRequired = 3
if BenillaMoneyInput_GetCopper("SendMailMoney") > BENILLA_MAX_COD_AMOUNT * 10000 then
SendMailErrorText:Show()
SendMailErrorCoin:Show()
else
SendMailErrorText:Hide()
SendMailErrorCoin:Hide()
checks = checks + 1
end
else
SendMailErrorText:Hide()
SendMailErrorCoin:Hide()
end
if checks == checksRequired then
SendMailMailButton:Enable()
else
SendMailMailButton:Disable()
end
end
function SendMailRadioButton_OnClick(index)
if index == 1 then
SendMailSendMoneyButton:SetChecked(1)
SendMailCODButton:SetChecked(nil)
SendMailMoneyText:SetText("Amount to send:") -- AMOUNT_TO_SEND
else
SendMailSendMoneyButton:SetChecked(nil)
SendMailCODButton:SetChecked(1)
SendMailMoneyText:SetText("Cash on Delivery Amount:") -- COD_AMOUNT
end
PlaySound("igMainMenuOptionCheckBoxOn")
SendMailFrame_CanSend()
end
-- The send item slot: a cursor drop (ref SendMailPackageButton_OnClick l.709-721; the cursor
-- MONEY drop path is omitted with the cursor-money system).
function SendMailPackageButton_OnClick()
ClickSendMailItemButton()
SendMailFrame_Update()
end
-- ── The window-owned StaticPopups (ref StaticPopup.lua l.205/220/234/252; the DeathFrame.xml
-- house convention). Money frames omitted (the shared engine's money variant is inert). ──
StaticPopupDialogs["COD_CONFIRMATION"] = { -- l.205
text = "Accepting this item will cost:", -- COD_CONFIRMATION
button1 = "Accept",
button2 = "Cancel",
OnAccept = function() TakeInboxItem(InboxFrame.openMailID) end,
timeout = 0,
hideOnEscape = 1,
}
StaticPopupDialogs["DELETE_MAIL"] = { -- l.220
text = "Deleting this mail will also destroy %s", -- DELETE_MAIL_CONFIRMATION
button1 = "Accept",
button2 = "Cancel",
OnAccept = function()
DeleteInboxItem(InboxFrame.openMailID)
InboxFrame.openMailID = 0
HideUIPanel(OpenMailFrame)
end,
showAlert = 1,
timeout = 0,
hideOnEscape = 1,
}
StaticPopupDialogs["DELETE_MONEY"] = { -- l.234
text = "Deleting this mail will also destroy the enclosed money.", -- DELETE_MONEY_CONFIRMATION (money line omitted)
button1 = "Accept",
button2 = "Cancel",
OnAccept = function()
DeleteInboxItem(InboxFrame.openMailID)
InboxFrame.openMailID = 0
HideUIPanel(OpenMailFrame)
end,
showAlert = 1,
timeout = 0,
hideOnEscape = 1,
}
StaticPopupDialogs["SEND_MONEY"] = { -- l.252
text = "Really send %s the following amount?", -- SEND_MONEY_CONFIRMATION
button1 = "Accept",
button2 = "Cancel",
OnAccept = function()
if SetSendMailMoney(BenillaMoneyInput_GetCopper("SendMailMoney")) then
SendMailFrame_SendMail()
end
end,
OnCancel = function() SendMailMailButton:Enable() end,
timeout = 0,
hideOnEscape = 1,
}
]]></Script>
<!-- One inbox row (ref MailItemTemplate l.11-160): a 305×45 Frame (NOT clickable) holding the
two MailItemBorder slices, the brown divider, the sender/subject FontStrings, the ExpireTime
Button, and the $parentButton CheckButton that carries the icon + is the clickable/hover
target. -->
<Frame name="BenillaMailItemTemplate" virtual="true">
<Size><AbsDimension x="305" y="45"/></Size>
<Layers>
<Layer level="BACKGROUND">
<Texture file="Interface\MailFrame\MailItemBorder">
<Size><AbsDimension x="42" y="48"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
<TexCoords left="0" right="0.1640625" top="0" bottom="0.75"/>
</Texture>
<Texture file="Interface\MailFrame\MailItemBorder">
<Size><AbsDimension x="263" y="48"/></Size>
<Anchors><Anchor point="TOPRIGHT"/></Anchors>
<TexCoords left="0.1640625" right="1.0" top="0" bottom="0.75"/>
</Texture>
<Texture>
<Size><AbsDimension x="322" y="2"/></Size>
<Anchors>
<Anchor point="TOP" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="2"/></Offset></Anchor>
</Anchors>
<Color r="0.33" g="0.16" b="0" a=".3"/>
</Texture>
<FontString name="$parentSender" inherits="GameFontNormal" justifyH="LEFT">
<Size><AbsDimension x="200" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="47" y="-4"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="$parentSubject" inherits="GameFontHighlightSmall" justifyV="TOP" justifyH="LEFT">
<Size><AbsDimension x="248" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="$parentSender" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Button name="$parentExpireTime">
<Size><AbsDimension x="100" y="16"/></Size>
<Anchors><Anchor point="TOPRIGHT"><Offset><AbsDimension x="-4" y="-4"/></Offset></Anchor></Anchors>
<Scripts>
<OnEnter>
if ( not this.tooltip ) then return end
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetText(this.tooltip)
</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontHighlightSmall" justifyH="RIGHT"/>
<PushedTextOffset><AbsDimension x="0" y="0"/></PushedTextOffset>
</Button>
<CheckButton name="$parentButton" hidden="true">
<Size><AbsDimension x="37" y="37"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="4" y="-3"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentSlot" file="Interface\Buttons\UI-EmptySlot-White">
<Size><AbsDimension x="64" y="64"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
<Layer level="ARTWORK">
<Texture name="$parentIcon" setAllPoints="true"/>
<FontString name="$parentCOD" inherits="GameFontHighlightSmall" text="COD">
<Anchors><Anchor point="BOTTOM"><Offset><AbsDimension x="0" y="2"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>this:RegisterForClicks("LeftButtonUp", "RightButtonUp")</OnLoad>
<OnClick>InboxFrame_OnClick(this.index)</OnClick>
<OnEnter>InboxFrameItem_OnEnter()</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<CheckedTexture alphaMode="ADD" file="Interface\Buttons\CheckButtonHilight"/>
</CheckButton>
</Frames>
</Frame>
<!-- The Send-Money / COD radio pair template (ref SendMailRadioButtonTemplate l.4-10, inheriting
UIRadioButtonTemplate which benilla lacks — inlined with the real UI-RadioButton art). -->
<CheckButton name="BenillaSendMailRadioButtonTemplate" virtual="true">
<Size><AbsDimension x="16" y="16"/></Size>
<NormalTexture file="Interface\Buttons\UI-RadioButton"><TexCoords left="0" right="0.25" top="0" bottom="1"/></NormalTexture>
<CheckedTexture file="Interface\Buttons\UI-RadioButton"><TexCoords left="0.25" right="0.5" top="0" bottom="1"/></CheckedTexture>
<HighlightTexture file="Interface\Buttons\UI-RadioButton" alphaMode="ADD"><TexCoords left="0.5" right="0.75" top="0" bottom="1"/></HighlightTexture>
<Layers>
<Layer level="ARTWORK">
<FontString name="$parentText" inherits="GameFontNormalSmall" justifyH="LEFT">
<Anchors><Anchor point="LEFT" relativePoint="RIGHT"><Offset><AbsDimension x="2" y="0"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>
<Frame name="MailFrame" hidden="true">
<!-- ref MailFrame l.242-255: 384×512; ShowUIPanel slots it left. HitRectInsets quoted for
fidelity (currently inert — the loader ignores it). -->
<Size><AbsDimension x="384" y="512"/></Size>
<HitRectInsets><AbsInset left="0" right="30" top="0" bottom="70"/></HitRectInsets>
<Layers>
<Layer level="BACKGROUND">
<!-- ref l.257-269: the mail-icon portrait (window art, not a unit bake). -->
<Texture name="$parentPortrait" file="Interface\MailFrame\Mail-Icon">
<Size><AbsDimension x="58" y="58"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="10" y="-8"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
<Layer level="BORDER">
<!-- ref l.271-303: the four corner slabs (swapped per tab). -->
<Texture name="$parentTopLeft" file="Interface\ItemTextFrame\UI-ItemText-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture name="$parentTopRight" file="Interface\Spellbook\UI-SpellbookPanel-TopRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="$parentTopLeft" relativePoint="TOPRIGHT"/></Anchors>
</Texture>
<Texture name="$parentBotLeft" file="Interface\ItemTextFrame\UI-ItemText-BotLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="$parentTopLeft" relativePoint="BOTTOMLEFT"/></Anchors>
</Texture>
<Texture name="$parentBotRight" file="Interface\Spellbook\UI-SpellbookPanel-BotRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="$parentTopLeft" relativePoint="BOTTOMRIGHT"/></Anchors>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- ── Inbox (ref InboxFrame l.308-474) ───────────────────────────────────────────── -->
<Frame name="InboxFrame">
<Size><AbsDimension x="384" y="512"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
<Layers>
<Layer level="ARTWORK">
<FontString name="InboxTitleText" inherits="GameFontNormal" text="Inbox">
<Size><AbsDimension x="224" y="14"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="6" y="230"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="InboxCurrentPage" inherits="GameFontNormal">
<Size><AbsDimension x="192" y="0"/></Size>
<Anchors><Anchor point="BOTTOM"><Offset><AbsDimension x="-14" y="96"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Frame name="MailItem1" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="28" y="-80"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem2" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem1" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem3" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem2" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem4" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem3" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem5" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem4" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem6" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem5" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<Frame name="MailItem7" inherits="BenillaMailItemTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="MailItem6" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
</Frame>
<!-- ref InboxPrevPageButton l.407-439 / InboxNextPageButton l.440-472. -->
<Button name="InboxPrevPageButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="CENTER" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="50" y="104"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="ARTWORK">
<FontString inherits="GameFontNormal" justifyH="LEFT" text="Prev">
<Anchors><Anchor point="LEFT" relativePoint="RIGHT"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>this:Disable()</OnLoad>
<OnClick>InboxPrevPage()</OnClick>
</Scripts>
<NormalTexture file="Interface\Buttons\UI-SpellbookIcon-PrevPage-Up"/>
<PushedTexture file="Interface\Buttons\UI-SpellbookIcon-PrevPage-Down"/>
<DisabledTexture file="Interface\Buttons\UI-SpellbookIcon-PrevPage-Disabled"/>
<HighlightTexture file="Interface\Buttons\UI-Common-MouseHilight" alphaMode="ADD"/>
</Button>
<Button name="InboxNextPageButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="CENTER" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="314" y="104"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="ARTWORK">
<FontString inherits="GameFontNormal" justifyH="RIGHT" text="Next">
<Anchors><Anchor point="RIGHT" relativePoint="LEFT"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>this:Disable()</OnLoad>
<OnClick>InboxNextPage()</OnClick>
</Scripts>
<NormalTexture file="Interface\Buttons\UI-SpellbookIcon-NextPage-Up"/>
<PushedTexture file="Interface\Buttons\UI-SpellbookIcon-NextPage-Down"/>
<DisabledTexture file="Interface\Buttons\UI-SpellbookIcon-NextPage-Disabled"/>
<HighlightTexture file="Interface\Buttons\UI-Common-MouseHilight" alphaMode="ADD"/>
</Button>
</Frames>
</Frame>
<!-- ── Send Mail (ref SendMailFrame l.476-1053) ───────────────────────────────────── -->
<Frame name="SendMailFrame" hidden="true">
<Size><AbsDimension x="384" y="512"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="SendMailTitleText" inherits="GameFontNormal" text="Send Mail">
<Size><AbsDimension x="224" y="14"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="6" y="230"/></Offset></Anchor></Anchors>
</FontString>
<!-- ref SendMailErrorText l.497-501 + SendMailErrorCoin l.502-514. The ref
gives the error text NO XML anchor — its SetPoint lives in the frame's
OnLoad (ref l.1040), because MoneyText is declared in a LATER child
frame and anchors resolve at SetPoint time (an XML forward reference
silently lands on the parent). Kept verbatim in our OnLoad below. -->
<FontString name="SendMailErrorText" inherits="GameFontRedSmall" text="COD amount is too high." hidden="true">
<Size><AbsDimension x="0" y="10"/></Size>
</FontString>
<Texture name="SendMailErrorCoin" file="Interface\MoneyFrame\UI-MoneyIcons" hidden="true">
<Size><AbsDimension x="10" y="10"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="SendMailErrorText" relativePoint="RIGHT"><Offset><AbsDimension x="1" y="-1"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.25" top="0" bottom="1"/>
</Texture>
<!-- ref SendMailHorizontalBar l.515-540. -->
<Texture name="SendMailHorizontalBarLeft" file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="256" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="15" y="-350"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="1.0" top="0" bottom="0.25"/>
</Texture>
<Texture file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="75" y="16"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="SendMailHorizontalBarLeft" relativePoint="RIGHT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.29296875" top="0.25" bottom="0.5"/>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- ref SendMailScrollFrame l.544-661: the 296×257 scroll region at (21,-97) with
the stationery backdrop + scrollbar art; the body is a plain EditBox inside (no
live scrollbar — the render approximation). -->
<Frame name="SendMailScrollFrame">
<Size><AbsDimension x="296" y="257"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="21" y="-97"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="StationeryBackgroundLeft">
<Size><AbsDimension x="252" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture name="StationeryBackgroundRight">
<Size><AbsDimension x="64" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="StationeryBackgroundLeft" relativePoint="TOPRIGHT"/></Anchors>
</Texture>
</Layer>
<Layer level="ARTWORK">
<Texture file="Interface\PaperDollInfoFrame\UI-Character-ScrollBar">
<Size><AbsDimension x="31" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-2" y="5"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.484375" top="0" bottom="1.0"/>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-ScrollBar">
<Size><AbsDimension x="31" y="106"/></Size>
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="-2" y="-2"/></Offset></Anchor></Anchors>
<TexCoords left="0.515625" right="1.0" top="0" bottom="0.4140625"/>
</Texture>
</Layer>
<!-- The ref ScrollFrame inherits UIPanelScrollFrameTemplate: a live
Slider (TOPLEFT→TOPRIGHT 6,-16 / BOTTOMLEFT→BOTTOMRIGHT 6,16) with
16×16 up/down buttons capping it and a 16×16 knob (UIPanelTemplates
l.104-181). The body doesn't scroll here (the render approximation),
so the slider's RESTING look is quoted as inert art — both arrows in
their Disabled state, the knob parked at the slider top — filling
the recesses the trough art authors for them. -->
<Layer level="OVERLAY">
<Texture file="Interface\Buttons\UI-ScrollBar-ScrollUpButton-Disabled">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
<Texture file="Interface\Buttons\UI-ScrollBar-ScrollDownButton-Disabled">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
<Texture file="Interface\Buttons\UI-ScrollBar-Knob">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="6" y="-16"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- ref SendMailBodyEditBox l.616-649: 270×200 at (20,-10), 500 letters. -->
<EditBox name="SendMailBodyEditBox" letters="500" multiLine="true" enableMouse="true" autoFocus="false">
<Size><AbsDimension x="270" y="200"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="20" y="-10"/></Offset></Anchor></Anchors>
<FontString inherits="MailTextFontNormal"/>
<Scripts>
<OnMouseUp>
SendMailBodyEditBox:SetFocus()
if ( CursorHasItem() ) then SendMailPackageButton_OnClick() end
</OnMouseUp>
<OnEscapePressed>this:ClearFocus()</OnEscapePressed>
</Scripts>
</EditBox>
</Frames>
</Frame>
<!-- ref SendMailNameEditBox l.662-738: 122×20 at (105,-46) + the To label +
Common-Input-Border art. -->
<EditBox name="SendMailNameEditBox" letters="12" historyLines="0" autoFocus="false">
<Size><AbsDimension x="122" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="105" y="-46"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString inherits="GameFontNormal" text="To:" justifyH="RIGHT">
<Anchors><Anchor point="RIGHT" relativePoint="LEFT"><Offset><AbsDimension x="-12" y="0"/></Offset></Anchor></Anchors>
</FontString>
<Texture name="$parentLeft" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-8" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.0625" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentMiddle" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="100" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentLeft" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.0625" right="0.9375" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentRight" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentMiddle" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.9375" right="1.0" top="0" bottom="0.625"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnTabPressed>SendMailSubjectEditBox:SetFocus()</OnTabPressed>
<OnEditFocusLost>this:HighlightText(0, 0)</OnEditFocusLost>
<OnEnterPressed>SendMailSubjectEditBox:SetFocus()</OnEnterPressed>
<OnEscapePressed>SendMailNameEditBox:ClearFocus()</OnEscapePressed>
<OnTextChanged>SendMailFrame_CanSend()</OnTextChanged>
</Scripts>
<FontString inherits="ChatFontNormal"/>
</EditBox>
<!-- ref SendMailCostMoneyFrame l.739-767 (SmallMoneyFrameTemplate at TOPRIGHT
-46,-48; inlined as BenillaMoney coin slots, copper-first right-to-left, with
the SEND_MAIL_COST label). -->
<Frame name="SendMailCost">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="TOPRIGHT"><Offset><AbsDimension x="-46" y="-48"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString inherits="GameFontNormal" text="Cost:">
<Anchors><Anchor point="RIGHT" relativePoint="LEFT"><Offset><AbsDimension x="-56" y="0"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Frame name="$parentCoin1">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0.5" right="0.75" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
<Frame name="$parentCoin2">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="$parentCoin1" relativePoint="LEFT"><Offset><AbsDimension x="-4" y="0"/></Offset></Anchor></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0.25" right="0.5" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
<Frame name="$parentCoin3">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="$parentCoin2" relativePoint="LEFT"><Offset><AbsDimension x="-4" y="0"/></Offset></Anchor></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0" right="0.25" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
</Frames>
</Frame>
<!-- ref SendMailSubjectEditBox l.768-842: 237×20 below the name box, 64 letters. -->
<EditBox name="SendMailSubjectEditBox" letters="64" historyLines="0" autoFocus="false">
<Size><AbsDimension x="237" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="SendMailNameEditBox" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-3"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString inherits="GameFontNormal" text="Subject:" justifyH="RIGHT">
<Anchors><Anchor point="RIGHT" relativePoint="LEFT"><Offset><AbsDimension x="-12" y="0"/></Offset></Anchor></Anchors>
</FontString>
<Texture name="$parentLeft" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-8" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.0625" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentMiddle" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="221" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentLeft" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.0625" right="0.9375" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentRight" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentMiddle" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.9375" right="1.0" top="0" bottom="0.625"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnTabPressed>SendMailBodyEditBox:SetFocus()</OnTabPressed>
<OnEnterPressed>SendMailBodyEditBox:SetFocus()</OnEnterPressed>
<OnEscapePressed>SendMailSubjectEditBox:ClearFocus()</OnEscapePressed>
<OnTextChanged>SendMailFrame_CanSend()</OnTextChanged>
</Scripts>
<FontString inherits="ChatFontNormal"/>
</EditBox>
<!-- ref SendMailPackageButton l.843-962: 37×37 at BOTTOMLEFT (30,107), the
UI-Slot-Background plate, the SEND_MONEY label, the money input + radio pair. -->
<Button name="SendMailPackageButton">
<Size><AbsDimension x="37" y="37"/></Size>
<Anchors><Anchor point="BOTTOMLEFT"><Offset><AbsDimension x="30" y="107"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture file="Interface\Buttons\UI-Slot-Background">
<Size><AbsDimension x="39" y="39"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-2" y="2"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.640625" top="0" bottom="0.640625"/>
</Texture>
<Texture name="$parentIcon"><Size><AbsDimension x="37" y="37"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture>
<FontString name="SendMailMoneyText" inherits="GameFontNormalSmall" text="Amount to send:">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="49" y="-5"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
<Layer level="ARTWORK">
<FontString name="$parentCount" inherits="NumberFontNormal" justifyH="RIGHT">
<Anchors><Anchor point="BOTTOMRIGHT"><Offset><AbsDimension x="-5" y="2"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<!-- ref SendMailMoney l.892-905: MoneyInputFrameTemplate at BOTTOMLEFT
relativePoint BOTTOMRIGHT +15,1 — the template's three boxes +
Common-Input-Border art quoted verbatim (MoneyInputFrame.xml
l.3-260: gold 58×20 TOPLEFT, silver/copper 30×20 chained +26/+16;
each box's L slice 8×20 at (-5,0), R slice at RIGHT (gold 0,
silver/copper -10), M stretched between; coin 13×13 LEFT→RIGHT at
+2 (gold) / -8 (silver, copper)). -->
<Frame name="SendMailMoney">
<Size><AbsDimension x="176" y="18"/></Size>
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="15" y="1"/></Offset></Anchor></Anchors>
<Frames>
<EditBox name="$parentGold" historyLines="0" numeric="true" autoFocus="false">
<Size><AbsDimension x="58" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentLeft" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-5" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.0625" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentRight" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="RIGHT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.9375" right="1.0" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentMiddle" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="10" y="20"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentLeft" relativePoint="RIGHT"/>
<Anchor point="RIGHT" relativeTo="$parentRight" relativePoint="LEFT"/>
</Anchors>
<TexCoords left="0.0625" right="0.9375" top="0" bottom="0.625"/>
</Texture>
<Texture file="Interface\MoneyFrame\UI-MoneyIcons">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="LEFT" relativePoint="RIGHT"><Offset><AbsDimension x="2" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.25" top="0" bottom="1"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnTabPressed>getglobal(this:GetParent():GetName().."Silver"):SetFocus()</OnTabPressed>
<OnEnterPressed>getglobal(this:GetParent():GetName().."Silver"):SetFocus()</OnEnterPressed>
<OnEscapePressed>this:ClearFocus()</OnEscapePressed>
<OnTextChanged>SendMailFrame_CanSend()</OnTextChanged>
<OnEditFocusLost>this:HighlightText(0, 0)</OnEditFocusLost>
<OnEditFocusGained>this:HighlightText()</OnEditFocusGained>
</Scripts>
<FontString inherits="ChatFontNormal"/>
</EditBox>
<EditBox name="$parentSilver" letters="2" historyLines="0" numeric="true" autoFocus="false">
<Size><AbsDimension x="30" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentGold" relativePoint="RIGHT"><Offset><AbsDimension x="26" y="0"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentLeft" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-5" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.0625" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentRight" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="RIGHT"><Offset><AbsDimension x="-10" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.9375" right="1.0" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentMiddle" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="10" y="20"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentLeft" relativePoint="RIGHT"/>
<Anchor point="RIGHT" relativeTo="$parentRight" relativePoint="LEFT"/>
</Anchors>
<TexCoords left="0.0625" right="0.9375" top="0" bottom="0.625"/>
</Texture>
<Texture file="Interface\MoneyFrame\UI-MoneyIcons">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="LEFT" relativePoint="RIGHT"><Offset><AbsDimension x="-8" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.5" top="0" bottom="1"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnTabPressed>getglobal(this:GetParent():GetName().."Copper"):SetFocus()</OnTabPressed>
<OnEnterPressed>getglobal(this:GetParent():GetName().."Copper"):SetFocus()</OnEnterPressed>
<OnEscapePressed>this:ClearFocus()</OnEscapePressed>
<OnTextChanged>SendMailFrame_CanSend()</OnTextChanged>
<OnEditFocusLost>this:HighlightText(0, 0)</OnEditFocusLost>
<OnEditFocusGained>this:HighlightText()</OnEditFocusGained>
</Scripts>
<FontString inherits="ChatFontNormal"/>
</EditBox>
<EditBox name="$parentCopper" letters="2" historyLines="0" numeric="true" autoFocus="false">
<Size><AbsDimension x="30" y="20"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="$parentSilver" relativePoint="RIGHT"><Offset><AbsDimension x="16" y="0"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentLeft" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-5" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.0625" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentRight" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="8" y="20"/></Size>
<Anchors><Anchor point="RIGHT"><Offset><AbsDimension x="-10" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.9375" right="1.0" top="0" bottom="0.625"/>
</Texture>
<Texture name="$parentMiddle" file="Interface\Common\Common-Input-Border">
<Size><AbsDimension x="10" y="20"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentLeft" relativePoint="RIGHT"/>
<Anchor point="RIGHT" relativeTo="$parentRight" relativePoint="LEFT"/>
</Anchors>
<TexCoords left="0.0625" right="0.9375" top="0" bottom="0.625"/>
</Texture>
<Texture file="Interface\MoneyFrame\UI-MoneyIcons">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="LEFT" relativePoint="RIGHT"><Offset><AbsDimension x="-8" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.5" right="0.75" top="0" bottom="1"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnEscapePressed>this:ClearFocus()</OnEscapePressed>
<OnTextChanged>SendMailFrame_CanSend()</OnTextChanged>
<OnEditFocusLost>this:HighlightText(0, 0)</OnEditFocusLost>
<OnEditFocusGained>this:HighlightText()</OnEditFocusGained>
</Scripts>
<FontString inherits="ChatFontNormal"/>
</EditBox>
</Frames>
</Frame>
<!-- ref SendMailSendMoneyButton l.906-919 / SendMailCODButton l.920-933. -->
<CheckButton name="SendMailSendMoneyButton" inherits="BenillaSendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="185" y="-6"/></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Send Money")</OnLoad>
<OnClick>SendMailRadioButton_OnClick(1)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="SendMailCODButton" inherits="BenillaSendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="SendMailSendMoneyButton" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="1"/></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("C.O.D.")</OnLoad>
<OnClick>SendMailRadioButton_OnClick(2)</OnClick>
</Scripts>
</CheckButton>
</Frames>
<Scripts>
<OnClick>SendMailPackageButton_OnClick()</OnClick>
<OnReceiveDrag>SendMailPackageButton_OnClick()</OnReceiveDrag>
<OnEnter>
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
if ( GetSendMailItem() ) then
GameTooltip:SetSendMailItem()
else
GameTooltip:SetText("Attach an item to send.", 1.0, 1.0, 1.0)
end
</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
<HighlightTexture alphaMode="ADD" file="Interface\Buttons\ButtonHilight-Square"/>
</Button>
<!-- ref SendMailMoneyFrame l.993-1001: the PLAYER's money (SmallMoneyFrameTemplate,
BOTTOMRIGHT→BOTTOMLEFT 183,84) — it fills the recess authored into
UI-ClassTrainer-BotLeft left of the Send button (without it the recess reads
as a broken empty input box). Inlined as the BenillaMoney coin trio; fed
GetMoney() by SendMailFrame_Update + the PLAYER_MONEY event. -->
<Frame name="SendMailMoneyFrame">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="BOTTOMRIGHT" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="183" y="84"/></Offset></Anchor></Anchors>
<Frames>
<Frame name="$parentCoin1">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0.5" right="0.75" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
<Frame name="$parentCoin2">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="$parentCoin1" relativePoint="LEFT"><Offset><AbsDimension x="-4" y="0"/></Offset></Anchor></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0.25" right="0.5" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
<Frame name="$parentCoin3">
<Size><AbsDimension x="13" y="13"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="$parentCoin2" relativePoint="LEFT"><Offset><AbsDimension x="-4" y="0"/></Offset></Anchor></Anchors>
<Layers><Layer level="OVERLAY"><Texture name="$parentIcon" file="Interface\MoneyFrame\UI-MoneyIcons"><Size><AbsDimension x="13" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"/></Anchors><TexCoords left="0" right="0.25" top="0" bottom="1"/></Texture><FontString name="$parentNum" inherits="NumberFontNormal" justifyH="RIGHT"><Size><AbsDimension x="20" y="13"/></Size><Anchors><Anchor point="RIGHT" relativePoint="RIGHT"><Offset><AbsDimension x="-13" y="0"/></Offset></Anchor></Anchors></FontString></Layer></Layers>
</Frame>
</Frames>
</Frame>
<!-- ref SendMailCancelButton l.1002-1018 / SendMailMailButton l.1019-1035
(UIPanelButtonTemplate 80×22 at the ref offsets; inlined UI-Panel-Button art). -->
<Button name="SendMailCancelButton" text="Cancel">
<Size><AbsDimension x="80" y="22"/></Size>
<Anchors><Anchor point="BOTTOMRIGHT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="-39" y="80"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontNormalSmall"/><HighlightFont inherits="GameFontHighlightSmall"/><DisabledFont inherits="GameFontDisableSmall"/>
<Scripts><OnClick>HideUIPanel(MailFrame)</OnClick></Scripts>
</Button>
<Button name="SendMailMailButton" text="Send">
<Size><AbsDimension x="80" y="22"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="SendMailCancelButton" relativePoint="LEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<DisabledTexture file="Interface\Buttons\UI-Panel-Button-Disabled"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></DisabledTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontNormalSmall"/><HighlightFont inherits="GameFontHighlightSmall"/><DisabledFont inherits="GameFontDisableSmall"/>
<Scripts><OnClick>SendMailMailButton_OnClick()</OnClick></Scripts>
</Button>
</Frames>
<Scripts>
<!-- ref SendMailFrame OnLoad l.1038-1041: the error text's anchor is set HERE
because its target lives in a later-declared child frame (the OnLoad's
SetText sibling is inlined as the XML text= literal). -->
<OnLoad>
SendMailErrorText:SetPoint("BOTTOMLEFT", "SendMailMoneyText", "TOPLEFT", 0, 2)
</OnLoad>
<!-- ref SendMailFrame OnShow l.1042-1047: StationeryPopupButton_OnClick(1)
selects the default stationery and paints the compose backdrop with its
parchment (ref l.693-707, GetSelectedStationeryTexture → STATIONERYTEST —
the Stationery.dbc default, decision 0544). The picker itself is the named
omission; the default parchment is not. -->
<OnShow>
StationeryBackgroundLeft:SetTexture(BENILLA_STATIONERY_PATH.."STATIONERYTEST1")
StationeryBackgroundRight:SetTexture(BENILLA_STATIONERY_PATH.."STATIONERYTEST2")
SendMailNameEditBox:SetFocus()
SendMailRadioButton_OnClick(1)
</OnShow>
<OnMouseUp>
if ( CursorHasItem() ) then SendMailPackageButton_OnClick() end
</OnMouseUp>
</Scripts>
</Frame>
<!-- ref InboxCloseButton l.1055-1071 (UIPanelCloseButton at CENTER relativePoint TOPRIGHT
-45,-25; inlined UI-Panel-MinimizeButton art, the merchant precedent). -->
<Button name="MailCloseButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="CENTER" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-45" y="-25"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Up"/>
<PushedTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Down"/>
<HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
<Scripts><OnClick>HideUIPanel(MailFrame)</OnClick></Scripts>
</Button>
<!-- ref MailFrameTab1 l.1072-1085 / MailFrameTab2 l.1086-1099 (FriendsFrameTabTemplate at
BOTTOMLEFT 24,44, chained LEFT -8,0; inherits benilla's CharacterFrameTabButtonTemplate). -->
<Button name="$parentTab1" inherits="CharacterFrameTabButtonTemplate" text="Inbox">
<Anchors><Anchor point="BOTTOMLEFT"><Offset><AbsDimension x="24" y="44"/></Offset></Anchor></Anchors>
<Scripts><OnClick>MailFrameTab_OnClick(1)</OnClick></Scripts>
</Button>
<Button name="$parentTab2" inherits="CharacterFrameTabButtonTemplate" text="Send Mail">
<Anchors><Anchor point="LEFT" relativeTo="$parentTab1" relativePoint="RIGHT"><Offset><AbsDimension x="-8" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnClick>MailFrameTab_OnClick(2)</OnClick></Scripts>
</Button>
</Frames>
<Scripts>
<OnLoad>BenillaMailFrame_OnLoad(self)</OnLoad>
<OnEvent>MailFrame_OnEvent()</OnEvent>
<!-- ref MailFrame OnHide l.1108-1116 (StationeryPopupFrame omitted); OnShow adds
OpenBackpack + the panel sound (benilla's bag-with-window behavior). -->
<OnShow>OpenBackpack(); PlaySound("igCharacterInfoOpen")</OnShow>
<OnHide>
CloseMail()
CloseBackpack()
HideUIPanel(OpenMailFrame)
SendMailBodyEditBox:SetText("")
SendMailNameEditBox:SetText("")
SendMailSubjectEditBox:SetText("")
PlaySound("igCharacterInfoClose")
</OnHide>
</Scripts>
</Frame>
<!-- ── Open Mail (ref OpenMailFrame l.1306-1915) ──────────────────────────────────────────── -->
<Frame name="OpenMailFrame" hidden="true" enableMouse="true">
<Size><AbsDimension x="384" y="512"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="InboxFrame" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-10" y="0"/></Offset></Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<!-- ref OpenMailFrameIcon l.1319-1330 (Mail-Icon; SetTexture'd to the stationery icon
at runtime by OpenMail_Update). -->
<Texture name="OpenMailFrameIcon" file="Interface\MailFrame\Mail-Icon">
<Size><AbsDimension x="60" y="60"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="9" y="-6"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
<Layer level="BORDER">
<!-- ref OpenMailFrame corner slabs l.1333-1364. -->
<Texture name="OpenMailFrameTopLeft" file="Interface\ClassTrainerFrame\UI-ClassTrainer-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture name="OpenMailFrameTopRight" file="Interface\ClassTrainerFrame\UI-ClassTrainer-TopRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="OpenMailFrameTopLeft" relativePoint="TOPRIGHT"/></Anchors>
</Texture>
<Texture name="OpenMailFrameBotLeft" file="Interface\MailFrame\UI-OpenMail-BotLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="OpenMailFrameTopLeft" relativePoint="BOTTOMLEFT"/></Anchors>
</Texture>
<Texture name="OpenMailFrameBotRight" file="Interface\ClassTrainerFrame\UI-ClassTrainer-BotRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="OpenMailFrameTopLeft" relativePoint="BOTTOMRIGHT"/></Anchors>
</Texture>
</Layer>
<Layer level="ARTWORK">
<FontString name="OpenMailTitleText" inherits="GameFontNormal" text="Open Mail">
<Size><AbsDimension x="224" y="24"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="6" y="232"/></Offset></Anchor></Anchors>
</FontString>
<!-- ref OpenMailAttachmentText l.1379-1390 (moved by OpenMail_Update). -->
<FontString name="OpenMailAttachmentText" inherits="GameFontHighlightSmall" text="Take Attachments:">
<Size><AbsDimension x="120" y="0"/></Size>
<Anchors><Anchor point="BOTTOM"><Offset><AbsDimension x="-68" y="123"/></Offset></Anchor></Anchors>
</FontString>
<!-- ref OpenMailSenderLabel/Sender l.1391-1414. -->
<FontString name="OpenMailSenderLabel" inherits="GameFontHighlight" text="From:">
<Size><AbsDimension x="0" y="16"/></Size>
<Anchors><Anchor point="TOPRIGHT" relativePoint="TOPLEFT"><Offset><AbsDimension x="114" y="-45"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="OpenMailSender" inherits="GameFontNormal" justifyH="LEFT">
<Size><AbsDimension x="110" y="0"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="OpenMailSenderLabel" relativePoint="RIGHT"><Offset><AbsDimension x="5" y="0"/></Offset></Anchor></Anchors>
</FontString>
<!-- ref OpenMailSubjectLabel/Subject l.1415-1438. -->
<FontString name="OpenMailSubjectLabel" inherits="GameFontHighlight" text="Subject:">
<Size><AbsDimension x="0" y="16"/></Size>
<Anchors><Anchor point="TOPRIGHT" relativePoint="TOPLEFT"><Offset><AbsDimension x="114" y="-65"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="OpenMailSubject" inherits="GameFontNormalSmall" justifyH="LEFT" justifyV="TOP">
<Size><AbsDimension x="225" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="OpenMailSubjectLabel" relativePoint="TOPRIGHT"><Offset><AbsDimension x="5" y="-4"/></Offset></Anchor></Anchors>
</FontString>
<!-- ref OpenMailHorizontalBar l.1439-1464. -->
<Texture name="OpenMailHorizontalBarLeft" file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="256" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="15" y="-350"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="1.0" top="0" bottom="0.25"/>
</Texture>
<Texture file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="75" y="16"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="OpenMailHorizontalBarLeft" relativePoint="RIGHT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.29296875" top="0.25" bottom="0.5"/>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- ref OpenMailScrollFrame l.1468-1731 (296×257 at 21,-97; stationery backdrop + scrollbar
art quoted, the body a plain FontString inside — the render approximation; the auction
INVOICE sub-frame l.1556-1727 is a named omission, dropped). -->
<Frame name="OpenMailScrollFrame">
<Size><AbsDimension x="296" y="257"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="21" y="-97"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="OVERLAY">
<Texture file="Interface\PaperDollInfoFrame\UI-Character-ScrollBar">
<Size><AbsDimension x="31" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-2" y="5"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.484375" top="0" bottom="1.0"/>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-ScrollBar">
<Size><AbsDimension x="31" y="106"/></Size>
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="-2" y="-2"/></Offset></Anchor></Anchors>
<TexCoords left="0.515625" right="1.0" top="0" bottom="0.4140625"/>
</Texture>
<!-- The ref's UIPanelScrollFrameTemplate slider at rest, quoted as inert
art (see the send tab's twin for the geometry cites): disabled up/down
arrows capping the slider span, the knob parked at its top. -->
<Texture file="Interface\Buttons\UI-ScrollBar-ScrollUpButton-Disabled">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
<Texture file="Interface\Buttons\UI-ScrollBar-ScrollDownButton-Disabled">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
<Texture file="Interface\Buttons\UI-ScrollBar-Knob">
<Size><AbsDimension x="16" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="6" y="-16"/></Offset></Anchor></Anchors>
<TexCoords left="0.25" right="0.75" top="0.25" bottom="0.75"/>
</Texture>
</Layer>
<Layer level="BACKGROUND">
<Texture name="OpenStationeryBackgroundLeft">
<Size><AbsDimension x="252" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture name="OpenStationeryBackgroundRight">
<Size><AbsDimension x="64" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="OpenStationeryBackgroundLeft" relativePoint="TOPRIGHT"/></Anchors>
</Texture>
<!-- ref OpenMailBodyText l.1541-1552 (276 wide at 10,-10 in the scroll child). -->
<FontString name="OpenMailBodyText" inherits="MailTextFontNormal" justifyH="LEFT" justifyV="TOP">
<Size><AbsDimension x="276" y="240"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="10" y="-10"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
</Frame>
<!-- ref OpenMailLetterButton l.1732-1757 / OpenMailPackageButton l.1758-1796 /
OpenMailMoneyButton l.1797-1835 (ItemButtonTemplate; inlined 37px icon + slot +
count). The row chains letter → package → money off the attachment caption;
OpenMail_Update re-points the two followers as their predecessors show/hide. -->
<Button name="OpenMailLetterButton" hidden="true">
<Size><AbsDimension x="37" y="37"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="OpenMailAttachmentText" relativePoint="RIGHT"><Offset><AbsDimension x="5" y="0"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND"><Texture name="$parentSlot" file="Interface\Buttons\UI-EmptySlot"><Size><AbsDimension x="58" y="58"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
<Layer level="BORDER"><Texture name="$parentIcon"><Size><AbsDimension x="37" y="37"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
</Layers>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<Scripts>
<OnLoad>this:RegisterForClicks("LeftButtonUp", "RightButtonUp")</OnLoad>
<OnClick>BenillaOpenMailLetterButton_OnClick()</OnClick>
<OnEnter>GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetText("Click to make a permanent\ncopy of this letter.")</OnEnter> <!-- MAIL_LETTER_TOOLTIP -->
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
</Button>
<Button name="OpenMailPackageButton" hidden="true">
<Size><AbsDimension x="37" y="37"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="OpenMailLetterButton" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND"><Texture name="$parentSlot" file="Interface\Buttons\UI-EmptySlot"><Size><AbsDimension x="58" y="58"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
<Layer level="BORDER"><Texture name="$parentIcon"><Size><AbsDimension x="37" y="37"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
<Layer level="OVERLAY"><FontString name="$parentCount" inherits="NumberFontNormal" justifyH="RIGHT"><Anchors><Anchor point="BOTTOMRIGHT"><Offset><AbsDimension x="-2" y="2"/></Offset></Anchor></Anchors></FontString></Layer>
</Layers>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<Scripts>
<OnLoad>this:RegisterForClicks("LeftButtonUp", "RightButtonUp")</OnLoad>
<OnClick>BenillaOpenMailPackageButton_OnClick()</OnClick>
<OnEnter>OpenMailPackage_OnEnter()</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
</Button>
<Button name="OpenMailMoneyButton" hidden="true">
<Size><AbsDimension x="37" y="37"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="OpenMailPackageButton" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND"><Texture name="$parentSlot" file="Interface\Buttons\UI-EmptySlot"><Size><AbsDimension x="58" y="58"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
<Layer level="BORDER"><Texture name="$parentIcon"><Size><AbsDimension x="37" y="37"/></Size><Anchors><Anchor point="CENTER"/></Anchors></Texture></Layer>
</Layers>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<Scripts>
<OnLoad>this:RegisterForClicks("LeftButtonUp", "RightButtonUp")</OnLoad>
<OnClick>BenillaOpenMailMoneyButton_OnClick()</OnClick>
<OnEnter>BenillaOpenMailMoneyButton_OnEnter(self)</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
</Button>
<!-- ref OpenMailCancelButton l.1836-1852 / OpenMailDeleteButton l.1853-1869 /
OpenMailReplyButton l.1870-1886 (UIPanelButtonTemplate 80/82×22 at the ref offsets). -->
<Button name="OpenMailCancelButton" text="Close">
<Size><AbsDimension x="80" y="22"/></Size>
<Anchors><Anchor point="BOTTOMRIGHT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="-39" y="80"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontNormalSmall"/><HighlightFont inherits="GameFontHighlightSmall"/><DisabledFont inherits="GameFontDisableSmall"/>
<Scripts><OnClick>HideUIPanel(this:GetParent())</OnClick></Scripts>
</Button>
<Button name="OpenMailDeleteButton" text="Delete">
<Size><AbsDimension x="82" y="22"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="OpenMailCancelButton" relativePoint="LEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontNormalSmall"/><HighlightFont inherits="GameFontHighlightSmall"/><DisabledFont inherits="GameFontDisableSmall"/>
<Scripts><OnClick>OpenMail_Delete()</OnClick></Scripts>
</Button>
<Button name="OpenMailReplyButton" text="Reply">
<Size><AbsDimension x="82" y="22"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="OpenMailDeleteButton" relativePoint="LEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<DisabledTexture file="Interface\Buttons\UI-Panel-Button-Disabled"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></DisabledTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
<ButtonText name="$parentText"/>
<NormalFont inherits="GameFontNormalSmall"/><HighlightFont inherits="GameFontHighlightSmall"/><DisabledFont inherits="GameFontDisableSmall"/>
<Scripts><OnClick>OpenMail_Reply()</OnClick></Scripts>
</Button>
<!-- ref OpenMailCloseButton l.1887-1900 (UIPanelCloseButton at CENTER relativePoint
TOPRIGHT -47,-25; inlined UI-Panel-MinimizeButton art). -->
<Button name="OpenMailCloseButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="CENTER" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-47" y="-25"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Up"/>
<PushedTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Down"/>
<HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
<Scripts><OnClick>HideUIPanel(OpenMailFrame)</OnClick></Scripts>
</Button>
</Frames>
<Scripts>
<OnHide>OpenMailFrame_OnHide()</OnHide>
</Scripts>
</Frame>
</Ui>