package eu.svjatoslav.sixth.e3d.gui;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusTracker;
import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.UserInputTracker;
+import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection;
import javax.swing.*;
import java.awt.*;
import java.util.Timer;
public class ViewPanel extends JPanel implements ComponentListener {
+ private final UserInputTracker userInputTracker = new UserInputTracker(this);
+
+ private final KeyboardFocusTracker keyboardFocusTracker = new KeyboardFocusTracker(
+ this);
+
+ private final Avatar avatar = new Avatar();
+
+ private final ShapeCollection rootShapeCollection = new ShapeCollection();
+
+
+ public Avatar getAvatar() {
+ return avatar;
+ }
+
+ public KeyboardFocusTracker getKeyboardFocusTracker() {
+ return keyboardFocusTracker;
+ }
+
+ public ShapeCollection getRootShapeCollection() {
+ return rootShapeCollection;
+ }
+
+ public UserInputTracker getUserInputTracker() {
+ return userInputTracker;
+ }
private static final long serialVersionUID = 1683277888885045387L;
private final List<ViewRenderListener> viewRenderListeners = new ArrayList<>();
- private final ViewContext context = new ViewContext(this);
/**
* Last time this view was updated.
*/
private Timer canvasUpdateTimer;
private ViewUpdateTimerTask canvasUpdateTimerTask;
private RenderingContext renderingContext = null;
+
+ /**
+ * UI component that mouse is currently hovering over.
+ */
private MouseInteractionController currentMouseOverComponent;
+
/**
- * Currently target FPS for this view. It might change at runtime.
+ * Currently target FPS for this view. It can be changed at runtime. Also when nothing
+ * changes in the view, then frames are not really repainted.
*/
- private int targetFramerate = 30;
- private boolean repaintDuringNextViewUpdate = true;
+ private int targetFPS = 30;
- public ViewPanel() {
- viewRenderListeners.add(context.getAvatar());
+ /**
+ * Set to true if it is known than next frame reeds to be painted. Flag is cleared
+ * immediately after frame got updated.
+ */
+ private boolean viewRepaintNeeded = true;
- // initialize input tracker
- context.getUserInputTracker().bind(this);
- viewRenderListeners.add(context.getUserInputTracker());
+ public ViewPanel() {
+ viewRenderListeners.add(avatar);
+ viewRenderListeners.add(userInputTracker);
initializePanelLayout();
- setFrameRate(targetFramerate);
+ setFrameRate(targetFPS);
addComponentListener(this);
}
@Override
public void componentResized(final ComponentEvent e) {
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
}
@Override
public void componentShown(final ComponentEvent e) {
- repaintDuringNextViewUpdate = true;
- }
-
- public ViewContext getContext() {
- return context;
+ viewRepaintNeeded = true;
}
@Override
if (currentMouseOverComponent == null) {
currentMouseOverComponent = renderingContext.clickedItem;
currentMouseOverComponent.mouseEntered();
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
} else if (currentMouseOverComponent != renderingContext.clickedItem) {
currentMouseOverComponent.mouseExited();
currentMouseOverComponent = renderingContext.clickedItem;
currentMouseOverComponent.mouseEntered();
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
}
} else {
// mouse click
renderingContext.clickedItem.mouseClicked();
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
}
} else if (currentMouseOverComponent != null) {
currentMouseOverComponent.mouseExited();
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
currentMouseOverComponent = null;
}
}
}
// paint root geometry collection to the offscreen render buffer
- context.getRootShapeCollection().paint(context, renderingContext);
+ rootShapeCollection.paint(this, renderingContext);
// draw rendered offscreen image to visible screen
final Graphics graphics = getGraphics();
* repainted on first opportunity.
*/
public void repaintDuringNextViewUpdate() {
- repaintDuringNextViewUpdate = true;
+ viewRepaintNeeded = true;
}
public void setFrameRate(final int frameRate) {
canvasUpdateTimer = null;
}
- targetFramerate = frameRate;
+ targetFPS = frameRate;
if (frameRate > 0) {
canvasUpdateTimer = new Timer();
boolean reRenderFrame = false;
for (final ViewRenderListener listener : viewRenderListeners)
- if (listener.beforeRender(context,
- millisecondsPassedSinceLastUpdate))
+ if (listener.beforeRender(this, millisecondsPassedSinceLastUpdate))
reRenderFrame = true;
// abort rendering if window size is invalid
if ((getWidth() <= 0) || (getHeight() <= 0))
return;
- if (repaintDuringNextViewUpdate) {
- repaintDuringNextViewUpdate = false;
+ if (viewRepaintNeeded) {
+ viewRepaintNeeded = false;
reRenderFrame = true;
}