File Details
v0.12.0
- R
- May 2, 2026
- 198.05 KB
- 6
- 12.0.5+1
- Retail
File Name
cogworks-v0.12.0.zip
Supported Versions
- 12.0.5
- 12.0.1
Changelog
All notable changes to Cogworks-1.0 are tracked here. The library is additive only — old APIs never disappear, so every entry below is something gained, never lost.
[0.12.0] — 2026-05-01 — Suite settings persistence + Phase D primitives
Bumps MINOR from 15 to 16. Resolves cogworks #22 (suite-wide settings persistence) and the Phase D primitive batch (#21, #20, #19, #18). Theme / scale / font / profile settings now persist whether or not the standalone Cogworks addon is installed.
Added
CogworksSharedDBshared persistence — every cog declares## SavedVariables: CogworksSharedDBin its TOC; the lib hooksADDON_LOADED/PLAYER_LOGIN/PLAYER_LOGOUTand reads/writes the active profile regardless of whether standalone Cogworks is installed. One-shot migration from the legacyCogworksDBruns the first time a session seesschemaVersion == nil. Standalone's parallel persistence block was removed;CogworksDBstays declared for one release as a downgrade safety net. (#22)- Profile system — named bundles of settings stored under
CogworksSharedDB.profiles[name]. New API:lib:GetProfileNames,lib:GetActiveProfile,lib:SetActiveProfile,lib:CreateProfile(name, copyFrom?),lib:DeleteProfile,lib:RenameProfile,lib:ExportProfile,lib:ImportProfile. Profile switch firesSettingsChangedfor every known key so font/theme/scale subscribers reflow. (#22) - Per-cog override (
fontScale+fontFamily) —lib:SetCogProfile(cog, profileName)points a cog at a different profile for its overridable settings while the rest of the suite stays onactiveProfile. v1 override surface is intentionally narrow:fontScaleandfontFamily.uiScale,theme, andcustomThemesstay suite-wide because their state is shared by mutable theme tables / FontObjects that every widget already references directly. New API:lib:GetCogProfile,lib:SetCogProfile,lib:GetCogSetting(cog, key),lib:GetCogTheme(cog). (#22) - Per-cog font resolution —
lib:GetFont(key, cogName?)returns a cog-specific FontObject when that cog has an active override; untagged calls keep returning the suite-active fonts (back-compat). The font set is rebuilt lazily vialib:_RefreshCogFonts(cog)on profile switch. (#22) lib:CreateUIScalingSettingsBlock(parent, opts)(Cogworks-1.0/Scaling.lua) — drop-in section for any cog's settings page. Profile dropdown with[+ New] [Export] [Import], font/UI scale sliders, font family + theme dropdowns, reset button, and a per-cog override row whenopts.cogis provided. Reflects externalSettingsChangedevents. (#18)lib:RegisterScalingFrame(frame, opts)— subscribes a frame toSettingsChangedforuiScalesoSetScalefires automatically. Optionally persists{x, y, w, h}into a caller-owned SV table onOnDragStop/OnSizeChanged. (#18)lib:CreateSegmentedControl(parent, opts)(Cogworks-1.0/SegmentedControl.lua) — horizontal pill-button group with one-active invariant. Sizessmall/normal/large. Auto-widths each pill from its label + padding; reflows onSettingsChangedfor fontScale/fontFamily. Distinct fromCreateTabPanel(which owns content swap) andCreateNavButton(sidebar shape). (#19)lib:CreateSettingsInputvalidate + suffix + Flash (Cogworks-1.0/Forms.lua, MODULE_MINOR 14 → 15) — three additive opts:validate(value) -> ok, errMsgreverts and red-flashes on failure;suffixrenders a dim "hours" / "%" label right of the input;row:Flash(errMsg)exposes the same flash for backend-side rejections. Returned row also hasGetSuffix/SetSuffix. (#20)lib:CreateSectionHeaderopts-table form — second arg can now be{ text, rule, anchor = {frame, point}, gap, color }.rule = trueadds a 1px theme.border underline;anchorlets sections cascade off siblings instead of always anchoring TOPLEFT to the parent. Legacy positional(parent, "TEXT", -8)keeps working unchanged. (#21)
Fixed
TreeandReorderableListrows render full-width (MODULE_MINOR 15 → 16 each). The scroll content frame was hardcoded to width 1; rows anchored TOPRIGHT to content ended up 1px wide, leaving them with no clickable area and an invisible backdrop. Both modules now hook the scroll'sOnSizeChangedto keepcontent:SetWidthin lockstep with the viewport.MiniViewclose + pin buttons are visible (MODULE_MINOR 15 → 16). Replaced the 16pxUI-Panel-MinimizeButton-Upclose glyph (mostly transparent at that size) with the standardUIPanelCloseButtontemplate at 20px, and switched the pin toLockButton-{Locked,Unlocked}-Upso the locked / unlocked state reads at a glance.ReorderableListrows are draggable (MODULE_MINOR 16). Two latent bugs: (1)row:StartMoving()silently no-ops withoutSetMovable(true), so the row state changed on drag but the frame stayed put — addedSetMovable(true)inacquireRow. (2)OnDragStopcallingrefresh()triggersreleaseRow → Hideon the still-being-dragged row, andHideon a dragged frame re-firesOnDragStop; the second pass tried to index the now-nildraggingupvalue. Added a re-entrancy guard at the top ofOnDragStop.- Standalone showcase sidebar nav no longer overflows. The 16
CreateNavButtonrows ×32 px each ran past the ~448 px sidebar even at 1.0× scale; at 1.4× the bottom four pages were unreachable. Wrapped the nav stack in aScrollFramewith mouse-wheel scrolling so any number of pages stays accessible regardless of font/UI scale. Also boundedCreateNavButton's label with a RIGHT anchor andSetWordWrap(false)so longer labels (e.g. "Reorderable") clip cleanly at the button edge instead of extending past the sidebar at high font scales.
Notes
- The shared SV requires every consumer cog's TOC to declare
## SavedVariables: CogworksSharedDB. Cogs that haven't yet adopted the declaration will continue to work, but their session will run with in-memory settings only — exactly the same behavior as before this release.
[0.11.0] — Phase A/B/C UI primitive set
Bumps MINOR from 12 to 15. The full primitive set called for in cogworks issue #1 — the FlipQueue migration toolkit, plus Tempo / Maxcraft / Tally rebuilds. Per-module load guards landed in this release so older vendored copies in sibling cogs no longer clobber newer methods.
Added
- Tree (
Cogworks-1.0/Tree.lua) —lib:CreateTree(parent, opts). Hierarchical expand/collapse list. Each node is{ key, label, count?, children? }. Chevrons render only on branches; click the chevron half of the row to toggle expansion, click anywhere else to select. SupportsExpand(key),Collapse(key),Toggle(key),ExpandAll(),CollapseAll(),SetSelected(key),GetSelected(). Phase C item from #1, used by FlipQueue'sResearchPage. Non-virtualized for v1 — fine up to a few hundred visible nodes. (MINOR 15) - Reorderable list (
Cogworks-1.0/ReorderableList.lua) —lib:CreateReorderableList(parent, opts). Drag-to-reorder vertical list. Caller owns row contents viaopts.renderRow(row, item, index);opts.onReorder(items, fromIndex, toIndex)fires on drop. Uses a row pool —renderRowis called whenever the row is reused, so cache child widgets on the row table. Phase C item from #1, used by FlipQueue'sAllocWidget. (MINOR 15) - Wizard (
Cogworks-1.0/Wizard.lua) —lib:CreateWizard(parent, opts). Multi-step flow widget. Header shows the current step title plus one progress dot per step (gold for completed/active, dim for upcoming); footer has Cancel / Previous / Next (becomes Finish on the last step). Per-stepvalidate()gates Next; callers wirewizard:Refresh()to revalidate after user input.onCompletefires on Finish click;onCancelon any-step Cancel;onStepChange(key, idx)for telemetry. Step pages are lazy-built. Phase B item from #1. (MINOR 15) - Mini view frame (
Cogworks-1.0/MiniView.lua) —lib:CreateMiniView(opts). Heads-up frame with the suite's standard chrome (title bar, pin, close, resize grip). Position / size / pinned state persist into a caller-supplied savedvars table. Pin locks the frame and hides the resize grip; close firesopts.onClose. Honors the suite'suiScalesetting viaSettingsChanged. Phase B item from #1. (MINOR 15) - Rich-text helpers (
Cogworks-1.0/Text.lua) —lib:QualityColorName(name, quality),lib:QualityColorHex(quality),lib:ClassColor(class),lib:ClassColorName(name, class),lib:FormatGoldValue(gold),lib:FormatGSC(copper),lib:FormatGoldShort(copper). Quality accepts numeric IDs or canonical name strings; class accepts upper-case keys ("WARRIOR","DEATHKNIGHT", ...). Gold formatting comes in three flavors so cogs can pick the precision they want. Lifted from FlipQueue'sUI/Shared.lua. Phase B item from #1. (MINOR 15) - Tab panel (
Cogworks-1.0/TabPanel.lua) —lib:CreateTabPanel(parent, opts). Inline horizontal tab strip with content area below; tab pages are lazy-built on first activation, tabs auto-size to their label width with a 60 px floor and reflow onfontScale/fontFamilychange. Distinct fromCreateNavButton(sidebar nav). Phase B item from #1. (MINOR 15) - Section dynamic content height —
lib:CreateCollapsibleSection'sopts.contentHeightFnandsection:SetContentHeightFn(fn). When set,applyLayoutcalls the fn fresh on every pass instead of using a stored value, and the section schedules a one-shotOnUpdatesettle whenever it shows content — so wrapping body FontStrings size correctly even when their wrapped height isn't measurable until WoW renders the next frame. The existingSetContentHeight(h)static API is unchanged. (MINOR 14) - Per-module load guards — every Cogworks module file (
Sections,Forms,Icons,Items,Realms,API,TabPanel) tracks aMODULE_MINORonlib._modules.<Name>; older copies vendored by sibling cogs that load after a newer standalone copy now skip cleanly instead of clobbering the newer methods. (MINOR 14) - Settings form helpers (
Cogworks-1.0/Forms.lua) —lib:CreateSettingsCheckbox(parent, opts),lib:CreateSettingsButton(parent, opts),lib:CreateSettingsInput(parent, opts). Labeled-row variants of the base primitives. Each returns(row, consumedHeight)for y-cursor auto-layout. All rows re-font and re-lay onSettingsChanged(fontScale/fontFamily); callers wanting a stack reflow can subscribe viaopts.onHeightChangedor re-walk viarow:GetConsumedHeight(). (#1, MINOR 13) lib:CreateDropdownauto-width option — additive 5th argumentoptsacceptingautoWidth(bool),minWidth,maxWidth,width. WithautoWidth = true, the dropdown measures each item's label and fits to the widest, clamped by min/max. Re-fits onSetItemsand onSettingsChangedfont changes. Also: dropdown menu now flips up when there isn't room below the dropdown anchor (bottom-of-frame / bottom-of-screen case). Existing four-arg callers are unaffected. (#1, MINOR 13)
Fixed
- Minimap gear ring sized at 32 px instead of 53. CogBorder.tga's silhouette fills nearly the full 128×128 texture rect; LDBIcon's 53×53 default is sized for a much sparser ring asset and made the gear visually ~70% larger than the button. Tally tuned to 32 in its pre-adoption overlay-swap workaround; the Cogworks helper now matches.
- Maxcraft and Tally edge gears mesh with the cluster's hub and core trio. Earlier
CLUSTER_POSITIONSfloated them well above the meshed core; pulled down to y=17 with the same ~5 px overlap as the FQ↔CW↔TM mesh.
[0.10.0] — Embedded-layout minimap fix, icon registry, gear assembly chrome
Bumps MINOR from 9 to 12. Resolves issues #9, #10, #11, #13.
Added
- Suite-wide icon registry (
Cogworks-1.0/Icons.lua) —lib:RegisterIcon(name, def),lib:ApplyIcon(texture, name),lib:HasIcon(name). Built-inchevron-rightandchevron-downresolve to friendslist atlases. Solves the recurring "WoW default fonts don't ship the Unicode Geometric-Shapes block, so▶ ▼render as missing-glyph boxes" problem once instead of per-widget. Cogs register their own variants viaRegisterIcon. (#9) - Gear assembly cluster + row layouts —
lib:CreateGearAssembly(parent, opts)acceptsopts.layout = "cluster"(default) or"row". Cluster places Cogworks at the hub with FlipQueue + Tempo as the meshed core trio (counter-rotating, periods scaled by tooth velocity at contact); Maxcraft and Tally float as edge gears. Row mode is linear with thin connector bars. Always-on animation — saturation +?/...overlays carry install-state signal. (#11) - Bundled minimap chrome ships with the library —
CogBorder.tgaand per-cog inner-glyph TGAs (fq-inner,tm-inner,mc-inner,tl-inner,cw-inner) moved intoCogworks-1.0/Art/so embedded consumers receive them via the existingpath: Cogworks-1.0external. NewlibArtPathhelper centralizes path resolution and captures the loader addonName at file load. (#13) Tallyadded tolib.SuiteRoster— renders in the gear assembly with its own inner glyph.innerIconandclusterfields on roster entries — layout slot decision (hub/core/edge) lives in the roster, not the widget.
Fixed
RegisterCogMinimapButtonnow works in embedded layout — previous wrapper calledLibDBIcon:SetButtonBorder(only on v56+; Tally vendored v44) and hard-codedInterface\AddOns\Cogworks\Art\CogBorderwhich doesn't resolve when consumers have no top-levelCogworksfolder. New implementation adopts Tally's overlay-texture pattern:LibDBIcon:Register, hide the default tracking-border region, add a gear OVERLAY child texture. Works on every LibDBIcon version. (#10)libArtPathstandalone-vs-embedded detection is now case-insensitive — comparison was== "Cogworks"butcogworks.tocis lowercased, so standalone resolution fell through to the embedded path. Comparison is now:lower() == "cogworks".- Inner-glyph-to-ring gap closed — visual seam between the inner glyph and the gear ring.
Removed
Ledgercog name purged — Tally is the suite's ledger. Roster entry, gear-assembly slot, and docs all updated.
Note: Releases 0.4.0–0.9.0 shipped without changelog entries. Their work is captured in closed issues #3 (minimap gear-border), #4 (icon readability), #5 (versioned cross-cog API registry —
Cogworks-1.0/API.lua), #6 (item-key + realm helpers —Cogworks-1.0/Items.lua,Cogworks-1.0/Realms.lua), #7 (standalone dev console), and #8 (RegisterCogMinimapButton initial).CreateCollapsibleSection(Cogworks-1.0/Sections.lua) shipped as the v0.9.0 starter for #1 Phase A.
[0.3.0] — Font scaling, settings, and gear assembly
Bumps MINOR from 2 to 3. Adds accessibility-focused customization and the suite gear assembly widget.
Added
- Settings system —
lib.settingswithGetSetting,SetSetting,ApplySettingsTable,GetSettingDefaults. FiresSettingsChangedevent when values change. Standalone addon persists settings inCogworksDB. - Font scaling —
lib.Fonts.normal,.small,.large,.header— named FontObjects that respectlib.settings.fontScale(0.8x–1.4x). All widget factories now use these instead of hardcodedGameFontNormal, so every Cogworks-built widget scales together when the user adjusts font size. lib:UpdateFonts()— rebuilds all FontObjects at the current scale. Called automatically whenfontScalechanges.lib:GetFont(key)— returns a FontObject by key ("normal","small","large","header").- UI scale setting —
lib.settings.uiScalefor cogs to apply viaframe:SetScale(). - Suite roster —
lib.SuiteRosterlists all known cogs (FlipQueue, Tempo, Maxcraft, Tally) with role, icon, and URL metadata. Used by the gear assembly to show installed vs. missing members. lib:CreateGearAssembly(parent, opts)— compact widget showing every cog as a connected gear. Installed cogs spin in brass with circular-masked icons; missing cogs are grayed out with "?" overlay and click-for-link; planned cogs show "..." in arcane purple. Auto-refreshes when cogs register. Options:showLabels(default true).- Showcase: Gear Assembly page — default landing page showing full and compact assembly variants plus registry info.
- Showcase: Settings page — font scale buttons (80%–140%) with live preview, UI scale controls, reset-to-defaults, and live widget demo.
CogworksDBSavedVariables — standalone addon persists non-default settings across sessions.
[0.2.0] — UI widget factories
Bumps MINOR from 1 to 2. Adds shared UI primitives so cogs can stop duplicating the same themed widget code.
Added
- Theme expansions —
header,sidebar,rowAlt,rowHover,textDim,textDisabledentries inlib.Themecovering all the UI-level constants that were duplicated across Tempo, Maxcraft, and FlipQueue. - Backdrop templates —
lib.Backdrop(16px edge) andlib.BackdropSmall(10px edge) replacing per-cogUI.BACKDROP/UI.BACKDROP_SMALLdefinitions. :CreateButton(parent, label, width, height, onClick)— themed button with dark background, gold-accent hover, and press feedback.:CreateCheckbox(parent, label, description, initialValue, onChange)— checkbox with label and optional description text, including sound feedback.:CreateIconButton(parent, icon, size, tooltip, onClick)— minimal icon-only button with highlight and optional tooltip.:CreateSectionHeader(parent, text, yOffset)— uppercase gray divider label for organizing settings and page sections.:CreateProgressBar(parent, width, height)— progress bar with fill texture and text overlay; provides:SetProgress(current, max)and:SetBarColor(r, g, b).:CreateNavButton(parent, navItem, onClick)— sidebar navigation button with icon, label, optional badge, gold accent bar, and active/inactive state.:SetNavButtonActive(btn, isActive)— toggle a nav button's active visual state.- Migration plans —
docs/migration/flipqueue.md,docs/migration/tempo.md,docs/migration/maxcraft.mdwith step-by-step instructions for each cog to adopt the shared UI.
[0.1.0] — Initial release
First public version of Cogworks-1.0, the shared mainspring of the Cogworks WoW addon suite.
Added
- LibStub library
Cogworks-1.0(MINOR1) — embeddable into any cog via.pkgmetaexternals. - Event bus —
CallbackHandler-1.0-backed registry with a canonicallib.Eventstable covering lifecycle (Ready,AddonRegistered), character/account state (CharacterChanged,GoldChanged), inventory signals (InventoryChanged,MailChanged,AuctionsChanged), and suite domain events (SaleLogged,CraftCompleted,ResetDue,PriceUpdated). - Addon registry —
:RegisterAddon,:GetAddon,:GetRegisteredAddonsso any cog can enumerate its installed siblings. - Print helpers —
:Printand:PrintErrorwith branded per-cog chat prefixes. - Theme palette — dark base, gold primary, arcane-purple highlight, brass clockwork trim, plus status colors and WoW item-quality colors.
- Character key utilities —
:GetCharacterKey()returning canonical"Name-RealmNormalized"strings that match Syndicator's convention. - Syndicator capability bridge —
:HasSyndicator()for cogs that want to opportunistically enrich data when Syndicator is present, without making it a hard dependency. - Standalone shell —
/cogworksslash command (status,events,fire <ev>,help) for local development and verification. Ships only in the standalone CurseForge/Wago install; embedded copies do not include it.