perf(explorer): cull off-screen rows in the block detail list

The block detail modal drew every transaction row of a block, running
the hit-test, the draw and a hash truncation for each one, even when the
row sat far outside the scroll viewport.

- A row entirely outside the scroll clip now keeps its layout slot (so
  the scroll extent is unchanged) but skips the hit-test, draw and hash
  truncation. The expanded row is always laid out so its inline detail
  panel still appears.
- The old "showing first 100 of N" footer is dropped, since every row is
  now cheap to lay out regardless of how many a block has.

No visible change; only off-screen rows are skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 09:24:51 -05:00
co-authored by Claude Opus 4.8
parent b8a4a11f90
commit 3ca7a5c90e
+3 -5
View File
@@ -1205,6 +1205,9 @@ static void renderBlockDetailModal(App* app) {
float txContentW = ImGui::GetContentRegionAvail().x;
ImGui::InvisibleButton("##txRow", ImVec2(txContentW, txRowH));
// Rows outside the scroll clip keep their layout slot (the button above) but skip the hit-test results,
// drawing and truncateHashToFit below. The expanded row is always laid out so its detail panel appears.
if (!isExpanded && !ImGui::IsItemVisible()) { ImGui::PopID(); continue; }
bool rowHovered = ImGui::IsItemHovered();
bool rowClicked = ImGui::IsItemClicked(0);
bool rightClicked = ImGui::IsItemClicked(1);
@@ -1313,11 +1316,6 @@ static void renderBlockDetailModal(App* app) {
ImGui::PopID();
}
if (s_detail_txids.size() > 100) {
snprintf(buf, sizeof(buf), TR("grpa_showing_first_100_of"), (int)s_detail_txids.size());
ImGui::TextDisabled("%s", buf);
}
}
EndOverlayDialog();