TradeSkillMaster/Core/UI/MainUI/Settings/Macros.lua

271 lines
9.9 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Macros = TSM.MainUI.Settings:NewPackage("Macros")
local L = TSM.Include("Locale").GetTable()
local TempTable = TSM.Include("Util.TempTable")
local Vararg = TSM.Include("Util.Vararg")
local Log = TSM.Include("Util.Log")
local Theme = TSM.Include("Util.Theme")
local UIElements = TSM.Include("UI.UIElements")
local private = {}
local MACRO_NAME = "TSMMacro"
local MACRO_ICON = TSM.IsWowClassic() and "INV_Misc_Flower_01" or "Achievement_Faction_GoldenLotus"
local BINDING_NAME = "MACRO "..MACRO_NAME
local BUTTON_MAPPING = {
["row1.myauctionsCheckbox"] = "TSMCancelAuctionBtn",
["row1.auctioningCheckbox"] = "TSMAuctioningBtn",
["row2.shoppingCheckbox"] = "TSMShoppingBuyoutBtn",
["row2.bidBuyConfirmBtn"] = "TSMBidBuyConfirmBtn",
["row3.sniperCheckbox"] = "TSMSniperBtn",
["row3.craftingCheckbox"] = "TSMCraftingBtn",
["row4.destroyingCheckbox"] = "TSMDestroyBtn",
["row4.vendoringCheckbox"] = "TSMVendoringSellAllButton",
}
local CHARACTER_BINDING_SET = 2
local MAX_MACRO_LENGTH = 255
-- ============================================================================
-- Module Functions
-- ============================================================================
function Macros.OnInitialize()
TSM.MainUI.Settings.RegisterSettingPage(L["Macros"], "middle", private.GetMacrosSettingsFrame)
end
-- ============================================================================
-- Macros Settings UI
-- ============================================================================
function private.GetMacrosSettingsFrame()
TSM.UI.AnalyticsRecordPathChange("main", "settings", "macros")
local body = GetMacroBody(MACRO_NAME) or ""
local upEnabled, downEnabled, altEnabled, ctrlEnabled, shiftEnabled = false, false, false, false, false
for _, binding in Vararg.Iterator(GetBindingKey(BINDING_NAME)) do
upEnabled = upEnabled or (strfind(binding, "MOUSEWHEELUP") and true)
downEnabled = upEnabled or (strfind(binding, "MOUSEWHEELDOWN") and true)
altEnabled = altEnabled or (strfind(binding, "ALT-") and true)
ctrlEnabled = ctrlEnabled or (strfind(binding, "CTRL-") and true)
shiftEnabled = shiftEnabled or (strfind(binding, "SHIFT-") and true)
end
local frame = UIElements.New("ScrollFrame", "macroSettings")
:SetPadding(8, 8, 8, 0)
:AddChild(TSM.MainUI.Settings.CreateExpandableSection("Macro", "setup", L["Macro Setup"], L["Many commonly-used actions in TSM can be added to a macro and bound to your scroll wheel. Use the options below to setup this macro and scroll wheel binding."], 40)
:AddChild(UIElements.New("Text", "actionsSubHeading")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:SetFont("BODY_BODY2_BOLD")
:SetText(L["Bound Actions"])
)
:AddChild(UIElements.New("Frame", "row1")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:AddChild(UIElements.New("Checkbox", "myauctionsCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["My Auctions %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Cancel"])))
)
:AddChild(UIElements.New("Checkbox", "auctioningCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Auctioning %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Post / Cancel"])))
)
)
:AddChild(UIElements.New("Frame", "row2")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:AddChild(UIElements.New("Checkbox", "shoppingCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Shopping %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Buyout"])))
)
:AddChild(UIElements.New("Checkbox", "bidBuyConfirmBtn")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Confirmation %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Bid / Buyout"])))
)
)
:AddChild(UIElements.New("Frame", "row3")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:AddChild(UIElements.New("Checkbox", "sniperCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Sniper %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Buyout"])))
)
:AddChild(UIElements.New("Checkbox", "craftingCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Crafting %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Craft Next"])))
)
)
:AddChild(UIElements.New("Frame", "row4")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 16)
:AddChild(UIElements.New("Checkbox", "destroyingCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Destroying %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Destroy Next"])))
)
:AddChild(UIElements.New("Checkbox", "vendoringCheckbox")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(format(L["Vendoring %s button"], Theme.GetColor("INDICATOR"):ColorText(L["Sell All"])))
)
)
:AddChild(UIElements.New("Text", "scrollWheelSubHeading")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:SetFont("BODY_BODY2_BOLD")
:SetText(L["Scroll Wheel Options"])
)
:AddChild(UIElements.New("Frame", "direction")
:SetLayout("VERTICAL")
:SetMargin(0, 0, 0, 14)
:AddChild(UIElements.New("Text", "label")
:SetHeight(20)
:SetMargin(0, 0, 0, 6)
:SetFont("BODY_BODY2")
:SetText(L["Scroll wheel direction"])
)
:AddChild(UIElements.New("Frame", "check")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:AddChild(UIElements.New("Checkbox", "up")
:SetWidth("AUTO")
:SetMargin(0, 16, 0, 0)
:SetFont("BODY_BODY2")
:SetText(L["Up"])
:SetChecked(upEnabled)
)
:AddChild(UIElements.New("Checkbox", "down")
:SetWidth("AUTO")
:SetFont("BODY_BODY2")
:SetText(L["Down"])
:SetChecked(downEnabled)
)
:AddChild(UIElements.New("Spacer", "spacer"))
)
)
:AddChild(UIElements.New("Frame", "modifiers")
:SetLayout("VERTICAL")
:SetMargin(0, 0, 0, 18)
:AddChild(UIElements.New("Text", "label")
:SetHeight(20)
:SetMargin(0, 0, 0, 6)
:SetFont("BODY_BODY2")
:SetText(L["Modifiers"])
)
:AddChild(UIElements.New("Frame", "check")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:AddChild(UIElements.New("Checkbox", "alt")
:SetWidth("AUTO")
:SetMargin(0, 16, 0, 0)
:SetFont("BODY_BODY2")
:SetText(L["ALT"])
:SetChecked(altEnabled)
)
:AddChild(UIElements.New("Checkbox", "ctrl")
:SetWidth("AUTO")
:SetMargin(0, 16, 0, 0)
:SetFont("BODY_BODY2")
:SetText(L["CTRL"])
:SetChecked(ctrlEnabled)
)
:AddChild(UIElements.New("Checkbox", "shift")
:SetWidth("AUTO")
:SetFont("BODY_BODY2")
:SetText(L["SHIFT"])
:SetChecked(shiftEnabled)
)
:AddChild(UIElements.New("Spacer", "spacer"))
)
)
:AddChild(UIElements.New("ActionButton", "createBtn")
:SetHeight(24)
:SetText(GetMacroInfo(MACRO_NAME) and L["Update existing macro"] or L["Create macro"])
:SetScript("OnClick", private.CreateButtonOnClick)
)
)
for path, buttonName in pairs(BUTTON_MAPPING) do
frame:GetElement("setup.content."..path)
:SetChecked(strfind(body, buttonName) and true or false)
end
return frame
end
-- ============================================================================
-- Local Script Handlers
-- ============================================================================
function private.CreateButtonOnClick(button)
-- remove the old bindings and macros
for _, binding in Vararg.Iterator(GetBindingKey(BINDING_NAME)) do
SetBinding(binding)
end
DeleteMacro(MACRO_NAME)
if GetNumMacros() >= MAX_ACCOUNT_MACROS then
Log.PrintUser(L["Could not create macro as you already have too many. Delete one of your existing macros and try again."])
return
end
-- create the new macro
local scrollFrame = button:GetParentElement():GetParentElement():GetParentElement()
local lines = TempTable.Acquire()
for elementPath, buttonName in pairs(BUTTON_MAPPING) do
if scrollFrame:GetElement("setup.content."..elementPath):IsChecked() then
tinsert(lines, "/click "..buttonName)
end
end
local macroText = table.concat(lines, "\n")
CreateMacro(MACRO_NAME, MACRO_ICON, macroText)
TempTable.Release(lines)
-- create the binding
local modifierStr = ""
if scrollFrame:GetElement("setup.content.modifiers.check.ctrl"):IsChecked() then
modifierStr = modifierStr.."CTRL-"
end
if scrollFrame:GetElement("setup.content.modifiers.check.alt"):IsChecked() then
modifierStr = modifierStr.."ALT-"
end
if scrollFrame:GetElement("setup.content.modifiers.check.shift"):IsChecked() then
modifierStr = modifierStr.."SHIFT-"
end
-- we want to save these bindings to be per-character, so the mode should be 1 / 2 if we're currently on
-- per-character bindings or not respectively
local bindingMode = (GetCurrentBindingSet() == CHARACTER_BINDING_SET) and 1 or 2
if scrollFrame:GetElement("setup.content.direction.check.up") then
SetBinding(modifierStr.."MOUSEWHEELUP", nil, bindingMode)
SetBinding(modifierStr.."MOUSEWHEELUP", BINDING_NAME, bindingMode)
end
if scrollFrame:GetElement("setup.content.direction.check.down") then
SetBinding(modifierStr.."MOUSEWHEELDOWN", nil, bindingMode)
SetBinding(modifierStr.."MOUSEWHEELDOWN", BINDING_NAME, bindingMode)
end
if TSM.IsWowClassic() then
AttemptToSaveBindings(CHARACTER_BINDING_SET)
else
SaveBindings(CHARACTER_BINDING_SET)
end
button:SetText(GetMacroInfo(MACRO_NAME) and L["Update existing macro"] or L["Create macro"])
:Draw()
Log.PrintUser(L["Macro created and scroll wheel bound!"])
if #macroText > MAX_MACRO_LENGTH then
Log.PrintUser(L["WARNING: The macro was too long, so was truncated to fit by WoW."])
end
end