Skip to content

Releases: panthernet/GraphX

GraphX for .NET v3.0.0

21 Apr 09:41
2ed4947
Compare
Choose a tag to compare
  • Added .NET Core library version

  • Upgraded codebase to .NET Standard 2.0 (thanks to honza77)

  • Upgraded codebase to use QuickGraphCore library

  • Implemented multiple labels logic for edges. Now you can display multiple labels across the edge

  • Added LabelHorizontalOffset property for labels which offsets labels along the edge given some offset value in total edge length percent

  • Improved graph print logic to work with ulong dimensions instead of int

CODE CHANGES:

  • Properties ShowLabel,LabelVerticalOffset,AlignLabelsToEdges moved from EdgeControlBase to EdgeLabelControl class
    • Property AlignLabelsToEdges renamed to AlignToEdge
  • Property EdgeControlBase.EdgeLabelControl renamed to EdgeLabelControls and now has IList type
  • Added new method IList EdgeControlBase.GetLabelSizes()
  • Added new method IList EdgeControlBase.GetLabelControls()
  • GraphArea.ShowAllEdgesLabels() method now has one-time effect and will not be reapplied after relayout
  • GraphArea.ShowAllEdgesLabels() method now has one-time effect and will not be reapplied after relayout
  • GraphArea.EdgeLabelFactory is now setup up with default factory generating one AttachableEdgeLabelControl
  • Label factory method CreateLabel() now returns IEnumerable to accomodate multiple labels generation during single factory pass

OBSOLETE AND REMOVED STUFF:
General

  • Old style arrows are now not supported
  • Old style edge labels (EdgeLabelControl) are now not supported, make sure to remove it from XAML templates and update your code to use AttachableEdgeLabelControl

EdgeControlBase

  • LabelAngle
  • GetLabelSize()
  • SetCustomLabelSize()

EdgeControl

  • LabelMouseDown event removed

Other:

  • showLabel parameter has been removed from all EdgeControl constructors and factories

GraphX for .NET

12 Jan 16:04
Compare
Choose a tag to compare
  • Added edge drag functionality to be able to reattach edge to another vertex (thanks to LaborJos)

  • Fixed SimpleTreeLayout vertex sizes supplement (thanks to edgardozoppi)

  • Fixed and improved parallel edge handling (thanks to perturbare)

  • Fixed RemoveEdge() method were not removing edges from data graph (thanks to perturbare)

  • Removed METRO support and example

  • Added UAP (UWP) support for Windows 10+ platform (VS2017)

  • Minor bugfixes

GraphX for .NET

05 Sep 15:32
Compare
Choose a tag to compare

RELEASE 2.3.6
DETAILED CHANGELOG:

  • Added edge endpoint calculation for rotated vertex that use ellipse, circle and rectangle math shape
  • Added VertexControl::LabelAttached and LabelDetached events which fires when new label is attached to VertexControl or detached from it
  • Added new parameter to GraphArea::UpdateParallelEdgesData(Dictionary<TEdge, EdgeControl> edgeList) to be able to specify edges list to parse for parallelization instead of full edge list parse
  • Added support for object visbility and attachable labels to GraphX serialization data
  • Added ZoomControl::ResetKeyBindings() method to clear all (incl default) set key bindings
  • Fixed ZoomControl dynamic content switch to corectly refresh viewfinder
  • Improved ZoomControl handling with disabled animation
  • Renamed ZoomControl::IsAnimationDisabled to IsAnimationEnabled and changed the logic according the modification
  • Renamed ZoomControl::MaximumZoomStep to ZoomStep and updated description
  • Implemented easy ZoomControl key bindings with BindKey() method and exposed base commands for zoom and pan actions to be able to bind keys for them
  • Some class refactoring

GraphX for .NET

16 Aug 23:03
Compare
Choose a tag to compare

