Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Quantum.Editor.Avalonia/App.axaml.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using global::Avalonia.Controls.ApplicationLifetimes;
using global::Avalonia.Markup.Xaml;
using Quantum.Editor.Avalonia.Services;
using Quantum.Editor.Avalonia.Services.Workspaces;

namespace Quantum.Editor.Avalonia;

public partial class App : global::Avalonia.Application
{
public EditorWorkspace? Workspace { get; private set; }

public WorkspaceProfileManager? WorkspaceProfiles { get; private set; }

public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
Expand All @@ -19,7 +22,8 @@ public override void OnFrameworkInitializationCompleted()
{
Workspace = new EditorWorkspace();
Workspace.NewDocument();
desktop.MainWindow = new MainWindow(Workspace);
WorkspaceProfiles = new WorkspaceProfileManager();
desktop.MainWindow = new MainWindow(Workspace, WorkspaceProfiles);
}

base.OnFrameworkInitializationCompleted();
Expand Down
28 changes: 14 additions & 14 deletions Quantum.Editor.Avalonia/MainWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,15 @@
</Style>
</Window.Styles>

<Grid RowDefinitions="Auto,48,*,5,300,28">
<Grid x:Name="WorkbenchGrid" RowDefinitions="Auto,48,*,5,300,28">
<Border
x:Name="MenuBarRegion"
Grid.Row="0"
Background="#111820"
BorderBrush="#2B3948"
BorderThickness="0,0,0,1">
<Menu>
<MenuItem Header="_File">
<MenuItem x:Name="FileMenu" Header="_File">
<MenuItem Header="_New Track Ctrl+N" Click="OnNewDocumentClick" />
<MenuItem Header="_Open… Ctrl+O" Click="OnOpenDocumentClick" />
<Separator />
Expand All @@ -59,11 +59,11 @@
<Separator />
<MenuItem Header="E_xit" Click="OnExitClick" />
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem x:Name="EditMenu" Header="_Edit">
<MenuItem x:Name="UndoMenuItem" Header="_Undo Ctrl+Z" Click="OnUndoClick" />
<MenuItem x:Name="RedoMenuItem" Header="_Redo Ctrl+Y" Click="OnRedoClick" />
</MenuItem>
<MenuItem Header="_View">
<MenuItem x:Name="ViewMenu" Header="_View">
<MenuItem Header="_Fit Track F" Click="OnFitViewportClick" />
<MenuItem Header="Toggle Transported _Frames" Click="OnMenuShowFramesClick" />
<MenuItem Header="Math _Plots" Click="OnShowEngineeringPlotsClick" />
Expand All @@ -79,12 +79,12 @@
BorderThickness="0,0,0,1"
Padding="10,7">
<Grid ColumnDefinitions="Auto,Auto,Auto,16,Auto,Auto,16,Auto,Auto,*,Auto">
<Button Classes="toolbar" Content="New" Click="OnNewDocumentClick" />
<Button Grid.Column="1" Classes="toolbar" Content="Open" Click="OnOpenDocumentClick" />
<Button Grid.Column="2" Classes="toolbar" Content="Save" Click="OnSaveDocumentClick" />
<Button x:Name="NewButton" Classes="toolbar" Content="New" Click="OnNewDocumentClick" />
<Button x:Name="OpenButton" Grid.Column="1" Classes="toolbar" Content="Open" Click="OnOpenDocumentClick" />
<Button x:Name="SaveButton" Grid.Column="2" Classes="toolbar" Content="Save" Click="OnSaveDocumentClick" />
<Button x:Name="UndoButton" Grid.Column="4" Classes="toolbar" Content="Undo" Click="OnUndoClick" />
<Button x:Name="RedoButton" Grid.Column="5" Classes="toolbar" Content="Redo" Click="OnRedoClick" />
<Button Grid.Column="7" Classes="toolbar" Content="Fit" Click="OnFitViewportClick" />
<Button x:Name="FitButton" Grid.Column="7" Classes="toolbar" Content="Fit" Click="OnFitViewportClick" />
<CheckBox
x:Name="ShowFramesCheckBox"
Grid.Column="8"
Expand All @@ -106,42 +106,42 @@
</Grid>
</Border>

<Grid Grid.Row="2" ColumnDefinitions="320,5,*,5,340">
<Grid x:Name="ContentPaneGrid" Grid.Row="2" ColumnDefinitions="320,5,*,5,340">
<controls:RoutePaneControl
x:Name="RoutePane"
Grid.Column="0"
NodeSelected="OnGraphNodeSelected"
SectionPointerChanged="OnSectionPointerChanged" />

<GridSplitter Grid.Column="1" ResizeDirection="Columns" Background="#2B3948" />
<GridSplitter x:Name="RouteSplitter" Grid.Column="1" ResizeDirection="Columns" Background="#2B3948" />

<controls:ViewportPaneControl
x:Name="ViewportPane"
Grid.Column="2"
SectionPointerChanged="OnSectionPointerChanged"
SampleSelected="OnViewportSampleSelected" />

<GridSplitter Grid.Column="3" ResizeDirection="Columns" Background="#2B3948" />
<GridSplitter x:Name="InspectorSplitter" Grid.Column="3" ResizeDirection="Columns" Background="#2B3948" />

<controls:InspectorPaneControl x:Name="InspectorPane" Grid.Column="4" />
</Grid>

<GridSplitter Grid.Row="3" ResizeDirection="Rows" Background="#2B3948" />
<GridSplitter x:Name="BottomPanelSplitter" Grid.Row="3" ResizeDirection="Rows" Background="#2B3948" />

<Border
x:Name="BottomPanelRegion"
Grid.Row="4"
Classes="panel"
BorderThickness="0,1,0,0">
<TabControl x:Name="BottomWorkspaceTabs" SelectedIndex="0">
<TabItem Header="MATH PLOTS">
<TabItem x:Name="MathPlotsTab" Header="MATH PLOTS">
<controls:MathPlotsPaneControl
x:Name="MathPlotsPane"
SectionPointerChanged="OnSectionPointerChanged"
StationChanged="OnEngineeringPlotStationChanged"
StationSelected="OnEngineeringPlotStationSelected" />
</TabItem>
<TabItem Header="DIAGNOSTICS">
<TabItem x:Name="DiagnosticsTab" Header="DIAGNOSTICS">
<controls:DiagnosticsPaneControl x:Name="DiagnosticsPane" />
</TabItem>
</TabControl>
Expand Down
77 changes: 76 additions & 1 deletion Quantum.Editor.Avalonia/MainWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Quantum.Editor.Avalonia.Services;
using Quantum.Editor.Avalonia.Services.Commands;
using Quantum.Editor.Avalonia.Services.Documents;
using Quantum.Editor.Avalonia.Services.Workspaces;

namespace Quantum.Editor.Avalonia;

Expand All @@ -21,27 +22,41 @@ public partial class MainWindow : Window
};

