Browse Source

Remove Console support in DevTools (#13920)

* Remove Console support in DevTools

* Adjust breaking changes

* And remove Microsoft.CodeAnalysis

---------

Co-authored-by: Max Katz <maxkatz6@outlook.com>
pull/13932/head
Tim 2 years ago
committed by GitHub
parent
commit
73f7fd1d3e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      api/Avalonia.Diagnostics.nupkg.xml
  2. 4
      src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj
  3. 36
      src/Avalonia.Diagnostics/Diagnostics/Models/ConsoleContext.cs
  4. 19
      src/Avalonia.Diagnostics/Diagnostics/Models/ConsoleHistoryItem.cs
  5. 113
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ConsoleViewModel.cs
  6. 13
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs
  7. 57
      src/Avalonia.Diagnostics/Diagnostics/Views/ConsoleView.xaml
  8. 68
      src/Avalonia.Diagnostics/Diagnostics/Views/ConsoleView.xaml.cs
  9. 17
      src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml
  10. 48
      src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml.cs

10
api/Avalonia.Diagnostics.nupkg.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/en-us/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Diagnostics/Views/ConsoleView.xaml</Target>
<Left>baseline/netstandard2.0/Avalonia.Diagnostics.dll</Left>
<Right>target/netstandard2.0/Avalonia.Diagnostics.dll</Right>
</Suppression>
</Suppressions>

4
src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj

@ -17,10 +17,6 @@
<ProjectReference Include="..\Avalonia.Controls\Avalonia.Controls.csproj" />
<ProjectReference Include="..\Avalonia.Themes.Simple\Avalonia.Themes.Simple.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="3.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.8.0" />
</ItemGroup>
<Import Project="..\..\build\EmbedXaml.props" />
<Import Project="..\..\build\BuildTargets.targets" />
<Import Project="..\..\build\NullableEnable.props" />

36
src/Avalonia.Diagnostics/Diagnostics/Models/ConsoleContext.cs

@ -1,36 +0,0 @@
#pragma warning disable IDE1006 // Naming Styles
using Avalonia.Diagnostics.ViewModels;
namespace Avalonia.Diagnostics.Models
{
internal class ConsoleContext
{
private readonly ConsoleViewModel _owner;
internal ConsoleContext(ConsoleViewModel owner) => _owner = owner;
public readonly string help = @"Welcome to Avalonia DevTools. Here you can execute arbitrary C# code using Roslyn scripting.
The following variables are available:
e: The control currently selected in the logical or visual tree view
root: The root of the visual tree
The following commands are available:
clear(): Clear the output history
";
public dynamic? e { get; internal set; }
public dynamic? root { get; internal set; }
internal static object NoOutput { get; } = new object();
public object clear()
{
_owner.History.Clear();
return NoOutput;
}
}
}

19
src/Avalonia.Diagnostics/Diagnostics/Models/ConsoleHistoryItem.cs

@ -1,19 +0,0 @@
using System;
using Avalonia.Media;
namespace Avalonia.Diagnostics.Models
{
internal class ConsoleHistoryItem
{
public ConsoleHistoryItem(string input, object output)
{
Input = input;
Output = output;
Foreground = output is Exception ? Brushes.Red : Brushes.Green;
}
public string Input { get; }
public object Output { get; }
public IBrush Foreground { get; }
}
}

113
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ConsoleViewModel.cs

@ -1,113 +0,0 @@
using System;
using System.Reflection;
using System.Threading.Tasks;
using Avalonia.Collections;
using Avalonia.Diagnostics.Models;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
namespace Avalonia.Diagnostics.ViewModels
{
internal class ConsoleViewModel : ViewModelBase
{
private readonly ConsoleContext _context;
private readonly Action<ConsoleContext> _updateContext;
private int _historyIndex = -1;
private string _input;
private bool _isVisible;
private ScriptState<object>? _state;
public ConsoleViewModel(Action<ConsoleContext> updateContext)
{
_context = new ConsoleContext(this);
_input = string.Empty;
_updateContext = updateContext;
}
public string Input
{
get => _input;
set => RaiseAndSetIfChanged(ref _input, value);
}
public bool IsVisible
{
get => _isVisible;
set => RaiseAndSetIfChanged(ref _isVisible, value);
}
public AvaloniaList<ConsoleHistoryItem> History { get; } = new AvaloniaList<ConsoleHistoryItem>();
public async Task Execute()
{
if (string.IsNullOrWhiteSpace(Input))
{
return;
}
try
{
var options = ScriptOptions.Default
.AddReferences(Assembly.GetAssembly(typeof(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo)));
_updateContext(_context);
if (_state == null)
{
_state = await CSharpScript.RunAsync(Input, options: options, globals: _context);
}
else
{
_state = await _state.ContinueWithAsync(Input);
}
if (_state.ReturnValue != ConsoleContext.NoOutput)
{
History.Add(new ConsoleHistoryItem(Input, _state.ReturnValue ?? "(null)"));
}
}
catch (Exception ex)
{
History.Add(new ConsoleHistoryItem(Input, ex));
}
Input = string.Empty;
_historyIndex = -1;
}
public void HistoryUp()
{
if (History.Count > 0)
{
if (_historyIndex == -1)
{
_historyIndex = History.Count - 1;
}
else if (_historyIndex > 0)
{
--_historyIndex;
}
Input = History[_historyIndex].Input;
}
}
public void HistoryDown()
{
if (History.Count > 0 && _historyIndex >= 0)
{
if (_historyIndex == History.Count - 1)
{
_historyIndex = -1;
Input = string.Empty;
}
else
{
Input = History[++_historyIndex].Input;
}
}
}
public void ToggleVisibility() => IsVisible = !IsVisible;
}
}

13
src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs

@ -67,7 +67,6 @@ namespace Avalonia.Diagnostics.ViewModels
}
});
}
Console = new ConsoleViewModel(UpdateConsoleContext);
}
public bool FreezePopups
@ -152,8 +151,6 @@ namespace Avalonia.Diagnostics.ViewModels
public void ToggleRenderTimeGraphOverlay()
=> ShowRenderTimeGraphOverlay = !ShowRenderTimeGraphOverlay;
public ConsoleViewModel Console { get; }
public ViewModelBase? Content
{
get { return _content; }
@ -236,16 +233,6 @@ namespace Avalonia.Diagnostics.ViewModels
private set => RaiseAndSetIfChanged(ref _pointerOverElementName, value);
}
private void UpdateConsoleContext(ConsoleContext context)
{
context.root = _root;
if (Content is TreePageViewModel tree)
{
context.e = tree.SelectedNode?.Visual;
}
}
public void SelectControl(Control control)
{
var tree = Content as TreePageViewModel;

57
src/Avalonia.Diagnostics/Diagnostics/Views/ConsoleView.xaml

@ -1,57 +0,0 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="using:Avalonia.Diagnostics.ViewModels"
x:Class="Avalonia.Diagnostics.Views.ConsoleView"
x:DataType="viewModels:ConsoleViewModel">
<UserControl.Styles>
<Style Selector="TextBox.console">
<Setter Property="FontFamily" Value="/Assets/Fonts/SourceSansPro-Regular.ttf"/>
<Setter Property="Template">
<ControlTemplate>
<Border Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<DockPanel Margin="{TemplateBinding Padding}">
<TextBlock DockPanel.Dock="Left" Margin="0,0,4,0"></TextBlock>
<TextPresenter Name="PART_TextPresenter"
Text="{TemplateBinding Text, Mode=TwoWay}"
CaretIndex="{TemplateBinding CaretIndex}"
SelectionStart="{TemplateBinding SelectionStart}"
SelectionEnd="{TemplateBinding SelectionEnd}"
TextAlignment="{TemplateBinding TextAlignment}"
TextWrapping="{TemplateBinding TextWrapping}"
PasswordChar="{TemplateBinding PasswordChar}"/>
</DockPanel>
</Border>
</ControlTemplate>
</Setter>
</Style>
</UserControl.Styles>
<DockPanel>
<TextBox Name="input"
Classes="console"
DockPanel.Dock="Bottom"
BorderThickness="0"
Text="{Binding Input}"/>
<ListBox Name="historyList"
BorderBrush="{DynamicResource ThemeControlMidBrush}"
BorderThickness="0,0,0,1"
FontFamily="/Assets/Fonts/SourceSansPro-Regular.ttf"
ItemsSource="{Binding History}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Margin="0,0,4,0"></TextBlock>
<TextBlock Text="{Binding Input}"/>
</DockPanel>
<TextBlock Foreground="{Binding Foreground}" Text="{Binding Output}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
</UserControl>

68
src/Avalonia.Diagnostics/Diagnostics/Views/ConsoleView.xaml.cs

@ -1,68 +0,0 @@
using System;
using System.Collections.Specialized;
using Avalonia.Controls;
using Avalonia.Diagnostics.ViewModels;
using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml;
using Avalonia.Threading;
namespace Avalonia.Diagnostics.Views
{
internal class ConsoleView : UserControl
{
private readonly ListBox _historyList;
private readonly TextBox _input;
public ConsoleView()
{
this.InitializeComponent();
_historyList = this.GetControl<ListBox>("historyList");
((ILogical)_historyList).LogicalChildren.CollectionChanged += HistoryChanged;
_input = this.GetControl<TextBox>("input");
_input.KeyDown += InputKeyDown;
}
public void FocusInput() => _input.Focus();
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void HistoryChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems?[0] is Control control)
{
DispatcherTimer.RunOnce(control.BringIntoView, TimeSpan.Zero);
}
}
private void InputKeyDown(object? sender, KeyEventArgs e)
{
var vm = (ConsoleViewModel?)DataContext;
if (vm is null)
{
return;
}
switch (e.Key)
{
case Key.Enter:
_ = vm.Execute();
e.Handled = true;
break;
case Key.Up:
vm.HistoryUp();
_input.CaretIndex = _input.Text?.Length ?? 0;
e.Handled = true;
break;
case Key.Down:
vm.HistoryDown();
_input.CaretIndex = _input.Text?.Length ?? 0;
e.Handled = true;
break;
}
}
}
}

