335 lines
16 KiB
C#
335 lines
16 KiB
C#
|
using Ink_Canvas.Helpers;
|
|||
|
using System;
|
|||
|
using System.Windows;
|
|||
|
using System.Windows.Ink;
|
|||
|
using System.Windows.Media.Imaging;
|
|||
|
|
|||
|
namespace Ink_Canvas {
|
|||
|
public partial class MainWindow : Window {
|
|||
|
StrokeCollection[] strokeCollections = new StrokeCollection[101];
|
|||
|
bool[] whiteboadLastModeIsRedo = new bool[101];
|
|||
|
StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection();
|
|||
|
|
|||
|
int CurrentWhiteboardIndex = 1;
|
|||
|
int WhiteboardTotalCount = 1;
|
|||
|
TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页,0用来存储非白板时的墨迹以便还原
|
|||
|
|
|||
|
private void SaveStrokes(bool isBackupMain = false) {
|
|||
|
if (isBackupMain) {
|
|||
|
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
|
|||
|
TimeMachineHistories[0] = timeMachineHistory;
|
|||
|
timeMachine.ClearStrokeHistory();
|
|||
|
|
|||
|
} else {
|
|||
|
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
|
|||
|
TimeMachineHistories[CurrentWhiteboardIndex] = timeMachineHistory;
|
|||
|
timeMachine.ClearStrokeHistory();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void ClearStrokes(bool isErasedByCode) {
|
|||
|
|
|||
|
_currentCommitType = CommitReason.ClearingCanvas;
|
|||
|
if (isErasedByCode) _currentCommitType = CommitReason.CodeInput;
|
|||
|
inkCanvas.Strokes.Clear();
|
|||
|
_currentCommitType = CommitReason.UserInput;
|
|||
|
}
|
|||
|
|
|||
|
private void RestoreStrokes(bool isBackupMain = false) {
|
|||
|
try {
|
|||
|
if (TimeMachineHistories[CurrentWhiteboardIndex] == null) return; //防止白板打开后不居中
|
|||
|
if (isBackupMain) {
|
|||
|
_currentCommitType = CommitReason.CodeInput;
|
|||
|
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]);
|
|||
|
foreach (var item in TimeMachineHistories[0]) {
|
|||
|
if (item.CommitType == TimeMachineHistoryType.UserInput) {
|
|||
|
if (!item.StrokeHasBeenCleared) {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.ShapeRecognition) {
|
|||
|
if (item.StrokeHasBeenCleared) {
|
|||
|
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.Rotate) {
|
|||
|
if (item.StrokeHasBeenCleared) {
|
|||
|
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.Clear) {
|
|||
|
if (!item.StrokeHasBeenCleared) {
|
|||
|
if (item.CurrentStroke != null) {
|
|||
|
foreach (var currentStroke in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Add(currentStroke);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if (item.ReplacedStroke != null) {
|
|||
|
foreach (var replacedStroke in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Remove(replacedStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
if (item.ReplacedStroke != null) {
|
|||
|
foreach (var replacedStroke in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Add(replacedStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
if (item.CurrentStroke != null) {
|
|||
|
foreach (var currentStroke in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Remove(currentStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_currentCommitType = CommitReason.UserInput;
|
|||
|
}
|
|||
|
} else {
|
|||
|
_currentCommitType = CommitReason.CodeInput;
|
|||
|
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]);
|
|||
|
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) {
|
|||
|
if (item.CommitType == TimeMachineHistoryType.UserInput) {
|
|||
|
if (!item.StrokeHasBeenCleared) {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.ShapeRecognition) {
|
|||
|
if (item.StrokeHasBeenCleared) {
|
|||
|
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.Rotate) {
|
|||
|
if (item.StrokeHasBeenCleared) {
|
|||
|
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
} else {
|
|||
|
foreach (var strokes in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Add(strokes);
|
|||
|
}
|
|||
|
foreach (var strokes in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(strokes))
|
|||
|
inkCanvas.Strokes.Remove(strokes);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (item.CommitType == TimeMachineHistoryType.Clear) {
|
|||
|
if (!item.StrokeHasBeenCleared) {
|
|||
|
if (item.CurrentStroke != null) {
|
|||
|
foreach (var currentStroke in item.CurrentStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Add(currentStroke);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if (item.ReplacedStroke != null) {
|
|||
|
foreach (var replacedStroke in item.ReplacedStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Remove(replacedStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
if (item.ReplacedStroke != null) {
|
|||
|
foreach (var replacedStroke in item.ReplacedStroke) {
|
|||
|
if (!inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Add(replacedStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
if (item.CurrentStroke != null) {
|
|||
|
foreach (var currentStroke in item.CurrentStroke) {
|
|||
|
if (inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Remove(currentStroke);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_currentCommitType = CommitReason.UserInput;
|
|||
|
}
|
|||
|
} catch { }
|
|||
|
}
|
|||
|
|
|||
|
private void BtnWhiteBoardSwitchPrevious_Click(object sender, EventArgs e) {
|
|||
|
if (CurrentWhiteboardIndex <= 1) return;
|
|||
|
|
|||
|
SaveStrokes();
|
|||
|
|
|||
|
ClearStrokes(true);
|
|||
|
CurrentWhiteboardIndex--;
|
|||
|
|
|||
|
RestoreStrokes();
|
|||
|
|
|||
|
UpdateIndexInfoDisplay();
|
|||
|
}
|
|||
|
|
|||
|
private void BtnWhiteBoardSwitchNext_Click(object sender, EventArgs e) {
|
|||
|
if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) {
|
|||
|
SaveScreenShot(true);
|
|||
|
}
|
|||
|
if (CurrentWhiteboardIndex >= WhiteboardTotalCount) {
|
|||
|
BtnWhiteBoardAdd_Click(sender, e);
|
|||
|
return;
|
|||
|
}
|
|||
|
SaveStrokes();
|
|||
|
|
|||
|
|
|||
|
ClearStrokes(true);
|
|||
|
CurrentWhiteboardIndex++;
|
|||
|
|
|||
|
RestoreStrokes();
|
|||
|
|
|||
|
UpdateIndexInfoDisplay();
|
|||
|
}
|
|||
|
|
|||
|
private void BtnWhiteBoardAdd_Click(object sender, EventArgs e) {
|
|||
|
if (WhiteboardTotalCount >= 99) return;
|
|||
|
if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) {
|
|||
|
SaveScreenShot(true);
|
|||
|
}
|
|||
|
SaveStrokes();
|
|||
|
ClearStrokes(true);
|
|||
|
|
|||
|
WhiteboardTotalCount++;
|
|||
|
CurrentWhiteboardIndex++;
|
|||
|
|
|||
|
if (CurrentWhiteboardIndex != WhiteboardTotalCount) {
|
|||
|
for (int i = WhiteboardTotalCount; i > CurrentWhiteboardIndex; i--) {
|
|||
|
TimeMachineHistories[i] = TimeMachineHistories[i - 1];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
UpdateIndexInfoDisplay();
|
|||
|
|
|||
|
if (WhiteboardTotalCount >= 99) BtnWhiteBoardAdd.IsEnabled = false;
|
|||
|
}
|
|||
|
|
|||
|
private void BtnWhiteBoardDelete_Click(object sender, RoutedEventArgs e) {
|
|||
|
ClearStrokes(true);
|
|||
|
|
|||
|
if (CurrentWhiteboardIndex != WhiteboardTotalCount) {
|
|||
|
for (int i = CurrentWhiteboardIndex; i <= WhiteboardTotalCount; i++) {
|
|||
|
TimeMachineHistories[i] = TimeMachineHistories[i + 1];
|
|||
|
}
|
|||
|
} else {
|
|||
|
CurrentWhiteboardIndex--;
|
|||
|
}
|
|||
|
|
|||
|
WhiteboardTotalCount--;
|
|||
|
|
|||
|
RestoreStrokes();
|
|||
|
|
|||
|
UpdateIndexInfoDisplay();
|
|||
|
|
|||
|
if (WhiteboardTotalCount < 99) BtnWhiteBoardAdd.IsEnabled = true;
|
|||
|
}
|
|||
|
|
|||
|
private void UpdateIndexInfoDisplay() {
|
|||
|
TextBlockWhiteBoardIndexInfo.Text = string.Format("{0} / {1}", CurrentWhiteboardIndex, WhiteboardTotalCount);
|
|||
|
|
|||
|
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
|
|||
|
BitmapImage newImageSource = new BitmapImage();
|
|||
|
newImageSource.BeginInit();
|
|||
|
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_add_circle_24_regular.png", UriKind.RelativeOrAbsolute);
|
|||
|
newImageSource.EndInit();
|
|||
|
BoardLeftPannelNextPage.Source = newImageSource;
|
|||
|
BoardRightPannelNextPage.Source = newImageSource;
|
|||
|
BoardRightPannelNextPageTextBlock.Text = "加页";
|
|||
|
BoardLeftPannelNextPageTextBlock.Text = "加页";
|
|||
|
} else {
|
|||
|
BitmapImage newImageSource = new BitmapImage();
|
|||
|
newImageSource.BeginInit();
|
|||
|
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_arrow_circle_right_24_regular.png", UriKind.RelativeOrAbsolute);
|
|||
|
newImageSource.EndInit();
|
|||
|
BoardLeftPannelNextPage.Source = newImageSource;
|
|||
|
BoardRightPannelNextPage.Source = newImageSource;
|
|||
|
BoardRightPannelNextPageTextBlock.Text = "下一页";
|
|||
|
BoardLeftPannelNextPageTextBlock.Text = "下一页";
|
|||
|
}
|
|||
|
|
|||
|
if (CurrentWhiteboardIndex == 1) {
|
|||
|
BtnWhiteBoardSwitchPrevious.IsEnabled = false;
|
|||
|
} else {
|
|||
|
BtnWhiteBoardSwitchPrevious.IsEnabled = true;
|
|||
|
}
|
|||
|
|
|||
|
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
|
|||
|
BtnWhiteBoardSwitchNext.IsEnabled = false;
|
|||
|
} else {
|
|||
|
BtnWhiteBoardSwitchNext.IsEnabled = true;
|
|||
|
}
|
|||
|
|
|||
|
if (WhiteboardTotalCount == 1) {
|
|||
|
BtnWhiteBoardDelete.IsEnabled = false;
|
|||
|
} else {
|
|||
|
BtnWhiteBoardDelete.IsEnabled = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|