RELEASE 2.3.5
FEATURES HIGHLIGHT:

  • Added new awesome vertex snapping feature on vertex drag. Many thanks to perturbare for this wonderful contibution! The feature is implemented around DragBehaviour class
    and is represented in several new settings allowing the drag to be perform around some sort of virtual snap grid. Please read the comment for the DragBehaviour class for detailed info.
  • Added new feature & example preview in showcase app: graph data filtering. This feature allows you to filter the graph prior to layout generation or relayout based on the pipeline of
    LogicCore::Filters that are processed sequentially. These filters can modify graph using custom logic. The output graph will be available for interaction along with the copy of the original
    graph. User then may choose if he wish to revert graph to the original state or apply filtering results permanently.
    Please read the details at: http://panthernet.ru/forum/index.php/topic/346-235-graph-data-filtering-features/

DETAILED CHANGELOG:

  • Added Universal Windows Application support and example project
  • Added StateStorage::ImportState() method to allow state import/export logic between several graphs
  • Added GraphArea::IsDisposed property that indicated that GraphArea object has been disposed and shouldn't be used anymore
  • Added GraphArea::CreateNewStateStorage() protected method to be able to implement custom state storage logic for GraphArea
  • Added ParameterizedLayoutAlgorithmBase::EnsureUniqueRandomInitialPositions property that enables unique random positions generation for layout algorithms. False by default, True for LinLog algorithm.
  • Added VertexControl::VCPRoot property whcih represents the VCP root container for easier runtime VCP management. To be able to use it you have to define PART_vcproot template element as Panel descendant.
  • Added new awesome vertex snapping feature on vertex drag (thanks to perturbare)
  • Added GraphArea::EnableVisualsRenewOnFiltering property which is True by default. Specifies if visual graph should be updated up on relayout method call.
  • Added methods LogicCore::PushFilters(), LogicCore::ApplyFilters() and LogicCore::PopFilters along with LogicCore::Filters property which implements graph data filtering feature
  • Added LogicCore::IsFiltered property to identify graph filtering state. If graph is filtered the filter results can be applied or popped back.
  • Added new porperty EdgeControlBase::HideEdgePointerOnVertexOverlap which can hide edge pointer on zero length edge
  • Added new property EdgeControlBase::HideEdgePointerByEdgeLength to be able to hide edge pointers if edge length is less than or equal to the specified value. Off by default (0 value).
  • Fixed LogicCore::GetVertexSizeRectangles() method input params and description
  • Fixed incorrect edge pointer position on zero length edge
  • Fixed Avalon Dock interaction which caused strange exception by skipping ZooomControl viewfinder unnecessary refresh pass in some cases
  • Fixed edge label positioning, now it is more accurate for pathed edges
  • Fixed LinLog negative energy issue (thanks to Katya)
  • Fixed one vertex ISOM algorithm exception (thanks to jorgensigvardsson)
  • Fixed external alg vertex sizes grab logic (thanks to ValentinMarinov)
  • Made StateStorage class extensible by adding virtual modifiers to methods
  • Improved algorithm factory logic to avoid graph type cast exceptions in some class declaration cases
  • Improved calc performance for large graphs that use both OR and ER algorithms
  • Moved code extensions to GraphX.PCL.Common library thus eliminating the need for GraphX.PCL.Logic for *.Controls libraries
  • Removed GraphArea::EnableWinFormsHostingMode property as it is not needed any more. The WF checks has been automated.

GraphX for .NET

18 Jan 20:52
Compare
Choose a tag to compare

SERVICE RELEASE 2.3.3
DETAILED CHANGELOG:

  • Exposed internal PrintHelper class with new CalculateEstimatedDPI() method which can calculate DPI required for image export based on specified criterias
  • Fixed arrows display issue when printing

GraphX for .NET

14 Jan 22:05
Compare
Choose a tag to compare

SERVICE RELEASE 2.3.2
DETAILED CHANGELOG:

  • Added GraphArea::ExportAsImageDialog() method which act as old ExportAsImage and the ExportAsImage() method now accepts filename to work without the dialog

BREAKING CHANGES:

  • GraphArea::ExportAsImage() now takes filename as the first parameter and don't have save file dialog (use GraphArea::ExportAsImageDialog() instead)

GraphX for .NET

13 Jan 23:06
Compare
Choose a tag to compare

