/*
* Window manager for visualizer. Creates 3D canvas and manages data.
*
* Created on Jan 29, 2013
*/
/*
Copywrite 2013-2017 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.universalgcodesender.visualizer;
import com.jogamp.opengl.util.FPSAnimator;
import com.willwinder.universalgcodesender.i18n.Localization;
import com.willwinder.universalgcodesender.listeners.ControllerListener;
import com.willwinder.universalgcodesender.listeners.ControllerStatus;
import com.willwinder.universalgcodesender.listeners.UGSEventListener;
import com.willwinder.universalgcodesender.model.BackendAPI;
import com.willwinder.universalgcodesender.model.Position;
import com.willwinder.universalgcodesender.model.UGSEvent;
import com.willwinder.universalgcodesender.types.GcodeCommand;
import com.willwinder.universalgcodesender.types.WindowSettings;
import com.willwinder.universalgcodesender.uielements.components.LengthLimitedDocument;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
*
* @author wwinder
*/
public class VisualizerPanel extends JPanel implements ControllerListener, UGSEventListener {
private static String TITLE = Localization.getString("visualizer.title"); // window's title
private static final int FPS = 20; // animator's target frames per second
// OpenGL Control
private final FPSAnimator animator;
private final VisualizerCanvas canvas;
private final BackendAPI backend;
public VisualizerPanel() {
this(null);
}
public VisualizerPanel(BackendAPI backend) {
super(new BorderLayout());
this.backend = backend;
if (backend != null) {
backend.addControllerListener(this);
backend.addUGSEventListener(this);
}
// Create the OpenGL rendering canvas
this.canvas = new VisualizerCanvas();
// Create a animator that drives canvas' display() at the specified FPS.
this.animator = new FPSAnimator(canvas, FPS, true);
animator.start(); // start the animation loop
initComponents();
}
private void initComponents() {
add(canvas);
}
public void setGcodeFile(String file) {
canvas.setGcodeFile(file);
}
public void setProcessedGcodeFile(String file) {
canvas.setProcessedGcodeFile(file);
}
@Override
public void statusStringListener(ControllerStatus status) {
// Give coordinates to canvas.
this.canvas.setMachineCoordinate(status.getMachineCoord());
this.canvas.setWorkCoordinate(status.getWorkCoord());
}
@Override
public void controlStateChange(UGSEvent.ControlState state) {
}
@Override
public void fileStreamComplete(String filename, boolean success) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void commandSkipped(GcodeCommand command) {
// TODO: When canned cycles are handled in the controller I'll need to
// update the visualizer to use commands sniffed from this queue.
}
@Override
public void commandSent(GcodeCommand command) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void commandComplete(GcodeCommand command) {
canvas.setCurrentCommandNumber(command.getCommandNumber());
}
@Override
public void commandComment(String comment) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void probeCoordinates(Position p) {
}
@Override
public void messageForConsole(MessageType type, String msg) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void postProcessData(int numRows) {
// Visualizer doesn't care.
}
@Override
public void UGSEvent(UGSEvent evt) {
if (evt.isFileChangeEvent()) {
switch(evt.getFileState()) {
case FILE_LOADING:
setGcodeFile(evt.getFile());
break;
case FILE_LOADED:
setProcessedGcodeFile(evt.getFile());
break;
default:
break;
}
}
}
}