This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 9e34ba44c88a camel-jbang (tui) - Align x-axis timeline between
endpoint charts
9e34ba44c88a is described below
commit 9e34ba44c88a5509434f1c31c3b5e48d5e39233c
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Aug 12 21:34:19 2026 +0200
camel-jbang (tui) - Align x-axis timeline between endpoint charts
The throughput and payload size charts had different x-axis timelines
(e.g. -40s vs -80s) because they computed renderPoints independently
from different-width areas. Now uses a three-column layout (flow panel,
throughput chart, payload chart) so both charts get equal width and
share the same renderPoints for aligned timelines.
camel-jbang (tui) - Add space before chart legend in title bar
The colored legend indicator was flush against the border corner,
looking like a chart artifact. Add leading space padding.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Signed-off-by: Claus Ibsen <[email protected]>
---
.../dsl/jbang/core/commands/tui/EndpointsTab.java | 48 +++++++++++++++++-----
.../dsl/jbang/core/commands/tui/FlowHelper.java | 21 +++++++++-
2 files changed, 57 insertions(+), 12 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
index 4fceee674992..305cf77220da 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
@@ -371,11 +371,17 @@ class EndpointsTab extends AbstractTableTab {
.sum();
if (hasSizeHistory) {
- List<Rect> chartSplit = Layout.horizontal()
- .constraints(Constraint.percentage(50),
Constraint.percentage(50))
+ // three-column layout: flow panel (fixed) | throughput
chart | payload chart
+ List<Rect> threeParts = Layout.horizontal()
+ .constraints(Constraint.length(flowPanelWidth),
Constraint.fill(), Constraint.fill())
.split(chunks.get(1));
- renderEndpointFlow(frame, chartSplit.get(0), inTotal,
outTotal, info.name, info.pid);
- renderPayloadSizeChart(frame, chartSplit.get(1), info.pid);
+ hSplit.setBorderPos(threeParts.get(1).x());
+ FlowHelper.renderFlowPanel(frame, threeParts.get(0),
inTotal, outTotal, info.name);
+ int renderPoints = Math.min(
+ FlowHelper.computeRenderPoints(threeParts.get(1)),
+ FlowHelper.computeRenderPoints(threeParts.get(2)));
+ renderThroughputChartDirect(frame, threeParts.get(1),
info.pid, renderPoints);
+ renderPayloadSizeChart(frame, threeParts.get(2), info.pid,
renderPoints);
} else {
renderEndpointFlow(frame, chunks.get(1), inTotal,
outTotal, info.name, info.pid);
}
@@ -457,7 +463,7 @@ class EndpointsTab extends AbstractTableTab {
return 2;
}
- private void renderEndpointFlow(
+ private int renderEndpointFlow(
Frame frame, Rect area, long inTotal, long outTotal, String name,
String pid) {
flowPanelWidth = Math.max(20, Math.min(flowPanelWidth, area.width() -
20));
List<Rect> hParts = Layout.horizontal()
@@ -480,7 +486,9 @@ class EndpointsTab extends AbstractTableTab {
LinkedList<Long> inHist = inHistMap.getOrDefault(pid, new
LinkedList<>());
LinkedList<Long> outHist = outHistMap.getOrDefault(pid, new
LinkedList<>());
- FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist,
outHist);
+ int renderPoints = FlowHelper.computeRenderPoints(hParts.get(1));
+ FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist,
outHist, null, renderPoints);
+ return renderPoints;
}
private void renderSingleEndpointChart(Frame frame, Rect area, String
selectedUri, IntegrationInfo info) {
@@ -519,17 +527,37 @@ class EndpointsTab extends AbstractTableTab {
List<Rect> chartSplit = Layout.horizontal()
.constraints(Constraint.percentage(50),
Constraint.percentage(50))
.split(hParts.get(1));
- FlowHelper.renderThroughputChart(frame, chartSplit.get(0), inHist,
outHist, selectedUri);
- FlowHelper.renderPayloadSizeChart(frame, chartSplit.get(1),
inSizeHist, outSizeHist);
+ // use the same render points for both charts so their x-axis
timelines align
+ int renderPoints = Math.min(
+ FlowHelper.computeRenderPoints(chartSplit.get(0)),
+ FlowHelper.computeRenderPoints(chartSplit.get(1)));
+ FlowHelper.renderThroughputChart(frame, chartSplit.get(0), inHist,
outHist, selectedUri, renderPoints);
+ FlowHelper.renderPayloadSizeChart(frame, chartSplit.get(1),
inSizeHist, outSizeHist, renderPoints);
} else {
FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist,
outHist, selectedUri);
}
}
- private void renderPayloadSizeChart(Frame frame, Rect area, String pid) {
+ private void renderThroughputChartDirect(Frame frame, Rect area, String
pid, int renderPoints) {
+ Map<String, LinkedList<Long>> inHistMap = switch (filter) {
+ case 1 -> endpointRemoteInHistory;
+ case 2 -> endpointRemoteStubInHistory;
+ default -> endpointInHistory;
+ };
+ Map<String, LinkedList<Long>> outHistMap = switch (filter) {
+ case 1 -> endpointRemoteOutHistory;
+ case 2 -> endpointRemoteStubOutHistory;
+ default -> endpointOutHistory;
+ };
+ LinkedList<Long> inHist = inHistMap.getOrDefault(pid, new
LinkedList<>());
+ LinkedList<Long> outHist = outHistMap.getOrDefault(pid, new
LinkedList<>());
+ FlowHelper.renderThroughputChart(frame, area, inHist, outHist, null,
renderPoints);
+ }
+
+ private void renderPayloadSizeChart(Frame frame, Rect area, String pid,
int renderPoints) {
LinkedList<Long> inHist = endpointInSizeHistory.getOrDefault(pid, new
LinkedList<>());
LinkedList<Long> outHist = endpointOutSizeHistory.getOrDefault(pid,
new LinkedList<>());
- FlowHelper.renderPayloadSizeChart(frame, area, inHist, outHist);
+ FlowHelper.renderPayloadSizeChart(frame, area, inHist, outHist,
renderPoints);
}
private void renderDetail(Frame frame, Rect area, List<EndpointInfo>
sortedEndpoints, IntegrationInfo info) {
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
index d4764cb204c6..fb3a9c1b08cf 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
@@ -100,9 +100,18 @@ final class FlowHelper {
renderThroughputChart(frame, area, inHist, outHist, null);
}
+ static int computeRenderPoints(Rect area) {
+ return Math.max(20, (Math.min(MAX_CHART_POINTS, area.width() - 6) /
20) * 20);
+ }
+
static void renderThroughputChart(
Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long>
outHist, String chartLabel) {
- int renderPoints = Math.max(20, (Math.min(MAX_CHART_POINTS,
area.width() - 6) / 20) * 20);
+ renderThroughputChart(frame, area, inHist, outHist, chartLabel,
computeRenderPoints(area));
+ }
+
+ static void renderThroughputChart(
+ Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long>
outHist,
+ String chartLabel, int renderPoints) {
long[] inArr = new long[renderPoints];
long[] outArr = new long[renderPoints];
for (int i = 0; i < renderPoints; i++) {
@@ -133,6 +142,9 @@ final class FlowHelper {
titleSpans.add(Span.styled(label, Theme.label().bold()));
titleSpans.add(Span.raw("] "));
}
+ if (chartLabel == null) {
+ titleSpans.add(Span.raw(" "));
+ }
titleSpans.add(Span.styled("▬", Theme.success()));
titleSpans.add(Span.raw(String.format(" in:%-4s ",
MetricsCollector.formatThroughput(curIn))));
titleSpans.add(Span.styled("▬", Style.EMPTY.fg(Theme.accent())));
@@ -153,7 +165,11 @@ final class FlowHelper {
static void renderPayloadSizeChart(
Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long>
outHist) {
- int renderPoints = Math.max(20, (Math.min(MAX_CHART_POINTS,
area.width() - 6) / 20) * 20);
+ renderPayloadSizeChart(frame, area, inHist, outHist,
computeRenderPoints(area));
+ }
+
+ static void renderPayloadSizeChart(
+ Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long>
outHist, int renderPoints) {
long[] inArr = new long[renderPoints];
long[] outArr = new long[renderPoints];
for (int i = 0; i < renderPoints; i++) {
@@ -170,6 +186,7 @@ final class FlowHelper {
long curOut = outArr[renderPoints - 1];
Line chartTitle = Line.from(
+ Span.raw(" "),
Span.styled("▬", Theme.label()),
Span.raw(String.format(" in:%-8s ", sizeToString(curIn))),
Span.styled("▬", Theme.notice()),