You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.4 KiB

3 years ago
local _, addon = ...
local L = TomTomLocals
-- Credit to p3lim for the basic paste widget used here, adapted from
-- https://github.com/p3lim-wow/Inomena/blob/master/modules/widgets/paste.lua
addon.TEXTURE = [[Interface\ChatFrame\ChatFrameBackground]]
local BACKDROP = {
bgFile = addon.TEXTURE,
edgeFile = addon.TEXTURE,
edgeSize = 1,
}
local backdropMixin = {}
function backdropMixin:CreateBackdrop(backdropAlpha, borderAlpha)
if not self.SetBackdrop then
Mixin(self, BackdropTemplateMixin)
end
self:SetBackdrop(BACKDROP)
self:SetBackdropColor(0, 0, 0, backdropAlpha or 0.5)
self:SetBackdropBorderColor(0, 0, 0, borderAlpha or 1)
end
local paste = Mixin(CreateFrame("Frame", "TomTomPaste", UIParent), backdropMixin)
paste:SetPoint("CENTER")
paste:SetSize(600, 400)
paste:Hide()
paste:CreateBackdrop()
local editbox = Mixin(CreateFrame("EditBox", nil, paste), backdropMixin)
editbox:SetPoint("TOPLEFT", 5, -5)
editbox:SetPoint("BOTTOMRIGHT", -5, 30)
editbox:SetFontObject(ChatFontNormal)
editbox:SetMultiLine(true)
editbox:SetAutoFocus(false)
editbox:CreateBackdrop()
editbox:SetScript("OnEscapePressed", function()
editbox:ClearFocus()
end)
editbox:SetScript("OnShow", function()
editbox:SetFocus(true)
end)
local submit = CreateFrame("Button", nil, paste, "UIPanelButtonTemplate")
submit:SetPoint("BOTTOM", -25, 5)
submit:SetSize(50, 20)
submit:SetText("Paste")
submit:SetScript("OnClick", function()
for _, line in ipairs({string.split("\n", editbox:GetText())}) do
ChatFrame_OpenChat("")
local editBox = ChatEdit_GetActiveWindow()
editBox:SetText(line)
ChatEdit_SendText(editBox, 1)
ChatEdit_DeactivateChat(editBox)
end
editbox:SetText("")
paste:Hide()
end)
editbox:SetScript('OnEnterPressed', function()
if IsControlKeyDown() then
submit:Click()
end
end)
local close = CreateFrame("Button", nil, paste, "UIPanelButtonTemplate")
close:SetPoint("BOTTOM", 25, 5)
close:SetSize(50, 20)
close:SetText("Close")
close:SetScript("OnClick", function()
paste:Hide()
end)
SLASH_TOMTOM_PASTE1 = "/ttpaste"
SLASH_TOMTOM_PASTE2 = "/tomtompaste"
local function slashToggle()
paste:SetShown(not paste:IsShown())
end
local function initPageDB()
if not addon.db.profile.pastePages then
addon.db.profile.pastePages = {}
end
end
local function getPage(title)
initPageDB()
return addon.db.profile.pastePages[title]
end
local function setPage(title, contents)
initPageDB()
addon.db.profile.pastePages[title] = contents
end
local function removePage(title)
initPageDB()
addon.db.profile.pastePages[title] = nil
end
local function slashList()
local titles = {}
for k,v in pairs(addon.db.profile.pastePages or {}) do
table.insert(titles, k)
end
if #titles > 0 then
addon:Printf(L["Saved pages: %s"], table.concat(titles, ", "))
else
addon:Printf(L["No pages saved"])
end
end
local function slashSave(title)
local contents = editbox:GetText()
if not contents or #contents <= 0 then
addon:Printf(L["No contents to save"])
return
end
if not title then
addon:Printf(L["Must specify page name"])
return
end
setPage(title, contents)
addon:Printf(L["Saved %d characters to page '%s'"], #contents, title)
end
local function slashLoad(title)
if not title then
addon:Printf(L["Must specify a page title to load"])
return
end
local contents = getPage(title)
if not contents then
addon:Printf(L["No page found with title '%s'"], title)
return
end
editbox:SetText(contents)
addon:Printf(L["Loaded %d characters from page '%s'"], #contents, title)
paste:SetShown(true)
end
local function slashRemove(title)
if not title then
addon:Printf(L["Must specify a page title to remove"])
return
end
local contents = addon.db.profile.pastePages[title]
if not contents then
addon:Printf(L["No page found with title '%s'"], title)
return
end
removePage(title)
addon:Printf(L["Removed %d characters from page '%s'"], #contents, title)
end
SlashCmdList["TOMTOM_PASTE"] = function(msg)
local subCommand, remainder
if not msg then
subCommand = L["toggle"]
else
subCommand, remainder = msg:match("(%S+)%s*(.*)$")
subCommand = subCommand and subCommand:lower()
end
if not subCommand then
slashToggle()
elseif subCommand == L["toggle"] then
slashToggle()
elseif subCommand == L["list"] then
slashList()
elseif subCommand == L["save"] then
slashSave(remainder)
elseif subCommand == L["load"] then
slashLoad(remainder)
elseif subCommand == L["remove"] then
slashRemove(remainder)
else
addon:Printf(L["Usage: /ttpaste [command]"])
addon:Printf(L[" /ttpaste toggle - Show/hide the paste window"])
addon:Printf(L[" /ttpaste list - List the titles of pages that have been saved"])
addon:Printf(L[" /ttpaste save [title] - Save the current contents of the window with the given name"])
addon:Printf(L[" /ttpaste load [title] - Load a saved page to the paste window"])
addon:Printf(L[" /ttpaste remove [title] - Remove a saved page"])
addon:Printf(L[" /ttpaste help - This help message"])
end
end