2024-05-01 18:23:32 +08:00
|
|
|
|
using Ink_Canvas.Helpers;
|
|
|
|
|
using System;
|
2024-06-09 21:29:03 +08:00
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Linq;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
using System.Threading.Tasks;
|
2024-05-01 18:23:32 +08:00
|
|
|
|
using System.Windows;
|
|
|
|
|
using System.Windows.Ink;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
using System.Windows.Input;
|
2024-06-09 21:29:03 +08:00
|
|
|
|
using System.Windows.Media.Animation;
|
|
|
|
|
using System.Windows.Media;
|
2024-05-01 18:23:32 +08:00
|
|
|
|
using System.Windows.Media.Imaging;
|
2024-06-09 21:29:03 +08:00
|
|
|
|
using System.Xml.Linq;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
using Xceed.Wpf.Toolkit.Core.Utilities;
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
|
|
|
|
namespace Ink_Canvas {
|
|
|
|
|
public partial class MainWindow : Window {
|
2024-06-05 20:25:26 +08:00
|
|
|
|
private StrokeCollection[] strokeCollections = new StrokeCollection[101];
|
|
|
|
|
private bool[] whiteboadLastModeIsRedo = new bool[101];
|
|
|
|
|
private StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection();
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
private int CurrentWhiteboardIndex = 1;
|
|
|
|
|
private int WhiteboardTotalCount = 1;
|
|
|
|
|
private TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页,0用来存储非白板时的墨迹以便还原
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
|
|
|
|
private void SaveStrokes(bool isBackupMain = false) {
|
|
|
|
|
if (isBackupMain) {
|
|
|
|
|
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
|
|
|
|
|
TimeMachineHistories[0] = timeMachineHistory;
|
|
|
|
|
timeMachine.ClearStrokeHistory();
|
2024-06-10 18:05:32 +08:00
|
|
|
|
} else {
|
2024-05-01 18:23:32 +08:00
|
|
|
|
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) {
|
|
|
|
|
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]);
|
2024-06-05 20:25:26 +08:00
|
|
|
|
foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item);
|
2024-06-10 18:05:32 +08:00
|
|
|
|
} else {
|
2024-05-01 18:23:32 +08:00
|
|
|
|
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]);
|
2024-06-05 20:25:26 +08:00
|
|
|
|
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
2024-06-05 20:25:26 +08:00
|
|
|
|
}
|
|
|
|
|
catch {
|
|
|
|
|
// ignored
|
|
|
|
|
}
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-10 18:05:32 +08:00
|
|
|
|
private async void BtnWhiteBoardPageIndex_Click(object sender, EventArgs e) {
|
2024-06-09 21:29:03 +08:00
|
|
|
|
if (BoardBorderLeftPageListView.Visibility == Visibility.Visible) {
|
|
|
|
|
AnimationsHelper.HideWithSlideAndFade(BoardBorderLeftPageListView);
|
|
|
|
|
} else {
|
|
|
|
|
RefreshBlackBoardLeftSidePageListView();
|
|
|
|
|
|
2024-06-10 18:05:32 +08:00
|
|
|
|
try {
|
2024-06-09 21:29:03 +08:00
|
|
|
|
var sb = new Storyboard();
|
|
|
|
|
|
|
|
|
|
// 渐变动画
|
2024-06-10 18:05:32 +08:00
|
|
|
|
var fadeInAnimation = new DoubleAnimation {
|
2024-06-09 21:29:03 +08:00
|
|
|
|
From = 0.5,
|
|
|
|
|
To = 1,
|
|
|
|
|
Duration = TimeSpan.FromSeconds(0.15)
|
|
|
|
|
};
|
|
|
|
|
fadeInAnimation.EasingFunction = new CubicEase();
|
|
|
|
|
|
|
|
|
|
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
|
|
|
|
|
|
|
|
|
|
// 滑动动画
|
2024-06-10 18:05:32 +08:00
|
|
|
|
var slideAnimation = new DoubleAnimation {
|
2024-06-09 21:29:03 +08:00
|
|
|
|
From = BoardBorderLeftPageListView.RenderTransform.Value.OffsetY + 10, // 滑动距离
|
|
|
|
|
To = 0,
|
|
|
|
|
Duration = TimeSpan.FromSeconds(0.15)
|
|
|
|
|
};
|
2024-06-10 18:05:32 +08:00
|
|
|
|
Storyboard.SetTargetProperty(slideAnimation,
|
|
|
|
|
new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));
|
2024-06-09 21:29:03 +08:00
|
|
|
|
|
|
|
|
|
slideAnimation.EasingFunction = new CubicEase();
|
|
|
|
|
|
|
|
|
|
sb.Children.Add(fadeInAnimation);
|
|
|
|
|
sb.Children.Add(slideAnimation);
|
|
|
|
|
|
|
|
|
|
BoardBorderLeftPageListView.Visibility = Visibility.Visible;
|
|
|
|
|
BoardBorderLeftPageListView.RenderTransform = new TranslateTransform();
|
|
|
|
|
|
|
|
|
|
sb.Begin((FrameworkElement)BoardBorderLeftPageListView);
|
|
|
|
|
}
|
|
|
|
|
catch { }
|
2024-06-10 18:05:32 +08:00
|
|
|
|
|
|
|
|
|
await Task.Delay(1);
|
|
|
|
|
ScrollViewToVerticalTop(
|
|
|
|
|
(ListViewItem)BlackBoardLeftSidePageListView.ItemContainerGenerator.ContainerFromIndex(
|
|
|
|
|
CurrentWhiteboardIndex - 1), BlackBoardLeftSidePageListScrollViewer);
|
2024-06-09 21:29:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-01 18:23:32 +08:00
|
|
|
|
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) {
|
2024-06-05 20:25:26 +08:00
|
|
|
|
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
|
|
|
|
|
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
if (CurrentWhiteboardIndex >= WhiteboardTotalCount) {
|
|
|
|
|
BtnWhiteBoardAdd_Click(sender, e);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-06-05 20:25:26 +08:00
|
|
|
|
|
2024-05-01 18:23:32 +08:00
|
|
|
|
SaveStrokes();
|
|
|
|
|
|
|
|
|
|
ClearStrokes(true);
|
|
|
|
|
CurrentWhiteboardIndex++;
|
|
|
|
|
|
|
|
|
|
RestoreStrokes();
|
|
|
|
|
|
|
|
|
|
UpdateIndexInfoDisplay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void BtnWhiteBoardAdd_Click(object sender, EventArgs e) {
|
|
|
|
|
if (WhiteboardTotalCount >= 99) return;
|
2024-06-05 20:25:26 +08:00
|
|
|
|
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
|
|
|
|
|
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
SaveStrokes();
|
|
|
|
|
ClearStrokes(true);
|
|
|
|
|
|
|
|
|
|
WhiteboardTotalCount++;
|
|
|
|
|
CurrentWhiteboardIndex++;
|
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
if (CurrentWhiteboardIndex != WhiteboardTotalCount)
|
|
|
|
|
for (var i = WhiteboardTotalCount; i > CurrentWhiteboardIndex; i--)
|
2024-05-01 18:23:32 +08:00
|
|
|
|
TimeMachineHistories[i] = TimeMachineHistories[i - 1];
|
|
|
|
|
|
|
|
|
|
UpdateIndexInfoDisplay();
|
|
|
|
|
|
|
|
|
|
if (WhiteboardTotalCount >= 99) BtnWhiteBoardAdd.IsEnabled = false;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
|
|
|
|
|
if (BlackBoardLeftSidePageListView.Visibility == Visibility.Visible) {
|
|
|
|
|
RefreshBlackBoardLeftSidePageListView();
|
|
|
|
|
}
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void BtnWhiteBoardDelete_Click(object sender, RoutedEventArgs e) {
|
|
|
|
|
ClearStrokes(true);
|
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
if (CurrentWhiteboardIndex != WhiteboardTotalCount)
|
|
|
|
|
for (var i = CurrentWhiteboardIndex; i <= WhiteboardTotalCount; i++)
|
2024-05-01 18:23:32 +08:00
|
|
|
|
TimeMachineHistories[i] = TimeMachineHistories[i + 1];
|
2024-06-05 20:25:26 +08:00
|
|
|
|
else
|
2024-05-01 18:23:32 +08:00
|
|
|
|
CurrentWhiteboardIndex--;
|
|
|
|
|
|
|
|
|
|
WhiteboardTotalCount--;
|
|
|
|
|
|
|
|
|
|
RestoreStrokes();
|
|
|
|
|
|
|
|
|
|
UpdateIndexInfoDisplay();
|
|
|
|
|
|
|
|
|
|
if (WhiteboardTotalCount < 99) BtnWhiteBoardAdd.IsEnabled = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateIndexInfoDisplay() {
|
2024-06-05 20:25:26 +08:00
|
|
|
|
TextBlockWhiteBoardIndexInfo.Text =
|
2024-06-09 15:14:58 +08:00
|
|
|
|
$"{CurrentWhiteboardIndex}/{WhiteboardTotalCount}";
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
|
|
|
|
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
|
2024-06-05 20:25:26 +08:00
|
|
|
|
var newImageSource = new BitmapImage();
|
2024-05-01 18:23:32 +08:00
|
|
|
|
newImageSource.BeginInit();
|
2024-06-05 20:25:26 +08:00
|
|
|
|
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_add_circle_24_regular.png",
|
|
|
|
|
UriKind.RelativeOrAbsolute);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
newImageSource.EndInit();
|
2024-06-09 15:14:58 +08:00
|
|
|
|
//BoardLeftPannelNextPage.Source = newImageSource;
|
|
|
|
|
//BoardRightPannelNextPage.Source = newImageSource;
|
|
|
|
|
//BoardRightPannelNextPageTextBlock.Text = "加页";
|
|
|
|
|
//BoardLeftPannelNextPageTextBlock.Text = "加页";
|
2024-06-10 18:05:32 +08:00
|
|
|
|
} else {
|
2024-06-05 20:25:26 +08:00
|
|
|
|
var newImageSource = new BitmapImage();
|
2024-05-01 18:23:32 +08:00
|
|
|
|
newImageSource.BeginInit();
|
2024-06-05 20:25:26 +08:00
|
|
|
|
newImageSource.UriSource =
|
|
|
|
|
new Uri("/Resources/Icons-Fluent/ic_fluent_arrow_circle_right_24_regular.png",
|
|
|
|
|
UriKind.RelativeOrAbsolute);
|
2024-05-01 18:23:32 +08:00
|
|
|
|
newImageSource.EndInit();
|
2024-06-09 15:14:58 +08:00
|
|
|
|
//BoardLeftPannelNextPage.Source = newImageSource;
|
|
|
|
|
//BoardRightPannelNextPage.Source = newImageSource;
|
|
|
|
|
//BoardRightPannelNextPageTextBlock.Text = "下一页";
|
|
|
|
|
//BoardLeftPannelNextPageTextBlock.Text = "下一页";
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
BtnWhiteBoardSwitchPrevious.IsEnabled = CurrentWhiteboardIndex != 1;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
if (CurrentWhiteboardIndex == 1) {
|
|
|
|
|
BtnLeftWhiteBoardSwitchPreviousGeometry.Brush = new SolidColorBrush(Color.FromArgb(127, 24, 24, 27));
|
|
|
|
|
BtnLeftWhiteBoardSwitchPreviousLabel.Opacity = 0.5;
|
|
|
|
|
} else {
|
|
|
|
|
BtnLeftWhiteBoardSwitchPreviousGeometry.Brush = new SolidColorBrush(Color.FromArgb(255, 24, 24, 27));
|
|
|
|
|
BtnLeftWhiteBoardSwitchPreviousLabel.Opacity = 1;
|
|
|
|
|
}
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
BtnWhiteBoardSwitchNext.IsEnabled = CurrentWhiteboardIndex != WhiteboardTotalCount;
|
2024-06-10 18:05:32 +08:00
|
|
|
|
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
|
|
|
|
|
BtnLeftWhiteBoardSwitchNextGeometry.Brush = new SolidColorBrush(Color.FromArgb(127, 24, 24, 27));
|
|
|
|
|
BtnLeftWhiteBoardSwitchNextLabel.Opacity = 0.5;
|
|
|
|
|
} else {
|
|
|
|
|
BtnLeftWhiteBoardSwitchNextGeometry.Brush = new SolidColorBrush(Color.FromArgb(255, 24, 24, 27));
|
|
|
|
|
BtnLeftWhiteBoardSwitchNextLabel.Opacity = 1;
|
|
|
|
|
}
|
2024-05-01 18:23:32 +08:00
|
|
|
|
|
2024-06-05 20:25:26 +08:00
|
|
|
|
BtnWhiteBoardDelete.IsEnabled = WhiteboardTotalCount != 1;
|
2024-05-01 18:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|