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 61167507fc0d CAMEL-23727: camel-jbang - Add mouse scroll support for
TUI shell panel (#23919)
61167507fc0d is described below
commit 61167507fc0dbe3eef7dbf9d9ad908345b4bffb3
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed Jun 10 19:38:10 2026 +0200
CAMEL-23727: camel-jbang - Add mouse scroll support for TUI shell panel
(#23919)
---
.../dsl/jbang/core/commands/tui/CamelMonitor.java | 6 +++++
.../dsl/jbang/core/commands/tui/ShellPanel.java | 28 ++++++++++++++++++++++
.../jbang/core/commands/tui/TuiBackendHelper.java | 4 ++--
3 files changed, 36 insertions(+), 2 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 663421572b55..452c15c3324b 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
@@ -59,6 +59,7 @@ import dev.tamboui.tui.event.Event;
import dev.tamboui.tui.event.KeyCode;
import dev.tamboui.tui.event.KeyEvent;
import dev.tamboui.tui.event.KeyModifiers;
+import dev.tamboui.tui.event.MouseEvent;
import dev.tamboui.tui.event.PasteEvent;
import dev.tamboui.tui.event.TickEvent;
import dev.tamboui.widgets.Clear;
@@ -408,6 +409,11 @@ public class CamelMonitor extends CamelCommand {
return true;
}
}
+ if (event instanceof MouseEvent me) {
+ if (shellPanel.isOpen() && shellPanel.handleMouseEvent(me)) {
+ return true;
+ }
+ }
if (event instanceof PasteEvent pe) {
return handlePasteEvent(pe);
}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
index 6593620512e8..3de73a8aa7e7 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java
@@ -35,6 +35,8 @@ import dev.tamboui.text.Span;
import dev.tamboui.text.Text;
import dev.tamboui.tui.event.KeyCode;
import dev.tamboui.tui.event.KeyEvent;
+import dev.tamboui.tui.event.MouseEvent;
+import dev.tamboui.tui.event.MouseEventKind;
import dev.tamboui.widgets.block.Block;
import dev.tamboui.widgets.block.BorderType;
import dev.tamboui.widgets.block.Title;
@@ -71,6 +73,7 @@ import org.jline.utils.AttributedStyle;
class ShellPanel {
private static final int[] SPLIT_PERCENTS = { 25, 50, 75 };
+ private static final int MOUSE_SCROLL_LINES = 3;
private boolean visible;
private int splitIndex = 1; // default 50%
@@ -84,6 +87,7 @@ class ShellPanel {
private int lastHeight;
private int scrollOffset;
private int lastHistorySize;
+ private Rect lastArea;
private volatile boolean shellExited;
void setContext(MonitorContext ctx) {
@@ -160,6 +164,28 @@ class ShellPanel {
return true;
}
+ boolean handleMouseEvent(MouseEvent me) {
+ if (!visible || lastArea == null) {
+ return false;
+ }
+ int mx = me.x();
+ int my = me.y();
+ if (mx < lastArea.x() || mx >= lastArea.x() + lastArea.width()
+ || my < lastArea.y() || my >= lastArea.y() +
lastArea.height()) {
+ return false;
+ }
+ if (me.kind() == MouseEventKind.SCROLL_UP) {
+ int histSize = screenTerminal != null ?
getHistorySize(screenTerminal) : 0;
+ scrollOffset = Math.min(scrollOffset + MOUSE_SCROLL_LINES,
histSize);
+ return true;
+ }
+ if (me.kind() == MouseEventKind.SCROLL_DOWN) {
+ scrollOffset = Math.max(0, scrollOffset - MOUSE_SCROLL_LINES);
+ return true;
+ }
+ return false;
+ }
+
void render(Frame frame, Rect area) {
if (!visible) {
return;
@@ -170,6 +196,8 @@ class ShellPanel {
return;
}
+ lastArea = area;
+
// Render border matching other tabs
Block block = Block.builder()
.borderType(BorderType.ROUNDED)
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
index 87c2c641561a..b8f38e7a358f 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiBackendHelper.java
@@ -35,10 +35,10 @@ final class TuiBackendHelper {
if (activeTerminal != null) {
Backend backend = createBackendForTerminal(activeTerminal);
if (backend != null) {
- return
TuiRunner.create(TuiConfig.builder().backend(backend).build());
+ return
TuiRunner.create(TuiConfig.builder().backend(backend).mouseCapture(true).build());
}
}
- return TuiRunner.create();
+ return
TuiRunner.create(TuiConfig.builder().mouseCapture(true).build());
}
private static Backend createBackendForTerminal(Terminal terminal) {