Forge
deeb25a2
1<views:PointerTrackingWindow xmlns="https://github.com/avaloniaui"
2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3 xmlns:vm="using:CascadeIDE.ViewModels"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:models="using:CascadeIDE.Models"
7 xmlns:views="using:CascadeIDE.Views"
8 xmlns:chrome="using:CascadeIDE.Features.UiChrome"
9 xmlns:lang="using:CascadeIDE.Lang"
10 xmlns:dock="clr-namespace:Dock.Avalonia.Controls;assembly=Dock.Avalonia"
11 xmlns:Ease="using:Avalonia.Animation.Easings"
12 mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="600"
13 x:Class="CascadeIDE.Views.MainWindow"
14 x:Name="RootWindow"
15 x:DataType="vm:MainWindowViewModel"
16 Icon="/Assets/avalonia-logo.ico"
17 Title="{Binding WindowTitle}"
18 Background="{DynamicResource CascadeTheme.MainWindowBackground}"
19 Width="1000" Height="600">
20
21 <Window.Resources>
22 <views:SolutionItemIconConverter x:Key="SolutionItemIconConverter"/>
23 </Window.Resources>
24
25 <Window.Styles>
26 <!-- Меню и кнопки — из темы (ide_set_ui_theme) -->
27 <Style Selector="Menu">
28 <Setter Property="Background" Value="{DynamicResource CascadeTheme.MenuBackground}"/>
29 <Setter Property="Foreground" Value="{DynamicResource CascadeTheme.MenuForeground}"/>
30 </Style>
31 <Style Selector="MenuItem">
32 <Setter Property="Foreground" Value="{DynamicResource CascadeTheme.MenuForeground}"/>
33 </Style>
34 <Style Selector="Button">
35 <Setter Property="Background" Value="{DynamicResource CascadeTheme.ButtonBackground}"/>
36 <Setter Property="Foreground" Value="{DynamicResource CascadeTheme.ButtonForeground}"/>
37 <Setter Property="BorderBrush" Value="{DynamicResource CascadeTheme.ButtonBorderBrush}"/>
38 <Setter Property="BorderThickness" Value="1"/>
39 </Style>
40 <Style Selector="Button:pointerover">
41 <Setter Property="Background" Value="{DynamicResource CascadeTheme.ButtonHoverBackground}"/>
42 </Style>
43 <Style Selector="Button:disabled">
44 <Setter Property="Background" Value="{DynamicResource CascadeTheme.ButtonDisabledBackground}"/>
45 <Setter Property="Foreground" Value="{DynamicResource CascadeTheme.ButtonDisabledForeground}"/>
46 </Style>
47 <Style Selector="Border#ModeBadge">
48 <Setter Property="Background" Value="#29437A"/>
49 <Setter Property="BorderBrush" Value="#4D72D5"/>
50 <Setter Property="BorderThickness" Value="1"/>
51 <Setter Property="CornerRadius" Value="6"/>
52 <Setter Property="RenderTransformOrigin" Value="50%,50%"/>
53 <Setter Property="RenderTransform" Value="scale(1)"/>
54 <Setter Property="Transitions">
55 <Transitions>
56 <BrushTransition Property="BorderBrush" Duration="0:0:0.35">
57 <BrushTransition.Easing>
58 <Ease:CubicEaseOut/>
59 </BrushTransition.Easing>
60 </BrushTransition>
61 <BrushTransition Property="Background" Duration="0:0:0.35">
62 <BrushTransition.Easing>
63 <Ease:CubicEaseOut/>
64 </BrushTransition.Easing>
65 </BrushTransition>
66 <TransformOperationsTransition Property="RenderTransform" Duration="0:0:0.28">
67 <TransformOperationsTransition.Easing>
68 <Ease:CubicEaseOut/>
69 </TransformOperationsTransition.Easing>
70 </TransformOperationsTransition>
71 </Transitions>
72 </Setter>
73 </Style>
74 <Style Selector="Border#ModeBadge.power">
75 <Setter Property="Background" Value="#36256D"/>
76 <Setter Property="BorderBrush" Value="#8A65FF"/>
77 <Setter Property="BorderThickness" Value="1"/>
78 <Setter Property="CornerRadius" Value="6"/>
79 <Setter Property="RenderTransform" Value="scale(1.04)"/>
80 </Style>
81 <Style Selector="Border#ModeBadge.agentchat">
82 <Setter Property="Background" Value="#1E4D3A"/>
83 <Setter Property="BorderBrush" Value="#3DCC8C"/>
84 <Setter Property="BorderThickness" Value="1"/>
85 <Setter Property="CornerRadius" Value="6"/>
86 <Setter Property="RenderTransform" Value="scale(1.02)"/>
87 </Style>
88 <Style Selector="Border#ModeBadge.debug">
89 <Setter Property="Background" Value="#3A2E1E"/>
90 <Setter Property="BorderBrush" Value="#C88A2A"/>
91 <Setter Property="BorderThickness" Value="1"/>
92 <Setter Property="CornerRadius" Value="6"/>
93 <Setter Property="RenderTransform" Value="scale(1.02)"/>
94 </Style>
95 <Style Selector="Border.modeCard">
96 <Setter Property="Background" Value="{DynamicResource CascadeTheme.PanelBackgroundBrush}"/>
97 <Setter Property="BorderBrush" Value="{DynamicResource CascadeTheme.WorkspacePanelBorderBrush}"/>
98 <Setter Property="BorderThickness" Value="1"/>
99 <Setter Property="CornerRadius" Value="4"/>
100 <Setter Property="Padding" Value="8"/>
101 </Style>
102 <!-- Визуальные якоря PFD | Forward | MFD (отладка раскладки; классы задаёт AttentionZoneContainer). -->
103 <Style Selector="chrome|AttentionZoneContainer.attention-zone-pfd">
104 <Setter Property="BorderThickness" Value="1"/>
105 <Setter Property="BorderBrush" Value="#6600ACC1"/>
106 <Setter Property="Background" Value="Transparent"/>
107 <Setter Property="ToolTip.Tip" Value="Якорь: PFD"/>
108 </Style>
109 <Style Selector="chrome|AttentionZoneContainer.attention-zone-forward">
110 <Setter Property="BorderThickness" Value="1"/>
111 <Setter Property="BorderBrush" Value="#66FFB300"/>
112 <Setter Property="Background" Value="Transparent"/>
113 <Setter Property="ToolTip.Tip" Value="Якорь: Forward"/>
114 </Style>
115 <Style Selector="chrome|AttentionZoneContainer.attention-zone-mfd">
116 <Setter Property="BorderThickness" Value="1"/>
117 <Setter Property="BorderBrush" Value="#667E57C2"/>
118 <Setter Property="Background" Value="Transparent"/>
119 <Setter Property="ToolTip.Tip" Value="Якорь: MFD"/>
120 </Style>
121 <Style Selector="chrome|AttentionZoneContainer.attention-layer-hud">
122 <Setter Property="ToolTip.Tip" Value="Слой: HUD (над редактором, ADR 0021 §9)"/>
123 </Style>
124 <Style Selector="Border#SkiaZoneGeometryOverlayPfd, Border#SkiaZoneGeometryOverlayForward, Border#SkiaZoneGeometryOverlayMfd">
125 <Setter Property="BorderThickness" Value="2"/>
126 <Setter Property="CornerRadius" Value="4"/>
127 <Setter Property="Background" Value="#04000000"/>
128 <Setter Property="IsHitTestVisible" Value="False"/>
129 </Style>
130 <Style Selector="Border#SkiaZoneGeometryOverlayPfd">
131 <Setter Property="BorderBrush" Value="#48C8F4"/>
132 </Style>
133 <Style Selector="Border#SkiaZoneGeometryOverlayForward">
134 <Setter Property="BorderBrush" Value="#FFC75A"/>
135 </Style>
136 <Style Selector="Border#SkiaZoneGeometryOverlayMfd">
137 <Setter Property="BorderBrush" Value="#B38CFF"/>
138 </Style>
139 </Window.Styles>
140
141 <Design.DataContext>
142 <vm:MainWindowViewModel/>
143 </Design.DataContext>
144
145 <Grid Background="{DynamicResource CascadeTheme.MainWindowBackground}">
146 <DockPanel>
147 <!-- Главное меню -->
148 <Menu DockPanel.Dock="Top" Background="{DynamicResource CascadeTheme.MenuBackground}">
149 <MenuItem Header="_Файл">
150 <MenuItem Header="_Открыть решение..." Command="{Binding OpenSolutionCommand}"/>
151 <MenuItem Header="_Создать новое решение..." Command="{Binding CreateNewSolutionCommand}"/>
152 <MenuItem Header="_Открыть папку..." Command="{Binding OpenFolderCommand}"/>
153 <MenuItem Header="_Открыть файл..." Command="{Binding OpenFileFromDialogCommand}"/>
154 <MenuItem Header="Export expanded _Markdown..." Command="{Binding ExportExpandedMarkdownCommand}"/>
155 <Separator/>
156 <MenuItem Header="В_ыход" Command="{Binding ExitCommand}"/>
157 </MenuItem>
158 <MenuItem Header="_Отладка">
159 <MenuItem x:Name="MenuDebugStartOrContinue" Header="_Начать или продолжить" Command="{Binding DebugStartOrContinueCommand}"/>
160 <MenuItem Header="Стартовый проект из _выделения в дереве" Command="{Binding SetStartupProjectFromSelectionCommand}"/>
161 <MenuItem Header="_Сбросить стартовый проект" Command="{Binding ClearStartupProjectCommand}"/>
162 <Separator/>
163 <MenuItem Header="_Присоединиться к процессу…" Command="{Binding DebugAttachCommand}"/>
164 <MenuItem x:Name="MenuDebugStop" Header="_Остановить отладку" Command="{Binding DebugStopCommand}"/>
165 <Separator/>
166 <MenuItem x:Name="MenuDebugStepOver" Header="Шаг с _обходом" Command="{Binding DebugStepOverCommand}"/>
167 <MenuItem x:Name="MenuDebugStepInto" Header="Шаг с _заходом" Command="{Binding DebugStepIntoCommand}"/>
168 <MenuItem x:Name="MenuDebugStepOut" Header="Шаг с _выходом" Command="{Binding DebugStepOutCommand}"/>
169 </MenuItem>
170 <MenuItem Header="_Вид">
171 <MenuItem x:Name="MenuCommandPalette" Header="Палитра _команд" Command="{Binding ToggleCommandPaletteCommand}"/>
172 <MenuItem Header="Перейти к _файлу…" Command="{Binding OpenGoToFilePaletteCommand}"/>
173 <Separator/>
174 <MenuItem Header="Дерево _проекта (MFD)" Command="{Binding Shell.ShowSolutionExplorerPageCommand}"/>
175 <MenuItem Header="_Вывод сборки" ToggleType="CheckBox" IsChecked="{Binding IsBuildOutputVisible, Mode=TwoWay}"/>
176 <MenuItem Header="_Чат" ToggleType="CheckBox" IsChecked="{Binding IsMfdRegionExpanded, Mode=TwoWay}"/>
177 <MenuItem Header="_Терминал" ToggleType="CheckBox" IsChecked="{Binding IsTerminalVisible, Mode=TwoWay}"/>
178 <MenuItem Header="_Git" ToggleType="CheckBox" IsChecked="{Binding IsGitPanelVisible, Mode=TwoWay}"/>
179 <MenuItem Header="Док_ инструментирования (события, тесты, отладка)"
180 ToggleType="CheckBox"
181 IsChecked="{Binding IsInstrumentationDockVisible, Mode=TwoWay}"
182 IsVisible="{Binding ShowInstrumentationLayoutMenu}"/>
183 <Separator/>
184 <MenuItem Header="_Тема">
185 <MenuItem Header="_Светлая" Command="{Binding ApplyLightThemeCommand}"/>
186 <MenuItem Header="_Тёмная" Command="{Binding ApplyDarkThemeCommand}"/>
187 <MenuItem Header="Как _Cursor" Command="{Binding ApplyCursorLikeThemeCommand}"/>
188 <MenuItem Header="Power _классическая (циан)" Command="{Binding ApplyPowerClassicThemeCommand}"/>
189 <Separator/>
190 <MenuItem Header="Открыть файл темы..." Command="{Binding OpenThemeFileCommand}"/>
191 </MenuItem>
192 <Separator/>
193 <MenuItem Header="{Binding Lang_Menu_UiLanguage, Source={StaticResource Loc}, DataType={x:Type lang:LocViewModel}}">
194 <MenuItem Header="{Binding Lang_Menu_Russian, Source={StaticResource Loc}, DataType={x:Type lang:LocViewModel}}"
195 Command="{Binding SetUiLanguageCommand}" CommandParameter="ru-RU"/>
196 <MenuItem Header="{Binding Lang_Menu_English, Source={StaticResource Loc}, DataType={x:Type lang:LocViewModel}}"
197 Command="{Binding SetUiLanguageCommand}" CommandParameter="en-US"/>
198 <Separator/>
199 <MenuItem Header="{Binding Lang_Menu_FollowSystem, Source={StaticResource Loc}, DataType={x:Type lang:LocViewModel}}"
200 Command="{Binding ResetUiLanguageToSystemCommand}"/>
201 </MenuItem>
202 <MenuItem Header="Показать Markdown preview в _MFD" Command="{Binding ShowMarkdownPreviewPageCommand}"/>
203 <MenuItem Header="Превью в отдельном _окне" Command="{Binding OpenPreviewWindowCommand}"/>
204 </MenuItem>
205 <MenuItem Header="_Настройки">
206 <MenuItem Header="Параметры…" Command="{Binding OpenSettingsCommand}"/>
207 </MenuItem>
208 <MenuItem Header="_Справка">
209 <MenuItem Header="О _программе" Command="{Binding AboutCommand}"/>
210 </MenuItem>
211 </Menu>
212
213 <!-- Строка 2 — рабочая область (якоря PFD | Forward | MFD в MainGrid; AttentionLayoutSurfaceKind.MainWindowDockedGrid). В колонке MFD сейчас MfdShellView: страницы вторичного контура (WORKSPACE/чат/терминал/…) и полоса EICAS сверху — не синоним «зона MFD», а хост по умолчанию (пресет). -->
214 <Grid x:Name="MainGrid" ColumnDefinitions="220,4,*,4,340">
215 <Grid.RowDefinitions>
216 <RowDefinition Height="Auto"/>
217 <RowDefinition Height="Auto"/>
218 <RowDefinition Height="*"/>
219 <RowDefinition Height="0"/>
220 <RowDefinition Height="0"/>
221 <RowDefinition Height="0"/>
222 <RowDefinition Height="0"/>
223 </Grid.RowDefinitions>
224 <!-- Подсказка при работе как MCP-сервер -->
225 <views:McpBannerView Grid.Row="0" Grid.ColumnSpan="5"/>
226
227 <views:TaskCockpitView Grid.Row="1" Grid.ColumnSpan="5"/>
228
229 <!-- Якорь зоны PFD (cockpit): левая колонка. Compact — дерево справа, см. CompactRightChromeHost. -->
230 <chrome:AttentionZoneContainer Zone="Pfd" Grid.Row="2" Grid.Column="0" IsVisible="{Binding IsCockpitPfdColumnVisible}">
231 <Grid RowDefinitions="Auto,*">
232 <views:PfdBackgroundStatusBarView Grid.Row="0"
233 IsVisible="{Binding ShowWorkspaceBackgroundStatusOnPfd}"/>
234 <Grid Grid.Row="1">
235 <views:SolutionExplorerView IsVisible="{Binding IsDockedPfdSolutionExplorerTree}"/>
236 <Grid IsVisible="{Binding IsDockedPfdWorkspaceNavigationMap}">
237 <views:WorkspaceNavigationMapView DataContext="{Binding NavigationMap}"/>
238 </Grid>
239 <!-- Wave 3: mount-layer host preview для PFD (единая точка подключения мини-инструмента). -->
240 <views:ZoneInstrumentMountView IsVisible="{Binding UseSkiaInstrumentMount}"
241 HorizontalAlignment="Right"
242 VerticalAlignment="Top"
243 Margin="8"
244 Width="250"
245 InstrumentId="ide_health_status_v1"
246 SlotId="pfd"
247 MountStyle="{Binding PfdInstrumentMountStyle}"
248 ZIndex="415"/>
249 </Grid>
250 </Grid>
251 </chrome:AttentionZoneContainer>
252 <GridSplitter Grid.Row="2" Grid.Column="1" Width="4" ResizeDirection="Columns" Background="{DynamicResource CascadeTheme.WorkspacePanelBorderBrush}" IsVisible="{Binding IsCockpitPfdColumnVisible}" IsEnabled="{Binding WorkspaceSplittersUnlocked}"/>
253
254 <!-- Лобовое: редактор или Intercom (ADR 0120 primary_work_surface) -->
255 <chrome:AttentionZoneContainer Zone="Forward" Grid.Row="2" Grid.Column="2">
256 <Grid RowDefinitions="Auto,*">
257 <views:PfdBackgroundStatusBarView Grid.Row="0"
258 IsVisible="{Binding ShowWorkspaceBackgroundStatusOnForward}"/>
259 <Panel Grid.Row="1">
260 <views:DocumentsDockView IsVisible="{Binding IsForwardEditorHostVisible}" />
261 <Border IsVisible="{Binding IsForwardIntercomHostVisible}"
262 Background="{DynamicResource CascadeTheme.ChatPanelBackground}">
263 <views:ChatPanelView DataContext="{Binding ChatPanel}" />
264 </Border>
265 </Panel>
266 </Grid>
267 </chrome:AttentionZoneContainer>
268 <GridSplitter Grid.Row="2" Grid.Column="3"
269 Grid.RowSpan="{Binding ChatPanelMainGridRowSpan}"
270 Width="4" ResizeDirection="Columns" Background="{DynamicResource CascadeTheme.WorkspacePanelBorderBrush}"
271 IsVisible="{Binding IsMfdColumnVisible}"
272 IsEnabled="{Binding WorkspaceSplittersUnlocked}"/>
273
274 <!-- Cockpit: MFD справа. Compact: Intercom/PFD справа + MFD снизу (ADR 0171 IDE-scan). -->
275 <chrome:AttentionZoneContainer Zone="Mfd" Grid.Row="2" Grid.Column="4" Grid.RowSpan="{Binding ChatPanelMainGridRowSpan}"
276 IsVisible="{Binding IsCockpitMfdColumnVisible}">
277 <views:MfdShellView DataContext="{Binding DataContext, ElementName=RootWindow}" MinHeight="0"/>
278 </chrome:AttentionZoneContainer>
279
280 <Grid Grid.Row="2" Grid.Column="4" RowDefinitions="Auto,*" IsVisible="{Binding IsCompactRightChromeColumnVisible}">
281 <chrome:AttentionZoneContainer Zone="Pfd" Grid.Row="0" IsVisible="{Binding IsCompactPfdRightVisible}">
282 <views:SolutionExplorerView IsVisible="{Binding IsDockedPfdSolutionExplorerTree}"/>
283 </chrome:AttentionZoneContainer>
284 <Border Grid.Row="1" IsVisible="{Binding IsCompactIntercomAuxVisible}"
285 Background="{DynamicResource CascadeTheme.ChatPanelBackground}">
286 <views:ChatPanelView DataContext="{Binding ChatPanel}"/>
287 </Border>
288 </Grid>
289
290 <GridSplitter Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="5" Height="4" ResizeDirection="Rows"
291 Background="{DynamicResource CascadeTheme.WorkspacePanelBorderBrush}"
292 IsVisible="{Binding IsCompactIntercomBottomDockVisible}"
293 IsEnabled="{Binding WorkspaceSplittersUnlocked}"/>
294
295 <Border Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="5"
296 IsVisible="{Binding IsCompactIntercomBottomDockVisible}"
297 Background="{DynamicResource CascadeTheme.ChatPanelBackground}">
298 <views:ChatPanelView DataContext="{Binding ChatPanel}"/>
299 </Border>
300
301 <GridSplitter Grid.Row="{Binding CompactMfdBottomDockSplitterGridRow}" Grid.Column="0" Grid.ColumnSpan="5" Height="4" ResizeDirection="Rows"
302 Background="{DynamicResource CascadeTheme.WorkspacePanelBorderBrush}"
303 IsVisible="{Binding IsCompactMfdBottomDockVisible}"
304 IsEnabled="{Binding WorkspaceSplittersUnlocked}"/>
305
306 <chrome:AttentionZoneContainer Zone="Mfd" Grid.Row="{Binding CompactMfdBottomDockGridRow}" Grid.Column="0" Grid.ColumnSpan="5"
307 IsVisible="{Binding IsCompactMfdBottomDockVisible}">
308 <views:MfdShellView DataContext="{Binding DataContext, ElementName=RootWindow}" MinHeight="0"/>
309 </chrome:AttentionZoneContainer>
310
311 <!-- W2: overlay контуров зон поверх контента (без изменения содержимого). -->
312 <Border x:Name="SkiaZoneGeometryOverlayPfd"
313 Grid.Row="2"
314 Grid.Column="0"
315 IsVisible="{Binding IsSkiaZoneGeometryOverlayPfdVisible}"
316 ZIndex="410">
317 <TextBlock Text="PFD"
318 Margin="6,4,0,0"
319 HorizontalAlignment="Left"
320 VerticalAlignment="Top"
321 Foreground="#C6F2FF"/>
322 </Border>
323 <Border x:Name="SkiaZoneGeometryOverlayForward"
324 Grid.Row="2"
325 Grid.Column="2"
326 IsVisible="{Binding IsSkiaZoneGeometryOverlayForwardVisible}"
327 ZIndex="410">
328 <TextBlock Text="FORWARD"
329 Margin="6,4,0,0"
330 HorizontalAlignment="Left"
331 VerticalAlignment="Top"
332 Foreground="#FFE7A6"/>
333 </Border>
334 <Border x:Name="SkiaZoneGeometryOverlayMfd"
335 Grid.Row="2"
336 Grid.Column="4"
337 Grid.RowSpan="{Binding ChatPanelMainGridRowSpan}"
338 IsVisible="{Binding IsSkiaZoneGeometryOverlayMfdVisible}"
339 ZIndex="410">
340 <TextBlock Text="MFD"
341 Margin="6,4,0,0"
342 HorizontalAlignment="Left"
343 VerticalAlignment="Top"
344 Foreground="#E6D8FF"/>
345 </Border>
346 <!-- Bloom только над task bar + рабочей областью (строки 1–2). -->
347 <Border x:Name="UiModeBloomOverlay"
348 Grid.Row="1" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="5"
349 ZIndex="400"
350 IsHitTestVisible="False"
351 Background="{Binding Chrome.UiModeBloomBrush}"
352 Opacity="{Binding Chrome.UiModeBloomOpacity}">
353 <Border.Transitions>
354 <Transitions>
355 <DoubleTransition Property="Opacity" Duration="0:0:0.42">
356 <DoubleTransition.Easing>
357 <Ease:CubicEaseOut/>
358 </DoubleTransition.Easing>
359 </DoubleTransition>
360 </Transitions>
361 </Border.Transitions>
362 </Border>
363 <!-- Оверлей подсветки эффективного контрола (ide_highlight_control, как в Comet) -->
364 <Canvas x:Name="AgentHighlightLayer" Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Grid.ColumnSpan="5" IsHitTestVisible="False" ZIndex="1000">
365 <Border x:Name="AgentHighlightOverlay" IsVisible="False" BorderBrush="#FF6B9D" BorderThickness="2" Background="#10000000"/>
366 </Canvas>
367 </Grid>
368 </DockPanel>
369 <views:CommandPaletteView ZIndex="5000"/>
370 <views:CockpitCommandLineOverlayView DataContext="{Binding CockpitCommandLineOverlay}" ZIndex="4999"/>
371 <!-- CascadeChord (Ctrl+K): полоска ввода — TaskCockpitView / CascadeChordHudStripView (ADR 0060). -->
372 </Grid>
373</views:PointerTrackingWindow>
374
View only · write via MCP/CIDE