17
src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml

@ -20,7 +20,7 @@
<Setter Property="Margin" Value="10 0 -20 0"/>
</Style>
</UserControl.Styles>
<Grid Name="rootGrid" RowDefinitions="Auto,Auto,*,Auto,0,Auto">
<Grid Name="rootGrid" RowDefinitions="Auto,Auto,*,Auto,Auto">
<Menu>
<MenuItem Header="_File">
<MenuItem Header="E_xit" Command="{Binding $parent[Window].Close}" />
@ -56,13 +56,6 @@
</MenuItem>
</MenuItem>
<MenuItem Header="_View">
<MenuItem Header="_Console" Command="{Binding $parent[views:MainView].ToggleConsole}">
<MenuItem.Icon>
<CheckBox BorderThickness="0"
IsChecked="{Binding Console.IsVisible}"
IsEnabled="False" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Control _Details">
<MenuItem Header="Show Implemented Interfaces" Command="{Binding ToggleShowImplementedInterfaces}">
<MenuItem.Icon>
@ -273,13 +266,7 @@
Background="{DynamicResource ThemeControlMidBrush}"
IsVisible="False" />
<views:ConsoleView Name="console"
Grid.Row="4"
DataContext="{Binding Console}"
IsVisible="{Binding IsVisible}" />
<Border Grid.Row="5"
<Border Grid.Row="4"
BorderBrush="{DynamicResource ThemeControlMidBrush}"
BorderThickness="0,1,0,0">
<Grid ColumnDefinitions="*, Auto">

