From 2df2943a27b86c42a38977b00b314011cd8644f3 Mon Sep 17 00:00:00 2001 From: Luis von der Eltz Date: Thu, 20 Aug 2020 10:51:41 +0200 Subject: [PATCH] !F Adding margin/padding --- .../Diagnostics/ViewModels/MainViewModel.cs | 16 ++++- .../ViewModels/TreePageViewModel.cs | 7 +- .../Diagnostics/Views/MainView.xaml | 9 +++ .../Diagnostics/Views/TreePageView.xaml.cs | 71 ++++++++++++++----- 4 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs index 1d19e1a346..af087cfe6f 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs @@ -16,12 +16,13 @@ namespace Avalonia.Diagnostics.ViewModels private int _selectedTab; private string _focusedControl; private string _pointerOverElement; + private bool _shouldVisualizeMarginPadding = true; public MainViewModel(IControl root) { _root = root; - _logicalTree = new TreePageViewModel(LogicalTreeNode.Create(root)); - _visualTree = new TreePageViewModel(VisualTreeNode.Create(root)); + _logicalTree = new TreePageViewModel(this, LogicalTreeNode.Create(root)); + _visualTree = new TreePageViewModel(this, VisualTreeNode.Create(root)); _events = new EventsPageViewModel(root); UpdateFocusedControl(); @@ -39,6 +40,17 @@ namespace Avalonia.Diagnostics.ViewModels Console = new ConsoleViewModel(UpdateConsoleContext); } + public bool ShouldVisualizeMarginPadding + { + get => _shouldVisualizeMarginPadding; + set => RaiseAndSetIfChanged(ref _shouldVisualizeMarginPadding, value); + } + + public void ToggleVisualizeMarginPadding() + { + ShouldVisualizeMarginPadding = !ShouldVisualizeMarginPadding; + } + public ConsoleViewModel Console { get; } public ViewModelBase Content diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs index 38ac88a83c..92765dfd0d 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs @@ -10,8 +10,9 @@ namespace Avalonia.Diagnostics.ViewModels private ControlDetailsViewModel _details; private string _propertyFilter; - public TreePageViewModel(TreeNode[] nodes) + public TreePageViewModel(MainViewModel mainView, TreeNode[] nodes) { + MainView = mainView; Nodes = nodes; Selection = new SelectionModel { @@ -23,7 +24,9 @@ namespace Avalonia.Diagnostics.ViewModels { SelectedNode = (TreeNode)Selection.SelectedItem; }; - } + } + + public MainViewModel MainView { get; } public TreeNode[] Nodes { get; protected set; } diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml index 663722acba..0165398718 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/MainView.xaml @@ -16,6 +16,15 @@ + + + + + + + diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs index 633d18ddd8..1b61986ce6 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs @@ -1,7 +1,7 @@ +using System.Linq; using Avalonia.Controls; using Avalonia.Controls.Generators; using Avalonia.Controls.Primitives; -using Avalonia.Controls.Shapes; using Avalonia.Diagnostics.ViewModels; using Avalonia.Input; using Avalonia.Markup.Xaml; @@ -11,45 +11,78 @@ namespace Avalonia.Diagnostics.Views { internal class TreePageView : UserControl { - private Control _adorner; + private readonly Panel _adorner; + private AdornerLayer _currentLayer; private TreeView _tree; public TreePageView() { - this.InitializeComponent(); + InitializeComponent(); _tree.ItemContainerGenerator.Index.Materialized += TreeViewItemMaterialized; + + _adorner = new Panel + { + ClipToBounds = false, + Children = + { + //Padding frame + new Border { BorderBrush = new SolidColorBrush(Colors.Green, 0.5) }, + //Content frame + new Border { Background = new SolidColorBrush(Color.FromRgb(160, 197, 232), 0.5) }, + //Margin frame + new Border { BorderBrush = new SolidColorBrush(Colors.Yellow, 0.5) } + }, + }; } protected void AddAdorner(object sender, PointerEventArgs e) { var node = (TreeNode)((Control)sender).DataContext; - var layer = AdornerLayer.GetAdornerLayer(node.Visual); + var visual = (Visual)node.Visual; + + _currentLayer = AdornerLayer.GetAdornerLayer(visual); - if (layer != null) + if (_currentLayer == null || + _currentLayer.Children.Contains(_adorner)) { - if (_adorner != null) - { - ((Panel)_adorner.Parent).Children.Remove(_adorner); - _adorner = null; - } + return; + } - _adorner = new Rectangle - { - Fill = new SolidColorBrush(0x80a0c5e8), - [AdornerLayer.AdornedElementProperty] = node.Visual, - }; + _currentLayer.Children.Add(_adorner); + AdornerLayer.SetAdornedElement(_adorner, visual); + + var vm = (TreePageViewModel) DataContext; - layer.Children.Add(_adorner); + if (vm.MainView.ShouldVisualizeMarginPadding) + { + var paddingBorder = (Border)_adorner.Children[0]; + paddingBorder.BorderThickness = visual.GetValue(PaddingProperty); + + var contentBorder = (Border)_adorner.Children[1]; + contentBorder.Margin = visual.GetValue(PaddingProperty); + + var marginBorder = (Border)_adorner.Children[2]; + marginBorder.BorderThickness = visual.GetValue(MarginProperty); + marginBorder.Margin = InvertThickness(visual.GetValue(MarginProperty)); } } + private static Thickness InvertThickness(Thickness input) + { + return new Thickness(-input.Left, -input.Top, -input.Right, -input.Bottom); + } + protected void RemoveAdorner(object sender, PointerEventArgs e) { - if (_adorner != null) + foreach (var border in _adorner.Children.OfType()) { - ((Panel)_adorner.Parent).Children.Remove(_adorner); - _adorner = null; + border.Margin = default; + border.Padding = default; + border.BorderThickness = default; } + + _currentLayer?.Children.Remove(_adorner); + _currentLayer = null; } private void InitializeComponent()