feat(mouse-tracking): add last mouse position tracking to text components and update tooltip position

This commit is contained in:
extio-de
2026-04-01 22:59:40 +02:00
parent e8584f7372
commit 694f47600d
5 changed files with 47 additions and 1 deletions

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.extio</groupId>
<artifactId>game-engine</artifactId>
<version>1.0.4</version>
<version>1.0.5</version>
<properties>
<java.version>25</java.version>

View File

@@ -24,6 +24,7 @@ import java.util.function.Consumer;
import de.extio.game_engine.renderer.ThemeManager;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
import de.extio.game_engine.renderer.model.Theme;
import de.extio.game_engine.spatial2.model.CoordI2;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
@SuppressWarnings("serial")
@@ -73,6 +74,8 @@ public class CustomMultiLineTextArea extends Component {
private boolean scrollbarDragging = false;
private CoordI2 lastMousePosition;
private int scrollbarDragStartY = 0;
private int scrollbarDragStartOffset = 0;
@@ -151,6 +154,10 @@ public class CustomMultiLineTextArea extends Component {
this.dirty = dirty;
}
public CoordI2 getLastMousePosition() {
return this.lastMousePosition;
}
public CustomMultiLineTextArea(final ThemeManager themeManager, final Consumer<String> onTextChanged) {
this.themeManager = themeManager;
this.onTextChanged = onTextChanged;
@@ -296,8 +303,15 @@ public class CustomMultiLineTextArea extends Component {
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(final MouseEvent e) {
CustomMultiLineTextArea.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
e.consume();
}
@Override
public void mousePressed(final MouseEvent e) {
CustomMultiLineTextArea.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
CustomMultiLineTextArea.this.requestFocus();
if (!CustomMultiLineTextArea.this.enabled) {
e.consume();
@@ -337,17 +351,25 @@ public class CustomMultiLineTextArea extends Component {
CustomMultiLineTextArea.this.scrollbarDragging = false;
e.consume();
}
@Override
public void mouseExited(final MouseEvent e) {
CustomMultiLineTextArea.this.lastMousePosition = null;
e.consume();
}
});
this.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(final MouseEvent e) {
CustomMultiLineTextArea.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
e.consume();
}
@Override
public void mouseDragged(final MouseEvent e) {
CustomMultiLineTextArea.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
if (!CustomMultiLineTextArea.this.enabled) {
e.consume();
return;

View File

@@ -20,6 +20,7 @@ import java.util.function.Consumer;
import de.extio.game_engine.renderer.ThemeManager;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
import de.extio.game_engine.renderer.model.Theme;
import de.extio.game_engine.spatial2.model.CoordI2;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
@SuppressWarnings("serial")
@@ -55,6 +56,8 @@ public class CustomSingleLineTextField extends Component {
private boolean caretVisible = true;
private CoordI2 lastMousePosition;
private int cachedRawFontHeight = 0;
private final ThemeManager themeManager;
@@ -115,6 +118,10 @@ public class CustomSingleLineTextField extends Component {
this.dirty = dirty;
}
public CoordI2 getLastMousePosition() {
return this.lastMousePosition;
}
public CustomSingleLineTextField(final ThemeManager themeManager, final Consumer<String> onTextChanged, final Runnable onSubmit) {
this.themeManager = themeManager;
this.onTextChanged = onTextChanged;
@@ -255,8 +262,15 @@ public class CustomSingleLineTextField extends Component {
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(final MouseEvent e) {
CustomSingleLineTextField.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
e.consume();
}
@Override
public void mousePressed(final MouseEvent e) {
CustomSingleLineTextField.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
CustomSingleLineTextField.this.requestFocus();
if (!CustomSingleLineTextField.this.enabled) {
e.consume();
@@ -285,17 +299,25 @@ public class CustomSingleLineTextField extends Component {
public void mouseReleased(final MouseEvent e) {
e.consume();
}
@Override
public void mouseExited(final MouseEvent e) {
CustomSingleLineTextField.this.lastMousePosition = null;
e.consume();
}
});
this.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(final MouseEvent e) {
CustomSingleLineTextField.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
e.consume();
}
@Override
public void mouseDragged(final MouseEvent e) {
CustomSingleLineTextField.this.lastMousePosition = ImmutableCoordI2.create(e.getX(), e.getY());
if (!CustomSingleLineTextField.this.enabled) {
e.consume();
return;

View File

@@ -123,6 +123,7 @@ public class G2DMultiLineTextAreaControlImpl extends G2DBaseControlImpl implemen
this.updateAllComponentZOrder();
}
this.tooltipMousePosition = this.textArea.getLastMousePosition();
this.textArea.paint(this.bufferedImageGraphics);
super.render();

View File

@@ -118,6 +118,7 @@ public class G2DSingleLineTextfieldControlImpl extends G2DBaseControlImpl implem
this.updateAllComponentZOrder();
}
this.tooltipMousePosition = this.textField.getLastMousePosition();
this.textField.paint(this.bufferedImageGraphics);
super.render();