From: Christian Brauner <brauner@kernel.org>
To: "Kernel.org Tools" <tools@kernel.org>
Cc: Konstantin Ryabitsev <konstantin@linuxfoundation.org>,
"Christian Brauner (Amutable)" <brauner@kernel.org>
Subject: [PATCH RFC 09/11] review-tui: extract the Msgs column renderer from TrackedSeriesItem
Date: Sat, 18 Jul 2026 00:37:45 +0200 [thread overview]
Message-ID: <20260718-work-b4-multiver-rows-v1-9-3c539d2a3095@kernel.org> (raw)
In-Reply-To: <20260718-work-b4-multiver-rows-v1-0-3c539d2a3095@kernel.org>
The tracker list computes the Msgs column (thread total plus an unseen
badge) inline in TrackedSeriesItem.compose(). Per-version child rows
need the exact same column, so pull the computation out into
_msgs_fields() and the styled append into _append_msgs().
No functional change.
Assisted-by: LLM
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
src/b4/review_tui/_tracking_app.py | 95 ++++++++++++++++++++++----------------
1 file changed, 54 insertions(+), 41 deletions(-)
diff --git a/src/b4/review_tui/_tracking_app.py b/src/b4/review_tui/_tracking_app.py
index cc20ad6..8800383 100644
--- a/src/b4/review_tui/_tracking_app.py
+++ b/src/b4/review_tui/_tracking_app.py
@@ -516,6 +516,54 @@ def _format_attestation(att: str, app: Any = None) -> Optional[RichText]:
return text
+def _msgs_fields(
+ message_count: Optional[int], seen_message_count: Optional[int]
+) -> Tuple[str, str, bool]:
+ """Render the Msgs column for a (total, seen) message count pair.
+
+ Returns (base, badge, base_accent): "1" (all seen), "6" accented (all
+ new), "6" + "(3)" (mixed). A never-fetched thread has no count and
+ renders as "-". The badge is accented whenever it is non-empty.
+ """
+ if message_count is None:
+ return '-', '', False
+ if message_count == 0:
+ return '0', '', False
+ delta = (
+ message_count - seen_message_count
+ if (seen_message_count is not None and message_count > seen_message_count)
+ else 0
+ )
+ if delta == message_count:
+ # All follow-ups are new
+ return str(message_count), '', True
+ if delta > 0:
+ # Mixed: total + (unseen)
+ return str(message_count), f'({delta})', False
+ # All seen
+ return str(message_count), '', False
+
+
+def _append_msgs(
+ label: RichText,
+ app: Any,
+ message_count: Optional[int],
+ seen_message_count: Optional[int],
+) -> None:
+ """Append the Msgs column (total + unseen badge) to *label*."""
+ base, badge, base_accent = _msgs_fields(message_count, seen_message_count)
+ base_style = ''
+ badge_style = ''
+ if base_accent or badge:
+ accent = f'bold {resolve_styles(app)["warning"]}'
+ if base_accent:
+ base_style = accent
+ if badge:
+ badge_style = accent
+ label.append(f' {base.rjust(3)}', style=base_style)
+ label.append(f'{badge:<3s}', style=badge_style)
+
+
class TrackedSeriesItem(ListItem):
"""A single tracked series entry in the listing."""
@@ -553,36 +601,6 @@ class TrackedSeriesItem(ListItem):
art_str = f'{a}·{r}·{t}'
else:
art_str = '-'
- fc = self.series.get('message_count')
- sc = self.series.get('seen_message_count')
- if fc is not None:
- delta = (fc - sc) if (sc is not None and fc > sc) else 0
- else:
- delta = 0
- # Msgs display: "1" (all seen), "6" accent (all new), "6(3)" mixed
- if fc is None:
- fu_base = '-'
- fu_badge = ''
- base_accent = False
- elif fc == 0:
- fu_base = '0'
- fu_badge = ''
- base_accent = False
- elif delta == fc:
- # All follow-ups are new
- fu_base = str(fc)
- fu_badge = ''
- base_accent = True
- elif delta > 0:
- # Mixed: total + (unseen)
- fu_base = str(fc)
- fu_badge = f'({delta})'
- base_accent = False
- else:
- # All seen
- fu_base = str(fc)
- fu_badge = ''
- base_accent = False
# Build compact prefix using LoreSubject to extract subsystem/modifier tokens
ls = b4.LoreSubject(subject)
extras = ls.get_extra_prefixes(exclude=['patch'])
@@ -605,17 +623,12 @@ class TrackedSeriesItem(ListItem):
label.append(' ')
label.append(' ')
label.append(art_str.rjust(7))
- base_style = ''
- badge_style = ''
- if base_accent or fu_badge:
- ts = resolve_styles(self.app)
- accent = f'bold {ts["warning"]}'
- if base_accent:
- base_style = accent
- if fu_badge:
- badge_style = accent
- label.append(f' {fu_base.rjust(3)}', style=base_style)
- label.append(f'{fu_badge:<3s}', style=badge_style)
+ _append_msgs(
+ label,
+ self.app,
+ self.series.get('message_count'),
+ self.series.get('seen_message_count'),
+ )
label.append(f' {symbol}{flag} {subject_display}')
yield Label(label, markup=False)
--
2.53.0
next prev parent reply other threads:[~2026-07-17 22:38 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-17 22:37 [PATCH RFC 00/11] review: track and browse every version of a tracked series Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 01/11] review-tui: fix rethreaded series thread viewing Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 02/11] review: track message counts for all revisions of a series Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 03/11] review: test per-revision message tracking Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 04/11] review-tui: poll every revision on u/U updates Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 05/11] review-tui: guarantee the tracked revision in revision lists Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 06/11] review: add backward discovery of older series revisions Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 07/11] review-tui: add a "Find older revisions" action Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 08/11] review: test backward revision discovery Christian Brauner
2026-07-17 22:37 ` Christian Brauner [this message]
2026-07-17 22:37 ` [PATCH RFC 10/11] review-tui: expand tracked series into per-version rows Christian Brauner
2026-07-17 22:37 ` [PATCH RFC 11/11] review-tui: test per-version tracker rows Christian Brauner
2026-07-27 20:43 ` [PATCH RFC 00/11] review: track and browse every version of a tracked series Konstantin Ryabitsev
2026-07-27 21:27 ` Christian Brauner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260718-work-b4-multiver-rows-v1-9-3c539d2a3095@kernel.org \
--to=brauner@kernel.org \
--cc=konstantin@linuxfoundation.org \
--cc=tools@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).