InkCanvasForClass/Ink Canvas/MainWindow_cs/MW_BoardControls.cs

235 lines
9.8 KiB
C#
Raw Normal View History

2024-05-01 18:23:32 +08:00
using Ink_Canvas.Helpers;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
2024-05-01 18:23:32 +08:00
using System.Windows;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media.Animation;
using System.Windows.Media;
2024-05-01 18:23:32 +08:00
using System.Windows.Media.Imaging;
using System.Xml.Linq;
using System.Windows.Controls;
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();
} 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);
} 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
}
private async void BtnWhiteBoardPageIndex_Click(object sender, EventArgs e) {
if (BoardBorderLeftPageListView.Visibility == Visibility.Visible) {
AnimationsHelper.HideWithSlideAndFade(BoardBorderLeftPageListView);
} else {
RefreshBlackBoardLeftSidePageListView();
try {
var sb = new Storyboard();
// 渐变动画
var fadeInAnimation = new DoubleAnimation {
From = 0.5,
To = 1,
Duration = TimeSpan.FromSeconds(0.15)
};
fadeInAnimation.EasingFunction = new CubicEase();
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
// 滑动动画
var slideAnimation = new DoubleAnimation {
From = BoardBorderLeftPageListView.RenderTransform.Value.OffsetY + 10, // 滑动距离
To = 0,
Duration = TimeSpan.FromSeconds(0.15)
};
Storyboard.SetTargetProperty(slideAnimation,
new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));
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 { }
await Task.Delay(1);
ScrollViewToVerticalTop(
(ListViewItem)BlackBoardLeftSidePageListView.ItemContainerGenerator.ContainerFromIndex(
CurrentWhiteboardIndex - 1), BlackBoardLeftSidePageListScrollViewer);
}
}
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) {
Trace.WriteLine("113223234");
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;
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 =
$"{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();
//BoardLeftPannelNextPage.Source = newImageSource;
//BoardRightPannelNextPage.Source = newImageSource;
//BoardRightPannelNextPageTextBlock.Text = "加页";
//BoardLeftPannelNextPageTextBlock.Text = "加页";
} 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();
//BoardLeftPannelNextPage.Source = newImageSource;
//BoardRightPannelNextPage.Source = newImageSource;
//BoardRightPannelNextPageTextBlock.Text = "下一页";
//BoardLeftPannelNextPageTextBlock.Text = "下一页";
2024-05-01 18:23:32 +08:00
}
BtnWhiteBoardSwitchPrevious.IsEnabled = true;
BtnWhiteBoardSwitchNext.IsEnabled = true;
if (CurrentWhiteboardIndex == 1) {
BtnWhiteBoardSwitchPrevious.IsEnabled = false;
BtnLeftWhiteBoardSwitchPreviousGeometry.Brush = new SolidColorBrush(Color.FromArgb(127, 24, 24, 27));
BtnLeftWhiteBoardSwitchPreviousLabel.Opacity = 0.5;
BtnLeftWhiteBoardSwitchNextGeometry.Brush = new SolidColorBrush(Color.FromArgb(255, 24, 24, 27));
BtnLeftWhiteBoardSwitchNextLabel.Opacity = 1;
} else {
BtnLeftWhiteBoardSwitchPreviousGeometry.Brush = new SolidColorBrush(Color.FromArgb(255, 24, 24, 27));
BtnLeftWhiteBoardSwitchPreviousLabel.Opacity = 1;
2024-05-01 18:23:32 +08:00
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
BtnLeftWhiteBoardSwitchNextGeometry.Brush = new SolidColorBrush(Color.FromArgb(127, 24, 24, 27));
BtnLeftWhiteBoardSwitchNextLabel.Opacity = 0.5;
BtnWhiteBoardSwitchNext.IsEnabled = false;
} 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
}
}
}