From 993c1e793b35bd6a356f8a5b96c551aa954d8116 Mon Sep 17 00:00:00 2001
From: Juuxel <6596629+Juuxel@users.noreply.github.com>
Date: Sun, 19 Jan 2020 21:05:43 +0200
Subject: Add dragging deltas into WWidget.onMouseDrag, add WWidget.onMouseMove

Closes #30. Closes #31.
---
 .../cotton/gui/CottonCraftingController.java       |  4 ++--
 .../cotton/gui/client/CottonClientScreen.java      | 24 +++++++++++++++-----
 .../cotton/gui/client/CottonInventoryScreen.java   | 20 +++++++++++++----
 .../github/cottonmc/cotton/gui/widget/WWidget.java | 26 ++++++++++++++++++++++
 4 files changed, 62 insertions(+), 12 deletions(-)

diff --git a/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java b/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java
index 2b9edc2..f3a23c6 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java
@@ -287,8 +287,8 @@ public class CottonCraftingController extends CraftingContainer<Inventory> imple
 		return null;
 	}
 	
-	public void doMouseDrag(int x, int y, int button) {
-		if (rootPanel!=null) rootPanel.onMouseDrag(x, y, button);
+	public void doMouseDrag(int x, int y, int button, double deltaX, double deltaY) {
+		if (rootPanel!=null) rootPanel.onMouseDrag(x, y, button, deltaX, deltaY);
 	}
 	
 	public void doClick(int x, int y, int button) {
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/CottonClientScreen.java b/src/main/java/io/github/cottonmc/cotton/gui/client/CottonClientScreen.java
index d8a986f..be13275 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/client/CottonClientScreen.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/client/CottonClientScreen.java
@@ -151,19 +151,19 @@ public class CottonClientScreen extends Screen implements TextHoverRendererScree
 	}
 	
 	@Override
-	public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double unknown_1, double unknown_2) {
-		if (description.getRootPanel()==null) return super.mouseDragged(mouseX, mouseY, mouseButton, unknown_1, unknown_2);
-		boolean result = super.mouseDragged(mouseX, mouseY, mouseButton, unknown_1, unknown_2);
+	public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double deltaX, double deltaY) {
+		if (description.getRootPanel()==null) return super.mouseDragged(mouseX, mouseY, mouseButton, deltaX, deltaY);
+		boolean result = super.mouseDragged(mouseX, mouseY, mouseButton, deltaX, deltaY);
 		
 		int containerX = (int)mouseX-left;
 		int containerY = (int)mouseY-top;
 		
 		if (lastResponder!=null) {
-			lastResponder.onMouseDrag(containerX-lastResponder.getAbsoluteX(), containerY-lastResponder.getAbsoluteY(), mouseButton);
+			lastResponder.onMouseDrag(containerX-lastResponder.getAbsoluteX(), containerY-lastResponder.getAbsoluteY(), mouseButton, deltaX, deltaY);
 			return result;
 		} else {
 			if (containerX<0 || containerY<0 || containerX>=width || containerY>=height) return result;
-			description.getRootPanel().onMouseDrag(containerX, containerY, mouseButton);
+			description.getRootPanel().onMouseDrag(containerX, containerY, mouseButton, deltaX, deltaY);
 		}
 		return result;
 	}
@@ -180,7 +180,19 @@ public class CottonClientScreen extends Screen implements TextHoverRendererScree
 		child.onMouseScroll(containerX - child.getAbsoluteX(), containerY - child.getAbsoluteY(), amount);
 		return true;
 	}
-	
+
+	@Override
+	public void mouseMoved(double mouseX, double mouseY) {
+		if (description.getRootPanel()==null) return;
+
+		WPanel root = description.getRootPanel();
+		int containerX = (int)mouseX-left;
+		int containerY = (int)mouseX-top;
+
+		WWidget child = root.hit(containerX, containerY);
+		child.onMouseMove(containerX - child.getAbsoluteX(), containerY - child.getAbsoluteY());
+	}
+
 	@Override
 	public boolean charTyped(char ch, int keyCode) {
 		if (description.getFocus()==null) return false;
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/CottonInventoryScreen.java b/src/main/java/io/github/cottonmc/cotton/gui/client/CottonInventoryScreen.java
index 2813c0f..ed494dc 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/client/CottonInventoryScreen.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/client/CottonInventoryScreen.java
@@ -142,18 +142,18 @@ public class CottonInventoryScreen<T extends CottonCraftingController> extends A
 	}
 	
 	@Override
