Quellcode durchsuchen

页面编辑-补充倒序Undo,Redo逻辑

ZhouJieSheng vor 2 Jahren
Ursprung
Commit
c704dab10f

+ 4 - 0
PDF Office/Model/PageEdit/PageEditHistory.cs

@@ -70,6 +70,10 @@ namespace PDF_Office.Model.PageEdit
         /// 拖拽排序
         /// </summary>
         DragSort,
+        /// <summary>
+        /// 倒序
+        /// </summary>
+        Reverse
 
     }
 }

+ 100 - 16
PDF Office/ViewModels/PageEdit/PageEditContentViewModel.cs

@@ -613,51 +613,99 @@ namespace PDF_Office.ViewModels.PageEdit
                     pages.Add(i);
                 }
             }
-            if(pages.Count<=1)
+            DoReverse(pages);
+           
+            IsLoading = Visibility.Collapsed;
+        }
+
+        /// <summary>
+        /// 将指定页面结合进行倒序
+        /// </summary>
+        private async void DoReverse(List<int> pages, bool isFromUndoRedo = false)
+        {
+            if (pages.Count <= 1)
             {
                 ShowToast("请至少选择两个图片进行倒序操作。");
                 return;
             }
             pages.Sort();
 
+            //记录原位置和目标位置 用于undo,redo
+            Dictionary<int, int> sourceTarget = new Dictionary<int, int>();
             for (int i = 0; i < pages.Count; i++)
             {
                 int preindex = pages[i];
                 int laterIndex = pages[pages.Count - i - 1];//尾部的索引
                 if (laterIndex <= preindex)//交换完成
                 {
+                    //用于记录选中集合为奇数时,最中间Item的还原
+                    sourceTarget.Add(preindex, preindex);
                     break;
                 }
-                var sourceitem = PageEditItems[preindex];
-                var targetitem = PageEditItems[laterIndex];
 
-                var result = PDFViewer.Document.ExchangePage(preindex, laterIndex);
+                var result = ExchangeItem(preindex,laterIndex);
                 if(!result)
                 {
-                     ShowToast();
+                    ShowToast();
                     IsLoading = Visibility.Collapsed;
                     return;
                 }
-
-                PageEditItems.Remove(sourceitem);
-                PageEditItems.Remove(targetitem);
-                PageEditItems.Insert(preindex, targetitem);
-                PageEditItems.Insert(laterIndex, sourceitem);
+                sourceTarget.Add(preindex, laterIndex);
             }
 
             await Task.Delay(20);
             //转换成页码数据集合,传递给UI,选中目标页面
             //因虚拟化加载的问题,通过Selected来控制Item选中效果会有问题
             List<int> pageRange = new List<int>();
-            for(int i=0;i<pages.Count;i++)
+            for (int i = 0; i < pages.Count; i++)
             {
-                pageRange.Add(pages[i]+1);
+                pageRange.Add(pages[i] + 1);
             }
 
             NotifyUIToRefresh(pageRange);
 
-            ReloadAfterOption(true,true,null);
-            IsLoading = Visibility.Collapsed;
+            ReloadAfterOption(true, true, null);
+
+            if(!isFromUndoRedo)
+            {
+                PageEditHistory history = new PageEditHistory();
+                history.Type = ActionType.Reverse;
+                history.SourceTargetValue = sourceTarget;
+                AddToUndoStack(history);
+            }
+        }
+
+        /// <summary>
+        /// 交换两个Item顺序
+        /// </summary>
+        /// <param name="preiIndex"></param>
+        /// <param name="laterIndex"></param>
+        /// <returns></returns>
+        private bool ExchangeItem(int preiIndex,int laterIndex)
+        {
+            if (preiIndex == laterIndex)
+            {
+                return true;
+            }
+            var sourceitem = PageEditItems[preiIndex];
+            var targetitem = PageEditItems[laterIndex];
+
+            var result = PDFViewer.Document.ExchangePage(preiIndex, laterIndex);
+            if (!result)
+            {
+                return false;
+            }
+
+            PageEditItems.Remove(sourceitem);
+            PageEditItems.Remove(targetitem);
+            PageEditItems.Insert(preiIndex, targetitem);
+            PageEditItems.Insert(laterIndex, sourceitem);
+
+            //PageEditItems.Remove(targetitem);
+            //PageEditItems.Insert(laterIndex, sourceitem);
+            //PageEditItems.Remove(sourceitem);
+            //PageEditItems.Insert(preiIndex, targetitem);
+            return true;
         }
 
         /// <summary>
@@ -861,7 +909,7 @@ namespace PDF_Office.ViewModels.PageEdit
         /// <summary>
         /// 页面编辑执行Undo操作的方法
         /// </summary>
-        private void Undo()
+        private async void Undo()
         {
             var history = UndoStack.Pop();
             PageEditHistory redoHistory = new PageEditHistory();
@@ -916,6 +964,36 @@ namespace PDF_Office.ViewModels.PageEdit
                     NotifyUIToRefresh(selectedPages);
                     redoHistory = history;
                     break;
+                case ActionType.Reverse:
+                    //将字典倒序后,将每个Source的值恢复到Key的位置
+                    var SourceTarget = history.SourceTargetValue;
+                    var pres = SourceTarget.Keys.ToArray();
+                    foreach (var key in pres)
+                    {
+                        if (key != SourceTarget[key])
+                        {
+                            ExchangeItem(key, SourceTarget[key]);
+                        }
+                    }
+
+                    await Task.Delay(20);
+                    //刷新页码等
+                    ReloadAfterOption(true, true, null);
+
+                    List<int> Pages = new List<int>();
+                    //将索引集合转换成页码集合
+                    foreach (var key in SourceTarget.Keys)
+                    {
+                        Pages.Add(key + 1);
+                    }
+                    foreach(var key in SourceTarget.Values)
+                    {
+                        Pages.Add(key + 1);
+                    }
+                    //通知UI选中Item
+                    NotifyUIToRefresh(Pages);
+                    redoHistory = history;
+                    break;
                 default:
                     break;
             }
@@ -964,6 +1042,11 @@ namespace PDF_Office.ViewModels.PageEdit
                     DragToSort(history.InsertIndex,history.SourceTargetValue.Keys.ToList<int>(),true);
                     undoHistory = history;
                     break;
+                case ActionType.Reverse:
+                    var list = history.SourceTargetValue.Keys.ToList<int>().Union(history.SourceTargetValue.Values.ToList<int>()).ToList<int>();
+                    DoReverse(list, true);
+                    undoHistory = history;
+                    break;
                 default:
                     break;
             }
@@ -1970,7 +2053,8 @@ namespace PDF_Office.ViewModels.PageEdit
                 GetSourceItems(isFirstLoad);
 
                 ListSelectedIndex = PDFViewer.CurrentIndex;
-
+                viewContentViewModel.CanUndo = this.CanUndo;
+                viewContentViewModel.CanRedo = this.CanRedo;
                 RefreshBookMarkList();
                 isFirstLoad = false;
             }