RELEASE 2.3.1
DETAILED CHANGELOG:

  • Added default templates for attached vertex and edge labels
  • Added HighlightBehavior::HighlightedEdgeType attached property that indicates In or Out edge is currently highlighted. Default value is None.
  • Added GraphArea::GetRelatedVertexControls() and GraphArea::GetRelatedEdgeControls() methods to fetch corresponding objects faster and easily
  • Added new printing logic. Now you can use GraphArea::PrintDialog() and GraphArea::PrintVisibleAreaDialog() methods with extended optional parameters
  • Added new image export logic. Now GraphArea::ExportToImage() method allows graph image export in original size via optional parameter
  • Added GraphArea::SetPrintMode() method which is used internally by print and image export methods but can be useful to override due to complex GraphArea print preparation logic.
  • Fixed excessive rendering issue when ZoomControl viewfinder is hidden. Should significantly increase performance of the viewfinder in this case.
  • Fixed showcase app edge example graph
  • Fixed ZoomControl viewbox logic to correctly react on zoom control background change
  • Improved attachable labels logic. Simplified base classes, added checks for mandatory base classes
  • Improved attachable labels customization possibilities by making several methods virtual

BREAKING CHANGES:

  • Made DefaultLabelFactory class abstract and it is now accepts only one generic param (output object type)
  • GraphAreaBase now has new abstract members needed to be overriden in derived controls: GetRelatedVertexControls(), GetRelatedEdgeControls(), SetPrintMode()

KNOWN ISSUES:

  • Graph image export may throw OutOfMemoryError for large graphs

GraphX for .NET

06 Jan 12:07
Compare
Choose a tag to compare

RELEASE 2.3.0

HIGHLIGHTS:

  • Added new layout algorithm GroupingLayoutAlgorithm which allows to layout graph vertices by different groups each using its own sublayout algorithm. You can see it in action using new feature highlight in showcase app.
    Currently there are two modes supported:
    • Layout groups to predefined bounds, when you can specify rectangular bounds in which vertices are layed (Bounds must be supported by algorithm used to layout vertices group)
    • Generate bounds from groups, when each group is layouted using its algorithm and bounds are automatically calculated to fit all vertices in the group and then group bounds overlaps can be removed.
  • Added two new label controls AttachedEdgeLabelControl and AttachedVertexLabelControl which acts like separate entities in GraphArea visual tree and have weak references to graphx controls. Default EdgeLableControl and VertexLabelControl are designed to act as the part of their parent classes and this approach impacts their customization possibilities when these parent classes are limited in size. So with the new labels you can mitigate following restrictions:
  • No more label cuts when vertex is strictly limited in width or height
  • No more jerky edge endpoints when edge label is too large
  • No more labels behind edges or vertices. You can control how to inject them

To use new labels you have to specify GraphArea::VertexLabelFactory and GraphArea::EdgeLabelFactory factories to generate labels when graph is generated.

