static public bool MoveNext(this iBoard b, ref MoveType lastMove) { while (lastMove < MoveType.Stop) { lastMove = lastMove + 1; switch (lastMove) { case MoveType.Left: case MoveType.Up: case MoveType.Right: case MoveType.Down: if (b.Move(lastMove)) { return(true); } break; } } if (b.Steps.Any()) { UndoStep last = b.PeekStep(); lastMove = last._type; b.UndoMove(); return(b.MoveNext(ref lastMove)); } else { return(false); } }
/// <summary> /// Goes back to the previously selected asset /// </summary> private void UndoSelection() { _undoSteps.Pop(); UndoStep undoStep = _undoSteps.Peek(); ChangeSelection(undoStep.Id, undoStep.Type, false); }
static public void UndoMove(this iBoard b) { if (!b.Steps.Any()) { return; } UndoStep step = b.PopStep(); int dx = 0, dy = 0; step._type.Move(ref dx, ref dy); int bx = b.BuddyX, by = b.BuddyY; Debug.Assert(Is(b[bx, by], CellType.Buddy)); b[bx, by] &= ~CellType.Buddy; Debug.Assert(IsEmpty(b[bx - dx, by - dy])); b[bx - dx, by - dy] |= CellType.Buddy; if (step._boxMoved) { int obx = bx + dx, oby = by + dy; Debug.Assert(Is(b[obx, oby], CellType.Box)); b[obx, oby] &= ~CellType.Box; b[bx, by] |= CellType.Box; } b.BuddyX -= dx; b.BuddyY -= dy; }
/// <summary> /// 登记追加多个元素动作 /// </summary> /// <param name="myList">追加的元素列表</param> public void LogAddRang(System.Collections.ArrayList myList) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.Elements = myList; NewStep.Style = 5; myUndoSteps.Add(NewStep); } }
/// <summary> /// 登记追加元素动作 /// </summary> /// <param name="NewElement">追加的元素</param> public void LogAdd(ZYTextElement NewElement) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.Style = 2; NewStep.Element = NewElement; myUndoSteps.Add(NewStep); } }
/// <summary> /// 登记新增多个元素动作 /// </summary> /// <param name="index">第一个新增元素在元素列表中的序号</param> /// <param name="myList">新增的元素集合</param> public void LogInsertRange(int index, System.Collections.ArrayList myList) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.index = index; NewStep.Elements = myList; NewStep.Style = 1; myUndoSteps.Add(NewStep); } }
/// <summary> /// 登记新增元素动作 /// </summary> /// <param name="index">新增元素在元素列表中的序号</param> /// <param name="NewElement">新增的元素</param> public void LogInsert(int index, ZYTextElement NewElement) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.index = index; NewStep.Element = NewElement; NewStep.Style = 0; myUndoSteps.Add(NewStep); } }
/// <summary> /// 登记删除元素动作 /// </summary> /// <param name="index">元素在元素列表中的序号</param> /// <param name="myElement">要删除的元素</param> public void LogRemove(int index, ZYTextElement myElement) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.Style = 3; NewStep.index = index; NewStep.Element = myElement; myUndoSteps.Add(NewStep); } }
public void LogRemoveRange(int index, System.Collections.ArrayList myList) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.Elements = new System.Collections.ArrayList(); NewStep.Elements.AddRange(myList); NewStep.index = index; NewStep.Style = 6; myUndoSteps.Add(NewStep); } }
/// <summary> /// 添加修改对象属性的记录 /// </summary> /// <param name="vElement">该属性所属的元素</param> /// <param name="vAttribute">属性对象</param> /// <param name="NewValue">将要设置的新的属性值</param> public void LogAttribute(ZYTextElement vElement, ZYAttribute vAttribute, object NewValue) { if (CanLog) { UndoStep NewStep = new UndoStep(); NewStep.Element = vElement; NewStep.Attribute = vAttribute; NewStep.OldValue = vAttribute.Value; NewStep.NewValue = NewValue; NewStep.Style = 4; myUndoSteps.Add(NewStep); } }
public static void HandleException(Exception exception, string name, UndoStep undoStep = null) { Decider decider = new Decider(); string message; if (undoStep == null) { message = "Es ist ein Fehler beim Erzeugen aufgetreten:"; } else { message = "Es ist ein Fehler beim Erzeugen aufgetreten. Soll die Aktion rückgängig gemacht werden?"; } string errorText; StringBuilder sb = new StringBuilder(); switch (exception) { case LockingException e: string[] failedLockingObjects = e.GetAllFailed2LockAsString(); foreach (var id in failedLockingObjects) { var storableObject = StorableObject.FromStringIdentifier(id); sb.AppendLine(storableObject.GetType().ToString()); } errorText = $"{message}{Environment.NewLine}{exception.Message}{Environment.NewLine}{Environment.NewLine}{sb}{Environment.NewLine}"; break; default: errorText = $"{message}{Environment.NewLine}{exception.Message}{Environment.NewLine}{Environment.NewLine}"; break; } // Log BaseException bexError = new BaseException($"{name}: {errorText}{Environment.NewLine}{exception}", MessageLevel.Error); bexError.FixMessage(); // Show EnumDecisionReturn decision; if (undoStep != null) { decision = decider.Decide(EnumDecisionType.eYesNoDecision, errorText, name, EnumDecisionReturn.eYES, EnumDecisionReturn.eYES, name, false, EnumDecisionIcon.eFATALERROR); } else { decision = decider.Decide(EnumDecisionType.eOkDecision, errorText, name, EnumDecisionReturn.eOK, EnumDecisionReturn.eOK, name, false, EnumDecisionIcon.eFATALERROR); } switch (decision) { case EnumDecisionReturn.eYES: undoStep?.DoUndo(); break; } }
public void PushStep(UndoStep step) { _undoStack.Push(step); }
private void UndoPush(UndoStep.Field field, int value, int index) { Undos[UndoTop].field = field; Undos[UndoTop].index = index; Undos[UndoTop].value = value; UndoTop++; }
public void PushStep(UndoStep step) { _undoStack.Push(step); NotifyPropertyChanged("Moves"); }
/// <summary> /// 已重载:执行撤销操作 /// </summary> /// <returns></returns> public override bool Undo() { ZYTextElement NewStart = null; int NewIndex = -1; bool bolRefreshElements = false; if (myUndoSteps.Count > 0) { for (int iCount = myUndoSteps.Count - 1; iCount >= 0; iCount--) { UndoStep myStep = (UndoStep)myUndoSteps[iCount]; switch (myStep.Style) { case 0: Container = myStep.Element.Parent; bolRefreshElements = true; NewIndex = myStep.Element.Index; Container.ChildElements.Remove(myStep.Element); break; case 1: bolRefreshElements = true; foreach (ZYTextElement e in myStep.Elements) { Container = e.Parent; NewIndex = e.Index; Container.ChildElements.Remove(e); } break; case 2: Container = myStep.Element.Parent; bolRefreshElements = true; NewIndex = myStep.Element.Index; Container.ChildElements.Remove(myStep.Element); break; case 3: Container = myStep.Element.Parent; bolRefreshElements = true; //先从此处控制,索引小于0的不进行操作edit by ywk 2013年3月11日17:31:02 if (myStep.index >= 0) { Container.ChildElements.Insert(myStep.index, myStep.Element); NewStart = myStep.Element; } //Container.ChildElements.Insert(myStep.index, myStep.Element); //NewStart = myStep.Element; break; case 4: myStep.Attribute.SetValue(myStep.OldValue); myStep.Element.UpdateAttrubute(); myStep.Element.RefreshSize(); NewStart = myStep.Element; break; case 5: bolRefreshElements = true; foreach (ZYTextElement e in myStep.Elements) { Container = e.Parent; NewIndex = e.Index; Container.ChildElements.Remove(e); } break; case 6: Container = (myStep.Elements[0] as ZYTextElement).Parent; bolRefreshElements = true; //索引需大于等于0才进入 add by ywk 2013年4月2日16:16:48 if (myStep.index >= 0) { Container.ChildElements.InsertRange(myStep.index, myStep.Elements); NewIndex = myStep.index; } break; } } if (bolRefreshElements) { myOwnerDocument.RefreshElements(); } myOwnerDocument.RefreshLine(); myOwnerDocument.UpdateView(); #region 以前是被注释的,现在放出来 myOwnerDocument.Content.SelectLength = 0; if (NewStart != null) { myOwnerDocument.Content.CurrentElement = NewStart; } else if (NewIndex >= 0) { myOwnerDocument.Content.MoveSelectStart(NewIndex); } #endregion return(true); } return(false); }
public UndoStep PopStep() { UndoStep step = _undoStack.Pop(); NotifyPropertyChanged("Moves"); return(step); }