public void Shrink(bool animate) { if (Pegs.Count <= minPegs) { return; } List <Peg> removing = new List <Peg>(); foreach (UIElement element in Pegs) { Peg peg = element as Peg; if (peg != null && peg.Slot.Contents == null) { removing.Add(peg); if (Pegs.Count <= (minPegs + removing.Count)) { break; } } } foreach (Peg peg in removing) { RemovePeg(animate, peg); } }
public void RemovePeg(bool animate, int index) { if (index >= Pegs.Count) { throw new ArgumentException("Index out of range.", "index"); } Peg peg = Pegs[index] as Peg; if (peg == null) { throw new InvalidCastException("The element at index " + index + " was not a Peg."); } if (animate) { ScaleTransform scale = new ScaleTransform(1, 1); peg.LayoutTransform = scale; DoubleAnimation anim = new DoubleAnimation(1, 0, animationTime); anim.AutoReverse = false; anim.IsAdditive = false; anim.Completed += delegate { Pegs.Remove(peg); }; scale.BeginAnimation(ScaleTransform.ScaleXProperty, anim); scale.BeginAnimation(ScaleTransform.ScaleYProperty, anim); } else { Pegs.Remove(peg); } OnChanged(new EventArgs()); }
protected void GrowSpine(object sender, RoutedEventArgs e) { Peg peg = AddPeg(true, Pegs.Count); try { Log.WriteAction(LogAction.added, "peg"); //ActivityLog.Write(new Activity("AddedPeg","On",peg.Slot.GetLogText())); } catch (Exception) {} }
public void RemovePeg(bool animate, Peg peg) { int index = Pegs.IndexOf(peg); if (index == -1) { throw new ArgumentException("Peg is not present on this spine.", "peg"); } RemovePeg(animate, index); }
public string GetNaturalLanguage() { // can't use Pegs as an empty Peg might screw up our formatting: List <Peg> filledPegs = GetFilledPegs(); if (filledPegs.Count == 0) { return("nothing happens"); } else { System.Text.StringBuilder code = new System.Text.StringBuilder(); for (int i = 0; i < filledPegs.Count; i++) { Peg peg = (Peg)filledPegs[i]; bool last = (i == filledPegs.Count - 1); bool penultimate = (i == filledPegs.Count - 2); if (last && filledPegs.Count > 1) { code.Append("and "); } code.Append(peg.Slot.GetNaturalLanguage()); if (last) { } //code.Append("."); else if (penultimate) { code.Append(" "); } else { code.Append(", "); } } return(code.ToString()); } }
public void ReadXml(XmlReader reader) { while (Pegs.Count > 0) { RemovePeg(false); } reader.MoveToContent(); // at <Spine> if (reader.IsEmptyElement) { throw new FormatException("Spine does not define a Pegs collection."); } reader.ReadStartElement(); // passed <Spine> reader.MoveToContent(); // at <Pegs> if (reader.LocalName != "Pegs") { throw new FormatException("Spine does not define a Pegs collection."); } bool isEmpty = reader.IsEmptyElement; reader.ReadStartElement(); // passed <Pegs> if (!isEmpty) { reader.MoveToContent(); // at <Peg> or </Pegs> while (reader.LocalName != "Pegs") { Peg peg = AddPeg(); peg.ReadXml(reader); reader.MoveToContent(); } reader.ReadEndElement(); // passed </Pegs> } reader.MoveToContent(); reader.ReadEndElement(); // passed </Spine> }
public Spine DeepCopy() { Spine copy = new Spine(fitter, (uint)Pegs.Count, Extends); copy.Margin = Margin; for (int i = 0; i < Pegs.Count; i++) { Peg origPeg = (Peg)Pegs[i]; Peg copyPeg = (Peg)copy.Pegs[i]; Moveable moveable = origPeg.Slot.Contents; if (moveable != null) { copyPeg.Slot.Contents = moveable.DeepCopy(); } } return(copy); }
public Peg AddPeg(bool animate, int index) { if (index > Pegs.Count) { throw new ArgumentException("Index out of range.", "index"); } Peg peg = new Peg(fitter); peg.VerticalAlignment = VerticalAlignment.Top; ScaleTransform scale = null; if (animate) { scale = new ScaleTransform(0, 0); peg.LayoutTransform = scale; } Pegs.Insert(index, peg); peg.DropZone.Drop += new DragEventHandler(AttachToSpine); if (animate) { DoubleAnimation anim = new DoubleAnimation(0, 1, animationTime); anim.AutoReverse = false; anim.IsAdditive = false; scale.BeginAnimation(ScaleTransform.ScaleXProperty, anim); scale.BeginAnimation(ScaleTransform.ScaleYProperty, anim); } peg.Slot.Changed += delegate { OnChanged(new EventArgs()); }; return(peg); }
/// <summary> /// Attach a Moveable to the spine, either onto a free adjacent peg, /// or onto a newly-created peg. /// </summary> protected void AttachToSpine(object sender, DragEventArgs e) { if (e.Handled) { return; } if (!e.Data.GetDataPresent(typeof(Moveable))) { return; } if (!(e.AllowedEffects == DragDropEffects.Copy || e.AllowedEffects == DragDropEffects.Move)) { return; } Moveable moveable = e.Data.GetData(typeof(Moveable)) as Moveable; if (fitter.Fits(moveable)) { DropZone dropZone = sender as DropZone; if (dropZone == null) { return; } Peg above = UIHelper.TryFindParent <Peg>(dropZone); if (above == null) { return; } int index = Pegs.IndexOf(above); if (index == -1) { throw new InvalidOperationException("Peg not found on spine."); } index++; Peg below; if (index < Pegs.Count) { below = (Peg)Pegs[index]; } else { below = null; } Peg target = null; // If a moveable has been dropped just above or below // itself, do nothing. Otherwise, try to use an empty // peg, or create a new peg if there isn't one: bool pointlessMove = e.AllowedEffects == DragDropEffects.Move && ((above != null && above.Slot.Contents == moveable) || (below != null && below.Slot.Contents == moveable)); if (pointlessMove) { e.Handled = true; return; } else if (below != null && below.Slot.Contents == null) { target = below; } else if (above != null && above.Slot.Contents == null) { target = above; } else { target = AddPeg(false, index); } if (e.AllowedEffects == DragDropEffects.Copy) { target.Slot.Contents = moveable.DeepCopy(); } else if (e.AllowedEffects == DragDropEffects.Move) { moveable.Remove(); target.Slot.Contents = moveable; } try { Log.WriteAction(LogAction.placed, "block", target.Slot.Contents.GetLogText() + " on " + target.Slot.GetLogText()); //ActivityLog.Write(new Activity("PlacedBlock","Block",target.Slot.Contents.GetLogText(),"PlacedOn",target.Slot.GetLogText())); } catch (Exception) {} OnChanged(new EventArgs()); } e.Handled = true; }