/// <summary> /// Clears all items from the display tree. /// </summary> public void Clear() { TopLevelItems.Clear(); if (DisplayTreeChanged != null) { DisplayTreeChanged(this, new DisplayTreeChangedEventArgs() { AffectedItems = null, Type = DisplayTreeChangedType.Clear }); } }
public MenuItem AppendMenuItem(string label, EventHandler selectedHandler) { if (menuContainer != null) { throw new Exception("HUDRadialMenu cannot call AppendMenuItem after Create"); } MenuItem i = new MenuItem() { Label = label }; i.OnSelected += selectedHandler; TopLevelItems.Add(i); AllItems.Add(i); return(i); }
void _ParseTree_ParseTreeModified(object sender, ParseTreeModifiedEventArgs e) { if (e.Type == ParseTreeModifiedType.Insert) { // see if the added item is displayed at all var toadd = CreateOverlayShapesFromItem(e.AffectedItem); if (toadd.Count() == 0) { return; } // so we have something to add... find the correct element of the display tree to insert into var parent = e.AffectedItem.Ancestors.FirstOrDefault(tcpi => AllItems.OfType <OverlayScope>().Count(os => os.item == tcpi) > 0); if (parent == null) { TopLevelItems.AddRange(toadd); } else { var scope = AllItems.OfType <OverlayScope>().First(os => os.item == parent); scope.children.AddRange(toadd); } //var cplist = toadd.SelectMany(tpi => GetAllDescendants(tpi)).OfType<OverlayControlPoint>(); //foreach (var cp in cplist) // cp.BindToOrigin(AllItems); BindControlPointsToOrigins(); // slightly inefficient ... but who cares if (DisplayTreeChanged != null) { DisplayTreeChanged(this, new DisplayTreeChangedEventArgs() { Type = DisplayTreeChangedType.Insert, AffectedItems = toadd }); } } else if (e.Type == ParseTreeModifiedType.Remove) { throw new NotSupportedException(); // maybe support that in the future } }
/// <summary> /// Adds a single parseitem to the display tree and redraws. /// This is called by tools adding something to the parsetree to refresh the overlay /// without redrawing it completely. /// </summary> /// <param name="tpi">The parseitem to add.</param> public void AddToDisplayTree(TikzParseItem tpi) { List <OverlayShape> l = new List <OverlayShape>(); DrawObject(tpi, l); if (CurEditing == null) { //do not redraw if there is nothing to show. if (TopLevelItems == null) { RedrawObjects(); } TopLevelItems.AddRange(l); } else { CurEditing.children.AddRange(l); } AdjustPositions(); BindControlPointsToOrigins(); }
/// <summary> /// Clears the current display tree and rebuilds it from the current parse tree. /// </summary> public void RecreateDisplayTree() { Clear(); if (ParseTree == null) { return; } try { var allitems = this.CreateOverlayShapesFromItem(ParseTree); TopLevelItems.AddRange(allitems); BindControlPointsToOrigins(); //DrawObject(ParseTree, TopLevelItems); if (DisplayTreeChanged != null) { DisplayTreeChanged(this, new DisplayTreeChangedEventArgs() { AffectedItems = AllItems, Type = DisplayTreeChangedType.Insert }); } } catch (Exception e) { // we should really not come here.... but there are conceivable tex files with cyclic references that might // produce errors. Clear(); // View.AllowEditing = false; // todo GlobalUI.UI.AddStatusLine(this, "Error in Overlay rendering: '" + e.Message + "' Overlay disabled for now.", true); if (DisplayError != null) { DisplayError(this, new DisplayErrorEventArgs() { Message = "Error in Overlay rendering: '" + e.Message }); } } }