Header stock reads "Stock: <n>" + block icon; the expand button and each
build button show the block icon in place of the "Blocks" word
(REQ-UI-BLOCKS-ICON, REQ-UI-EXPAND-BUTTON, REQ-UI-BUILD-COST).
New IconCaption::renderCaptionWithIcon composes "text + trailing icon"
into one pixmap (Qt buttons/labels can't place an icon after text). The
header label uses it as a pixmap; the expand button as its QIcon (Normal
+ greyed Disabled). Build buttons need both the building chip and the
block icon, so a custom-painted BuildButton draws the whole face,
adaptive to width and greying when unaffordable. All paths fall back to
text when no building_block icon exists. Item icon dir threaded through
MainWindow to HeaderBar and BuildButtonGrid.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc