mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-21 23:26:56 +00:00
9daf6165fd
The friend right-click menu only opens for online players, so notes could not be edited on offline friends. The full menu is useless offline anyway (Whisper/Invite/Target need an online player), so open a menu of our own with just the note editor for offline friends.
94 lines
3.6 KiB
Lua
94 lines
3.6 KiB
Lua
-- Friend notes
|
|
-- Client-side notes for friends via ClassicAPI's C_FriendList note API
|
|
-- (SetFriendNotes / GetFriendInfo(.notes)). Adds an "Edit Note" entry to the
|
|
-- friend right-click menu (the "FRIEND" UnitPopup) and shows the note in a
|
|
-- tooltip when you hover a friend in the list.
|
|
pfUI:RegisterModule("friendnotes", function ()
|
|
local EDIT_TOKEN = "PFUI_FRIEND_NOTE"
|
|
|
|
-- Note editor. In 1.12 StaticPopup, OnAccept runs with `this` = the OK
|
|
-- button (the dialog is this:GetParent()); the friend name arrives as the
|
|
-- data argument passed to StaticPopup_Show.
|
|
StaticPopupDialogs["PFUI_FRIEND_NOTE_EDIT"] = {
|
|
text = SET_FRIENDNOTE_LABEL,
|
|
button1 = SAVE,
|
|
button2 = CANCEL,
|
|
hasEditBox = 1,
|
|
maxLetters = 128,
|
|
OnAccept = function(name)
|
|
C_FriendList.SetFriendNotes(name, _G[this:GetParent():GetName().."EditBox"]:GetText())
|
|
end,
|
|
EditBoxOnEnterPressed = function(name)
|
|
C_FriendList.SetFriendNotes(name, this:GetText())
|
|
this:GetParent():Hide()
|
|
end,
|
|
EditBoxOnEscapePressed = function() this:GetParent():Hide() end,
|
|
timeout = 0, whileDead = 1, hideOnEscape = 1,
|
|
}
|
|
|
|
local function OpenNoteEditor(name)
|
|
if not name or name == "" then return end
|
|
local info = C_FriendList.GetFriendInfo(name)
|
|
local dialog = StaticPopup_Show("PFUI_FRIEND_NOTE_EDIT", name, nil, name)
|
|
if not dialog then return end
|
|
local editbox = _G[dialog:GetName().."EditBox"]
|
|
editbox:SetText((info and info.notes) or "")
|
|
editbox:HighlightText()
|
|
editbox:SetFocus()
|
|
end
|
|
|
|
-- Add "Edit Note" to the friend right-click menu, just before Cancel.
|
|
UnitPopupButtons[EDIT_TOKEN] = { text = SET_NOTE, dist = 0 }
|
|
local friendMenu = UnitPopupMenus["FRIEND"]
|
|
table.insert(friendMenu, table.getn(friendMenu), EDIT_TOKEN)
|
|
|
|
UnitPopupMenus["PFUI_FRIENDNOTE"] = { EDIT_TOKEN, "CANCEL" }
|
|
local function OfflineNoteDropDown_Initialize()
|
|
UnitPopup_ShowMenu(_G[UIDROPDOWNMENU_OPEN_MENU], "PFUI_FRIENDNOTE", nil, FriendsDropDown.name)
|
|
end
|
|
local FriendsFrame_ShowDropdown_orig = FriendsFrame_ShowDropdown
|
|
_G.FriendsFrame_ShowDropdown = function(name, connected)
|
|
if connected then return FriendsFrame_ShowDropdown_orig(name, connected) end
|
|
HideDropDownMenu(1)
|
|
FriendsDropDown.initialize = OfflineNoteDropDown_Initialize
|
|
FriendsDropDown.displayMode = "MENU"
|
|
FriendsDropDown.name = name
|
|
ToggleDropDownMenu(1, nil, FriendsDropDown, "cursor")
|
|
end
|
|
|
|
-- Route our entry to the editor and close the menu; delegate the rest. A
|
|
-- bare assignment lands on pfUI.env, so set the global explicitly.
|
|
local UnitPopup_OnClick_orig = UnitPopup_OnClick
|
|
_G.UnitPopup_OnClick = function()
|
|
if this and this.value == EDIT_TOKEN then
|
|
local dropdown = _G[UIDROPDOWNMENU_INIT_MENU]
|
|
local name = dropdown and dropdown.name
|
|
CloseDropDownMenus()
|
|
OpenNoteEditor(name)
|
|
return
|
|
end
|
|
return UnitPopup_OnClick_orig()
|
|
end
|
|
|
|
-- Show the note in a tooltip while hovering a friend in the list. Friend
|
|
-- buttons carry their friend index via SetID (see FriendsFrame_Update).
|
|
local function FriendButton_OnEnter()
|
|
local index = this:GetID()
|
|
if not index or index < 1 then return end
|
|
local info = C_FriendList.GetFriendInfoByIndex(index)
|
|
if not info or not info.notes or info.notes == "" then return end
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText(info.name or "")
|
|
GameTooltip:AddLine(info.notes, 1, 1, 1, 1)
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
for i = 1, FRIENDS_TO_DISPLAY do
|
|
local button = _G["FriendsFrameFriendButton"..i]
|
|
if button then
|
|
button:HookScript("OnEnter", FriendButton_OnEnter)
|
|
button:HookScript("OnLeave", GameTooltip_Hide)
|
|
end
|
|
end
|
|
end)
|