1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-11-26 21:49:45 +00:00
6502bench/SourceGen/WpfGui/CodeListItemStyle.xaml
2019-07-20 13:28:37 -07:00

203 lines
10 KiB
XML

<!--
Copyright 2019 faddenSoft
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
ListViewItem control template and style. This is used for the main code ListView. The
most significant consideration is getting long comments and notes into the 5th column and
having them span multiple columns. Most of this came from the default style (WPF 4.5).
This interacts with DisplayList.FormattedParts.
See also https://github.com/fadden/DisasmUiTest
-->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- some brushes, extracted from the default style -->
<LinearGradientBrush x:Key="ListItemHoverFill" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF1FBFF" Offset="0"/>
<GradientStop Color="#FFD5F1FE" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="ListItemSelectedFill" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFD9F4FF" Offset="0"/>
<GradientStop Color="#FF9BDDFB" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="ListItemSelectedInactiveFill" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFEEEDED" Offset="0"/>
<GradientStop Color="#FFDDDDDD" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="ListItemSelectedHoverFill" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFEAF9FF" Offset="0"/>
<GradientStop Color="#FFC9EDFD" Offset="1"/>
</LinearGradientBrush>
<!-- Column set for the long-comment lines. The first five columns will be empty, but
have their widths set to match those in the containing ListView.
If you don't set DisplayMemberBinding, it will try to ToString() the entire object.
-->
<GridViewColumnCollection x:Key="gvcc">
<GridViewColumn DisplayMemberBinding="{Binding Offset}" Width="{Binding
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}
}, Path=View.Columns[0].ActualWidth}"/>
<GridViewColumn DisplayMemberBinding="{Binding Addr}" Width="{Binding
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}
}, Path=View.Columns[1].ActualWidth}"/>
<GridViewColumn DisplayMemberBinding="{Binding Bytes}" Width="{Binding
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}
}, Path=View.Columns[2].ActualWidth}"/>
<GridViewColumn DisplayMemberBinding="{Binding Flags}" Width="{Binding
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}
}, Path=View.Columns[3].ActualWidth}"/>
<GridViewColumn DisplayMemberBinding="{Binding Attr}" Width="{Binding
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}
}, Path=View.Columns[4].ActualWidth}"/>
<!-- This column holds the long comment. There's no easy way to set its width, so we
have to let the main window take care of that. (It's tempting to just make its width
very large, but that causes the GridView contents to horizontally scroll independently
of the GridView header when you reach the edge of the "normal" column set.) -->
<GridViewColumn Header="(long comment)" DisplayMemberBinding="{Binding Path=Comment}"
Width="{Binding LongCommentWidth}"/>
</GridViewColumnCollection>
<!-- Template for long lines. This is a modification of the default style, with
Content and Columns attributes defined in the GridViewRowPresenter. It appears we
inherit the FocusVisualStyle from the default. -->
<ControlTemplate x:Key="longCommentTemplate" TargetType="{x:Type ListViewItem}">
<StackPanel>
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
CornerRadius="2"
SnapsToDevicePixels="true">
<Border x:Name="InnerBorder" BorderThickness="1" CornerRadius="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition MaxHeight="11"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Rectangle x:Name="UpperHighlight" Fill="#75FFFFFF" Visibility="Collapsed"/>
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{StaticResource gvcc}"
Grid.RowSpan="2"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</Border>
</Border>
</StackPanel>
<!-- triggers for hover, selection, and activation effects -->
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" Value="{StaticResource ListItemHoverFill}"/>
<Setter Property="BorderBrush" Value="#FFCCF0FF"/>
<Setter Property="Visibility" TargetName="UpperHighlight" Value="Visible"/>
</Trigger>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Background" Value="{StaticResource ListItemSelectedFill}"/>
<Setter Property="BorderBrush" Value="#FF98DDFB"/>
<Setter Property="BorderBrush" TargetName="InnerBorder" Value="#80FFFFFF"/>
<Setter Property="Visibility" TargetName="UpperHighlight" Value="Visible"/>
<Setter Property="Fill" TargetName="UpperHighlight" Value="#40FFFFFF"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="Selector.IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}"/>
<Setter Property="BorderBrush" Value="#FFCFCFCF"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="IsMouseOver" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}"/>
<Setter Property="BorderBrush" Value="#FF98DDFB"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="codeListItemStyle" TargetType="{x:Type ListViewItem}">
<!-- There's a one-pixel gap between items, possibly space for grid lines, that
can't seem to be eliminated. Declaring a negative margin removes it. This is
necessary because the gap isn't a mouse target, so if your mouse is in just the
wrong place you'll feel like you clicked and nothing happened. -->
<Setter Property="Margin" Value="0,-1,0,0"/>
<!-- This causes individual TextBoxes to stretch to fill the column. This is nice
because the cell-highlight stuff will set the background on the full cell rather than
just the bit with the text. -->
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsLongComment}" Value="True">
<Setter Property="Template" Value="{StaticResource longCommentTemplate}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=HasBackgroundColor}" Value="True">
<Setter Property="Background" Value="{Binding Path=BackgroundBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<!-- Highlighting for individual cells. -->
<LinearGradientBrush x:Key="HighlightedCellFill" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFD9Fff4" Offset="0"/>
<GradientStop Color="#FF9Bfbdd" Offset="1"/>
</LinearGradientBrush>
<DataTemplate x:Key="addrHighlightTemplate">
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=HasAddrLabelHighlight}" Value="True">
<Setter Property="TextBlock.Background" Value="{StaticResource HighlightedCellFill}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
<TextBlock.Text>
<Binding Path="Addr"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
<DataTemplate x:Key="labelHighlightTemplate">
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=HasAddrLabelHighlight}" Value="True">
<Setter Property="TextBlock.Background" Value="{StaticResource HighlightedCellFill}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
<TextBlock.Text>
<Binding Path="Label"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ResourceDictionary>