/*
- * Sixth 3D engine. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 3 of the GNU Lesser General Public License
- * or later as published by the Free Software Foundation.
- *
+ * Sixth 3D engine. Author: Svjatoslav Agejenko.
+ * This project is released under Creative Commons Zero (CC0) license.
*/
-
package eu.svjatoslav.sixth.e3d.gui;
-import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseClick;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseEvent;
import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
import java.awt.*;
public int frameNumber = 0;
/**
- * Used to signal that actual rendering should be performed. It is useful to
- * skip rendering when we only want to detect mouse clicks intersections
- * without actually updating rendered frame.
+ * UI component that mouse is currently hovering over.
*/
- public boolean doRender = true; // TODO: make use of the variable
+ private MouseInteractionController currentMouseOverComponent;
+
+ public void prepareForNewFrameRendering(){
+ mouseEvent = null;
+ objectUnderMouse = null;
+ }
/**
- * Mouse click. During rendering we can detect which item user clicked on.
+ * Mouse click event that needs to be processed.
*/
- public MouseClick mouseClick;
+ private MouseEvent mouseEvent;
+
+ public void setMouseEvent(MouseEvent mouseEvent) {
+ this.mouseEvent = mouseEvent;
+ }
+
+ public MouseEvent getMouseEvent() {
+ return mouseEvent;
+ }
/**
* Item that user clicked on.
*/
- public MouseInteractionController clickedItem;
+ 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;
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;
+ }
+
}