promotional bannermobile promotional banner

Coinscry

Companion addon for TradeSkillMaster that adds proper item filters to the Vendoring Buy UI (TBC Anniversary).

File Details

v0.3.0-bcc

  • R
  • May 12, 2026
  • 58.64 KB
  • 4
  • 2.5.5
  • Classic TBC

File Name

coinscry-v0.3.0-bcc.zip

Supported Versions

  • 2.5.5

Coinscry

v0.3.0 (2026-05-12)

Full Changelog Previous Releases

  • v0.3.0: M3-D release (TOC + CHANGELOG)
  • M3-D: columns + sort + drag-to-resize + qty preview + colored prices
  • Qty column widen to 36px; TSM-style colored gold/silver/copper price
    • Qty column was 28px, just short for 'x200' (truncated to 'x2...'
      on arrow/bullet stacks). Bump to 36px — comfortably fits up to
      'x999'.
    • FormatPrice now emits inline color codes per denomination:
      digits white, 'g' yellow, 's' silver-gray, 'c' copper-brown.
      Removed the row-wide gold tint that was overriding everything.
    • Coin jingle on purchase is automatic — WoW plays it when
      BuyMerchantItem succeeds, no addon code needed.
  • Add per-row buy-qty preview (x1 / xStackSize while Shift held)
    New 28-pixel column between the icon and the name showing what
    clicking the row right now will buy:
    • 'x1' by default
    • 'xN' where N is row.stackCount, when Shift is currently held
      The qty FontString has a fixed width so the Name column doesn't
      shift left/right when the modifier changes — only the text content
      changes.
      Live updates: register MODIFIER_STATE_CHANGED, listen for LSHIFT /
      RSHIFT transitions. When the panel is shown, trigger Panel.Refresh
      on shift change so all visible rows update at once. Cheap: just a
      field assignment per row, no re-filter / re-scan.
  • Fix sort indicators: use UI-SortArrow texture, anchor adjacent to text
    Two bugs in the sort-indicator implementation:
    1. The Unicode arrows aren't in WoW's default font glyphs and
      rendered as tofu boxes. Switch to Blizzard's standard
      Interface\Buttons\UI-SortArrow texture (an up-arrow), with
      SetTexCoord(0,1,1,0) for vertical flip when sort is descending.
    2. The label FontString was anchored to both LEFT and RIGHT of the
      button, so it spanned the full column width regardless of text
      length. The indicator anchored to the label's edge therefore
      landed at the column edge, not next to the actual text. Fix by
      anchoring the label to ONE side only (LEFT for left-justified,
      RIGHT for right-justified) — its frame now matches the rendered
      string width, and the adjacent-edge indicator anchors to where
      the text actually ends.
  • M3-D #3: drag-to-resize handle; visible-row count derives from height
    Bottom-right resize grip drags the panel in both axes. Row widgets
    are now a pool of MAX_ROWS (25) created up front; how many are
    visible is computed from the current scroll-frame height. Layout
    auto-refreshes via OnSizeChanged -> Panel.Refresh.
    • f:SetResizable(true) with SetResizeBounds (retail API) and
      SetMinResize fallback (classic). Min size keeps the panel usable:
      enough width for dropdowns + columns, and tall enough for ~3 rows
      plus the filter controls.
    • Rows now stretch horizontally with the panel: anchored LEFT and
      RIGHT to the scroll area (previously fixed width = PANEL_W - 40).
      Cost / iLvl columns stay fixed-width on the right; Name column
      absorbs the extra width when the panel is dragged wider.
    • VisibleRowCount() = floor(scrollFrame_h / ROW_H), capped at
      MAX_ROWS. Used by UpdateRows and FauxScrollFrame_Update.
    • Panel size persisted in CoinscryCharDB.panelSize and restored on
      next CreatePanel call.
    • Hint line right margin trimmed by 10px so it doesn't sit under
      the resize grip texture.
  • M3-D #2: clickable sort headers
    Column headers (Item / ilvl / Cost) are now Button frames with
    click-to-sort behavior. Click a header to sort ascending by that
    column; click the same header again to flip to descending; click
    a different header to switch column and reset to ascending.
    • Active column shows a ▲ / ▼ indicator next to its label (left
      of the label for right-aligned columns, right of the label for
      left-aligned Item header).
    • Hover lightens the header label.
    • Sort happens in Filters.SortRows (Filters.lua), called after
      Filters.Apply in Refresh. State lives in state.sortKey /
      state.sortAscending; both fields covered by Filters.NewState so
      Panel.ResetFilters wipes them on each MERCHANT_SHOW.
    • Sort keys: name (lowercased string), itemLevel (number, 0 for
      nil), price (copper amount). Extended-cost items sort by their
      gold-price component; items with no gold price cluster at one
      end. Good enough for v1.
  • M3-D #1: column-based row layout + header strip
    Refactor each row from 'icon + Name + Price' into a four-column
    layout: icon | Name | iLvl | Cost. Header strip sits above the
    scroll area with 'Item', 'ilvl', 'Cost' labels lined up over their
    respective row columns.
    • Column geometry centralized as constants (COL_ICON_W, COL_ILVL_W,
      COL_COST_W, COL_GAP, COL_RIGHT_PAD) so future width changes only
      need to touch one place.
    • Cost / iLvl right-aligned with fixed widths; Name fills the
      remaining horizontal space between icon and ilvl with SetWordWrap
      false so long names truncate cleanly.
    • TOP_RESERVED bumped by HEADER_H (18px) to make room.
    • iLvl column displays itemLevel when > 0; blank otherwise (so
      items where ilvl isn't meaningful — like food / reagents — don't
      show 0).
      No sort yet (commit #2 makes headers clickable). No resize yet
      (commit #3).