Pinned frames: apply a raid layout's pinned config while editing/active#129
Closed
Krathe82 wants to merge 28 commits into
Closed
Pinned frames: apply a raid layout's pinned config while editing/active#129Krathe82 wants to merge 28 commits into
Krathe82 wants to merge 28 commits into
Conversation
…tling Route every border (frame, square/icon, bar, defensive icon, missing buff, resource bar, pet, targeted spells) through a single DF.Border engine with shared style / alpha / gradient controls and 10 animation effects (LibCustomGlow embedded). Add DF.Expiring with per-entry throttle + stagger for the expiring border ticker. Defensive-icon and missing-buff border fixes (frame level, co-planar with the icon, out-of-range fade preserved across re-renders). Adds the border & expiry system overview docs.
Default-value tweaks for new profiles: buff icon size 20, buff spacing 2, buff stack-count offsets, Stack/Duration outline SHADOW;OUTLINE, buff & debuff expiring border inset 0 (flush), plus minor text/aura/absorb/targeted default tweaks. (Targets border-rework's new border-key schema.)
The old default was opaque black, which is easy to mistake for empty
space on a dark health bar. New default is a translucent grey
(#757575 @ ~80% alpha) so the reduced-max region reads clearly.
Includes a one-time, value-guarded migration: any profile still on the
exact old black {0,0,0,1} is flipped to the new colour on load; any
profile with a customised (non-black) colour is left untouched, and a
per-mode flag means a later deliberate black choice is not reverted.
Iterate the new default from #757575CB to #808080CD (50% mid-grey at ~80% alpha). Migration bumped to V2 and now also catches the brief in-development #757575CB value (in-dev testers only) in addition to the original opaque black, so it lands on the final colour; customised colours are still left alone.
…targeted list - Role icons: Show Tank/Healer/DPS toggles apply live (no /reload), decoupled from the Hide-in-Combat gate. - Boss debuffs: widen Border Scale range to allow hiding the border, cap to +/-5, step by 1, add an explanatory tip. - Aura Designer: tear down indicators when AD is disabled; re-apply on profile swap. - Targeted list: don't show in test mode when the feature is disabled.
In replace mode ApplyHealthBar reset the underlying health-bar texture to the full configured alpha on every aura re-apply, while the OOR path (UpdateHealthBarAppearance / UpdateAuraDesignerAppearance) drove it to the faded healthbarEffectiveBlend. In element-specific OOR mode the two disagree on an out-of-range unit, and a phased unit — whose auras the client re-syncs constantly, firing UNIT_AURA in a tight loop — makes the re-apply re-assert full opacity many times a second, so the bar flashed. Read the OOR-aware effective blend here too (fall back to the configured alpha on first apply / in range). Regression from the a685d42 vertex-> frame alpha move, which made UpdateHealthBarAppearance OOR-aware but left this companion write using the raw alpha.
With framePadding 0 the health bar fills the whole frame and the border draws inward over its edge. In element-specific OOR mode the border fades to its OOR alpha, revealing the AD replace overlay/recolour sitting under it — so a green Renew indicator tinted the (class-coloured) border out of range. - Inset the AD tint/replace overlay by the frame border thickness so it never sits under the border (ApplyHealthBar, and re-applied in UpdateAuraDesignerAppearance so a range transition positions it immediately instead of waiting for the next aura tick). - Run UpdateAuraDesignerAppearance before UpdateHealthBarAppearance in UpdateAllElementAppearances: the AD pass writes healthbarEffectiveBlend (the OOR-aware bar alpha) that the health pass reads, so the underlying bar fades in lockstep with the border on the first out-of-range frame (no one-tick green flash).
…es, mono fonts - Upgrade status icons to modern Blizzard atlases (prefer atlas, fall back to the legacy texture); role icons prefer the LFG role atlases. - Live header previews per icon section (icon swatch or status text), greyed when disabled; the role preview tracks the selected style. - AFK icon timer: dedicated Timer Text controls, left-justified zero-padded MM:SS countdown that stays steady (no wobble); bundle Roboto Mono for an optional fully-static timer. - Restructure every status-icon section into collapsible Settings / Appearance / Position boxes (matching Aura Designer); collapse-bar arrow points up. - Rename Raid Target -> Target Marker; status-icon font/size/colour now apply to live frames instantly.
Follow-up work captured after the initial bundle was cut: * (Icons) New BG objective carrier icon — lights up a friendly party/raid member carrying a battleground objective (flag or orb), detected via UnitPvpClassification so it needs no aura access and renders on DF frames regardless of Blizzard frame state. Defaults on, centred; full Settings/Appearance/Position controls + preview. * (Icons) Target Marker section header preview now shows the four common markers (square/cross/triangle/circle), inset to match the other swatch sizes. * (Defaults) Summon/AFK icon defaults — Show-as-Text off, centred, repositioned; AFK timer text size 16, offset Y 1 (party + raid). * (GUI) Collapse-bar arrow points up and is more visible. * (Test Mode) Replaced test-mode buff/debuff preview icons that pointed at art removed in Midnight, so they no longer render blank.
New optional status icon showing the classic crossed-swords glyph (Interface\CharacterFrame\UI-StateIcon, swords quadrant) on a party/raid member who is in combat. Detection via UnitAffectingCombat(unit), secret-guarded; event-driven on UNIT_FLAGS (no new ticker) plus the normal status-icon refresh. Full Settings/Appearance/Position GUI, Config defaults (party+raid, off by default), export keys, and test-mode rendering — mirrors the BG-carrier icon pattern. Off by default; default position CENTER.
…ier + the center cluster)
…e "Icons" toggle The two test-panel preview toggles were confusing; combine them into a single "Icons" checkbox keyed on testShowStatusIcons (now default on). Repoints the role/leader render gate and the quick-preset writes to that key; testShowIcons is retired. One-time migration flips existing profiles on so role/leader icons do not disappear in test mode. Test-mode display only — no gameplay impact.
TD edit callbacks refresh via Preview:RefreshLiveFrames, which only iterated DF.unitFrameMap (live frames). Test-mode frames are a separate pool (DF.testPartyFrames / testRaidFrames, dfIsTestFrame), so edits never showed on the test frames the designer is looking at. Also refresh that pool when test mode is active; UpdateTextDesigner self-sources mock data via DataSource.Test, so a light TD-only refresh suffices (no full UpdateTestFrame). Covers the throttled drag path too (it shares RefreshLiveFrames). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit 3c464bbb7ae66457103c94ffe6319eea3ef5ce96)
…s resize The GUI page build cache is keyed on mode (party/raid) only, not on the active auto-layout. Switching between raid auto-layouts kept cacheValid=true, so RefreshCached (tab-switch path) took the cheap route and never rebuilt — tabs re-showed the previous layout's geometry. Most visible on the Aura Designer and Text Designer frame previews, which size their mock frame to the layout's frameWidth/Height at build time and so stayed stuck at the first-edited layout's size, making indicator/text placement misleading. Add GUI:InvalidateAllPages() and call it from AutoProfiles EnterEditing/ ExitEditing so every tab rebuilds for the active layout's frame size on next view. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit c8d3a442058c9bc52b8c963aa5b6720ec7001f67)
Both designer pages reuse their cached build when the db REFERENCE is unchanged: AD early-returns on prevDB==dbRef; TD has 'if state.built then return end' with teardown gated only on state.activeDB~=db. An auto-layout switch keeps the same raid db reference but changes frameWidth/Height, so both short-circuited and the preview mock stayed stuck at the first-edited layout's size (so InvalidateAllPages got BuildXPage called, but the internal reuse-guard skipped the rebuild). Make both reuse-guards dimension-aware: record the frameWidth/Height each build was made for (mainFrame.dfBuiltFrameW/H; state.builtFrameW/H) and force a full rebuild when they differ, so the preview resizes to the active layout. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit 6026b858c2226e9ff9aec931a2cf40325b21b9cf)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…errides
Table-valued overrides (auraDesigner, textDesigner, raidGroupVisible, …) showed
only '{table}' in the Override Details tooltip and the /df overrides chat dump,
hiding what was actually overridden. Both now recurse into the table and show the
real key=value contents (colours as (r,g,b), bools coloured). The tooltip is
depth- and line-budget-capped so a large config can't overflow it (with /df
overrides as the full scrollable dump); the chat version is depth-capped only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 99ab02b2cfa28be135f6e0d3c7f720f6fe68f3f7)
…+ covers Other Two follow-ups on the override expansion: (1) textDesigner sat in the 'Other' group, whose loop still printed the raw table — now expanded too. (2) A table override stores the WHOLE table, so dumping it showed the entire config, not just what the layout changed. Both the tooltip and /df overrides now DIFF the override table against the global (DF._realRaidDB[key]) via WalkOverrideDiff and show only the differing leaves. Tooltip stays depth/line-capped; chat is the full dump. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit 652c8869efa1601f6977db1d603d02ef516f90dd)
The override view recursed into textDesigner.elements and showed each element as its array index (1:, 2:). Expose DF.TextDesigner.ElementDisplayName(elem) (mirrors the editor's naming: auto-numbered label else the content-type's label) and use it in WalkOverrideDiff so elements read as 'Name', 'Current HP', 'Dead / Offline / Ghost', etc. — matching the Text Designer element list. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit 6415ed39e12adc5a9e073babc838fdeb7c286d60)
…it-time diff
Override tooltip and /df overrides:
- Collapse single-child wrapper chains into one breadcrumb and list the changed
leaves beneath it, instead of repeating a long path per leaf or truncating deep
Aura Designer configs to "{…}".
- Hide redundant flat siblings of a whole-table override (raidGroupVisible_N when
raidGroupVisible itself is stored), and stop ExitEditing's diff safety-net from
double-storing the whole table when flat keys already track it.
- Map textDesigner to its own tab instead of falling into "Other"; show TD element
names rather than array indices.
- One shared CountDisplayedOverrides so the row badge, editing status line and
/df overrides all report the same (deduped) count.
- While editing, diff against globalSnapshot: live previews are written into
_realRaidDB during editing, so diffing against it showed nothing changed for
table-valued overrides (the values matched the preview).
- Cap the tooltip body line count, always showing the "use /df overrides" footer.
Add /df clearoverride <key|prefix|all>: removes a stuck override from the layout
being edited (or the active/matched one) directly, for cases the settings UI can't
reach — e.g. a pinned-players override while not in a raid.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit e45852d2ed409b6368f216d7635c9f763e1c229f)
…override Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ing/active GetPinnedDB/GetActualMode chose party-vs-raid purely by IsInRaid(), but auto layouts are raid-scoped — their live preview lives in _realRaidDB and their active overlay in raidOverrides, both reachable only via GetRaidDB(). So a raid layout's per-set pinned overrides (players, etc.) were invisible outside an actual raid. Add UseRaidPinnedProfile(): treat "a raid layout is being edited" or "is the active runtime profile" as raid context, so GetPinnedDB/GetActualMode read the raid profile and the overrides apply during edit/preview and when active. Normal solo/party play (no layout edited/active) is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit cfe040d894e861e6ca1c67a3539c2d6b2ff22083)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
Author
|
Closing — on reflection this change is largely inert: the active-profile branch is redundant with IsInRaid(), and the editing branch only affects live frame rendering (which roster-filters, so absent pinned players don't show solo regardless). It also doesn't touch the pinned editor's player list. The genuinely useful piece — clearing a stuck per-layout override outside a raid — is covered by /df clearoverride in #128. |
Krathe82
pushed a commit
to Krathe82/DandersFrames
that referenced
this pull request
Jun 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pinned frames chose their config (party vs raid) purely by
IsInRaid(), but auto layouts are raid-scoped — their live preview and active overlay are only reachable via the raid DB. So a raid layout's per-set pinned overrides (pinned players, etc.) were invisible unless you were physically in a raid.GetPinnedDB/GetActualModenow treat "a raid layout is being edited" or "is the active runtime profile" as raid context, so those overrides apply during edit/preview and when active. Normal solo/party play (no layout edited/active) is unchanged.Pairs with the
/df clearoverridecommand in #128, which lets you clear such a pinned override even outside a raid.Stacks on #128; merge in order.