private readonly EditorWorkspace workspace;
private readonly WorkspaceProfileManager workspaceProfiles;

public MainWindow()
: this(CreateWorkspace())
: this(CreateWorkspace(), new WorkspaceProfileManager())
{
}

public MainWindow(EditorWorkspace workspace)
: this(workspace, new WorkspaceProfileManager())
{
}

public MainWindow(
EditorWorkspace workspace,
WorkspaceProfileManager workspaceProfiles)
{
this.workspace = workspace ?? throw new ArgumentNullException(nameof(workspace));
this.workspaceProfiles = workspaceProfiles ??
throw new ArgumentNullException(nameof(workspaceProfiles));
InitializeComponent();

this.workspace.WorkspaceChanged += OnWorkspaceChanged;
this.workspace.StationCursorChanged += OnStationCursorChanged;
this.workspace.SectionHighlightChanged += OnSectionHighlightChanged;
this.workspaceProfiles.CurrentProfileChanged += OnCurrentProfileChanged;
this.workspace.Viewport.SetActiveViewport(ViewportPane);
this.workspace.Commands.Register(new EditorCommand(
EditorCommandIds.FitViewport,
_ => ViewportPane.FitToTrack()));
ApplyWorkspaceProfile(this.workspaceProfiles.CurrentProfile);
UpdateWorkspaceView();
}

public WorkspaceProfileManager WorkspaceProfiles => workspaceProfiles;

private static EditorWorkspace CreateWorkspace()
{
var result = new EditorWorkspace();
Expand All @@ -54,6 +69,66 @@ private void OnWorkspaceChanged(object? sender, EventArgs eventArgs)
UpdateWorkspaceView();
}

private void OnCurrentProfileChanged(object? sender, EventArgs eventArgs)
{
ApplyWorkspaceProfile(workspaceProfiles.CurrentProfile);
UpdateWorkspaceView();
}

