aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/impl/client/MouseInputHandler.java8
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WWidget.java22
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java1
3 files changed, 30 insertions, 1 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/impl/client/MouseInputHandler.java b/src/main/java/io/github/cottonmc/cotton/gui/impl/client/MouseInputHandler.java
index 156f967..02b8d9a 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/impl/client/MouseInputHandler.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/impl/client/MouseInputHandler.java
@@ -94,12 +94,18 @@ public final class MouseInputHandler<S extends Screen & CottonScreenImpl> {
public void onMouseMove(int containerX, int containerY) {
WWidget hit = screen.getDescription().getRootPanel().hit(containerX, containerY);
- hovered.set(hit);
runTree(
hit,
widget -> widget.onMouseMove(containerX - widget.getAbsoluteX(), containerY - widget.getAbsoluteY())
);
+
+ @Nullable
+ WWidget hoveredWidget = runTree(
+ hit,
+ widget -> InputResult.of(widget.canHover() && widget.isWithinBounds(containerX - widget.getAbsoluteX(), containerY - widget.getAbsoluteY()))
+ );
+ hovered.set(hoveredWidget);
}
/**
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WWidget.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WWidget.java
index 417c01d..9106473 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WWidget.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WWidget.java
@@ -464,12 +464,33 @@ public class WWidget {
}
/**
+ * Tests whether this widget receives {@linkplain #hoveredProperty() mouse hovering status}.
+ *
+ * @return true if this widget receives hovering status, false otherwise
+ * @since 4.2.0
+ */
+ public boolean canHover() {
+ return true;
+ }
+
+ /**
* Returns whether the user is hovering over this widget.
* The result is an <i>observable property</i> that can be modified and listened to.
*
+ * <p>This property takes into account {@link #isWithinBounds(int, int)} to check
+ * if the cursor is within the bounds, as well as {@link #canHover()} to enable hovering at all.
+ *
+ * <p>Hovering is used by LibGui itself mostly for narration support.
+ * For rendering, it might be preferable that you check the mouse coordinates in
+ * {@link #paint(MatrixStack, int, int, int, int) paint()} directly.
+ * That lets you react to different parts of the widget being hovered over.
+ *
* @experimental
* @return the {@code hovered} property
* @since 4.2.0
+ * @see #canHover()
+ * @see #isHovered()
+ * @see #setHovered(boolean)
*/
@ApiStatus.Experimental
public ObservableProperty<Boolean> hoveredProperty() {
@@ -491,6 +512,7 @@ public class WWidget {
/**
* Sets the {@link #hoveredProperty() hovered} property.
+ * This is equivalent to calling <code>{@link #hoveredProperty()}.set(<i>hovered</i>)</code>.
*
* @experimental
* @param hovered the new value; true if hovered, false otherwise
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
index 5f375c2..a287c43 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/ObservableProperty.java
@@ -20,6 +20,7 @@ import java.util.Objects;
* @since 4.2.0
*/
@ApiStatus.Experimental
+// TODO: Add filters
public final class ObservableProperty<T> implements ObservableView<T> {
private static final String DEFAULT_NAME = "<unnamed>";
private boolean hasValue;