2024-05-01 18:23:32 +08:00
|
|
|
|
using Ink_Canvas.Helpers;
|
|
|
|
|
using System.Windows;
|
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
using System.Windows.Ink;
|
|
|
|
|
|
|
|
|
|
namespace Ink_Canvas {
|
|
|
|
|
public partial class MainWindow : Window {
|
|
|
|
|
private enum CommitReason {
|
|
|
|
|
UserInput,
|
|
|
|
|
CodeInput,
|
|
|
|
|
ShapeDrawing,
|
|
|
|
|
ShapeRecognition,
|
|
|
|
|
ClearingCanvas,
|
2024-05-11 01:35:32 +08:00
|
|
|
|
Manipulation
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private CommitReason _currentCommitType = CommitReason.UserInput;
|
|
|
|
|
private bool IsEraseByPoint => inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
|
|
|
|
|
private StrokeCollection ReplacedStroke;
|
|
|
|
|
private StrokeCollection AddedStroke;
|
|
|
|
|
private StrokeCollection CuboidStrokeCollection;
|
|
|
|
|
private TimeMachine timeMachine = new TimeMachine();
|
|
|
|
|
|
|
|
|
|
private void TimeMachine_OnUndoStateChanged(bool status) {
|
|
|
|
|
var result = status ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
|
BtnUndo.Visibility = result;
|
|
|
|
|
BtnUndo.IsEnabled = status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void TimeMachine_OnRedoStateChanged(bool status) {
|
|
|
|
|
var result = status ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
|
BtnRedo.Visibility = result;
|
|
|
|
|
BtnRedo.IsEnabled = status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void StrokesOnStrokesChanged(object sender, StrokeCollectionChangedEventArgs e) {
|
|
|
|
|
if (!isHidingSubPanelsWhenInking) {
|
|
|
|
|
isHidingSubPanelsWhenInking = true;
|
|
|
|
|
HideSubPanels(); // 书写时自动隐藏二级菜单
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_currentCommitType == CommitReason.CodeInput || _currentCommitType == CommitReason.ShapeDrawing) return;
|
2024-05-11 01:35:32 +08:00
|
|
|
|
if (_currentCommitType == CommitReason.Manipulation)
|
|
|
|
|
{
|
|
|
|
|
timeMachine.CommitStrokeManipulationHistory(e.Removed, e.Added);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ((e.Added.Count != 0 || e.Removed.Count != 0) && IsEraseByPoint) {
|
|
|
|
|
if (AddedStroke == null) AddedStroke = new StrokeCollection();
|
|
|
|
|
if (ReplacedStroke == null) ReplacedStroke = new StrokeCollection();
|
|
|
|
|
AddedStroke.Add(e.Added);
|
|
|
|
|
ReplacedStroke.Add(e.Removed);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (e.Added.Count != 0) {
|
|
|
|
|
if (_currentCommitType == CommitReason.ShapeRecognition) {
|
|
|
|
|
timeMachine.CommitStrokeShapeHistory(ReplacedStroke, e.Added);
|
|
|
|
|
ReplacedStroke = null;
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
timeMachine.CommitStrokeUserInputHistory(e.Added);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (e.Removed.Count != 0) {
|
|
|
|
|
if (_currentCommitType == CommitReason.ShapeRecognition) {
|
|
|
|
|
ReplacedStroke = e.Removed;
|
|
|
|
|
return;
|
|
|
|
|
} else if (!IsEraseByPoint || _currentCommitType == CommitReason.ClearingCanvas) {
|
|
|
|
|
timeMachine.CommitStrokeEraseHistory(e.Removed);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|