Fixed mouse hovering detection
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / RenderingContext.java
index 2603c11..31cbb13 100644 (file)
@@ -31,14 +31,41 @@ public class RenderingContext {
     public int frameNumber = 0;
 
     /**
-     * Mouse click. During rendering we can detect which item user clicked on.
+     * UI component that mouse is currently hovering over.
      */
-    public MouseEvent mouseEvent;
+    private MouseInteractionController currentMouseOverComponent;
+
+    public void prepareForNewFrameRendering(){
+        mouseEvent = null;
+        objectUnderMouse = null;
+    }
+
+    /**
+     * Mouse click event that needs to be processed.
+     */
+    private  MouseEvent mouseEvent;
+
+    public void setMouseEvent(MouseEvent mouseEvent) {
+        this.mouseEvent = mouseEvent;
+    }
+
+    public MouseEvent getMouseEvent() {
+        return mouseEvent;
+    }
 
     /**
      * Item that user clicked on.
      */
-    public MouseInteractionController objectUnderMouse;
+    private MouseInteractionController objectUnderMouse;
+
+    /**
+     * Called when given object was detected under mouse cursor, while processing {@link #mouseEvent}.
+     * Because objects are rendered back to front. The last method caller will set the top-most object, if
+     * there are multiple objects under mouse cursor.
+     */
+    public void setObjectUnderMouse(MouseInteractionController objectUnderMouse) {
+        this.objectUnderMouse = objectUnderMouse;
+    }
 
     public RenderingContext(final int width, final int height) {
         this.width = width;
@@ -60,4 +87,31 @@ public class RenderingContext {
         graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     }
 
+    /**
+     * @return <code>true</code> if view repaint is needed.
+     */
+    public boolean handleDetectedComponentMouseEvents() {
+        if (objectUnderMouse != null) {
+            if (mouseEvent.button == 0) {
+                // mouse over
+                if (currentMouseOverComponent == null) {
+                    currentMouseOverComponent = objectUnderMouse;
+                    return currentMouseOverComponent.mouseEntered();
+                } else if (currentMouseOverComponent != objectUnderMouse) {
+                    boolean viewRepaintNeeded = currentMouseOverComponent.mouseExited();
+                    currentMouseOverComponent = objectUnderMouse;
+                    return viewRepaintNeeded | currentMouseOverComponent.mouseEntered();
+                }
+            } else {
+                // mouse click
+                return objectUnderMouse.mouseClicked();
+            }
+        } else if (currentMouseOverComponent != null) {
+            boolean viewRepaintNeeded = currentMouseOverComponent.mouseExited();
+            currentMouseOverComponent = null;
+            return viewRepaintNeeded;
+        }
+        return false;
+    }
+
 }