Two fixes to the unlock-choice dialog and the item tooltip.
The dialog's cards set "QWidget { border: 1px solid gray; padding: 8px; }"
as their style sheet, which cascades to every descendant -- so each label
and each item icon of the recipe lines drawn on the card came out boxed.
Scoping the selector to the card by object name leaves the line alone.
The recipe line itself now takes two rows: the building chip and the recipe
name on the first, the cycle -- inputs, arrow, outputs, time -- on the
second. One row of icons, names and numbers ran too long to scan, and an
identity and a cycle read as different things. Where the spec names neither
a building nor a recipe, which is every other user of the line, the first
row is left out and nothing changes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
REQ-MOD-UI-PREVIEW asked the panel's small layout preview to draw each
occupied cell in the module's fill_color with its glyph character, but the
preview has only ever drawn the color -- at that scale the glyph would not
be legible. The requirement now says what the preview does, and points at
the layout dialog's full-scale grid as the place a module is identified by
its glyph. No code change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
The glyph identifies a module on the layout grid, where it is drawn in the
cells the module occupies. On the selection button beside the module's name
it says nothing the name does not, so it goes -- and REQ-MOD-UI-DIALOG,
which asked for it, with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
QPushButton derives its size hint from its text and icon and ignores a
layout set on it, so the recipe options, the shipyard schematic options and
the layout dialog's module buttons all measured themselves as empty and
clipped the name and recipe line drawn on them.
OptionButton takes the hint from its layout instead and lets the style add
what the button frame needs, so the padding stays the platform's rather
than a number picked here. It falls back to QPushButton's own hint when
there is no layout, which is what the "(None)" option uses. The module
buttons drop their fixed height with it and take what their cost line
needs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Implements the requirements of 0bf24a7. Recipes were explained in prose:
the recipe dialog was a grid of icon-only buttons with a text tooltip
listing name, inputs, time and output, the unlock-choice dialog listed
recipe names with the same tooltip, an item chip said nothing about where
its item came from, and a module button never showed its cost.
RecipeLineRow is the one widget that draws a recipe -- optional building
chip and name, inputs, arrow, outputs, time -- and every place that states
what something makes now goes through it: the panel's recipe summary (which
it replaces RecipeSummaryRow for), the selection dialog's option buttons,
the item production tooltip, the unlock-choice dialog's recipe lines, the
module buttons' cost lines, and the layout dialog's build cost. Its arrow
is drawn only where there are outputs, so a shipyard summary no longer
points at nothing.
ItemProducers answers where an item comes from, filtering by unlock state
per building type, and ItemTooltip draws it as a window of its own -- Qt's
tooltips are text, this one has item squares and building chips in it.
ItemChip pops it after a hover delay.
The selection dialog becomes one scrolling vertical column of buttons, each
showing its name over its recipe line, and no dialog carries a tooltip any
more. RecipeTooltip and recipes.toml's unused "icon" field go with the
behavior they served.
Two requirement amendments the implementation forced, both in this commit:
the option column scrolls when taller than the window allows, and a Smelter
or Reprocessing recipe is listed once its building is unlocked, those
recipes carrying no unlock of their own. The layout dialog's build cost
also moved out of the shared ShipStatsPanel, which the balancing tool
compiles directly and is deliberately kept free of the icon caches.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Recipes were explained in prose: the recipe selection dialog was a grid of
icon-only buttons whose hover tooltip listed the recipe name, its inputs,
its time and its output, and the unlock-choice dialog listed recipe names
with the same tooltip. The player had to hover every option to learn what
it made, and an item in a buffer said nothing about where it came from.
Retires REQ-UI-RECIPE-ICON and REQ-UI-SELECT-TOOLTIP, whose behavior is
gone, and adds:
* REQ-UI-SELECT-OPTIONS -- the selection dialog is a vertical column of
buttons, each showing the recipe name (or ship display name) over that
recipe drawn as the recipe summary line draws it. No tooltips: the
button face is the whole description.
* REQ-UI-ITEM-TOOLTIP -- hovering an item chip in the selection panel
shows the item's name, "Produced by", and one line per unlocked recipe
producing it, each with the running building's icon, the recipe name and
its summary. Scrap reads "Salvaged from debris"; an item whose every
recipe is locked reads "Undiscovered".
The unlock-choice dialog's "Unlocks recipes" list uses the same recipe
line and loses its tooltip too (REQ-DEF-SCHEMATIC-DROP), and the layout
configuration dialog gains the same treatment for modules: a module button
states its material cost and added production time, and the stats panel
shows the configured layout's running total (REQ-MOD-UI-DIALOG,
REQ-MOD-UI-STATS-PANEL).
Drops recipes.toml's optional "icon" field, whose only consumer was the
icon-only option button and which no shipped recipe sets.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Implements REQ-UI-PANEL-MODAL. The recipe/schematic selection dialog and
the ship layout configuration dialog are both opened from controls inside
the selection panel, but Qt centered them on the game window, sending the
cursor back across the view and then back again.
MainWindow::placeOnSelectionPanel() centers a dialog on the panel's live
global rectangle -- so a dragged panel carries the modal with it -- and
clamps it into the window without resizing it, clamping the far edge
before the near one so a dialog too large for the window lands on the
window's top-left corner. It is called on the constructed dialog before
exec(), which also stops QDialog from re-centering it on show.
Placement is all that changes: modality, the auto-pause, the modal dim and
dismissal are untouched, as are the modals not opened from the panel.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Adds REQ-UI-PANEL-MODAL: a modal opened from a control inside the
selection panel is centered on the panel's current rectangle instead of
on the game window, so the cursor does not have to travel back across
the view and return. Covers the two modals the panel opens -- the
recipe/schematic selection dialog and the layout configuration dialog,
including its auto-open after a schematic change.
Fixes the placement to the panel's rectangle as it currently stands, so
a dragged panel carries the modal with it; clamps the modal inside the
game window without resizing it; leaves modality, auto-pause, the modal
dim and dismissal untouched; and excludes every modal not opened from
the panel, including one opened from another modal.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Item icons were drawn bare in the panels and dialogs while only the game
world composed them onto the item's visuals.toml square, so the same item
read differently on a belt than in a panel.
Move the composition into ItemIconCache, which now holds the visuals and
offers it in two forms: paintItem() for the world's fractional geometry
and getSquarePixmap() for widgets. WorldRenderer::drawWorldItem collapses
onto the former, and the recipe-selection dialog, the selection panel's
item chips and the recipe summary onto the latter. The inset fraction
that shapes the composition now has one definition instead of two.
An item with no icon file now shows its square alone rather than falling
back to text, so callers gate on the composed pixmap being null -- the
case of an item with neither square nor icon -- instead of on hasIcon().
The inline building_block icon beside a number keeps using the bare
getPixmap() and takes no square.
The chip and summary squares are drawn a few pixels larger than the icons
were, so the artwork keeps its size once the square insets it. Reloading
the visuals on a restart drops the composed pixmaps, which carry the
colors they were painted with (REQ-CFG-RELOAD).
REQ-UI-ITEM-ICON, REQ-UI-RECIPE-ICON, REQ-UI-SINGLE-SELECTION,
REQ-UI-RECIPE-SUMMARY, REQ-UI-HQ-PANEL
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
Item icons shown in the UI panels and dialogs were drawn bare; only the
game world composed them onto the item colored square. Extend the square
to every place the UI displays an item as an item: the recipe-selection
dialog option buttons, the selection panel item chips, and the recipe
summary. The inline building_block icon standing in for the word "Blocks"
beside a number stays bare, being a text decoration rather than an item
display.
REQ-UI-ITEM-ICON, REQ-UI-RECIPE-ICON, REQ-UI-SINGLE-SELECTION,
REQ-UI-RECIPE-SUMMARY, REQ-UI-HQ-PANEL
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x