48
src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml.cs

@ -8,62 +8,14 @@ namespace Avalonia.Diagnostics.Views
{
internal class MainView : UserControl
{
private readonly ConsoleView _console;
private readonly GridSplitter _consoleSplitter;
private readonly Grid _rootGrid;
private readonly int _consoleRow;
private double _consoleHeight = -1;
public MainView()
{
InitializeComponent();
AddHandler(KeyUpEvent, PreviewKeyUp);
_console = this.GetControl<ConsoleView>("console");
_consoleSplitter = this.GetControl<GridSplitter>("consoleSplitter");
_rootGrid = this.GetControl<Grid>("rootGrid");
_consoleRow = Grid.GetRow(_console);
}
public void ToggleConsole()
{
var vm = (MainViewModel?)DataContext;
if (vm is null)
{
return;
}
if (_consoleHeight == -1)
{
_consoleHeight = Bounds.Height / 3;
}
vm.Console.ToggleVisibility();
_consoleSplitter.IsVisible = vm.Console.IsVisible;
if (vm.Console.IsVisible)
{
_rootGrid.RowDefinitions[_consoleRow].Height = new GridLength(_consoleHeight, GridUnitType.Pixel);
Dispatcher.UIThread.Post(() => _console.FocusInput(), DispatcherPriority.Background);
}
else
{
_consoleHeight = _rootGrid.RowDefinitions[_consoleRow].Height.Value;
_rootGrid.RowDefinitions[_consoleRow].Height = new GridLength(0, GridUnitType.Pixel);
}
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void PreviewKeyUp(object? sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
ToggleConsole();
e.Handled = true;
}
}
}
}

Loading…
Cancel
Save