Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
2026-06-12 — Session Log

Pokémon "View All" overview drawer + polish

The Pokémon analogue of the Bag View All. Footer became an AppFooterBtn3 (View All / Re-Roll / Boxes Setup); View All slides in the same hand-rolled left panel + scrim holding a 2-D table: rows = species (alphabetized by species name), columns = Party first then only NON-EMPTY boxes (a design decision — empty boxes omitted). Each cell is the per-box count, 0 hidden; a per-cell hover tooltip lists the differing nicknames + an "…and ×N others" tail + a caught/traded split (traded = hasTradeStatus, nicknamed = hasNickname), precomputed in C++. Backed by a new read-only PokemonOverviewModel (mvc/pokemonoverviewmodel.*, brg.pokemonOverviewModel). Test: tst_storage_model pokemonOverview_columnsCountsTooltips. Convention: ../../reference/ui-patterns.md → "View All overview drawer (Pokémon screen)".

Polish pass: (1) zebra rows + columns + whole-row hover; faint header bar. (2) species names no longer clip — wider name column + a QML fixName() mirroring the Pokedex markup mapping (Nidoran<f>Nidoran ♀). (3) Sort control — cycles the same orders as the Pokedex screen (Dex/Alphabetical/Internal) via PokemonOverviewModel::sortCycle(). (4) tooltip refined — the caught/traded line shows only when something is traded.

Sort icons + condensed columns: the header sort button now shows the CURRENT order's icon and has no tooltip; three PNGs (sort-alphabetical/internal/pokedex) added to app.qrc, exposed via a new sortIcon Q_PROPERTY; the control is a hand-rolled Item (square hover highlight + Image PreserveAspectFit). Columns condensed ~half (nameColW 110 / partyColW 46 / boxColW 30 via a colW(i) helper); box headers show just the number.

Pokémon storage: grid name-fix + Tools menu / Boxes-Formatted warning

(1) Grid cell labels now render <m>/<f>PokemonBoxView::getMonNickname runs a generic marker replace (fixMonName: <m>/<M>, <f>/<F>, Mr.MimeMr. Mime). The earlier exact-match version missed it because the grid shows the mon's nickname, which for un-nicknamed mons is the game's UPPERCASE default (NIDORAN<m>). (2) Footer "Boxes Setup" → a "Tools" menu (wrench); "Boxes Setup" is now the menu item "Boxes Formatted • On/Off". (3) Clicking it opens a direction-aware modal confirm: formatting warns all boxes but the current are erased then opened; unformatting warns it's a recoverable soft delete but the freed space can be overwritten → permanent loss. Proceeding only flips boxesFormatted — the engine already replicates the game's load/save from that one bit; no extra save bytes touched. QML-only. Convention: ../../reference/ui-patterns.md → "Tools menu + Boxes Formatted confirm". (Related: the Unformat warning copy was softened — data is effectively gone unless recovered before an editor/game destroys it; box-format triggers are box-switch / new-file only — see ../../reference/gen1-knowledge.md.)

Trainer-card badge artwork swap → sizing → square canvases

A sequence of follow-ups, newest first:

  • Badges normalized to uniform square canvases. The 8 badge PNGs were full-bleed with differing aspect ratios, so under PreserveAspectFit each filled the square cell by a different width. Fix: re-processed each badge onto a 256×256 transparent square canvas, content centered, longest side ~98% (measured to match the leader portraits) with PIL (alpha-bbox crop → LANCZOS → center). Now earned badges and unearned shadows render at the same footprint. approved.
  • Leader shadows recropped to square busts. all 8 gym-leader shadows were recropped to 256×256 head-and-shoulders portraits (~10–12 KB, down from tall full-body silhouettes) so they fill the 35px cell uniformly alongside the near-square badges. Re-imported into projects/app/assets/images/badges/. approved.
  • Badge sizing/aspect fix + optimized PNGs. Re-imported the 8 badge icons after they were optimized (~8 MB → ~3 MB total). Fixed the varying-size rendering: ListBadges.qml now uses fillMode: Image.PreserveAspectFit (+ smooth/mipmap + a capped sourceSize) so each image renders at its true proportions, centered, crisp, memory-light. approved.
  • Badge artwork swap. Earned (on) now uses the badge icon (<badge>-badge.png); unearned (off) now uses the gym leader's shadow (<leader>-shadow.png) — Brock/Boulder … Giovanni/Earth. Imported all 16 PNGs from assets/staging/, swapped the 16 qrc entries, git rm'd the old <name>-off/on.png. BadgesModel.qml repointed; ListBadges.qml reCalc() no longer dims unearned badges (the shadow image itself conveys not-yet-earned).