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
-
LayoutPortCandidate
s now have a MatchingId
. When
finding matching LayoutPortCandidate
s at nodes and for edges, two LayoutPortCandidate
s 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
. PreferredPlacementDescriptor
s are now automatically considered when specified through
LayoutData
s.
-
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
.
-
PortConstraint
s and PortCandidate
s 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.
-
PortCandidateSet
s have been replaced by NodePortCandidates
, and collections of PortCandidate
s 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 ILayoutAlgorithm
s 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.