Files
community/Ink Canvas/MainWindow_cs/MainWindow_PluginHostApi.cs
T
2026-04-05 14:06:49 +08:00

153 lines
4.3 KiB
C#

using System;
using System.Windows;
using System.Windows.Ink;
using MessageBox = iNKORE.UI.WPF.Modern.Controls.MessageBox;
namespace Ink_Canvas
{
/// <summary>
/// 供 <see cref="Helpers.Plugins.PluginSdkHostContext"/> 调用的宿主 API,封装 UI 线程与内部墨迹逻辑。
/// </summary>
public partial class MainWindow : Window
{
internal void PluginHost_RunOnUiThread(Action action)
{
if (action == null)
{
return;
}
if (Dispatcher.CheckAccess())
{
action();
}
else
{
Dispatcher.Invoke(action);
}
}
internal void PluginHost_Undo()
{
PluginHost_RunOnUiThread(() =>
{
if (inkCanvas.GetSelectedStrokes().Count != 0)
{
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
inkCanvas.Select(new StrokeCollection());
}
var item = timeMachine.Undo();
ApplyHistoryToCanvas(item);
});
}
internal void PluginHost_Redo()
{
PluginHost_RunOnUiThread(() =>
{
if (inkCanvas.GetSelectedStrokes().Count != 0)
{
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
inkCanvas.Select(new StrokeCollection());
}
var item = timeMachine.Redo();
ApplyHistoryToCanvas(item);
});
}
internal void PluginHost_ClearInk(bool erasedByCode)
{
PluginHost_RunOnUiThread(() => ClearStrokes(erasedByCode));
}
internal bool PluginHost_CanUndo()
{
if (Dispatcher.CheckAccess())
{
return timeMachine != null && timeMachine.CanUndo;
}
return Dispatcher.Invoke(() => timeMachine != null && timeMachine.CanUndo);
}
internal bool PluginHost_CanRedo()
{
if (Dispatcher.CheckAccess())
{
return timeMachine != null && timeMachine.CanRedo;
}
return Dispatcher.Invoke(() => timeMachine != null && timeMachine.CanRedo);
}
internal void PluginHost_ShowInfo(string title, string message)
{
PluginHost_RunOnUiThread(() =>
{
try
{
MessageBox.Show(message ?? string.Empty, title ?? string.Empty);
}
catch
{
// 忽略对话框失败,避免插件拖垮宿主
}
});
}
internal bool PluginHost_ShowConfirm(string title, string message)
{
if (Dispatcher.CheckAccess())
{
try
{
return MessageBox.Show(message ?? string.Empty, title ?? string.Empty, MessageBoxButton.YesNo) ==
MessageBoxResult.Yes;
}
catch
{
return false;
}
}
return Dispatcher.Invoke(() =>
{
try
{
return MessageBox.Show(message ?? string.Empty, title ?? string.Empty, MessageBoxButton.YesNo) ==
MessageBoxResult.Yes;
}
catch
{
return false;
}
});
}
internal string PluginHost_ShowInput(string title, string message, string defaultValue)
{
string Show()
{
try
{
return Microsoft.VisualBasic.Interaction.InputBox(message ?? string.Empty, title ?? string.Empty,
defaultValue ?? string.Empty);
}
catch
{
return defaultValue ?? string.Empty;
}
}
if (Dispatcher.CheckAccess())
{
return Show();
}
return Dispatcher.Invoke(Show);
}
}
}