DETAILED CHANGELOG:

  • Added GroupId property to IGraphXVertex interface
  • Added parameters class RandomLayoutAlgorithmParams for corresponding algorithm. It contains Bounds property which can restrict vertex coordinates to respect provided bounds.
  • Added two methods to EdgeControl: GetEdgePointerForSource() and GetEdgePointerForTarget() which allows to get to edge pointer objects manualy
  • Added VertexShape.Ellipse math shape
  • Added support for reversing the geometry. This is required for animating shapes along a path where the direction needs to be reversed without using the Storyboard.AutoReverse property (thanks to bleibold)
  • Added two new attached label classes for Edge and Vertex controls.
  • Added EdgeControl::LabelMouseDown event
  • Added separate ID counter for edges while autoresolving missing ids
  • Added EdgeControl::UpdateLabel() method to be able to update attached edge label manually (tech means to overcome some template quizes)
  • Added GraphArea::GetChildControls() method to easily fetch any child objects (incl. custom) by condition or just get all of them
  • Added GraphArea::VertexLabelFactory and GraphArea::EdgeLabelFactory properties for corresponding label factories. Will generate labels automatically after the graph layout if defined
  • Added GraphArea::MoveToFront() and GraphArea::MoveToBack() methods that will move specified GraphArea child to the top/bottom of the visual tree respectively
  • Added MouseEventArgs for VertexDoubleClick event to be able to correctly block click event when you're dragging vertex and open dialog window at once
  • Added VertexControl::HideWithEdges() and VertexControl::ShowWithEdges() methods to hide/show the control and all related edges at once
  • Added new optional parameters for GraphArea add/remove objects methods to allow vertex/edge data to be added to data graph in a single method call
  • Added integer seed to ILayoutParameters to be used by alogrithms in order to get deterministic output.
  • Fixed id autoresolve issue when calling GraphArea::GenerateAllEdges() after manual edge data compilation (thanks to Hannes Hasenauer)
  • Fixed edge label visibility when hideing/showing edges through Visibility property [WPF]
  • Fixed some METRO code not that hasn't been ported correctly
  • Fixed an exception in ZoomControl caused by Ctrl + Alt + DblClick combination (thanks to persalmi)
  • Fixed NaN result for FR algorithms calc (thanks to bleibold)
  • Fixed edge bundling in the case when empty Control points are present that would sometimes cause exceptions.(thanks to bleibold)
  • Fixed bindings to DefaultEdgePointer::Visibility property
  • Fixed numerous event issues with graphX controls where events wasn't passed down the hierarchy tree
  • Fixed edge label size on some template manipulations by adding additional update on label size change event. You can turn it off using EdgeLabelControl::UpdateLabelOnSizeChange property.
  • Fixed vertex and edge display when directly manipulating Visibility property
  • Fixed edge labels display when they there generated hidden by default and then are displayed using ShowLabel property change
  • Fixed edge routing counting deleted vertices as obstacles for an edge
  • Improved styles flexibility by working with dependency values instead of straight assignment in some places
  • Improved random layout algorithm randomness by seeding new Guid hash which fixes some odd behavior in rare cases
  • Improved overall graph cleaning in different areas allowing to easily clean graph data and fix potentional memory leaks
  • Improved general graph showcase for Sugiyama like algorithms
  • Improved graph area control removal logic to be more extensible and allow to handle attached controls
  • Implemented edge cut logic for EdgePointer placed at edge 'source' to gain better visual quality like its 'target' counterpart
  • Implemented many changes in algorithm base classes, mainly in AlgorithmLayoutBase: made VisitedGraph and VertexPositions props assignable externally
  • Implemented RandomLayoutAlgorithm to derive from LayoutAlgorithmBase class
  • Made many methods virtual/protected for easier derived classes customization
  • Merged GraphArea code for WPF & METRO into the shared files
  • Merged EdgeControl and VertexControl code for WPF & METRO into the shared files

BREAKING CHANGES:

  • Changed Vertex and Edge ID type to Int64 (long) by default for easier id handling when working with databases and huge datasets. Was Int32.
  • IExternalLayoutAlgorithm interface now demands TEdge generic specification and have one new method ResetGraph().
  • All built-in algorithms now use IMutableVertexAndEdgeSet<TVertex, TEdge> for TGraph generic specification to be able to modify Graph data on demand.
  • Added mandatory IOverlapRemovalAlgorithm::Initialize() method for all OR algorithms to be able to initialize initial data not only when you instantiate class but at any time
  • IZoomControl interface now must implement Width and Height properties
  • IOneWayControlAnimation interface methods AnimateVertex/AnimateEdge now has an additional parameter which flags if data vertex/edge should be deleted after animation is complete.
    Any custom delete animations should be updated to handle this additional property.
  • HighlightBehaviour::HighlightStrategy property has been removed due to redundancy

GraphX for.NET

28 Jun 10:50
Compare
Choose a tag to compare

RELEASE 2.2.0

RELEASE NOTES:
New features can still have some bugs as there are many scenarios that might involve them and it's hard to check all of them on my own. If you feel uncomfortable with anything in this release please let me know.
I appreciate any feedback as this is almost the only reason i'm still working on GraphX. Thanks!

NEW TERMS:
VAESPS - vertex and edge skip processing support
VCP - vertex connection point

