The 0.5s ScheduleRepeatingTimer poll that caught these frames couldn't
catch them before their first-ever :Show() this session, since they're
created on-demand the instant the player opens them -- native art got
one frame of paint before the poll's next tick could skin it.
Switched to a generic ADDON_LOADED listener instead: it fires
synchronously (before control returns to whatever opens the frame)
the moment the owning addon finishes loading, so skinning now lands
before the frame is ever shown. Confirmed in-game via an ADDON_LOADED
probe on the talent frame's addon before implementing.
Also fixes a regression this introduced: TalentFrame's CropBackground
was caching the background texture's "original" tex coords on its
first-ever call for later crop math. That first call now happens
pre-Show, before Blizzard's own code sets the texture's real art-tile
region, so it was permanently baking in the XML-template default
(full 0..1) as the baseline. Moved the crop to run only from OnShow,
where the real coords are already set.
Bigger font and plate, tighter gap between tabs, taller tabs for real
vertical padding around the label. Selection now relies on Blizzard's
own white-text-on-checked behaviour instead of an ElvUI border/fill
swap, matching the Friends/Character tab rows elsewhere in ElvUI.
Growth and frame-level bump are self-healing from the tabs' OnUpdate
hook rather than one-shot: the tab's native height isn't settled yet
when it's first skinned, and something outside our control resets the
frame level on a plain tab switch, so both need to keep correcting
themselves rather than being set once behind a guard.
Skins the outer window, close button, search box, Filter dropdown
(and its arrow and popup panel), Purchase/Deliver buttons, and the
grid pager arrows. Removes nothing else -- the portrait originally
suspected at the top-left corner turned out not to exist as a
separate element, and the card grid/preview panel are left native.
Flattens the custom talent window into the ElvUI look: frame chrome, close
buttons, tabs, bottom bar, dropdowns and their popups, the list scrollbars,
and the spec choice cards' action buttons. The talent tree itself is left
alone -- its node borders encode rank and availability.
Most of the work is in keeping the skin applied. The frames restore their
native art on refresh in three different ways, and none of them fire an
event to hook:
- The scroll arrows re-show a region StripTextures had hidden, so the arrow
buttons re-hide it from their own update, matching by file so ElvUI's
panel pieces (which are regions of the same button on this client) survive.
- The pooled menu rows put their hover and selection art back when a scroll
refills them, without firing OnShow, so the strip runs from the row update
behind a cheap texture compare.
- The talent frame's close button keeps its absolute frame level while
TreeView rides along when the frame is raised, so the level bump re-applies
on every show.
Row fills and the selection edge are textures on the row rather than an ElvUI
backdrop: the backdrop is a child frame and covered the row's icon and text at
every frame level available to it.
Registers a COA entry into ElvUI's config-mode dropdown (General/ActionBars/etc.) and tags the Class Resources, Extra Action Bar, and Instance Swap movers with it, so they no longer surface mixed into ElvUI's General/ActionBars anchor filters.
Replace the "Drag to move" tooltip hint on class resource frames instead
of removing it wholesale, so text sharing the same line (e.g. "Right-click
for options") survives; match by substring rather than exact text and scope
by IsMouseOver since GameTooltip's owner can be a child region.
Guard against force-showing a class resource frame the game has never
naturally displayed: its underlying data (powerType, maxValue, ...) is
never populated for a class that doesn't use it, and forcing Show() on it
renders as a garbage white bar texture. Same fix as HideCoAUI's
seenNaturalShow guard.
Rename the Class Resources tab's checkboxes to the frames' actual global
names, stack them vertically, and add Hide All / Show All buttons below them.
Dragging is now permanently disabled on these frames, so the native
Lock/Unlock Frame option is meaningless. Reuses the UIDropDownMenu_AddButton
override pattern already used for LayerPickerFrameDropDown, generalized to
match any of the tracked frames' dropdowns by name convention or parent.
Move CoA settings from E.global/E.private into a proper AceDB-3.0 database
(CoA.db, SavedVariables ElvUI_CoADB) with a Profiles options tab, since
ElvUI doesn't ship AceDBOptions-3.0 (vendored under Libraries/).
Add ClassResources.lua: hooks the custom-class resource frames (segment
bar, orb, bar, multi-cast bar) into ElvUI's Toggle Anchors, with a
per-frame hide checkbox in a new "Class Resources" options tab.
Add DispelHighlight.lua: highlights dispellable debuffs on unitframes,
with talent-aware filtering for custom classes.
Fix mover/anchor reliability for Class Resources and the Instance
(LayerPicker) button:
- Movers were only retried until the target frame existed, not until the
mover was actually created, so frames that start at zero size (e.g. a
resource bar before that resource is ever active) permanently lost
their mover.
- Class resource frames re-anchor themselves on refresh, stomping the
mover's anchor; hook SetPoint to snap back to the mover holder whenever
something else repositions the frame.
- Native click-drag on these frames ends with the engine calling SetPoint
directly, severing the mover anchor entirely. Permanently block drag
(script and RegisterForDrag) instead of clearing it once.
The vanilla border baked into the icon texture grew visible again at
large button sizes since the covering rim used a fixed edge thickness.
Both the rim edge and the hotkey's corner inset now scale with the
button size to keep the border hidden and the hotkey clear of the rim
at any size.
Skinning of both the ExtraActionBar and LayerPickerFrame buttons is no longer opt-in. Replaces the old single Skins tab and its toggles with two empty tabs, Extra Action Button and Instance Swap, for future per-frame settings.
Adds the button to ElvUI's anchor/mover system, disables native dragging so it doesn't conflict, filters the now-broken "Reset Position" dropdown entry (scoped to this menu only), and raises the mover overlay above the minimap so it's grabbable in config mode.
Strips the native tooltip-style backdrop pieces off the LayerPickerFrame button and applies the ElvUI backdrop/button style, gated by a new Instance checkbox in the Skins tab.