Skip to content

[RaidFrames] introducing new frame level properties for individual components#411

Open
maxzaleski wants to merge 10 commits into
EllesmereGaming:mainfrom
maxzaleski:raid-frames-enhancement-rework
Open

[RaidFrames] introducing new frame level properties for individual components#411
maxzaleski wants to merge 10 commits into
EllesmereGaming:mainfrom
maxzaleski:raid-frames-enhancement-rework

Conversation

@maxzaleski

@maxzaleski maxzaleski commented Jun 20, 2026

Copy link
Copy Markdown

This PR introduces user-configurable frame level control across most visual layers of the raid frames: name and health text, status overlays, indicators, aura icons, and Buff Manager indicators.

Previously, every component's z-order was hardcoded to a fixed offset constant (such as ns.LVL_AURA, ns.LVL_RAISE), which meant users who repositioned the name text to a centre or bottom slot had no way to resolve the resulting overlap with ready-check icons, status text, or aura icons short of a source edit.

In-game example (old) image

Targeted Spells, and indicators like Ready-Check / Summon Pending would overlap with the display name. Additionally, should one prefer to have debuffs or other auras outside of frame boundary, the hover/target border would cut these off.

In-game example (new)

image

Every component is displayed correctly. One will also notice on frame 2 (top-down, warrior) that both a private aura and a targeted spell are rendered at the same time; I set the TS to have a higher priority than PA.

New scale

eui_rf_new_scale
Key Offset Targets (by default)
Lowest +12 Text (name, health)
Low +13 Indicators
Medium +14 Auras (defensives, debuffs, targeted spells)
High +20 Raised border(s)
Highest +22 Above border(s)

The philosophy behind the new scale was to maintain backwards compatibility as much as possible while providing some flexibility to the user.

Text, indicators, and auras are now distributed over 3 distinct levels representative of their visual priority, +12, +13, and +14 respectively. The implication is that Indicators and auras no longer share the same ns.LVL_AURA level; auras still have a sufficient level buffer (from +14 to +20) to allow for flexible rendering. The threat/hover/target border remains unchanged at +20. The raid-marker "always on top" behaviour also remains unchanged; however, the user can now set other elements to that same level (such as my debuffs in the prior section).

Correction (21/06): threat border was originally set to +10; commit bda1dd5 adds dropdowns for both threat and dispel borders, these are now set to "medium" and "high" respectively.

Buff Manager aligned, not redesigned.

BM indicators already had a per-indicator frame-level dropdown (behindBorders → highest). Rather than adding a new pool-level key on top of that, FRAMELVL_BASE's three shared tiers (medium, high, highest) is now aligned to ns.FRAMELVL (new scale), so BM indicators occupy the same bands as every other component. The two BM-only fixed tiers (behindBorders=7, behindText=11) are intentional design positions - indicators explicitly placed there are exempt and unaffected. The text carrier offset was also made relative (off + 2) instead of pinned to the old fixed constant +18, which would have placed labels below their own icon at high or highest.

Summary Changes

New profile properties
Property Default Function
nameLevel "lowest" UpdateTextCarriersLevel
healthTextLevel "lowest" UpdateTextCarriersLevel
statusTextLevel "low" UpdateTextCarriersLevel
roleIconLevel "low" UpdateIndicatorsLevel
raidMarkerLevel "highest" UpdateIndicatorsLevel
readyCheckLevel "low" UpdateIndicatorsLevel
summonPendingLevel "low" UpdateIndicatorsLevel
leaderIconLevel "low" UpdateIndicatorsLevel
threatBorderLevel "medium" UpdateBordersLevel
dispelBorderLevel "high" UpdateBordersLevel
debuffLevel "medium" UpdateAurasLevel
defLevel "medium" UpdateAurasLevel
paLevel "medium" UpdateAurasLevel
tsLevel "lowest" TS_ApplySettingsStyleIcon

Each controllable layer follows the same end-to-end flow: a new string key is added to the profile defaults using one of five named tiers that map to absolute frame level offsets via s.FRAMELVL. A corresponding Frame Level dropdown is added to the options UI, reading and writing that key through the standard SVal / SSet helpers and triggering a ReloadAndUpdateon change.

On the render side, StyleButton creates a carrier frame for each layer and immediately calls a closure; ns.FRAMELVL[s.<key>] is read and applied relative to the unit button's current frame level. That closure is stored on d so both ReloadFrames and ReloadPartyFrames can re-invoke it when settings change without recreating any frames. The preview panel mirrors this: carrier frames are stored with f._ prefixes at creation, and ApplyPreviewData re-levels them on every settings refresh so the panel stays in sync with the dropdowns in real time.

Important

Please note that ReadyCheck and SummonPending now have uncoupled texture frames.

