|
@@ -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;
|
|
|
}
|