-	public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double unknown_1, double unknown_2) {
-		boolean result = super.mouseDragged(mouseX, mouseY, mouseButton, unknown_1, unknown_2);
+	public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double deltaX, double deltaY) {
+		boolean result = super.mouseDragged(mouseX, mouseY, mouseButton, deltaX, deltaY);
 		
 		int containerX = (int)mouseX-x;
 		int containerY = (int)mouseY-y;
 		
 		if (lastResponder!=null) {
-			lastResponder.onMouseDrag(containerX-lastResponder.getAbsoluteX(), containerY-lastResponder.getAbsoluteY(), mouseButton);
+			lastResponder.onMouseDrag(containerX-lastResponder.getAbsoluteX(), containerY-lastResponder.getAbsoluteY(), mouseButton, deltaX, deltaY);
 			return result;
 		} else {
 			if (containerX<0 || containerY<0 || containerX>=width || containerY>=height) return result;
-			description.doMouseDrag(containerX, containerY, mouseButton);
+			description.doMouseDrag(containerX, containerY, mouseButton, deltaX, deltaY);
 		}
 		return result;
 	}
@@ -170,6 +170,18 @@ public class CottonInventoryScreen<T extends CottonCraftingController> extends A
 		child.onMouseScroll(containerX - child.getAbsoluteX(), containerY - child.getAbsoluteY(), amount);
 		return true;
 	}
+
+	@Override
+	public void mouseMoved(double mouseX, double mouseY) {
+		if (description.getRootPanel()==null) return;
+
+		WPanel root = description.getRootPanel();
+		int containerX = (int)mouseX-x;
+		int containerY = (int)mouseX-y;
+
+		WWidget child = root.hit(containerX, containerY);
+		child.onMouseMove(containerX - child.getAbsoluteX(), containerY - child.getAbsoluteY());
+	}
 	
 	@Override
 	protected void drawBackground(float partialTicks, int mouseX, int mouseY) {} //This is just an AbstractContainerScreen thing; most Screens don't work this way.
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 e4c5746..062c560 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
@@ -77,6 +77,22 @@ public class WWidget {
 		return this;
 	}
 	
+	/**
+	 * Notifies this widget that the mouse has been moved while pressed and inside its bounds.
+	 *
+	 * @param x The X coordinate of the event, in widget-space (0 is the left edge of this widget)
+	 * @param y The Y coordinate of the event, in widget-space (0 is the top edge of this widget)
+	 * @param button The mouse button that was used. Button numbering is consistent with LWJGL Mouse (0=left, 1=right, 2=mousewheel click)
+	 * @param deltaX The amount of dragging on the X axis
+	 * @param deltaY The amount of dragging on the Y axis
+	 *
+	 * @since 1.5.0
+	 * @implSpec The default implementation calls {@link #onMouseDrag(int, int, int)}.
+	 */
+	public void onMouseDrag(int x, int y, int button, double deltaX, double deltaY) {
+		onMouseDrag(x, y, button);
+	}
+
 	/**
 	 * Notifies this widget that the mouse has been moved while pressed and inside its bounds
 	 * @param x The X coordinate of the event, in widget-space (0 is the left edge of this widget)
@@ -113,6 +129,16 @@ public class WWidget {
 	 */
 	public void onMouseScroll(int x, int y, double amount) {
 	}
+
+	/**
+	 * Notifies this widget that the mouse has been moved while inside its bounds.
+	 *
+	 * @param x The X coordinate of the event, in widget-space (0 is the left edge of this widget)
+	 * @param y The Y coordinate of the event, in widget-space (0 is the top edge of this widget)
+	 * @since 1.5.0
+	 */
+	public void onMouseMove(int x, int y) {
+	}
 	
 	/**
 	 * Notifies this widget that a character has been typed. This method is subject to key repeat,
-- 
cgit