the cooldown pie survives a /reload, and Bagnon's bags keep their order

- the cooldown pie, the GCD sweep, minimap pings and the map arrow draw again after a logout, login or /reload; they went blank until a restart, which read as OmniCC killing the cooldowns (2113)
- an addon's own font on a button label keeps its face, size and outline instead of being undone every frame, MikScrollingBattleText's reported look (2112)
- an empty label reads as nothing rather than an empty string, so Cartographer's map label keeps its colour; a slider thumb with no authored size takes its art's own size, so Dewdrop's Look'n'Feel slider moves (2109, 2110)
- Bagnon's saved bag list comes back in the order it was written, so the keyring stops jumping to the front after a restart; hovering a Bagnon bag costs a third of what it did (2111, 2114)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-09-11 20:49:50 +07:00
co-authored by Claude Fable 5.1
parent d8de29bd9b
commit c775181933
26 changed files with 1256 additions and 90 deletions
@@ -60,15 +60,24 @@ pub(super) fn install(lua: &Lua, m: &Table) -> mlua::Result<()> {
// keeps an idempotent per-frame caller (the classic OnUpdate re-SetPoint idiom) from
// pinning the gate open — the same absorption the fingerprint gives, paid once at
// the write instead of per-frame over the whole model.
let changed = match model.layout_inputs.get_mut(&h) {
//
// **And it NAMES its node** (decision 2114, completing 1625's migration). Dropping
// every anchor is a retarget whose NEW target list is empty, and both lists are right
// here — so the cached graph's edges get unlinked instead of thrown away. Left on the
// conservative touch, this was the one recurring `[layout-derive]` site in a live
// hover sweep: `Bagnon_AnchorTooltip` opens with `GameTooltip:ClearAllPoints()` and
// then asks `frame:GetLeft()`, so the whole graph was re-derived INSIDE the handler,
// once per hovered item, and billed to `[ui-handlers]`' `OnEnter`.
let old: Option<Vec<u32>> = match model.layout_inputs.get_mut(&h) {
Some(input) if !input.anchors.is_empty() => {
let old = input.anchors.iter().map(|a| a.relative_to).collect();
input.anchors.clear();
true
Some(old)
}
_ => false,
_ => None,
};
if changed {
model.touch_layout();
if let Some(old) = old {
model.touch_layout_retarget_frame(h, &old, &[]);
}
Ok(())
})?,