This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch fix/camel-tui-cosmetic
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/fix/camel-tui-cosmetic by this
push:
new ad0688e0779d Improve TUI log tab: word wrap, horizontal scroll,
cleaner footer
ad0688e0779d is described below
commit ad0688e0779d82393dfe331d8c6d0a722f3c15c8
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat May 16 09:31:17 2026 +0200
Improve TUI log tab: word wrap, horizontal scroll, cleaner footer
- Add word wrap toggle (w key, default on) with WRAP_WORD/CLIP overflow
- Add horizontal scroll (←→ keys) when word wrap is off
- Remove level togglers (t/d/i/w/e) and show all log lines unfiltered
- Footer now shows wrap [on/off] and follow [on/off] state indicators
- Remove [FOLLOW] indicator from tab title bar
---
.../dsl/jbang/core/commands/tui/CamelMonitor.java | 97 ++++++++--------------
1 file changed, 35 insertions(+), 62 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index b7a87f45f86d..ea8a5372409f 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -166,11 +166,8 @@ public class CamelMonitor extends CamelCommand {
private int logScroll;
private final ScrollbarState logScrollState = new ScrollbarState();
private boolean logFollowMode = true;
- private boolean showLogTrace = true;
- private boolean showLogDebug = true;
- private boolean showLogInfo = true;
- private boolean showLogWarn = true;
- private boolean showLogError = true;
+ private boolean logWordWrap = true;
+ private int logHScroll;
// Trace state
private final AtomicReference<List<TraceEntry>> traces = new
AtomicReference<>(Collections.emptyList());
@@ -462,40 +459,33 @@ public class CamelMonitor extends CamelCommand {
return true;
}
- // Log tab: level filters and follow mode
+ // Log tab: follow mode, word wrap, horizontal scroll
if (tab == TAB_LOG) {
- if (ke.isCharIgnoreCase('t')) {
- showLogTrace = !showLogTrace;
- filteredLogEntries = applyLogFilters(logLines);
- return true;
- }
- if (ke.isCharIgnoreCase('d')) {
- showLogDebug = !showLogDebug;
- filteredLogEntries = applyLogFilters(logLines);
- return true;
- }
- if (ke.isCharIgnoreCase('i')) {
- showLogInfo = !showLogInfo;
- filteredLogEntries = applyLogFilters(logLines);
+ if (ke.isCharIgnoreCase('f')) {
+ logFollowMode = !logFollowMode;
return true;
}
if (ke.isCharIgnoreCase('w')) {
- showLogWarn = !showLogWarn;
- filteredLogEntries = applyLogFilters(logLines);
- return true;
- }
- if (ke.isCharIgnoreCase('e')) {
- showLogError = !showLogError;
- filteredLogEntries = applyLogFilters(logLines);
+ logWordWrap = !logWordWrap;
+ logHScroll = 0;
return true;
}
- if (ke.isCharIgnoreCase('f')) {
- logFollowMode = !logFollowMode;
- return true;
+ if (!logWordWrap) {
+ if (ke.isLeft()) {
+ logFollowMode = false;
+ logHScroll = Math.max(0, logHScroll - 4);
+ return true;
+ }
+ if (ke.isRight()) {
+ logFollowMode = false;
+ logHScroll += 4;
+ return true;
+ }
}
if (ke.isHome()) {
logFollowMode = false;
logScroll = 0;
+ logHScroll = 0;
return true;
}
if (ke.isEnd()) {
@@ -1908,7 +1898,7 @@ public class CamelMonitor extends CamelCommand {
Block block = Block.builder()
.borderType(BorderType.ROUNDED)
- .title(" Log " + buildLevelFilterTitle())
+ .title(" Log ")
.build();
frame.renderWidget(block, area);
@@ -1922,16 +1912,23 @@ public class CamelMonitor extends CamelCommand {
List<Line> lines = new ArrayList<>();
for (LogEntry entry : entries) {
- lines.add(Line.from(Span.raw(entry.raw != null ? entry.raw : "")));
+ String raw = entry.raw != null ? entry.raw : "";
+ if (!logWordWrap && logHScroll > 0) {
+ int total = CharWidth.of(raw);
+ int remaining = total - logHScroll;
+ raw = remaining > 0 ? CharWidth.substringByWidthFromEnd(raw,
remaining) : "";
+ }
+ lines.add(Line.from(Span.raw(raw)));
}
List<Rect> hChunks = Layout.horizontal()
.constraints(Constraint.fill(), Constraint.length(1))
.split(inner);
+ Overflow overflow = logWordWrap ? Overflow.WRAP_WORD : Overflow.CLIP;
Paragraph para = Paragraph.builder()
.text(Text.from(lines))
- .overflow(Overflow.CLIP)
+ .overflow(overflow)
.scroll(logScroll)
.build();
frame.renderWidget(para, hChunks.get(0));
@@ -1944,19 +1941,6 @@ public class CamelMonitor extends CamelCommand {
}
}
- private String buildLevelFilterTitle() {
- StringBuilder sb = new StringBuilder();
- sb.append(showLogTrace ? "[T] " : "[t] ");
- sb.append(showLogDebug ? "[D] " : "[d] ");
- sb.append(showLogInfo ? "[I] " : "[i] ");
- sb.append(showLogWarn ? "[W] " : "[w] ");
- sb.append(showLogError ? "[E] " : "[e] ");
- if (logFollowMode) {
- sb.append("[FOLLOW]");
- }
- return sb.toString();
- }
-
private void readLogFile(String pid, List<String> target) {
target.clear();
Path logFile = CommandLineHelper.getCamelDir().resolve(pid + ".log");
@@ -1991,11 +1975,7 @@ public class CamelMonitor extends CamelCommand {
private List<LogEntry> applyLogFilters(List<String> lines) {
List<LogEntry> result = new ArrayList<>();
for (String line : lines) {
- LogEntry entry = parseLogLine(line);
- if (!matchesLogLevelFilter(entry.level)) {
- continue;
- }
- result.add(entry);
+ result.add(parseLogLine(line));
}
return result;
}
@@ -2042,16 +2022,6 @@ public class CamelMonitor extends CamelCommand {
return entry;
}
- private boolean matchesLogLevelFilter(String level) {
- return switch (level) {
- case "ERROR", "FATAL" -> showLogError;
- case "WARN" -> showLogWarn;
- case "DEBUG" -> showLogDebug;
- case "TRACE" -> showLogTrace;
- default -> showLogInfo;
- };
- }
-
// ---- Tab 6: Trace ----
private void renderTrace(Frame frame, Rect area) {
@@ -2587,8 +2557,11 @@ public class CamelMonitor extends CamelCommand {
hint(spans, "\u2191\u2193", "scroll");
hint(spans, "PgUp/PgDn", "page");
hint(spans, "Home/End", "top/end");
- hint(spans, "t/d/i/w/e", "levels");
- hintLast(spans, "f", "follow");
+ hint(spans, "w", "wrap" + (logWordWrap ? " [on]" : " [off]"));
+ if (!logWordWrap) {
+ hint(spans, "\u2190\u2192", "h-scroll");
+ }
+ hintLast(spans, "f", "follow" + (logFollowMode ? " [on]" : "
[off]"));
} else if (tab == TAB_TRACE && traceDetailView) {
hint(spans, "Esc", "back");
hint(spans, "\u2191\u2193", "navigate");