HIGHLIGHTS:

  • VCPs has been added into GraphX making edge endpoint fixation(binding) possible. By default GraphX automaticaly calculates edge endpoint position relative to vertex dimensions and approximate math shape, but with this feature on you'll be able to bind edge endpoint to a separate customizable object. This will allow you to create static edge fixation endpoints on the vertex and give you full control over edge endpoints positioning.
    Now GraphX for WPF requires only .NET Framework 4.0 to build & run. Deprecated all code that required .NET 4.0.3
  • Now you can easily customize edge pointers with the help of DefaultEdgePointer class which can host any content including Image/Path and supports rotation. Changes include more precious edge endpoint calculations so the edge will overlap with the edge pointer no more. Because of these changes the old logic that utilizes direct Path object in EdgeControl template will be removed completely in favor of notable performance improvements.
  • Serialization has been decoupled from GraphX completely to allow bring much more freedom to custom serializers. All what GraphX do now is provide serialization data and accept serialization data for deserialization. Serialization classes are not limited by interfaces now. See FileServiceProviderWpf class for an example.
  • Now you can use "http://schemas.panthernet.ru/graphx/" XAML namespace in GraphX for WPF for all its visual content. Additionaly, assemblies (and output filenames) for WPF/METRO dlls are both changed to GraphX.Controls.dll so Post-Build process copies output files to GraphX/Bin folder with distinct filenames reflecting the platform as before.
  • Performance improvements are always welcome. In this release the whole layout calculation logic has been revisited in terms of both performance and code quality gains. We've also eliminated some redundant layout updates, moved all math & algorithms handling from GraphArea directly to LogicCore under better async implementation, cleaned up ZoomControl logic, revisited edges & edge labels code to remove redundant calculation passes.

DETAILED CHANGES:

  • Added support for custom VCP [WPF, METRO]
    • New control class added: StaticVertexConnectionPoint. It represents ContentControl which can host virtualy any valid object.
    • VCP supports the same math shapes as VertexShape property or can use VertexShape::None value to disable precise edge endpoint calculations
  • Added vertex and edge skip processing support to METRO version (VAESPS) [METRO]
  • Added VAESPS for following algorithms: Circular [ALL]
  • Added VertexShape::None enum option, currently affecting only VCP logic [ALL]
  • Added different layout options to EfficientSugiyama algorithm using new Direction param [ALL]
  • Added true orthogonal edge routing for EfficientSugiyama algorithm using EdgeRouting param [ALL]
  • Added new property GraphArea::ControlsDrawOrder which defines vertex or edges should be drawn topmost [WPF, METRO]
  • Added GraphArea::PreloadGraph() method for manual graph rendering which generate vertices and edges from GraphArea::LogicCore.Graph property w/o any algorithms and also sets vertices positions if needed [WPF, METRO]
  • Added new EdgeControl template PART (PART_SelfLoopedEdge) for custom self looped edge indicator visualization. It represents FrameworkElement and if specified in the template will be positioned in the top left vertex corner. Also made indicator settings more flexible by implementing some dependency props [WPF, METRO]
  • Added StateStorage::SaveOrUpdateState() method for easier use [WPF,METRO]
  • Added new read only property EdgeControl::IsParallel that identifies edge as currently parallel to other edge. + Made GraphArea::UpdateParallelEdgesData() method public to be able to refresh IsParallel property on manual graph operations [METRO, WPF]
  • Added EdgeLabelControl::FlipOnRotation dependency property which controls if label should be flipped when axis is changed while rotating [WPF, METRO]
  • Fixed parallel edges labels handling. Now edge labels are more readable when there are two of them [WPF, METRO]
  • Fixed edge routing when graph state has been loaded. Graph state now stores AlgorithmStorage too [ALL]
  • Fixed ZoomControl zoom-out to the value equal to zoom-in resulting in similar smooth zoom [WPF, METRO]
  • Fixed ZoomControl::Zoom property change not firing [WPF, METRO]
  • Fixed manual graph composition routines in case of ER algorithm is set [ALL]
  • Fixed layout algorithm calculations to always receive actual vertex positions as input parameter. This will fix VAESPS for default algorithms. [WPF, METRO]
  • Fixed outdated edge rendering in some cases when vertex coordinates are changed manually [WPF, METRO]
  • Fixed edge overlapping edge pointers [WPF, METRO]
  • Fixed use of ControlFactory for edge deserialization [WPF, METRO] thanks to perturbare
  • Fixed some algorithm calculation problems, especial FR [ALL]
  • Fixed EdgeControl.ShowArrows to implement DependencyProperty [WPF, METRO] thanks to perturbare
  • Fixed minor performance problems in ZoomControl [METRO]
  • Fixed and enhanced automatic data object Id resolve logic [WPF,METRO] thanks to perturbare
  • Fixed ZoomControl zoom sometimes not firing from code call after control is loaded [WPF]
  • Fixed VB sample project dependencies and refactored code a bit
  • Reorganized Example apps namespaces and code for greater good :)
  • Made EdgeControlBase::UpdateEdge() method public. It can be used now to fully update edge visual on custom edge-related modifications [WPF, METRO]
  • Improved main layout calculation logic to gain performance improvements [WPF, METRO]
  • Merged EdgePointerImage and EdgePointerPath into one universal DefaultEdgePointer class [WPF, METRO]
  • Improved edge and its template parts rendering/calc performance [WPF, METRO]
  • Enhanced edge labels logic so now it don't require additional template bindings and modifications (Angle or RenderTransform) [WPF]
  • GraphArea::PreloadVertexes() now accepts graph param as optional (null by default) and uses LogicCore.Graph in that case [WPF, METRO]
  • Decoupled serialization logic from GraphX completely [ALL] thanks to perturbare
  • Adjusted FR and BoundedFR default values for random initial positions [All]
  • Now GraphX for WPF requires only .NET Framework 4.0 to build & run [WPF]
  • Refactored almost all of the GraphX code for improvements and code quality. Changed many namespaces for better name reflection [ALL]

