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");

Reply via email to