Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
package com.marginallyclever.makelangelo.preview;
import com.marginallyclever.makelangelo.ActionShowPenUpMoves;
import com.marginallyclever.makelangelo.MakeleangeloRangeSlider;
import com.marginallyclever.makelangelo.Translator;
import com.marginallyclever.makelangelo.actions.ZoomToFitMachineAction;
import com.marginallyclever.makelangelo.applicationsettings.GFXPreferences;
import com.marginallyclever.makelangelo.editorcontext.EditorContext;
import com.marginallyclever.makelangelo.editorcontext.EditorContextListener;
import com.marginallyclever.makelangelo.makeart.io.LoadFilePanel;
import com.marginallyclever.makelangelo.plotter.plotterrenderer.PlotterRenderer;
import com.marginallyclever.makelangelo.plotter.plotterrenderer.PlotterRendererFactory;
import com.marginallyclever.makelangelo.plotter.plottersettings.PlotterSettings;
import com.marginallyclever.makelangelo.plotter.plottersettings.PlotterSettingsManager;
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.makelangelo.turtle.turtlerenderer.MarlinSimulationVisualizer;
import com.marginallyclever.makelangelo.turtle.turtlerenderer.TurtleRenderFacade;
import com.marginallyclever.makelangelo.turtle.turtlerenderer.TurtleRenderFactory;
import com.marginallyclever.makelangelo.turtle.turtlerenderer.TurtleRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.Objects;
public class PreviewPanel extends JPanel implements EditorContextListener {
private static final Logger logger = LoggerFactory.getLogger(PreviewPanel.class);
private EditorContext editorContext;
private final RenderPanel renderPanel = new RenderPanel();
private final MakeleangeloRangeSlider rangeSlider = new MakeleangeloRangeSlider();
private final Camera camera = new Camera();
private final TurtleRenderFacade myTurtleRenderer = new TurtleRenderFacade();
private PlotterRenderer myPlotterRenderer;
private final PlotterSettingsManager plotterSettingsManager = new PlotterSettingsManager();
private boolean first = true;
public PreviewPanel() {
this(new EditorContext());
}
public PreviewPanel(EditorContext editorContext) {
super(new BorderLayout());
setOpaque(true);
this.editorContext = editorContext;
camera.addPropertyChangeListener((e)->{
if(!first) return;
// zoom to fit
new ZoomToFitMachineAction("", getCamera(), editorContext.getPlotter()).actionPerformed(null);
first=false;
});
renderPanel.setCamera(camera);
renderPanel.addRenderListener(editorContext.getPaper());
renderPanel.addRenderListener(editorContext.getPlotter());
renderPanel.addRenderListener(myTurtleRenderer);
addPlotterRendererToPreviewPanel();
add(renderPanel, BorderLayout.CENTER);
add(rangeSlider, BorderLayout.SOUTH);
JToolBar toolBar = createToolBar();
add(toolBar, BorderLayout.NORTH);
editorContext.getPlotter().setSettings(plotterSettingsManager.getLastSelectedProfile());
editorContext.getPaper().loadConfig();
rangeSlider.addChangeListener(e -> {
myTurtleRenderer.setFirst(rangeSlider.getBottom());
myTurtleRenderer.setLast(rangeSlider.getTop());
});
onPlotterSettingsUpdate(editorContext.getPlotter().getSettings());
}
private JToolBar createToolBar() {
var bar = new JToolBar();
var buttonZoomOut = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
camera.zoom(1);
}
};
buttonZoomOut.putValue(Action.SHORT_DESCRIPTION, Translator.get("MenuView.zoomOut"));
buttonZoomOut.putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, InputEvent.CTRL_DOWN_MASK));
buttonZoomOut.putValue(Action.SMALL_ICON,new ImageIcon(Objects.requireNonNull(getClass().getResource("/com/marginallyclever/makelangelo/actions/icons8-zoom-out-16.png"))));
bar.add(buttonZoomOut);
var buttonZoomIn = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
camera.zoom(-1);
}
};
buttonZoomIn.putValue(Action.SHORT_DESCRIPTION,Translator.get("MenuView.zoomIn"));
buttonZoomIn.putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, InputEvent.CTRL_DOWN_MASK));
buttonZoomIn.putValue(Action.SMALL_ICON,new ImageIcon(Objects.requireNonNull(getClass().getResource("/com/marginallyclever/makelangelo/actions/icons8-zoom-in-16.png"))));
bar.add(buttonZoomIn);
var buttonZoomToFit = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
camera.zoomToFit(editorContext.getPaper().getPaperWidth(),editorContext.getPaper().getPaperHeight());
}
};
buttonZoomToFit.putValue(Action.SHORT_DESCRIPTION,Translator.get("MenuView.zoomFit"));
buttonZoomToFit.putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_0, InputEvent.CTRL_DOWN_MASK));
buttonZoomToFit.putValue(Action.SMALL_ICON,new ImageIcon(Objects.requireNonNull(getClass().getResource("/com/marginallyclever/makelangelo/actions/icons8-zoom-to-fit-16.png"))));
bar.add(buttonZoomToFit);
var checkboxShowPenUpMoves = new JToggleButton(new ActionShowPenUpMoves());
checkboxShowPenUpMoves.setSelected(GFXPreferences.getShowPenUp());
GFXPreferences.addListener((e)->checkboxShowPenUpMoves.setSelected ((boolean)e.getNewValue()));
bar.add(checkboxShowPenUpMoves);
checkboxShowPenUpMoves.setName("");
return bar;
}
private void updatePlotterRenderer() {
var style = editorContext.getPlotter().getSettings().getString(PlotterSettings.STYLE);
try {
myPlotterRenderer = PlotterRendererFactory.valueOf(style).getPlotterRenderer();
} catch (Exception e) {
logger.error("Failed to find plotter style {}", style);
myPlotterRenderer = PlotterRendererFactory.MAKELANGELO_5.getPlotterRenderer();
}
}
public void onPlotterSettingsUpdate(PlotterSettings settings) {
editorContext.getPlotter().setSettings(settings);
TurtleRenderer turtleRenderer = TurtleRenderFactory.getTurtleRenderer(TurtleRenderFactory.MARLIN_SIMULATION);
if(turtleRenderer instanceof MarlinSimulationVisualizer msv) {
msv.setSettings(settings);
msv.reset();
}
myTurtleRenderer.setUpColor(settings.getColor(PlotterSettings.PEN_UP_COLOR));
myTurtleRenderer.setPenDiameter(settings.getDouble(PlotterSettings.DIAMETER));
myTurtleRenderer.setShowTravel(GFXPreferences.getShowPenUp());
updatePlotterRenderer();
if(renderPanel != null) renderPanel.repaint();
}
private void addPlotterRendererToPreviewPanel() {
renderPanel.addRenderListener((g)->{
if(myPlotterRenderer!=null) {
myTurtleRenderer.setShowTravel(GFXPreferences.getShowPenUp());
myPlotterRenderer.render(g, editorContext.getPlotter());
}
});
}
public void stop() {
renderPanel.removePreviewListener(editorContext.getPlotter());
editorContext.getPlotter().getSettings().save();
plotterSettingsManager.setLastSelectedProfile(editorContext.getPlotter().getSettings().getUID());
}
public TurtleRenderer getTurtleRenderer() {
return myTurtleRenderer.getRenderer();
}
public Camera getCamera() {
return camera;
}
public void setTurtleRenderer(TurtleRenderer renderer) {
myTurtleRenderer.setRenderer(renderer);
}
public PlotterSettingsManager getPlotterSettingsManager() {
return plotterSettingsManager;
}
@Override
public void turtleChanged(Turtle subject) {
myTurtleRenderer.setTurtle(subject);
rangeSlider.setLimits(0,subject.countPoints());
if(renderPanel != null) renderPanel.repaint();
}
public int getRangeBottom() {
return rangeSlider.getValue();
}
public int getRangeTop() {
return rangeSlider.getUpperValue();
}
public void addListener(LoadFilePanel loader) {
renderPanel.addRenderListener(loader);
}
public void removeListener(LoadFilePanel loader) {
renderPanel.removePreviewListener(loader);
}
}
f99985dc8This file is pinned to the selected release. Download the original to open it in your design tool.