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 4cba7b58ad6a CAMEL-23976: TUI - Add log pin and default folder settings
4cba7b58ad6a is described below

commit 4cba7b58ad6a03e113a0798f4c48cc9ae989095f
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jul 10 11:00:17 2026 +0200

    CAMEL-23976: TUI - Add log pin and default folder settings
    
    Add log pin setting to Settings dialog (off/25/50/75%) so TUI can
    launch with the log panel pre-pinned. Apply the setting on startup
    in CamelMonitor. The default folder setting also serves as fallback
    for the Send message file browser. Enlarge and reposition the settings
    dialog for better readability.
    
    CAMEL-23976: TUI - consistent popup title styling
    
    Use plain titles on all popups (remove yellow Theme.label styling from
    F3 Switch Integration, More Tabs, Ctrl+F folder browser, and input
    history). Standardize count indicators to bracket style [N] in Errors
    tab and InfraBrowserPopup. Indent Log Pin as sub-setting of Starting
    Tab in Settings dialog.
    
    CAMEL-23976: TUI - remove remaining yellow popup titles
    
    Use plain titles on FilesBrowser, SendMessagePopup, and SqlQueryTab
    popups for consistency with all other popups.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../dsl/jbang/core/commands/tui/CamelMonitor.java  | 26 ++++++++++++
 .../dsl/jbang/core/commands/tui/ErrorsTab.java     |  2 +-
 .../dsl/jbang/core/commands/tui/FilesBrowser.java  |  4 +-
 .../dsl/jbang/core/commands/tui/FolderBrowser.java |  4 +-
 .../jbang/core/commands/tui/InfraBrowserPopup.java |  2 +-
 .../dsl/jbang/core/commands/tui/InputHistory.java  |  3 +-
 .../dsl/jbang/core/commands/tui/PopupManager.java  |  8 +---
 .../jbang/core/commands/tui/SendMessagePopup.java  |  8 +++-
 .../dsl/jbang/core/commands/tui/SettingsPopup.java | 46 +++++++++++++++++++---
 .../dsl/jbang/core/commands/tui/SqlQueryTab.java   |  2 +-
 .../dsl/jbang/core/commands/tui/TuiSettings.java   | 12 ++++++
 .../core/commands/tui/ErrorsTabRenderTest.java     |  2 +-
 .../core/commands/tui/SettingsPopupRenderTest.java |  7 ++--
 .../jbang/core/commands/tui/SettingsPopupTest.java |  7 +++-
 14 files changed, 102 insertions(+), 31 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 8f7a92c87a9f..8ef6eeda1ed5 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
@@ -495,6 +495,7 @@ public class CamelMonitor extends CamelCommand {
             tabRegistry.diagramTab().preloadDiagram();
             // Open on the configured starting tab (if any), now that all tab 
wiring is in place
             applyStartingTab();
+            applyLogPin();
             // Intercept Ctrl+C: quit the TUI cleanly instead of letting
             // the JVM tear down the classloader while we're still running
             Signal.handle(new Signal("INT"), sig -> tui.quit());
@@ -535,6 +536,31 @@ public class CamelMonitor extends CamelCommand {
         }
     }
 
