Files
Shigure/App/ShigureRuntimeFactory.cs
waynebian01 99300fb702 feat: Implement module dependency management and unsaved changes tracking
- Added `HasUnsavedChanges` property to `ClassConfigEditorControl` and `ClassMacrosEditorControl` to track unsaved changes.
- Introduced `ModuleDependencyService` for handling module dependencies, including capturing and importing configurations and macros.
- Implemented atomic file writing in `AtomicFile` to ensure safe file operations.
- Enhanced `MainForm` to check for unsaved changes before importing module dependencies and added feedback mechanisms for users.
- Updated `ModuleEditorControl` to support dependency capturing and module reloading.
- Created data structures for module dependency snapshots, configurations, and macros.
- Improved error handling and user notifications during module import processes.
2026-08-14 17:36:45 +08:00

47 lines
1.6 KiB
C#

namespace Shigure;
internal interface IShigureRuntimeFactory
{
ShigureRuntime Create(AppOptions options);
}
internal sealed class ShigureRuntimeFactory : IShigureRuntimeFactory
{
private readonly string _baseDirectory;
private readonly ModuleStore _moduleStore;
private readonly ITriggerKeyState _triggerKeyState;
private readonly WowProcessLocator _processLocator;
private readonly TimeProvider _timeProvider;
public ShigureRuntimeFactory(
string baseDirectory,
ModuleStore moduleStore,
ITriggerKeyState triggerKeyState,
WowProcessLocator processLocator,
TimeProvider? timeProvider = null)
{
_baseDirectory = baseDirectory;
_moduleStore = moduleStore;
_triggerKeyState = triggerKeyState;
_processLocator = processLocator;
_timeProvider = timeProvider ?? TimeProvider.System;
}
public ShigureRuntime Create(AppOptions options)
{
// 模块目录由启动/刷新时的依赖导入流程统一重载并过滤;这里直接使用已验证快照,
// 避免把因宏容量超限而拒绝的磁盘模块重新带回运行时。
var config = ConfigService.LoadFromBaseDirectory(_baseDirectory);
var keymap = new KeymapService(_baseDirectory, config);
return new ShigureRuntime(
options,
new PixelScanner(_processLocator),
new StateBuilder(config),
new KeySender(_processLocator),
_triggerKeyState,
new LogicRegistry(keymap, _moduleStore, options.ModuleId),
_timeProvider);
}
}