promotional bannermobile promotional banner

MathWroQOL

A small QOL addon with some specific features for a variety UI improvements

File Details

v1.3.0

  • R
  • Apr 6, 2026
  • 55.45 KB
  • 7
  • 12.0.1
  • Retail

File Name

MathWroQOL-v1.3.0.zip

Supported Versions

  • 12.0.1

MathWro QOL

v1.3.0 (2026-04-06)

Full Changelog Previous Releases

  • Merge pull request #1 from MathWro-WoW/feat/combat-tracker-fixes
    feat: Combat Tracker settings overhaul
  • chore: remove notes2.txt from tracking (already in .gitignore)
  • docs: update README with Combat Tracker, Combat Logging, and Edit Mode features
  • fix(config): dynamic scroll height and conditional layout visibility
    • Replace hardcoded scroll height (2600px) with RecalcScrollHeight that
      measures actual content on each panel show
    • Replace hardcoded gated container height (1200px) with recalcGatedHeight
      that sizes from visible children
    • Add FindScrollChildAndRecalc utility to bubble scroll recalc up the
      frame hierarchy from any child
    • Hook scroll recalc into collapsible section expand/collapse, merge/layout
      toggles, and item order list changes
    • Move 'Merge into' before Layout in section settings; hide Layout, Icons
      per row, and Anchor direction when merged
    • Show 'Icons per row' only when layout is grid (rename from Grid columns)
    • Fix MakeOptionRow to use single RIGHT anchor, avoiding WoW Y-value
      averaging with conflicting anchor points
    • Forward-declare mergeRow/layoutRow/gridRow/growDirRow/sizeSep to fix
      Lua 5.1 closure scoping
  • feat(consumables): add reorderable item list with rank icons and ElvUI arrow support
    Add nested collapsible 'Item Display Order' section to consumables config
    panel. Users can reorder all tracked items (predefined + custom) with
    up/down arrows. Order persists in itemOrder SavedVariable and controls
    in-game icon display.
    • Dynamic rank detection via C_TradeSkillUI for custom items
    • Midnight-style quality diamonds (Tier1 silver, Tier2 gold)
    • ElvUI-aware arrow textures with common-icon-arrow fallback
    • Expose CONSUMABLE_IDS, BuildDefaultOrder, sections on CombatTracker
    • Add itemOrder default to Core.lua savedvariables schema
  • fix(consumables): update potion IDs to Midnight and add fleeting priority
    Replace TWW potion IDs with Midnight equivalents (Silvermoon Health,
    Lightfused Mana, Potion of Recklessness, Light's Potential). Add fleeting
    variants for combat and mana potions with priority logic that suppresses
    the regular version when the fleeting equivalent is in bags.
  • feat(config): restructure settings UI with cards, collapsible sections, and layout helpers
    Rewrites Config.lua settings panels to use MakeCard, MakeCollapsibleSection,
    MakeOptionRow, and MakePanelScaffold helpers for a cleaner, more organized UI.
    Key fixes:
    • MakeSeparator now wraps texture in a Frame to resolve deferred anchor issues
      (bare Textures with two-point anchoring return nil from GetBottom)
    • MakeCollapsibleSection uses atlas arrows instead of Unicode (font support)
    • MakeCard content uses TOPLEFT + RIGHT instead of conflicting TOPRIGHT
    • BuildSectionBlock uses MakeOptionRow for consistent label/control alignment
      Updates AGENTS.md and copilot-instructions.md with new helper docs and pitfalls.
  • Ignore superpowers
  • docs(agents): add performance rules section; ignore notes.txt
    • Document OnUpdate prohibition, BAG_UPDATE debounce pattern,
      cooldown frame cache pattern, and event scope guidelines in AGENTS.md
    • Add notes.txt to .gitignore
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • feat(combat-tracker): anchor direction, stack counter, cooldown text, custom item tracker
    • Add growDirection per section (Grow Right/Left/Down/Up/Center H/V): LayoutSection
      snapshots the stable edge before resize and re-anchors after so icons don't drift
      when count changes
    • Add custom cooldown countdown text (cdCountText, centered) replacing built-in
      CooldownFrame numbers; 0.1 Hz ticker drives updates; formats Xh/Xm/XX/X.X
    • Add stack counter (countText, bottom-right) on all buttons; consumables shows
      count > 1 automatically
    • Per-section font config (enabled checkbox + size slider + font dropdown) for both
      stack counter and cooldown text, shared via CT:ApplySectionFont / ApplyCooldownFont
    • Redesign custom item tracker: input+Add button, live icon/name list with × remove
    • Fix C_Item.GetItemCooldown crash in Midnight (returns scalars, not table)
    • Fix hideIfMissing nil-safety: nil now treated as true (hide missing items)
    • Fix dropdown arrow: Arrow-Down-Up texture, gold colour, flips on open/close
    • Apply ElvUI HandleSliderFrame to game menu scale slider
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • feat(config): apply ElvUI skin to Config.lua widgets when ElvUI is loaded
    Add ElvSkin() helper; apply HandleCheckBox to all checkboxes, HandleSliderFrame
    to MakeSliderWithInput sliders, ElvUI media colours to displayBtn/dropdown btn
    and popup backdrops, and HandleButton to the Combat Tracker Reset Positions button.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(config): prevent multiple dropdown popups from being open simultaneously
    • Add module-level _openDropdownPopups table to track open dropdown popups
    • Register each new popup in the table when created
    • Add OnShow hook that closes all other open popups when any dropdown opens
    • Fix frame level: replace relative calculation with explicit safe value of 2
      Fixes issue where dropdown menus could stack and remain visible simultaneously.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • refactor(config): replace UIDropDownMenuTemplate with custom dropdown widget
    Eliminates the built-in arrow-button overlap and checkbox-square visual
    bugs by building a bespoke backdrop button + floating popup list entirely
    from scratch. All three call-site SetPoint offsets updated from -16 to 8
    now that the template's invisible padding is gone.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • style(combat-tracker): Improve visual styling for consistency and clarity
    • Section headers (RACIALS, TRINKETS, CONSUMABLES, MASQUE SKINNING): changed text color to gold (1, 0.82, 0, 1)
    • Separators: darkened from (0.4, 0.4, 0.4, 0.5) to (0.3, 0.3, 0.3, 0.8) for better contrast
    • MakeSliderWithInput labels: switched from GameFontHighlightSmall to GameFontNormalSmall for bolder appearance
    • Combat Tracker panel title: added gold text color (1, 0.82, 0, 1) to match WoW standard category title styling
    • Global enable checkbox: increased top spacing from y=-12 to y=-16 for better breathing room
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): wire EditModeNudge to LibEditMode CT frames
    Hook the LibEditMode selection overlay OnMouseDown to call
    EditModeNudge:AttachToFrame so nudge arrows appear when clicking a CT
    anchor frame in Edit Mode. Arrow OnClick now manually offsets frames
    that lack ProcessMovementKey (LibEditMode frames) instead of no-oping.
    Expose addon.editModeNudge and add the public AttachToFrame method.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • refactor(config): replace MakeCycleButton with MakeDropdown (UIDropDownMenuTemplate)
    Removes the click-to-cycle button pattern and replaces it with native
    WoW UIDropDownMenu dropdowns for Layout, Grid Columns, and Merge Into
    selectors in the Combat Tracker config panel. Applies -16px LEFT offset
    to compensate for UIDropDownMenuTemplate's built-in internal padding.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(edit-mode-nudge): make coordinate label screen-centre-relative
    UpdateCoordLabel now converts frame position to centre-relative offsets
    using GetCenter() instead of GetPoint() offsets. Coordinates are now
    always relative to screen centre (X=0, Y=0) regardless of the frame's
    anchor point.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • feat(combat-tracker): add Reset Positions button to config panel
    Inserts a UIPanelButtonTemplate button between the global enable
    checkbox and the first separator. Clicking it writes the default
    centre-spread positions for racials/trinkets/consumables frames into
    addon.db and calls NotifyFeature to re-apply immediately.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): populate _allRacialNames at login so racial toggles appear immediately
    Config panel now reads _allRacialNames (populated in Initialize() from static
    RACIAL_DATA without an IsSpellKnown check) instead of _racialEntries (which
    requires RebuildIcons() to have run with IsSpellKnown returning true, which
    may not happen until after the first spell cast at login).
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(config): /mqol slash command now opens General sub-panel
    • Store generalCat return value from RegisterCanvasLayoutSubcategory
    • Update slash command to use Settings.OpenToCategory(generalCat:GetID())
    • Fix fallback to use InterfaceOptionsFrame_OpenToCategory(generalPanel)
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): update default values
    • Disable combatTracker by default (enabled: false)
    • Enable onUseOnly for trinkets frame (onUseOnly: true)
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): click-to-edit slider value with FontString+EditBox
    Show value as a FontString (always renders). Clicking the value area
    swaps to a focused EditBox — focused EditBoxes always paint their text,
    avoiding WoW's unfocused EditBox repaint bug. On Enter/focus-loss the
    value is committed, EditBox hides, and FontString updates.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): replace slider EditBox with FontString for value display
    WoW EditBox does not repaint text when SetText is called before the box
    has ever been focused, regardless of template or workarounds. FontString
    always renders on SetText. The slider (step=1, range 16-80) is sufficient
    for precision without a typed input field.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): force EditBox repaint via Hide/Show in Refresh
    WoW EditBox does not redraw its text region after SetText unless a
    render event is triggered. Toggling Hide()/Show() within the same
    frame forces a fresh render pass, making the value visible immediately.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): replace InputBoxTemplate with plain EditBox+backdrop
    InputBoxTemplate's OnShow handler prevents SetText from rendering until
    the box is focused. Using a plain EditBox with manual backdrop/font means
    text renders immediately on SetText with no template interference.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): remove SetNumeric to fix invisible slider input text
    SetNumeric(true) suppresses text repainting until the EditBox is focused.
    applyInput() already validates with tonumber()+clamp so the constraint
    is unnecessary. Removing it lets the text render immediately on show.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): populate slider input on EditBox OnShow
    Hook input:HookScript("OnShow") to set the text from DB after
    InputBoxTemplate's own OnShow fires, which was clearing any text
    set earlier. panel OnShow was unreliable for Settings subcategories.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): defer panel refresh past child OnShow events
    InputBoxTemplate fires OnShow on child frames after the parent panel's
    OnShow, clearing any text set by Refresh(). Wrapping the refresh loop
    in C_Timer.After(0) defers it to the next tick so all sub-frame OnShow
    events have already fired before we populate slider input boxes.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): initialize sliders to DB value at creation time
    MakeSliderWithInput now calls Refresh() immediately after construction,
    matching the pattern MakeCycleButton already uses. Fixes blank input boxes
    on first panel open when the Settings API doesn't fire OnShow on the frame.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • feat(combat-tracker): integrate LibEditMode for native Edit Mode glow and drag
    Bundle LibStub + LibEditMode (from AbilityTimeline, MINOR=15) into Libs/.
    Replace the custom blue-backdrop overlay with LibEditMode:AddFrame(), which
    provides the real gold-glow selection highlight and drag normalization used
    by WoW's native Edit Mode UI. Removes UpdateEditOverlays() and the manual
    hooksecurefunc Enter/ExitEditMode hooks from CombatTracker.lua.
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • fix(combat-tracker): Edit Mode overlay for drag; lock movement outside Edit Mode
  • fix(combat-tracker): forward drag from icon buttons to section frame
  • fix(combat-tracker): use C_Spell/C_Item namespace APIs for cooldown queries (Midnight)
  • fix(combat-tracker): replace goto/continue with if-block (WoW is Lua 5.1)
  • fix(combat-tracker): correct racial hiddenSpells toggle logic
  • feat(combat-tracker): options panel with sliders, cycle buttons, racial toggles
  • feat(combat-tracker): consumables section with debounced bag scan
  • feat(combat-tracker): trinket section with on-use detection and cooldown
  • feat(combat-tracker): racial section with cooldown tracking
  • feat(combat-tracker): frame engine, layout, button factory, Initialize/Apply, Masque
  • feat(combat-tracker): scaffold TOC entries and Core defaults