]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / ElementPainter.java
index 9134c1729ac161c7ec4d9bcb927880da9612b8dd..d4d0609b2766a3c9b616bba03b8a9f050d06a56b 100644 (file)
@@ -61,6 +61,7 @@ import org.simantics.g2d.element.handler.BendsHandler;
 import org.simantics.g2d.element.handler.Children;
 import org.simantics.g2d.element.handler.Children.ChildEvent;
 import org.simantics.g2d.element.handler.Children.ChildListener;
+import org.simantics.g2d.element.handler.ElementLayers;
 import org.simantics.g2d.element.handler.FillColor;
 import org.simantics.g2d.element.handler.Outline;
 import org.simantics.g2d.element.handler.OutlineColorSpec;
@@ -71,9 +72,9 @@ import org.simantics.g2d.element.handler.SelectionSpecification;
 import org.simantics.g2d.element.handler.StrokeSpec;
 import org.simantics.g2d.element.handler.TerminalTopology;
 import org.simantics.g2d.element.handler.Transform;
-import org.simantics.g2d.layers.ILayer;
+import org.simantics.g2d.layers.ILayers;
+import org.simantics.g2d.layers.ILayers.ILayersListener;
 import org.simantics.g2d.layers.ILayersEditor;
-import org.simantics.g2d.layers.ILayersEditor.ILayersEditorListener;
 import org.simantics.g2d.participant.TransformUtil;
 import org.simantics.g2d.scenegraph.SceneGraphConstants;
 import org.simantics.g2d.utils.ElementNodeBridge;
@@ -83,6 +84,7 @@ import org.simantics.scenegraph.Node;
 import org.simantics.scenegraph.g2d.G2DParentNode;
 import org.simantics.scenegraph.g2d.G2DSceneGraph;
 import org.simantics.scenegraph.g2d.IG2DNode;
+import org.simantics.scenegraph.g2d.color.ColorFilter;
 import org.simantics.scenegraph.g2d.nodes.ConnectionNode;
 import org.simantics.scenegraph.g2d.nodes.DataNode;
 import org.simantics.scenegraph.g2d.nodes.LinkNode;
@@ -213,9 +215,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             oldValue.removeKeyHintListener(Hints.KEY_DIRTY, diagramHintListener);
             oldValue.removeKeyHintListener(Hints.KEY_DISABLE_PAINTING, diagramHintListener);
 
-            ILayersEditor layers = oldValue.getHint(DiagramHints.KEY_LAYERS_EDITOR);
+            ILayers layers = oldValue.getHint(DiagramHints.KEY_LAYERS);
             if (layers != null) {
-                layers.removeListener(layersListener);
+                layers.removeLayersListener(layersListener);
             }
 
             for (TransactionContext tc : oldValue.getDiagramClass().getItemsByClass(TransactionContext.class)) {
@@ -237,9 +239,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             newValue.addKeyHintListener(Hints.KEY_DISABLE_PAINTING, diagramHintListener);
             newValue.addKeyHintListener(Hints.KEY_DIRTY, diagramHintListener);
 
-            ILayersEditor layers = newValue.getHint(DiagramHints.KEY_LAYERS_EDITOR);
+            ILayers layers = newValue.getHint(DiagramHints.KEY_LAYERS);
             if (layers != null) {
-                layers.addListener(layersListener);
+                layers.addLayersListener(layersListener);
             }
 
             for (TransactionContext tc : newValue.getDiagramClass().getItemsByClass(TransactionContext.class)) {
@@ -302,41 +304,21 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
     // Layer configuration change listening and reaction logic
     // ------------------------------------------------------------------------
 
-    ILayersEditorListener layersListener = new ILayersEditorListener() {
-        private void layersChanged() {
+    ILayersListener layersListener = new ILayersListener() {
+        @Override
+        public void changed() {
             Object task = BEGIN("EP.layersChanged");
-            // Update visibility/focusability for each node only, do not reinitialize the graphics.
+            ICanvasContext ctx = getContext();
+            if(ctx != null) {
+                G2DSceneGraph sg = ctx.getSceneGraph();
+                if(sg != null) {
+                    ILayersEditor layers = diagram.getHint(DiagramHints.KEY_LAYERS);
+                    sg.setGlobalProperty(G2DSceneGraph.IGNORE_FOCUS, layers.getIgnoreFocusSettings());
+                }
+            }
             updateAllVisibility();
             END(task);
         }
-        @Override
-        public void layerRemoved(ILayer layer) {
-            layersChanged();
-        }
-        @Override
-        public void layerDeactivated(ILayer layer) {
-            layersChanged();
-        }
-        @Override
-        public void layerAdded(ILayer layer) {
-            layersChanged();
-        }
-        @Override
-        public void layerActivated(ILayer layer) {
-            layersChanged();
-        }
-        @Override
-        public void ignoreFocusChanged(boolean value) {
-               ICanvasContext ctx = getContext();
-               if(ctx == null) return;
-               G2DSceneGraph sg = ctx.getSceneGraph();
-               if(sg == null) return;
-               sg.setGlobalProperty(G2DSceneGraph.IGNORE_FOCUS, value);
-        }
-        @Override
-        public void ignoreVisibilityChanged(boolean value) {
-            layersChanged();
-        }
     };
 
     protected void updateAllVisibility() {
@@ -405,11 +387,17 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
                 }
             } else if (key == ElementHints.KEY_FOCUS_LAYERS || key == ElementHints.KEY_VISIBLE_LAYERS) {
                 if (sender instanceof IElement) {
-                    assert getContext().getThreadAccess().currentThreadAccess();
-                    IElement e = (IElement) sender;
-                    Object task = BEGIN("layers changed: " + e);
-                    update(e);
-                    END(task);
+                    getContext().getThreadAccess().asyncExec(new Runnable() {
+
+                        @Override
+                        public void run() {
+                            assert getContext().getThreadAccess().currentThreadAccess();
+                            IElement e = (IElement) sender;
+                            Object task = BEGIN("layers changed: " + e);
+                            update(e);
+                            END(task);
+                        }
+                    });
                 }
             }
         }
@@ -775,14 +763,6 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             if (ElementUtils.isHidden(e))
                 return null;
 
-//            ElementClass ec = e.getElementClass();
-//            ILayers layers = diagram.getHint(DiagramHints.KEY_LAYERS);
-//            if (layers != null && !layers.getIgnoreVisibilitySettings()) {
-//                ElementLayers el = ec.getAtMostOneItemOfClass(ElementLayers.class);
-//                if (el != null && !el.isVisible(e, layers)) {
-//                    return null;
-//                }
-//            }
 
             // Update the node scene graph through SceneGraph handlers.
             List<SceneGraph> nodeHandlers = e.getElementClass().getItemsByClass(SceneGraph.class);
@@ -797,7 +777,19 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
                 e.setHint(elementSgNodeKey, holder);
             }
             holder.setComposite(composite);
-            holder.setVisible(true);
+            boolean visible = true;
+            ElementClass ec = e.getElementClass();
+            ILayers layers = diagram.getHint(DiagramHints.KEY_LAYERS);
+            if (layers != null && !layers.getIgnoreVisibilitySettings()) {
+                ElementLayers el = ec.getAtMostOneItemOfClass(ElementLayers.class);
+                if (el != null && !el.isVisible(e, layers)) {
+                    visible = false;
+                }
+            }
+            holder.setVisible(visible);
+
+            ColorFilter colorFilter = e.getHint(ElementHints.KEY_COLOR_FILTER);
+            holder.setColorFilter(colorFilter);
 
             for (SceneGraph n : nodeHandlers) {
                 n.init(e, holder);