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