List the earlier contacts with the call being typed under the log

N1MM's log window has two panes. The lower one lists every contact already
logged with the call in the callsign box, on any band and in any mode, so an
apparent dupe can be read off the screen rather than looked for.

EarlierContacts.Matching holds the rule, so it is unit-tested without a
window: three characters before anything is listed, a call that holds what is
typed, `*` for any run of characters and `?` for one, the grid square instead
when nothing is typed, ordered by call, mode, band and time, and fifty at
most. That is N1MM's DupeSQL, except that N1MM passes `?` to SQLite as a plain
character, which finds nothing.

The two grids share their columns, because a value in the pane has to sit
under the column it belongs to. Each column is now as wide as the longest
value it can hold, measured in the font it is drawn in, and the last column
takes what is left over. The values and the header are in different fonts, so
each is measured on its own. This also settles the column widths, which used
to change as rows scrolled into view.

A DataGrid does not pass its own font down to its cells, so the cell font is
set in a style. Without that the cells draw larger than the width measured for
them and every column is a character short.

Looked at under Xvfb with a call typed: the pane lists the two contacts that
hold it, under columns that line up with the log above.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD
This commit is contained in:
2026-08-30 21:00:04 +00:00
parent da04764756
commit a31c40fb2d
6 changed files with 341 additions and 54 deletions

View File

@@ -266,7 +266,17 @@ otherwise, which puts the station in the middle of its country. Sunrise and
sunset are worked out from that position for today; inside the polar circles the
line says the sun does not rise or set.
### Editing the log
### The log window
The pane under the log lists what has already been worked with the call being
typed: every earlier contact whose call holds it, on any band and in any mode,
so an apparent dupe can be read off the screen. `*` stands for any run of
characters and `?` for one. With nothing typed and a grid square copied, it
lists the contacts from that grid square instead. N1MM has the same pane, and
stops at fifty contacts as this does.
Both grids get the same columns, each as wide as the longest value it can hold,
with the last column taking what is left over.
Double-click a cell in the log window to change it. The columns follow the
contest exchange, so CQ WW shows a Zone column and Sweepstakes shows Nr, Prec,