Files
wow-ActionBarSaverDaved/KeybindSaver.lua

243 lines
6.4 KiB
Lua

local ADDON_NAME = ...
-- Initialize saved variables
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(self, event, addon)
if addon ~= ADDON_NAME then return end
KeybindSaverDaved = KeybindSaverDaved or {}
KeybindSaverDaved.sets = KeybindSaverDaved.sets or {}
end)
-- Create the import/export frame
local importExportFrame = CreateFrame("Frame", "KBSImportExportFrame", UIParent)
importExportFrame:SetSize(512, 512)
importExportFrame:SetPoint("CENTER")
importExportFrame:SetFrameStrata("HIGH")
importExportFrame:EnableMouse(true)
importExportFrame:SetMovable(true)
importExportFrame:SetResizable(false)
importExportFrame:SetBackdrop({
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true,
tileSize = 4,
edgeSize = 4,
insets = {
left = 4,
right = 4,
top = 4,
bottom = 4,
},
})
importExportFrame:SetBackdropColor(0, 0, 0, 0.8)
importExportFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
importExportFrame:SetMovable(true)
importExportFrame:EnableMouse(true)
importExportFrame:RegisterForDrag("LeftButton")
importExportFrame:SetScript("OnDragStart", function(self) self:StartMoving() end)
importExportFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
importExportFrame:SetScript("OnShow", function(self) self:SetScale(1) end)
importExportFrame:Hide()
local importingSet = nil
local importExportFrameTextBox = CreateFrame("EditBox", "KBSImportExportFrameTextBox", importExportFrame)
importExportFrameTextBox:SetSize(512, 512)
importExportFrameTextBox:SetPoint("TOPLEFT", importExportFrame, "TOPLEFT", 0, 0)
importExportFrameTextBox:SetFont("Fonts\\FRIZQT__.ttf", 12)
importExportFrameTextBox:SetTextColor(1, 1, 1, 1)
importExportFrameTextBox:SetTextInsets(20, 20, 20, 20)
importExportFrameTextBox:SetMultiLine(true)
importExportFrameTextBox:SetAutoFocus(true)
importExportFrameTextBox:SetMaxLetters(1000000)
importExportFrameTextBox:SetScript("OnEscapePressed", function(self)
importExportFrame:Hide()
if importingSet then
local text = self:GetText()
if text and text ~= "" then ImportSet(importingSet, text) end
importingSet = nil
end
end)
---@param setName string
---@return nil
local function SaveSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
---@type table<string, {key1: string, key2: string?}>
local set = {}
local numBindings = GetNumBindings()
for i = 1, numBindings do
local command, _, key1, key2 = GetBinding(i)
if key1 or key2 then set[command] = {
key1 = key1,
key2 = key2,
} end
end
KeybindSaverDaved.sets[setName] = set
print(string.format("Saved keybind set '%s'!", setName))
end
---@param setName string
---@return nil
local function RestoreSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
local set = KeybindSaverDaved.sets[setName]
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
-- Clear all current bindings first
ClearOverrideBindings(frame)
-- Restore saved bindings
for command, keys in pairs(set) do
if keys.key1 then SetBinding(keys.key1, command) end
if keys.key2 then SetBinding(keys.key2, command) end
end
-- Save the changes
SaveBindings(GetCurrentBindingSet())
print(string.format("Restored keybind set '%s'", setName))
end
---@param setName string
---@return nil
local function DeleteSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
if not KeybindSaverDaved.sets[setName] then
print(string.format("No set with the name '%s' exists", setName))
return
end
KeybindSaverDaved.sets[setName] = nil
print(string.format("Deleted keybind set '%s'", setName))
end
---@return nil
local function ListSets()
local sets = {}
for setName in pairs(KeybindSaverDaved.sets) do
table.insert(sets, setName)
end
table.sort(sets)
if #sets == 0 then
print("No keybind sets found")
else
print("Saved keybind sets:")
print(table.concat(sets, ", "))
end
end
---@param setName string
---@return nil
local function ExportSet(setName)
local set = KeybindSaverDaved.sets[setName]
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
local export = {}
for command, keys in pairs(set) do
if keys.key1 then table.insert(export, string.format("%s:%s", command, keys.key1)) end
if keys.key2 then table.insert(export, string.format("%s:%s", command, keys.key2)) end
end
local exportStr = table.concat(export, "\n")
importExportFrame:Show()
importExportFrameTextBox:SetText(exportStr)
importExportFrameTextBox:SetFocus()
end
---@param setName string
---@param importStr string
---@return nil
local function ImportSet(setName, importStr)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
local set = {}
local lines = { strsplit("\n", importStr) }
for _, line in ipairs(lines) do
local command, key = strsplit(":", line)
if command and key then
if not set[command] then set[command] = {} end
if not set[command].key1 then
set[command].key1 = key
else
set[command].key2 = key
end
end
end
KeybindSaverDaved.sets[setName] = set
print(string.format("Imported keybind set '%s'", setName))
end
---@param setName string
---@return nil
local function ImportSetDialogue(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
importingSet = setName
importExportFrameTextBox:SetText("")
importExportFrame:Show()
importExportFrameTextBox:SetFocus()
end
---@return nil
local function PrintUsage()
print("Keybind Saver Slash Commands:")
print("/kbs save <set> - Saves your current keybinds under the given <set>")
print("/kbs restore <set> - Restores the saved <set>")
print("/kbs delete <set> - Deletes the saved <set>")
print("/kbs list - Lists all saved sets")
print("/kbs export <set> - Opens a window to export the given <set>")
print("/kbs import <set> - Opens a window to import a keybind set")
end
SLASH_KBS1 = "/kbs"
SlashCmdList["KBS"] = function(argv)
local args = { strsplit(" ", argv) }
local cmd = args[1]
if cmd == "save" then
SaveSet(args[2])
elseif cmd == "restore" then
RestoreSet(args[2])
elseif cmd == "delete" then
DeleteSet(args[2])
elseif cmd == "list" then
ListSets()
elseif cmd == "export" then
ExportSet(args[2])
elseif cmd == "import" then
ImportSetDialogue(args[2])
else
PrintUsage()
end
end