// Public methods // public T Add <T>(T element, bool addToUndoRedo) where T : IGraphElement { System.Action redo = () => { if (element is IVertex v) { Execute.OnUIThread(() => ObservableVertices.Add(v)); } else if (element is IEdge e) { Execute.OnUIThread(() => ObservableEdges.Add(e)); } }; System.Action undo = () => { Remove(element, false); }; if (addToUndoRedo) { UndoRedoManager.Instance.AddAndExecute(new SimpleOperation(redo, undo)); } else { redo(); } return(element); }
public void Remove(IGraphElement element, bool useUndoRedo = true) { if (element is IVertex) { var vertex = element as IVertex; List <IEdge> edges = null; System.Action redo = () => { Execute.OnUIThread(() => ObservableVertices.Remove(vertex)); edges = ObservableEdges.Where(x => x.Source == vertex || x.Target == vertex) .ToList(); edges.ForEach(x => ObservableEdges.Remove(x)); }; System.Action undo = () => { AddVertex(vertex); edges.ForEach(x => Add(x, false)); }; if (useUndoRedo) { UndoRedoManager.Instance.AddAndExecute(new SimpleOperation(redo, undo)); } else { redo(); } } else if (element is IEdge) { var edge = element as IEdge; System.Action redo = () => { Execute.OnUIThread(() => ObservableEdges.Remove(edge)); }; System.Action undo = () => { Add(edge, false); }; if (useUndoRedo) { UndoRedoManager.Instance.AddAndExecute(new SimpleOperation(redo, undo)); } else { redo(); } } }
// Private methods // // Use binary search algorithm: https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA private int GetNewVertexIndex() { IVertex[] arr = ObservableVertices.OrderBy(x => x.Index).ToArray(); int newIndex = arr.Length + 1; for (int i = 0; i < arr.Length; i++) { // Difference between array index and vertex index must be 1. if (arr[i].Index - i != 1) { newIndex = i + 1; break; } } return(newIndex); }
public void Clear() { Execute.OnUIThread(() => ObservableEdges.Clear()); Execute.OnUIThread(() => ObservableVertices.Clear()); UndoRedoManager.Instance.Clear(); }
public IVertex AddVertex(IVertex v) { Execute.OnUIThread(() => ObservableVertices.Add(v)); return(v); }