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.
101 lines
3.3 KiB
C#
101 lines
3.3 KiB
C#
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 };
|
|
}
|
|
}
|
|
}
|
|
|