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.

842 lines
35 KiB

local addonName, platerInternal = ...
---@diagnostic disable-next-line: undefined-field
local Plater = _G.Plater
local GameCooltip = GameCooltip2
---@type detailsframework
local detailsFramework = DetailsFramework
local _
local DEBUG_OPEN_AT_LOGIN = false
---@class plater_designer : table
platerInternal.Designer = {}
local designer = platerInternal.Designer
designer.Options = {}
local options = designer.Options
local editorOptionsTextTemplate = {
size = 11,
color = "gold",
}
local editorOptionsSliderTemplate = {
thumbwidth = 20,
}
--all objects that uses only settings that are within the plate_config table
---@type df_editor_objectinfo[]
local plateConfigObjectsInfo = {}
local ACTORTYPE_FRIENDLY_PLAYER = platerInternal.VarSharing.ACTORTYPE_FRIENDLY_PLAYER
local ACTORTYPE_FRIENDLY_NPC = platerInternal.VarSharing.ACTORTYPE_FRIENDLY_NPC
local ACTORTYPE_ENEMY_PLAYER = platerInternal.VarSharing.ACTORTYPE_ENEMY_PLAYER
local ACTORTYPE_ENEMY_NPC = platerInternal.VarSharing.ACTORTYPE_ENEMY_NPC
local ACTORTYPE_PLAYER = platerInternal.VarSharing.ACTORTYPE_PLAYER
local MEMBER_UNITID = platerInternal.VarSharing.MEMBER_UNITID
local MEMBER_GUID = platerInternal.VarSharing.MEMBER_GUID
local MEMBER_NPCID = platerInternal.VarSharing.MEMBER_NPCID
local MEMBER_QUEST = platerInternal.VarSharing.MEMBER_QUEST
local MEMBER_REACTION = platerInternal.VarSharing.MEMBER_REACTION
local MEMBER_RANGE = platerInternal.VarSharing.MEMBER_RANGE
local MEMBER_NOCOMBAT = platerInternal.VarSharing.MEMBER_NOCOMBAT
local MEMBER_NAME = platerInternal.VarSharing.MEMBER_NAME
local MEMBER_NAMELOWER = platerInternal.VarSharing.MEMBER_NAMELOWER
local MEMBER_TARGET = platerInternal.VarSharing.MEMBER_TARGET
local plateFrame
---profile.plate_config[enemynpc, friendlynpc, enemyplayer, friendlyplayer]
local subTablePath = "enemynpc"
local getProfileTable = function()
return Plater.db.profile.plate_config[subTablePath]
end
local dv = function(f) detailsFramework:DebugVisibility(f) end
---debug tags to help identify frames, the string passed is always the variable name for the frame
---@param f frame
---@param n string
local createFrameTag = function (f,n)
do return end
local t = f:CreateTexture (nil, "overlay")
local fs = f:CreateFontString (nil, "overlay", "GameFontNormalSmall")
t:SetSize(140, 12)
t:SetColorTexture (1, 1, 0, 1)
t:SetPoint ("bottomleft", f, "topleft", 0, 0)
fs:SetPoint ("left", t, "left", 0, 0)
fs:SetText (n)
fs:SetTextColor (0, 0, 0, 1)
end
function Plater.ToggleDesignerWindow()
if (Plater.DesignerWindow and Plater.DesignerWindow:IsShown()) then
Plater.DesignerWindow:Hide()
return
end
Plater.OpenDesignerWindow()
end
function Plater.OpenDesignerWindow()
if (Plater.DesignerWindow) then
Plater.DesignerWindow:Show()
return
end
Plater.CreateDesignerWindow()
end
local a = CreateFrame("frame")
a:RegisterEvent("PLAYER_LOGIN")
a:SetScript("OnEvent", function(self, event, ...)
if DEBUG_OPEN_AT_LOGIN then
Plater.OpenDesignerWindow()
end
self:UnregisterEvent("PLAYER_LOGIN")
end)
function Plater.CreateDesignerWindow(tabFrame, tabContainer, parent)
local gName = "PlaterDsgn"
local isCastBarSelected = false
local startX, startY, heightSize = 10, platerInternal.optionsYStart, 755
--tab background using a rounded panel | need to make a preset for this, atm it is declaring each time the same table
local roundedPanelOptions = {
scale = 1,
width = tabFrame:GetWidth() - 4,
height = tabFrame:GetHeight() - 4 - math.abs(startY),
roundness = 8,
}
---@type df_roundedpanel
--local editorMainFrame = detailsFramework:CreateRoundedPanel(tabFrame, gName, roundedPanelOptions)
local editorMainFrame = CreateFrame("Frame", gName, tabFrame)
--editorMainFrame:SetFrameStrata("FULLSCREEN")
--local editorMainFrame = CreateFrame("frame", gName, UIParent)
Plater.DesignerWindow = editorMainFrame
--detailsFramework:MakeDraggable(editorMainFrame)
--editorMainFrame:EnableMouse(true)
createFrameTag(editorMainFrame, "editorMainFrame")
editorMainFrame:SetSize(roundedPanelOptions.width, roundedPanelOptions.height)
--editorMainFrame:SetPoint ("center", UIParent, "center", -100, 0)
editorMainFrame:SetPoint("topleft", tabFrame, "topleft", 0, startY + 24)
--create the widget editor
local editorOptions = {
width = editorMainFrame:GetWidth() - 10,
create_object_list = true,
object_list_width = 200,
object_list_height = editorMainFrame:GetHeight() - 15,
object_list_lines = 20,
object_list_line_height = 20,
text_template = editorOptionsTextTemplate,
slider_template = editorOptionsSliderTemplate,
no_anchor_points = true,
start_editing_callback = function(layoutEditor, objectInfo)
if (objectInfo.id:match("^CAST")) then
isCastBarSelected = true
Plater.StartCastBarTest()
else
isCastBarSelected = false
Plater.StopCastBarTest()
end
end,
selection_texture = "Interface\\AddOns\\Plater\\images\\selection_corner.png",
}
--Plater_Designer_Objects.lua
--create two tables to map the layout settings for the editor
designer.CreateSettings(editorMainFrame)
--the frame in the middle of the tab, the the settings for the selected widget are placed
---@type df_editor
local layoutEditor = detailsFramework:CreateEditor(editorMainFrame, "Plater_LayoutEditor_", editorOptions)
createFrameTag(layoutEditor, "layoutEditor")
layoutEditor:SetPoint("topleft", editorMainFrame, "topleft", 5, -16)
layoutEditor:SetPoint("bottomleft", editorMainFrame, "bottomleft", 5, 5)
layoutEditor:EnableMouse(false)
layoutEditor:SetFrameLevel(editorMainFrame:GetFrameLevel() + 10)
--layoutEditor:SetFrameStrata("HIGH")
function designer.UpdateAllNameplates()
for _, thisPlateFrame in ipairs(Plater.GetAllShownPlates()) do
if thisPlateFrame.namePlateUnitToken or thisPlateFrame.unitToken then
platerInternal.Events.GetEventFunction("NAME_PLATE_UNIT_ADDED")("NAME_PLATE_UNIT_ADDED", thisPlateFrame.namePlateUnitToken or thisPlateFrame.unitToken)
end
end
end
--create close button using the framework
--local closeButton = detailsFramework:CreateCloseButton(editorMainFrame)
--closeButton:SetPoint("topright", editorMainFrame, "topright", -3, -3)
local canvasFrame = layoutEditor:GetCanvasScrollBox()
canvasFrame:EnableMouse(false)
local objectSelector = layoutEditor:GetObjectSelector()
local optionsFrame = layoutEditor:GetOptionsFrame()
optionsFrame:AdjustPointsOffset(-2, 0)
--create a frame to guide the setting points on the empty area at the right side of the main frame, which is reserved for the preview
local previewNameplateFrame = CreateFrame("Frame", "$parentGuideFrame", layoutEditor)
createFrameTag(previewNameplateFrame, "previewPlateFrame")
previewNameplateFrame:SetPoint("bottomleft", canvasFrame, "bottomright", 30, 0)
previewNameplateFrame:SetPoint("topright", editorMainFrame, "topright", -5, -5)
previewNameplateFrame:SetFrameLevel(layoutEditor:GetFrameLevel() + 1)
local findWidgetExtraOptionTable = function(sectionName, tableName)
local extraOptionsSection = options.WidgetSettingsExtraOptions[sectionName]
if (extraOptionsSection) then
for i = 1, #extraOptionsSection do
local widgetExtraOption = extraOptionsSection[i]
local optionCategoryName = widgetExtraOption.tableName
if (optionCategoryName == tableName) then
return widgetExtraOption
end
end
end
end
--plater only
local onClickSelectPlateConfigOption = function(self, fixedParameter, newSubTablePath)
subTablePath = newSubTablePath
--update the paths in the mapping tables
--cast bar:
--options.WidgetSettingsMapTables.CastBar.width = "plate_config." .. subTablePath .. ".cast_incombat[1]"
--options.WidgetSettingsMapTables.CastBar.height = "plate_config." .. subTablePath .. ".cast_incombat[2]"
--local castOutOfCombatWidth = findWidgetExtraOptionTable("CastBar", "out_of_combat_cast_width")
--castOutOfCombatWidth.key = "plate_config." .. subTablePath .. ".cast[1]"
--local castOutOfCombatHeight = findWidgetExtraOptionTable("CastBar", "out_of_combat_cast_height")
--castOutOfCombatHeight.key = "plate_config." .. subTablePath .. ".cast[2]"
--local castBarOffsetX = findWidgetExtraOptionTable("CastBar", "castbar_offset_x")
--castBarOffsetX.key = "plate_config." .. subTablePath .. ".castbar_offset_x"
--local castBarOffsetY = findWidgetExtraOptionTable("CastBar", "castbar_offset_y")
--castBarOffsetY.key = "plate_config." .. subTablePath .. ".castbar_offset"
--health bar:
--options.WidgetSettingsMapTables.HealthBar.width = "plate_config." .. subTablePath .. ".health_incombat[1]"
--options.WidgetSettingsMapTables.HealthBar.height = "plate_config." .. subTablePath .. ".health_incombat[2]"
--local healthOutOfCombatWidth = findWidgetExtraOptionTable("HealthBar", "out_of_combat_health_width")
--healthOutOfCombatWidth.key = "plate_config." .. subTablePath .. ".health[1]"
--local healthOutOfCombatHeight = findWidgetExtraOptionTable("HealthBar", "out_of_combat_health_height")
--healthOutOfCombatHeight.key = "plate_config." .. subTablePath .. ".health[2]"
--
for index, objectInfo in ipairs(plateConfigObjectsInfo) do
layoutEditor:UpdateProfileSubTablePath(objectInfo, subTablePath)
end
layoutEditor:Refresh()
end
---@type dropdownoption[]
local plateConfigOptions = {
{label = "Enemy NPC", value = "enemynpc", onclick = onClickSelectPlateConfigOption},
{label = "Friendly NPC", value = "friendlynpc", onclick = onClickSelectPlateConfigOption},
{label = "Enemy Player", value = "enemyplayer", onclick = onClickSelectPlateConfigOption},
{label = "Friendly Player", value = "friendlyplayer", onclick = onClickSelectPlateConfigOption},
}
--create df dropdown to select which plate config to edit
local plateConfigDropdown = detailsFramework:CreateDropDown(previewNameplateFrame, function() return plateConfigOptions end, subTablePath, 160, 20)
plateConfigDropdown:SetPoint("topleft", previewNameplateFrame, "topleft", 2, -13)
plateConfigDropdown:SetTemplate(detailsFramework:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
local onSelectChangeAllFonts = function(self, fixedParameter, fontName)
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
local fontFile = SharedMedia:Fetch("font", fontName)
local plateConfigs = {"enemynpc", "friendlynpc", "enemyplayer", "friendlyplayer", "player"}
for i = 1, #plateConfigs do
local plateTable = Plater.db.profile.plate_config[plateConfigs[i]]
plateTable.actorname_text_font = fontName
plateTable.spellname_text_font = fontName
plateTable.spellpercent_text_font = fontName
plateTable.level_text_font = fontName
plateTable.percent_text_font = fontName
plateTable.big_actortitle_text_font = fontName
plateTable.big_actorname_text_font = fontName
plateTable.power_percent_text_font = fontName
end
local profile = Plater.db.profile
profile.castbar_target_font = fontName
profile.aura_timer_text_font = fontName
profile.aura_stack_font = fontName
--update the font on all nameplates
designer.UpdateAllNameplates()
--refreshes the current object being edited
layoutEditor:Refresh()
local registeredObjects = layoutEditor:GetAllRegisteredObjects()
for i = 1, #registeredObjects do
local objectInfo = registeredObjects[i]
local uiObject = objectInfo.object
if (uiObject.GetObjectType and uiObject:GetObjectType() == "FontString") then
---@cast uiObject fontstring
detailsFramework:SetFontFace(uiObject, fontFile)
end
end
end
local selectFontDropdown = detailsFramework:CreateFontDropDown(previewNameplateFrame, onSelectChangeAllFonts, 0, 160, 20)
selectFontDropdown:SetPoint("topright", previewNameplateFrame, "topright", -2, -13)
selectFontDropdown:SetTemplate(detailsFramework:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
selectFontDropdown.label:SetText("change all fonts")
selectFontDropdown.icon:SetTexture([[Interface\AnimCreate\AnimCreateIcons]])
selectFontDropdown.icon:SetTexCoord(0, 32/128, 64/128, 96/128)
plateFrame = designer.CreatePreview(previewNameplateFrame)
--createFrameTag(plateFrame, "nameplate")
plateFrame:SetPoint("center", previewNameplateFrame, "center", 0, 50)
plateFrame:SetScale(1.0)
plateFrame:SetSize(180, 60)
plateFrame.unit = "player"
--platerInternal.Events.GetEventFunction("NAME_PLATE_UNIT_ADDED")("NAME_PLATE_UNIT_ADDED", "preview")
---@type unitframe
local unitFrame = plateFrame.unitFrame
---@type healthbar
local healthBar = unitFrame.healthBar
healthBar:SetMinMaxValues(0, 1)
healthBar:SetValue(0.7)
---@type castbar
local castBar = unitFrame.castBar
castBar:SetMinMaxValues(0, 1)
castBar:SetValue(0.5)
castBar:Show()
castBar:AdjustPointsOffset(0, -30)
--castBar:ClearAllPoints()
--Plater_LayoutEditor
--Plater_LayoutEditorGuideFrame
--PlaterDesignerPlatePreview
--^ parenting stair
---@type fontstring
local unitName = unitFrame.unitName
---@type fontstring
local levelText = healthBar.actorLevel
---@type fontstring
local spellName = castBar.Text
---@type fontstring
local lifePercent = healthBar.lifePercent_Safe
---@type fontstring
local castPercentText = castBar.percentText
---@type fontstring
local actorTitleSpecial = plateFrame.ActorTitleSpecial
---@type fontstring
local actorNameSpecial = plateFrame.ActorNameSpecial
---@type fontstring
local questOptionsFontString = unitFrame.QuestOptionsDummyFontString
---@type fontstring
local castBarTargetName = castBar.TargetName
---@type fontstring
local newcastBarTargetName = castBar.NewCastBarTargetName
---@type texture
local castBarSpark = castBar.Spark
spellName:SetText("Blizzard")
unitName:SetText("Unit Name")
levelText:SetText("60")
lifePercent:SetText("80%")
castPercentText:SetText("3.2s")
actorNameSpecial:SetText("Unit Name When No Health Bar")
actorTitleSpecial:SetText("Unit Title When No Health Bar")
detailsFramework:SetFontSize(actorNameSpecial, Plater.db.profile.plate_config.enemynpc.big_actorname_text_size)
detailsFramework:SetFontSize(actorTitleSpecial, Plater.db.profile.plate_config.enemynpc.big_actortitle_text_size)
actorNameSpecial:ClearAllPoints()
actorNameSpecial:SetPoint("bottomleft", previewNameplateFrame, "bottomleft", 5, 40)
actorTitleSpecial:ClearAllPoints()
actorTitleSpecial:SetPoint("top", actorNameSpecial, "bottom", 0, -2)
--Plater.db.profile
local profileRoot = Plater.db.profile
local rootKey = "" --as the settings are in the root of the profile table, there is no path to pass
--profileRoot.plate_config
local plateConfig = profileRoot.plate_config
local onSettingChanged = function(editingObject, optionKey, newValue, profileTable, profileKey)
--plater only, change the incombat and outofcombat settings together
if profileKey:find("health_incombat") then
if optionKey == "width" then
profileTable.health[1] = newValue
else
profileTable.health[2] = newValue
end
end
if profileKey:find("cast_incombat") then
if optionKey == "width" then
profileTable.cast[1] = newValue
local castBarOffSetX = plateConfig[subTablePath].castbar_offset_x
local castBarOffSetXRel = (healthBar:GetWidth() - newValue) / 2
--local castBarOffSetY = plateConfig.castbar_offset --override by -30 pixels
PixelUtil.SetPoint (castBar, "topleft", healthBar, "bottomleft", castBarOffSetXRel + castBarOffSetX, -30)
PixelUtil.SetPoint (castBar, "topright", healthBar, "bottomright", -castBarOffSetXRel + castBarOffSetX, -30)
else
profileTable.cast[2] = newValue
end
end
if (optionKey == "anchor") then
local anchorTable = detailsFramework.table.getfrompath(profileTable, profileKey, 1)
anchorTable.x = 0
anchorTable.y = 0
C_Timer.After(0, function()
--layoutEditor:PrepareObjectForEditing()
end)
end
designer.UpdateAllNameplates()
end
---@type df_editobjectoptions
local editObjectDefaultOptions = {
use_colon = false, --colon after the localizedLabel
can_move = true,
use_guide_lines = false,
text_template = detailsFramework:GetTemplate("font", "OPTIONS_FONT_TEMPLATE"),
}
local editObjectNoMoveOptions = detailsFramework.table.copy({}, editObjectDefaultOptions)
editObjectNoMoveOptions.can_move = false
actorNameSpecial:Show()
actorTitleSpecial:Show()
--castBarTargetName:Show()
local previousCastbarTargetShow = Plater.db.profile.castbar_target_show
Plater.db.profile.castbar_target_show = true
Plater.UpdateCastbarTargetText(castBar, newcastBarTargetName)
Plater.db.profile.castbar_target_show = previousCastbarTargetShow
newcastBarTargetName:Show()
newcastBarTargetName:SetText("Target Name")
--by registering the object within the editor, the the object will show up in the list of widgets to select
--pathstring: a string containing dots or brackets to reach the subtable where the settings are stored
--example: "nameplate.texts.colors.out_of_combat_color[1]" > would return the first value of the out_of_combat_color table
--[[
RegisterObject(self, object:uiobject, localizedLabel:string, id:string, profileTable:table, subTablePath:pathstring, profileKeyMap:table, extraOptions:table, callback:function, options:table, refFrame:uiobject)
object: the uiobject to be edited (error if invalid)
localizedLabel: the name shown in the list
id: a string with a unique id for the object, used with EditObjectById(ID)
profileTable: the table where the settings are stored
subTablePath: a pathstring within the profile table where the settings are stored, support pathstring
profileKeyMap: a table mapping the default editor options to the keys used in the profile table. see 'Plater_Designer_Objects.lua' file.
extraOptions: a table containing extra options to be added to the editor, see 'Plater_Designer_Objects.lua' file.
callback: a function called when a setting is changed, parameters are (UIObject, optionKey, newValue, profileTable:table, subTablePath:pathstring)
options: a table containing options for the registered object.
refFrame: a uiobject used as reference the anchor point.
]]
--~register
---@type df_editor_objectinfo
local objectInfo
--plateConfig objects are objects where all settings are within the plate_config table
--quest options:
local questOptions = detailsFramework.table.copy({}, editObjectDefaultOptions)
questOptions.icon = "QuestNormal" --atlas name
questOptions.can_move = false
objectInfo = layoutEditor:RegisterObject(questOptionsFontString, "Quest Options", "QUESTOPTIONS", plateConfig, subTablePath, options.WidgetSettingsMapTables.QuestOptions, options.WidgetSettingsExtraOptions.QuestOptions, onSettingChanged, questOptions, unitFrame)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
--health bar
---@type df_editobjectoptions
local healthBarOptions = detailsFramework.table.copy({}, editObjectDefaultOptions)
healthBarOptions.can_move = false
objectInfo = layoutEditor:RegisterObject(healthBar, "Health Bar", "HEALTHBAR", plateConfig, subTablePath, options.WidgetSettingsMapTables.HealthBar, options.WidgetSettingsExtraOptions.HealthBar, onSettingChanged, healthBarOptions, healthBar)
objectInfo = layoutEditor:RegisterObject(unitName, "Unit Name", "UNITNAME", plateConfig, subTablePath, options.WidgetSettingsMapTables.UnitName, options.WidgetSettingsExtraOptions.UnitName, onSettingChanged, editObjectDefaultOptions, healthBar)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
objectInfo = layoutEditor:RegisterObject(levelText, "Unit Level", "UNITLEVEL", plateConfig, subTablePath, options.WidgetSettingsMapTables.UnitLevel, options.WidgetSettingsExtraOptions.UnitLevel, onSettingChanged, editObjectDefaultOptions, healthBar)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
objectInfo = layoutEditor:RegisterObject(lifePercent, "Life Percent", "LIFEPERCENT", plateConfig, subTablePath, options.WidgetSettingsMapTables.LifePercent, options.WidgetSettingsExtraOptions.LifePercent, onSettingChanged, editObjectDefaultOptions, healthBar)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
platerInternal.UpdatePercentTextLayout(lifePercent, plateConfig[subTablePath])
--actor title and name special
objectInfo = layoutEditor:RegisterObject(actorNameSpecial, "Big Unit Name", "BIGUNITNAME", plateConfig, subTablePath, options.WidgetSettingsMapTables.BigUnitName, options.WidgetSettingsExtraOptions.BigUnitName, onSettingChanged, editObjectNoMoveOptions, plateFrame)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
layoutEditor:RegisterObject(actorTitleSpecial, "Big Unit Title", "BIGUNITTITLE", plateConfig, subTablePath, options.WidgetSettingsMapTables.BigActorTitle, options.WidgetSettingsExtraOptions.BigActorTitle, onSettingChanged, editObjectNoMoveOptions, plateFrame)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
--cast bar [no plate config]
--cast bar has settings both in plate_config and in the root file of profile
---@type df_editobjectoptions
local castBarOptions = detailsFramework.table.copy({}, editObjectDefaultOptions)
castBarOptions.can_move = false
objectInfo = layoutEditor:RegisterObject(castBar, "Cast Bar", "CASTBAR", plateConfig, subTablePath, options.WidgetSettingsMapTables.CastBar, options.WidgetSettingsExtraOptions.CastBar, onSettingChanged, castBarOptions, castBar)
objectInfo = layoutEditor:RegisterObject(spellName, "Cast Spell Name", "CASTSPELLNAME", plateConfig, subTablePath, options.WidgetSettingsMapTables.SpellName, options.WidgetSettingsExtraOptions.SpellName, onSettingChanged, editObjectDefaultOptions, castBar)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
objectInfo = layoutEditor:RegisterObject(castPercentText, "Cast Time", "CASTSPELLTIME", plateConfig, subTablePath, options.WidgetSettingsMapTables.SpellCastTime, options.WidgetSettingsExtraOptions.SpellCastTime, onSettingChanged, editObjectDefaultOptions, castBar)
plateConfigObjectsInfo[#plateConfigObjectsInfo+1] = objectInfo
--[no plate config]
---@type df_editobjectoptions
local sparkOptions = detailsFramework.table.copy({}, editObjectDefaultOptions)
sparkOptions.can_move = false
objectInfo = layoutEditor:RegisterObject(newcastBarTargetName, "Cast Target Name", "CASTTARGETNAME", profileRoot, rootKey, options.WidgetSettingsMapTables.CastBarTargetName, options.WidgetSettingsExtraOptions.CastBarTargetName, onSettingChanged, sparkOptions, castBar.FrameOverlay)
--[no plate config]
objectInfo = layoutEditor:RegisterObject(castBarSpark, "Cast Spark", "CASTSPARK", profileRoot, rootKey, options.WidgetSettingsMapTables.CastBarSpark, options.WidgetSettingsExtraOptions.CastBarSpark, onSettingChanged, sparkOptions, castBar.FrameOverlay)
--designer.RefreshLayout()
--select the first object
layoutEditor:EditObjectByIndex(2)
editorMainFrame:SetAlpha(1)
local disabledAlpha = 0.2
local curCastBarValue = 0
local moveUpFrame = CreateFrame("frame", nil, editorMainFrame)
moveUpFrame:SetScript("OnUpdate", function(self, deltaTime)
--plateFrame.unitFrame:SetFrameStrata("HIGH")
plateFrame:SetFrameLevel(previewNameplateFrame:GetFrameLevel() + 100)
--unitFrame:Show()
--healthBar:Show()
--plateFrame.unitName:SetText()
--stops when the frame hides
--dv(plateFrame)
--castBarTargetName:Show()
castBar:Show()
castBar:SetMinMaxValues(0, 3)
castBar:SetValue(isCastBarSelected and curCastBarValue or 0)
if (curCastBarValue >= 3) then
curCastBarValue = 0
else
if not isCastBarSelected then
curCastBarValue = 0
else
curCastBarValue = curCastBarValue + deltaTime
end
end
--castBarTargetName:SetText("Target Name")
--castBarTargetName:Show()
--[=[ spark debug
local np = NamePlate1
local npcastBar = np and np.unitFrame and np.unitFrame.castBar
local spark = npcastBar and npcastBar.Spark
dv(spark)
--]=]
--check options
if (plateConfig[subTablePath].percent_text_enabled) then
lifePercent:SetAlpha(1)
else
lifePercent:SetAlpha(disabledAlpha)
end
end)
editorMainFrame:SetScript("OnShow", function()
previewNameplateFrame:Show()
plateFrame:Show()
layoutEditor:Show()
plateFrame:Show()
actorTitleSpecial:Show()
actorNameSpecial:Show()
healthBar:Show()
plateFrame.unitFrame:SetUnit("player")
unitName:SetText("Unit Name")
unitName:Show()
unitFrame.BuffFrame:Show()
unitFrame.BuffFrame2:Show()
end)
editorMainFrame:SetScript("OnHide", function()
previewNameplateFrame:Hide()
plateFrame:Hide()
layoutEditor:Hide()
plateFrame:Hide()
plateFrame.unitFrame:SetUnit(nil)
actorTitleSpecial:Hide()
actorNameSpecial:Hide()
C_Timer.After(1, function()
plateFrame:Hide()
end)
unitFrame.BuffFrame:Hide()
unitFrame.BuffFrame2:Hide()
end)
--/plater editmode
end
function Plater.UpdateCustomDesign(unitFrame)
end
function Plater.CreateCustomDesignBorder(frame) --need review
local frameBorderCustom = CreateFrame ("frame", nil, frame)
frameBorderCustom:SetPoint("topleft", frame, "topleft", -1, 1)
frameBorderCustom:SetPoint("bottomright", frame, "bottomright", 1, -1)
frame.customborder = frameBorderCustom
frameBorderCustom.texture = frameBorderCustom:CreateTexture(nil, "overlay")
frameBorderCustom.texture:SetAllPoints()
frameBorderCustom:Hide()
end
--plateFrame.PlateConfig = DB_PLATE_CONFIG.enemynpc
function designer.CreatePreview(parent)
plateFrame = CreateFrame("frame", "PlaterDesignerPlatePreview", parent)
plateFrame.isDesigner = true
plateFrame.UnitFrame = CreateFrame("frame") --blizzard's unit frame placeholder
plateFrame:SetScale(1.5)
--simulate the creation of a game's nameplate, this creates the nameplate.unitFrame and its widgets
platerInternal.Events.GetEventFunction("NAME_PLATE_CREATED")("NAME_PLATE_CREATED", plateFrame)
designer.UpdatePreview()
return plateFrame
end
function designer.UpdatePreview()
local DB_NAME_NPCENEMY_ANCHOR = platerInternal.VarSharing.DB_NAME_NPCENEMY_ANCHOR
local DB_PLATE_CONFIG = platerInternal.VarSharing.DB_PLATE_CONFIG
local DB_CASTBAR_HIDE_ENEMIES = platerInternal.VarSharing.DB_CASTBAR_HIDE_ENEMIES
local unitFrame = plateFrame.unitFrame
local plateConfigs = getProfileTable()
local needReset = true
local reaction = 4 --enemy
local unitID = "player"
unitFrame:SetUnit(unitID)
unitFrame.unit = unitID
unitFrame.namePlateUnitToken = unitID
unitFrame.displayedUnit = unitID
plateFrame.unit = unitID
plateFrame.OnTickFrame.unit = unitID
plateFrame.OnTickFrame.actorType = ACTORTYPE_ENEMY_NPC
unitFrame.PlaterOnScreen = true
local unitName = unitFrame.unitName
plateFrame.unitNameInternal = unitName
unitName:SetText(UnitName(unitID))
plateFrame.CurrentUnitNameString = unitName
local actorNameSpecial = unitFrame.ActorNameSpecial
local actorTitleSpecial = unitFrame.ActorTitleSpecial
local healthBar = unitFrame.healthBar
local powerBar = unitFrame.powerBar
local castBar = unitFrame.castBar
local castBar2 = unitFrame.castBar2
local PLAYER_IN_COMBAT = false
local actorType = ACTORTYPE_ENEMY_NPC
Plater.UpdateSoftInteractTarget(plateFrame)
plateFrame[MEMBER_GUID] = UnitGUID(unitID)
plateFrame[MEMBER_NAME] = UnitName(unitID)
unitFrame.IsNeutralOrHostile = actorType == ACTORTYPE_ENEMY_NPC
unitFrame.nameplateScaleAdjust = 1
unitFrame.targetUnitID = unitID .. "target"
unitFrame.InCombat = UnitAffectingCombat(unitID) or (Plater.ForceInCombatUnits[unitFrame[MEMBER_NPCID]] and PLAYER_IN_COMBAT) or false
plateFrame [MEMBER_REACTION] = reaction
unitFrame [MEMBER_REACTION] = reaction
unitFrame.BuffFrame [MEMBER_REACTION] = reaction
unitFrame.BuffFrame2 [MEMBER_REACTION] = reaction
--cache values into the unitFrame as well to reduce the overhead on scripts and hooks
unitFrame [MEMBER_NAME] = plateFrame [MEMBER_NAME]
unitFrame [MEMBER_NAMELOWER] = plateFrame [MEMBER_NAMELOWER]
plateFrame ["namePlateClassification"] = "worldboss"
unitFrame ["namePlateClassification"] = "worldboss"
unitFrame.unitNameInternal = unitName
unitFrame [MEMBER_UNITID] = unitID
unitFrame.BuffFrame [MEMBER_REACTION] = reaction
unitFrame.BuffFrame2 [MEMBER_REACTION] = reaction
unitFrame.BuffFrame.unit = unitID
unitFrame.BuffFrame2.unit = unitID
unitFrame.ExtraIconFrame.unit = unitID
plateFrame.playerGuildName = "Guild Name"
local no = false
local yes = true
unitFrame.Settings.ShowCastBar = yes
plateFrame.isPlayer = no
unitFrame.isPlayer = no
plateFrame.PlayerCannotAttack = no
unitFrame.InExecuteRange = no
plateFrame.actorType = actorType
unitFrame.actorType = actorType
unitFrame:SetUnit(unitID)
Plater.OnRetailNamePlateShow(plateFrame.UnitFrame) --affecting blizz nameplate which the preview only a dummy
unitFrame:Show()
unitFrame.unitName:Show()
Plater.AddToAuraUpdate(unitID, unitFrame)
Plater.EnsureUpdateBossModAuras(plateFrame[MEMBER_GUID])
plateFrame.NameAnchor = DB_NAME_NPCENEMY_ANCHOR
plateFrame.PlateConfig = DB_PLATE_CONFIG.enemynpc
Plater.UpdatePlateFrame (plateFrame, ACTORTYPE_ENEMY_NPC, nil, true)
unitFrame.Settings.ShowCastBar = not DB_CASTBAR_HIDE_ENEMIES
unitFrame.castBar:SetUnit (unitID, unitID)
--get threat situation to expose it to scripts already in the nameplate added hook
local isTanking, threatStatus, threatpct, threatrawpct, threatValue = UnitDetailedThreatSituation("player", unitID)
unitFrame.namePlateThreatIsTanking = isTanking
unitFrame.namePlateThreatStatus = threatStatus
unitFrame.namePlateThreatPercent = threatpct or 0
unitFrame.namePlateThreatRawPercent = threatrawpct or 0
unitFrame.namePlateThreatValue = threatValue or 0
--update the bars
Plater.UpdatePlateText(plateFrame, plateConfigs, needReset)
Plater.UpdateUnitName(plateFrame)
Plater.UpdateUIParentLevels(unitFrame)
Plater.UpdatePlateFrame(plateFrame, ACTORTYPE_ENEMY_NPC, nil, true)
Plater.OnUpdateHealth(healthBar)
Plater.QuickHealthUpdate(unitFrame)
Plater.UpdateBorderColor(unitFrame)
Plater.UpdateNameOnRenamedUnit(plateFrame)
Plater.FindAndSetNameplateColor (unitFrame, true)
Plater.UpdateCastbarIcon(castBar)
plateFrame.unitFrame.WidgetContainer = plateFrame.UnitFrame.WidgetContainer
if plateFrame.unitFrame.WidgetContainer then
plateFrame.unitFrame.WidgetContainer:SetParent(plateFrame.unitFrame)
plateFrame.unitFrame.WidgetContainer:ClearAllPoints()
plateFrame.unitFrame.WidgetContainer:SetIgnoreParentScale(true)
plateFrame.unitFrame.WidgetContainer:SetScale(Plater.db.profile.widget_bar_scale)
Plater.SetAnchor (plateFrame.unitFrame.WidgetContainer, Plater.db.profile.widget_bar_anchor, plateFrame.unitFrame)
end
unitFrame.CanCheckAggro = yes
Plater.Resources.UpdateResourceFramePosition()
Plater.NameplateTick (plateFrame.OnTickFrame, 999)
unitFrame.PlaterOnScreen = true
--create new fontstring to life percent to avoid issues with UnitHealth() returning a secret
---@type fontstring
local newLifePercent = healthBar:CreateFontString(nil, "overlay", "GameFontNormal")
healthBar.lifePercent_Safe = newLifePercent
healthBar.lifePercent_Safe:SetPoint("center", healthBar, "center", 0, 0)
healthBar.lifePercent:Hide()
---quest options dummy
---@type fontstring
local questOptionsFontString = castBar:CreateFontString(nil, "overlay", "GameFontNormal")
unitFrame.QuestOptionsDummyFontString = questOptionsFontString
--dv(healthBar)
local focusIndicator = unitFrame.FocusIndicator
local anchorFrame = plateFrame.PlaterAnchorFrame
--local actorLevel = healthBar.actorLevel
local obscuredTexture = plateFrame.Obscured
local extraIconFrame = unitFrame.ExtraIconFrame
local castBarIcon = castBar.Icon
local castBarText = castBar.Text
local castBarPercentText = castBar.percentText
local castBarTargetName = castBar.TargetName
--print(castBarTargetName:GetParent():GetName())
local newBarTargetName = castBar.FrameOverlay:CreateFontString(nil, "overlay", "GameFontNormal")
castBar.NewCastBarTargetName = newBarTargetName
local buffFrame1 = unitFrame.BuffFrame
local buffFrame2 = unitFrame.BuffFrame2
local targetNeonUp = unitFrame.TargetNeonUp
local targetNeonDown = unitFrame.TargetNeonDown
local targetOverlayTexture = unitFrame.targetOverlayTexture
local frameOverlay = healthBar.FrameOverlay
local healthCutOff = healthBar.healthCutOff
local shieldIndicator = healthBar.shieldIndicator
local executeRange = healthBar.executeRange
local executeGlowUp = healthBar.ExecuteGlowUp
local executeGlowDown = healthBar.ExecuteGlowDown
local raidTargetIcon = unitFrame.PlaterRaidTargetFrame.RaidTargetIcon
local extraRaidMark = healthBar.ExtraRaidMark
plateFrame:SetParent(UIParent)
plateFrame:SetFrameStrata("FULLSCREEN")
plateFrame.unitFrame:SetFrameStrata("FULLSCREEN")
Plater.UpdatePlateSize(plateFrame)
end