improve:issue #79

This commit is contained in:
2025-07-19 17:21:59 +08:00
parent fa7dae8177
commit fd8b4d94d6
4 changed files with 228 additions and 23 deletions
+2
View File
@@ -132,6 +132,8 @@
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="WindowsFormsIntegration" />
</ItemGroup>
<ItemGroup>
+225 -22
View File
@@ -2,6 +2,7 @@ using Ink_Canvas.Helpers;
using Microsoft.Win32;
using System;
using System.IO;
using System.IO.Compression;
using System.Windows;
using System.Windows.Ink;
using System.Windows.Input;
@@ -311,38 +312,240 @@ namespace Ink_Canvas {
var openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Settings.Automation.AutoSavedStrokesLocation;
openFileDialog.Title = "打开墨迹文件";
openFileDialog.Filter = "Ink Canvas Strokes File (*.icstk)|*.icstk";
openFileDialog.Filter = "Ink Canvas Strokes File (*.icstk)|*.icstk|ICC压缩包 (*.zip)|*.zip";
if (openFileDialog.ShowDialog() != true) return;
LogHelper.WriteLogToFile($"Strokes Insert: Name: {openFileDialog.FileName}",
LogHelper.LogType.Event);
try {
var fileStreamHasNoStroke = false;
using (var fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
fileStreamHasNoStroke = strokes.Count == 0;
if (!fileStreamHasNoStroke) {
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert: Strokes Count: {inkCanvas.Strokes.Count.ToString()}");
}
string fileExtension = Path.GetExtension(openFileDialog.FileName).ToLower();
if (fileExtension == ".zip") {
// 处理ICC压缩包
OpenICCZipFile(openFileDialog.FileName);
} else {
// 处理单个墨迹文件
OpenSingleStrokeFile(openFileDialog.FileName);
}
if (fileStreamHasNoStroke)
using (var ms = new MemoryStream(File.ReadAllBytes(openFileDialog.FileName))) {
ms.Seek(0, SeekOrigin.Begin);
var strokes = new StrokeCollection(ms);
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert (2): Strokes Count: {strokes.Count.ToString()}");
}
if (inkCanvas.Visibility != Visibility.Visible) SymbolIconCursor_Click(sender, null);
}
catch {
catch (Exception ex) {
ShowNotification("墨迹打开失败");
LogHelper.WriteLogToFile($"墨迹打开失败: {ex.ToString()}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 打开ICC创建的.zip压缩包
/// </summary>
private void OpenICCZipFile(string zipFilePath) {
try {
// 创建临时目录来解压文件
string tempDir = Path.Combine(Path.GetTempPath(), $"InkCanvas_Open_{DateTime.Now:yyyyMMdd_HHmmss}");
Directory.CreateDirectory(tempDir);
try {
// 解压ZIP文件
System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempDir);
// 读取元数据文件
string metadataFile = Path.Combine(tempDir, "metadata.txt");
if (!File.Exists(metadataFile)) {
throw new Exception("压缩包中未找到元数据文件");
}
var metadata = ReadMetadataFile(metadataFile);
// 根据元数据信息决定恢复模式
bool isPPTMode = metadata.ContainsKey("模式") && metadata["模式"].Contains("PPT放映");
bool isWhiteboardMode = metadata.ContainsKey("模式") && metadata["模式"].Contains("白板");
// 检查当前是否处于PPT模式
bool isCurrentlyInPPTMode = BtnPPTSlideShowEnd.Visibility == Visibility.Visible && pptApplication != null;
// 根据当前模式和保存模式决定恢复策略
if (isPPTMode && isCurrentlyInPPTMode) {
// PPT模式下恢复PPT墨迹
RestorePPTStrokesFromZip(tempDir, metadata);
} else if (isWhiteboardMode) {
// 白板模式下恢复白板墨迹
RestoreWhiteboardStrokesFromZip(tempDir, metadata);
} else {
// 其他情况只恢复白板墨迹
RestoreWhiteboardStrokesFromZip(tempDir, metadata);
}
ShowNotification($"成功打开ICC压缩包,共{(metadata.ContainsKey("") ? metadata[""] : "0")}页");
}
finally {
// 清理临时目录
try {
if (Directory.Exists(tempDir))
Directory.Delete(tempDir, true);
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"清理临时目录失败: {ex.ToString()}", LogHelper.LogType.Warning);
}
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"打开ICC压缩包失败: {ex.ToString()}", LogHelper.LogType.Error);
throw;
}
}
/// <summary>
/// 读取元数据文件
/// </summary>
private Dictionary<string, string> ReadMetadataFile(string metadataPath) {
var metadata = new Dictionary<string, string>();
using (var reader = new StreamReader(metadataPath, System.Text.Encoding.UTF8)) {
string line;
while ((line = reader.ReadLine()) != null) {
if (line.Contains(":")) {
var parts = line.Split(new[] { ':' }, 2);
if (parts.Length == 2) {
metadata[parts[0].Trim()] = parts[1].Trim();
}
}
}
}
return metadata;
}
/// <summary>
/// 从ZIP文件恢复PPT墨迹
/// </summary>
private void RestorePPTStrokesFromZip(string tempDir, Dictionary<string, string> metadata) {
try {
// 清空当前墨迹
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
// 重置PPT墨迹存储
if (memoryStreams == null) {
memoryStreams = new MemoryStream[50];
}
// 读取所有页面的墨迹文件
var files = Directory.GetFiles(tempDir, "page_*.icstk");
foreach (var file in files) {
var fileName = Path.GetFileNameWithoutExtension(file);
if (fileName.StartsWith("page_") && int.TryParse(fileName.Substring(5), out int pageNumber)) {
using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
if (strokes.Count > 0) {
var ms = new MemoryStream();
strokes.Save(ms);
ms.Position = 0;
memoryStreams[pageNumber] = ms;
}
}
}
}
// 恢复当前页面的墨迹
if (pptApplication != null && pptApplication.SlideShowWindows.Count > 0) {
int currentSlide = pptApplication.SlideShowWindows[1].View.CurrentShowPosition;
if (memoryStreams[currentSlide] != null && memoryStreams[currentSlide].Length > 0) {
memoryStreams[currentSlide].Position = 0;
inkCanvas.Strokes.Add(new StrokeCollection(memoryStreams[currentSlide]));
}
previousSlideID = currentSlide;
}
LogHelper.WriteLogToFile($"成功恢复PPT墨迹,共{files.Length}页");
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"恢复PPT墨迹失败: {ex.ToString()}", LogHelper.LogType.Error);
throw;
}
}
/// <summary>
/// 从ZIP文件恢复白板墨迹
/// </summary>
private void RestoreWhiteboardStrokesFromZip(string tempDir, Dictionary<string, string> metadata) {
try {
// 清空当前墨迹
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
// 读取总页数
int totalPages = 1;
if (metadata.ContainsKey("总页数") && int.TryParse(metadata["总页数"], out int parsedPages)) {
totalPages = parsedPages;
}
// 重置白板状态
WhiteboardTotalCount = totalPages;
CurrentWhiteboardIndex = 1;
// 清空历史记录
for (int i = 0; i < TimeMachineHistories.Length; i++) {
TimeMachineHistories[i] = null;
}
// 读取所有页面的墨迹文件
var files = Directory.GetFiles(tempDir, "page_*.icstk");
foreach (var file in files) {
var fileName = Path.GetFileNameWithoutExtension(file);
if (fileName.StartsWith("page_") && int.TryParse(fileName.Substring(5), out int pageNumber)) {
using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
if (strokes.Count > 0) {
// 创建历史记录
var history = new TimeMachineHistory(strokes, TimeMachineHistoryType.UserInput, false);
TimeMachineHistories[pageNumber] = new TimeMachineHistory[] { history };
}
}
}
}
// 恢复第一页的墨迹
if (TimeMachineHistories[1] != null) {
RestoreStrokes();
}
// 更新UI显示
UpdateIndexInfoDisplay();
LogHelper.WriteLogToFile($"成功恢复白板墨迹,共{totalPages}页");
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"恢复白板墨迹失败: {ex.ToString()}", LogHelper.LogType.Error);
throw;
}
}
/// <summary>
/// 打开单个墨迹文件
/// </summary>
private void OpenSingleStrokeFile(string filePath) {
var fileStreamHasNoStroke = false;
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
fileStreamHasNoStroke = strokes.Count == 0;
if (!fileStreamHasNoStroke) {
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert: Strokes Count: {inkCanvas.Strokes.Count.ToString()}");
}
}
if (fileStreamHasNoStroke)
using (var ms = new MemoryStream(File.ReadAllBytes(filePath))) {
ms.Seek(0, SeekOrigin.Begin);
var strokes = new StrokeCollection(ms);
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert (2): Strokes Count: {strokes.Count.ToString()}");
}
}
}
}
@@ -13,7 +13,7 @@ E:\ICC CE\ICC CE main\community\Ink Canvas\App.xaml
21348134359
731095817143
46-932173576
471037513499
Helpers\Plugins\BuiltIn\SuperLauncher\LauncherSettingsControl.xaml;Helpers\Plugins\BuiltIn\SuperLauncher\LauncherWindow.xaml;MainWindow.xaml;MainWindow_cs\MW_Eraser.xaml;Resources\DrawShapeImageDictionary.xaml;Resources\IconImageDictionary.xaml;Resources\SeewoImageDictionary.xaml;Resources\Styles\Dark.xaml;Resources\Styles\Light.xaml;Windows\AddCustomIconWindow.xaml;Windows\AddPickNameBackgroundWindow.xaml;Windows\CountdownTimerWindow.xaml;Windows\CustomIconWindow.xaml;Windows\CycleProcessBar.xaml;Windows\HasNewUpdateWindow.xaml;Windows\ManagePickNameBackgroundsWindow.xaml;Windows\NamesInputWindow.xaml;Windows\OperatingGuideWindow.xaml;Windows\PluginSettingsWindow.xaml;Windows\RandWindow.xaml;Windows\YesOrNoNotificationWindow.xaml;
False