Forge
csharpdeeb25a2
1namespace CascadeIDE.Models;
2
3/// <summary>
4/// PFD-граф: связи файлов (якорь → соседи) и/или control-flow намерения по методу.
5/// TOML: <c>[code_navigation.file_relations_and_control_flow_intent_graph]</c>.
6/// </summary>
7public sealed class FileRelationsAndControlFlowIntentGraphSettings
8{
9 public const double DefaultCaretIdleRefreshSeconds = 2.0;
10
11 /// <summary><c>list</c> | <c>graph</c> | <c>both</c>.</summary>
12 public string View { get; set; } = "list";
13
14 /// <summary><c>file</c> | <c>controlFlow</c>.</summary>
15 public string Depth { get; set; } = CodeNavigationMapLevelKind.File;
16
17 /// <summary><c>glance</c> | <c>normal</c> | <c>inspect</c> — детализация композиции (ADR 0055).</summary>
18 public string DetailLevel { get; set; } = "normal";
19
20 /// <summary>
21 /// Порог «покоя каретки» перед обновлением карты control-flow в секундах.
22 /// TOML: <c>…graph].caret_idle_refresh_seconds</c>.
23 /// </summary>
24 public double CaretIdleRefreshSeconds { get; set; } = DefaultCaretIdleRefreshSeconds;
25
26 /// <summary>
27 /// Подавлять побочные эффекты редактора (HUD/карта/tooltip) во время drag-selection ЛКМ.
28 /// TOML: <c>…graph].suspend_editor_side_effects_while_selecting</c>.
29 /// </summary>
30 public bool SuspendEditorSideEffectsWhileSelecting { get; set; }
31
32 /// <summary>
33 /// Режим Control Flow по <see cref="Depth"/> — тот же критерий, что ветка CF в
34 /// <c>RunWorkspaceNavigationMapRefreshAsync</c> и обновление карты по курсору (<c>UpdateWorkspaceNavigationMapCaretOffset</c>).
35 /// </summary>
36 public bool IsControlFlowDepth =>
37 string.Equals(NormalizeDepth(Depth), CodeNavigationMapLevelKind.ControlFlow, StringComparison.Ordinal);
38
39 /// <summary>Соответствует <c>wantList</c> в <c>RunWorkspaceNavigationMapRefreshAsync</c> (после <see cref="NormalizeView"/>).</summary>
40 public bool WantsWorkspaceNavigationMapList =>
41 NormalizeView(View) is "list" or "both";
42
43 /// <summary>Соответствует <c>wantGraph</c> в <c>RunWorkspaceNavigationMapRefreshAsync</c>.</summary>
44 public bool WantsWorkspaceNavigationMapGraph =>
45 NormalizeView(View) is "graph" or "both";
46
47 public static string NormalizeView(string? value)
48 {
49 var v = (value ?? "").Trim().ToLowerInvariant();
50 return v is "graph" or "both" or "list" ? v : "list";
51 }
52
53 public static string NormalizeDepth(string? value)
54 {
55 var v = (value ?? "").Trim();
56 if (string.Equals(v, CodeNavigationMapLevelKind.ControlFlow, StringComparison.OrdinalIgnoreCase))
57 return CodeNavigationMapLevelKind.ControlFlow;
58 return CodeNavigationMapLevelKind.File;
59 }
60
61 /// <summary>Соответствует <see cref="DetailLevel"/> и вызову композитора.</summary>
62 public CodeNavigationMapDetailLevel NormalizedDetailLevel => NormalizeDetailLevel(DetailLevel);
63
64 /// <summary>Нормализованный порог idle-перестройки: <c>0.15..10</c> секунд.</summary>
65 public double NormalizedCaretIdleRefreshSeconds =>
66 NormalizeCaretIdleRefreshSeconds(CaretIdleRefreshSeconds);
67
68 public static CodeNavigationMapDetailLevel NormalizeDetailLevel(string? value)
69 {
70 var v = (value ?? "").Trim().ToLowerInvariant();
71 return v switch
72 {
73 "glance" => CodeNavigationMapDetailLevel.Glance,
74 "inspect" => CodeNavigationMapDetailLevel.Inspect,
75 _ => CodeNavigationMapDetailLevel.Normal
76 };
77 }
78
79 public static double NormalizeCaretIdleRefreshSeconds(double? value)
80 {
81 var seconds = value ?? DefaultCaretIdleRefreshSeconds;
82 if (double.IsNaN(seconds) || double.IsInfinity(seconds))
83 seconds = DefaultCaretIdleRefreshSeconds;
84 return Math.Clamp(seconds, 0.15, 10.0);
85 }
86}
87
View only · write via MCP/CIDE