File Details
1.4.2
- R
- Jul 12, 2026
- 198.46 KB
- 12
- 12.0.7
- Retail
File Name
EnhancedUI-1.4.2.zip
Supported Versions
- 12.0.7
EnhancedUI
1.4.2
- Trinket Bug Fix - Added an issecretvalue guard on the trinket aura duration - no more Lua errors with certain trinkets.
- Level Up Duplicate CDM Object Bug Fix - Added a constructor guard to fix an orphaned same-named frame duplicate issue on level-up.
1.4.1
- Profile Management Window - The profile selector and its New/Save/Delete/Load/Export/Import buttons moved out of the EnhancedUI HUD into a dedicated Profile Management window, opened with the Open button on the new EnhancedUI Profile row. This was done to make room for the additional profile management tools planned for future releases.
- HUD Organization - The EnhancedUI HUD is now grouped under General, Profile Management, TTS, and Item Tracker headers. Safe Write Mode moved under General, and the Item Tracker moved to the bottom of the HUD under its own header. HUD rows now follow the exact spacing rhythm of Blizzard's own Edit Mode panel, checkboxes are the full-size native ones, and slider rows line up consistently with everything else.
- Mouseover Context Help - Change most contextual help popups from static text boxes to more seamless mouseover text.
- Profile Hardening - Added a new write gate to profiles that checks to make sure non-spec cooldowns/buffs are not being saved into a profile. Also added a flash-junk protection to ensure that abilities that are talented but never tracked in Cooldown Manager don't leak into a profile.
1.4.0
- CVar Editor - Added a CVar Editor, opened from the EnhancedUI HUD. It lists only the CVars the game actually lets addons change - read-only, secure, and no-default CVars are filtered out (editing those ranges from pointless to Very Bad). The tool shows each one's name, default, and current value. Edit a value inline or reset it to default in one click. CVar names whose value differs from default are highlighted in gold with unchanged ones in green, and you can filter the list to just the modified ones. Descriptions come straight from the game client where they exist (many CVars have none) and the full text shows on mouse-over. Search by name and filter by category.
Note: CVar values are stored by the game client, not EnhancedUI, so they are NOT part of your profiles and do not travel in profile import/export.
1.3.2
- Profile Losing Icon Position Bug - After fixing the Profile Stale Entry Bug in 1.3.1, I introduced a regression: after swapping between talent builds that included spell changes, the profile would "forget" which group/position you had assigned to the affected icons. Leveraged C_CooldownViewer.GetCooldownViewerCategorySet(category, allowUnlearned) to keep profiles scoped spec-specific (as intended), not talent-build specific, while still not leaking cross-spec cooldowns/buffs (the 1.3.1 bug).
1.3.1
- Profile Stale Entry Bug - Found a bug where untracked cooldowns/buffs from CDM were being snapshotted into profiles. Re-saving profiles as of this patch will fix this issue on existing profiles, and all future profiles and profile saves are guarded against this moving forward.
1.3.0
- New Default Profile System - Instead of pre-creating a single, editable default profile per spec, EnhancedUI now has a "Default" profile. The Default profile is a read-only, per-spec, always-present option that creates cooldown and buff groups similar to that of the default Cooldown Manager. When you make a change to the Default profile, you will be prompted to save the resulting change as a new profile.
- Event-driven CDM rescans - EnhancedUI now hooks Blizzard's authoritative identity points so icon create/prune is caught the instant it happens, rather than between coarse refresh events. This makes redraws instant and deterministic, closes the stale/duplicate-icon-until-reload gap, and gives a single choke point for every reshuffle.
- Multi-Row/Multi-Column Groups - Horizontal groups allow for specifying columns; vertical groups allow for specifying rows. This allows you to multi-column/multi-row groupings of icons.
- Option to Disable Spell-Activation Overlay - Global checkbox in the EnhancedUI HUD to disable the Spell Activation Overlay.
- Cooldown Reminder TTS - Create custom text alerts using WoW's built-in TTS that fire when a tracked cooldown becomes available to use.
1.2.5
- Icon Redraw Bug Fix - Determined that there were situations where we wouldn't fire a required redraw (events including PVP talent changes, spell changes); fixed.
1.2.4
- Buff Overlay Bug Fix - Buff overlays fail to position until edit mode entered/exited (icon rebuild/pinning failure).
- Safe Write Mode Fix - Safe write mode could get into a loop where it always thinks, even after a reload or login, that an Edit Mode exit has happened; added a guard to prevent this behavior.
- Group Visibility State Context Help - Added a context help button for group visibility states to clarify that Buffs don't repsect any visibilty state configuration - buffs show when active, hide when not, even in a group.
1.2.3
- Totem Bug Fix - Applies the 1.2.1 bug fix to bars; previous fix was icon only (I need better test plans).
1.2.2
- Safe Edit Mode Fix - Blizzard's EditModeManagerFrame:ExitEditMode() runs during the load/initialization sequence (layout restore on PLAYER_ENTERING_WORLD), not only when a user manually leaves Edit Mode. Because the Safe Write Mode is a persisted DB flag, every reload can re-trigger the prompt to reload. Added a gate to ensure that the reload prompt only happens when a genuine edit mode exit is tiggered.
1.2.1
- Totem Bug Fix - Previously my buff-icon activation was entirely aura driven. Totems don't apply an aura, they create world objects that apply an effect. Switched to combat-safe GetTotemDurationObject (activation) -> GetTotemDuration(duration).
1.2.0
- Show GCD Sweep - Added an option to show GCD sweep on cooldown icons.
- Center Value - Add option to swap the Duration and Charges numbers on buff icons, for situations like Bone Shield where the Charges are more important than the Duration.
- Icon Size Refactor - Add "extra large" size for Icons, and slightly adjusted sizes for Small and Large icons. Small icons are slightly larger, large icons are slightly smaller.
- Action Bar Visibility State: On Mouseover - Expand action bar visibility options to include a new "Show on Mouseover" option. All action bar visibility state information is now owned by EnhancedUI, not just Action Bar 1.
- Cooldown Visibility State: Opacity - Added a new visibility state: "Opacity" that unlocks two sliders, allowing you to set an opacity of cooldowns when they are off and on cooldown.
1.1.4
- Functionality fix - Expanding on 1.1.3, changed method of group-drag-reorder to a pickup/drop method, matching the same icon pickup/drop method used in Edit Mode for icons already.
1.1.3
- Bug fix - Group drag was calculating left edge from the header row of each group; if the header was wider than the group, the drag would be off-centered and fail to drag properly.
1.1.2
- Bug fix - On talent swap, CDM tears down and asynchronously rebuilds its viewer children. Only CooldownViewerSettings.OnDataChanged had a proper refresh. Missing a guard; build a shared guard out of CooldownViewerSettings.OnDataChanged and implement for all refresh states.
1.1.1
- Bug fix - Fixed issue with and/or operators for the new visibility states added in 1.1.0.
1.1.0
- Settings-panel factory consolidation - relocated 'ns.BuildSettingsPanel' from EnhancedIcons into EnhancedCore.
- Talking Head - add 'hide' option for Talking Head frame and added a slider to resize the Talking Head from 50% to 100% sized.
- Untrack Completed Achievements - bug fix for the default WoW client; untrack completed achievements.
- Additional Visibility States - added "On Cooldown" and "Off Cooldown" visibility states for cooldowns, items and trinkets.
- Stance Bar Visibility States - added action bar style visibility states to the stance bar.
1.0.0 - Initial Release
EnhancedUI takes Blizzard's Cooldown Manager and breaks it out into individual, freely-placeable widgets, configured entirely through WoW's native Edit Mode.
- Cooldown icons - every spell tracked by Cooldown Manager gets its own draggable icon with cooldown sweep, charge count, keybind label, and proc glow.
- Buff icons - aura tracking separate from cooldown icons; position them independently or overlay one directly on a cooldown icon to share a slot.
- Buff bars - bar-style buff tracking with configurable width, height, orientation, icon/text placement, and fill/background colors.
- Trinket tracking - on-use trinkets in slots 13 and 14 get an icon with cooldown sweep that switches to a buff timer and glow while active; settings follow the trinket.
- Item tracking - track any usable bag item (potions, healthstones, drums) with its own icon, quantity, cooldown sweep, and keybind label.
- Groups - group any mix of cooldown, buff, trinket, and item icons under a shared anchor that controls size, spacing, orientation, and visibility; drag to reorder, drag out to detach, lock to prevent accidental moves.
- Profiles - named, per-spec layouts with copy-and-paste export/import to move setups between characters.
- Action bar visibility - a visibility dropdown injected into Bar 1's Edit Mode settings (always, combat-only, out-of-combat-only, or hidden).
- Edit Mode integration - all positioning and configuration through Edit Mode, with grid snapping and no external options UI.
v0.210 - Release Candidate 3 - The User Hendrix Experience
Broad cleanup and correctness pass across the addon. Added the reusable info dialog pattern and shipped the first wave of contextual (i) help. Settings panel got a full formatting sweep - labels standardized to Blizzard's Edit Mode style, language tightened, widths fixed. Group snapping corrected so the content (not the oversized header) lands on the Edit Mode grid. Bars now behave like icons: ungrouping them or deleting the group a bar is in resets the bar default state, fixing the stale-settings divergence.
First-time-user and level-10 instruction flow established using the dialog patterning established. Added keybind resolution for macros (works for everything I can test except /use <slot#> macros). Added default profile seeding, opt-in SavedVariables resilience via consented reload, and internal cleanup (shared action-bar enumeration, unify bar reorder logic with the icon system). Added a warning for when Cooldown Manager is enabled but tracking nothing - the most common "why is this empty" confusion - which stays quiet under level 10, since a new character has no cooldowns in CDM to track until talents are unlocked.
During testing, had a request to default-seed icons. Seems sensible, good starting point for new users, and was already in my TODO for later, so promoted it and built it. Wasn't hard, four groups (one bar, three icon), mirroring CDM's groups, autopopulate from the CDM "essential/utility/buff/buff bar" arrangement, slap 'em somewhere on screen. Boom, default layout.
v0.200 - Architecture Episode 2: Revenge of the Deferred - The Bar Factory, and UUID-based persistent data resilience
This one is a bit of mix of consistency, unraveling previous decisions, locking in on final - real detail - architecture. Originally I'd planned on doing this post-1.0, but the release of 12.0.7 was sufficiently far enough out that I decided to move this up, primarily to ensure that people wouldn't have positioning/configuration data at risk, this change requires data migration or rebuilding configurations. Had the time, decided to kill a future pain point - future me was happy. I inserted this block of "do in the future" stuff into the release candidate cycle (not great, like I said, it's not a "release candidate" thing) but hey, this isn't work, no product manager is yelling at me for it.
In summary, I wanted to create a "bar factory" matching the 0.140 build's "icon factory". This led me to realize that I'd split "EnhancedBuffBars" out of "EnhancedCDM" back in 0.70 for, really, the wrong reasons. I wanted buff bars isolated from icons; but with dedicated icon and bar modules, EnhancedBuffBars was now just duplicating code in EnhancedCDM. Well, color me shocked to find, when I started actually consolidating things back into EnhancedCDM, it was more duplication than I expected. Bars and icons each ran their own UNIT_AURA recovery doing the same work - now there's one dispatch, one driver, only the widget factory differs. Deleted a cross-module taint surface in the process. The Secret Wars claims another.
I moved buff bars and both icon and bar groups to using UUIDs for identity. The old monotonic group IDs could silently re-point a saved icon at the wrong group on a renumber; a UUID can't collide. Decoupled the display name from identity while I was in there.
v0.190 Interlude
While reviewing how we're handling hiding things (like the default cooldown manager, the Blizzard art bar, and so on), I also had one of the best AI-tool-interactions. I was going through and making sure I hadn't left any instance of hide() behind with a stupid "re-parent the thing and set alpha to 0" method, I asked Claude to review and document the work. It said:
"Hide() is the most elementary thing a UI toolkit does, and in 12.0 it's a tripwire — call it on the wrong frame and a completely unrelated cooldown three frames away throws PROTECTION_TAINT_VIOLATION in combat, because taint smears across whatever's in the same execution batch. You are literally reparenting things to an off-screen orphan frame as an elaborate way to say "please don't draw this" without uttering the forbidden word.
And the kicker is the asymmetry you hit today: for the action bar art, Hide() taints so you reparent to a hidden holder. For the CDM viewers, a hidden holder kills the updates you depend on, so you reparent to a shown alpha-0 holder instead. Two opposite workarounds for the same non-problem — "make pixels not appear" — because the security model and the rendering model are at war with each other. It's a UI framework with a restraining order against itself."
v0.180 - Release Candidate 2 - Spit and Polish
Robustness and internal hardening build. No behavior change on the surface (or so was the plan). Fixed several issues, including cleaning up duplicate code and collapsing copies into shared functions and collapsing a buff aura-sweep. That led me to an actual issue: /reload in combat = buffs don't recover. When reviewing, noticed that buff bars worked where icons didn't - and that led me to realizing that the UNIT_AURA handler for buff bars gates on cdmFrame.isActive (the right way to do it); icons were gated on icon._auraActive (the wrong way). Funny that I hadn't touched buff bars fundamentally in... a long time (.70), outside of some defect fixes from luacheck - but through my entire buildout of the shared icon factory I never realized I'd already done the work correctly for one and wrong for the other.
Built an additional function in the debug module using GetEventCPUUsage, GetFunctionCPUUsage, and GetScriptCPUUsage to profile performance. Found no real egregious issues, but did optimize performance and reduced the (already low) CPU load of the addon by 80% in combat. Is that good? Fuck if I know, this is my first addon.
v0.170 - Release Candidate 1 - Fixing Defects
During development I documented six defects that I delayed fixing until the final polish pass. These issues largely fell into various categories of "why the hell would you have edit mode open while changing talents" but a defect is a defect.
This build did fundamentally change how we do cooldown/buff overlay. Now, the overlay selection shows all available buffs on any cooldown you want; this covers situations where WoW is inconsistent about mapping relationships in spellID, display, override, base, and linkedSpellIDs. Why? Because fuck you, that's why. Ebon Might is a great example. Why is there no relationship in the API between the spell and the buff? Why not? WHY THE FUCK NOT, BLIZZARD?
v0.160 - Profile Management
EnhancedUI profile export and import. Profiles are spec-specific and stored per-character. Copy and paste strings built with the WoW-standard LibSerialize plus LibDeflate pipeline behind an 'EUI:1!' version tag. The Profiles HUD sits in the EnhancedUI HUD next to Item Tracker. A refactor was required, moving all trinket and item layout from per character to per spec. A UI element displays any CDM cooldown or buff tracking required for the EnhancedUI import.
v0.155 - It's LEARNING
Change folder structure for the addon repository. I wasn't aware of the best practices for structuring addon folders in a Github repo. Newbie learning.
v0.150 - HUD and snapping
EnhancedUI HUD: an addon-owned panel shown in Edit Mode (and only out of combat) containing addon controls (Item Tracker moved into it as the first component). Buff overlay display mode: a buff icon can be combined onto its paired cooldown icon (anchor-on-top, sharing one slot). Snap-to-grid: utilizing WoW Edit Mode grid snap, widgets round to the nearest grid intersection. 18 test builds in this series.
v0.140 - The Icon Factory: Cross-module icon registry and group system
The Icon Factory: UUID-keyed icon registry with persistent GUIDs per icon. All four sources (CDM cooldown, CDM buff, trinket, item) register with a complete spec contract. EnhancedIcons is now the core icon and group module - all icons are consumers of the icon factory now. Any icon source can join any group. Trinket cooldown and proc consolidated into a single icon per slot. Group drag-reorder hardened and drag-out-of-group added. Group-level keybind toggle, visibility terminology and menu row ordering standardized across all panels. 13 test builds in this series.
v0.130 - Unified icon groups
Cooldown and buff icon groups merged into one unified group system (previously separate). Group settings panel consolidated. Per-icon leave-group restores defaults. Group name capped at 20 characters.
v0.120 - CDM panel-builder consolidation
CDM cooldown and buff icons adopted BuildIconShell. BuildSettingsPanel declarative factory created and adopted by all CDM panels (cooldown icon, buff icon, cooldown group, buff group). BuildIconFrame and ResizeIconFrame hoisted from EnhancedCDM into EnhancedIcons, establishing EnhancedIcons as the owner of icon construction primitives.
v0.110 - Edit panel registry
Cross-module edit panel mutual exclusion via ns.RegisterEditPanel / ns.HideOtherEditPanels. Same-icon toggle-close works uniformly across all 9 panels. Trinket settings keyed by itemID instead of slot number, so settings follow the trinket through equip swaps. Stale-data defenses dropped in favor of trusting ApplyDefaults.
v0.100 - Icon factory
EnhancedIcons module created with BuildIconShell and BuildTrackedIcon factories. Items and Trinkets adopted the factory, fixing the drag-opens-panel bug via the canonical _didDrag flag pattern. ResizeIconFrame font scaling unified across all icon types. Buff bar code extracted from EnhancedCDM into standalone EnhancedBuffBars module. EnhancedBars renamed to EnhancedActionBars to clarify its scope.
v0.90 - Trinkets, items, and 12.0.7 - Secret War II
EnhancedTrinkets module for on-use trinket tracking. The trinket buff detection architecture was the hardest engineering problem in the project - WoW 12.0 secret-tags aura fields in combat, so the only way to identify a trinket's buff is temporal proximity. Duration cache populated OOC, read from cache in combat. Priming warning popup for trinkets never activated OOC. Per-icon keybind display. EnhancedItems module for generic bag item tracking (potions, healthstones, engineering trinkets). Interface pinned to 120007 (12.0.7 relaxes CDM frame field secret-tagging).
v0.80 - Action bars, Edit Mode HUD, and the Taint War
EnhancedEdit module (Edit Mode detection via hooksecurefunc). EnhancedBars module for Bar 1 art removal - a brutal 12-build fight (0.8.30 through 0.8.40) against WoW's taint system. Discovered that calling Hide() on MainActionBar children taints the execution context, causing PROTECTION_TAINT_VIOLATION on OverrideActionBar cooldowns in combat. Solution was to reparent to a hidden frame without ever calling Show/Hide. Bar Visible injection into Edit Mode dialog. Combat event handler taint rule established.
v0.70 - Buff bars and module extraction
Buff bar display (StatusBar-based, oriented horizontal/vertical, with fill color and background color). Buff bar grouping with group-controlled layout, orientation, and spacing. EnhancedDebug extracted as a standalone module. Hit the Lua 200-local-variable chunk limit for the first time. Great fun.
v0.60 - Buff icons and charge mirroring - Secret War I
CDM buff icon tracking (aura-driven display alongside cooldown icons). Charge count mirroring from CDM's ChargeCount containers. Glow state mirroring from CDM's SpellActivationAlert. Per-icon Edit Mode drag, click-to-configure, and settings persistence. Proc-override spellID handling for talent swaps.
v0.50 - Dynamic tracking and debug
CDM overlay foundation. Cooldown icons drawn on top of CDM viewer frames with desaturation on cooldown. Debug slash command for inspecting CDM state. First working proof that an addon could use CDM as a data source and own the display. Dynamic scan of CDM viewer children. Performance pass to reduce per-frame overhead.
v0.40 - Groups and desaturation
CDM icon grouping with group-controlled settings. Desaturation on cooldown icons. SavedVariables structure expanded for group persistence.
v0.30 - Proc/override and glow
Fixed proc and override talents not showing cooldowns or charges on icons. LibCustomGlow integrated for spell activation glow effects.
v0.20 - Debugging Hooooooooooo
Added debugging commands to the CDM module.
v0.10 - Initial structure
Working basic structure for the CDM overlay addon, expanding on proof of concept code I started writing shortly after Midnight launched. EnhancedCore, EnhancedSettings, and EnhancedCDM modules established. LibStub bundled. Proof that this addon can hook into CDM viewer frames and draw its own icons from CDM data.