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.
302 lines
8.9 KiB
302 lines
8.9 KiB
-- ----------------------------------------------------------------------------
|
|
-- Localized Lua globals.
|
|
-- ----------------------------------------------------------------------------
|
|
-- Functions
|
|
local tonumber = _G.tonumber
|
|
local tostring = _G.tostring
|
|
|
|
-- Libraries
|
|
local math = _G.math
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- AddOn namespace.
|
|
-- ----------------------------------------------------------------------------
|
|
local AddOnFolderName, private = ...
|
|
|
|
local LibStub = _G.LibStub
|
|
|
|
local AceConfigRegistry = LibStub("AceConfigRegistry-3.0")
|
|
local L = LibStub("AceLocale-3.0"):GetLocale(AddOnFolderName)
|
|
local LibWindow = LibStub("LibWindow-1.1")
|
|
local NPCScan = LibStub("AceAddon-3.0"):GetAddon(AddOnFolderName)
|
|
|
|
local EventMessage = private.EventMessage
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Constants.
|
|
-- ----------------------------------------------------------------------------
|
|
local SPAWN_POINTS = {
|
|
"CENTER",
|
|
"BOTTOM",
|
|
"BOTTOMLEFT",
|
|
"BOTTOMRIGHT",
|
|
"LEFT",
|
|
"RIGHT",
|
|
"TOP",
|
|
"TOPLEFT",
|
|
"TOPRIGHT",
|
|
}
|
|
|
|
local SPAWN_INDICES = {}
|
|
local LOCALIZED_SPAWN_POINTS = {}
|
|
|
|
for index = 1, #SPAWN_POINTS do
|
|
LOCALIZED_SPAWN_POINTS[index] = L[SPAWN_POINTS[index]]
|
|
SPAWN_INDICES[SPAWN_POINTS[index]] = index
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Variables.
|
|
-- ----------------------------------------------------------------------------
|
|
local profile
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Helpers.
|
|
-- ----------------------------------------------------------------------------
|
|
local function round(num, idp)
|
|
local mult = 10 ^ (idp or 0)
|
|
return math.floor(num * mult + 0.5) / mult
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- TargetButton anchor frame.
|
|
-- ----------------------------------------------------------------------------
|
|
local function CreateAnchorFrame()
|
|
local anchorFrame = _G.CreateFrame("Frame", nil, _G.UIParent, "BackdropTemplate")
|
|
anchorFrame:SetSize(302, 119)
|
|
anchorFrame:SetFrameStrata("DIALOG")
|
|
anchorFrame:SetBackdrop({
|
|
bgFile = [[Interface\FriendsFrame\UI-Toast-Background]],
|
|
edgeFile = [[Interface\FriendsFrame\UI-Toast-Border]],
|
|
tile = true,
|
|
tileSize = 12,
|
|
edgeSize = 12,
|
|
insets = {
|
|
left = 5,
|
|
right = 5,
|
|
top = 5,
|
|
bottom = 5,
|
|
},
|
|
})
|
|
|
|
anchorFrame:EnableMouse(true)
|
|
anchorFrame:RegisterForDrag("LeftButton")
|
|
anchorFrame:SetClampedToScreen(true)
|
|
anchorFrame:Hide()
|
|
|
|
local title = anchorFrame:CreateFontString(nil, "BORDER", "FriendsFont_Normal")
|
|
title:SetJustifyH("CENTER")
|
|
title:SetJustifyV("MIDDLE")
|
|
title:SetWordWrap(true)
|
|
title:SetPoint("TOPLEFT", anchorFrame, "TOPLEFT", 15, -10)
|
|
title:SetPoint("RIGHT", anchorFrame, "RIGHT", -20, 10)
|
|
title:SetText(AddOnFolderName)
|
|
title:SetWidth(anchorFrame:GetWidth())
|
|
|
|
local text = anchorFrame:CreateFontString(nil, "BORDER", "FriendsFont_Normal")
|
|
text:SetSize(anchorFrame:GetWidth() - 20, 32)
|
|
text:SetJustifyH("LEFT")
|
|
text:SetJustifyV("MIDDLE")
|
|
text:SetWordWrap(true)
|
|
text:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -4)
|
|
text:SetText(L["Drag to set the spawn point for targeting buttons."])
|
|
|
|
local dismissButton = _G.CreateFrame("Button", nil, anchorFrame)
|
|
dismissButton:SetSize(18, 18)
|
|
dismissButton:SetPoint("TOPRIGHT", anchorFrame, "TOPRIGHT", -4, -4)
|
|
dismissButton:SetFrameStrata("DIALOG")
|
|
dismissButton:SetFrameLevel(anchorFrame:GetFrameLevel() + 2)
|
|
dismissButton:SetNormalTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Up]])
|
|
dismissButton:SetPushedTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Down]])
|
|
dismissButton:SetHighlightTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Highlight]])
|
|
dismissButton:SetScript("OnClick", function()
|
|
anchorFrame:Hide()
|
|
end)
|
|
|
|
anchorFrame:SetHeight(text:GetStringHeight() + title:GetStringHeight() + 25)
|
|
|
|
LibWindow.RegisterConfig(anchorFrame, profile.targetButtonGroup)
|
|
LibWindow.RestorePosition(anchorFrame)
|
|
LibWindow.MakeDraggable(anchorFrame)
|
|
|
|
anchorFrame:HookScript("OnDragStop", function()
|
|
AceConfigRegistry:NotifyChange(AddOnFolderName)
|
|
end)
|
|
|
|
private.TargetButtonAnchor = anchorFrame
|
|
|
|
return anchorFrame
|
|
end
|
|
|
|
local function IsTargetButtonGroupDisabled()
|
|
return not profile.targetButtonGroup.isEnabled
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Initialization.
|
|
-- ----------------------------------------------------------------------------
|
|
local TargetingOptions
|
|
local anchorFrame
|
|
|
|
local function GetTargetingOptions()
|
|
profile = private.db.profile
|
|
anchorFrame = anchorFrame or CreateAnchorFrame()
|
|
|
|
TargetingOptions = TargetingOptions or {
|
|
name = _G.BINDING_HEADER_TARGETING,
|
|
order = 3,
|
|
type = "group",
|
|
descStyle = "inline",
|
|
args = {
|
|
isEnabled = {
|
|
order = 1,
|
|
name = _G.ENABLE,
|
|
descStyle = "inline",
|
|
type = "toggle",
|
|
width = "full",
|
|
get = function()
|
|
return profile.targetButtonGroup.isEnabled
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.isEnabled = value
|
|
end,
|
|
},
|
|
duration = {
|
|
order = 2,
|
|
name = L["Duration"],
|
|
desc = L["The number of minutes a targeting button will exist before fading out."],
|
|
type = "range",
|
|
width = "full",
|
|
min = 0.5,
|
|
max = 5,
|
|
disabled = IsTargetButtonGroupDisabled,
|
|
get = function()
|
|
return profile.targetButtonGroup.durationSeconds / 60
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.durationSeconds = value * 60
|
|
end,
|
|
},
|
|
scale = {
|
|
order = 3,
|
|
name = _G.UI_SCALE,
|
|
type = "range",
|
|
width = "full",
|
|
min = 0.5,
|
|
max = 2,
|
|
disabled = IsTargetButtonGroupDisabled,
|
|
get = function()
|
|
return profile.targetButtonGroup.scale
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.scale = value
|
|
LibWindow.SetScale(anchorFrame, value)
|
|
|
|
NPCScan:SendMessage(EventMessage.TargetButtonScaleChanged)
|
|
end,
|
|
},
|
|
targetButtons = {
|
|
order = 4,
|
|
name = L["Screen Location"],
|
|
type = "group",
|
|
guiInline = true,
|
|
disabled = IsTargetButtonGroupDisabled,
|
|
args = {
|
|
spawnPoint = {
|
|
order = 1,
|
|
type = "select",
|
|
name = L["Spawn Point"],
|
|
descStyle = "inline",
|
|
get = function()
|
|
return SPAWN_INDICES[profile.targetButtonGroup.point]
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.point = SPAWN_POINTS[value]
|
|
LibWindow.RestorePosition(anchorFrame)
|
|
end,
|
|
values = LOCALIZED_SPAWN_POINTS,
|
|
},
|
|
x = {
|
|
order = 2,
|
|
type = "input",
|
|
name = L["X Offset"],
|
|
desc = L["Horizontal offset from the anchor point."],
|
|
get = function()
|
|
return tostring(round(profile.targetButtonGroup.x))
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.x = tonumber(value)
|
|
LibWindow.RestorePosition(anchorFrame)
|
|
end,
|
|
dialogControl = "EditBox",
|
|
},
|
|
y = {
|
|
order = 3,
|
|
type = "input",
|
|
name = L["Y Offset"],
|
|
desc = L["Vertical offset from the anchor point."],
|
|
get = function()
|
|
return tostring(round(profile.targetButtonGroup.y))
|
|
end,
|
|
set = function(_, value)
|
|
profile.targetButtonGroup.y = tonumber(value)
|
|
LibWindow.RestorePosition(anchorFrame)
|
|
end,
|
|
dialogControl = "EditBox",
|
|
},
|
|
hideDuringCombat = {
|
|
order = 4,
|
|
type = "toggle",
|
|
name = L["Hide During Combat"],
|
|
descStyle = "inline",
|
|
width = "full",
|
|
get = function()
|
|
return profile.targetButtonGroup.hideDuringCombat
|
|
end,
|
|
set = function(_ , value)
|
|
profile.targetButtonGroup.hideDuringCombat = value
|
|
end,
|
|
},
|
|
empty_4 = {
|
|
order = 5,
|
|
type = "description",
|
|
width = "full",
|
|
name = " ",
|
|
},
|
|
reset = {
|
|
order = 6,
|
|
type = "execute",
|
|
name = L["Reset Position"],
|
|
descStyle = "inline",
|
|
func = function()
|
|
local defaults = private.DefaultPreferences.profile.targetButtonGroup
|
|
local preferences = profile.targetButtonGroup
|
|
|
|
preferences.point = defaults.point
|
|
preferences.x = defaults.x
|
|
preferences.y = defaults.y
|
|
|
|
LibWindow.RestorePosition(anchorFrame)
|
|
end,
|
|
},
|
|
showAnchor = {
|
|
order = 7,
|
|
type = "execute",
|
|
descStyle = "inline",
|
|
name = function()
|
|
return anchorFrame:IsShown() and L["Hide Anchor"] or L["Show Anchor"]
|
|
end,
|
|
func = function()
|
|
anchorFrame[anchorFrame:IsShown() and "Hide" or "Show"](anchorFrame)
|
|
AceConfigRegistry:NotifyChange(AddOnFolderName)
|
|
end,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
return TargetingOptions
|
|
end
|
|
|
|
private.GetTargetingOptions = GetTargetingOptions
|
|
|