BREAKING CHANGES:

  • !!!WARNING!!! This GraphX version has fallen under the heavy hand of code refactoring and along with the numerous code improvements almost ALL of the namespaces has been changed to better reflect logical code grouping and ease additional platform support through code reusability. Also i've get rid of the several different XAML xmlns usings in favor of single one. I'm very sorry that this changes will force you to update your GraphX projects but i realy felt that i must do it once and for all. You will have to change most of the usings in code and XAML templates: i strongly recommend you to use Resharper or any other code quality tool which will help you to do this in minutes (or even seconds).
    Core changes:
    • All controls, behaviours and their interfaces are moved to GraphX.Controls namespace
    • All algorithms are spreaded across GraphX.PCL.Logic.Algorithms namespace with additional OverlapRemoval, LayoutAlgorithms, EdgeRouting endings
    • All base models and interfaces are now in GraphX.PCL.Common.Models namespace
    • All GraphX primitives (Point, Rect, etc.) are left in GraphX.Measure for better code readability in cases when they are intersected with System.Windows namespace twins
  • IGXLogicCore now include ExternalLayoutAlgorithm, ExternalOverlapRemovalAlgorithm, ExternalEdgeRoutingAlgorithm properties for simplier external algo assignment
  • Now GraphX for WPF requires only .NET Framework 4.0 to build & run
  • Serialization decoupling process changes some method names: GraphArea::SerializeToFile() -> GraphArea::ExtractSerializationData() and GraphArea:: DeserializeFromFile() -> GraphArea::RebuildFromSerializationData()
  • EdgeLabelControl no longer needs default Angle binding and RenderTransformOrigin setup. They are processed internally [WPF]
  • GraphArea::GenerateGraph() method now has generateAllEdges param True by default.
    Renamed following peoperties, moved them to EdgeControlBase and implemented them as DependencyProperty:
    • LogicCore::EdgeSelfLoopCircleOffset -> SelfLoopIndicatorOffset
    • LogicCore::EdgeSelfLoopCircleRadius -> SelfLoopIndicatorRadius
    • LogicCore::EdgeShowSelfLooped -> ShowSelfLoopIndicator
  • Renamed following ZoomControl properties:
    • ZoomDeltaMultiplier -> ZoomSensitivity
    • MaxZoomDelta -> MaximumZoomStep
  • Completely deprecated EdgeControl::PART_edgeArrowPath template PART in favor of the new DefaultEdgePointer (PART_EdgePointerForSource & PART_EdgePointerForTarget). Please renew your custom templates. You can find an example in Generic.XAML template.
  • Self looped edges display logic has been slightly changed with the introduction of custom template PART (PART_SelfLoopedEdge). Now LogicCore::EdgeSelfLoopElementOffset is (0,0) by default and indicator is shown in the top left vertex corner minus indicator size. You can change this behavior by overriding EdgeControl::PrepareEdgePath() method.
  • GetVertexSizeRectangles() method moved from GraphArea to LogicCore.
  • Edge labels placement logic has been slightly changed when they are applied to parallel e...
