Пример #1
0
        // 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);
        }
Пример #2
0
        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();
                }
            }
        }
Пример #3
0
        // 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);
        }
Пример #4
0
 public void Clear()
 {
     Execute.OnUIThread(() => ObservableEdges.Clear());
     Execute.OnUIThread(() => ObservableVertices.Clear());
     UndoRedoManager.Instance.Clear();
 }
Пример #5
0
 public IVertex AddVertex(IVertex v)
 {
     Execute.OnUIThread(() => ObservableVertices.Add(v));
     return(v);
 }