Added multi selection to the ShaderNode editor.
One can now select several items by left clicking with ctrl or shit held. One can now move all selected items at once. One can now delete all selected items at once.
This commit is contained in:
parent
129faf00d7
commit
5989711f73
@ -123,7 +123,7 @@ public class ConnectionCurve extends JPanel implements ComponentListener, MouseI
|
||||
|
||||
g2.setStroke(new BasicStroke(4));
|
||||
Path2D.Double path1 = new Path2D.Double();
|
||||
if (getDiagram().selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
g.setColor(SELECTED_COLOR);
|
||||
} else {
|
||||
g.setColor(VERY_DARK_GREY);
|
||||
@ -162,7 +162,7 @@ public class ConnectionCurve extends JPanel implements ComponentListener, MouseI
|
||||
((Graphics2D) g).draw(path1);
|
||||
g2.setStroke(new BasicStroke(2));
|
||||
|
||||
if (getDiagram().selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
g.setColor(Color.WHITE);
|
||||
} else {
|
||||
g.setColor(LIGHT_GREY);
|
||||
@ -385,7 +385,7 @@ public class ConnectionCurve extends JPanel implements ComponentListener, MouseI
|
||||
}
|
||||
|
||||
if (selected) {
|
||||
getDiagram().select(this);
|
||||
getDiagram().select(this, e.isShiftDown() || e.isControlDown());
|
||||
e.consume();
|
||||
}
|
||||
}
|
||||
@ -407,9 +407,7 @@ public class ConnectionCurve extends JPanel implements ComponentListener, MouseI
|
||||
|
||||
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
|
||||
Diagram diag = getDiagram();
|
||||
if (diag.selectedItem == this) {
|
||||
diag.removeSelectedConnection();
|
||||
}
|
||||
diag.removeSelected();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -209,7 +209,7 @@ public class ConnectionStraight extends JPanel implements ComponentListener, Mou
|
||||
g.drawLine(p1.x, p1.y, p2.x, p2.y);
|
||||
|
||||
|
||||
if (getDiagram().selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
g.setColor(Color.CYAN);
|
||||
} else {
|
||||
g.setColor(Color.GRAY);
|
||||
@ -489,7 +489,7 @@ public class ConnectionStraight extends JPanel implements ComponentListener, Mou
|
||||
}
|
||||
|
||||
if (selected) {
|
||||
getDiagram().select(this);
|
||||
getDiagram().select(this, e.isShiftDown() || e.isControlDown());
|
||||
e.consume();
|
||||
}
|
||||
}
|
||||
@ -511,9 +511,7 @@ public class ConnectionStraight extends JPanel implements ComponentListener, Mou
|
||||
|
||||
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
|
||||
Diagram diag = getDiagram();
|
||||
if (diag.selectedItem == this) {
|
||||
diag.removeSelectedConnection();
|
||||
}
|
||||
diag.removeSelected();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
|
||||
protected Dot draggedFrom;
|
||||
protected Dot draggedTo;
|
||||
protected Selectable selectedItem;
|
||||
protected List<Selectable> selectedItems = new ArrayList<Selectable>();
|
||||
protected List<Connection> connections = new ArrayList<Connection>();
|
||||
protected List<NodePanel> nodes = new ArrayList<NodePanel>();
|
||||
protected List<OutBusPanel> outBuses = new ArrayList<OutBusPanel>();
|
||||
@ -63,6 +63,9 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
private MatDefEditorlElement parent;
|
||||
private String currentTechniqueName;
|
||||
private final BackdropPanel backDrop = new BackdropPanel();
|
||||
private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
|
||||
private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
|
||||
private final Point pp = new Point();
|
||||
|
||||
@SuppressWarnings("LeakingThisInConstructor")
|
||||
public Diagram() {
|
||||
@ -99,7 +102,7 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
}
|
||||
}
|
||||
|
||||
selectedItem = null;
|
||||
selectedItems.clear();
|
||||
repaint();
|
||||
} else if (e.getButton() == MouseEvent.BUTTON2) {
|
||||
setCursor(hndCursor);
|
||||
@ -204,13 +207,10 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
public void mouseExited(MouseEvent e) {
|
||||
}
|
||||
|
||||
protected void removeSelectedConnection() {
|
||||
if (selectedItem instanceof Connection) {
|
||||
Connection selectedConnection = (Connection) selectedItem;
|
||||
removeConnection(selectedConnection);
|
||||
selectedItem = null;
|
||||
parent.notifyRemoveConnection(selectedConnection);
|
||||
}
|
||||
protected void removeSelectedConnection(Selectable selectedItem) {
|
||||
Connection selectedConnection = (Connection) selectedItem;
|
||||
removeConnection(selectedConnection);
|
||||
parent.notifyRemoveConnection(selectedConnection);
|
||||
}
|
||||
|
||||
private String fixNodeName(String name) {
|
||||
@ -276,44 +276,58 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
np.revalidate();
|
||||
repaint();
|
||||
}
|
||||
|
||||
protected void removeSelectedNode() {
|
||||
if (selectedItem instanceof NodePanel) {
|
||||
int result = JOptionPane.showConfirmDialog(null, "Delete this node and all its mappings?", "Delete Shader Node", JOptionPane.OK_CANCEL_OPTION);
|
||||
if (result == JOptionPane.OK_OPTION) {
|
||||
NodePanel selectedNode = (NodePanel) selectedItem;
|
||||
nodes.remove(selectedNode);
|
||||
for (Iterator<Connection> it = connections.iterator(); it.hasNext();) {
|
||||
Connection conn = it.next();
|
||||
if (conn.start.getNode() == selectedNode || conn.end.getNode() == selectedNode) {
|
||||
it.remove();
|
||||
conn.end.disconnect();
|
||||
conn.start.disconnect();
|
||||
remove(conn);
|
||||
}
|
||||
|
||||
protected void removeSelected(){
|
||||
|
||||
int result = JOptionPane.showConfirmDialog(null, "Delete all selected items, nodes and mappings?", "Delete Selected", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (result == JOptionPane.OK_OPTION) {
|
||||
for (Selectable selectedItem : selectedItems) {
|
||||
if (selectedItem instanceof NodePanel) {
|
||||
removeSelectedNode(selectedItem);
|
||||
}
|
||||
if (selectedItem instanceof Connection) {
|
||||
removeSelectedConnection(selectedItem);
|
||||
}
|
||||
|
||||
selectedNode.cleanup();
|
||||
remove(selectedNode);
|
||||
selectedItem = null;
|
||||
repaint();
|
||||
parent.notifyRemoveNode(selectedNode);
|
||||
}
|
||||
selectedItems.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
|
||||
private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
|
||||
private final Point pp = new Point();
|
||||
private void removeSelectedNode(Selectable selectedItem) {
|
||||
|
||||
NodePanel selectedNode = (NodePanel) selectedItem;
|
||||
nodes.remove(selectedNode);
|
||||
for (Iterator<Connection> it = connections.iterator(); it.hasNext();) {
|
||||
Connection conn = it.next();
|
||||
if (conn.start.getNode() == selectedNode || conn.end.getNode() == selectedNode) {
|
||||
it.remove();
|
||||
conn.end.disconnect();
|
||||
conn.start.disconnect();
|
||||
remove(conn);
|
||||
}
|
||||
}
|
||||
|
||||
selectedNode.cleanup();
|
||||
remove(selectedNode);
|
||||
repaint();
|
||||
parent.notifyRemoveNode(selectedNode);
|
||||
}
|
||||
|
||||
public List<Selectable> getSelectedItems() {
|
||||
return selectedItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (SwingUtilities.isLeftMouseButton(e)) {
|
||||
if (draggedFrom == null) {
|
||||
if (selectedItem instanceof OutBusPanel) {
|
||||
OutBusPanel bus = (OutBusPanel) selectedItem;
|
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, bus);
|
||||
bus.dispatchEvent(me);
|
||||
for (Selectable selectedItem : selectedItems) {
|
||||
if (selectedItem instanceof OutBusPanel) {
|
||||
OutBusPanel bus = (OutBusPanel) selectedItem;
|
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, bus);
|
||||
bus.dispatchEvent(me);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (SwingUtilities.isMiddleMouseButton(e)) {
|
||||
@ -373,22 +387,53 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
*
|
||||
* @param selectable
|
||||
*/
|
||||
public void select(Selectable selectable) {
|
||||
parent.selectionChanged(doSelect(selectable));
|
||||
public void select(Selectable selectable, boolean multi) {
|
||||
parent.selectionChanged(doSelect(selectable, multi));
|
||||
}
|
||||
|
||||
public void multiMove(DraggablePanel movedPanel ,int xOffset, int yOffset){
|
||||
|
||||
for (Selectable selectedItem : selectedItems) {
|
||||
if(selectedItem != movedPanel){
|
||||
if(selectedItem instanceof DraggablePanel){
|
||||
((DraggablePanel)selectedItem).movePanel(xOffset, yOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void multiStartDrag(DraggablePanel movedPanel){
|
||||
for (Selectable selectedItem : selectedItems) {
|
||||
if(selectedItem != movedPanel){
|
||||
if(selectedItem instanceof DraggablePanel){
|
||||
((DraggablePanel)selectedItem).saveLocation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* do select the item and repaint the diagram
|
||||
*
|
||||
* @param selectable
|
||||
* @return
|
||||
*/
|
||||
private Selectable doSelect(Selectable selectable) {
|
||||
this.selectedItem = selectable;
|
||||
private Selectable doSelect(Selectable selectable, boolean multi) {
|
||||
|
||||
|
||||
if (!multi && !selectedItems.contains(selectable)) {
|
||||
selectedItems.clear();
|
||||
}
|
||||
|
||||
if (selectable != null) {
|
||||
selectedItems.add(selectable);
|
||||
}
|
||||
|
||||
if (selectable instanceof Component) {
|
||||
((Component) selectable).requestFocusInWindow();
|
||||
}
|
||||
repaint();
|
||||
|
||||
return selectable;
|
||||
}
|
||||
|
||||
@ -403,23 +448,23 @@ public class Diagram extends JPanel implements MouseListener, MouseMotionListene
|
||||
|
||||
for (NodePanel nodePanel : nodes) {
|
||||
if (nodePanel.getKey().equals(key)) {
|
||||
return doSelect(nodePanel);
|
||||
return doSelect(nodePanel, false);
|
||||
}
|
||||
}
|
||||
|
||||
for (Connection connection : connections) {
|
||||
if (connection.getKey().equals(key)) {
|
||||
return doSelect(connection);
|
||||
return doSelect(connection, false);
|
||||
}
|
||||
}
|
||||
|
||||
for (OutBusPanel outBusPanel : outBuses) {
|
||||
if (outBusPanel.getKey().equals(key)) {
|
||||
return doSelect(outBusPanel);
|
||||
return doSelect(outBusPanel, false);
|
||||
}
|
||||
}
|
||||
|
||||
return doSelect(null);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -37,16 +37,22 @@ public class DraggablePanel extends JPanel implements MouseListener, MouseMotion
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (e.getButton() != MouseEvent.BUTTON2) {
|
||||
svdx = getLocation().x;
|
||||
|
||||
if (!vertical) {
|
||||
svdex = e.getXOnScreen();
|
||||
}
|
||||
svdy = getLocation().y;
|
||||
svdey = e.getYOnScreen();
|
||||
saveLocation();
|
||||
diagram.multiStartDrag(this);
|
||||
e.consume();
|
||||
}
|
||||
}
|
||||
|
||||
protected void saveLocation() {
|
||||
svdy = getLocation().y;
|
||||
svdx = getLocation().x;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
}
|
||||
@ -71,11 +77,19 @@ public class DraggablePanel extends JPanel implements MouseListener, MouseMotion
|
||||
xoffset = e.getLocationOnScreen().x - svdex;
|
||||
}
|
||||
int yoffset = e.getLocationOnScreen().y - svdey;
|
||||
setLocation(Math.max(0, svdx + xoffset), Math.max(0, svdy + yoffset));
|
||||
movePanel(xoffset, yoffset);
|
||||
diagram.multiMove(this, xoffset, yoffset);
|
||||
e.consume();
|
||||
}
|
||||
}
|
||||
|
||||
protected void movePanel(int xoffset, int yoffset) {
|
||||
if (vertical) {
|
||||
xoffset = 0;
|
||||
}
|
||||
setLocation(Math.max(0, svdx + xoffset), Math.max(0, svdy + yoffset));
|
||||
}
|
||||
|
||||
public Diagram getDiagram() {
|
||||
return diagram;
|
||||
}
|
||||
|
@ -56,23 +56,6 @@ public class NodePanel extends DraggablePanel implements Selectable, PropertyCha
|
||||
protected List<String> filePaths = new ArrayList<String>();
|
||||
protected Shader.ShaderType shaderType;
|
||||
|
||||
// private List listeners = Collections.synchronizedList(new LinkedList());
|
||||
//
|
||||
// public void addPropertyChangeListener(PropertyChangeListener pcl) {
|
||||
// listeners.add(pcl);
|
||||
// }
|
||||
//
|
||||
// public void removePropertyChangeListener(PropertyChangeListener pcl) {
|
||||
// listeners.remove(pcl);
|
||||
// }
|
||||
//
|
||||
// protected void fire(String propertyName, Object old, Object nue) {
|
||||
// //Passing 0 below on purpose, so you only synchronize for one atomic call:
|
||||
// PropertyChangeListener[] pcls = (PropertyChangeListener[]) listeners.toArray(new PropertyChangeListener[0]);
|
||||
// for (int i = 0; i < pcls.length; i++) {
|
||||
// pcls[i].propertyChange(new PropertyChangeEvent(this, propertyName, old, nue));
|
||||
// }
|
||||
// }
|
||||
public enum NodeType {
|
||||
|
||||
Vertex(new Color(220, 220, 70)),//yellow
|
||||
@ -201,13 +184,13 @@ public class NodePanel extends DraggablePanel implements Selectable, PropertyCha
|
||||
protected void paintComponent(Graphics g1) {
|
||||
Graphics2D g = (Graphics2D) g1;
|
||||
Color boderColor = Color.BLACK;
|
||||
if (diagram.selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
boderColor = Color.WHITE;
|
||||
}
|
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
|
||||
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
// Color[] colors = {new Color(0, 0, 0, 0.7f), new Color(0, 0, 0, 0.15f)};
|
||||
if (diagram.selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
Color[] colors = new Color[]{new Color(0.6f, 0.6f, 1.0f, 0.8f), new Color(0.6f, 0.6f, 1.0f, 0.5f)};
|
||||
float[] factors = {0f, 1f};
|
||||
g.setPaint(new RadialGradientPaint(getWidth() / 2, getHeight() / 2, getWidth() / 2, factors, colors));
|
||||
@ -260,8 +243,8 @@ public class NodePanel extends DraggablePanel implements Selectable, PropertyCha
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
super.mousePressed(e);
|
||||
diagram.select(this);
|
||||
super.mousePressed(e);
|
||||
diagram.select(this, e.isShiftDown() || e.isControlDown());
|
||||
showToolBar();
|
||||
}
|
||||
|
||||
@ -442,9 +425,7 @@ public class NodePanel extends DraggablePanel implements Selectable, PropertyCha
|
||||
|
||||
public void delete() {
|
||||
Diagram diag = getDiagram();
|
||||
if (diag.selectedItem == this) {
|
||||
diag.removeSelectedNode();
|
||||
}
|
||||
diag.removeSelected();
|
||||
}
|
||||
|
||||
public void keyReleased(KeyEvent e) {
|
||||
|
@ -110,7 +110,7 @@ public class OutBusPanel extends DraggablePanel implements ComponentListener, Se
|
||||
|
||||
Polygon p = new Polygon(xs, ys, 8);
|
||||
|
||||
if (diagram.selectedItem == this) {
|
||||
if (getDiagram().getSelectedItems().contains(this)) {
|
||||
int[] xs2 = {0, width - 30, width - 30, width, width - 32, width - 32, 0, 0};
|
||||
int[] ys2 = {10, 10, 0, getHeight() / 2 + 2, getHeight(), getHeight() - 8, getHeight() - 8, 10};
|
||||
|
||||
@ -154,7 +154,7 @@ public class OutBusPanel extends DraggablePanel implements ComponentListener, Se
|
||||
return;
|
||||
}
|
||||
super.mousePressed(e);
|
||||
diagram.select(this);
|
||||
diagram.select(this, e.isShiftDown() || e.isControlDown());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user