Read more

GraphX for.NET

02 May 14:27
Compare
Choose a tag to compare

RELEASE 2.1.8

  • Added basic support for Image based edge pointers. Introduced new object for EdgeControl template: [WPF, METRO(bugged)]
    1. EdgePointerImage class with name "PART_EdgePointerImageForSource" - marks edge source pointer (new!)
    2. EdgePointerImage class with name "PART_EdgePointerImageForTarget" - marks edge target pointer
      Look in** GeneralTemplate.xaml** of ShowcaseApp.WPF project.
      Added rotation support for image based edge pointers
  • Added extensibility to corresponding controls by inheriting from IEdgeLabelControl and IEdgePointer [WPF, METRO]
  • Added extensibility to corresponding controls by inheriting from IVertexLabelControl [WPF, METRO]
  • Added support method GraphArea::GetVertexControlAt(Point position) to get VC by coordinates [METRO, WPF]
  • Added VertexControl::GetCenterPosition() method to get vertex center position instead the default top-left [WPF, METRO]
  • Added new showcase example: Templates/Graph editor [WPF]
  • Added new option GraphArea::LogicCoreChangeAction which defines what action will be taken on LogicCore property change. You can rebuild graph now. [WPF, METRO]
  • Added new sync calculation cancellation feature [WPF, METRO] thanks to jorgensigvardsson
  • Added new property EdgeLabelControl::DisplayForSelfLoopedEdges which is self explaining [WPF, METRO]
  • Fixed edge labels display for self looped edges [WPF, METRO]
  • Fixed annoying data binding error in ZoomControl slider binding [METRO, WPF]
  • Fixed ZoomControl unresponsivness after startup (prev needed to change zoom/translation first to work fine) [WPF,METRO]
  • Fixed ZoomControl::Zoom property bug on empty content window resize [WPF, METRO]
  • Fixed dynamic graph showcase example first vertex auto zooming onto [WPF]
  • Fixed some issues in ShowcaseApp.WPF
  • Fixed GraphArea::DeserializeFromFile() logic and filestorage logic to properly restore internal data for loaded graphs [WPF, METRO]
  • Fixed calculation of label control position and angle [WPF, METRO] thanks to jorgensigvardsson
  • Implemented EdgeControl::LabelVerticalOffset property as dependecy [WPF, METRO]
  • Updated default control templates to include some new properties setup by default [WPF, METRO]
  • Optimized showcase app media files
  • Improved extensibility by making some methods virtual for EdgeLabelControl, VertexLabelControl, EdgeControl

!Breaking changes

  • Renamed and changed to Enum - ZoomControl::UseAbsoluteZoomOnMouseWheel to MouseWheelZoomingMode [METRO, WPF]
  • Expanded EdgeControl event args with mouse and keyboard modifiers [WPF]
  • Moved all WPF interfaces to GraphX.Controls.Models.Interfaces namespace and all METRO interfaces to GraphX.METRO.Controls.Models.Interfaces [WPF, METRO]
  • Edge rotation now needs additional modification for all custom EdgeLabelControl templates. Please add: [WPF, METRO]
  • Due to new calc cancelation feature the following has been changed:
    -IExternalEdgeRouting, IExternalLayout, IExternalOverlapRemoval interfaces and different algorithm base classes now implement Compute(CancellationToken cancellationToken) method with an additional param
    • METRO now works only in async mode. Postfix Async has been added for GraphArea graph generation and relayout methods.