All changes
Version 6.0
This version brings a major overhaul of many parts of the API, resulting in a lot of
incompatible changes. We have designed many functions
to be simpler, more intuitive and more consistent and removed technical debt.
In addition, this release contains numerous
new features, improvements, and bug fixes to all parts of
the library.
For a tour of this release's highlights, have a look at the
article about yFiles.NET 6.0.
If you are updating from an older version of yFiles.NET, have a look at the
list of incompatible changes
and at the more detailed description in the
Migration Guide.
Major new Feature: Support for Touch and Stylus Input
yFiles.NET now supports touch and stylus devices.
Touch input is now available across all built-in input modes. Numerous new properties enable full customization of input modes for mouse, stylus, and touch interactions.
The new versatile Pointer events replace the previous Mouse2D events. Pointer events support mouse, touch, and stylus inputs,
providing generic properties such as event type (e.g., Up or Down) and location, as well as specific details like stylus pressure and touch size.
New Features, Improvements, and Bug Fixes
Categories:
General
Graph
Controls
Rendering
Selection, Focus, Highlight
Styles
Interaction
Label Editing
Snapping
Clipboard
Folding
View-Layout-Bridge
Layout
Hierarchical Layout
Tree Layout
Orthogonal Layout
Edge Router
Labeling
Organic Layout
Radial Tree Layout
Series-parallel Layout
Partial Layout
Tabular Layout
Component Layout
Algorithms
Analysis
Geometry
General
New Features and Improvements
-
The yFiles library now consists of one single assembly.
-
All uses of the
IListEnumerable<T> interface have been replaced by the
IReadOnlyList<T> interface. This means that standard collections such
as List<T> can now be used there. Accordingly, the ListEnumerableExtensions and ListEnumerable<T> classes have been removed.
-
The lookup API has been restructured. In particular, the
LookupDecorator class is now
easier to use, but most use cases are covered without having to access the low-level lookup architecture.
-
The assemblies now are strong-named as factory default.
-
The new
LicenseConfig class offers a way to set the yFiles license data in code (as
opposed to having to embed a resource file in the application).
Graph
New Features and Improvements
-
CompositeLabelModel now cannot only combine label models but also individual label
model parameters or a mix of both kinds. Furthermore, it supports assigning a profit value to a parameter or model
that can be used when placing labels during an automatic layout.
-
The new
CompositeLabelModel.AddParameter method wraps a given parameter of one of
the composed label models.
-
The new
IGraph.GetEdgesBetween method returns all edges between two ports or port
owners.
-
The methods of
IGraph now check consistently whether given geometric arguments are
neither infinite nor NaN.
-
The rotation direction of
OrientedRectangle, NodeLabel,
EdgeLabel and FreeEdgeLabelModel is now clockwise to be
consistent with the other models.
-
The default placement for new edge labels is now on the middle of the edge path instead of on the first edge
segment.
-
The label models
ExteriorLabelModel, InteriorLabelModel,
and InteriorStretchLabelModel have been renamed to ExteriorNodeLabelModel, InteriorNodeLabelModel, and StretchNodeLabelModel, respectively, to make it clear that only nodes are supported as
label owner for these models.
-
The implementations of
ILabelModelParameter and IPortLocationModelParameter used by the ILabelModel and
IPortLocationModel classes are now public and provide all properties necessary to
recreate them on the models. Consequently, the static LabelModelParameterSerializer
and PortLocationModelParameterSerializer classes, which could be used to retrieve
those properties and recreate the parameter, have been removed.
-
The
ILabelModel parameter of the ILabelModelParameterFinder.FindBestParameter and ILabelModelParameterProvider.GetParameters methods has been removed as it was only very
rarely required.
-
The
GraphCopier API has been enhanced to offer improved clarity and functionality.
-
The
GraphCopier has been optimized since its support for the GraphClipboard has been removed.
-
The
GraphCopier.Copy method now uses an IEnumerable
of items to define the subset to copy.
-
The
SimpleNode, SimpleEdge, SimpleBend, SimpleLabel, and SimplePort classes now provide a convenience LookupDecorator
instance through the GetDecorator method.
-
The
ILabelModel.CreateDefaultParameter method and most of its implementations have
been removed as it was often unclear what βdefaultβ meant. Most label models already had a corresponding
Create*Parameter method. For the remaining models, the GroupNodeLabelModel.CreateTabParameter method and the FreeNodeLabelModel.Center and FreePortLabelModel.Center
fields have been added.
-
The structural properties on graph items now are never
null. This affects IEdge.SourcePort, IEdge.TargetPort, ILabel.Owner, IPort.Owner, and IBend.Owner.
-
The
IGraph.GroupNodes method now has optional parameters that specify the Style and Tag of the newly created group.
-
The static parameter fields of
FreeNodePortLocationModel have been renamed analogue to
the static parameter fields in InteriorNodeLabelModel.
-
FilteredGraphWrapper now supports changing the node and edge predicates after
creation.
-
The
PropertyChanged event on the UndoEngine
class is now also emitted if the token is changed.
Bug Fixes
-
Fixed
ILabelOwner.Labels.Contains and IPortOwner.Ports.Contains implementations. Previously, these methods returned true for all
labels/ports in the owner's graph instead of only for labels/ports belonging to the owner.
-
Fixed a bug in
EdgeSegmentLabelModel and EdgePathLabelModel which caused a gap in supported positions close to the source and
target node.
-
Fixed
EdgeSegmentLabelModel and SmartEdgeLabelModel
label placement at source and target nodes when using indices less than 0 or greater than the number of bends in the
edge.
-
The
EdgeSegmentLabelModel class now calculates valid label locations for selfloop
paths with one port at the side of the node.
-
The
EdgeSegmentLabelModel class now calculates valid label locations for paths with
duplicate bends, i.e., paths in which two or more consecutive bends have the same location.
-
GraphClipboard's ParentNodeDetection now can use
ParentNodeDetectionModes.None as fallback if no valid parent is found for modes
ParentNodeDetectionModes.Selection or ParentNodeDetectionModes.PreviousParent.
Controls
New Features and Improvements
-
yFiles now offers theming. Therefore, a new
Theme class has been added.
-
The new class provides the following properties to determine the overall visual appearance:
-
*
PrimaryBrush, SecondaryBrush, and
BackgroundBrush which determine the color of vaious decorations like
selection decoration or handles.
-
*
Scale: which determines the size if handles and port candidates.
-
*
IndicatorOffset and HandleOffset: which determines
an offset for decorations to their decorated elements.
-
*
Variant: which determines some aspects of the overall appearance, e.g. whether
handles should be drawn as circles or squares.
-
The theme can be set for a
CanvasControl or GraphControl using the Theme property.
-
CanvasControl and GraphControl now have a new scroll bar
design, as well as new behavior if either HorizontalScrollBarPolicy or VerticalScrollBarPolicy is set to AsNeeded. The new
style is similar to system scrollbars in many operating systems, overlays the content and gets out of the way when
not needed or interacted with. If this behavior is wanted when customizing the control template, the new DynamicScrollBar class can be used.
-
ViewportLimiter now also works with isometric projections and offers options to use
the CanvasControl.ContentBounds for the limiting. It now offers the possibility to
specify margins in the view coordinate system around the specified bounds, and bounds can be given as a list of
convex polygon points. CanvasControl now also notifies the viewport limiter when the
size of the ContentBounds or the size of the CanvasControl changes.
-
The new
CanvasControl.HorizontalScrollEventRecognizer property allows customizing
switching from vertical to horizontal scrolling.
-
The
ICanvasContext.CanvasControl property (and consequently IRenderContext and IInputModeContext) is now guaranteed to
have a non-null value.
-
All predefined
EventRecognizer constants can now be found in the same class, EventRecognizers, which improves discoverability. In addition, their names now follow the
platform conventions, i.e. they are formulated in the present tense and use the same wording as corresponding input
events.
Similarly, the events on CanvasControl which are related to input devices
now have the same consistent names.
-
The
CanvasControl.ContentRect property is now named ContentBounds to make its purpose more clear. The UpdateContentRect method has been renamed likewise.
-
It is now possible to have more than one
BridgeManager. This allows you to have
different types of bridges on different types of edges.
-
GraphControl now uses GraphViewerInputMode as the
default InputMode for basic graph exploration.
Bug Fixes
-
Fixed an issue where a sequential animation would break when the preferred duration was set to zero.
-
Fixed
GraphOverviewControl rendering issues with HighDPI
displays in conjunction with display scaling.
-
Changing
CanvasControl.Zoom property value no longer changes the viewport center, if
the control's Projection and Scale are set to non-default values.
Rendering
New Features and Improvements
-
The new
ObjectRendererBase class allows conveniently implementing the IObjectRenderer interface.
-
New classes formalize the data passed as
RenderTag to implementations of IObjectRenderer.
-
The new
PortCandidateRenderTag class will be passed as render tag for port
candidates.
-
The new
MarqueeRenderTag class will be passed as render tag for the marquee
rectangle renderer of the MarqueeSelectionInputMode class.
-
The new
LassoRenderTag class will be passed as render tag for the lasso path
renderer of the LassoSelectionInputMode class. The new LassoPathState enum defines the current state of the lasso selection path in this
class.
-
The new
LabelCandidateRenderTag class will be passed as render tag to the label
candidate renderer of the LabelPositionHandler.
-
The new
VoidObjectRenderer.Instance constant provides a singleton renderer that
renders nothing.
-
Added properties
IntermediateToWorldTransform and ViewToWorldTransform to IRenderContext.
-
Hatch brushes are scaled on high-resolution displays.
Selection, Focus, Highlight
New Features and Improvements
-
The new
Domain property on the HighlightIndicatorManager class matches the Domain
property on the SelectionIndicatorManager class and allows automatic removal of
highlights no longer present in the domain.
-
FocusIndicatorManager supports a new policy that will only show the keyboard focus
indicator, when the user is actually using the keyboard to manipulate the focus.
Styles
New Features and Improvements
-
New styles that are based on the composition design pattern make it easier to combine existing styles into a single
item visualization. These styles are available for all graph items via the
CompositeNodeStyle, CompositeEdgeStyle, CompositeLabelStyle, and CompositePortStyle classes.
-
Similarly, new styles that are based on the delegation design pattern make it easier to implement custom styles that
extend an existing style. For this, derive your style implementation from the
DelegatingNodeStyle, DelegatingEdgeStyle, DelegatingLabelStyle, or DelegatingPortStyle class.
-
The new
ShapePortStyle class displays ports as geometric shapes and supports the same
shapes as the ShapeNodeStyle class.
-
The
Arrow class now supports more types and features. In particular:
-
There are three new shapes that are similar to what is available in common drawing apps:
ArrowType.Chevron, ArrowType.Deltoid, and ArrowType.Kite.
-
The width and height can now be scaled independently from each other.
-
An arrow can now specify whether the end of the edge the arrow belongs to should be cropped at the port or at
the boundary of the port's owner. This alleviates the need to use
PortDecorator.EdgePathCropper for this.
-
The new
PathEdgeStyleBase class simplifies using a complex GeneralPath as the edge path of a style. Subclasses only have to create the path while the
style already handles the visualization, including placing arrows and bridges. Several callback methods can be
overridden to customize the behavior.
-
The
ShapeNodeStyle class now supports more shapes, namely Pentagon, OctagonStanding, TrianglePointingLeft, and TrianglePointingRight. These shapes are also available as TextWrappingShape.
-
Node shapes that are stars or arbitrary polygons are now easy to implement with new factory methods of the
GeneralPathNodeStyle class.
-
LabelStyle now trims text (and shows ellipsis) when text wrapping and text trimming is
used with rectangle shapes. Previously, DefaultLabelStyle used Forms' native support
for trimming and wrapping for rectangle shapes which could lead to clipped text.
-
LabelStyle now trims large text at words, with an ellipsis by default.
-
LabelSTyle now only includes entire lines in its bounds by default.
-
The
IconLabelStyle now has a default icon size of 24x24 instead of empty, such that
the icon is always visible.
-
The new
GetLassoTestable method of the interfaces INodeStyleRenderer, IEdgeStyleRenderer, ILabelStyleRenderer, and IPortStyleRenderer is similar to
the existing GetMarqueeTestable method, so marquee and lasso selection do no
longer differ in the ways the testable is retrieved.
-
The
CollapsibleNodeStyleDecorator class positions and styles the button now closer to
what GroupNodeStyle does to achieve a more modern look.
-
Group nodes and nodes with
GroupNodeStyle now have more useful default port
candidates. Either four candidates, one in each cardinal direction, for group nodes with GroupNodeStyle. Or a single central port for folder nodes with a GroupNodeStyle.
-
ShapeNodeStyle now considers the pen thickness when rendering rectangle, round
rectangle and ellipse shapes, i.e. the pen is rendered half inside and half outside the node bounds, like for the
other shapes.
Bug Fixes
-
The intersection calculation for
RectangleNodeStyle has been corrected for some
previously failing edge cases that resulted in edges ending in mid-air or disappearing.
-
The selection, highlighting and focus visualization of edges using
BridgeEdgeStyle or
ArcEdgeStyle no longer disappears too early if the edge path is only partially in the
viewport.
-
The following node styles now consider the pen thickness in the visibility test:
ShapeNodeStyle, ArrowNodeStyle, GeneralPathNodeStyle, GroupNodeStyle, and RectangleNodeStyle.
-
LabelStyle's GetPreferredSize now correctly
calculates the preferred height for label text consisting of multiple lines of text when some kind of text trimming
is used. Previously, the more lines of text there were, the higher the chance was for some lines being cut off,
because the calculated height was to small.
Interaction
New Features and Improvements
-
The
MoveInputMode class now also handles moving labels, thus the MoveLabelInputMode has been removed.
-
The new
PointerLongPress event is available for all pointer input types and
replaces the previous touch-specific long press API.
-
The new
PointerLongRest event is raised when the pointer stays still for a
configurable amount of time during a move or drag gesture.
-
All events of an
IInputMode which report creation of, changes to, or deletion of model
items now have arguments of type InputModeItemEventArgs or InputModeItemChangedEventArgs. This type provides the affected item and the IInputModeContext for the involved input mode.
-
The keys to modify the gestures of various input modes have been adjusted to better match those of other often used
applications:
-
To temporarily disable snapping during edge creation, moving, or resizing items, the
Alt key can
now be pressed instead of the Ctrl key.
-
When resizing a node using its reshape handles, the
Ctrl key instead of the Alt key
can be pressed to keep the center of the reshaped node.
-
To reparent a node to another parent during a drag gesture, the
Ctrl key has to be pressed instead
of the Shift key.
-
Elements can now be moved without selecting them first.
-
The new
CreateEdgeInputMode.MinimumSelfLoopBendCount property allows for specifying
the number of bends an edge must at least have before it can be created as selfloop.
-
The new
CreateEdgeInputMode.ShowStartPortCandidateDelay property allows for
specifying a delay after which start port candidates are displayed when the user hovers over a start port candidate
owner.
-
The new
GraphEditorInputMode.MovableUnselectedItems property allows for defining
items which can be moved without selecting them first. The MovableUnselectedItemsPredicate property can be used for closer specification.
-
The
CanvasControl's event system is now based on the PointerEvent API instead of mouse and touch events. This enables to support stylus devices
and allows for handling different input devices in a more uniform way.
-
The new
CreateEdgeInputMode.EdgeDirectionReversed event and the new CreateEdgeInputMode.OnEdgeDirectionReversed method are triggered when the direction of
the edge creation changed during edge creation.
-
The event
ItemsCopied on GraphViewerInputMode
and the events ItemsCopied, ItemsCut,
ItemsPasted, ItemsDuplicated, and DeletedSelection on GraphEditorInputMode now use
ItemsEventArgs providing the items that are the subjects of the events.
-
The new
GraphEditorInputMode.SetNodeLocation method uses the IPositionHandler of a node to change its location, and this way also adjusts the attached
orthogonal edges and the position of child nodes if the given node is a group node.
-
Reconnecting edges to other nodes is now allowed per default.
-
The
IHitTester interface has been changed to support faster hit testing. The generic
type has been removed. Instead, a GraphItemTypes parameter has been added that is used
to reduce hit tests to the specified item types.
-
The new
HandleType.Void enum value makes a handle invisible and excludes it from hit
testing.
-
The new
GraphEditorInputMode.CreationSelectableItems property allows you to specify
GraphItemTypes which should be selected after creation.
-
Moving items interactively now supports constraining the move gesture to an octilinear direction. This constraint is
used when pressing the
Shift key while dragging the items.
-
Marquee and lasso selection have been enhanced to support multiple selection policies. While the default gestures
replaces the selection, pressing the
Ctrl , Shift , or Alt modifier during
the gestures extends, subtracts or toggles the current selection with the elements in the marquee or lasse area.
-
Edge creation now supports constraining the current edge segment to use an octilinear direction. This constraint is
used when pressing the
Shift key while dragging the pointer.
-
The
PointerEventArgs.Handled property has been added that can be used to set and
detect if another listener already handled the event.
-
A
SnapResult.Pen property has been added that can be used to suggest a custom pen to
the SnapResult.ObjectRenderer.
-
The
IncreaseZoom and DecreaseZoom commands now also
support Point and PointF as parameter.
-
Renamed
GraphEditorInputMode HandleClickHandler method to
HandleClickListener to match the name of the IClickListener interface.
-
If a
Wheel event is handled by code, the default behavior (zoom/scroll) will be cancelled.
-
Commands handled by
yFiles.NET can now be executed on a GraphControl using corresponding constants from the Command enum. GraphControl provides methods such as ExecuteCommand and
CanExecuteCommand, along with the CanExecuteCommandChanged
event, for this purpose. This presents an additional execution pathway while retaining the ability to use the
original commands as usual.
-
KeyboardInputMode's methods AddCommandBinding,
AddRecognizerBinding, and AddKeyBinding
now return a token which can be used to remove that binding.
-
The
IInputMode API has been updated for clarity: the InputMode property has been removed from the interface. Instead, most
implementations now offer the protected ParentInputModeContext property to
clearly indicate its role as the input mode's parent context. Most input modes can create a context which can be
passed to dependents via the protected CreateInputModeContext method. The
created context has the input mode set as the parent input mode. The new InputModeContext class may be used by implementations to conveniently create new contexts.
-
When using the
GraphViewerInputMode, the viewport can now be moved by either dragging
with the left or middle mouse button.
-
When using the
GraphEditorInputMode, the viewport can now be moved by either dragging
with the middle mouse button or by dragging with the left mouse button when pressing the Ctrl or
Space key.
-
Several default keyboard shortcuts have been adjusted to more widely used ones:
-
Ctrl+0 or Alt+0 sets the zoom to 100%.
-
Alt+1 fits the content in the view.
-
Alt+2 brings the selection into the view.
-
Alt+3 brings the current item into the view.
-
Ctrl+Plus increases the zoom value.
-
Ctrl+Minus decreases the zoom value.
-
Alt+Left collapses a selected group node.
-
Alt+Right expands a selected folder node.
-
Alt+Up exits the current folder node.
-
Alt+Down enters the current folder node.
-
Alt+Shift+Left or Alt+Shift+Right toggles the expansion state of a selected group or
folder node.
-
The new
Command.ZoomToSelection zooms to the bounding box around all selected items. It
can be triggered by the keyboard short cut Alt+2.
-
Lowered the
MoveViewportInputMode.Priority to 105 to make viewport
panning with CTRL or SPACE modifiers easier in dense graphs.
-
The new
DropInputMode.AcceptDrag method is called on DragEntered events and determines if the mode will handle subsequent drag and drop
events. Previously, this was the responsibility of the DropInputMode.AdjustEffect
method . Now, AdjustEffect only changes the drag/drop effect of the given
event args as its name implies.
-
Edge creation can now be cancelled by ending the gesture over the source node.
-
Edge creation is canceled if the
GraphControl loses the focus.
-
GraphViewerInputMode's and GraphEditorInputMode's ClickHitTestOrder now reflects the z-Order of the elements. By enabling SkipHitLabels (the default) elements behind labels can still be prioritized over
the labels.
-
LabelDropInputMode now consults the IEditLabelHelper of
possible drop targets when dragging and dropping labels.
-
Command handling has been improved: The previous
ICommand, inspired by WPF's commands,
has been replaced with an enumeration of primary input gestures called Command. GraphControl now manages the execution of commands:
-
GraphControl.ExecuteCommand runs the specified command with an optional parameter.
-
GraphControl.CanExecuteCommand indicates whether the specified command can be
executed.
-
The
CanExecuteCommandChanged event is triggered when the executable state of a
command has changed.
-
OverviewInputMode now uses the CanvasControl's MouseWheelZoomEventRecognizer to determine if the used performed a zoom gesture.
-
GraphEditorInputMode now allows for starting label editing just by starting to type.
The AllowEditLabelOnTyping property can be used to configure this setting,
which is turned on, by default.
-
The default gesture for label editing has been updated to also trigger when the user hits the `Enter` key.
-
The
ClickInputMode.Clicked event is now raised also for double-clicks and
multi-clicks. Clicking multiple times in the same location increments the ClickEventArgs.ClickCount by one for each click.
-
The
HandleIsHit and GetClosestHitHandle
methods of HandleInputMode now have an additional parameter which specifies the PointerType of the related user gesture.
-
MoveViewportInputMode now gracefully handles concurrent programmatic viewport
modifications.
-
Starting edge-creation from a child node inside a group node now does not immediately snap to the parent when moving
over the group nodes content. Instead, it only snaps to the closest port when hovering the tab or stroke.
-
The sub-input modes of
GraphViewerInputMode and GraphEditorInputMode can now be replaced while the input mode is installed.
-
The new
GraphViewerInputMode.HitTester property works in the same way as the GraphEditorInputMode.HitTester property.
-
The
GraphEditorInputMode.DuplicateSelection method now also dispatches MultiSelectionStarted and MultiSelectionFinished events.
-
NavigationInputMode now interprets the direction of arrow keys in view coordinates by
default. Previously the default settings could lead to surprising behavior when combined with a Projection on GraphControl.
-
The
GraphInputMode.FindItems method now considers the actual z-order of the hit
items.
-
The
GraphInputMode.ItemClicked event and the cyclic selection now consider the
actual z-order of the hit items at the cursor location. Bends and invisible ports are now properly taken into
account and hit before their owners.
-
The rendering order of visuals created by an
InputMode now corresponds to the
input mode's Priority. In other words, visualizations of input modes with a
smaller priority value (= higher priority) are drawn on top.
-
The
GraphEditorInputMode.OrthogonalEdgeEditingContext property is now set and
enabled per default and may not be null anymore. Edges can be individually configured to be edited
orthogonally by providing an apropriate IOrthogonalEdgeHelper in their lookup.
-
For edges using a
PolylineEdgeStyle, the style's new OrthogonalEditing property can be set so such a helper is automatically
provided.
-
To disable orthogonal editing for all edges, the
Enabled property of the
OrthogonalEdgeEditingContext can be set to false.
-
To enable orthogonal edge editing for all edges that don't explicitly forbid this, the
OrthogonalEdgeEditingContext.FallbackEdgeHelperProvider property can be set to a
helper supporting orthogonal edge editing.
-
The
HandleTypes enums has been refactored to a non-flaggable HandleType enum, and the values have been adjusted to those used in the library as well as
some custom variants for individual use.
-
Custom
IHandle implementations can use the new IHandle.Tag property for various purposes, including custom handle visualizations.
yFiles does not use the property and initializes it with null, but decorating handles forwards any
values unmodified.
-
The static member
GraphClipboard.DefaultGraphClipboard has been added and is used
per default as GraphControl.Clipboard. This way copy&paste operations work between
multiple GraphControl instances without the need to set a shared GraphClipboard instance first.
-
The parent node detection of
GraphClipboard has been streamlined.
-
The protected
Should- methods of the input modes have been removed and replaced by predicate
properties. This simplifies adjusting the behavior without the need to subclass the input modes.
-
Toggling the item selection via
Ctrl+Space now prefers toggling the selection state of GraphControl.CurrentItem over deselecting a single selected item.
-
The items reported by the
HandleInputMode.AffectedItems property now include edges
that were modified with the height handle of BezierEdgeStyle and ArcEdgeStyle.
-
New overloads of the
CreateEdgeInputMode.StartEdgeCreation method can be used to
start interactive edge creation from a node or port, respectively.
-
The modifier for using the
ILabelModelParameterFinder during label movement can now be
changed with the LabelPositionHandler.UseParameterFinderRecognizer property.
-
Improved keyboard navigation for graph items.
-
The
MoveInputMode and MoveUnselectedInputMode
properties of GraphEditorInputMode have been renamed to MoveSelectedItemsInputMode and MoveUnselectedItemsInputMode to better describe what they are used for. Associated
properties and methods have been renamed accordingly.
-
Dragging a selected edge doesn't move all its bends anymore which often screwed up the first and last edge segment.
-
The
MouseHoverInputMode has been renamed to ToolTipInputMode to better reflect its function.
Bug Fixes
-
Fixed a possible exception upon
ClickInputMode installation if the DoubleClickTime was set to 0.
-
Fixed a bug in
TextEditorInputMode which prevented setting a custom TextBox via property.
-
Sporadic errors during pinch zoom have been corrected.
-
Toggling the selection of an item using the keyboard now always toggles the selection of the focused item.
Previously, if exactly one other item was selected when toggling, that item was deselected, making it virtually
impossible to select multiple individual items using the keyboard.
To fix this, the behavior of GraphCommands.ToggleItemSelection has been adjusted accordingly, and the behavior the
GraphCommands.SelectItem and GraphCommands.DeselectItem has also been changed accordingly.
-
NavigationInputMode now reliably brings items selected with keyboard navigation into
the view. Previously this only worked for nodes.
-
Fixed an issue where keyboard navigation would stop working when two items were positioned at the same location.
-
The
GraphInputMode.FindItems overload without the context parameter did
not find items correctly.
-
Several members of
EditLabelInputMode could not be overwritten by mistake. The Install, Uninstall, TryStop, and Cancel methods and the Enabled property can now be overwritten.
-
GraphInputMode.FindItems method: when the filter includes both edges and bends, the
edge will no longer be ignored if any of its bends are hit.
-
GraphInputMode.FindItems method: when using GraphItemTypes.All, bends will not be ignored. Furthermore, the interfaces IBendSelectionTester and IPortSelectionTester are properly
queried.
-
GraphInputMode.FindItems method: Ports with a style are no longer reported twice.
-
When moving the viewport in a
GraphControl that has a projection, the inertia now
works in the right direction.
-
Fixed that the
MarqueeSelect and LassoSelect methods of GraphEditorInputMode and
GraphViewerInputMode were called with a wrong input mode context.
-
Fixed occasionally missing auto-scrolling on viewport bounds for touch devices.
-
Key presses are no longer propagated to the canvas's parent control if an input mode requests the keyboard.
Label Editing
New Features and Improvements
-
The API related to label editing has been enhanced by introducing a new
EditLabelInputMode, which is now a subordinate mode of GraphEditorInputMode. The new input mode consolidates the methods, properties, and events
necessary for customizing label editing. The key methods, AddLabel and EditLabel, remain accessible through GraphEditorInputMode.
-
The text editor will now stay open by default if label text validation fails.
-
Each
ILabel and ILabelOwner now includes a default
implementation of IEditLabelHelper in its Lookup. The IEditLabelHelper interface has been
updated to offer greater control over the label editing process.
-
The API related to label editing has been removed from
TableEditorInputMode, except
for the key methods AddLabel and EditLabel. Label editing is now handled through GraphEditorInputMode's EditLabelInputMode.
Snapping
New Features and Improvements
-
The snapping feature has been refactored and enhanced to support more use cases. Previously, items could only snap
to points or orthogonal lines. Now lines with any orientation and circle segments can be defined as references where
items can snap to. Furthermore:
-
Snapping to circles, grids, and specific node sizes has been refactored to work analogue to the snapping to a
SnapLine, so SnapCircle, SnapGrid, and SnapSize instances are created and are
available for the SnapResult providers.
-
Label snapping is now also handled by the
GraphSnapContext, so the LabelSnapContext has been removed. Configuration options have been moved from LabelSnapContext to GraphSnapContext.
-
Additional improvements:
-
The new
GraphSnapContext.AffectedItems property provides the items for which
SnapResults shall be collected.
-
The configuration options of
GraphSnapContext are now easier to use and more
concise.
-
The new protected methods
CollectGridSnapReferences and CollectSameSizeSnapReferences of GraphSnapContext can be overridden to customize the SnapGrid and SnapSize instances items can snap to.
-
The new
SnapReference class is now the base class of SnapLine, and the new SnapGrid, SnapSize, and SnapCircle classes. The new SnapReference.SnappableItems property describes which item types may snap to this
reference.
-
Snap references of all types can be styled with CSS classes.
-
The new
OrthogonalSnapLine.Croppable property is used to decide which snap lines
to crop if GraphSnapContext.CropSnapLines is {}true{}.
-
The new properties
Reference, Item,
and ItemAnchor of the SnapResult class can
be used by the IObjectRenderer for the visualization of the SnapResult.
-
New methods of
ReshapeRectangleContext simplify the calculation of the bounds for
a specified pointer delta or the SnapConstraint necessary to result in a specified
width, height or side location.
Clipboard
New Features and Improvements
Members of GraphClipboard and GraphEditorInputMode with
Element in their name that actually referred to model items were renamed to
Item to clarify their usage.
The GraphClipboard.Paste method now accepts an optional pasteLocation
parameter specifying the center of the bounds of the pasted items.
The events on GraphClipboard now use GraphClipboardEventArgs that provide the current IGraphClipboardContext and the Items.
When moving the viewport in a GraphControl that has a projection, the inertia now
works in the right direction.
GraphClipboard's Cut, Copy, Paste, and Duplicate methods now use an IEnumerable to determine
the subgraph to copy.
GraphClipboard now uses an optimized ClipboardGraphCopier for its clipboard operations instead of the general GraphCopier.
Bug Fixes
-
In certain rare cases, the insertion of edges could end up in an endless loop. This has now been fixed.
Folding
New Features and Improvements
-
The process of configuring edges at folder nodes has been simplified, resulting in a significant reduction in the
number of configuration calls for merged edges.
-
The default implementation for folder nodes and folding edge converters has been enhanced, providing more powerful
capabilities for synchronizing and initializing various aspects with granularity.
-
Collapsed group nodes (folder nodes) can now have different tags from their expanded form (group nodes).
-
Changes made to view states (folder nodes, folding edges) can now be reflected back to the master items. New
methods,
UpdateGroupNodeState and UpdateMasterEdges, have been added to IFolderNodeConverter and IFoldingEdgeConverter,
respectively, for handling these updates.
Bug Fixes
-
Setting the source or target port of an edge to a port at another edge does no longer lead to an exception if the
edge is represented in a managed view (
IFoldingView). Instead, the edge is now removed
from the view.
-
Fixed a bug which could cause an edge in a folding view to be created at different ports as those which were given
as parameters. This could lead to unexpected connections during interactive edge creation in rare cases.
-
Fixed a bug that could lead to an exception when duplicating a port on the
GraphClipboard if it is duplicated.
-
Fixed a bug which caused changing the ports on an edge whose source or target node is collapsed being reverted after
subsequent collapsing and expanding.
-
Label changes on folder nodes are no longer reverted by
FolderNodeConverter if labels
are copied between master and view node.
View-Layout-Bridge
New Features and Improvements
-
LayoutExecutor can now automatically create port constraints for edges at ports that
use a CompositePortLocationModel. For all parameters added to a CompositePortLocationModel, a fixed port candidate is created. The cost, capacity, and
PortSide of this candidate can be specified when adding the parameter to the model.
-
With the new
ItemMapping.Dictionary property, a dictionary can be used to specify an
ItemMapping.
-
The
LayoutExecutor.TableLayoutConfigurator feature now uses more flexible placements
for nodes that don't belong to any table node.
Bug Fixes
-
The
LayoutExecutor and LayoutGraphAdapter classes now
correctly assign port group IDs to edges that connect to the same port. Previously, in some cases involving ports
with a single incoming and outgoing edge, the port group IDs were omitted, which could cause incorrect layout
results (such as diagonal segments instead of orthogonal ones).
Layout
New Features and Improvements
-
LayoutPortCandidates now have a MatchingId. When
finding matching LayoutPortCandidates at nodes and for edges, two LayoutPortCandidates can only match if their MatchingId properties are equal.
-
The
LayoutAnchoringStage class (previously called FixNodeLayoutStage) now allows using not only nodes but also edges and labels to anchor
the graph's position.
-
The new
NodeAnchoringPolicies, EdgeAnchoringPolicies, NodeLabelAnchoringPolicies and EdgeLabelAnchoringPolicies properties specify which part of the items should
be used to calculate the anchor point.
-
The new
LayoutExecutor.AnchoredItems property specifies the graph items used to
anchor the graph's position.
-
The
ComponentLayout has now the ability to specify which layout to apply to individual
components using ComponentLayoutData.ComponentLayouts property. Additionally, edges
between components can be routed using a router set via ComponentLayout.InterEdgeRouter.
-
It is now possible to specify multiple layout grids for a graph (previously called
PartitionGrid). This is made possible by the new LayoutGridCellDescriptor.LayoutGrid property. This way it is no more required to set the
global layout grid with the LayoutGridData.Grid property. If a node is to be placed
in a grid but not in a specific cell, this can now be achieved using the new LayoutGrid.CreateDynamicCellDescriptor method. Be aware that many layout algorithms like
HierarchicalLayout don't support multiple layout grids.
-
The
LayoutData classes are now generic and can be used for items of a LayoutGraph, too. Of course, it's still possible to use LayoutData with IGraph items.
-
LayoutData instances when used with IGraph typically
need INode, IEdge, ILabel, and ILabel as their type arguments.
-
LayoutData instances when used with LayoutGraph
typically need Node, Edge, NodeLabel, and EdgeLabel
as their type arguments.
-
Instances of
LayoutData classes can be created via factory extension methods on
the layout algorithm themselves, for example, HierarchicalLayout.CreateLayoutData. Depending on the type of graph that is provided
as the argument, the correct data instance will be created.
-
The API around the
LayoutGraph class has received a major rework. The LayoutGraph is the only remaining graph implementation for the layout analysis part.
Classes Graph (previously used for graph analysis, only) and CopiedLayoutGraph have been removed and functionality was moved to LayoutGraph.
-
The API has been made more similar to the API of the
IGraph with
respect to creation, modification and access to nodes, edges and labels.
-
Low-level data types like
NodeList and EdgeList have
been removed as well as cursor for iteration over the elements.
-
Properties
NodeCount and EdgeCount
have been removed. Query the size of the Nodes and Edges properties instead.
-
Layout information about items must no longer be queried from the graph instance (e.g. previously with methods
like
LayoutGraph.GetLayout). It is now accessible on the items
itself and is also mutable, see Node.Layout property.
-
The edge path information is no defined by properties on the edge, most importantly these are
SourcePortLocation, TargetPortLocation
and Bends.
-
Labels of nodes and edges are now accessed via a property on the respective owning item. To add labels, use
LayoutGraph.AddLabel method. The complicated ILabelLayoutFactory that covered that use case in the past has been removed.
-
Hiding items is no longer possible via the graph itself. To do so, use the helper
LayoutGraphHider class.
-
The
Graph.ContainsEdge method has been removed in favor of LayoutGraph.GetEdgesBetween. The same holds for the Node.GetEdgeTo and Node.GetEdgeFrom methods.
-
Convenience properties like
Node.Neighbors have been removed. Instead, query all
edges (using the Edges property) and filter the required adjacent nodes manually.
-
To copy a
LayoutGraph instance, the new LayoutGraph.CreateCopy method has been added.
-
If a
LayoutGraph without coordinate/path information is needed (to optimize memory
performance), it can be created using the factory LayoutGraph.CreateStructureGraph method.
-
LayoutExecutor now supports arranging graphs without a GraphControl.
-
The thread started when
LayoutExecutor.RunInThread is true is now a background thread and thus long-running layout calculations no longer block
the process from exiting.
-
The new
LayoutGraph.GetEdgesBetween method returns all edges between two nodes.
-
The
PortPlacementStage now computes cost-minimal matchings between port candidates at
nodes and edges.
-
Most layouts now support port grouping and port candidates at nodes and edges. These features are implemented
through a post-processing step using the
PortPlacementStage, rather than being
natively integrated into the layouts. As a result, the quality may be poor.
Bug Fixes
-
The
CurveFittingStage now correctly respects the maximum error. Previously, it
sometimes produced curves that violated the maximum error.
-
The
LineSegment.GetIntersection method no longer produces incorrect results when the
specified epsilon is zero. Previously, there were some edge cases where the algorithm failed to detect an
intersection and returned null instead.
-
Added the protected
ParallelEdgeRouter.HideMultiEdges method, which is required to
meaningfully overwrite the existing protected ParallelEdgeRouter.FindAndHideMultiEdges method.
-
The
PortPlacementStage now correctly considers port candidates together with port
groups.
Hierarchical Layout
New Features and Improvements
-
The
HierarchicalLayout class now supports defining minimum distances between the
ports. They can be specified per node side using the HierarchicalLayoutNodeDescriptor.MinimumPortDistance property. The node size is
increased if necessary in order to accommodate the minimum distances.
-
The Hierarchical Layout class now supports aligning the ports of edges incident to the same node, that is, the ports
are placed at the same x- or y-coordinate. This can be particularly useful to visualize paths in a graph. Which
ports to align is specified by the new properties
PortData.SourcePortAlignmentIds
and PortData.TargetPortAlignmentIds accessible via HierarchicalLayoutData.Ports.
-
The
HierarchicalLayout now produces fewer bends for multi-edges with labels when
integrated edge labeling is enabled.
-
The
HierarchicalLayout class now produces better results for graphs with tabular
groups where all children have a fixed user-specified order.
-
The routes of self-loops now consider both node and edge labels preventing overlaps if possible.
-
The ports of edges with free ports are no longer placed at the same location as fixed ports, which previously could
happen if multiple edges had the same fixed port.
-
The
HierarchicalLayout no longer produces overlapping edge segments if there are
grouped edges with different thicknesses values. Previously, the user had to ensure that all these edges use the
same thickness.
-
In barycenter mode the
HierarchicalLayout now enforces a more symmetric placement of
the nodes that are part of chains or height-2 trees.
Bug Fixes
-
The
HierarchicalLayout class no longer produces an error when using a non-zero grid
distance in combination with incremental mode's exact coordinate hints.
-
The
HierarchicalLayout class no longer assigns superfluous space to group nodes if
there are grouped edges.
-
The
HierarchicalLayout algorithm now correctly handles node and edge labels with width
or height set to negative values. Previously, large negative values may have caused exceptions.
-
The
HierarchicalLayout class now always places aligned ports correctly in from-sketch
mode.
-
Instances of
LayerConstraintData and SequenceConstraintData that are configured with comparables can now be reused for multiple
layout calculations.
-
The
HierarchicalLayout class no longer produces an error for labeled graphs with port
alignment constraints when the integrated edge label placement is enabled.
-
The
HierarchicalLayout class no longer produces superfluous crossings between
backloops or same-layer edges in the first or last layer.
-
The
HierarchicalLayout now properly handles self-loop edges when the edge is at a
group node and furthermore edge/port grouped with the same ID on both sides. Previously, it was not routed correctly
or that it was removed from the LayoutGraph instance when running the layout algorithm
directly on the graph instance without using a copy.
-
The
HierarchicalLayout class no longer swaps the position of fixed nodes in
incremental layout mode with user-specified sequence constraints.
-
The
HierarchicalLayout class no longer produces superfluous crossings for some graphs
with group nodes in incremental layout mode.
-
Edges between two subcomponents now correctly consider fixed any-side port candidates.
-
The
HierarchicalLayout class no longer produces very long edge segments for some input
graphs containing groups with node halos and polyline edge routing.
-
The
HierarchicalLayout class no longer throws an exception for graphs with bus
structures if the algorithm runs in incremental mode and the group transposition feature is enabled.
-
The
HierarchicalLayout class no longer produces intertwined edge routes with many
superfluous crossings and bends for some cases with sequence constraints PlaceAtHead or PlaceAtTail. The problem
mainly occurred with graphs with groups or PartitionGrid and incompatible sequence
constraints.
Tree Layout
New Features and Improvements
-
Added the new
TreeLayout.FromSketchMode property to consider the initial coordinates
of the graph elements. This has an effect only if the used subtree placers implement IFromSketchSubtreePlacer.
-
Added the
TreeLayoutData.MultiParentDescriptors property that allows to specify
style information for multi-parent structures.
-
The
TreeReductionStageData class now offers NonTreeEdgesResult property. It allows to conveniently query the set of edges that
the stage actually selected as non-tree edges.
-
The
TreeLayout now considers minimum last segment lengths no matter on which side the
port shall be placed.
-
The
AspectRatioSubtreePlacer now supports minimum first and last segment lengths.
-
The
SingleLayerSubtreePlacer supports placing the subtree root centered with respect
to the ports at its children with the new enum value SingleLayerSubtreePlacerRootAlignment.CenterOfPorts.
-
All subtree placers that used
Tree.RootAlignment support placing the subtree root
centered above the ports with the new value CenterOfPorts.
-
The
LeftRightSubtreePlacer now supports minimum segment length, which can be set with
the properties MinimumFirstSegmentLength and MinimumLastSegmentLength.
-
The
AspectRatioSubtreePlacer now supports multiple variants how to place the root node
with respect to its children, which can be set using the properties ChildArrangement and RootPlacement.
-
Added properties of
TreeReductionStageData directly to the LayoutData of tree layouts, including RadialLayoutData,
AspectRatioTreeLayoutData, RadialTreeLayoutData, and
TreeLayoutData.
Bug Fixes
-
The
TreeLayout class no longer ignores the initial locations for some subtree placers
if the FromSketchMode property is enabled.
-
The Tree Layout now automatically places edge labels of the parallel edges handled by its
ParallelEdgeRouter instance, when integrated edge labeling is enabled.
-
The
TreeLayout class no longer produces broken edge routes for some input graphs with
multi-parent structures.
-
The
AspectRatioSubtreePlacer class no longer ignores the specified AspectRatioSubtreePlacer.ChildAlignmentPolicy for some specific setups (e.g., if all
children are leaves and have the same size).
Orthogonal Layout
New Features and Improvements
-
The newly added
OrthogonalLayout.QualityTimeRatio property allows controlling the
layout quality by automatically enabling/disabling additional optimization steps.
-
The
OrthogonalLayout algorithm now supports specifying edges that should be routed
against the main layout orientation in addition to the option to route with the main layout orientation. See OrthogonalLayoutData.EdgeOrientation property.
Bug Fixes
-
The Orthogonal Layout now automatically places edge labels of the parallel edges handled by its
ParallelEdgeRouter instance, when integrated edge labeling is enabled.
Edge Router
New Features and Improvements
-
The quality of edge routing for buses is improved.
-
If
EdgeRouter is run with the buses feature and a limited duration, it now splits the
available time amongst buses, meaning that it will not get "stuck" on a single bus, which could otherwise impact the
quality of the remaining buses and non-bus edge routings.
Bug Fixes
-
The
EdgeRouter now prefers to use fixed port candidates that are not overlapped by
other nodes.
-
The
EdgeRouter class no longer produces uncovered buses. Previously, there were some
rare cases where the specified bus edges didn't constitute a bus.
-
When routing edges to and from fixed ports in the interior of group nodes, other nodes in the group are not ignored
anymore, so that the edge does not overlap them if possible.
Labeling
Bug Fixes
-
The
GenericLabeling algorithm now correctly considers the case where model parameters
of a CompositeLabelModel have different weight values. Higher weights are preferred.
-
The
EdgeLabelCandidates.BuildCandidates method does no longer return
null for some setups with free edge label models. Instead it returns an empty IEnumerable now.
-
The
GenericLabeling class now produces less node-label overlaps.
Organic Layout
New Features and Improvements
-
The performance for the
OrganicLayout has been substantially improved for large graphs
without group nodes. The improvement is triggered if no special constraints are defined and no shape recognition is
enabled.
-
The
OrganicLayout now supports different styles for group substructures, which are set
via the GroupSubstructureStyle property.
Bug Fixes
-
The Organic Layout now automatically places edge labels of the parallel edges handled by its
ParallelEdgeRouter instance, when integrated edge labeling is enabled.
-
The
OrganicLayout class no longer ignores the preferred edge length in incremental
layout mode with a single affected element.
-
Fixed an issue that may have automatically disabled the component layout when using constraint-based features.
Radial Tree Layout
New Features and Improvements
-
Added data key
OutEdgeComparisonDataKey to RadialTreeLayout class (formerly BalloonLayout).
Series-parallel Layout
Bug Fixes
-
The Series Parallel Layout now automatically places edge labels of the parallel edges handled by its
ParallelEdgeRouter instance, when integrated edge labeling is enabled.
Partial Layout
New Features and Improvements
-
PartialLayout now supports specifying inversely directed edges in addition to
undirected and directed edges.
Bug Fixes
-
PartialLayoutScopeData will no longer mark any edges as affected when only nodes are
specified to be in scope, nor mark any nodes as affected when only edges are specified to be in scope.
Tabular Layout
New Features and Improvements
-
The new
TabularLayoutData.LayoutGridData property makes it easy to query the cell to
which a node was assigned to by the TabularLayout class after applying it.
Bug Fixes
-
The layout algorithms do no longer throw an Exception when a
LayoutGrid including a
mapping from nodes to LayoutGridCellDescriptors is defined and if algorithm
TabularLayout was executed before with LayoutMode AutoSize or FromSketch. In these modes the TabularLayout
automatically assigns cells to nodes so that any mapping defined prior will be ignored now.
Component Layout
New Features and Improvements
-
ComponentLayout now supports NodeMargins
(formerly NodeHalos) for each ComponentArrangementStyle other than None and KeepCenters.
Algorithms
New Features and Improvements
-
The
LongestPath algorithm now uses double values instead of integers for edge
traversal costs. This improves the Paths, LayoutGraphAlgorithms, and LongestPath classes.
-
The
LayoutGraphAlgorithms.FindCycleEdges method has been improved and now requires
fewer edges to be reversed. In addition, a new, even better but slower heuristic can be enabled with a new optional
parameter.
Bug Fixes
-
The
Intersections class does not dispose FilteredGraphWrapper instances that it is
given with no subgraph nodes or edges specified anymore. Previously, this caused the graph instance to become defunct,
resulting in various operations running into null fields and properties,
generating exceptions that were non-trivial to understand.
-
IntersectionsResult no longer includes intersections that have no actual intersection
points. This issue occurred when two graph elements were within a small epsilon distance of each other.
Analysis
New Features and Improvements
-
The
KShortestPaths class has a new implementation of the k-shortest path algorithm
that allows for the exclusion of non-simple paths (i.e., paths with repeating vertices). Previously, these paths
could not be excluded. The new implementation is used by default and can be disabled with the SimplePaths parameter.
-
For usage with a
LayoutGraph, the algorithm is also available via the LayoutGraphAlgorithms.KShortestPaths method.
Geometry
New Features and Improvements
-
The new
GeneralPath.AreaOrPathContains method tests if the path fuzzily contains a
point and can be used for hit-testing a GeneralPath.
-
All methods on the
GeneralPath class that accept points now have overloads for IPoint and PointD, and all methods that accept rectangles
now have overloads for IRectangle and RectD.
-
There are now methods on
RectD and PointD to calculate
the distance between points and rectangles.
-
The
GeneralPath.GetProjection method is now faster for paths with Bezier segments.
-
The
IRectangle interface no longer implements IPoint. As
a consequence, it is no longer possible to inadvertently use rectangles as parameters for methods that expect a
point. You can still easily get the top-left corner of a rectangle with its GetTopLeft method. Similarly, IMutableRectangle no
longer implements IMutablePoint.
Bug Fixes
-
Fixed a potential
NullReferenceException in GeneralPath.Render.
-
The
GeneralPath.PathMayIntersectClip method has been corrected for paths with
multiple segments, at least one of which is a cubic segment.
-
The
SizeD.Area property now returns 0 for empty sizes. This is consistent with the
behavior of the RectD.Area property.
Incompatible Changes
Categories:
General
Graph
Controls
Rendering
Selection, Focus, Highlight
Styles
Interaction
Snapping
Clipboard
Folding
Lookup
GraphML
View-Layout-Bridge
Layout
Layout Data
Hierarchical Layout
Tree Layout
Orthogonal Layout
Edge Router
Labeling
Organic Layout
Interactive Organic Layout
Circular Layout
Radial Layout
Radial Tree Layout
Radial Group Layout
Series-parallel Layout
Compact Disk Layout
Multi-page Layout
Partial Layout
Tabular Layout
Component Layout
Tree Map Layout
Recursive Group Layout
Layout Grid
Other Layouts
Algorithms
Analysis
Collections
Geometry
General
Incompatible API Changes
-
The minimum required .NET versions for yFiles are .NET Framework 4.6.2 and .NET 6.0, respectively.
-
The minimum supported .NET versions for the Layout package are now .NET Standard 2.1 and .NET Framework 4.6.2.
-
The (up to three) assembly files of the yFiles library are now combined into one single file.
-
The following classes are now sealed:
BorderLineSegment, LayoutGridCellDescriptor, LabelScopeData, ItemCollection, ItemMapping, FreePortLabelModel, and FreeNodeLabelModel. They either
already had an internal constructor or do not offer any meaningful members for overriding.
-
Removed the
Default prefix from the names of the following types: DefaultEdgePathCropper, DefaultFoldingEdgeConverter, DefaultFolderNodeConverter, DefaultLabelStyle, DefaultObservableCollection, DefaultPortCandidate, and DefaultSelectionModel.
-
Removed
DefaultLabelModelParameterFinder.
-
Removed the protected
IgnoreModifierKeyRepeats property from CanvasControl.
-
Removed the
StripeSelection class. Instead, use the instance returned by the TableEditorInputMode.StripeSelection property.
-
Consistently use names
Padding and Margins in member names:
-
Renamed the
TextEditorInputMode.TextBoxPadding property to TextBoxMargins.
-
Renamed the
IndicatorLabelStyleDecorator.Padding property to Margins.
-
Renamed the
IndicatorNodeStyleDecorator.Padding property to Margins.
-
Renamed the
GraphEditorInputMode.ContentRectMargins property to ContentMargins.
-
Renamed the
OverviewInputMode.Margins property to ContentMargins.
-
Renamed the
ViewportAnimation.TargetBounds property to Target.
-
Renamed the
ViewportAnimation.TargetViewMargins property to TargetMargins.
-
Renamed the
StripeLabelModel.UseActualInsets property to UseTotalPadding.
-
Renamed the
StretchStripeLabelModel.UseActualInsets property to UseTotalPadding.
-
Renamed the
IStripe.GetActualInsets method to GetTotalPadding.
-
Renamed the
GroupNodeStyle.ContentAreaInsets property to ContentAreaPadding.
-
Renamed
Insets properties of all ILabelModel
implementations to Margins.
-
Replace name part
Insets of other types and members with Padding.
-
Removed the
BridgeManager.ClipMargin property.
-
Sealed the following classes which have no inheritors:
-
all classes in the
yWorks.Algorithms namespace.
-
all classes extending the
EventArgs class.
-
all implementations of the
ILabelModel and IObjectRenderer interfaces.
-
Enum values that followed the
North, East, South, West naming convention have been renamed to follow a Top, Right, Bottom, Left naming convention. In
particular, the values of the following enums have been renamed: HandlePositions,
EdgeSegmentDirection, LabelModels.Position, LabelModels.Position, LabelModels.Position, LabelModels.Position, and LabelModels.Position,.
-
The
IReadOnlyList<T> interface replaces the IListEnumerable<T> interface, which has been removed along with its related
classes ListEnumerable<T> and ListEnumerableExtensions.
-
Renamed the
PortSide enum to PortSides.
-
For consistency reasons, the property
WeakDictionaryMapper.Empty is now called IsEmpty.
-
Renamed the
CreateEdgeInputMode.AllowSelfloops property to AllowSelfLoops.
-
Renamed the
GraphEditorInputMode.SelectNodeAndSelfloopBends method to SelectNodeAndSelfLoopBends.
-
Renamed the
GraphEditorInputMode.AutoSelectSelfloopBends property to AutoSelectSelfLoopBends.
-
Renamed the
IEdge.IsSelfloop method to IEdge.IsSelfLoop.
Graph
Incompatible API Changes
-
The
ILookup interface and its extension methods have been moved to the yWorks.Utils namespace.
-
The
IMapper interface, the Mappers, DictionaryMapper,
and WeakDictionaryMapper classes have been moved to the yWorks.Utils namespace.
-
The
GraphClipboard.IsDummy method has been renamed to IsHelper.
-
Method
GroupingSupport.GetPathToRoot has been renamed to GetAncestors and returns an IReadOnlyList instead of
an IList.
-
The
owner parameter of the ITable.CreateRow, CreateColumn, and SetParent methods has been
renamed to parent.
-
The structural properties of graph items (
IEdge.SourcePort, IEdge.TargetPort, ILabel.Owner, IPort.Owner, IBend.Owner) now throw exceptions if
accessed for items that are no longer in the graph. If it is unknown whether the item is still in the graph, please
test the item with HasOwner or HasSourceAndTargetPort first before accessing these properties.
-
IEdge's GetSourceNode and GetTargetNode methods now throw exceptions if called for an edge that is no longer
in the graph or if the owner of the edge's source or target port is not a node.
-
The classes
DelegateUndoUnit and CompositeUndoUnit have
been removed. The new factory methods UndoUnits.FromDelegate and UndoUnits.Combine can be used instead.
-
The
UndoUnitBase class has been removed. Subclasses now have to implement the IUndoUnit interface instead.
-
GenericPortLocationModel has been renamed to CompositePortLocationModel and doesn't implement IEnumerable
anymore. Instead, the Parameters property can be used to iterate the
parameter.
-
The
SegmentRatioPortLocationModel class is now named EdgeSegmentPortLocationModel, similar to EdgeSegmentLabelModel.
-
The
CreateFromSource and CreateFromTarget methods of the SegmentRatioPortLocationModel and BendAnchoredPortLocationModel are now named CreateParameterFromSource and CreateParameterFromTarget.
-
The
ITagOwner interface is now in the yWorks.Utils
namespace.
-
Removed the
TableAnimation class. Use the factory Animations.CreateTableAnimation method as a replacement.
-
The
GraphItemTypes.NotContains method was removed, use the Contains method instead.
-
The
FreeEdgeLabelModel.CreateEdgeAnchored method has been renamed to CreateParameter.
-
The
FreeNodeLabelModel.CreateDefaultParameter method has been removed and replaced
by the new FreeNodeLabelModel.Center field.
-
The
FreeNodeLabelModel.CreateCanonicalParameter method has been renamed to CreateParameter.
-
The
FreePortLabelModel.CreateDefaultParameter method has been removed and replaced
by the new FreePortLabelModel.Center field.
-
Changes to the
GraphCopier class:
-
The methods
CopyNodeStyle, CopyEdgeStyle, CopyPortStyle, CopyLabelStyle, GetOrCreateCopy, CopyLabelLayoutParameter, and CopyPortLocationParameter have been made protected.
-
The methods
CopyNode, CopyGroupNode,
and CopyEdge have been renamed to CreateNode, CreateGroupNode, and CreateEdge to clarify their role.
-
The
Clone property has been renamed to CloneTypes.
-
The
Copy method now uses an IEnumerable of
items instead of a filter predicate to define the subset to copy.
-
The
ILabelModel.CreateDefaultParameter method has been removed. Instead suitable
other Create*Parameter methods of the concrete label model implementations should be used.
-
The
GenericLabelModel class has been removed. Its functionality has been integrated
into the CompositeLabelModel, which can be used instead.
-
The
CompositeLabelModel.LabelModels property has been removed. Instead of adding
label models to this list, the new AddModel method has to be called.
-
The
ILabelModel parameter of the ILabelModelParameterFinder.FindBestParameter and ILabelModelParameterProvider.GetParameters methods has been removed.
-
The static
LabelModelParameterSerializer and PortLocationModelParameterSerializer classes have been removed. These classes could be
used to retrieve the properties of label model parameters and port location model parameters and are not necessary
anymore as the parameter classes are now public.
-
The
ILabelModelParameter.Supports method has been removed. Instead, the ILabelModel.GetGeometry method may now throw an exception if the label and label model
parameter don't match.
-
The
IPortLocationModelParameter.Supports method has been removed. Instead, the IPortLocationModel.GetLocation method may now throw an exception if the port and port
location model parameter don't match.
-
The
UndoEngine.Token property replaces the UndoEngine.GetToken method.
-
The static parameter fields of
FreeNodePortLocationModel have been renamed analogue to
the static parameter fields in InteriorNodeLabelModel.
-
The
IMapperRegistry interface, the MapperRegistry class,
and the IGraph.MapperRegistry property have been removed. To store additional
information for graph items, either use the item's Tag property or keep a dictionary alongside the graph.
To
configure layout settings for individual items, use LayoutData instead.
-
The label models
ExteriorLabelModel, InteriorLabelModel,
and InteriorStretchLabelModel have been renamed to ExteriorNodeLabelModel, InteriorNodeLabelModel, and StretchNodeLabelModel, respectively,.
Incompatible Behavior Changes
-
The arrow of the default edge style is now
ArrowType.Triangle.
-
The default lookup for
INode doesn't return an IMutableRectangle anymore, the default lookup for IBend
doesn't return an IMutablePoint anymore, and the default lookup for ILabel doesn't return an IMutableSize anymore.
-
The rotation direction of
OrientedRectangle, NodeLabel,
EdgeLabel and FreeEdgeLabelModel is now clockwise to be
consistent with the other models.
-
The default value for the
Padding properties of ExteriorNodeLabelModel, InteriorNodeLabelModel, StretchNodeLabelModel, and StretchStripeLabelModel have been
changed from empty insets to insets with value 2 on each side. This way the label bounds per default don't touch the
bounds of their owner anymore.
-
The default value for the
Distance properties of the EdgePathLabelModel and EdgeSegmentLabelModel when using
their default constructors have been changed from 0 to 2. This way the label bounds per default don't touch the edge
path of their owner anymore when an EdgeSide other than OnEdge is used.
-
The
EdgeSegmentPortLocationModel.CreateParameterFromTarget method now interprets the
parameter ratio from the target to the source side.
-
The default edge label model parameter is now created from an
EdgeSegmentLabelModel
using its CreateParameterFromCenter method instead of CreateParameterFromSource.
Controls
Incompatible API Changes
-
The XAML namespace for yFiles WPF has changed and is now
http://www.yworks.com/xml/yfiles-wpf/4.0/XAML.
-
GridVisualCreator has been renamed to GridRenderer.
-
The new
CanvasControl.RenderTree property now encapsulates all low-level render
object related API which was previously available directly on CanvasControl.
-
This includes the default render tree groups (
RootGroup, BackgroundGroup, ForegroundGroup, ContentGroup, SelectionGroup, FocusGroup, HighlightGroup, InputModeGroup), the helper methods relating to render tree elements (HitElementsAt, IsHit, GetVisual, GetVisualCreator, GetCanvasObjects (now GetElements),
GetBounds).
-
Furthermore, some functionality previously available on
ICanvasObject(Group) has
been moved to RenderTree as well, such as creating new elements or groups,
changing the parent group or removing a render tree element.
-
Renamed the
CanvasControl.AutoDrag property to AutoScrollOnBounds.
-
Renamed the
CanvasControl.AutoDragInsets property to AutoScrollPadding.
-
Renamed the
ViewportChanges.AutoDrag field to AutoScrollOnBounds.
-
Removed the
DragSize, DragTime and DoubleClickSize properties of the CanvasControl
class.
-
Renamed commands
MoveFocusBack and MoveFocusForward to
MoveFocusLeft and MoveFocusRight.
-
Renamed
HighlightIndicatorManager.SelectionModel to Items.
-
Renamed
SelectionIndicatorManager.SelectionModel to Items.
-
Renamed
SelectionIndicatorManager.Model to Domain.
-
Renamed
Canvas word components in properties and method parameter names to CanvasControl.
-
The
GraphModelManager constructor no longer has canvasControl and
contentGroup parameters. Also, the ContentGroup property can no
longer be set directly. Instead, the Install method now sets both CanvasControl and ContentGroup.
-
Removed the events
AutoDragChanged, AutoDragInsetsChanged, MouseWheelScrollFactorChanged, MouseWheelZoomFactorChanged, and ProjectionChanged of the CanvasControl class.
-
The
ICanvasObject.Group property has been renamed to Parent.
-
The predefined
EventRecognizer constants of the MouseEventRecognizers, KeyEventRecognizers, and TouchEventRecognizers classes have been moved to the EventRecognizers class. In addition, some rarely used constants have been removed.
-
The events on
CanvasControl which are related to input devices and the corresponding
EventRecognizer constants have neem renamed to conform to platform conventions.
-
Renamed the coordinate transformation methods to also include the source coordinate system in their names:
-
Renamed
CanvasControl.ToViewCoordinates to WorldToViewCoordinates.
-
Renamed
CanvasControl.ToWorldCoordinates to ViewToWorldCoordinates.
-
Renamed
IRenderContext.ToViewCoordinates to WorldToViewCoordinates.
-
Removed the
AnimateScrollCommands property and CanvasControl.AnimateScrollCommandsProperty field. Change AnimatedViewportChanges property instead.
-
ViewportLimiter.LimitViewport now uses a signature that works with the new type
ViewportDescriptor and respects the new ViewportLimitingMode enum.
-
ViewportLimiter.HonorBothDimensions is now called ViewportLimiter.StrictBoundsContainment and the default value changed to false.
-
The default
InputMode in GraphControl is no
longer null but is now set to GraphViewerInputMode.
Incompatible Behavior Changes
-
For new
GraphModelManager instances, the Install
method has to be called either directly or indirectly by assigning the GraphModelManager to the GraphControl.GraphModelManager
property.
Rendering
Incompatible API Changes
-
Added properties
IntermediateToWorldTransform and ViewToWorldTransform to IRenderContext.
-
The
ICanvasObjectDescriptor interface has been renamed to IObjectRenderer and its IsDirty method has been
removed.
-
The
ICanvasObject interface has been renamed to IRenderTreeElement and its UserObject property has
been renamed to Tag. Its Descriptor
property has been replaced with property Renderer of type IObjectRenderer.
-
The
ICanvasObjectGroup interface has been renamed to IRenderTreeGroup.
-
The
ICanvasObjectInstaller interface has been removed.
-
The singletons of the
CanvasObjectDescriptors class are no longer necessary, and thus,
this class has been removed. There is now a VoidObjectRenderer.Instance singleton.
-
The
IFocusIndicatorInstaller, IHighlightIndicatorInstaller, and ISelectionIndicatorInstaller interfaces have been renamed to IFocusRenderer, IHighlightRenderer, and ISelectionRenderer respectively and now inherit from IObjectRenderer instead of ICanvasObjectInstaller. Classes
implementing these interfaces have been changed accordingly (EdgeStyleDecorationInstaller, LabelStyleDecorationInstaller,
NodeStyleDecorationInstaller, and PortStyleDecorationInstaller have been renamed to EdgeStyleIndicatorRenderer, LabelStyleIndicatorRenderer,
NodeStyleIndicatorRenderer, and PortStyleIndicatorRenderer respectively).
-
The
GetInstaller methods on the ModelManager,
FocusIndicatorManager, HighlightIndicatorManager, SelectionIndicatorManager, GraphFocusIndicatorManager, GraphHighlightIndicatorManager, and GraphSelectionIndicatorManager classes are now called GetRenderer and return IObjectRenderer. Similarly,
the GetCanvasObjectGroup methods of these classes have been renamed to GetRenderTreeGroup.
-
The members of class
GraphModelManager have been adjusted to reflect the ICanvasObjectDescriptor and ICanvasObject renamings. More
precisely, DefaultEdgeDescriptor, DefaultLabelDescriptor, DefaultNodeDescriptor, DefaultPortDescriptor, EdgeDescriptor, EdgeLabelDescriptor, NodeDescriptor, NodeLabelDescriptor, PortDescriptor, PortLabelDescriptor, ProvideUserObjectOnMainCanvasObject, GetCanvasObject, GetCanvasObjectGroup, GetCanvasObjectGroup, GetCanvasObjectGroup,
GetCanvasObjectGroup, and GetMainCanvasObject have been renamed to DefaultEdgeRenderer, DefaultLabelRenderer,
DefaultNodeRenderer, DefaultPortRenderer, EdgeRenderer, EdgeLabelRenderer, NodeRenderer, NodeLabelRenderer, PortRenderer, PortLabelRenderer, ProvideRenderTagOnMainRenderTreeElement, GetRenderTreeElement, GetRenderTreeGroup,
GetRenderTreeGroup, GetRenderTreeGroup,
GetRenderTreeGroup, and GetMainRenderTreeElement respectively.
-
The members of class
ItemModelManager have been adjusted to reflect the ICanvasObjectDescriptor and ICanvasObject renamings. More
precisely, CanvasObjectGroup, Descriptor, GetCanvasObject, GetCanvasObjectGroup, and GetDescriptor have
been renamed to RenderTreeGroup, Renderer, GetRenderTreeElement, GetRenderTreeGroup, and GetRenderer
respectively.
-
The
RectangleIndicatorInstaller, OrientedRectangleIndicatorInstaller, and PointSelectionIndicatorInstaller classes have been removed.
-
The
IStripeInputVisualizationHelper interface is now called IStripeInputRenderer and extends IObjectRenderer, the DefaultStripeInputVisualizationHelper class has been removed.
-
The
StripeDecorator.InputVisualizationDecorator property has been renamed to InputRenderer.
-
The
DefaultPortCandidateDescriptor class is now called PortCandidateRenderer. The class no longer has the CandidateDrawingValidNonFocusedKey, CandidateDrawingValidFocusedKey, CandidateDrawingInvalidNonFocusedKey, and CandidateDrawingInvalidFocusedKey static properties.
-
The new
PortCandidateRenderer property on the CreateEdgeInputMode class replaces the CandidateDescriptor and ClosestCandidateDescriptor properties.
-
The new public property
PortCandidateRenderer on the PortRelocationHandle class replaces the CreatePortCandidateDescriptor and CreateCurrentPortCandidateDescriptor protected methods.
-
The new public property
PortCandidateRenderer on the PortRelocationHandleProvider allows customizing the renderer for the port candidates.
-
The new
ViewportRectangleRenderer property on the OverviewInputMode class allows customizing the renderer for the viewport rectangle. It
replaces the Template property and the ViewportTemplateKey static property.
-
The new
MarqueeSelectionInputMode.MarqueeRenderer property replaces the Template property and MarqueeRectangleTemplateKey static property.
-
The new
LassoSelectionInputMode.LassoRenderer property replaces the FinishRegionTemplate and FinishRegionHighlightTemplate properties and the FinishRegionTemplateKey and FinishRegionHighlightTemplateKey static properties. Also, the LassoPenKey and LassoFillKey static
properties have been removed.
-
The new
CandidateRenderer property on the LabelPositionHandler class replaces the CandidateTemplate and HighlightTemplate
properties and the CandidateTemplateKey and HighlightTemplateKey static properties.
-
The
GetCanvasObject and GetCanvasObjects
methods of class CanvasControl have been renamed to GetRenderTreeElement and have been moved to the GraphModelManager class.
-
The
CreateSnapResultCanvasObjectDescriptor method of class SnapContext has been renamed to CreateSnapResultRenderer.
-
The
GraphVisualCreator property of class GraphOverviewControl is now called GraphOverviewRenderer and
of type IObjectRenderer.
Selection, Focus, Highlight
Incompatible API Changes
-
The
IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, IndicatorNodeStyleDecorator,
and IndicatorPortStyleDecorator classes were removed. Use the EdgeStyleIndicatorRenderer etc. classes instead.
-
The
GraphFocusIndicatorManager, GraphHighlightIndicatorManager, and GraphSelectionIndicatorManager classes were removed. Use the FocusIndicatorManager etc. classes and their default instances on the GraphControl class instead and register instances of the EdgeStyleIndicatorRenderer etc. classes to the item lookups via the graph decorator.
-
The
AddSelection and RemoveSelection
methods on the SelectionIndicatorManager class were removed. Instead, modify the Items property directly.
-
HighlightIndicatorManager now by default uses the new GraphControl.Highlights collection. Adding, removing, and clearing highlights should now
be done via the GraphControl.Highlights property.
-
The
ISelectionModel interface has been removed and usages have been replaced by IObservableCollection. Thus, selecting an element works by calling ICollection.Add, deselecting works by calling ICollection.Remove, and checking the selection state is done via ICollection.Contains.
-
The
ItemSelectionChangedEventArgs have been replaced by usages of ItemEventArgs and there are now two separate events for adding/selecting and
removing/deselecting elements from the collections. The ItemSelectionChangedEventArgs
type has been removed.
-
The default implementations of
IGraphSelection and IStripeSelection have been removed from the public API.
-
Class
FocusIndicatorManager no longer implements INotifyPropertyChanged.
-
Replaced event
FocusIndicatorManager.PropertyChanged with event FocusedItemChanged.
-
Renamed Method
FocusIndicatorManager.OnPropertyChanged to OnFocusedItemChanged and changed signature.
-
FocusIndicatorManager.ShowFocusPolicy changed its default to the new WhenUsingKeyboard. The old policy called OnlyWhenFocused is now called WhenFocused.
Styles
Incompatible API Changes
-
Methods
CreateVisual and UpdateVisual of
classes NodeStyleBase, EdgeStyleBase, LabelStyleBase, PortStyleBase and StripeStyleBase are no more abstract but virtual. Added Paint method to these classes as a
simpler alternative to the two methods.
-
The following classes have been removed:
VoidEdgeStyleRenderer, VoidLabelStyleRenderer, VoidNodeStyleRenderer, VoidPortStyleRenderer and VoidStripeStyleRenderer. Instances
of these classes can be retrieved from the Renderer property of the corresponding void style implementations.
-
The
IArrow interface now requires the CropAtPort
property to be provided by implementations. For backward compatibility return false in simple subclasses.
-
The class
Arrow is now immutable and comes with separate scale factors for arrow
length and width. The default arrow was renamed to ArrowType.Stealth, circle arrow
to ArrowType.Ellipse, and simple arrow to ArrowType.Open. The short arrow type was removed.
-
Class
TableNodeStyle no longer implements INotifyPropertyChanged.
-
Renamed some values of
TextWrappingShape and ShapeNodeShape:
-
Triangle2 is now
TrianglePointingDown.
-
Hexagon2 is now
HexagonStanding.
-
Removed the following values from
ShapeNodeShape: ShearedRectangle, ShearedRectangle2, Trapez,
Trapez2, FatArrow, and FatArrow2.
-
Use the
ArrowNodeStyle for more flexible visualizations of these geometries.
-
Renamed
Star5Up to Star5, removed old (down pointing) Star5.
-
Use the factory methods on
GeneralPathNodeStyle for stars and polygons with an
arbitrary number of points/edges and configurable rotation angle.
-
Removed the following values from
TextWrappingShape: ShearedRectangle, ShearedRectangle2, Trapez,
and Trapez2.
-
Most item style implementations have become sealed, and their renderers have been removed from the API. Instead of
subclassing the styles or their renderers, custom style implementations should use delegation instead. For this the
new
DelegatingNodeStyle and CompositeNodeStyle style
variants may be used.
-
The item style constructors taking a custom renderer implementation have been removed. Instead, a custom style
should be implemented that may delegate to one of the library styles.
-
The
TableNodeStyle.CopyBackgroundStyle method has been removed. The Clone method doesn't deep copy the background style but just uses it for the clone
as well, which also was the previous default behavior.
-
The
Wrapped property of CollapsibleNodeStyleDecorator, IndicatorNodeStyleDecorator,
IndicatorEdgeStyleDecorator, IndicatorLabelStyleDecorator, IndicatorPortStyleDecorator,
ShadowNodeStyleDecorator, and IconLabelStyle has been
renamed to WrappedStyle.
-
The deprecated styles
BevelNodeStyle, PanelNodeStyle and
ShinyPlateNodeStyle have been removed.
-
The default
StringFormat in LabelStyle now uses StringTrimming.EllipsisWord. Before, it was Character. It also
uses StringFormatFlags.LineLimit as default FormatFlags.
Before, no flag was set.
Interaction
Incompatible API Changes
-
CanvasControl's LastEventLocation property has
been removed. Use LastPointerEvent.Location instead.
-
CanvasControl's LastInputEvent property has been
renamed to LastPointerEvent to better reflect its type.
-
The
ResourceKey and ComponentResourceKey classes
have been removed. Their usages have been replaced, often using properties of type Pen or IObjectRenderer.
-
The
PortRelocationHandle.GhostVisualizationPenKey has been replaced by a GhostVisualizationPen property.
-
The
SnapLine.SnapLinePenKey has been replaced by a SnapContext.SnapResultPen property.
-
The
MoveLabelInputMode class and its corresponding property on GraphEditorInputMode have been removed. Label movement is now handled directly by MoveInputMode. Most customizations related to label movement (as opposed to
the move gesture in general) can now be done on LabelPositionHandler, instead.
-
The commands previously defined on
GraphControl and CanvasControl are now located in class \GraphCommands. The
suffix \Command has been dropped from their names.
-
KeyboardInputMode's AddHandler overloads have
been renamed to AddRecognizerBinding and AddKeyBinding to clarify their usage. The AddCommand method has been renamed to AddCommandBinding to match the new naming.
-
KeyboardInputMode's RemoveCommand and RemoveHandler methods have been removed. Instead, the add methods now return a
binding token which provides a Remove method to remove that binding.
-
Replaced
Dummy in names with a more descriptive term. In particular:
-
In
CreateEdgeInputMode, DummyEdge, DummyEdgeGraph, DummyTargetNode,, DummyTargetNodePort, UpdateDummyEdgeSourcePort, UpdateDummyEdgeTargetPort, GetDummyEdgeSnapLines, and CreateDummyBend have been renamed to PreviewEdge, PreviewGraph, PreviewEndNode, PreviewEndNodePort,
UpdatePreviewEdgeStartPort, UpdatePreviewEdgeEndPort, GetPreviewEdgeSnapLines, and CreatePreviewBend.
-
The
Visualization.Dummy enum value has been renamed to Visualization.Placeholder.
-
In
PortRelocationHandle, CreateDummyEdge has
been renamed to CreatePreviewEdge.
-
The
NavigationInputMode.FindNearestItem method now gets the startItem
as a parameter instead of the location of it, and this item is also included in the itemsToCheck
parameter. Implementations may use the new GetReferenceLocation method to find
the starting location and should make sure not to return the startItem itself.
-
The
textProvider parameter for ToolTipInputMode's constructor has been
removed. An event handler for the QueryToolTip event can be registered
instead.
-
The return value of the
DropInputMode.AdjustEffect method has been changed from bool
to void. This method no longer determines if the mode will handle drag or drop events but only changes the drag/drop
effect of given event args as its name implies. The DropInputMode.AcceptDrag method
now determines if the mode will handle drag and drop events.
-
CreateEdgeInputMode's methods have been renamed:
-
GetClosestSourceCandidate to SelectClosestStartCandidate.
-
GetClosestCandidate to SelectClosestCandidate.
-
GetClosestTargetCandidate to SelectClosestEndCandidate.
-
CreateEdgeInputMode.StartPortCandidateHitRadius now is defined in view coordinates.
-
The event
GraphEditorInputMode.LabelTextChanged has been changed to LabelEdited to reflect the broader scope of changes allowed during label editing.
Similarly, GraphEditorInputMode.OnLabelTextChanged is now named OnLabelEdited.
-
Most methods, properties, and events related to label editing have been moved from
GraphEditorInputMode to EditLabelInputMode: AutoRemoveEmptyLabels, HideLabelDuringEditing, TextEditorInputMode, TextEditorInputModeConfigurator, CreateLabel, CreateLabelCore, EditLabelCore, OpenTextEditor, LabelDeleted, LabelTextEditingStarted, LabelTextEditingCanceled, and ValidateLabelText. The events LabelEditing
and LabelAdding have been moved to EditLabelInputMode and renamed to QueryLabelEditing
and QueryLabelAdding, respectively, to clarify their purpose.
-
Most methods, properties, and events related to label editing have been moved from
TableEditorInputMode to EditLabelInputMode: AutoRemoveEmptyLabels, HideLabelDuringEditing, TextEditorInputMode, TextEditorInputModeConfigurator, CreateLabel, CreateLabelCore, EditLabelCore, OpenTextEditor, LabelDeleted, LabelTextEditingStarted, LabelTextEditingCanceled, and ValidateLabelText. The events LabelEditing
and LabelAdding have been moved to EditLabelInputMode and renamed to QueryLabelEditing
and QueryLabelAdding, respectively, to clarify their purpose.
-
Removed callback methods which only raised the related events from classes
CanvasControl and GraphControl, e.g., OnZoomChanged. Use the corresponding events instead, e.g., ZoomChanged.
-
Removed the factory methods for the sub-input modes from
GraphInputMode, GraphViewerInputMode, GraphEditorInputMode, TableEditorInputMode, and TextEditorInputMode (e.g. CreateKeyboardInputMode). Set custom instances using the properties, instead.
-
Removed the factory methods for the
ToolTip and TextBox properties on classes ToolTipInputMode and
TextEditorInputMode, respectively. Set custom instances using the properties, instead.
-
Removed the methods
GetBounds, GetVisual, GetVisualCreator, and IsHit from CanvasControl class. Use the respective
methods of RenderTree class instead.
-
The
ICommand interface and its implementations have been replaced with the enum Command.
-
Constants of
ICommand have been replaced with equally named constants of enum Command.
-
The methods
CanExecute and Execute and its CanExecuteChanged event in ICommand have been replaced with
CanvasControl's CanExecuteCommand and ExecuteCommand methods and the CanExecuteCommandChanged event,
respectively.
-
Custom commands can no longer be created. As an alternative, register handlers on
KeyboardInputMode.
-
Renamed
DoubleClickPolicy to ClickReportingPolicy.
-
Renamed
ClickInputMode.DoubleClickPolicy to ClickReportingPolicy.
-
Renamed
DoubleClickPolicy.InitialSingleAndDoubleClick to ClickReportingPolicy.Instant.
-
Renamed
DoubleClickPolicy.DoubleClickOnly to WaitForDoubleClick.
-
Removed
DoubleClickPolicy.BothSingleClicksAndDoubleClick.
-
Changed the default of
ClickInputMode.ClickReportingPolicy to ClickReportingPolicy.Instant.
-
Removed the
PreventNextDoubleClick method from ClickInputMode class. Use the Cancel method instead.
-
Replaced
Mouse2DEventArgs and Touch2DEventArgs with
PointerEventArgs.
-
Integrated
TapInputMode into ClickInputMode. Touch input
now also fires Clicked events.
-
Removed all
ClickInputMode events except for Clicked. Click buttons and click count can be obtained from the ClickEventArgs.
-
Removed the events
ItemTapped, ItemDoubleTapped, and CanvasTapped from
GraphInputMode in favor of checking the PointerType on
the corresponding Click event.
-
The
HandleIsHitTouch and GetClosestHitHandleTouch methods of HandleInputMode
have been removed in favor of the methods HandleIsHit and GetClosestHitHandle, which now handle all types of pointer devices.
-
The
InputModeContext property has been removed from the IInputMode interface. In input mode implementations, the property has been renamed to
ParentInputMode and changed to protected access to prevent incorrect usage.
-
Renamed "Source" to "Start" and "Target" to "End" in the following members of
CreateEdgeInputMode class:
-
Renamed
ResolveSourcePortCandidates to ResolveStartPortCandidates.
-
Renamed
ResolveTargetPortCandidates to ResolveEndPortCandidates.
-
Renamed
SourcePortCandidateChanged to StartPortCandidateChanged.
-
Renamed
TargetPortCandidateChanged to EndPortCandidateChanged.
-
Renamed
SourcePortCandidate to StartPortCandidate.
-
Renamed
TargetPortCandidate to EndPortCandidate.
-
Renamed
SnapToTargetCandidate to SnapToEndCandidate.
-
Renamed
CancelGestureOnInvalidTarget to CancelGestureOnInvalidEnd.
-
Renamed
SourceNodeDraggingFinishedRecognizer to StartPortOwnerDraggingFinishedRecognizer.
-
Renamed
SourceNodeDraggingCursor to StartPortOwnerDraggingCursor.
-
Renamed
ShowSourcePortCandidatesHitTestable to ShowStartPortCandidatesHitTestable.
-
Renamed
OnSourcePortCandidateChanged to OnStartPortCandidateChanged.
-
Renamed
OnTargetPortCandidateChanged to OnEndPortCandidateChanged.
-
Renamed
SourcePortCandidateChanged to StartPortCandidateChanged.
-
Renamed
TargetPortCandidateChanged to EndPortCandidateChanged.
-
Renamed
GetSource to GetStartPortOwner.
-
Renamed
GetTarget to GetEndPortOwner.
-
Renamed
GetSourcePortCandidateProvider to GetStartPortCandidateProvider.
-
Renamed
GetTargetPortCandidateProvider to GetEndPortCandidateProvider.
-
Renamed
GetSourcePortCandidates to GetStartPortCandidates.
-
Renamed
GetTargetPortCandidates to GetEndPortCandidates.
-
Renamed
GetSourcePortCandidate(PointD) to GetStartPortCandidate.
-
Renamed
GetSourcePortCandidate(IEnumerable<IPortCandidate>, PointD, bool) to SelectStartPortCandidate.
-
Renamed
GetClosestCandidate to SelectClosestCandidate.
-
Renamed
GetClosestSourceCandidate to SelectClosestStartCandidate.
-
Renamed
GetClosestTargetCandidate to SelectClosestEndCandidate.
-
Renamed
SourcePortCandidateHitRadius to StartPortCandidateHitRadius.
-
Renamed
UpdateTargetLocation to UpdateEndLocation.
-
Renamed
ShowTargetHighlight to ShowEndHighlight.
-
Renamed
UpdateTargetHighlight to UpdateEndHighlight.
-
Renamed
DummyTargetNode to PreviewEndNode.
-
Renamed
DummyTargetNodePort to PreviewEndNodePort.
-
Renamed
ShowPortCandidates.Source to Start and
ShowPortCandidates.Target to End.
-
Removed
CreateEdgeInputMode.CreateDummyEdgeGraph, CreateEdgeInputMode.CreateDummyEdge, CreateEdgeInputMode.CreateDummyTargetNode, CreateEdgeInputMode.CreateDummyTargetNodePort, CreateEdgeInputMode.DummySourceNodePort, CreateEdgeInputMode.UpdateDummyEdgeSourcePort, and CreateEdgeInputMode.UpdateDummyEdgeTargetPort.
-
Events which involve item changes triggered by input modes are now of type
InputModeItemEventArgs instead of ItemEventArgs. These are
the events:
-
CreateBendInputMode: BendCreated.
-
CreateEdgeInputMode: StartPortCandidateChanged, EndPortCandidateChanged, EdgeCreated,
PortAdded, EdgeCreationStarted.
-
GraphEditorInputMode: LabelEdited, LabelAdded, NodeCreated, PortAdded.
-
ItemDropInputMode and inheritors: ItemCreated.
-
NavigationInputMode: GroupCollapsing, GroupCollapsed, GroupExpanding, GroupExpanded, GroupEntering, GroupEntered, GroupExiting, GroupExited.
-
TableEditorInputMode: DeletedItem.
-
EditLabelInputMode: LabelAdded, LabelEditingStarted, LabelEditingCanceled, LabelEdited.
-
StripeDropInputMode: StripeCreated.
-
Events which involve item deletion or structural changes triggered by input modes are now of type
InputModeItemChangedEventArgs:
-
GraphEditorInputMode.DeletedItem: InputModeItemChangedEventArgs instead of ItemDeletedEventArgs.
-
GraphEditorInputMode.EdgePortsChanged: InputModeItemChangedEventArgs instead of EdgeEventArgs.
-
GraphEditorInputMode.NodeReparented: InputModeItemChangedEventArgs instead of NodeEventArgs.
-
EditLabelInputMode.LabelDeleted: InputModeItemChangedEventArgs instead of LabelEventArgs.
-
Removed the
PortRelocationHandle.CreateDummyEdgeVisualCreator method. To change the
preview edge's style overwrite PortRelocationHandle.CreatePreviewEdge instead.
-
Renamed
GraphInputMode.ShouldSelectItem to ShouldSelect.
-
The event
DeletedSelection of GraphEditorInputMode now uses ItemsEventArgs instead of
SelectionEventArgs.
-
The static fields
AllNodeCandidates and AllNodeAndEdgeCandidates on EdgeReconnectionPortCandidateProviders have been replaced by the factory methods FromAllNodeCandidates and FromAllNodeAndEdgeCandidates. The implementations now provide a port candidate for
the unchanged port of the edge when collecting the port candidates from the IPortCandidateProvider instances of the nodes and edges.
-
The generic type of the
IHitTester interface has been removed. Instead, a parameter of
type GraphItemTypes has been added to its EnumerateHits method.
-
The
HandleTypes enums has been refactored to a non-flaggable HandleType enum, and the values have been adjusted.
-
A
Tag property has been added to the IHandle
interface. yFiles does not use the property and initializes it with null, but decorating handles
forward any values unmodified.
-
The protected virtual
CreateEdgeCreationInputModeContext method on the CreateEdgeInputMode class has been removed. Use or override the CreateInputModeContext method, instead.
-
The protected
Should- methods of the input modes have been removed and replaced by predicate
properties.
-
The
LassoSelectionEventArgs.SelectionPath property has been renamed to Path.
-
The core
MarqueeSelect and LassoSelect
methods of GraphEditorInputMode and GraphViewerInputMode, that take an enumerable and predicate, have been removed while the
other MarqueeSelect and LassoSelect
method got an additional parameter of type SelectionPolicy.
-
The
LabelPositionHandler.SetPosition method has been removed.
-
The
LabelPositionHandler.UseFinder property has been removed. Use the new UseParameterFinderRecognizer property instead.
-
The
LabelPositionHandler.UseParameterFinder method has been renamed to ShouldUseParameterFinder.
-
The
ToolTipQueryEventArgs class is now named QueryToolTipEventArgs to properly match the corresponding event's name.
-
The
LabelPositionHandler.UseFinder property has been removed.
-
Method
GetBendsInPath has been added to the IBendSelectionTester interface and is used to check for bends that should be lasso
selected.
-
Method
GetPortsInPath has been added to the IPortSelectionTester interface and is used to check for ports that should be lasso
selected.
-
DiscardInvalidItems in ItemHoverInputMode has
been renamed to IgnoreInvalidItems, and its behavior was reversed.
-
The
DoStartEdgeCreation method on the CreateEdgeInputMode class is now called StartEdgeCreation.
-
The
DoStartDrag method on the MoveInputMode
class is now called StartDrag.
-
The
BeginDragging method on the HandleInputMode
class is now called StartDrag.
-
The
AddLabel method on GraphEditorInputMode is
now called StartLabelAddition.
-
The
EditLabel method on GraphEditorInputMode is
now called StartLabelEditing.
-
The
MouseHoverInputMode class has been renamed to ToolTipInputMode.
-
The
GraphInputMode.MouseHoverInputMode property has been renamed to ToolTipInputMode.
Incompatible Behavior Changes
-
The default lookup of labels now returns an
IPositionHandler implementation.
-
The
LabelDropInputMode.IsValidLabelOwner method now only accepts instances of FreeLabelModel or that the draggedLabel's owner type matches the owner type
e.g. INode, IEdge, or IPort.
-
The
DropInputMode.AdjustEffect method no longer determines if the mode will handle
drag or drop events but only change the drag/drop effect of given event args as its name implies. The DropInputMode.AcceptDrag method now determines if the mode will handle drag and drop
events.
-
Unselected items can be moved by default.
-
Edge creation: by default, start port candidates are shown when hovering over a node.
-
GraphViewerInputMode / GraphEditorInputMode: the ClickHitTestOrder default value has been changed to GraphItemTypes.All which means that the default order is the Z-Order but with a
prioritization for elements behind labels.
-
GraphViewerInputMode: The MoveViewportInputMode's
priority has been changed to 190.
-
GraphEditorInputMode: The sub input mode's priorities have been changed to the
following order: WaitInputMode, KeyboardInputMode, HandleInputMode, ClickInputMode, CreateEdgeInputMode, MoveSelectedItemsInputMode,
MoveUnselectedItemsInputMode, CreateBendInputMode, MoveViewportInputMode, LassoSelectionInputMode, MarqueeSelectionInputMode, ItemHoverInputMode, NavigationInputMode, ContextMenuInputMode, NodeDropInputMode, LabelDropInputMode, PortDropInputMode, ToolTipInputMode, EditLabelInputMode.
-
In
CreateEdgeInputMode it was previously possible to define a fallback for GetPortOwner if IHitTester was removed. This option
for defining a fallback is removed and always returns null.
-
Improved the
CreateBendInputMode behavior: Previously, dragging an existing bend
triggered the BendCreated event, causing confusion and limiting event handling
for new bend creation. This has been adjusted to ensure the event only fires when a new bend is created
interactively.
-
Refined the event sequence of
CreateEdgeInputMode to ensure consistency and symmetry
between gesture cancellation and completion.
-
Reorganized the sequence to include
EdgeCreationStarted only after the start
node dragging has finished and the end port candidate is determined.
-
Adjusted the timing of the end port candidate update, which now occurs just before
GestureFinishing, allowing users to apply final updates to the end port.
-
Ensured the following event order for gestures:
-
GestureStarting, GestureStarted.
-
Cancellation path:
GestureCanceling, GestureCanceled.
-
Completion path:
EdgeCreationStarted, GestureFinishing, EdgeCreated, GestureFinished.
-
The
EdgeCreationStarted and EdgeCreated
events provide now arguments of type ItemEventArgs<IEdge>.
-
NavigationInputMode now interprets the direction of arrow keys in view coordinates by
default.
-
Edges can now be reconnected to other nodes per default. The old behavior can be restored by decorating the edge
lookup with the provider returned by
EdgeReconnectionPortCandidateProviders.FromSourceAndTarget.
-
The default value of
EnableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CtrlUp to AltUp.
-
The default value of
DisableSnappingRecognizer in CreateEdgeInputMode, HandleInputMode, and MoveInputMode has been changed from CtrlDown to
AltDown.
-
The default value of
CenterReshapeRecognizer in NodeReshapeHandleProvider and ReshapeHandlerHandle has been
changed from AltIsDown to CtrlIsDown.
-
The default value of
ReparentNodeHandler.ReparentRecognizer has been changed from
ShiftIsDown to CtrlIsDown.
-
The
GraphInputMode.FindItems method now considers the actual z-order of the hit
items.
-
Orthogonal edge editing now has to be enabled for each edge that should be edited orthogonally instead of enabling
it for all edges by setting the
GraphEditorInputMode.OrthogonalEdgeEditingContext
property. This can be done by enabling the PolylineEdgeStyle.OrthogonalEditing
properties of the styles, by setting an apropriate FallbackEdgeHelperProvider
on the used OrthogonalEdgeEditingContext or by providing an IOrthogonalEdgeHelper in the edges' lookup.
-
The
MultiSelectionRecognizer of GraphEditorInputMode and GraphViewerInputMode are not used
anymore for marquee and lasso selection. Instead, MarqueeSelectionInputMode and LassoSelectionInputMode have their own modifiers for different selection policies.
-
Changed the default of
TextEditorInputMode.TextBoxPlacementPolicy to TextBoxPlacementPolicy.MoveTextBox.
-
CanvasControl.UpdateContentBounds now only considers the items in the RenderTree.ContentGroup instead of the RootGroup
when calculating the new bounds.
-
The default value of
CreateEdgeInputMode.PortCandidateResolutionRecognizer has been
changed from ShiftIsDown to CtrlIsDown.
-
The default value of the
CreateEdgeInputMode.EnforceBendCreationRecognizer has been
changed form CtrlIsDown to AltIsDown.
-
The default edge lookup doesn't provide an
IPositionHandler anymore so dragging a
selected edge doesn't move all its bends.
-
GraphEditorInputMode's MoveUnselectedItemsInputMode now only moves unselected items. Previously it also
moved selected items despite its name.
-
The default value of
TextEditorInputMode.AutoCommitOnFocusLost is now
true . This means that the text of an edited label is commited instead of discarded when the text box
loses the focus e.g. by clicking on the canvas.
-
During edge creation, bends are now created when pressing a mouse button instead of releasing it. This way, when
starting edge creation by dragging the mouse from a node, no bend is created on the first mouse button release,
which was an often unwanted behavior.
-
The default values of the
NodeReshapeHandleProvider.RatioReshapeRecognizer property
and ReshapeHandlerHandle has been changed to null. If no custom
recognizer is set, ReshapeHandlerHandle uses the new HandleInputMode.IsDirectionalConstrained method instead if a HandleInputMode is found in the IInputModeContext.
-
GraphEditorInputMode.AllowGroupingOperations is now true by default.
Snapping
Incompatible API Changes
-
LabelSnapContext has been removed, and label snapping is now handled by GraphSnapContext:
-
The
GraphEditorInputMode.LabelSnapContext property and the GraphEditorInputMode.OnLabelSnapContextChanged method have been removed.
-
The
CollectLabelSnapLineEventArgs class has been removed.
-
Configuration properties of
LabelSnapContext have been moved to GraphSnapContext and renamed.
-
The
ILabelSnapContextHelper interface and the LabelSnapContextHelper class have been removed. Instead, the ILabelSnapResultProvider interface and the classes LabelSnapResultProvider and LabelSnapReferenceProvider
have been added.
-
The
LabelDecorator.LabelSnapContextHelperDecorator property has been replaced by
the properties SnapReferenceProvider and SnapResultProvider.
-
CollectGraphSnapLinesEventArgs has been renamed to CollectSnapReferencesEventArgs. Its methods AddFixedNodeSnapLine, AddFixedSegmentSnapLine, AddPortSnapLine,
and AddAdditionalSnapLine have been removed and replaced by the single AddSnapReference method.
-
GraphSnapContext has been refactored, and the following members have changed:
-
The properties
SnapNodesToSnapLines, SnapBendsToSnapLines, SnapSegmentsToSnapLines, SnapBendAdjacentSegments, SnapPortAdjacentSegments, SnapEdgeLabels, SnapNodeLabels, and
SnapPortLabels have been replaced by the new properties SnappableItems and GridSnappableItems.
-
The
CollectVisibleNodePairs method now takes the CollectSnapReferencesEventArgs the snap references shall be added to.
-
The methods
FindSameWidthEntries and FindSameHeightEntries have been removed. Instead, the SnapSize references describing to which size items can snap are provided by the SnapReferences property. Similarly, the FixedNodeSnapLines, FixedSegmentSnapLines, FixedPortSnapLines, and AdditionalSnapLines properties have been removed. The SnapReferences property should be used instead.
-
The
SnapLine.ResourceKey property has been removed along with most of the static
ResourceKey members used for snapping. Instead, a VisualizationType property of the enum type SnapReferenceVisualizationType is used to describe which visualization should be used for
the SnapLine.
-
Most subclasses of
SnapLine have been removed as they only provided properties used
for the visualization that are now available on SnapResult.
-
The
SnapTypes enum used by SnapResult has been replaced
by the new SnapConstraint class that supports finding common snap locations for SnapResults with different constraints.
-
The
Snap and IsSnapped methods of SnapResult have been removed. Instead, a Constraint
property of type SnapConstraint has been added that is used to merge possible SnapResults and check if a location is valid for a given SnapResult.
-
The
SnapResult.GetVisualCreator method has been removed and is replaced by the new
ObjectRenderer property.
-
The factory methods of
SnapResults have been adjusted:
-
CreatePointSnapResult has been renamed to CreateSnapResult.
-
CreateSnapLineSnapResult has been renamed to CreateLineSnapResult.
-
CreateLabelSnapResult has been removed.
-
The methods of the snap result providers have been adjusted to support the new
SnapReference API. Most methods now take one instance of a SnapReference subclass like SnapLine or SnapGrid.
-
The classes
SnapState, ArrowContainer, and ArrowControl have been removed.
-
The type of the
SnapContext properties of all input modes has been changed from SnapContext to GraphSnapContext.
-
Most classes and members that had
SnapLine in their name have been renamed to include
SnapReference instead.
-
The
ReshapeRectangleContext.InitialBounds property has been renamed to InitialLayout.
-
The
GraphEditorInputMode.SnapContext property is now set per default and may not be
null. It is disabled per default.
-
Renamed the
GraphSnapContext.NodeToNodeDistance property to NodeDistance.
-
Renamed the
GraphSnapContext.EdgeToEdgeDistance property to EdgeDistance.
Clipboard
Incompatible API Changes
-
IClipboardHelper's methods Cut, Copy, and Paste have been renamed to OnCut, OnCopied, and OnPasted.
-
IClipboardHelper's methods Cut and Copy don't return an object anymore and the object
parameter of Paste and ShouldPaste has
been removed. For Cut/Copy and Paste the same IClipboardHelper method is now used
so any state that should be transfered can be stored in a custom implementation.
-
IClipboardHelper has new methods ShouldDuplicate
and OnDuplicated which have to be implemented, now.
-
GraphClipboard`s methods GetMemento and GetClipboardHelper have been removed.
-
GraphClipboard's protected Copy and Paste methods now take the new ClipboardOperationContext as parameter instead of the sourceGraphs and
filter predicates.
-
The methods
CreateClipboardGraph, CreateToClipboardCopier, CreateFromClipboardCopier, CreateDuplicateCopier, and CreateDefaultClipboardIdProvider from GraphClipboard
that were used to lazily initialize the corresponding properties have been removed.
-
GraphClipboard.Paste now takes an enumerable of IModelItem as targetOwners parameter instead of a targetFilter
predicate.
-
GraphClipboard.IsFoldingStateElement is now an instance method and doesn't have an
owner parameter anymore.
-
ElementCopiedCallback has been renamed to ItemCopiedCallback.
-
GraphViewerInputMode's ElementsCopied event has
been renamed to ItemsCopied.
-
GraphEditorInputMode's ElementsCopied, ElementsCut, ElementsCopied, ElementsPasted and ElementsDuplicated events
were renamed to ItemsCopied, etc.
-
On
GraphClipboard, the ElementsCut,
-Cutting, -Copying, -Copied, -Pasting, -Pasted,
-Duplicating, and -Duplicated events were renamed to Items instead of Elements and use the new
GraphClipboardEventArgs. Also, the OnElementCut,
-Copied-, and -Pasted methods were renamed to start with OnItem and take an
additional ClipboardOperationContext as a parameter.
-
GraphClipboard.RemoveElements has been renamed to RemoveItems.
-
GraphClipboard.IsFoldingStateElement has been renamed to IsFoldingStateItem.
-
GraphClipboard.CreateContext now takes an additional IInputModeContext parameter that should be returned in the new contexts lookup.
-
The
GraphClipboard.ClipboardGraph property is now read-only.
-
The parameters of
GraphClipboard's Copy method
have been rearranged so default values for optional parameters could be added.
-
For consistency reasons, the property
GraphClipboard.Empty is now called IsEmpty.
-
GraphControl instances now use a shared GraphClipboard
per default. To revert to the previous behavior, a new GraphClipboard instance can be
set on each GraphControl.
-
GraphClipboard's Cut, Copy, Paste, and Duplicate methods now use an IEnumerable instead of a
filter predicate to determine the subgraph to copy.
-
GraphClipboard's Create*Filter methods have been removed.
-
The
GraphClipboard now uses ClipboardGraphCopier
instances for its ToClipboardCopier, FromClipboardCopier, and DuplicateCopier.
-
The
Graph.ParentNodeDetectionModes has been reduced to contain only the mainly used
options. The option Root has been renamed to None, and the options AllowSelf and Force as well as the ModeMask and ModifierMask have been removed. The GetTargetNode method can be overridden if the reduced modes are not suitable and
may call the new FindParentByPreviousParent method to simulate the old Force setting.
-
GraphClipboard`s GetTarget methods now take an
additional ClipboardOperationContext parameter, and the GetTarget overload for nodes also takes a pasteLocation as an additional parameter.
-
The
GraphClipboard.PasteDelta property has been renamed to PasteOffset. It is now modified by the GraphClipboard's Cut , Copy, Paste, and Duplicate methods instead of the corresponding methods on GraphEditorInputMode.
-
The
GraphEditorInputMode.PasteDelta property has been removed and replaced by the
new GraphClipboard.PasteOffsetIncrement property.
-
The values
LabelModelParameter and PortLocationModelParameter have been removed from the CloneTypes enum as those parameter are typically immutable, so cloning them has no effect.
Folding
Incompatible API Changes
-
Interface
IFolderNodeConverter has a new UpdateGroupNodeState method.
-
Interface
IFoldingEdgeConverter has a new UpdateMasterEdges method.
-
FolderNodeConverter now relies on FolderNodeDefaults to
configure initialization and update of states.
-
FoldingEdgeConverter and MergingFoldingEdgeConverter now
rely on FoldingEdgeDefaults to configure initialization and update of states.
-
The
FoldingLabelOwnerState.Remove method(.
-
FoldingLabelState) was renamed to RemoveLabel
and the FoldingLabelState.RemoveBend method(FoldingBendState) was renamed to RemoveBend.
Incompatible Behavior Changes
-
Tags are not automatically the same on group and folder nodes or master and folding edges (master and view states).
Instead, they have to be synchronized using the
IFolderNodeConverter and IFoldingEdgeConverter implementations. The default implementations already synchronize the
tags.
-
In the graph of a folding view, the
CreateGroup method now always creates a
group even if the isExpanded predicate specified in the FoldingManager.CreateFoldingView method specifies otherwise. Create the group on the
master graph if you want the predicate to be respected.
Lookup
Incompatible API Changes
-
Renamed
LookupDecorator.SetImplementation to AddConstant.
-
Renamed
LookupDecorator.SetFactory to AddFactory.
-
Renamed
LookupDecorator.SetImplementationWrapper to AddWrapperFactory.
-
Renamed
LookupDecorator.HideImplementation to Hide.
-
Renamed lookup decorators in general by removing the
Decorator suffix. For
example, graphDecorator.EdgeDecorator.PositionHandlerDecorator.HideImplementation is now
graphDecorator.Edges.PositionHandler.Hide.
-
Removed
LookupDecorator.NullIsFallback. Instead, use the predicate of the AddFactory method or return the original instance in the AddWrapperFactory method.
-
Removed
LookupDecorator.DecorateNulls. Instead, implement the desired behavior in
AddWrapperFactory.
-
Removed the
SimpleNode.LookupImplementation property, SimpleEdge, SimpleBend, SimpleLabel and SimplePort. Instead, use the new GetDecorator method to adjust the item's lookup.
-
The
SimpleNode, SimpleEdge, SimpleBend, SimpleLabel and SimplePort classes are now sealed, and their Lookup
method is no longer virtual. To adjust the item's lookup, use the GetDecorator
method.
-
Removed
CanvasControl.InputModeContextLookup and CanvasControl.InputModeContextLookupChain. Instead, use the new GetInputModeContextDecoratorFor method to decorate the input mode context lookup.
-
The
EdgeDecorator.GetDecoratorFor method, NodeDecorator, etc. no longer has the nullIsFallback and
decorateNull parameters.
-
The
node parameter of the methods in the interfaces IGroupPaddingProvider, INodeSizeConstraintProvider, and
IGroupBoundsCalculator has been removed.
-
The
edge parameter of the methods in the interfaces IEdgePortHandleProvider, IBendCreator, and IOrthogonalEdgeHelper has been removed.
-
The
label parameter of the methods in the interfaces ILabelModelParameterProvider, and ILabelModelParameterFinder
has been removed.
-
The model item parameter in
ISnapReferenceProvider.AddSnapReferences has been
removed.
-
The
ILabelModelParameter parameter of ILabelModel.GetContext has been removed and ILabelModel
doesn't extend ILookup anymore. Instead, the lookup returned by GetContext should be used for all lookup calls.
-
The
IPortLocationModelParameter parameter of IPortLocationModel.GetContext has been removed and IPortLocationModel doesn't extend ILookup anymore. Instead,
the lookup returned by GetContext should be used for all lookup calls.
-
The
OrthogonalEdgeEditingContext.GetOrthogonalEdgeHelper method has been replaced by
the FallbackEdgeHelperProvider and OrthogonalEdgeHelperProvider properties.
-
The
INodeInsetsProvider interface was renamed to IGroupPaddingProvider.
-
The methods
SetLookupImplementation and GetLookup have been removed from DefaultGraph.
Instead the Lookup method should be overridden if the default lookup behavior
should be replaced.
-
The methods
SetLookup and GetLookup have
been removed from GraphWrapperBase. Instead, the Lookup method should be overridden if the default lookup behavior should be
replaced.
GraphML
Incompatible API Changes
-
The methods
GraphMLIOHandler.AddInputMapperFuture and GraphMLIOHandler.AddInputHandlerFactory have been removed, together with their support
classes.
-
The
AddRegistryInputMapper and AddRegistryOutputMapper methods have been removed from GraphMLIOHandler, since the MapperRegistry has been removed.
To read or write additional per-item data, use the AddInputMapper or AddOutputMapper methods, instead.
View-Layout-Bridge
Incompatible API Changes
-
The properties
LayoutExecutor.SelectionModel and LayoutGraphAdapter.SelectionModel have been removed, meaning that selected items of the
IGraph are no longer automatically marked in the LayoutGraph via keys like the former LayoutKeys.AffectedNodesDpKey. If the selected items should be marked for a specific key
of layout algorithms, then these items can always be provided via the specific LayoutData property of the layout algorithms.
-
Removed the
ContextItemMapping class.
-
Renamed the
LayoutExtensions.MorphLayout method to ApplyLayoutAnimated.
-
Renamed the
LayoutExecutor.Duration property to AnimationDuration.
-
Renamed the
LayoutExecutor.CreateMorphAnimation method to CreateLayoutAnimation.
-
The
LayoutGraphAdapter.PortDummyNodeDpKey constant has been renamed to PortHelperNodeDataKey.
-
Renamed
ItemMapping.Delegate to MapperFunction.
-
Renamed
ItemCollection.Delegate to Predicate.
-
Removed key
LayoutGraphAdapter.OriginalTagDpKey. Use the Tag property of the layout
items instead to get the original tag associated to the original IGraph items.
-
Renamed the
LayoutExecutor.Duration property to AnimationDuration.
-
Replaced
LayoutExecutor.LabelPreferredPlacementPolicy with ItemMapping LayoutExecutor.LabelPlacementPolicies.
-
Renamed Enum
LabelPreferredPlacementPolicy to LabelPlacementPolicy.
-
Removed value
FromDescriptor. PreferredPlacementDescriptors are now automatically considered when specified through
LayoutDatas.
-
Renamed value
FromModel to PreferModel.
-
Renamed value
FromParameter to PreferParameter.
-
Added value
KeepParameter, which suppresses the write-back of label
positions to the view graph.
-
Replaced
LayoutGraphAdapter.LabelPreferredPlacementPolicy with ItemMapping LayoutGraphAdapter.LabelPlacementPolicies.
-
Changed property
PortAdjustmentPolicy of LayoutExecutor class to an ItemMapping PortAdjustmentPolicies which allows for
different values for each port. The default is PortAdjustmentPolicy.Lengthen.
-
Changed property
PortAdjustmentPolicy of LayoutGraphAdapter class to an
ItemMapping PortAdjustmentPolicies which allows
for different values for each port. The default is PortAdjustmentPolicy.Lengthen.
-
LayoutExecutor.AutomaticEdgeGrouping has been removed. Edges at the same port are
now always automatically port grouped unless port groups have been defined explicitly.
-
LayoutGraphAdapter.AutomaticEdgeGrouping has been removed. Edges at the same port
are now always automatically port grouped unless port groups have been defined explicitly.
-
The
TableLayoutConfigurator.Prepare and LayoutExecutor.PrepareTableLayout methods now return a PartitionGridData instance.
-
Boolean
LayoutExecutor.FixPorts property is replaced by an ItemMapping PortPlacementPolicies, that allows to
specify a policy for the handling of each individual port.
Incompatible Behavior Changes
-
The
LayoutGraphAdapter class does no longer offer a method to create a layout graph
several times but is now meant to create exactly one layout graph copy which can be accessed via the LayoutGraph property and initialized with method LayoutGraphAdapter.Initialize. After initialization, changing properties of the LayoutGraphAdapter has no effect anymore.
-
Edges at the same port are now always automatically port grouped unless port groups have been
defined explicitly.
Layout
Incompatible API Changes
-
Replaced usages of the
IComparer interface with Comparison function
delegates.
-
Removed the
IDataProvider interface and refactored the whole way data is registered
with a LayoutGraph instance. The replacement of IDataProvider is the generic IMapper interface. It allows
setting and getting data via an indexer.
-
Removed the methods
Graph.AddDataProvider and RemoveDataProvider. Data is now registered and removed using the methods on
the new LayoutGraphContext class (e.g. AddItemData, AddData, Remove).
-
Removed the
Graph.DataProviderKeys property.
-
Removed the class
Maps.
-
The nested
Segment class of BorderLine is now
the unnested BorderLineSegment class, and some of its members have been changed:
-
Renamed
Grow to Enlarge, AddOffset to AddPositionOffset, Min to MinPosition and Max to MaxPosition.
-
Removed the
BorderLine.AdoptValues method.
-
Converted
BorderLine.FirstSegment, BorderLine.LastSegment, BorderLine.Segment.Prev and
BorderLine.Segment.Next from methods to read-only properties, and renamed Prev to Previous.
-
Removed
BorderLine.Prev and BorderLine.Next. Use
methods BorderLineSegment.Previous and BorderLineSegment.Next instead.
-
The
MultiStageLayout class has been removed from the API. The HierarchicalLayout (formerly HierarchicLayout), OrganicLayout, OrthogonalLayout, TreeLayout, RadialTreeLayout (formerly BalloonLayout), SeriesParallelLayout, RadialLayout, CompactDiskLayout, and RadialGroupLayout (formerly CactusGroupLayout) classes now
directly implement ILayoutAlgorithm. These classes offer a new LayoutStages property that allows to access the mutable stack of ILayoutStage instances associated with the respective algorithm. In addition, the offer
different new properties to directly access frequently used stages.
-
The read/write properties
MinimumSizeGroupBoundsCalculator.MinimumNodeSizeDpKey and
InsetsGroupBoundsCalculator.GroupNodeInsetsDpKey have been removed. The bounds
calculator classes now always use the values defined via the keys LayoutKeys.MinimumGroupNodeSizeDataKey and LayoutKeys.GroupNodePaddingDataKey. Using the IGraph API,
the insets and minimum sizes are registered automatically, so that this change has no effect.
-
The read/write properties
SubgraphLayout.AffectedNodesDpKey and SubgraphLayout.AffectedEdgesDpKey have been removed. They were replaced by static
read-only keys SubgraphLayoutStage.SubgraphNodesDataKey and SubgraphLayoutStage.SubgraphEdgesDataKey.
-
PortConstraints and PortCandidates have been unified and
renamed to LayoutPortCandidate.
-
PortDirections and PortSide have been unified as PortSides, and the enum values of the sides have been renamed.
-
PortCandidateSets have been replaced by NodePortCandidates, and collections of PortCandidates for
edges have been replaced by EdgePortCandidates.
-
The port-related settings in the
LayoutData classes have been combined into a
sub-LayoutData Ports.
-
The keys in
PortConstraintKeys have been moved to LayoutKeys.
-
The
SequentialLayout.Layouts property is now a read-only List<ILayoutAlgorithm>. The AppendLayout, AppendLayouts, and RemoveAll methods have been removed as their functionality is now handled by the
list methods.
-
Replaced properties
XOffset and YOffset
of the PortCandidate class by a single property Offset of type PointD.
-
Renamed
Graph.ReInsertNode and ReInsertEdge to
LayoutGraph.Reinsert.
-
From
LayoutGraphHider, the FireGraphEvents and
Graph properties, and the HideEdges,
HideSelfLoops, SimplifyGraph, and HideMultipleEdges methods have been removed. Also, all methods to hide and unhide
various collections of nodes or edges have been replaced by Hide and Unhide methods that get an IEnumerable of Node or Edge.
-
The classes
SelfLoopRouter and ParallelEdgeRouter have
been moved from the yWorks.Layout namespace to the yWorks.Layout.Router namespace.
-
Removed the
NodeHalo class. Halos are now specified as InsetsD and called node margins. in the corresponding LayoutData (e.g. HierarchicalLayoutData.NodeMargins).
-
The properties previously named
NodeHalos have been renamed to NodeMargins for the following classes: AlignmentStageData, CircularLayoutData, CompactDiskLayoutData, ComponentLayoutData, RadialGroupLayoutData, RecursiveGroupLayoutData, HierarchicalLayoutData (formerly HierarchicLayoutData),
GenericLabelingData (formerly LabelingData), OrganicLayoutData, OrthogonalLayoutData, ClearAreaLayoutData, FillAreaLayoutData, PartialLayoutData, RadialLayoutData, CurveRoutingStageData, TabularLayoutData, EdgeRouterData, RadialTreeLayoutData (formerly BalloonLayoutData), TreeLayoutData.
-
Renamed
AsIsLayerer.NodeHalo to FromSketchLayerAssigner.NodeMargin.
-
Renamed
TemporaryGroupDescriptor.Halo to Margins.
-
Renamed
NodeHalo.NodeHaloDpKey to LayoutKeys.NodeMarginDataKey.
-
Renamed
LayoutExecutor.TargetBoundsInsets to TargetBoundsPadding.
-
Renamed
GroupingKeys.GroupNodeInsetsDpKey to GroupNodePaddingDataKey and moved the key to LayoutKeys.
-
Renamed
GroupingKeys.MinimumNodeSizeDpKey to LayoutKeys.MinimumGroupNodeSizeDataKey.
-
Renamed
InsetsGroupBoundsCalculator.DefaultInsets to GroupBoundsCalculator.DefaultPadding and InsetsGroupBoundsCalculator.ConsiderNodeHalos to GroupBoundsCalculator.ConsiderNodeMargins.
-
Renamed
TemporaryGroupDescriptor.Insets to Padding.
-
The
FamilyTreeLayout class has been removed.
-
Removed the
LayoutGraphUtilities class. The new Edge.ResetPath method replaces LayoutGraphUtilities.ResetPath method. The new ParallelEdgeRouter.RouteEdgesParallel method replaces LayoutGraphUtilities.RouteEdgesParallel method.
-
Methods
LayoutGraphUtilities.GetBoundingBox were combined to one more general, moved
to LayoutGraph class and made an instance method.
-
Renamed
AbortHandler to LayoutAbortController.
-
The
MaximumDuration property is renamed to StopDuration in all public API usages.
-
StopDurations that were of type long are now of type TimeSpan.
-
StopDurations now affect pre-and post-processing steps defined directly on the layout algorithms, as
opposed to only the core algorithm.
-
The
LayoutAbortController (formerly AbortHandler) is no
longer available as a property on LayoutData classes but only on the LayoutExecutor.
-
Static methods on
LayoutAbortController (formerly AbortHandler) like GetFromGraph have been removed
since the handler instance can easily be accessed via the LayoutGraphContext when
working with LayoutGraph.
-
The default values of properties
LayoutAbortController.StopDuration and LayoutAbortController.CancelDuration has been changed from TimeSpan.Zero to TimeSpan.MaxValue. Previously,
Zero was interpreted as unlimited time, which is not the case anymore.
-
The default value of the algorithm properties
RankAssignment.MaximumDuration and
NodeAggregation.MaximumDuration (now called StopDuration) has been changed from TimeSpan.Zero to
TimeSpan.MaxValue. Zero is no longer interpreted as an unrestricted running time but is
the shortest possible time.
-
Renamed
BorderLine.CreateMin to CreateMinimum.
-
Renamed
BorderLine.CreateMax to CreateMaximum.
-
Removed the
YPointPath class. Instead of this class an array or more generally an
IEnumerable of type PointD[] is now used in API members.
-
Changed value to of
HierarchicLayout.AlternativeEdgePathDpKey, ClearAreaLayout.ExpandedNodeOriginalEdgePathDpKey and GivenCoordinatesStage.EdgePathDpKey to IEnumerable<PointD>.
-
Changed
BusDescriptor properties BusPoints
and ComputedBusPoints to type PointD[].
-
Updated the constructor of
DpKeyBase and subclasses to accept a single string
parameter 'ID' for unique identification.
-
Removed properties
DpKeyBase.DeclaringType and DpKeyBase.Name.
-
Made
DpKeyBase class abstract.
-
Renamed
GraphLayoutLineWrapper to LineWrappingStage.
-
Renamed
HideGroupsStage to GroupHidingStage.
-
Renamed
TemporaryGroupNodeInsertionStage to TemporaryGroupInsertionStage and the respective data class from TemporaryGroupNodeInsertionData to TemporaryGroupInsertionData.
-
Renamed
BorderLineSide to Side, moved to namespace Layout and renamed its values:
North to Side.Top, East to Side.Right, South to Side.Bottom, and
West to Side.Left.
-
Moved
BorderLine and BorderLineSegment to namespace
Layout.
-
The methods
PortCalculator.CalculatePorts and PortCalculator.EqualsEps have been removed.
-
The following methods have been removed from the
ReverseEdgesStage: ReverseEdgesStage.FindReversedTreeEdges, ReverseEdgesStage.ReverseEdge and ReverseEdgesStage.ReverseEdges.
-
The
HandleNaNCoordinatesStage has been removed.
-
LayoutMultiplexer has been removed. The features of ComponentLayout (ComponentLayoutDataKey) or RecursiveGroupLayout (GroupNodeLayoutDataKey) can be
used instead.
-
Merged
MinimumSizeGroupBoundsCalculator and InsetsGroupBoundsCalculator into the new GroupBoundsCalculator class.
-
Renamed
MirrorModes to MirroredOrientations and OrientationLayout.MirrorMode to MirroredOrientations.
-
The API names to define routing styles throughout the layout algorithms have been streamlined and made more
consistent. Properties on layout algorithms have all been renamed to
EdgeRoutingStyle and those on edge-specific classes have been renamed to
RoutingStyle.
-
The
Polyline.EdgeRoutingStyle enum has been renamed to Router.RoutingStyle.
-
The
Tree.EdgeRoutingStyle enum has been renamed to SingleLayerSubtreePlacerRoutingStyle.
-
The
LayeredRoutingStyle enum has been renamed to LevelAlignedSubtreePlacerRoutingStyle.
-
The
Radial.EdgeRoutingStrategy enum has been renamed to Radial.RoutingStyle.
-
The
Partial.EdgeRoutingStrategy enum has been renamed to Partial.RoutingStyle.
-
The
Hierarchic.EdgeRoutingStyle enum has been renamed to Hierarchical.RoutingStyle while the old RoutingStyle class has been
renamed to RoutingStyleDescriptor.
-
Removed the
GraphTransformer class; use factory methods from LayoutTransformations class instead to create stages that apply transformation operations
on a LayoutGraph.
-
The
CopiedLayoutGraph class was removed from the API. To create a copy of a layout
graph, the new factory LayoutGraph.CreateCopy method may be used.
-
LayoutGraphHider: Method names have been standardized for consistency. Collection
parameters and return values are now of type IEnumerable. Methods with non-nullable
parameters will now throw an exception if passed null values.
-
Renamed
EdgeBundlingStage to BundledEdgeRouter.
-
The classes
FixPortLocationStage and FixPortLocationStageData have been removed from the library. To correct the port locations
after applying a layout use the PortPlacementStage class.
-
PortPlacementStage.PathCorrection has been replaced by PortPlacementStage.RouteCorrectionPolicy of enum type RouteCorrectionPolicy.
-
The utility
PortConstraintConfigurator class has been removed.
-
The classes
ChannelEdgeRouter, OrthogonalPatternEdgeRouter and OrthogonalSegmentDistributionStage have been removed from the library. Their functionality
is superseded by the EdgeRouter routing algorithm.
-
To configure the
EdgeRouter to generate a style that is similar to the removed
ChannelEdgeRouter, set the StopDuration
property to zero and use the predefined penalty configuration EdgeRouterCosts.LowQuality. It is however not compatible with advanced features like
integrated edge label placement.
-
Removed
NormalizeGraphElementOrderStage. Use NodeComparison and EdgeComparison of LayoutExecutor instead.
-
The
SnapOuterPortsToNodeBorderStage class has been removed.
-
The
CompositeLayoutStage class has been removed. If a complex composition of layout
stages is required, the new LayoutStageStack class can be used instead. To get an
ILayoutAlgorithm that is then applied like CompositeLayoutStage was before, LayoutStageStack.LinkCoreLayouts method must be called.
-
The
BufferedLayout class has been removed. To apply a layout algorithm on a copy of a
LayoutGraph instance use LayoutGraph.CreateCopy method
to get a copy, then apply the layout on it and, finally, write back the result using LayoutGraphCopyData.CommitLayoutToOriginalGraph.
-
The
AbortHandler.CheckFailed property has been removed. To achieve the same
functionality, the LayoutAbortController (new name of the AbortHandler) can be subclassed, overriding its Check method which allows to detect calls to that method.
-
The
OrientationLayout class has been renamed to OrientationStage.
-
Furthermore, the following methods have been removed from that class:
IsOrientationMirrored, Transform, PrepareTransform, CompleteTransform,
CreateOrientedNodeHalo, CreateOrientedInsets and CreateOrientedNodeSize.
-
The port-related properties of the layout data classes (
SourcePortGroupIds,
TargetPortGroupIds, SourcePortCandidates, TargetPortCandidates)
have been moved to a sub-data accessible via the property Ports.
-
Removed public methods
HideGroupNodes and UnhideGroupNodes of GroupHidingStage.
-
Removed
LayoutKeys.NodeIdDpKey and LayoutKeys.EdgeIdDpKey.
-
The
GraphDpKey class was replaced by ValueDataKey.
-
The
TemporaryGroupDescriptor used by TemporaryGroupInsertionStage class to define temporary group nodes now does not allow that
properties Insets, MinimumSize and Margins (formerly Halo) are null anymore. Previously
this was the default which is now InsetsD.Empty, SizeD.Empty and InsetsD.Empty, meaning that the behavior
does not change.
-
Removed
SplitEdgeStage.
-
Removed the classes
PartitionLayout and PartitionLayoutData.
-
Renamed
BendConverter to BendSubstitutionStage.
-
GraphPartitionManager is removed, LayoutGraphHider
provides the same functionality.
-
PortCalculator, IIntersectionCalculator, and IntersectionCalculatorKeys have been removed. Instead, the LayoutExecutor.PortAdjustmentPolicy property should be set to a suitable value.
-
The
OrientationLayout.HorizontalOrientation property has been removed. To check for
a horizontal orientation, check if Orientation property equals LayoutOrientation.LeftToRight or LayoutOrientation.RightToLeft.
-
Renamed
GivenCoordinatesStage to GivenCoordinatesLayout.
-
Renamed
GivenCoordinatesStageData to GivenCoordinatesLayoutData.
-
Removed the look-up keys
GroupingKeys.GroupDpKey, GroupingKeys.NodeIdDpKey and GroupingKeys.ParentNodeIdDpKey which were necessary to define grouping information for
LayoutGraph instances. This can now be achieved via the helper LayoutGraphGrouping class or directly via instance methods such as LayoutGraph.SetIsGroupNode.
-
The public constructors of
ItemMapping and ItemCollection have been removed. Instead the instances returned by the LayoutData properties should be used to configure the LayoutData.
-
The optional
ItemMapping parameter of GenericLayoutData.AddItemMapping has been removed.
-
The optional
ItemCollection parameter of GenericLayoutData.AddItemCollection has been removed.
-
Renamed the
SubgraphLayout class to SubgraphLayoutStage
and renamed the respective layout data class from SubgraphLayoutData to SubgraphLayoutStageData.
-
Methods and and properties with "BoundingBox" in their name have been renamed to include "Bounds" instead.
Incompatible Behavior Changes
-
Method
LayoutGraph.ReverseEdge now reverses the edge path too. To exchange only
source and target of an edge use LayoutGraph.ChangeEdge method.
Layout Data
Incompatible API Changes
-
The value type of properties
HierarchicalLayoutData.LayerIndicesResult, HierarchicalLayoutData.SequenceIndicesResult, HierarchicalLayoutData.GivenLayersIndices, RadialLayoutData.LayerIds and CircularLayoutData.CircleIdsResult has been changed from number to a nullable number
value. Null as value means that nothing was published for an item.
-
The value type of the keys
HierarchicalLayout.LayerIndexResultDataKey, HierarchicalLayout.SequenceIndexResultDataKey, GivenLayersAssigner.LayerIndexDataKey, RadialLayout.LayerIdDataKey and CircularLayout.CircleIdResultDataKey has been changed from number to a nullable number
value. Null as value means that the nothing was published for an item.
-
Properties of type
ItemMapping in LayoutData classes are
now named using plural consistently.
-
The type
SingleItem<TItem> was removed.
Affected properties use ItemCollection<TItem> instead.
Hierarchical Layout
Incompatible API Changes
-
Renamed all types, methods, properties, and namespaces containing "hierarchic" to "hierarchical" including
HierarchicLayout, which is renamed to HierarchicalLayout.
-
IPortConstraintOptimizer has been renamed to IPortCandidateSelector, and its methods have been renamed from OptimizeAfterLayering and OptimizeAfterSequencing to SelectAfterLayering and IPortCandidateSelector.SelectAfterSequencing.
-
PortConstraintOptimizerBase has been removed.
-
PortCandidateOptimizer has been renamed to PortCandidateSelector and its properties have been renamed: BackLoopPenalty to BackLoopCost, CrossingPenalty to CrossingCost, and OverUsagePenalty to OverUsageCost.
-
Renamed the
DefaultDrawingDistanceCalculator.NodeToNodeDistance property to DrawingDistanceCalculator.NodeDistance.
-
Renamed the
DefaultDrawingDistanceCalculator.EdgeToEdgeDistance property to DrawingDistanceCalculator.EdgeDistance.
-
Renamed the
HierarchicLayout.NodeToNodeDistance property to NodeDistance.
-
Renamed the
HierarchicLayout.EdgeToEdgeDistance property to EdgeDistance.
-
Renamed "Layerer" to "LayerAssigner" in the following types and members;
-
Renamed
ILayerer to ILayerAssigner.
-
Moved
HierarchicLayout.FixedElementsLayerer to HierarchicalLayoutCore and renamed to FixedElementsLayerAssigner.
-
Moved
HierarchicLayout.FromScratchLayerer to HierarchicalLayoutCore and renamed to FromScratchLayerAssigner.
-
Renamed
WeightedLayerer to WeightedLayerAssigner.
-
Renamed
ConstraintIncrementalLayerer to ConstraintIncrementalLayerAssigner.
-
Renamed
MultiComponentLayerer to MultiComponentLayerAssigner.
-
Renamed
MultiComponentLayerer.SingleComponentLayerer to SingleComponentLayerAssigner.
-
Renamed
AspectRatioComponentLayerer.SingleComponentLayerer to SingleComponentLayerAssigner.
-
Renamed
TopologicalLayerer to TopologicalLayerAssigner.
-
Renamed
AspectRatioComponentLayerer to AspectRatioComponentLayerAssigner.
-
Renamed
BFSLayerer to BfsLayerAssigner.
-
Renamed
GivenLayersLayerer to GivenLayersAssigner.
-
Renamed
HierarchicLayoutCore.CreateIncrementalLayerer to CreateIncrementalLayerAssigner.
-
Renamed
HierarchicLayoutData.BfsLayererCoreNodes to BfsLayerAssignerCoreNodes.
-
Renamed
AsIsLayerer to FromSketchLayerAssigner.
-
Renamed
GivenLayersLayerer.LayerIdDpKey to LayerIndexDataKey.
-
Renamed
HierarchicLayoutData.GivenLayersLayererIds to GivenLayersIndices.
-
Removed
HierarchicLayoutData.ConstraintIncrementalLayererAdditionalEdgeWeights.
-
Renamed
AsIsSequencer to FromSketchSequencer.
-
Renamed
LayerType to HierarchicalLayoutLayerType.
-
Renamed
DefaultLayerSequencer to DefaultSequencer.
-
Methods
ConstraintIncrementalLayerer.CheckConstraints, GivenLayersLayerer.Normalize have been removed.
-
The protected callback methods
GetLayerAlignment and AssignNodesToSublayer have been removed from the CoordinateAssigner class (formerly called SimplexNodePlacer). Furthermore, its GetMinDistance
method has been renamed to GetMinimumDistance.
-
The
IDrawingDistanceCalculator.GetMinDistance method has been renamed to GetMinimumDistance.
-
HierarchicalLayout.GridSpacing: made grid spacing behavior consistent across all
layouts by throwing an exception for negative values.
-
Renamed
Hierarchic.NodeDataType to HierarchicalLayoutNodeType and its value Normal to HierarchicalLayoutNodeType.Regular.
-
Renamed
Hierarchic.EdgeDataType to HierarchicalLayoutEdgeType and its value Normal to HierarchicalLayoutEdgeType.Regular.
-
Renamed
LayerType.Normal to HierarchicalLayoutLayerType.Regular.
-
Renamed
MergingPolicy to LayerMergingPolicy.
-
Renamed
RankingPolicy to LayerRerankingPolicy and TopologicalLayerer.RankingPolicy to RerankingPolicy.
-
Renamed
WeightHeuristic to SequencerWeightHeuristic.
-
Names containing
PortBorderGap were renamed to now contain BorderToPortGapRatio.
-
Renamed
EdgeLayoutDescriptor to HierarchicalLayoutEdgeDescriptor.
-
Renamed
HierarchicLayout.EdgeLayoutDescriptor to DefaultEdgeDescriptor.
-
Renamed and moved
HierarchicLayoutCore.EdgeLayoutDescriptorDpKey to HierarchicalLayout.EdgeDescriptorDataKey.
-
Renamed
HierarchicLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.
-
Renamed
NodeLayoutDescriptor to HierarchicalLayoutNodeDescriptor.
-
Renamed
HierarchicLayout.NodeLayoutDescriptor to DefaultNodeDescriptor.
-
Renamed and moved
HierarchicLayoutCore.NodeLayoutDescriptorDpKey to HierarchicalLayout.NodeDescriptorDataKey.
-
Renamed
HierarchicLayoutData.NodeLayoutDescriptors to NodeDescriptors.
-
Replaced
INodeData interface with HierarchicalLayoutNodeContext class.
-
Renamed
INodeData.GroupId to HierarchicalLayoutNodeContext.EdgeGroupId.
-
Removed the
INodeData.ParentGroupNode property.
-
Replaced
IEdgeData interface with HierarchicalLayoutEdgeContext class.
-
IEdgeData.Type is read-only on the new HierarchicalLayoutEdgeContext.
-
The following
IEdgeData properties now offer read and write access on the new
HierarchicalLayoutEdgeContext: SourceGroup,
TargetGroup, SourcePortGroup, TargetPortGroup, SourcePortCandidates,
TargetPortCandidates, Thickness,
CrossingCost, CriticalEdgePriority,
SourcePortAlignment, TargetPortAlignment.
-
Renamed
IEdgeData.SourcePortConstraint and TargetPortConstraint to SelectedSourcePortCandidate and SelectedTargetPortCandidate respectively. Bot properties now offer read and
write access.
-
Removed the
IEdgeData.Group property.
-
Replaced
ILayer interface with HierarchicalLayoutLayer
class.
-
Renamed the
ILayer.List property to HierarchicalLayoutLayer class.Nodes.
-
Replaced
ILayers interface with a list of HierarchicalLayoutLayer instances accessible via HierarchicalLayoutContext.Layers property.
-
Methods
HierarchicalLayoutContext.InsertLayer and RemoveLayer are replacements for the ILayers.Insert and ILayers.Remove methods.
-
Replaced
IItemFactory interface with ItemFactory class.
Several of the factory methods have also been removed or renamed.
-
CreateDummyEdge has been renamed to CreateHelperEdge.
-
CreateProxyNode has been renamed to CreateSideProxyNode and
DestroyProxyNode to DestroySideProxyNode.
-
CreateSameLayerProxy has been renamed to CreateSameLayerProxyEdge and DestroySameLayerProxy to DestroySameLayerProxyEdge.
-
SetTemporaryEdgeGroups has been renamed to CreateGroupedEdgeContext.
-
SetTemporaryCriticalEdgePriority has been removed.
-
SetTemporaryCrossingCost has been removed.
-
SetTemporaryEdgeThickness has been removed.
-
SetTemporaryPortConstraint has been removed.
-
EdgeDataType.RedirectedGroupEdge has been removed.
-
Separated
HierarchicLayout.IncrementalHintsDpKey in IncrementalNodeHintsDataKey and IncrementalEdgeHintsDataKey.
-
Separated enum
IncrementalHint in IncrementalNodeHint for nodes and IncrementalEdgeHint for edges.
-
Separated
HierarchicLayoutData.IncrementalHints in HierarchicalLayoutData.IncrementalNodes and HierarchicalLayoutData.IncrementalEdges. IncrementalNodes now only allows for specifying the nodes that should be inserted
incrementally during the layering phase. Additional options for incremental node insertion can be specified using
GenericLayoutData.
-
Removed
GroupCompactionStrategy.
-
Renamed
SimplexNodePlacer.GroupCompactionStrategy to GroupCompaction and changed its type to boolean.
-
The
DefaultDrawingDistanceCalculator.OptimizeSwimlaneDistances property has been
removed. The behavior does not change and is the same as the old default where the property was disabled. Override
DrawingDistanceCalculator.GetMinimumDistance method and assign zero to nodes that
are in different rows/columns to get the same behavior as when previously enabling the property.
-
Property
SimplexNodePlacer.SwimLaneCrossingWeight has been renamed to LayoutGridCrossingWeight. Note that the class has been renamed to CoordinateAssigner.
-
The
TypeBasedDrawingDistanceCalculator class has been removed.
-
The classes
ILayeredComponentsMerger and DefaultLayeredComponentsMerger have been removed. The functionality is integrated into the
MultiComponentLayerer, which now offers a new MergingPolicy property and protected method Merge for the case that a custom merging approach is required.
-
The
HierarchicLayout.OrthogonalRouting property has been removed. To specify
orthogonal or other routing styles, the routing style on the HierarchicalLayoutEdgeDescriptor must be used instead.
-
Renamed
IPortAllocator to IHierarchicalLayoutPortAssigner.
-
Renamed
DefaultPortAllocator to HierarchicalLayoutPortAssigner.
-
Properties
HierarchicLayout.RecursiveGroupLayering and HierarchicLayout.CompactGroups are combined into HierarchicalLayout.GroupLayeringPolicy.
-
BusDescriptor is renamed to GridComponentDescriptor.
-
HierarchicLayout.BusDescriptorDpKey is renamed to GridComponentDescriptorDataKey.
-
HierarchicLayoutData.Buses is renamed to GridComponents.
-
HierarchicLayoutData.BusRootOffsets is renamed to GridComponentRootOffsets.
-
NodeDataType.BusStructureDummy is renamed to GridComponentBusNode.
-
Renamed
SimplexNodePlacer.BarycenterMode to SymmetryOptimizationStrategy and changed its type to SymmetryOptimizationStrategy. It now supports performing strong, weak and no additional
symmetry optimization.
-
Refactored the enum
HierarchicLayout.LayoutMode property into a boolean FromSketchMode property and removed the LayoutMode enum.
-
The
ICandidateMatcher interface has been removed. For an advanced customization of the
port selection consider implementing a custom IPortCandidateSelector.
-
Moved
HierarchicLayout.StopAfterLayering/Sequencing to HierarchicalLayoutCore.
-
The
ILayoutDataProvider interface is removed and its functionality is moved to HierarchicalLayoutContext.
-
The
ILayers interface is moved to the HierarchicalLayoutContext, and methods that accepted ILayers
as a parameter instead accept HierarchicalLayoutContext now.
-
The
IItemFactory interface is moved to the HierarchicalLayoutContext, and methods that accepted IItemFactory as a parameter instead accept HierarchicalLayoutContext now.
-
The obsolete extension methods
CreateLayerConstraintFactory and CreateSequenceConstraintFactory have been removed from HierarchicLayout. To specify layer and sequence constraints, use LayoutData instead.
-
LayerConstraintData no longer inherits from LayoutData.
-
SequenceConstraintData no longer inherits from LayoutData.
-
NodeLayoutDescriptor.NodeLabelMode was removed. If node labels shall be considered
by the layout algorithm, they are now considered during all phases. In particular, self-loops do not overlap node
labels anymore.
-
The
NodeLabelMode enum was removed.
-
The
NodeLayoutDescriptor class of the HierarchicLayout
algorithm, which was renamed to HierarchicalLayoutNodeDescriptor, does no longer allow
to specify the border-to-port gap ratios individually for each node side. The BorderToPortGapRatio property now defines the value for all four node sides.
-
Property
HierarchicLayoutData.SelfLoopCalculatorData was removed. Settings like
minimum lengths for self-loop edges are specified via the HierarchicalLayoutEdgeDescriptor class like for normal edges.
-
The
SelfLoopCalculator and SelfLoopCalculatorData
classes was removed from the API.
-
In the sub-data
SequenceConstraintData of the HierarchicalLayoutData PlaceBefore and PlaceAfter were replaced by PlaceInOrder.
-
In the sub-data
LayerConstraintData of the HierarchicalLayoutData PlaceAbove and PlaceBelow were replaced by PlaceInOrder.
-
The
INodePlacer interface of the hierarchic layout has been renamed to ICoordinateAssigner. Its implementation has been renamed from SimplexNodePlacer to CoordinateAssigner.
-
The
HierarchicLayout.SeparateLayers property has been moved to CoordinateAssigner.SeparateLayers, since it has always only worked when using that
implementation.
-
The
IEdgeReverser interface and the HierarchicLayoutCore.CreateEdgeReverser method have been removed.
-
The
GroupTransposition property has been removed from DefaultLayerSequencer class. The Transposition property should now be used for groups too.
-
The
HierarchicLayoutCore class is not a standalone layout algorithm anymore but now
offers only access to more advanced features of the HierarchicLayout class.
-
All public data keys were moved to the
HierarchicLayout class.
-
The protected API of both classes was reduced, but still even highly advanced customization are possible.
-
The protected methods
DefaultPortAllocator.GetPortBorderGap, DefaultPortAllocator.GetPortBorderGapRatio, and DefaultPortAllocator.GetPortDistanceDelta were removed.
-
Removed members
HierarchicLayout.CreateLayerConstraintFactory, HierarchicLayoutData.LayerConstraintFactory, HierarchicLayout.CreateSequenceConstraintFactory and HierarchicLayoutData.SequenceConstraintFactory. The factories are no longer required to
define layering and sequence constraints.
-
The recommended way is to use properties
HierarchicLayoutData.LayerConstraints
and HierarchicLayoutData.SequenceConstraints.
-
For expert uses cases (e.g. algorithm customization), the low-level helper classes
LayoutGraphLayerConstraints and LayoutGraphSequenceConstraints were added.
-
Removed the keys
HierarchicLayout.LayerConstraintsMementoDpKey and HierarchicLayout.SequenceConstraintsMementoDpKey.
-
Class
TopLevelGroupToSwimlaneStage has been removed from the library.
Incompatible Behavior Changes
-
The
HierarchicalLayout now considers node labels by default.
-
The
HierarchicalLayout now places edge labels by default using an integrated labeling
algorithm.
-
Changed the default edge routing style of the
HierarchicalLayout class from Polyline
to Orthogonal.
Tree Layout
Incompatible API Changes
-
Renamed
TreeLayout.MultiParentAllowed to AllowMultiParent.
-
Renamed
TreeReductionStage.MultiParentAllowed to AllowMultiParent.
-
Renamed "NodePlacer" to "SubtreePlacer" in the following types and members:
-
Renamed the
DefaultNodePlacer class to SingleLayerSubtreePlacer.
-
Renamed the
DelegatingNodePlacer class to SingleSplitSubtreePlacer.
-
Renamed the
DoubleLineNodePlacer class to DoubleLayerSubtreePlacer.
-
Renamed the
FreeNodePlacer class to FixedSubtreePlacer.
-
Renamed the
GridNodePlacer class to MultiLayerSubtreePlacer.
-
Renamed the
GroupedNodePlacer class to MultiSplitSubtreePlacer. The class now considers port grouping (use TreeLayoutData.Ports) to define how child nodes are split.
-
Renamed the
LayeredNodePlacer class to LevelAlignedSubtreePlacer.
-
Renamed the
TreeLayout.DefaultNodePlacer property to DefaultSubtreePlacer.
-
Renamed the
TreeLayoutData.DelegatingNodePlacerPrimaryNodes property to SingleSplitSubtreePlacerPrimaryNodes.
-
Renamed the
TreeLayoutData.GridNodePlacerRowIndices property to MultiLayerSubtreePlacerLayerIndices.
-
Renamed
ConnectorDirection to SubtreeConnectorDirection, and the values
North to SubtreeConnectorDirection.Up, East to SubtreeConnectorDirection.Right, South to SubtreeConnectorDirection.Down, and West to SubtreeConnectorDirection.Left.
-
Renamed the values of
ParentConnectorDirection: North to ParentConnectorDirection.Up, East to ParentConnectorDirection.Right, South to ParentConnectorDirection.Down, and West to ParentConnectorDirection.Left.
-
Replaced
Tree.Matrix with the SubtreeTransform enum and
renamed constants:
-
Matrix.Default to SubtreeTransform.None.
-
Matrix.MirHor to SubtreeTransform.FlipY.
-
Matrix.MirVert to SubtreeTransform.FlipX.
-
Matrix.Rot90 to SubtreeTransform.RotateLeft.
-
Matrix.Rot180 to SubtreeTransform.Rotate180.
-
Matrix.Rot270 to SubtreeTransform.RotateRight.
-
Matrix.MirVertRot90 to SubtreeTransform.RotateRightFlipY.
-
Matrix.MirHorRot90 to SubtreeTransform.RotateLeftFlipY.
-
Renamed
TreeLayoutData.OutEdgeComparers to TreeLayoutData.ChildOrder and changed the types to Comparison function.
-
Removed
TreeLayout.DefaultOutEdgeComparer. Use TreeLayoutData.ChildOrder instead. Also removed NodeOrderComparer class.
-
Removed the
SimpleNodePlacer class; use DefaultSubtreePlacer class instead.
-
Replaced
DefaultNodePlacer.ChildPlacement property with the new SingleLayerSubtreePlacer.Transformation property. The former
ChildPlacement.HorizontalDownward value now maps to SubtreeTransform.None, ChildPlacement.HorizontalUpward
to SubtreeTransform.FlipY,
ChildPlacement.VerticalToLeft to SubtreeTransform.RotateRight, and ChildPlacement.VerticalToRight to SubtreeTransform.RotateLeftFlipY.
-
Renamed
RootAlignment.CenterOverChildren to SubtreeRootAlignment.CenterOfChildren.
-
Renamed
RootAlignment.Leading to SubtreeRootAlignment.Left, RootAlignment.Trailing to
SubtreeRootAlignment.Right, RootAlignment.LeadingOffset to SubtreeRootAlignment.Leading, and RootAlignment.TrailingOffset to SubtreeRootAlignment.Trailing.
-
The
TreeComponentLayout class has been removed.
-
Renamed
FillStyle to AspectRatioChildAlignmentPolicy and
AspectRatioNodePlacer.FillStyle to ChildAlignmentPolicy.
-
The
AspectRatioTreeLayout has been removed together with AspectRatioTreeLayoutData, RootPlacement, and SubtreeArrangement. Use the TreeLayout with the AspectRatioSubtreePlacer instead.
-
Replaced
TreeLayoutData.OutEdgeComparers property with new, more powerful ChildOrder property.
-
The
TreeReductionStage.NonTreeEdgeLabelingAlgorithm property has been renamed to
NonTreeEdgeLabeling.
-
Remove methods
GetPortBorderGap and GetPortDistanceDelta from the DefaultPortAssignment
(renamed to TreeLayoutPortAssigner) class.
-
Removed the
NodePlacerBase class. Implement ISubtreePlacer interface instead.
-
Removed the method
PlaceSubtree(Node, ParentConnectorDirection) of former subclasses of NodePlacerBase class. Override PlaceSubtree
method(IMapper<Node, SubtreeShape>, IMapper<Node, SubtreeShape>, LayoutGraph, Node) instead.
-
Removed the
DetermineChildConnector method of former subclasses of NodePlacerBase class. Override DetermineChildConnectors method instead.
-
Removed the methods
GetNodeShape and GetSubtreeShape from former subclasses of NodePlacerBase class.
-
Renamed all types, methods and properties containing "NodePlacer" to "SubtreePlacer".
-
The
DefaultPortAssignment.BorderGapToPortGapRatio property was renamed to BorderToPortGapRatio.
-
Tree.PortAssignmentMode value PortConstraint has been
removed. Port candidates are always considered if they are specified.
-
Tree.PortAssignmentMode values DistributedEast,
DistributedWest, DistributedNorth, DistributedSouth have been replaced by value Distributed. The side can be specified by using TreeLayoutData.Ports.
-
Tree.PortAssignmentMode.None has been renamed Tree.PortAssignmentMode.Center.
-
TreeLayout.GetPortAssignment can no longer be overridden. To specify IPortAssignment strategies per node, TreeLayoutData.PortAssigners can be used.
-
TreeLayout.GetNodePlacer can no longer be overridden. To specify NodePlacer strategies per node, TreeLayoutData.SubtreePlacers can be used.
-
The following methods of
TreeLayout have been removed:
-
ReverseEdges.
-
GetRootsArray.
-
GetOutEdgeComparer - TreeLayoutData.ChildOrder can be used instead.
-
CreateNodeShape - ModifyNodeShape
can be used instead to modify the shape.
-
DirectTree - TreeLayoutData.TreeRoot can
be used to accomplish the same result.
-
DefaultNodePlacer.CalculateParentConnector has been removed. Custom implementations
can be inlined at the end of PlaceSubtree.
-
SubtreeShape.AddBoundsToShape accepts a single RectD
parameter instead of its deconstructed values.
-
SubtreeShape.AssignValuesTo has been removed - CreateCopy can be used instead.
-
The API of the node placer implementations has been simplified and improved. The
INodePlacer interface was renamed to ISubtreePlacer.
-
The class hierarchy of the various node placer implementations has been simplified. The rotatable base class
implementation has been removed from the hierarchy.
-
Renamed
IPortAssignment to ITreeLayoutPortAssigner.
-
Renamed
DefaultPortAssignment to TreeLayoutPortAssigner.
-
Renamed
TreeLayout.PortAssignmentDpKey to PortAssignerDataKey.
-
Renamed
TreeLayoutData.PortAssignments to PortAssigners.
-
Renamed the property
RoutingStyle.Polyline to SingleLayerSubtreePlacerRoutingStyle.StraightLineToChildConnector, RoutingStyle.Fork property to SingleLayerSubtreePlacerRoutingStyle.Orthogonal, and RoutingStyle.ForkAtRoot property to SingleLayerSubtreePlacerRoutingStyle.OrthogonalAtRoot.
-
Added
SingleLayerSubtreePlacerRoutingStyle.Polyline property which leads to a
polyline routing style.
-
The
ClassicTreeLayout has been removed together with the enums
LeafPlacement, EdgeRoutingStyle, and PortStyle. The TreeLayout can be used instead.
-
The properties
TreeLayout.SourcePortConstraintDataAcceptor and TreeLayout.TargetPortConstraintDataAcceptor have been removed.
-
The properties
TreeLayout.SourceGroupDataAcceptor
and TreeLayout.TargetGroupDataAcceptor have been removed.
-
Removed the
TreeLayout.DefaultLeafPlacer property as well as LeafNodePlacer class.
-
DelegatingNodePlacer now implements ISubtreePlacer
instead of IFromSketchNodePlacer.
-
BusNodePlacer now implements ISubtreePlacer instead of
IFromSketchNodePlacer.
-
Renamed
IProcessor to ISubtreePlacerProcessor.
-
All layouts suitable for trees, such as
TreeLayout, RadialTreeLayout, now default to using the TreeReductionStage to temporarily remove non-tree edges from the graph during layout
calculation.
-
The
GridNodePlacer.AutomaticRowAssignment property (now renamed to MultiLayerSubtreePlacer) was removed. The layers are now always automatically assigned if
no layer indices are defined via TreeLayoutData.MultiLayerSubtreePlacerLayerIndices.
-
The
TreeLayout.graph field has been removed. For customizations in the TreeLayout the graph is available whatsoever and can if required be queried from the
node/edge items.
-
Method
TreeLayout.LayoutRoot now has an additional parameter of type LayoutGraph as its first argument.
-
Removed the
LayeredNodePlacer.Id property (class was also renamed to LevelAlignedSubtreePlacer). The ID can still be provided via the constructor. Reading it
later should never be necessary.
-
The factory
TreeReductionStage.CreateStraightLineRouter method has been removed. The
standalone router StraightLineEdgeRouter class should be used instead when
straight-line edges are required.
Incompatible Behavior Changes
-
Port candidates are always considered if they are specified.
-
The
TreeLayout now considers node labels by default.
-
The
TreeLayout now places edge labels by default using an integrated labeling
algorithm.
Orthogonal Layout
Incompatible API Changes
-
The
LayoutStyle enum (belonging to the OrthogonalLayout)
has been renamed to OrthogonalLayoutMode. Furthermore, the new values are Strict
(former Default), ForcedStraightLine (former Box) , and Relaxed (former FixedMixed). The former values Uniform, FixedBox, and Mixed have been removed from the enum.
-
The
OrthogonalLayout properties related to substructures have all been renamed to
contain "substructure" in their name. ChainStyle, ChainSize, TreeStyle, TreeSize, TreeOrientation, CycleStyle, CycleSize are now called ChainSubstructureStyle, ChainSubstructureSize, TreeSubstructureStyle, TreeSubstructureSize, TreeSubstructureOrientation, CycleSubstructureStyle,
CycleSubstructureSize.
-
The following properties have been removed from the
OrthogonalLayout class:
Randomization, CrossingReduction, EdgeLengthReduction, OptimizePerceivedBends
and FaceMaximization. Use the new QualityTimeRatio property instead.
-
Removed the
CompactOrthogonalLayout class.
-
The
DirectedEdges properties of OrthogonalLayoutData and PartialLayoutData are now both of type ItemMapping with the
name EdgeOrientation and support floating-point values to also specify edges
oriented against the main layout direction.
-
EdgeDirectednessDpKey on all supporting ILayoutAlgorithms have been
combined into a global data key LayoutKeys.EdgeDirectednessDataKey.
-
PartialLayout.DirectedEdgesDpKey is renamed to EdgeOrientationDataKey and now also allows specifying edges should be routed
against the main layout orientation.
-
Renamed
EdgeLayoutDescriptor to OrthogonalLayoutEdgeDescriptor.
-
Renamed
OrthogonalLayout.EdgeLayoutDescriptor to DefaultEdgeDescriptor.
-
Renamed
OrthogonalLayout.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
-
Renamed
OrthogonalLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.
Incompatible Behavior Changes
-
The
OrthogonalLayout now considers node labels by default.
-
The
OrthogonalLayout now places edge labels by default using an integrated labeling
algorithm.
Edge Router
Incompatible API Changes
-
The
MonotonicPathRestriction enum is now a flags enum and is called MonotonicPathRestrictions.
-
The
SelfLoopRouter.SmartSelfLoopPlacement property has been removed. It was enabled
by default and the algorithm now always behaves like when it was enabled previously. To get all self-loops on the
same node corner independently of other edges, the SelfLoopRouter can be applied in a
separate post-processing step where only self-loops are present in the graph (use SubgraphLayoutStage).
-
Method
ParallelEdgeRouter.LayoutParallelEdges was renamed to RouteEdges.
-
Renamed
ParallelEdgeRouter.RoutedParallelEdgesDpKey to RoutedMultiEdgesResultDataKey.
-
Renamed
ParallelEdgeRouter.FindAndHideParallelEdges to FindAndHideMultiEdges.
-
Renamed
ParallelEdgeRouterData.RoutedParallelEdges to RoutedMultiEdgesResult.
-
The
ParallelEdgeRouter.AbsJoinEndDistance property has been renamed to AbsoluteJoinEndDistance.
-
The
ParallelEdgeRouter.RelJoinEndDistance property has been renamed to RelativeJoinEndDistanceFactor, and its default value now is 0.
-
The
ParallelEdgeRouter.LineDistance property has been renamed to EdgeDistance.
-
The
SelfLoopRouter.LineDistance property has been renamed to EdgeDistance.
-
The
SelfLoopRouter.LayoutSelfLoops method has been removed. To route the self-loop
edges, the SelfLoopRouter class should be applied to the graph.
-
The
SelfLoopRouter.LayoutStyle property has been renamed to RoutingStyle. The respective enum type has been renamed to SelfLoopRoutingStyle.
-
The
OrganicEdgeRouter.CreateNodeEnlargementStage method has been removed and is now
replaced by the new AllowMovingNodes property.
-
The
OrganicEdgeRouter.EdgeNodeOverlapAllowed property has been renamed to OrganicEdgeRouter.AllowEdgeNodeOverlaps.
-
The
BusRouter class and all API members related to it have been removed. For bus-style
edge routing, use EdgeRouter instead.
-
Renamed the
CurveEdgeLayoutDescriptor.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
-
Renamed the
EdgeLayoutDescriptor.MinimumEdgeToEdgeDistance property (EdgeRouter) to MinimumEdgeDistance.
-
Renamed the
PenaltySettings.MinimumEdgeToEdgeDistancePenalty property to EdgeRouterCosts.MinimumEdgeDistanceCost.
-
Renamed
Interval.Min to Interval.Minimum.
-
Renamed
Interval.Max to Interval.Maximum.
-
Renamed
OrthogonalInterval.Min to OrthogonalInterval.Minimum.
-
Renamed
OrthogonalInterval.Max to OrthogonalInterval.Maximum.
-
Replaced
EdgeRouter.EdgeComparer property of type IComparer with EdgeRouterData.EdgeProcessingComparison of
type Comparison function.
-
The
EdgeRouter.IgnoreInnerNodeLabels property has been removed from the API.
Consideration is controlled via EdgeRouter.NodeLabelPlacement. Inner labels of
non-group are only ignored when choosing value EdgeRouterNodeLabelPlacement.Ignore;
labels of group nodes alone can be ignored when choosing EdgeRouterNodeLabelPlacement.IgnoreGroupLabels.
-
The protected
EdgeRouter.CreateDefaultEdgeOrderComparer method has been removed. Use
EdgeRouterData.EdgeProcessingComparison instead.
-
Refactored the API for customizing the
EdgeRouter class.
-
The classes/interfaces
PathSearch, PathSearchResult,
CellSegmentInfo, EdgeInfo, Channel, ChannelBasedPathRouting, SegmentInfo, SegmentInfoBase, SegmentGroup, Router.Polyline.Alignment, DynamicObstacleDecomposition,
IObstaclePartition, IPartition, GraphPartition, GraphPartitionExtensionAdapter, IDecompositionListener, IDynamicDecomposition, IEnterIntervalCalculator and IGraphPartitionExtension
have been removed.
-
The
PartitionCell.CreateBorderInterval method has been removed alongside with
the PartitionCellBorder enum.
-
The properties
EdgeCellInfo.EnterSegmentGroup, EdgeCellInfo.ExitSegmentGroup and EdgeCellInfo.CellSegmentInfos have been removed.
-
The properties
EdgeRouter.RegisteredPartitionExtensions, RegisteredPathSearchExtensions and Partition have been removed, as well as
methods CreateObstacleDecomposition, CreatePathSearch, CreatePathSearchContext, ConfigurePathSearch, CreatePathRouting,
CreateConfiguration, ConfigureGraphPartition and CleanUpGraphPartition.
-
The properties
PathSearchContext.PathSearch and PathSearchContext.PathSearchResult have been removed.
-
Added new methods
EdgeRouter.AddPathSearchExtension and EdgeRouter.AddPartitionExtension.
-
Added
PartitionExtension class as replacement for IGraphPartitionExtension.
-
Added new
IRouterPartition interface as replacement of IObstaclePartition and IPartition.
-
The Partition property has been added to
PathSearchConfiguration class.
-
The
Path.Length property has been renamed to PathSearchResult.CellEntranceCount.
-
Renamed
Obstacle to RoutingObstacle.
-
Renamed
Path to PathSearchResult.
-
Renamed
PathRequest to PathSearchRequest.
-
Renamed
EdgeLayoutDescriptor to EdgeRouterEdgeDescriptor.
-
Renamed
CurveEdgeLayoutDescriptor to CurveRoutingEdgeDescriptor.
-
Renamed
EdgeRouter.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
-
Renamed
EdgeRouter.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
-
Renamed
EdgeRouter.GetEdgeLayoutDescriptor to GetEdgeDescriptor.
-
Renamed
EdgeRouterData.EdgeLayoutDescriptors to EdgeDescriptors.
-
Renamed
PathSearchContext.CurrentEdgeLayoutDescriptor to CurrentEdgeDescriptor.
-
Renamed
CurveRoutingStage.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
-
Renamed
CurveRoutingStage.CurveEdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
-
Renamed
CurveRoutingStageData.EdgeLayoutDescriptors to EdgeDescriptors.
-
EdgeRouter.Grid has been replaced by EdgeRouter.GridSpacing.
-
The class
Polyline.Grid has been removed.
-
The
EdgeRouter and all its related classes have been moved from namespace yWorks.Layout.Router.Polyline to yWorks.Layout.Router.
-
Class
PenaltySettings and EdgeLayoutDescriptor.PenaltySettings property where renamed to EdgeRouterCosts and EdgeRouterEdgeDescriptor.EdgeRouterCosts.
-
The already obsolete properties
EdgeRouter.PolylineRouting, EdgeRouter.PreferredPolylineSegmentLength and EdgeRouter.MaximumPolylineSegmentRatio have been removed. They are replaced by
respective properties on the EdgeRouterEdgeDescriptor class.
-
The
PolylineLayoutStage class has been renamed to OctilinearRoutingStage. Its PreferredPolylineSegmentLength property has been renamed to PreferredOctilinearSegmentLength.
-
The type of
IntermediateRoutingPoints property has been changed from IList to IEnumerable.
Incompatible Behavior Changes
-
The default of
ParallelEdgeRouter.RelativeJoinEndDistanceFactor has changed from 0.1
to 0.
-
The
EdgeRouter now considers node labels by default.
-
The
EdgeRouter now places edge labels by default using a generic labeling algorithm.
Labeling
Incompatible API Changes
-
The
PreferredPlacementDescriptor class has been renamed to EdgeLabelPreferredPlacement.
-
The
IEdgeLabelLayout.PreferredPlacementDescriptor property has been removed.
Instead, the preferred placement can be specified using EdgeLabelPreferredPlacement.EdgeLabelPreferredPlacementDataKey.
-
Removed the interfaces
INodeLabelLayout and IEdgeLabelLayout. Labels of the LayoutGraph are instead
represented by types NodeLabel and EdgeLabel.
-
Removed
LayoutGraph.GetLabelLayout. Labels can instead be retrieved using Node.Labels and Edge.Labels.
-
Removed the
ILabelLayoutFactory class. Labels can instead be created and removed using
LayoutGraph.AddLabel and LayoutGraph.Remove.
-
Removed the interfaces
INodeLabelLayoutModel, IEdgeLabelLayoutModel and all implementations. To specify valid positions for GenericLabeling, the types NodeLabelCandidates and EdgeLabelCandidates offer methods for creating positions that correspond to the old model
implementations. Candidates can be specified using GenericLabelingData.NodeLabelCandidates and GenericLabelingData.EdgeLabelCandidates.
-
Summarized layout algorithm properties such as
ConsiderNodeLabels, ConsiderEdgeLabels,
IntegratedNodeLabeling, IntegratedEdgeLabeling, and NodeLabelingPolicy as
two properties NodeLabelPlacement and EdgeLabelPlacement.
-
Removed
LabelLayoutTranslator, LabelLayoutData, LabelLayoutKeys and related classes. The behavior of LabelLayoutData can be recreated using NodeLabel.AbsolutePlacement and EdgeLabel.AbsolutePlacement.
-
Removed properties
RemoveNodeOverlaps, RemoveEdgeOverlaps and EdgeGroupOverlapAllowed from GenericLabeling.
-
Introduced
GenericLabeling.QualityTimeRatio property providing the possibility of
balancing runtime and quality.
-
Added intersection information to
LabelCandidate class, which provides means to
compute profits and to mimic the behavior of the removed properties.
-
Removed
MISLabelingBase.OptimizationStrategy. Use GenericLabeling.DefaultNodeLabelingCosts and GenericLabeling.DefaultEdgeLabelingCosts instead. Additionally individual costs can now
be set for each label, using GenericLabelingData.NodeLabelingCosts and GenericLabelingData.EdgeLabelingCosts.
-
Removed
LabelingBase.AutoFlipping. Automatically flipping labels right-side up is
handled by the view, e.g. SmartEdgeLabelModel.AutoRotation.
-
Removed the
IProfitModel interface and properties LabelingBase.ProfitModel and MISLabelingBase.CustomProfitModelRatio. Custom weights for a label candidate can be set
at creation of the candidate with NodeLabelCandidates and EdgeLabelCandidates, or through a callback for each label using GenericLabelingData.NodeLabelCandidateProcessors and GenericLabelingData.EdgeLabelCandidateProcessors.
-
Removed the classes
MISLabelingBase and LabelingBase.
-
Removed the following protected methods from
GenericLabeling: CreateEdges, AssignProfit, FoundLabelOverlap, FoundNodeOverlap, FoundEdgeOverlap, FoundHaloOverlap, FoundPartitionGridLineOverlap, FoundPartitionGridInsetOverlap, FoundPartitionGridInteriorOverlap.
-
Made enums
LabelAngleOnRightSideRotations and LabelAngleReferences non-flags enums.
-
Removed the
LabelAngleOnRightSideOffsets enum.
-
Changed the
PreferredPlacementDescriptor.AngleOffsetOnRightSide enum property to the
AddHalfRotationOnRightSide bool property.
-
MISLabelingBase.ReduceAmbiguity is removed. Ambiguous label placements can instead
be penalized using LabelingCosts.AmbiguousPlacementCost.
-
Removed the
GraphModelManager.LabelLayerPolicy property. Use the more specific
properties NodeLabelLayerPolicy, EdgeLabelLayerPolicy and PortLabelLayerPolicy instead.
-
The
SandwichLabelModel has been removed. It can be emulated using a CompositeLabelModel with the top and bottom position of an ExteriorNodeLabelModel.
-
Renamed
LabelSideReferences.AbsoluteWithLeftInNorth to AbsoluteWithLeftAbove.
-
Renamed
LabelSideReferences.AbsoluteWithRightInNorth to AbsoluteWithRightAbove.
-
ILabelCandidateDescriptor and related interfaces have been removed.
-
LayoutGraphAdapter: removed GetLabelCandidateDescriptorProvider and GetLabelCandidateDescriptor.
-
Renamed
SliderMode to EdgeLabelSliderMode.
-
Values of
DiscreteNodeLabelPositions have been renamed:
-
DiscreteNodeLabelPositions.Top, DiscreteNodeLabelPositions.TopLeft, ... have been renamed to TopInside, TopLeftInside, ...
-
DiscreteNodeLabelPositions.North, DiscreteNodeLabelPositions.NorthWest, ... have been renamed to DiscreteNodeLabelPositions.Top, DiscreteNodeLabelPositions.TopLeft, ...
-
Values of
DiscreteNodeLabelPositions enum have been renamed.
-
InternalMask to Inside.
-
EightPosMask to DiscreteNodeLabelPositions.Outside.
-
SidesMask to Sides.
-
CornerMask to Corners.
-
Removed value
SandwichMask.
-
Removed
DescriptorWrapperLabelModel.
-
The configuration
LabelingData class for the GenericLabeling algorithm has been renamed to GenericLabelingData to be more in line with other LayoutData
implementations.
Organic Layout
Incompatible API Changes
-
TreeSubstructureStyle.Balloon has been renamed to RadialTree.
-
Renamed
OrganicLayout.ClusterAsGroupSubstructureAllowed to AllowClusterAsGroupSubstructure.
-
Renamed
OrganicLayout.NodeEdgeOverlapAvoided to AvoidNodeEdgeOverlap.
-
Renamed
OrganicLayout.NodeOverlapsAllowed to AllowNodeOverlaps.
-
The classes
OrganicRemoveOverlapsStage and ShuffleLayout
have been removed from the library. To solve the task of overlap removal, the RemoveOverlapsStage class is still available and the style previously generated by OrganicRemoveOverlapsStage can be triggered via the policy OverlapRemovalPolicy.PreserveRelativeLocations.
-
The
OrganicPartitionGridLayoutStage class has been removed.
-
The
RecursiveShuffleLayout class has been removed from the API.
-
Renamed
GroupNodeMode.Normal to GroupNodeHandlingPolicy.Free.
-
Renamed
OrganicLayoutData.SourceGroupIds to SubstructureSourceGroupIds. OrganicLayout now uses
OrganicLayout.SubstructureSourceGroupIdDataKey instead of LayoutKeys.SourceEdgeGroupIdDataKey.
-
Renamed
OrganicLayoutData.TargetGroupIds to SubstructureTargetGroupIds. OrganicLayout now uses
OrganicLayout.SubstructureTargetGroupIdDataKey instead of LayoutKeys.TargetEdgeGroupIdDataKey.
-
Renamed the
OrganicLayout.GroupNodeModeDpKey property to GroupNodeHandlingPolicyDataKey.
-
The
OrganicLayout now configures the ComponentLayout by
default, and SmartComponentLayout was removed.
-
OrganicLayout.ConfigureComponentLayout and DisposeComponentLayout were removed. To configure the ComponentLayout, replace the instance of the ComponentLayout
in the LayoutStageStack with a suitably configured instance.
-
Removed
ConstraintFactory and OrganicLayout.CreateConstraintFactory. Use OrganicLayoutData.Constraints instead.
-
OrganicConstraintData.AddFloatingBoundingBox now accepts SizeD its deconstructed values.
-
OrganicConstraintData.AddFloatingBoundingBox now accepts RectD its deconstructed values.
-
OrganicLayout.ConsiderNodeSizes was removed. The OrganicLayout now always considers node sizes.
-
OrganicConstraintData no longer inherits from LayoutData.
-
The
OutputRestriction class and the associated properties have been renamed to ShapeConstraint.
-
Removed the
ClusterNodes property from OrganicLayout. It is replaced by ClusteringPolicy property.
To disable the clustering, specify ClusteringPolicy.None. To enable it choose one of
the available other policies.
-
Removed the
ClusteringQuality property from OrganicLayout. Use QualityTimeRatio instead.
-
The
OrganicLayout class no longer offers value ClusteringPolicy.UserDefined. Now, cluster IDs provided by users via OrganicLayoutData.ClusterIds property or data key OrganicLayout.ClusterIdDataKey are always considered first. If none are defined, the
specified OrganicLayout.ClusteringPolicy is considered.
-
The
ClassicOrganicLayout class has been removed. It is superseded by the more powerful
OrganicLayout algorithm that should be used instead.
Incompatible Behavior Changes
-
The
OrganicLayout now considers node labels by default.
-
The
OrganicLayout now places edge labels by default using a generic labeling
algorithm.
-
The default style of the
OrganicLayout's ComponentLayout
is changed to PackedCircle.
-
The
OrganicLayout now always considers node sizes.
Interactive Organic Layout
Incompatible API Changes
-
The
InteractiveOrganicLayoutData class has been added. It handles the initial settings
per node and edge.
-
The classes
InteractiveOrganicNodeHandle and InteractiveOrganicEdgeHandle have been added. They handle the settings per node and edge
while the algorithm runs.
-
The properties, getters, and setters on
InteractiveOrganicLayout that concern settings
for individual items have been moved to InteractiveOrganicLayoutData or the handles as
appropriate.
-
The
InteractiveOrganicLayout.AddStructureUpdate method has been removed.
-
The methods
InteractiveOrganicLayout.CommitPositions and CommitPositionsSmoothly have been combined as the InteractiveOrganicLayoutData.UpdateNodeCenters method.
-
The
InteractiveOrganicLayout.OutputRestriction property has been renamed to ShapeConstraint.
-
The
InteractiveOrganicLayout.PreferredEdgeLength property has been renamed to DefaultPreferredEdgeLength.
-
The
InteractiveOrganicLayout.SyncStructure method has been removed.
Circular Layout
Incompatible API Changes
-
Renamed the
ExteriorEdgeLayoutDescriptor.EdgeToEdgeDistance property to CircularLayoutExteriorEdgeDescriptor.EdgeDistance.
-
The type of the
CircularLayout.MaximumDeviationAngle property has been changed to
double.
-
Renamed
CircularLayout.LayoutStyle to CircularLayout.PartitioningPolicy.
-
Renamed
Circular.LayoutStyle to Circular.PartitioningPolicy.
-
Removed the enum value
LayoutStyle.CustomGroups. If custom partitions are specified
using CircularLayoutData.Partitions, they are respected by the CircularLayout automatically.
-
The
INodeSequencer class has been removed from the API. Use the new CircularLayoutData.NodeComparison property to specify custom node orders.
-
The
CircularLayout.LayoutStyle property has been renamed to PartitioningPolicy to better reflect the fact that it controls how nodes are partitioned.
The corresponding enum has also been renamed from to PartitioningPolicy.
-
Renamed
EdgeLayoutDescriptor to CircularLayoutEdgeDescriptor.
-
Renamed
CircularLayout.DefaultEdgeLayoutDescriptor to EdgeDescriptor.
-
Renamed
ExteriorEdgeLayoutDescriptor to CircularLayoutExteriorEdgeDescriptor.
-
Renamed
CircularLayout.ExteriorEdgeLayoutDescriptor to ExteriorEdgeDescriptor.
-
The
SingleCycleLayout has been removed. The CircularLayout with PartitioningPolicy set to SingleCycle can be used instead.
-
CircularLayout.SingleCycleLayout has been replaced by CircularLayout.PartitionDescriptor.
-
CircularLayout.DefaultEdgeLayoutDescriptor has been renamed to EdgeDescriptor.
-
CircularLayout.BalloonLayout has been renamed to BackboneLayout.
-
Removed the enum value
EdgeRoutingPolicy.MarkedExterior. To manually select which
edges should be routed externally, use the CircularLayoutData.ExteriorEdges property
instead.
Incompatible Behavior Changes
-
The
CircularLayout now considers node labels by default.
-
The
CircularLayout now places edge labels by default using a generic labeling
algorithm.
-
The default style of the
CircularLayout's ComponentLayout is changed to PackedCircle.
-
PartitionDescriptor.InitialAngle is measured in degrees rather than radians.
Radial Layout
Incompatible API Changes
-
Radial.NodeInfo is renamed to RadialLayoutNodePlacementResult.
-
The read/write
CenterNodesDpKey property from the RadialLayout class has been removed. It was replaced by the static read-only key RadialLayout.CenterNodesDataKey that must now be used instead to mark the custom center
nodes.
-
Renamed the
RadialLayout.MinimumNodeToNodeDistance property to MinimumNodeDistance.
-
Renamed the
RadialLayout.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
-
Renamed
Radial.LayeringStrategy to RadialLayeringStrategy.
-
Replaced
ItemMapping OutEdgeComparers with ChildOrderData ChildOrder.
-
Replaced properties
RadialLayoutData.NodeComparables and RadialLayoutData.OutEdgeComparers with new, more powerful ChildOrder property.
-
Removed the enum value
Radial.LayeringStrategy.UserDefined. Custom layers are now
always used if defined via RadialLayoutData.LayerIds property.
-
Radial.NodeInfo has been renamed to RadialLayoutNodePlacementResult.
-
Removed the enum value
CenterNodesPolicy.Custom. Custom center nodes are now always
used if defined via RadialLayoutData.CenterNodes property.
Incompatible Behavior Changes
-
Custom layers are now always used if defined via
RadialLayoutData.LayerIds property.
-
The
RadialLayout now considers node labels by default.
-
The
RadialLayout now places edge labels by default using a generic labeling algorithm.
-
The default style of the
RadialLayout's ComponentLayout
is changed to PackedCircle.
-
The
RadialLayoutNodePlacementResult.SectorStart property is now interpreted in
clockwise direction.
-
Custom center nodes are now always used if defined via
RadialLayoutData.CenterNodes
property.
Radial Tree Layout
Incompatible API Changes
-
BalloonLayout has been renamed to RadialTreeLayout, and
BalloonLayoutData has been renamed to RadialTreeLayoutData.
-
The following members have been removed from
BalloonLayout (now RadialTreeLayout): The field graph, the BalloonLayout class.NodeInfo, the methods GetInfo, CalculateChildArrangement, CalculateAngles, DetermineRoot, and SortChildNodes, the FromSketchMode property
(use the new enum value FromSketch of ChildOrderingPolicy instead), and the InterleavedMode
property (use RadialTreeLayoutData.InterleavedNodes instead).
-
The following members of
BalloonLayout (now RadialTreeLayout) have been renamed: PreferredChildWedge has been renamed to PreferredChildSectorAngle, PreferredRootWedge has been renamed to PreferredRootSectorAngle, and the GetPreferredChildWedge method has been renamed to GetPreferredChildSectorAngle.
-
The
InterleavedMode enum has been removed.
-
The enum value
InterleavedMode.MarkedNodes has been removed. To define specific
parents for interleaved placed child nodes use the RadialTreeLayoutData.InterleavedNodes property.
-
The enum value
RootNodePolicy.SelectedRoot has been removed. A custom root node is
now always used if defined via RadialTreeLayoutData.TreeRoot property.
-
The types of the following properties have been changed to double:
PreferredChildSectorAngle, PreferredRootSectorAngle, MinimumEdgeLength,
and MinimumNodeDistance.
-
Renamed
RootNodePolicy to RootSelectionPolicy.
-
Removed
BalloonLayout.Comparer. Use RadialTreeLayoutData.ChildOrder instead.
-
Replaced layout data
OutEdgeComparer property with ChildOrderData ChildOrder.
-
Replaced
BalloonLayoutData.OutEdgeComparer property with new, more powerful ChildOrder property (class is renamed to RadialTreeLayoutData).
Incompatible Behavior Changes
-
The compactness factor is now interpreted differently. Larger values result in more compact drawings. Its range has
been changed to [0, 1].
-
The from-sketch option of
RadialTreeLayout sorts like before but no longer takes
precedence over orders specified with the RadialTreeLayoutData properties ChildOrder or NodeTypes.
-
The
RadialTreeLayout now considers node labels by default.
-
The
RadialTreeLayout now places edge labels by default using an integrated labeling
algorithm.
-
The default style of the
RadialTreeLayout's (formerly BalloonLayout's) ComponentLayout is changed to PackedCircle.
Radial Group Layout
Incompatible API Changes
-
Renamed
CactusGroupLayout.GroupSizingPolicy to RadialGroupLayout.GroupSizePolicy.
-
Replaced
CactusGroupLayout.NodeComparer property of type IComparer with RadialGroupLayoutData.ChildNodeComparison of
type Comparison function.
-
The
CactusGroupLayout has been renamed to RadialGroupLayout, and the CactusGroupLayoutData has been
renamed to RadialGroupLayoutData.
-
Property
PreferredRootWedge has been renamed to PreferredRootSectorAngle.
Incompatible Behavior Changes
-
The
RadialGroupLayout now places edge labels by default using a generic labeling
algorithm.
-
The default of the
PreferredRootSectorAngle property has been changed from 180
to 360.
-
The default style of the
RadialGroupLayout's (formerly CactusGroupLayout's) ComponentLayout is changed to PackedCircle.
Series-parallel Layout
Incompatible API Changes
-
Renamed the
SeriesParallelLayout.MinimumNodeToNodeDistance property to MinimumNodeDistance.
-
Renamed the
SeriesParallelLayout.MinimumEdgeToEdgeDistance property to MinimumEdgeDistance.
-
Removed
SeriesParallelLayout.DefaultOutEdgeComparer. Use SeriesParallelLayoutData.ChildOrder instead. Also removed DefaultOutEdgeComparer class.
-
Replaced
SeriesParallelLayoutData property .OutEdgeComparers with new, more powerful ChildOrder property.
-
The
GeneralGraphHandling property was removed. SeriesParallelLayout now handles general graphs by default.
-
The
DefaultPortAssignment.BorderGapToPortGapRatio property was renamed to BorderToPortGapRatio.
-
Remove methods
GetPortBorderGap and GetPortDistanceDelta from the DefaultPortAssignment
class.
-
The
SeriesParallelLayout.NonSeriesParallelEdgeLabelingAlgorithm property has been
renamed to NonSeriesParallelEdgeLabeling.
-
Renamed
EdgeLayoutDescriptor to SeriesParallelLayoutEdgeDescriptor.
-
Renamed
SeriesParallelLayout.DefaultEdgeLayoutDescriptor to DefaultEdgeDescriptor.
-
Renamed
SeriesParallelLayout.EdgeLayoutDescriptorDpKey to EdgeDescriptorDataKey.
-
Renamed
SeriesParallelLayoutData.EdgeLayoutDescriptors to EdgeDescriptors.
-
Renamed the
SeriesParallelLayout.VerticalAlignment property to ParallelSubgraphAlignment.
-
The combinations of the enums
ForkStyle and PortAssignmentMode have been integrated into the PortAssignmentMode enum, and the ForkStyle enum has been
removed.
-
DefaultPortAssignment.ForkStyle has been removed.
-
Renamed
IPortAssignment to ISeriesParallelLayoutPortAssigner.
-
Renamed
DefaultPortAssignment to SeriesParallelLayoutPortAssigner.
-
Renamed
SeriesParallelLayout.PortAssignmentDpKey to PortAssignerDataKey.
-
Renamed
SeriesParallelLayoutData.PortAssignments to PortAssigners.
Incompatible Behavior Changes
-
SeriesParallelLayout now handles general graphs by default.
-
The
SeriesParallelLayout now considers node labels by default.
-
The
SeriesParallelLayout now places edge labels by default using an integrated
labeling algorithm.
Compact Disk Layout
Incompatible Behavior Changes
-
The
CompactDiskLayout now considers node labels by default.
-
The
CompactDiskLayout now places edge labels by default using a generic labeling
algorithm.
Multi-page Layout
Incompatible API Changes
-
MultiPageLayoutResult is now an inner class of MultiPageLayout.
-
Renamed
GroupingPolicy to MultiPageGroupingPolicy.
-
Renamed
Multipage.NodeType to MultiPageNodeType and its
value Normal to MultiPageNodeType.Regular.
-
Renamed
Multipage.EdgeType to MultiPageEdgeType and its
value Normal to MultiPageEdgeType.Regular.
-
The
EdgeBundleModes enum and the associated properties have been renamed to MultiEdgeConnectorPolicy. The enum values have been renamed to Separate, ShareForSameDirection and Share, respectively. The corresponding EdgeDataKey
has been renamed to MultiEdgeConnectorIdDataKey (previously EdgeTypeDpKey).
-
The
MultiPageLayout.CreateProxyReferenceNodes property has been renamed to UseProxyReferenceNodes.
-
The
EdgeBundleModes enum has been renamed to MultiEdgeConnectorPolicy and converted from a flags enum to a regular enum. To manually
select which multi-edges should be distinguished, use the MultiPageLayoutData.MultiEdgeConnectorIds property.
-
The properties
MultiPageLayout.EdgeBundleModeMask, MultiPageLayout.EdgeTypeDpKey, and MultiPageLayoutData.EdgeTypes have been renamed to MultiPageLayout.MultiEdgeConnectorPolicy, MultiPageLayout.MultiEdgeConnectorIdDataKey, and MultiPageLayoutData.MultiEdgeConnectorIds.
-
The public API of the
MultiPageLayout class has been changed.
-
The
ILayoutCallback interface has been removed. The respective MultiPageLayout.LayoutCallback property is now an Action delegate instead.
Furthermore, MultiPageLayout.CalculateLayout method has been removed, meaning
the layout can and should only be started like all other algorithms (e.g. via the LayoutExecutor or IGraph.ApplyLayout).
-
The
IElementFactory interface and the DefaultElementFactory class have been removed. The replacement is MultiPageElementFactory class which can be accessed and modified using MultiPageLayout.ElementFactory property.
-
The
MultiPageLayout.CreateElementFactory method has been removed. The factory
can be get and set using MultiPageLayout.ElementFactory property.
-
The
IElementInfoManager interface has been removed.
-
The
LayoutContext class of the MultiPageLayout has
been renamed to MultiPageLayoutContext and its properties Graph and Layout have
been removed.
-
The
INodeInfo, IEdgeInfo, INodeLabelInfo, IEdgeLabelInfo interfaces related to
MultiPageLayout have been removed. The data provided by them can now be retrieved
via methods of the MultiPageLayoutContext (which is available also as property on
the MultiPageLayoutResult).
-
The callback methods
MultiPageLayout.RemoveConnectorPair, RouteRestoredEdges and ApplyIncrementalLayout have been removed.
-
MultiPageLayoutResult.GetPage and PageCount
have been replaced by PageGraphs.
-
MultiPageLayoutData handles the ID mapping automatically. Consequently, the explicit
mappings NodeIds, EdgeIds, NodeLabelIds, and EdgeLabelIds have been
removed. Original graph items can be obtained by calling MultiPageLayoutData.GetOriginalItem.
Partial Layout
Incompatible API Changes
-
Renamed
Partial.LayoutOrientation to PartialLayoutOrientation.
-
Removed the enum value
ComponentAssignmentStrategy.Customized. Custom components are
now always used if defined with PartialLayoutData.ComponentIds, ClearAreaLayoutData.ComponentIds or FillAreaLayoutData.ComponentIds respectively.
-
The
PartialLayout.LayoutSubgraph method has been removed.
-
The callback
ConfigureEdgeRouter method has been removed from classes PartialLayout and ClearAreaLayout. The router instance can
be specified via the PartialLayout.EdgeRouter and ClearAreaLayout.EdgeRouter properties so that an additional configuration callback is
not necessary.
Incompatible Behavior Changes
-
Custom components are now always used if defined with
PartialLayoutData.ComponentIds.
Tabular Layout
Incompatible API Changes
-
Replaced
TabularLayout.NodeComparer property of type IComparer with TabularLayoutData.FreeNodeComparison of type
Comparison function.
-
Renamed
Tabular.LayoutPolicy to TabularLayoutMode.
-
The
TabularLayout class now features its own data key (LayoutGridCellDescriptorResultDataKey) where it will publish cell IDs of nodes
that it explicitly assigned to the cells. Previously it reused the common data key PartitionGrid.PartitionCellIdDpKey.
-
Renamed
NodeLayoutDescriptor to TabularLayoutNodeDescriptor.
-
Renamed
TabularLayout.DefaultNodeLayoutDescriptor to DefaultNodeDescriptor.
-
Renamed
TabularLayout.NodeLayoutDescriptorDpKey to NodeDescriptorDataKey.
-
Renamed
TabularLayoutData.NodeLayoutDescriptors to NodeDescriptors.
Incompatible Behavior Changes
-
The
TabularLayout now considers node labels by default.
-
The
TabularLayout now places edge labels by default using a generic labeling
algorithm.
Component Layout
Incompatible API Changes
-
If
ComponentLayout is used as a pre-processing step to apply a layout algorithm on
multiple connected components, the StopDuration of that layout is divided
appropriately over all components, instead of being applied once per component.
-
The
IsolatedGroupComponentLayout class has been removed.
-
Renamed
ComponentArrangementStyles.None to ComponentArrangementStyle.KeepCenters.
-
Removed the
ComponentArrangement property from ComponentLayout; use the new ComponentArrangementStyle.None instead to avoid arranging components.
-
The
ComponentArrangementStyles enum has been renamed to ComponentArrangementStyle, as it is no longer a Flags-Enum.
-
Removed
ComponentArrangementStyles.Mask.
-
Replaced
ComponentArrangementStyles.ModifierNoOverlap with TryKeepCenters.
-
Replaced
ComponentArrangementStyles.ModifierAsIs with ComponentLayout.FromSketchMode.
-
Renamed
ComponentLayout.CalculateBounds to CalculateComponentBounds.
-
Renamed
ComponentLayout.SetOrigin to SetComponentLocation.
-
Removed
ComponentLayout.ArrangeFields method.
-
Simplified parameter lists of methods
ComponentLayout.ArrangeComponents and ComponentLayout.SetOrigin to now accept instances of Component class.
Incompatible Behavior Changes
-
ComponentArrangementStyle.PackedCircle and ComponentArrangementStyle.PackedRectangle now consider the convex hulls of components to
determine overlaps.
Tree Map Layout
Incompatible API Changes
-
Replaced
TreeMapLayout.NodeComparer property of type IComparer with TreeMapLayoutData.ChildNodeComparison of
type Comparison function.
-
Removed the
NodeWeightComparer class.
-
Renamed
TilingPolicy to TilingStrategy and TreeMapLayout.TilingPolicy to TreeMapLayout.TilingStrategy.
Recursive Group Layout
Incompatible API Changes
-
RecursiveGroupLayout.NullLayout is renamed to RecursiveGroupLayout.FixContentLayout.
-
FixGroupLayoutStage is removed and its functionality is replaced by RecursiveGroupLayout using RecursiveGroupLayout.FixGroupLayout for all groups.
-
The
RecursiveGroupLayout class now ignores empty group nodes by default (see ConsiderEmptyGroups property).
-
The signature of
IGroupBoundsCalculator.CalculateBounds method was changed. The
given children are now of type IListEnumerable<Node>.
-
The
GroupBoundsCalculator implementation now keeps the center of empty group nodes if
ConsiderEmptyGroups is enabled.
-
Method
GroupBoundsCalculator.CalculateBounds now correctly considers the specified
children. Previously, the given children were ignored and all graph elements were considered when calculating the
group bounds.
Layout Grid
Incompatible API Changes
-
Renamed all types, methods and properties containing "CellId" to "CellDescriptor".
-
Removed properties
OptimizeRowOrder and OptimizeColumnOrder from PartitionGridData class.
-
Removed the data key
PartitionGrid.PartitionGridDpKey. The key LayoutGrid.LayoutGridCellDescriptorDataKey is now the only data key which can be used to
specify layout grids.
-
Removed data key
RecursiveGroupLayout.GroupNodePartitionGridDpKey. The key LayoutGrid.LayoutGridCellDescriptorDataKey is now the only data key which can be used to
specify layout grids.
-
Renamed inset properties on classes
LayoutGridColumn (formerly ColumnDescriptor) and LayoutGridRow (formerly RowDescriptor) to now be called padding (e.g., LeftPadding instead of LeftInset).
-
The methods
PartitionGrid.PrepareOrientationChange and PartitionGrid.FinalizeOrientationChange have been removed.
-
Removed properties
OriginalPosition and OriginalWidth from LayoutGridColumn class (formerly
ColumnDescriptor). Use properties LayoutGridColumn.Position (formerly ComputedPosition) or LayoutGridColumn.Width
(formerly ComputedWidth).
-
Removed properties
OriginalPosition and OriginalHeight from LayoutGridRow class (formerly
RowDescriptor). Use properties LayoutGridRow.Position
(formerly ComputedPosition) or LayoutGridRow.Height (formerly ComputedHeight).
-
PartitionGrid is renamed to LayoutGrid. This also
affects the related classes PartitionGridData, GenericPartitionGridStage, and GenericPartitionGridStageData.
-
Renamed
ColumnDescriptor to LayoutGridColumn & RowDescriptor to LayoutGridRow.
-
Renamed
PartitionCellId to LayoutGridCellDescriptor.
-
The
SwimlaneDescriptor class has been removed from the API. Use LayoutGrid class (formerly called PartitionGrid) instead,
which is able to model one-dimensional and two-dimensional grids.
-
The
PartitionGridLayoutStage class has been removed. It is not necessary to manually
add this stage, since HierarchicalLayout can support LayoutGrid out-of-the-box.
-
Removed helper class
Swimlanes and Layout.SwimlaneRepresentative.
-
Removed the
SwimlanesMode enum.
Other Layouts
Incompatible API Changes
-
Removed the
InterEdgeRoutingStyle enum.
-
Renamed
CurveFittingLayoutStage to CurveFittingStage.
-
Renamed
FixNodeLayoutStage to LayoutAnchoringStage and
FixNodeLayoutData to LayoutAnchoringStageData. In
addition:
-
Renamed
FixPointPolicy to LayoutAnchoringPolicy.
-
Renamed
FixNodeLayoutStage.FixedNodeDpKey to NodeAnchoringPolicyDataKey.
-
Renamed
CalculateFixPoint to CalculateAnchorPoint.
-
Removed
FixNodeLayoutData.FixedNodes. Graph elements to anchor the graph on can
be specified by setting the respective AnchoringPolicies using LayoutAnchoringStageData.
Algorithms
Incompatible API Changes
-
Removed the Groups class. Use corresponding methods of
LayoutGraphAlgorithms instead.
-
Renamed the Dendrogram class to
HierarchicalClusteringDendrogram.
-
Renamed
ParallelEdges.FindParallelEdges to LayoutGraphAlgorithms.FindMultiEdges.
-
Renamed
Analysis.Component to ConnectedComponent.
-
The
Algorithms.NodeAggregation class has been renamed to LayoutGraphNodeAggregation, emphasizing that this class is intended for users working with
the LayoutGraph API only.
-
Furthermore, its member
NodeTypeDpKey has been removed. The replacement is
key LayoutKeys.NodeTypeDataKey.
-
Also, its member
NodeCenterDpKey has been removed. Node centers are now
directly read from the LayoutGraph instance which must contain the coordinates of
nodes if useful results should be generated.
-
Removed the utility class
Sorting that offered methods to get a sorted node array
based on node degrees or another criterion. The functionality is written without this utility by first getting the
array of nodes from the graph and then sorting it using standard built-in sorting utilities.
-
Removed namespace
Algorithms.Util. The types are now in namespace Algorithms.
-
Removed the
GraphConnectivity class. Use corresponding methods of LayoutGraphAlgorithms instead.
-
Removed the
IndependentSets class. Use corresponding methods of LayoutGraphAlgorithms instead.
-
Removed the enum value
EuclideanSquared from DistanceMetric enum. Use enum value Euclidean instead which now calculates with squared
values.
-
Removed the
DistanceMetric enum of KMeansClustering
class. Use KMeansDistanceMetric enum instead.
-
Removed the
AggregationPolicy enum of NodeAggregation class. Use AggregationPolicy enum
instead.
-
Removed the
ShortestPaths class. Use corresponding methods of LayoutGraphAlgorithms class instead (e.g. ShortestPath).
-
The Triangulator algorithm class has been removed.
-
Removed the
BfsDirection enum. Use TraversalDirection
instead.
-
Removed the Intersections class. Use corresponding methods of
LayoutGraphAlgorithms
instead.
-
Removed the
IntersectionAlgorithm class. Use corresponding methods of LayoutGraphAlgorithms instead.
-
Removed the Substructures class. Use corresponding methods of
LayoutGraphAlgorithms
instead.
-
Removed the Trees class. Use corresponding methods of
LayoutGraphAlgorithms instead.
-
Removed the
NetworkFlows class. Use corresponding methods of LayoutGraphAlgorithms instead (e.g. MaximumFlow).
-
Removed the
NodeOrders class. Use corresponding methods of LayoutGraphAlgorithms instead (e.g. TopologicalNodeOrder).
-
Removed the Bipartitions class. Use corresponding methods of
LayoutGraphAlgorithms
instead.
-
Removed the Cycles class. Use corresponding methods of
LayoutGraphAlgorithms instead.
-
Removed the
ParallelEdges class. Use corresponding methods of LayoutGraphAlgorithms instead.
-
Removed the Transitivity class. Use corresponding methods of
LayoutGraphAlgorithms
instead.
-
The
SpanningTrees class has been removed. To compute a minimum spanning tree, use
LayoutGraphAlgorithms.MinimumSpanningTree method.
-
The
RankAssignments class has been removed in favor of the single LayoutGraphAlgorithms.SimplexRankAssignment method that offers access to the rank
assignment algorithm.
-
The
GraphChecker class has been removed and most of its methods are now available on
LayoutGraphAlgorithms.
-
The
TreeAnalyzer class has been removed. Use the more convenient and powerful TreeAnalysis class instead.
-
Removed the Centrality class. Use corresponding methods of
LayoutGraphAlgorithms
instead.
-
Removed the Bfs class. Use
LayoutGraphAlgorithms.Bfs instead.
-
Removed the Dfs class. Use
LayoutGraphAlgorithms.Dfs instead.
Analysis
Incompatible API Changes
-
Renamed
GraphStructureAnalyzer.HasMultipleEdges to HasMultiEdges.
-
Renamed
GraphStructureAnalyzer.GetMultipleEdges to GetMultiEdges.
-
Renamed
AggregationInfo to NodeAggregationInfo.
-
Renamed
AggregationInfo.ParentAggregation to ParentNodeAggregation.
-
Renamed
NodeAggregation.AggregationPolicy to NodeAggregationPolicy.
-
Renamed
NodeAggregation.Aggregation to AggregationPolicy.
-
Renamed
DistanceMetric to KMeansDistanceMetric.
-
The
NodeAggregation.NodeTypeHandling property has been renamed to NodeTypePolicy.
-
The
NodeTypeHandlingPolicy enum has been renamed to NodeTypePolicy.
-
Renamed
Analysis.Component to ConnectedComponent.
-
Renamed
Substructure to SubstructureItems.
-
Replaced enum
Algorithms.Linkage with HierarchicalClusteringLinkage.
Collections
Incompatible API Changes
-
The
YList.ElementAt method was removed.
-
Renamed
ICursor.Prev to ICursor.Previous.
-
Renamed
ListCell.Succ to ListCell.Next.
-
Renamed
ListCell.Pred to ListCell.Previous.
-
Removed the
IsEmpty method from YList class.
Test YList.Count property for 0 instead.
-
Removed the methods
SuccCell and PredCell from YList class. Use new properties ListCell.Next and ListCell.Previous instead.
-
Removed the methods
CyclicSucc, CyclicPred, ContainsAll and RetainAll from YList class.
-
Removed the methods Succ and Pred from
ListCell class. Use new properties Next and
Previous instead.
-
Removed the Peek method from
YList class. Use First property instead.
Geometry
Incompatible API Changes
-
The
GeomUtilities class has been renamed to GeometryUtilities.
-
Implicit and explicit conversion operators between yFiles geometry types and the platform geometry types have been
removed.
-
Renamed the
GeomUtilities.FindRayIntersection method to GetSegmentRayIntersection.
-
Renamed the
GeomUtilities.FindEllipseLineIntersection method to GetEllipseLineIntersection.
-
Moved
Geom.Collinear method to GeometryUtilities class
and renamed to AreCollinear.
-
Moved
Geom.CalcConvexHull method to GeometryUtilities
class and renamed to GetConvexHull.
-
Moved the
Geom.CalcIntersection method to GeometryUtilities class and renamed to GetLineLineIntersection.
-
Removed the
Geom.Projection method. Use PointD.GetProjectionOnSegment method instead.
-
Removed the methods
DistanceToLineSegment of Geom class. Use PointD.DistanceToSegment method instead.
-
Moved
IPlaneObject and LineSegment to namespace yWorks.Geometry.
-
The copy constructors on the
RectD, PointD, and SizeD classes were removed. Use the ToRectD, ToPointD, or ToSizeD methods respectively
instead.
-
All
Intersects methods of the GeneralPath class
are now called PathIntersects.
-
The
MayIntersectClip method of the GeneralPath
class is now called PathMayIntersectClip.
-
All
AreaContains methods of the GeneralPath
class now have an optional flatteningTolerance parameter.
-
The
IsEmpty method of the GeneralPath class was
removed. Use the IsVisible method or the Count property, instead.
-
The
GetBounds overload of the GeneralPath class
that returns the approximate bounds for BΓ©zier segments is now called GetApproximateBounds.
-
Renamed the
LineSegment.XOffset property to YIntercept.
-
Renamed the
LineSegment.IsInXIntervall method to LineSegment.IsInXInterval and LineSegment.IsInYIntervall
method to LineSegment.IsInYInterval.
-
Made
LineSegment class sealed.
-
The
IRectangle interface no longer implements IPoint.
You can get the top-left corner of a rectangle with its GetTopLeft method. For
usages of the dynamic behavior of IPoint, like in a custom IPositionHandler, we recommend to let the IPositionHandler
implement IPoint, too.
-
The
IMutableRectangle interface no longer implements IMutablePoint. When working with the MutableRectangle class,
use its Location property to get a dynamic point of the location.