You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/UCDraw/PcgDrawR/Services/NavigationService.cs

101 lines
3.3 KiB
C#

1 month ago
using System;
using System.Threading.Tasks;
using AI.AgentIntegration;
namespace PcgDrawR.Services
{
/// <summary>
/// 负责导航、系统状态以及与界面相关的通用操作。
/// </summary>
public class NavigationService
{
private readonly IAppEnvironment env;
public NavigationService(IAppEnvironment env)
{
this.env = env ?? throw new ArgumentNullException(nameof(env));
}
public Task<AppActionResult> DescribeStateAsync(AppAction action)
{
var state = env.State;
string message = $"Current view: {state.Navigation.CurrentView}, " +
$"Active tab: {state.UI.ActiveTab ?? "None"}, " +
$"Unsaved changes: {state.File.HasUnsavedChanges}";
return Task.FromResult(Success(message));
}
public Task<AppActionResult> SetBusyAsync(AppAction action)
{
if (action.Parameters.TryGetValue("isBusy", out var busyObj))
{
env.State.System.IsBusy = Convert.ToBoolean(busyObj);
}
return Task.FromResult(Success());
}
public Task<AppActionResult> NavigateAsync(AppAction action)
{
if (action.Parameters.TryGetValue("view", out var viewObj))
{
string view = viewObj.ToString();
env.State.Navigation.NavigationStack.Add(env.State.Navigation.CurrentView);
env.State.Navigation.CurrentView = view;
}
return Task.FromResult(Success());
}
public Task<AppActionResult> NavigateBackAsync(AppAction action)
{
var stack = env.State.Navigation.NavigationStack;
if (stack.Count == 0)
{
return Task.FromResult(Fail("没有可以后退的历史记录"));
}
string prev = stack[stack.Count - 1];
stack.RemoveAt(stack.Count - 1);
env.State.Navigation.CurrentView = prev;
return Task.FromResult(Success());
}
public Task<AppActionResult> NavigateForwardAsync(AppAction action)
{
// 前进导航需要维护一个前进栈,此处仍然保留桩实现
return Task.FromResult(Success());
}
public Task<AppActionResult> GetOpenTabsAsync(AppAction action)
{
// 同步一次当前 UI 状态,避免依赖外部调用 GetCurrentState
env.State.UI.OpenTabs = env.MainForm.OpenTabs;
env.State.UI.ActiveTab = env.MainForm.ActivateTab;
return Task.FromResult(Success(env.State.UI.OpenTabs));
}
public Task<AppActionResult> RefreshAsync(AppAction action)
{
env.MainForm.Invoke(() => env.MainForm.Refresh());
return Task.FromResult(Success());
}
public Task<AppActionResult> ExitAsync(AppAction action)
{
env.MainForm.Invoke(() => env.MainForm.Close());
return Task.FromResult(Success());
}
private AppActionResult Success(object data = null)
{
return new AppActionResult { Success = true, Data = data };
}
private AppActionResult Fail(string message)
{
return new AppActionResult { Success = false, Message = message };
}
}
}