Route change events through OpenRocketDocument so Photo Studio can

receive notifications of changes to the rocket.
Dispose PhotoStudio windows on close, and add a close event to remove
event handlers, to avoid leaking resources.
This commit is contained in:
Miacid 2021-06-26 20:59:36 -07:00
parent dcc3c43bc3
commit 51c1c78988
3 changed files with 44 additions and 14 deletions

View File

@ -594,6 +594,7 @@ public class OpenRocketDocument implements ComponentChangeListener {
} }
fireUndoRedoChangeEvent(); fireUndoRedoChangeEvent();
fireDocumentChangeEvent(new DocumentChangeEvent(e.getSource()));
} }
/** /**

View File

@ -9,6 +9,8 @@ import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -72,6 +74,17 @@ public class PhotoFrame extends JFrame {
setJMenuBar(getMenu(app)); setJMenuBar(getMenu(app));
setContentPane(photoPanel); setContentPane(photoPanel);
if (!app)
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
closeAction();
}
});
GUIUtil.rememberWindowSize(this); GUIUtil.rememberWindowSize(this);
this.setLocationByPlatform(true); this.setLocationByPlatform(true);
GUIUtil.rememberWindowPosition(this); GUIUtil.rememberWindowPosition(this);
@ -305,6 +318,11 @@ public class PhotoFrame extends JFrame {
} }
private boolean closeAction() {
photoPanel.clearDoc();
return true;
}
public static void main(String args[]) throws Exception { public static void main(String args[]) throws Exception {
LoggingSystemSetup.setupLoggingAppender(); LoggingSystemSetup.setupLoggingAppender();

View File

@ -75,6 +75,11 @@ public class PhotoPanel extends JPanel implements GLEventListener {
private List<ImageCallback> imageCallbacks = new java.util.Vector<PhotoPanel.ImageCallback>(); private List<ImageCallback> imageCallbacks = new java.util.Vector<PhotoPanel.ImageCallback>();
private RocketRenderer rr;
private PhotoSettings p;
private OpenRocketDocument document;
private DocumentChangeListener changeListener;
interface ImageCallback { interface ImageCallback {
public void performAction(BufferedImage i); public void performAction(BufferedImage i);
} }
@ -84,32 +89,38 @@ public class PhotoPanel extends JPanel implements GLEventListener {
repaint(); repaint();
} }
private RocketRenderer rr;
private PhotoSettings p;
void setDoc(final OpenRocketDocument doc) { void setDoc(final OpenRocketDocument doc) {
document = doc;
cachedBounds = null;
this.configuration = doc.getSelectedConfiguration();
changeListener = new DocumentChangeListener() {
@Override
public void documentChanged(DocumentChangeEvent event) {
log.debug("Repainting on document change");
needUpdate = true;
PhotoPanel.this.repaint();
}
};
document.addDocumentChangeListener(changeListener);
((GLAutoDrawable) canvas).invoke(false, new GLRunnable() { ((GLAutoDrawable) canvas).invoke(false, new GLRunnable() {
@Override @Override
public boolean run(final GLAutoDrawable drawable) { public boolean run(final GLAutoDrawable drawable) {
PhotoPanel.this.configuration = doc.getSelectedConfiguration();
cachedBounds = null;
rr = new RealisticRenderer(doc); rr = new RealisticRenderer(doc);
rr.init(drawable); rr.init(drawable);
doc.addDocumentChangeListener(new DocumentChangeListener() {
@Override
public void documentChanged(DocumentChangeEvent event) {
log.debug("Repainting on document change");
needUpdate = true;
PhotoPanel.this.repaint();
}
});
return false; return false;
} }
}); });
} }
void clearDoc() {
document.removeDocumentChangeListener(changeListener);
changeListener = null;
document = null;
}
PhotoSettings getSettings() { PhotoSettings getSettings() {
return p; return p;
} }