Screenshots

Settings Screenshot_2026-06-20_185434 Screenshot_2026-06-20_185413

These patterns are repeated where applicable.

…text carriers.

- StyleButton: three carriers created individually in their natural positions
  - UpdateTextCarriersLevel: defined once after d.AnchorStatusText, covers all three, called immediately and stored on d
- ReloadFrames / ReloadPartyFrames: single d.UpdateTextCarriersLevel() call after the status text block
- ApplyPreviewData: three inline relevels consolidated into one block after the status text block, sharing a single fpl local
- roleCarrier and markerCarrier stored on d; hardcoded levels removed
- d.leaderHost replaced ns.ApplyChatStrata with profile-driven level
- readyCheckCarrier created (previously readyCheck was a bare texture on health)
- summonPendingCarrier + d.summonPending texture added as a separate frame, splitting summon pending away from the shared d.readyCheck texture
- UpdateIndicatorsLevel() closure after d.readyCheck/d.summonPending, covers all five carriers; stored on d
- Called from ReloadFrames and ReloadPartyFrames after the raid marker block; ns.ApplyChatStrata calls removed from both
- CreatePreviewFrame mirrored: all five carriers with profile-driven initial levels, stored as
  f._roleCarrier, f._markerCarrier, f._readyCheckCarrier, f._summonPendingCarrier, f._leaderHost
- ApplyPreviewData: five-line relevel block

## Ready check / summon pending logic:
- UpdateReadyCheck split into three functions: ApplyReadyCheck (manages d.readyCheck, returns whether it showed), ApplySummonPending (manages d.summonPending), and UpdateReadyCheck as a thin dispatcher that preserves the priority rule (ready check suppresses summon pending)
- Preview ApplyPreviewData logic updated to use f._readyCheck and f._summonPending separately
… defensives, private auras)

Wires debuffLevel, defLevel, and paLevel through ns.STRATA_SCALE so all three aura icon pools respond to profile settings instead of the hardcoded ns.LVL_AURA offset.

- Store _durCarrier on debuff and defensive icons at creation so the elevel loop can reach the text carrier above the cooldown swipe.
- Add UpdateAuraLevels closure in StyleButton covering all three pools (debuffIcons, defIcons, privateAuraFrames) plus the dispel container; called immediately and stored on d, re-called from ReloadFrames and ReloadPartyFrames.
- Fix RegisterPrivateAuraSlots to use ns.STRATA_SCALE[s.paLevel] so level survives unit reassignment.
- Store _durCarrier on preview aura icons in MakePreviewAuraIcon.
- Relevel all preview aura pools (_pvDebuffs, _pvDefs, _pvPA, _pvDispelDebuff) in ApplyPreviewData so the settings panel reflects changes in real time.
- Rename: ns.STRATA_SCALE → ns.FRAMELVL across EllesmereUIRaidFrames.lua (34 sites) and the comment in EUI_RaidFrames_Options.lua
- BM alignment: FRAMELVL_BASE medium/high/highest now reference ns.FRAMELVL; text carrier offset changed from the fixed +18 to off + 2; unused FRAMELVL_TEXT constant removed
- ReadyCheck and SummonPending now display the correct icon (cog instead of direction arrows)
- TargetedSpells now include frame level dropdown (originally missed)
@EllesmereGaming

Copy link
Copy Markdown
Owner

wow this is an insanely well done PR, i'll look into this soon. quick question, does it make sure to set defaults to existing hardcoded values so user settings are completely unaffected unless they actively change one?

@maxzaleski

maxzaleski commented Jun 21, 2026

Copy link
Copy Markdown
Author

Hey Ellesmere, to my understanding DeepMergeDefaults will fill-in the new/missing keys at render time – I don't believe there to be any inherent conflicts with the existing layout (since most of strata setters used constants). The only caveat is that under the new scale, targeted spells are now "2" levels above what they were previously (text > indicators > TS/auras for visibility purposes).

My understanding of the engine (EUI) as a whole is limited, but I have been consistently reloading my changes with an existing profile without any Lua errors. I will report back tomorrow with a fresh profile, and double-check that it behaves as expected.

Edit: I would be happy to send you my current profile string should that be of any help to you.

@maxzaleski maxzaleski force-pushed the raid-frames-enhancement-rework branch from c4f31af to 63d4174 Compare June 21, 2026 02:53
@maxzaleski maxzaleski force-pushed the raid-frames-enhancement-rework branch from 192dda7 to bda1dd5 Compare June 21, 2026 03:12
@maxzaleski maxzaleski changed the title [Raid Frames] introducing new frame level properties for individual components [RaidFrames] introducing new frame level properties for individual components Jun 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants