File Details
v1.4.6
- R
- Apr 12, 2026
- 466.45 KB
- 44
- 12.0.1
- Retail
File Name
Barshelf-v1.4.6.zip
Supported Versions
- 12.0.1
v1.4.6
Bug Fixes
- LFG eye saved position wasn't sticking:
OnMouseUpwas correctly writingdb.profile.queueStatusButtonPointto disk, but Blizzard's reparent flow (fired on vehicle/zone/stance transitions and other UI refreshes) doesSetParent(MicroMenuContainer); SetPoint(..., MicroMenuContainer, ...)— ourSetParenthook caught the parent change, but Blizzard's subsequentSetPointran immediately afterwards and overwrote the button's anchor back toMicroMenuContainercoordinates. The save was fine; the live position was being clobbered. TheSetParenthook now schedules aC_Timer.After(0)deferred restore that readsdb.profile.queueStatusButtonPointand re-applies it on the next frame, after Blizzard's full reparent + reposition pass. Guarded against active drags (self._barshelfMoving) so it never fights the user's in-progress move.
v1.4.5
Bug Fixes
- Empty action bar slots blinking when opening a shelf (long-standing):
LayoutBarPopupunconditionallyShow()ed every managed slot, and Blizzard'sActionBarActionButtonMixin:OnShow→UpdateAction→HideGrid→Hidecycle caused a one-frame flash of visible empty slots every time the popup opened. Most visible on non-12-slot layouts (e.g. a 3×3 bar) where internal state churn is more frequent. Now:LayoutBarPopupgatesShow()onHasAction(button.action)or thealwaysShowActionBarsCVar, matching Blizzard's native rule. A defensiveHookScript("OnShow")on each managed button also re-Hide()s empty slots that Blizzard shows outside of an active drag — same game frame, nothing renders between Show and Hide. A module-level_barshelfDragShowingflag, toggled by theACTIONBAR_SHOWGRID/HIDEGRIDhandler, lets drag-timeShowthrough. - Custom Shelf list mode broken when Masque is enabled: list mode builds a wide
rowWidth × bszbutton with the icon texture anchoredLEFTatbsz × bsz, but Masque skin definitions assume a square button andSetAllPoints(button)the Icon region — so the icon and border stretched across the entire row. Custom-shelf buttons now skip Masque registration whenconfig.layout == "list". Switching layouts triggers a rebuild, so the decision is re-made each toggle.
New Features
- Masque integration for Custom Shelves: Barshelf registers its custom
SecureActionButtons with Masque under a dedicated "Custom Shelves" group, so users can skin them independently of their main bars. Bar / Micro / Bag shelves are already skinned natively by Masque's built-in hooks forActionButton,MultiBar*,MicroButton*, and bag slots (reparenting doesn't break them), so no registration is needed there. A callback onSkinID/Scalechanges re-runs the popup layout so button-dimension changes take effect immediately. Declared via## OptionalDeps: Masquein the TOC.
v1.4.4
Bug Fixes
- Bar shelf leaving orphaned slots on the original bar:
AddBarShelfcounted visible buttons viaIsShown()andActivateBarShelfonly reparented that many, leaving any button Blizzard had hidden (e.g. via Edit Mode "Num Icons" < 12) in its originalMultiBar*ButtonContainer. WhenEditModeActionBarMixin:UpdateVisibility/UpdateShownButtonsre-ran (combat end, Edit Mode toggle, zone change), those orphaned buttons reappeared at the native bar position. Now iterates1..info.countunconditionally; managed buttons go in the popup, excess buttons are parked in a per-shelf hidden holder frame. - Visibility feedback loop with
EditModeActionBarMixin: the previous approach registered a"hide"visibility state driver on the Blizzard bar frame and hooked itsOnShowto re-call:Hide(). BecauseMultiBar*:Hide()is intercepted bySetShownOverride, Blizzard'sUpdateVisibilitywould callShowBase→ fireOnShow→ our hook →:Hide()→ recalc → loop. Removed the state driver andOnShowhook entirely; since all 12 buttons are now reparented out, the bar's containers are empty and nothing visible is left to hide. - Removed unused bar-shelf watchdog
OnUpdate: Blizzard doesn't reparent action buttons the way it reparents micro buttons (noUpdateMicroButtonsParentequivalent), so the 1 s reparent-reassert loop on each bar popup was dead weight and contributed to the "frequent polling" feel.
v1.4.3
Bug Fixes
- LFG "eye" icon disappearing with the micro menu shelf:
QueueStatusButtonis declared as a child ofMicroMenuContainerin Blizzard'sQueueStatusFrame.xml, so hiding the container also hid the Group Finder eye. The eye is now reparented toUIParentwhile a micro shelf is active and survives Blizzard'sUpdateMicroButtonsParent()via ahooksecurefunconSetParent(with reentrancy guard). Reattached to its original parent on deactivate, profile change, and Edit Mode entry.
New Features
- Movable LFG eye: Shift + left-click-drag the Group Finder eye to reposition it. Uses
OnMouseDown/OnMouseUpinstead ofOnDragStartfor instant response (no movement-threshold wait). Position persists per-profile indb.profile.queueStatusButtonPoint. Default location isBOTTOMRIGHT -40, 200. - Smart info panel anchor:
QueueStatusFrame(the queue info panel) now flips anchor based on which screen quadrant the eye is in, so it always extends toward screen center instead of flying off-screen when the eye is dragged to an edge. - Move hint in the info panel: A small "Shift-drag the eye to move" line is added to the bottom of
QueueStatusFramewhile the micro shelf is active.hooksecurefunconSetHeightreserves bottom padding so the hint never collides with Blizzard's dynamic queue content.
v1.4.2
Bug Fixes
- Action Bar 3/4/5 mapped to the wrong Blizzard bar:
BAR_INFOused the legacyMULTIACTIONBAR1..4ordering, so picking "Action Bar 5" reparentedMultiBarBottomRightButton(Blizzard's Action Bar 3) and "Action Bar 4" reparentedMultiBarLeftButton(Blizzard's Action Bar 5). Remapped indices 3/4/5 to match Edit Mode: Action Bar 3 → BottomRight, Action Bar 4 → Right, Action Bar 5 → Left. Existing saved shelves keep theirbarIDand will now show the bar their label claims.
v1.4.1
Bug Fixes
- Empty bar shelf slots not showing during drag: Reparented action buttons were missing Blizzard's
ShowGridbroadcast (sent to action bar children only). Now listens forACTIONBAR_SHOWGRID/ACTIONBAR_HIDEGRIDevents and forwardsShowGrid/HideGridto reparented buttons, keeping the internal counter in sync so empty slots stay visible while dragging. - Right mouse button stuck when entering combat: The click-outside-to-close backdrop was a
ButtonwithEnableMouse(true), consuming all mouse events including right-click even though only left-click was processed. Changed to aFramewithSetPropagateMouseClicks(true)so right-clicks always pass through to the game world.
v1.4.0
New Features
- List layout mode for custom shelves: New per-shelf "Layout" dropdown (Grid / List). List mode shows buttons in a vertical single-column layout with icon, spell/item name, and hotkey per row. Popup width auto-adjusts to label lengths (150–300px). The
# of Rowsslider is hidden in list mode.
Bug Fixes
- Shelf rename not saving: Edit boxes now save on focus-lost (blur) in addition to Enter, fixing rename inside the Blizzard Settings panel where Enter/Backspace/arrow keys were intercepted. Escape reverts to the previous value.
- Arrow/Backspace keys not working in edit boxes: Keybind capture buttons were consuming keyboard events even when not in listening mode. They now propagate keys through when inactive.
- Flyout spells silently rejected: Dragging a flyout spell (e.g. Hunter Pet Skills, Mage Portals) onto a custom shelf now shows a helpful message instead of silently ignoring the drop.
v1.3.3
Bug Fixes
- Right mouse button getting stuck: The click-outside-to-close backdrop was registering for all mouse buttons (
AnyUp), which could swallowRightButtonUpevents before the game received them — causing the right mouse button to appear stuck. Now only listens for left-click.
v1.3.2
Bug Fixes
- Cooldown taint errors in combat: Fixed "secret values are only allowed during untainted execution" errors. In 12.0.1, addon code cannot pass secret cooldown values to ANY display function (
SetCooldown,CooldownFrame_Set,SetTimeFromStart— all reject secrets from tainted code). Now usesisActive(boolean, never secret) to branch, andissecretvalue()to detect secret values before passing them. Cooldowns display normally outside combat; gracefully degrade during combat when values are secret.
v1.3.1
Bug Fixes
- Shelf rename not working: Fixed label edit box not responding to Enter/Backspace. Switched from
BackdropTemplatetoInputBoxTemplatewhich properly handles keyboard input inside the Blizzard Settings panel.
v1.3.0
New Features
- Mount support on custom shelves: Drag mounts from the Collections journal onto custom shelf buttons. Uses
/castmacro for reliable summoning. - Battle pet support on custom shelves: Drag companion pets from the Pet Journal onto custom shelf buttons. Summons via
/summonpet. - Keybindings for custom shelves: Assign key bindings to individual custom shelf slots via the per-shelf settings panel. Bindings work even when the popup is closed (via invisible proxy buttons). Keybind text shown on each button.
Improvements
- Cooldown display on custom shelves: Proper dark "pizza" sweep overlay with countdown text, matching Blizzard's native action buttons. Uses
issecretvalue()to handle 12.0.1 secret combat values gracefully. - GCD animation: Global cooldown sweep now shows on all custom shelf buttons. Event-driven via
SPELL_UPDATE_COOLDOWN/ACTIONBAR_UPDATE_COOLDOWNfor instant response. Off-GCD abilities (defensives, some trinkets) correctly skip the sweep. - Handle icon for mounts, macros, and battle pets: Dock handle now picks up icons from all custom shelf action types, not just spells and items.
Bug Fixes
- Items not activating on click: Fixed
SecureActionButtonTemplateitem attribute format — now uses"item:ID"string instead of raw numeric ID. - Item cooldowns not displaying: Fixed
C_Item.GetItemCooldownreturn value unpacking — returns three separate values, not a table (unlikeC_Spell.GetSpellCooldown). Added bag/equipment scan fallback with location caching for combat safety.
v1.2.1
New Options
- Click outside to close popups: Toggle in General settings. When disabled, shelf popups stay open until their handle is clicked again — useful for dragging spells from the spellbook onto action bar shelves without the shelf auto-closing.
- Center popups on dock: Toggle in General settings. Centers shelf popups horizontally on the dock instead of aligning them to their individual handle. Both options are off by default (existing behavior preserved).
Improvements
- Pinned popup drag grip: The grip is now a visible tab that protrudes above the popup frame (16px, with background and dot pattern). Hidden at idle and appears on mouseover for a cleaner look.
- Grip integrated with popup fade: Hovering the grip keeps the pinned popup at full opacity; the grip shares the same enter/leave polling as the popup itself.
Bug Fixes
- Blizzard Action Bar 1 appearing over shelves: Added an aggressive OnShow hook on hidden bar frames to immediately re-hide them when Blizzard's TWW action bar code tries to show them. Properly managed through activate/deactivate/Edit Mode cycles.
- Bags not opening in combat: Removed unnecessary
InCombatLockdown()guard fromToggleAllBags()call. Also set the bag handle's secure snippet to a no-op to prevent popup toggle side-effects during combat. - Edit Mode exit redundancy: Simplified
OnEditModeExitto just callRebuildAll()instead of manually re-hiding bars then rebuilding (the rebuild already handles everything).
v1.2.0
New Shelf Types
- Bags shelf: Click handle to toggle all bags open/closed. Handle displays used/total bag space using template keywords (
$used/$total). No popup — pure handle convenience. - Status shelf: Custom XP and reputation progress bars in a popup. Purple XP bar with level/percentage, green reputation bar with faction/standing. Handle shows compact template text (e.g.,
Lv$level $xp%). Hides Blizzard's status tracking bars. - Micro menu shelf: Reparent Blizzard's micro menu buttons into a shelf popup. Auto-detects available buttons, native sizing, configurable rows.
- Multi-faction tracking: Track multiple reputations beyond Blizzard's watched faction. Hierarchical faction picker organized by expansion with search. Each tracked faction gets its own colored bar in the status popup.
Pinned Popups
- Pin any shelf as an always-visible bar via the "Pin as bar" checkbox.
- Drag pinned popups anywhere on screen via the grip handle at the top.
- Per-shelf idle opacity with mouseover reveal (reuses dock fade pattern).
- Handle click toggles pinned popup visibility without unpinning.
- Pinned popups survive ESC, backdrop clicks, and close-others.
- Hidden during Edit Mode, restored after.
Icon Picker
- Click the shelf icon preview to browse all WoW icons in a scrollable grid.
- 32K+ icon name database (auto-updated monthly from Townlong Yak via CI).
- Search by icon filename, spell name (from spellbook), or FileDataID.
- FauxScrollFrame virtual scrolling — only visible buttons exist in memory.
- Drag spell/item/macro onto the icon preview as an alternative.
- Right-click the icon preview to reset to auto-detect.
Options Panel Overhaul
- Unified "Shelves & Docks" panel: Tree view shows docks as headers with shelves grouped underneath. Click a dock to configure its name, orientation, and appearance.
- Simplified add buttons: Two buttons ("+ Add Dock", "+ Add Shelf") with a type picker dropdown replacing 6 separate buttons.
- Override Appearance: Per-shelf checkbox to customize Open Direction, Handle Style, and handle sizing. Unchecked = inherits from global Appearance tab. Existing per-shelf customizations auto-detected and preserved.
- Shelf Defaults in Appearance tab: Global defaults for Open Direction and Handle Style.
- Template label system: Status and Bags shelves support
$keywordplaceholders in handle labels ($level,$xp,$used,$total, etc.). - Defaults button: Resets shelf/dock settings with confirmation dialog.
- Proper arrow buttons: Blizzard scroll arrow templates for move up/down with tooltips.
- Detail panel layout: Title, controls row (Enabled/Move/Delete/Defaults), Pinning, then Layout & Sizing.
Profiles & Migration
- Account-wide AceDB profiles via
BarshelfGlobalDBwith cross-character sharing. - Automatic per-character → account-wide migration on first login per character.
- Each character's data migrates under its own profile name (no shared "Default").
- Old data preserved as fallback (marked
_migrated, not wiped). - Legacy
dockMouseoverHideboolean auto-converted todockIdleAlphaat runtime. - Migration test suite with 21 assertions across 7 scenarios, runs in CI.
Localization
- Full translations: German, French, Spanish, Brazilian Portuguese.
- Partial translations: Italian, Russian, Korean, Simplified/Traditional Chinese.
- Localized .toc Notes for all supported locales.
- All UI strings use the
L[]localization system with metatable fallback.
Bug Fixes
- Custom shelf buttons not casting: Removed
ActionButtonTemplateinterference with secure action attributes. - Custom shelf icon/slot misalignment: Icons fill the full button area.
- Drag-and-drop onto custom shelves: Click-based drop handling as fallback.
- Bar shelf tiny icons: Safety floor for button size reads (< 10px → 36px fallback).
- Shift+click no longer casts: Secure handler bypassed via
shift-type1/shift-type2attributes. - Edit Mode ADDON_ACTION_BLOCKED: Deferred handlers with
C_Timer.After(0). - Dock invisible during drag:
FadeTo(1)properly stops running fade animation. - Grid blinking on mouseover: Bar shelf watchdog throttled to 1 check/second.
- Combat safety: Popup anchor/stacking, SetFrameLevel, and bags Hide all guarded with
InCombatLockdown(). - Popup z-ordering: Most recently shown popup renders on top (20-level gap clears child frames).
- Icon size mismatch: Slider default matches native TWW button size (45px for bars).
Infrastructure
- Custom addon logo (
assets/logo.tga) for addon list and minimap icon. TextureNames.lua: 32K+ icon FileDataID → name mappings from Townlong Yak.scripts/update-texture-names.sh: Downloads and regenerates texture names.- Monthly CI job auto-updates
TextureNames.luaand opens a PR if data changed. - Migration test suite in CI (
tests/test_migration.lua).
v1.1.0
New Features
- Dock idle fade: docks can fade to a configurable opacity when idle (no popup open, mouse not hovering). Slider from 0% (fully hidden) to 100% (disabled). Configurable fade animation duration.
- Popup stacking: when "Close other popups" is off, multiple open popups now stack sequentially instead of overlapping. Direction follows the first popup's anchor.
- Shift+click pickup: shift+click or shift+drag a custom shelf button to pick up the spell/item/macro (like Blizzard action bars). Shift+right-click still clears.
Bug Fixes
- Custom shelf buttons not casting spells: removed
ActionButtonTemplatewhich was overriding secure action attributes via its PreClick handler. Buttons now use onlySecureActionButtonTemplatewith manual visual elements. - Custom shelf icon/slot misalignment: icons now fill the full button area instead of using ActionButtonTemplate's inset positioning.
- Drag-and-drop onto custom shelves: added click-based drop handling as fallback, since
SecureActionButtonTemplateconsumes the event beforeOnReceiveDragfires. - Bar shelf tiny icons: added safety floor for button size reads — buttons reporting < 10px during early TWW load now fall back to 36px instead of producing broken micro-scale popups.
- Shift+click no longer casts: secure handler is bypassed on shift+click via
shift-type1/shift-type2attributes, preventing unintended spell casts when picking up or clearing slots.
v1.0.0
Initial release.
- Bar shelves: reparent Blizzard action bars 1-8 into popup grids
- Custom shelves: drag-and-drop spells, items, macros (OPie-like)
- Multiple docks with horizontal/vertical orientation
- Auto-detect Blizzard Edit Mode settings (icons, rows, size, padding)
- Popup auto-anchor with screen-edge flip
- Dock/shelf/popup appearance settings (opacity, border, padding, sizing)
- Handle display modes (icon, label, or both)
- Shelf reordering via config panel
- ESC-to-close, click-outside-to-close
- Edit Mode integration: shows original bars during Edit Mode
- Ace3 integration: AceDB profiles, Blizzard Settings panel with subcategories
- Minimap icon via LibDBIcon
- Combat-safe secure handlers and queue system

