Files
ft/Client/Packages/io.github.hatayama.uloopmcp/Editor/UI/McpEditorModel.cs

400 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace io.github.hatayama.uLoopMCP
{
/// <summary>
/// Model layer for McpEditorWindow in MVP architecture
/// Handles state management and business logic using immutable state objects
/// Related classes:
/// - McpEditorWindowState: State objects managed by this model
/// - McpEditorWindow: Presenter that uses this model
/// - McpEditorWindowView: View layer for UI rendering
/// - McpEditorSettings: Persistent settings storage
/// </summary>
public class McpEditorModel
{
public UIState UI { get; private set; }
public RuntimeState Runtime { get; private set; }
public McpEditorModel()
{
UI = new UIState();
Runtime = new RuntimeState();
}
/// <summary>
/// Update UI state with new values
/// </summary>
/// <param name="updater">Function to update UI state</param>
public void UpdateUIState(Func<UIState, UIState> updater)
{
UI = updater(UI);
}
/// <summary>
/// Update runtime state with new values
/// </summary>
/// <param name="updater">Function to update runtime state</param>
public void UpdateRuntimeState(Func<RuntimeState, RuntimeState> updater)
{
Runtime = updater(Runtime);
}
/// <summary>
/// Load state from persistent settings
/// </summary>
public void LoadFromSettings()
{
McpEditorSettingsData settings = McpEditorSettings.GetSettings();
UpdateUIState(ui => new UIState(
customPort: settings.customPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: settings.showSecuritySettings,
showToolSettings: settings.showToolSettings,
addRepositoryRoot: settings.addRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: (ConnectionMode)settings.connectionMode,
showConfiguration: ui.ShowConfiguration));
}
/// <summary>
/// Save current UI state to persistent settings
/// </summary>
public void SaveToSettings()
{
McpEditorSettings.SetCustomPort(UI.CustomPort);
McpEditorSettings.SetConnectionMode(UI.ConnectionMode);
}
/// <summary>
/// Load state from persistent settings (formerly from SessionState)
/// </summary>
public void LoadFromSessionState()
{
McpEditorType selectedEditor = McpEditorSettings.GetSelectedEditorType();
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: selectedEditor,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
}
/// <summary>
/// Save current state to persistent settings (formerly to SessionState)
/// </summary>
public void SaveToSessionState()
{
McpEditorSettings.SetSelectedEditorType(UI.SelectedEditorType);
}
/// <summary>
/// Initialize post-compile mode
/// </summary>
public void EnablePostCompileMode()
{
UpdateRuntimeState(runtime => new RuntimeState(
isPostCompileMode: true,
needsRepaint: true,
lastServerRunning: runtime.LastServerRunning,
lastServerPort: runtime.LastServerPort,
lastConnectedClientsCount: runtime.LastConnectedClientsCount,
lastClientsInfoHash: runtime.LastClientsInfoHash));
}
/// <summary>
/// Exit post-compile mode
/// </summary>
public void DisablePostCompileMode()
{
UpdateRuntimeState(runtime => new RuntimeState(
isPostCompileMode: false,
needsRepaint: runtime.NeedsRepaint,
lastServerRunning: runtime.LastServerRunning,
lastServerPort: runtime.LastServerPort,
lastConnectedClientsCount: runtime.LastConnectedClientsCount,
lastClientsInfoHash: runtime.LastClientsInfoHash));
}
/// <summary>
/// Mark that UI repaint is needed
/// </summary>
public void RequestRepaint()
{
UpdateRuntimeState(runtime => new RuntimeState(
isPostCompileMode: runtime.IsPostCompileMode,
needsRepaint: true,
lastServerRunning: runtime.LastServerRunning,
lastServerPort: runtime.LastServerPort,
lastConnectedClientsCount: runtime.LastConnectedClientsCount,
lastClientsInfoHash: runtime.LastClientsInfoHash));
}
/// <summary>
/// Clear repaint request
/// </summary>
public void ClearRepaintRequest()
{
UpdateRuntimeState(runtime => new RuntimeState(
isPostCompileMode: runtime.IsPostCompileMode,
needsRepaint: false,
lastServerRunning: runtime.LastServerRunning,
lastServerPort: runtime.LastServerPort,
lastConnectedClientsCount: runtime.LastConnectedClientsCount,
lastClientsInfoHash: runtime.LastClientsInfoHash));
}
/// <summary>
/// Update server state tracking for change detection
/// </summary>
public void UpdateServerStateTracking(bool isRunning, int port, int clientCount, string clientsHash)
{
UpdateRuntimeState(runtime => new RuntimeState(
isPostCompileMode: runtime.IsPostCompileMode,
needsRepaint: runtime.NeedsRepaint,
lastServerRunning: isRunning,
lastServerPort: port,
lastConnectedClientsCount: clientCount,
lastClientsInfoHash: clientsHash));
}
// UIState-specific update methods with persistence
/// <summary>
/// Update CustomPort setting with persistence
/// </summary>
public void UpdateCustomPort(int port)
{
UpdateUIState(ui => new UIState(
customPort: port,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetCustomPort(port);
}
/// <summary>
/// Update ShowConnectedTools setting
/// </summary>
public void UpdateShowConnectedTools(bool show)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: show,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
}
/// <summary>
/// Update SelectedEditorType setting with persistence
/// </summary>
public void UpdateSelectedEditorType(McpEditorType type)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: type,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetSelectedEditorType(type);
}
/// <summary>
/// Update MainScrollPosition setting
/// </summary>
public void UpdateMainScrollPosition(Vector2 position)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: position,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
}
/// <summary>
/// Update ShowSecuritySettings setting with persistence
/// </summary>
public void UpdateShowSecuritySettings(bool show)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: show,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetShowSecuritySettings(show);
}
public void UpdateShowToolSettings(bool show)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: show,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetShowToolSettings(show);
}
public void UpdateToolEnabled(string toolName, bool enabled)
{
ToolSettings.SetToolEnabled(toolName, enabled);
}
/// <summary>
/// Update AllowThirdPartyTools setting with persistence
/// </summary>
public void UpdateAllowThirdPartyTools(bool allow)
{
ULoopSettings.SetAllowThirdPartyTools(allow);
}
/// <summary>
/// Update AddRepositoryRoot setting with persistence
/// </summary>
public void UpdateAddRepositoryRoot(bool addRepositoryRoot)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: addRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetAddRepositoryRoot(addRepositoryRoot);
UnityMcpPathResolver.InvalidateGitRootCache();
}
/// <summary>
/// Update SupportsRepositoryRootToggle flag
/// </summary>
public void UpdateSupportsRepositoryRootToggle(bool supportsToggle)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: supportsToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
}
/// <summary>
/// Update ShowRepositoryRootToggle flag
/// </summary>
public void UpdateShowRepositoryRootToggle(bool showToggle)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: showToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: ui.ShowConfiguration));
}
public void UpdateConnectionMode(ConnectionMode mode)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: mode,
showConfiguration: ui.ShowConfiguration));
McpEditorSettings.SetConnectionMode(mode);
}
public void UpdateShowConfiguration(bool show)
{
UpdateUIState(ui => new UIState(
customPort: ui.CustomPort,
showConnectedTools: ui.ShowConnectedTools,
selectedEditorType: ui.SelectedEditorType,
mainScrollPosition: ui.MainScrollPosition,
showSecuritySettings: ui.ShowSecuritySettings,
showToolSettings: ui.ShowToolSettings,
addRepositoryRoot: ui.AddRepositoryRoot,
supportsRepositoryRootToggle: ui.SupportsRepositoryRootToggle,
showRepositoryRootToggle: ui.ShowRepositoryRootToggle,
connectionMode: ui.ConnectionMode,
showConfiguration: show));
}
}
}