+    private void applyLogPin() {
+        String logPin = TuiSettings.load().getLogPin();
+        if (logPin == null || logPin.isBlank()) {
+            return;
+        }
+        int cycleIndex;
+        switch (logPin) {
+            case "25":
+                cycleIndex = 0;
+                break;
+            case "50":
+                cycleIndex = 1;
+                break;
+            case "75":
+                cycleIndex = 2;
+                break;
+            default:
+                return;
+        }
+        logPinned = true;
+        logPinAnim.reset(cycleIndex);
+        ctx.logPinned = true;
+        ctx.logPinPercent = Integer.parseInt(logPin);
+    }
+
     // ---- Event Handling ----
 
     private boolean handleEvent(Event event, TuiRunner runner) {
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTab.java
index f18fe1e90f6e..d64f8ce25b81 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTab.java
@@ -384,7 +384,7 @@ class ErrorsTab extends AbstractTableTab {
                 .highlightStyle(Theme.selectionBg())
                 .highlightSpacing(Table.HighlightSpacing.ALWAYS)
                 
.block(Block.builder().borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(" Errors (" + sorted.size() + ") ").build())
+                        .title(" Errors [" + sorted.size() + "] ").build())
                 .build();
 
         lastTableArea = chunks.get(0);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FilesBrowser.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FilesBrowser.java
index ed840bc15a58..67648a0bb3f5 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FilesBrowser.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FilesBrowser.java
@@ -37,7 +37,6 @@ import dev.tamboui.widgets.Clear;
 import dev.tamboui.widgets.block.Block;
 import dev.tamboui.widgets.block.BorderType;
 import dev.tamboui.widgets.block.Borders;
-import dev.tamboui.widgets.block.Title;
 import dev.tamboui.widgets.list.ListItem;
 import dev.tamboui.widgets.list.ListState;
 import dev.tamboui.widgets.list.ListWidget;
@@ -282,8 +281,7 @@ class FilesBrowser {
                 .scrollMode(ScrollMode.AUTO_SCROLL)
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(Title.from(Line
-                                .from(Span.styled(popupTitle, 
Theme.label().bold()))))
+                        .title(popupTitle)
                         .build())
                 .build();
         frame.renderStatefulWidget(list, popup, listState);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FolderBrowser.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FolderBrowser.java
index 03ae0b951c22..e40c197ee9bd 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FolderBrowser.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FolderBrowser.java
@@ -40,7 +40,6 @@ import dev.tamboui.widgets.Clear;
 import dev.tamboui.widgets.block.Block;
 import dev.tamboui.widgets.block.BorderType;
 import dev.tamboui.widgets.block.Borders;
-import dev.tamboui.widgets.block.Title;
 import dev.tamboui.widgets.list.ListItem;
 import dev.tamboui.widgets.list.ListState;
 import dev.tamboui.widgets.list.ListWidget;
@@ -362,8 +361,7 @@ class FolderBrowser {
                 .scrollMode(ScrollMode.AUTO_SCROLL)
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(Title.from(Line
-                                .from(Span.styled(popupTitle, 
Theme.label().bold()))))
+                        .title(popupTitle)
                         .build())
                 .build();
         frame.renderStatefulWidget(list, popup, listState);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InfraBrowserPopup.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InfraBrowserPopup.java
index 9ef8d75ce3f3..d638f9ec5ee2 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InfraBrowserPopup.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InfraBrowserPopup.java
@@ -377,7 +377,7 @@ class InfraBrowserPopup {
                 .scrollMode(ScrollMode.AUTO_SCROLL)
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(" Run Dev/Infra Service (" + available + "/" + 
catalog.size() + ") ")
+                        .title(" Run Dev/Infra Service [" + available + "/" + 
catalog.size() + "] ")
                         .build())
                 .build();
         frame.renderStatefulWidget(list, popup, browserState);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InputHistory.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InputHistory.java
index bdd49a02248c..a341162e898e 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InputHistory.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InputHistory.java
@@ -27,7 +27,6 @@ import dev.tamboui.tui.event.KeyEvent;
 import dev.tamboui.widgets.Clear;
 import dev.tamboui.widgets.block.Block;
 import dev.tamboui.widgets.block.BorderType;
-import dev.tamboui.widgets.block.Title;
 import dev.tamboui.widgets.list.ListItem;
 import dev.tamboui.widgets.list.ListState;
 import dev.tamboui.widgets.list.ListWidget;
@@ -143,7 +142,7 @@ class InputHistory {
                 .highlightSymbol("")
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED)
-                        .title(Title.from(Line.from(Span.styled(" " + title + 
" ", Theme.label().bold()))))
+                        .title(" " + title + " ")
                         .build())
                 .build();
         frame.renderStatefulWidget(list, popup, listState);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/PopupManager.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/PopupManager.java
index f998564d2fd0..d75c4bd688e6 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/PopupManager.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/PopupManager.java
@@ -34,7 +34,6 @@ import dev.tamboui.widgets.Clear;
 import dev.tamboui.widgets.block.Block;
 import dev.tamboui.widgets.block.BorderType;
 import dev.tamboui.widgets.block.Borders;
-import dev.tamboui.widgets.block.Title;
 import dev.tamboui.widgets.list.ListItem;
 import dev.tamboui.widgets.list.ListState;
 import dev.tamboui.widgets.list.ListWidget;
@@ -426,9 +425,7 @@ class PopupManager {
                 .scrollMode(ScrollMode.AUTO_SCROLL)
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(Title.from(Line.from(Span.styled(
-                                " " + TuiIcons.TAB_MORE + " More Tabs ",
-                                Theme.label().bold()))))
+                        .title(" " + TuiIcons.TAB_MORE + " More Tabs ")
                         .build())
                 .build();
         frame.renderStatefulWidget(list, popup, morePopupState);
