Skip to content

Commit

Permalink
selection list now shared by various apps
Browse files Browse the repository at this point in the history
  • Loading branch information
i-make-robots committed Dec 28, 2023
1 parent 5efb7ff commit 28058f7
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 29 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/marginallyclever/ro3/apps/RO3Frame.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.formdev.flatlaf.FlatLightLaf;
import com.marginallyclever.communications.application.TextInterfaceToSessionLayer;
import com.marginallyclever.ro3.RO3;
import com.marginallyclever.ro3.Registry;
import com.marginallyclever.ro3.UndoSystem;
import com.marginallyclever.ro3.apps.about.AboutPanel;
import com.marginallyclever.ro3.apps.actions.*;
Expand Down Expand Up @@ -277,7 +278,6 @@ private void createLayout() {
detailView.add(nodeDetailView, BorderLayout.CENTER);
Docking.dock(detailView, treeView, DockingRegion.SOUTH);
windows.add(detailView);
nodeTreeView.addSelectionChangeListener(nodeDetailView);

DockingPanel logView = new DockingPanel("5e565f83-9734-4281-9828-92cd711939df","Log");
logView.add(logPanel, BorderLayout.CENTER);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.marginallyclever.ro3.apps.nodedetailview;

import com.marginallyclever.ro3.Registry;
import com.marginallyclever.ro3.listwithevents.ItemAddedListener;
import com.marginallyclever.ro3.listwithevents.ItemRemovedListener;
import com.marginallyclever.ro3.node.Node;
import com.marginallyclever.ro3.apps.nodetreeview.SelectionChangeListener;
import org.slf4j.Logger;
Expand All @@ -13,7 +16,8 @@
/**
* {@link NodeDetailView} is a panel that displays the details of a class that implements {@link Node}.
*/
public class NodeDetailView extends JPanel implements SelectionChangeListener {
public class NodeDetailView extends JPanel
implements SelectionChangeListener, ItemAddedListener<Node>, ItemRemovedListener<Node> {
private static final Logger logger = LoggerFactory.getLogger(NodeDetailView.class);
private final JScrollPane scroll = new JScrollPane();

Expand Down Expand Up @@ -65,4 +69,28 @@ public void selectionChanged(List<Node> selectedNodes) {
this.revalidate();
this.repaint();
}

@Override
public void addNotify() {
super.addNotify();
Registry.selection.addItemAddedListener(this);
Registry.selection.addItemRemovedListener(this);
}

@Override
public void removeNotify() {
super.removeNotify();
Registry.selection.removeItemAddedListener(this);
Registry.selection.removeItemRemovedListener(this);
}

@Override
public void itemAdded(Object source,Node item) {
selectionChanged(Registry.selection.getList());
}

@Override
public void itemRemoved(Object source,Node item) {
selectionChanged(Registry.selection.getList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.marginallyclever.ro3.SceneChangeListener;
import com.marginallyclever.ro3.apps.actions.AddNode;
import com.marginallyclever.ro3.apps.actions.RemoveNode;
import com.marginallyclever.ro3.listwithevents.ItemAddedListener;
import com.marginallyclever.ro3.listwithevents.ItemRemovedListener;
import com.marginallyclever.ro3.node.Node;
import com.marginallyclever.ro3.node.NodeAttachListener;
import com.marginallyclever.ro3.node.NodeDetachListener;
Expand All @@ -13,6 +15,7 @@

import javax.swing.*;
import javax.swing.event.EventListenerList;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.*;
import java.awt.*;
import java.security.InvalidParameterException;
Expand All @@ -23,13 +26,16 @@
/**
* {@link NodeTreeView} is a panel that displays the node tree.
*/
public class NodeTreeView extends JPanel implements NodeAttachListener, NodeDetachListener, NodeRenameListener, SceneChangeListener {
public class NodeTreeView extends JPanel
implements NodeAttachListener, NodeDetachListener, NodeRenameListener,
SceneChangeListener, ItemAddedListener<Node>, ItemRemovedListener<Node> {
private static final Logger logger = LoggerFactory.getLogger(NodeTreeView.class);
private final JTree tree;
private final NodeTreeBranch treeModel = new NodeTreeBranch(Registry.getScene());
private final EventListenerList listenerList = new EventListenerList();
private final JToolBar toolBar = new JToolBar();
private final RemoveNode removeNode = new RemoveNode(this);
private boolean isExternalChange = false;

public NodeTreeView() {
super();
Expand Down Expand Up @@ -57,26 +63,31 @@ private void setupTree() {
tree.setCellRenderer(cellRender);
tree.setCellEditor(new NodeTreeBranchEditor(tree, cellRender));
tree.setTransferHandler(new NodeTreeTransferHandler());
tree.addTreeSelectionListener((e) ->{
// single selection
TreePath path = e.getPath();
if(path==null) {
// no selection
removeNode.setEnabled(false);
fireSelectionChangeEvent(List.of());
} else {
NodeTreeBranch selectedNode = (NodeTreeBranch) path.getLastPathComponent();
// scene root cannot be deleted.
removeNode.setEnabled(selectedNode != treeModel.getRoot());
fireSelectionChangeEvent(List.of(selectedNode.getNode()));
}
});
tree.addTreeSelectionListener(this::changeSelection);
}

private void changeSelection(TreeSelectionEvent e) {
if(isExternalChange) return;

Registry.selection.removeAll();
removeNode.setEnabled(false);
// handle many selections
for(TreePath path : e.getPaths()) {
NodeTreeBranch selectedNode = (NodeTreeBranch) path.getLastPathComponent();
// scene root cannot be deleted.
removeNode.setEnabled(selectedNode != treeModel.getRoot());
Registry.selection.add(selectedNode.getNode());
}
}

@Override
public void addNotify() {
super.addNotify();
Registry.addSceneChangeListener(this);
Registry.selection.addItemAddedListener(this);
Registry.selection.addItemRemovedListener(this);


listenTo(Registry.getScene());
}

Expand All @@ -91,6 +102,8 @@ public void removeNotify() {
super.removeNotify();
stopListeningTo(Registry.getScene());
Registry.removeSceneChangeListener(this);
Registry.selection.removeItemAddedListener(this);
Registry.selection.removeItemRemovedListener(this);
}

private void stopListeningTo(Node node) {
Expand Down Expand Up @@ -220,7 +233,6 @@ public void beforeSceneChange(Node oldScene) {
//logger.debug("beforeSceneChange");
stopListeningTo(oldScene);
tree.clearSelection(); // does not trigger selection change event?
fireSelectionChangeEvent(List.of());
removeNode.setEnabled(false);
}

Expand Down Expand Up @@ -271,4 +283,28 @@ public void removeSelectedNodes() {
} // else root node, can't remove.
}
}

@Override
public void itemAdded(Object source,Node item) {
isExternalChange = true;
try {
var branch = findTreeNode(item);
if (branch == null) throw new InvalidParameterException("item not found in tree " + item.getAbsolutePath());
tree.addSelectionPath(new TreePath(branch.getPath()));
} finally {
isExternalChange = false;
}
}

@Override
public void itemRemoved(Object source,Node item) {
isExternalChange = true;
try {
var branch = findTreeNode(item);
if(branch==null) throw new InvalidParameterException("item not found in tree "+item.getAbsolutePath());
tree.removeSelectionPath(new TreePath(branch.getPath()));
} finally {
isExternalChange = false;
}
}
}
10 changes: 5 additions & 5 deletions src/main/java/com/marginallyclever/ro3/apps/render/Viewport.java
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ private void addRenderPassSelection() {
button.setToolTipText("Select the render passes to use.");

for(RenderPass renderPass : renderPasses.getList()) {
addRenderPass(renderPass);
addRenderPass(null,renderPass);
}
}

Expand All @@ -192,12 +192,12 @@ public void removeNotify() {
renderPasses.removeItemRemovedListener(this::removeRenderPass);
}

private void addRenderPass(RenderPass renderPass) {
private void addRenderPass(Object source,RenderPass renderPass) {
addRenderPassInternal(renderPass);
addGLEventListener(renderPass);
}

private void removeRenderPass(RenderPass renderPass) {
private void removeRenderPass(Object source,RenderPass renderPass) {
removeRenderPassInternal(renderPass);
removeGLEventListener(renderPass);
}
Expand Down Expand Up @@ -237,13 +237,13 @@ private void removeRenderPassInternal(RenderPass renderPass) {
}
}

private void addCamera(Camera camera) {
private void addCamera(Object source,Camera camera) {
if(cameraListModel.getIndexOf(camera) == -1) {
cameraListModel.addElement(camera);
}
}

private void removeCamera(Camera camera) {
private void removeCamera(Object source,Camera camera) {
cameraListModel.removeElement(camera);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ private void drawAllMeshes(GL3 gl3, List<MeshInstance> meshes, Camera camera) {
// https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping
private Matrix4d getLightSpaceMatrix() {
// orthographic projection from the light's point of view
Matrix4d lightProjection = MatrixHelper.orthographicMatrix4d(-10,10,-10,10,1.0,100.0);
Matrix4d lightProjection = MatrixHelper.orthographicMatrix4d(-10,10,-10,10,1.0,75);
// look at the scene from the light's point of view
Matrix4d lightView = MatrixHelper.lookAt(fromLightUnit, // from
new Vector3d(0,0,0), // to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
import java.util.EventListener;

public interface ItemAddedListener<T> extends EventListener {
void itemAdded(T item);
void itemAdded(Object source,T item);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
import java.util.EventListener;

public interface ItemRemovedListener<T> extends EventListener {
void itemRemoved(T item);
void itemRemoved(Object source,T item);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import javax.swing.event.EventListenerList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
Expand Down Expand Up @@ -41,13 +40,13 @@ public void removeItemRemovedListener(ItemRemovedListener<T> listener) {

protected void fireItemAdded(T item) {
for (ItemAddedListener<T> l : listenerList.getListeners(ItemAddedListener.class)) {
l.itemAdded(item);
l.itemAdded(this,item);
}
}

protected void fireItemRemoved(T item) {
for (ItemRemovedListener<T> l : listenerList.getListeners(ItemRemovedListener.class)) {
l.itemRemoved(item);
l.itemRemoved(this,item);
}
}

Expand All @@ -60,4 +59,8 @@ public void removeAll() {
remove(list.get(0));
}
}

public int size() {
return list.size();
}
}

0 comments on commit 28058f7

Please sign in to comment.