Enum LayerTransformMode
Defines how a rendering layer participates in viewport transformations.
This is inspired by react-diagrams' LayerModel.options.transformed flag,
which allows layers to opt in or out of viewport transforms. In FlowGraph,
we extend this to three modes to handle direct rendering scenarios.
public enum LayerTransformMode
Fields
SelfTransformed = 2Layer manages its own transforms independently.
Coordinate expectations:
- Layer exists outside any transformed container
- Layer performs its own CanvasToScreen transforms when rendering
- Used for direct DrawingContext rendering that bypasses visual tree
Use for: DirectGraphRenderer, custom GPU renderers, background grids
Example:
// DirectGraphRenderer renders directly to DrawingContext public override void Render(DrawingContext context) { foreach (var node in nodes) { // Must transform canvas coords to screen coords manually var screenPos = viewport.CanvasToScreen(node.Position.X, node.Position.Y); context.DrawRectangle(brush, pen, new Rect(screenPos, scaledSize)); } }Critical: SelfTransformed layers MUST be children of an untransformed container (e.g., RootPanel, not MainCanvas). Placing them inside a transformed container causes double-transformation bugs.
Transformed = 0Layer IS affected by parent viewport transforms.
Coordinate expectations:
- Elements are positioned in canvas coordinates
- Parent container applies zoom/pan via MatrixTransform
- No manual coordinate conversion needed
Use for: Nodes, edges, ports, resize handles, selection rectangles
Example:
// Node positioned in canvas coordinates - transform handled by parent Canvas.SetLeft(nodeVisual, node.Position.X); // ✅ Canvas coords Canvas.SetTop(nodeVisual, node.Position.Y);Untransformed = 1Layer is NOT affected by viewport transforms.
Coordinate expectations:
- Elements are positioned in screen coordinates
- Layer exists outside the transformed container
- Must manually call CanvasToScreen if referencing canvas positions
Use for: Fixed overlays, HUD elements, toolbars, minimap frame
Example:
// Tooltip positioned in screen coordinates Canvas.SetLeft(tooltip, e.GetPosition(rootPanel).X); // ✅ Screen coords