@@ -498,8 +495,7 @@ class PopupManager {
                 .scrollMode(ScrollMode.NONE)
                 .block(Block.builder()
                         .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                        .title(Title.from(
-                                Line.from(Span.styled(" Switch Integration ", 
Theme.label().bold()))))
+                        .title(" Switch Integration ")
                         .build())
                 .build();
         frame.renderStatefulWidget(listWidget, popup, switchPopupState);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SendMessagePopup.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SendMessagePopup.java
index 7f20e25510f4..8f0841c75558 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SendMessagePopup.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SendMessagePopup.java
@@ -462,7 +462,11 @@ class SendMessagePopup {
     private void openFileBrowser() {
         fileBrowser.setFileSelectMode(true);
         fileBrowser.setOnSelect(path -> bodyState.setText("file:" + path));
-        String startDir = sourceDirectory != null ? sourceDirectory : 
System.getProperty("user.dir");
+        String startDir = sourceDirectory;
+        if (startDir == null) {
+            String settingsFolder = TuiSettings.load().getDefaultFolder();
+            startDir = settingsFolder != null ? settingsFolder : 
System.getProperty("user.dir");
+        }
         fileBrowser.open(startDir);
     }
 
@@ -800,7 +804,7 @@ class SendMessagePopup {
 
         Block block = Block.builder()
                 .borderType(BorderType.ROUNDED).borders(Borders.ALL)
-                .title(Title.from(Line.from(Span.styled(title, 
Theme.label().bold()))))
+                .title(title)
                 .build();
         frame.renderWidget(block, area);
         Rect inner = block.inner(area);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopup.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopup.java
index d601a21f58d7..24cf97ec4626 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopup.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopup.java
@@ -47,8 +47,11 @@ class SettingsPopup {
 
     private static final int ROW_THEME = 0;
     private static final int ROW_START_TAB = 1;
-    private static final int ROW_FOLDER = 2;
-    private static final int ROW_COUNT = 3;
+    private static final int ROW_LOG_PIN = 2;
+    private static final int ROW_FOLDER = 3;
+    private static final int ROW_COUNT = 4;
+
+    private static final String[] LOG_PIN_OPTIONS = { "off", "25", "50", "75" 
};
 
     private boolean visible;
     private int selectedRow;
@@ -56,6 +59,7 @@ class SettingsPopup {
     private TuiSettings settings;
     private int themeIndex;
     private int startTabIndex;
+    private int logPinIndex;
     private TextInputState folderInput;
     private List<String> tabNames = new ArrayList<>();
 
@@ -91,6 +95,15 @@ class SettingsPopup {
         int idx = tabNames.indexOf(currentStartTab);
         startTabIndex = idx >= 0 ? idx : 0;
 
+        String currentLogPin = settings.getLogPin() != null ? 
settings.getLogPin() : "off";
+        logPinIndex = 0;
+        for (int i = 0; i < LOG_PIN_OPTIONS.length; i++) {
+            if (LOG_PIN_OPTIONS[i].equals(currentLogPin)) {
+                logPinIndex = i;
+                break;
+            }
+        }
+
         folderInput = new TextInputState(settings.getDefaultFolder() != null ? 
settings.getDefaultFolder() : "");
         selectedRow = ROW_THEME;
         visible = true;
@@ -150,6 +163,14 @@ class SettingsPopup {
             }
             return true;
         }
+        if (selectedRow == ROW_LOG_PIN) {
+            if (ke.isChar(' ') || ke.isRight()) {
+                logPinIndex = (logPinIndex + 1) % LOG_PIN_OPTIONS.length;
+            } else if (ke.isLeft()) {
+                logPinIndex = (logPinIndex - 1 + LOG_PIN_OPTIONS.length) % 
LOG_PIN_OPTIONS.length;
+            }
+            return true;
+        }
         if (selectedRow == ROW_FOLDER) {
             handleTextInput(ke, folderInput);
             return true;
@@ -163,6 +184,8 @@ class SettingsPopup {
         if (!tabNames.isEmpty()) {
             settings.setStartTab(tabNames.get(startTabIndex));
         }
+        String logPinValue = LOG_PIN_OPTIONS[logPinIndex];
+        settings.setLogPin("off".equals(logPinValue) ? null : logPinValue);
         
settings.setDefaultFolder(stripControlChars(folderInput.text().trim()));
         settings.save();
         if (Theme.mode().equals(selectedThemeId)) {
@@ -177,11 +200,11 @@ class SettingsPopup {
     }
 
     void render(Frame frame, Rect area) {
-        int popupW = Math.min(64, area.width() - 4);
+        int popupW = Math.min(80, area.width() - 4);
         int popupH = 2 + ROW_COUNT;
         int x = area.left() + Math.max(0, (area.width() - popupW) / 2);
-        int y = area.top() + Math.max(0, (area.height() - popupH) / 4);
-        Rect popup = new Rect(x, y, Math.min(popupW, area.width()), 
Math.min(popupH, area.height()));
+        int y = area.top() + 2;
+        Rect popup = new Rect(x, y, Math.min(popupW, area.width()), 
Math.min(popupH, area.height() - 2));
 
         frame.renderWidget(Clear.INSTANCE, popup);
 
@@ -205,13 +228,20 @@ class SettingsPopup {
         renderValue(frame, innerX + labelW, rowY, fieldW, currentTabLabel(), 
selectedRow == ROW_START_TAB);
         rowY++;
 
+        String logPinLabel = "off".equals(LOG_PIN_OPTIONS[logPinIndex])
+                ? "off"
+                : LOG_PIN_OPTIONS[logPinIndex] + "%";
+        renderLabel(frame, innerX, rowY, labelW, "  Log Pin:", selectedRow == 
ROW_LOG_PIN);
+        renderValue(frame, innerX + labelW, rowY, fieldW, logPinLabel, 
selectedRow == ROW_LOG_PIN);
+        rowY++;
+
         renderLabel(frame, innerX, rowY, labelW, "Default Folder:", 
selectedRow == ROW_FOLDER);
         renderFolder(frame, innerX + labelW, rowY, fieldW, selectedRow == 
ROW_FOLDER);
     }
 
     void renderFooter(List<Span> spans) {
         hint(spans, TuiIcons.HINT_SCROLL, "navigate");
-        if (selectedRow == ROW_THEME || selectedRow == ROW_START_TAB) {
+        if (selectedRow == ROW_THEME || selectedRow == ROW_START_TAB || 
selectedRow == ROW_LOG_PIN) {
             hint(spans, "Space", "cycle");
         }
         hint(spans, "Enter", "save");
@@ -309,6 +339,10 @@ class SettingsPopup {
         return tabNames.isEmpty() ? null : tabNames.get(startTabIndex);
     }
 
+    String selectedLogPin() {
+        return LOG_PIN_OPTIONS[logPinIndex];
+    }
+
     String folderText() {
         return folderInput != null ? folderInput.text() : "";
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlQueryTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlQueryTab.java
index a9fd72cb452c..1f6f8e273e93 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlQueryTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlQueryTab.java
@@ -753,7 +753,7 @@ class SqlQueryTab extends AbstractTab {
 
         Block block = Block.builder()
                 .borderType(BorderType.ROUNDED)
-                .title(Title.from(Line.from(Span.styled(title, 
Theme.label().bold()))))
+                .title(title)
                 .build();
         Rect inner = block.inner(popup);
         frame.renderWidget(block, popup);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiSettings.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiSettings.java
index 784bd4fb196e..d3b94bee8cbe 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiSettings.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiSettings.java
@@ -29,10 +29,12 @@ final class TuiSettings {
 
     static final String PROP_THEME = "camel.tui.theme";
     static final String PROP_START_TAB = "camel.tui.startTab";
+    static final String PROP_LOG_PIN = "camel.tui.logPin";
     static final String PROP_DEFAULT_FOLDER = "camel.tui.defaultFolder";
 
     private String themeId;
     private String startTab;
+    private String logPin;
     private String defaultFolder;
 
     String getThemeId() {
@@ -51,6 +53,14 @@ final class TuiSettings {
         this.startTab = startTab;
     }
 
+    String getLogPin() {
+        return logPin;
+    }
+
+    void setLogPin(String logPin) {
+        this.logPin = logPin;
+    }
+
     String getDefaultFolder() {
         return defaultFolder;
     }
@@ -69,6 +79,7 @@ final class TuiSettings {
         try {
             settings.themeId = trimToNull(TuiUserConfig.read(PROP_THEME));
             settings.startTab = trimToNull(TuiUserConfig.read(PROP_START_TAB));
+            settings.logPin = trimToNull(TuiUserConfig.read(PROP_LOG_PIN));
             settings.defaultFolder = 
trimToNull(TuiUserConfig.read(PROP_DEFAULT_FOLDER));
         } catch (RuntimeException e) {
             // best-effort: return an object with null fields on read failure
@@ -85,6 +96,7 @@ final class TuiSettings {
         try {
             TuiUserConfig.write(PROP_THEME, themeId);
             TuiUserConfig.write(PROP_START_TAB, startTab);
+            TuiUserConfig.write(PROP_LOG_PIN, logPin);
             TuiUserConfig.write(PROP_DEFAULT_FOLDER, defaultFolder);
         } catch (RuntimeException e) {
             // best-effort: a save failure must not disrupt the TUI
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTabRenderTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTabRenderTest.java
index 6edc6c666508..07c4310aef9d 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTabRenderTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/ErrorsTabRenderTest.java
@@ -166,7 +166,7 @@ class ErrorsTabRenderTest {
         ErrorsTab tab = new ErrorsTab(ctx);
         String rendered = renderToString(tab, 160, 30);
 
-        assertTrue(rendered.contains("Errors (2)"), "Title should show error 
count");
+        assertTrue(rendered.contains("Errors [2]"), "Title should show error 
count");
     }
 
     @Test
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupRenderTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupRenderTest.java
index a61d9305461e..a69bc74bcc8e 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupRenderTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupRenderTest.java
@@ -32,8 +32,8 @@ import org.junit.jupiter.api.parallel.Isolated;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- * Renders {@link SettingsPopup} into a virtual buffer and asserts the dialog 
shows its title and all three setting
- * rows, mirroring the other {@code *RenderTest} classes in this package.
+ * Renders {@link SettingsPopup} into a virtual buffer and asserts the dialog 
shows its title and all setting rows,
+ * mirroring the other {@code *RenderTest} classes in this package.
  */
 @Isolated
 class SettingsPopupRenderTest {
@@ -59,7 +59,7 @@ class SettingsPopupRenderTest {
     }
 
     @Test
-    void rendersTitleAndAllThreeSettingRows(@TempDir Path tempDir) {
+    void rendersTitleAndAllSettingRows(@TempDir Path tempDir) {
         useHome(tempDir);
         SettingsPopup popup = new SettingsPopup();
         popup.setTabEntries(List.of(
@@ -76,6 +76,7 @@ class SettingsPopupRenderTest {
         assertTrue(rendered.contains("Settings"), "the popup title should be 
shown");
         assertTrue(rendered.contains("Theme"), "the Theme row should be 
shown");
         assertTrue(rendered.contains("Starting Tab"), "the Starting Tab row 
should be shown");
+        assertTrue(rendered.contains("Log Pin"), "the Log Pin row should be 
shown");
         assertTrue(rendered.contains("Default Folder"), "the Default Folder 
row should be shown");
     }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupTest.java
index 7e30d6b60bb8..f802a0c76d22 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/SettingsPopupTest.java
@@ -134,7 +134,8 @@ class SettingsPopupTest {
 
         popup.handleKeyEvent(key(KeyCode.DOWN));
         popup.handleKeyEvent(key(KeyCode.DOWN));
-        assertEquals(2, popup.selectedRow());
+        popup.handleKeyEvent(key(KeyCode.DOWN));
+        assertEquals(3, popup.selectedRow());
         popup.handleKeyEvent(KeyEvent.ofChar('/'));
         popup.handleKeyEvent(KeyEvent.ofChar('a'));
         assertEquals("/a", popup.folderText());
@@ -149,7 +150,8 @@ class SettingsPopupTest {
 
         popup.handleKeyEvent(key(KeyCode.DOWN));
         popup.handleKeyEvent(key(KeyCode.DOWN));
-        assertEquals(2, popup.selectedRow());
+        popup.handleKeyEvent(key(KeyCode.DOWN));
+        assertEquals(3, popup.selectedRow());
         popup.handleKeyEvent(KeyEvent.ofChar(0x01));
         popup.handleKeyEvent(KeyEvent.ofChar(0x00));
         popup.handleKeyEvent(KeyEvent.ofChar('x'));
@@ -175,6 +177,7 @@ class SettingsPopupTest {
         popup.handleKeyEvent(KeyEvent.ofChar(' ')); // starting tab Overview 
-> Health
         assertEquals("Health", popup.selectedStartTab());
         popup.handleKeyEvent(key(KeyCode.DOWN));
+        popup.handleKeyEvent(key(KeyCode.DOWN));
         for (char c : "/tmp/p".toCharArray()) {
             popup.handleKeyEvent(KeyEvent.ofChar(c));
         }

Reply via email to