private void ApplyWorkspaceProfile(WorkspaceProfile profile)
{
bool showRoute = profile.IsPaneVisibleByDefault(WorkspacePaneIds.Route);
bool showViewport = profile.IsPaneVisibleByDefault(WorkspacePaneIds.Viewport);
bool showInspector = profile.IsPaneVisibleByDefault(WorkspacePaneIds.Inspector);
bool showMathPlots = profile.IsPaneVisibleByDefault(WorkspacePaneIds.MathPlots);
bool showDiagnostics = profile.IsPaneVisibleByDefault(WorkspacePaneIds.Diagnostics);
bool showBottomPanel = showMathPlots || showDiagnostics;

RoutePane.IsVisible = showRoute;
ViewportPane.IsVisible = showViewport;
InspectorPane.IsVisible = showInspector;
RouteSplitter.IsVisible = showRoute && showViewport;
InspectorSplitter.IsVisible = showViewport && showInspector;
MathPlotsTab.IsVisible = showMathPlots;
DiagnosticsTab.IsVisible = showDiagnostics;
BottomPanelRegion.IsVisible = showBottomPanel;
BottomPanelSplitter.IsVisible = showBottomPanel;
if (showBottomPanel &&
BottomWorkspaceTabs.SelectedItem is Control selectedTab &&
!selectedTab.IsVisible)
{
BottomWorkspaceTabs.SelectedItem = showMathPlots ? MathPlotsTab : DiagnosticsTab;
}

ContentPaneGrid.ColumnDefinitions[0].Width = new GridLength(showRoute ? 320 : 0);
ContentPaneGrid.ColumnDefinitions[1].Width = new GridLength(showRoute && showViewport ? 5 : 0);
ContentPaneGrid.ColumnDefinitions[2].Width = showViewport
? new GridLength(1, GridUnitType.Star)
: new GridLength(0);
ContentPaneGrid.ColumnDefinitions[3].Width = new GridLength(showViewport && showInspector ? 5 : 0);
ContentPaneGrid.ColumnDefinitions[4].Width = new GridLength(showInspector ? 340 : 0);
WorkbenchGrid.RowDefinitions[3].Height = new GridLength(showBottomPanel ? 5 : 0);
WorkbenchGrid.RowDefinitions[4].Height = new GridLength(showBottomPanel ? 300 : 0);

bool showFileCommands = profile.HasCommandGroup(WorkspaceCommandGroupIds.File);
bool showEditCommands = profile.HasCommandGroup(WorkspaceCommandGroupIds.Edit);
bool showViewCommands = profile.HasCommandGroup(WorkspaceCommandGroupIds.View);
FileMenu.IsVisible = showFileCommands;
EditMenu.IsVisible = showEditCommands;
ViewMenu.IsVisible = showViewCommands;
NewButton.IsVisible = showFileCommands;
OpenButton.IsVisible = showFileCommands;
SaveButton.IsVisible = showFileCommands;
UndoButton.IsVisible = showEditCommands;
RedoButton.IsVisible = showEditCommands;
FitButton.IsVisible = showViewCommands;
ShowFramesCheckBox.IsVisible = showViewCommands;
ProjectionComboBox.IsVisible = showViewCommands;

ShowFramesCheckBox.IsChecked = profile.IsOverlayEnabledByDefault(
WorkspaceOverlayIds.TransportedFrames);
}

private void UpdateWorkspaceView()
{
TrackEditorDocument? document = workspace.ActiveDocument;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace Quantum.Editor.Avalonia.Services.Workspaces;

/// <summary>
/// Pane identifiers understood by the current workbench composition root.
/// </summary>
public static class WorkspacePaneIds
{
public const string Route = "route";
public const string Viewport = "viewport";
public const string Inspector = "inspector";
public const string MathPlots = "math-plots";
public const string Diagnostics = "diagnostics";
}

/// <summary>
/// Command group identifiers understood by the current workbench shell.
/// </summary>
public static class WorkspaceCommandGroupIds
{
public const string File = "file";
public const string Edit = "edit";
public const string View = "view";
}

/// <summary>
/// Overlay identifiers whose initial state can be supplied by a workspace profile.
/// </summary>
public static class WorkspaceOverlayIds
{
public const string TransportedFrames = "transported-frames";
}
Loading
Loading