From 1249242c8914f4a2f2c01b6a5f088a5402691795 Mon Sep 17 00:00:00 2001 From: ericek111 Date: Thu, 13 Aug 2026 15:28:20 +0000 Subject: [PATCH] Switch server tabs with the scroll wheel Wheel events on the tab strip step through the open connections, clamped at the ends. The content area is excluded so the tree and chat keep their own scrolling. Co-Authored-By: Claude Opus 5 --- .../java/com/ts3client/ui/ServerTabPane.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java b/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java index 9567c71..9fa799b 100644 --- a/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java +++ b/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java @@ -7,11 +7,13 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; import java.util.ArrayList; import java.util.List; @@ -48,6 +50,24 @@ final class ServerTabPane extends JPanel { int i = tabbed.getSelectedIndex(); if (i >= 0 && i < tabs.size()) listener.selectTab(tabs.get(i)); }); + tabbed.addMouseWheelListener(this::onWheel); + } + + /** + * Scrolling over the tab strip steps through the connections. The content + * area keeps its own scrolling, so only wheel events on the strip itself + * (and on the tab labels, which forward theirs) change tabs. + */ + private void onWheel(MouseWheelEvent e) { + if (!tabbedMode) return; + Component content = tabbed.getSelectedComponent(); + if (content != null && content.getBounds().contains(e.getPoint())) return; + + int steps = e.getWheelRotation(); + if (steps == 0) return; + int target = Math.max(0, Math.min(tabs.size() - 1, tabbed.getSelectedIndex() + steps)); + if (target != tabbed.getSelectedIndex()) listener.selectTab(tabs.get(target)); + e.consume(); } void addTab(ServerTab tab) {