Files
Andy Gainey d6274a7b2f Added toggle in thread view to show or hide vertical frame lines. (#111)
- This makes it easier to view profiling data for long-running tasks that are mostly independent of individual frames.

Co-authored-by: Andy Gainey
2020-08-06 13:07:14 +01:00

182 lines
13 KiB
XML

<UserControl x:Class="Profiler.Controls.EventThreadView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Controls="clr-namespace:Profiler.Controls"
xmlns:Profiler="clr-namespace:Profiler"
xmlns:Profiler_Data="clr-namespace:Profiler.Data;assembly=Profiler.Data"
xmlns:MahApps="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Controls:MsToStringConverter x:Key="MsToStringConverter" />
<Style x:Key="LabelUnderscoreStyle" BasedOn="{StaticResource {x:Type Label}}" TargetType="Label">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Label">
<Border>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="False" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid Height="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Grid Background="{StaticResource ControlBackgroundBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ItemsControl Grid.Column="1" x:Name="SummaryView">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" TextBlock.FontSize="12" TextBlock.FontWeight="Bold" Opacity="0.5" VerticalAlignment="Center">
<Rectangle Width="1" Height="15" Stroke="Gray" Margin="0,0,5,0" />
<TextBlock Text="{Binding Value}" ToolTip="{Binding Name}" Margin="0,0,5,0" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<StackPanel Margin="1" HorizontalAlignment="Right" x:Name="ThreadToolsPanel" Grid.Column="2" VerticalAlignment="Top" Orientation="Horizontal">
<StackPanel Orientation="Horizontal" TextBlock.FontSize="12" TextBlock.FontWeight="Bold" Height="16" TextBlock.TextAlignment="Center" Margin="2,0" Opacity="0.5" x:Name="GroupStats">
<StackPanel Orientation="Horizontal" ToolTip="Duration of the Capture">
<ContentControl Style="{StaticResource appbar_timer}" Margin="-10" />
<TextBlock Text="{Binding Duration, Converter={StaticResource MsToStringConverter}}" Margin="2" VerticalAlignment="Center"/>
</StackPanel>
<Rectangle Width="1" Height="15" Stroke="Gray" Margin="0,0,5,0" />
<StackPanel Orientation="Horizontal" ToolTip="Number of Collected Scopes">
<ContentControl Style="{StaticResource appbar_greek_sigma_uppercase}" Margin="-6" />
<TextBlock Text="{Binding NumScopes, StringFormat={}{0:### ### ### ##0}}" Margin="2" VerticalAlignment="Center"/>
</StackPanel>
<Rectangle Width="1" Height="15" Stroke="Gray" Margin="0,0,5,0" />
<StackPanel Orientation="Horizontal" ToolTip="Number of Collected Callstacks (Run the Game as Administrator to enable callstack collection)">
<ContentControl Style="{StaticResource appbar_cards_diamond}" Margin="-6" />
<TextBlock Text="{Binding NumCallstacks, StringFormat={}{0:### ### ### ##0}}" Margin="2" VerticalAlignment="Center"/>
</StackPanel>
<Rectangle Width="1" Height="15" Stroke="Gray" Margin="0,0,5,0" />
</StackPanel>
<Controls:FunctionSearch x:Name="FunctionSearchControl" Margin="1,0" Width="230" />
<ToggleButton x:Name="ShowSyncWorkButton" ToolTip="Show Work" Height="{StaticResource DefaultButtonSize}" Margin="0,0,1,0" Click="ShowSyncWorkButton_Click">
<TextBlock Text="SHOW CPU CORES" Margin="0,-3,0,0" Padding="0" />
</ToggleButton>
<ToggleButton x:Name="ShowCallstacksButton" Height="{StaticResource DefaultButtonSize}" MinHeight="{StaticResource DefaultButtonSize}" Margin="0" Checked="ShowCallstacksButton_Checked" Unchecked="ShowCallstacksButton_Unchecked">
<ToggleButton.Content>
<StackPanel Orientation="Horizontal" Margin="-4">
<TextBlock Margin="3,1,3,1" Text="SHOW CALLSTACKS" />
<Button x:Name="CallstackFilterDrowpdown" Margin="0" BorderThickness="0" Background="Transparent" Click="CallstackFilterDrowpdown_Click">
<ContentControl Margin="-4,0,-2,0"
Width="9"
Height="9"
Content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z"
Style="{DynamicResource PathIconContentControlStyle}" />
</Button>
</StackPanel>
</ToggleButton.Content>
</ToggleButton>
<ToggleButton x:Name="ShowFrameLinesButton" ToolTip="Show Frame Lines" Height="{StaticResource DefaultButtonSize}" Margin="0,0,1,0" Click="ShowFrameLinesButton_Click" IsChecked="{Binding ShowFrameLines, ElementName=ThreadViewControl}">
<TextBlock Text="SHOW FRAMES" Margin="0,-3,0,0" Padding="0" />
</ToggleButton>
<Popup x:Name="CallstackFilterPopup" Placement="Bottom" IsOpen="{Binding IsChecked, ElementName=CallstackFilterDrowpdown}" PlacementTarget="{Binding ElementName=ShowCallstacksButton}" StaysOpen="False" >
<Border Background="{StaticResource OptickContentBackground}" BorderBrush="{StaticResource OptickBorder}" BorderThickness="1" Width="{Binding ActualWidth, ElementName=ShowCallstacksButton}">
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CheckBox IsChecked="{Binding IsChecked}" />
<TextBlock Text="{Binding Reason}" Grid.Column="1" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
</StackPanel>
</Grid>
<Controls:ThreadViewControl Grid.Row="1" x:Name="ThreadViewControl" />
<Popup x:Name="SurfacePopup" StaysOpen="False" Placement="Mouse" PopupAnimation="Fade" IsEnabled="False" Focusable="False" IsHitTestVisible="False" AllowsTransparency="True">
<Border BorderThickness="1" Background="{StaticResource OptickContentBackground}" BorderBrush="{StaticResource AccentColorBrush}">
<ItemsControl ItemsSource="{Binding}" Margin="0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type Profiler_Data:EventNode}">
<Grid Margin="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Rectangle Grid.Column="0" Margin="4" Width="16" Height="16" Fill="{Binding Description.ForceBrush}" Stroke="Black" StrokeThickness="1" RadiusX="2" RadiusY="2" VerticalAlignment="Center" />
<Label Grid.Column="1" Margin="2,0" Content="{Binding Name, Mode=OneTime}" FontWeight="Bold" VerticalAlignment="Center" />
<Label Grid.Column="2" Margin="2,0" HorizontalAlignment="Right" VerticalAlignment="Center" HorizontalContentAlignment="Right" Content="{Binding Duration, Mode=OneTime}" ContentStringFormat="{}{0:0.###} ms" FontWeight="Bold" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type Profiler_Data:WaitInterval}">
<Grid Margin="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentControl Style="{StaticResource appbar_timer_pause}" Margin="-3,-6,-6,-6" Width="32" Height="32" />
<Label Grid.Column="1" Content="{Binding ReasonText, Mode=OneTime}" ContentStringFormat="{}Cursor: {0}" Margin="2" />
<Label Grid.Column="2" Content="{Binding Duration, Mode=OneTime}" ContentStringFormat="{}{0:0.###} ms" Margin="2" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type Profiler_Data:NodeWaitIntervalList}">
<Expander Header="Synchronization" IsExpanded="True" FontWeight="Bold" MahApps:ButtonHelper.PreserveTextCase="True">
<DataGrid ItemsSource="{Binding}" CanUserAddRows="False" GridLinesVisibility="None" IsReadOnly="True" BorderThickness="0" AutoGenerateColumns="False" FontWeight="Normal" ClipboardCopyMode="ExcludeHeader">
<DataGrid.Columns>
<DataGridTextColumn Header="Reason" Binding="{Binding Reason}" />
<DataGridTextColumn Header="Time(ms)" Binding="{Binding Duration, StringFormat={}{0:0.###}ms}" />
<DataGridTextColumn Header="Time(%)" Binding="{Binding Percent, StringFormat={}{0:0.#}%}" />
<DataGridTextColumn Header="Count" Binding="{Binding Count}" />
</DataGrid.Columns>
</DataGrid>
</Expander>
</DataTemplate>
<DataTemplate DataType="{x:Type Profiler_Data:Callstack}">
<Expander Header="Callstack" IsExpanded="True" FontWeight="Bold">
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" CanUserAddRows="False" HeadersVisibility="None" GridLinesVisibility="None" IsReadOnly="True" BorderThickness="0" FontWeight="Normal" ClipboardCopyMode="ExcludeHeader">
<DataGrid.Columns>
<DataGridTextColumn Header="Address" Binding="{Binding Address, StringFormat={}0x{0:x}}" Foreground="Gray">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
</Expander>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
</Border>
</Popup>
</Grid>
</UserControl>