Browse Source

Added Visual Indicators for Column Reorder

pull/2109/head
sdoroff 8 years ago
parent
commit
196001dd35
  1. 10
      src/Avalonia.DataGrid.Themes.Default/DefaultTheme.xaml
  2. 31
      src/Avalonia.DataGrid/DataGrid.cs
  3. 29
      src/Avalonia.DataGrid/DataGridColumnHeader.cs
  4. 2
      src/Avalonia.DataGrid/EventArgs.cs
  5. 17
      src/Avalonia.DataGrid/Primitives/DataGridColumnHeadersPresenter.cs

10
src/Avalonia.DataGrid.Themes.Default/DefaultTheme.xaml

@ -202,6 +202,11 @@
</vsm:VisualStateManager.VisualStateGroups>
-->
<Style Selector="dg|DataGridColumnHeader:dragIndicator">
<Setter Property="Opacity" Value="0.5"/>
</Style>
<!--FIX-->
<Style Selector="dg|DataGridRow">
<Setter Property="Template">
@ -587,6 +592,11 @@
<Setter Property="HeadersVisibility" Value="Column" />
<Setter Property="BorderBrush" Value="{DynamicResource ThemeBorderDarkBrush}"/>
<Setter Property="BorderThickness" Value="{DynamicResource ThemeBorderThickness}" />
<Setter Property="DropLocationIndicatorTemplate">
<Template>
<Rectangle Fill="#FF3F4346" Width="2"/>
</Template>
</Setter>
<Setter Property="Template">
<ControlTemplate>
<Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}">

31
src/Avalonia.DataGrid/DataGrid.cs

@ -595,6 +595,18 @@ namespace Avalonia.Controls
}
public static readonly StyledProperty<ITemplate<IControl>> DropLocationIndicatorTemplateProperty =
AvaloniaProperty.Register<DataGrid, ITemplate<IControl>>(nameof(DropLocationIndicatorTemplate));
/// <summary>
/// Gets or sets the template that is used when rendering the column headers.
/// </summary>
public ITemplate<IControl> DropLocationIndicatorTemplate
{
get { return GetValue(DropLocationIndicatorTemplateProperty); }
set { SetValue(DropLocationIndicatorTemplateProperty, value); }
}
private int _selectedIndex = -1;
private object _selectedItem;
@ -7007,25 +7019,6 @@ namespace Avalonia.Controls
#region DropLocationIndicatorStyle
/// <summary>
/// Gets or sets the style that is used when rendering the column headers.
/// </summary>
/*public Style DropLocationIndicatorStyle
{
get { return GetValue(DropLocationIndicatorStyleProperty) as Style; }
set { SetValue(DropLocationIndicatorStyleProperty, value); }
} */
/// <summary>
/// Identifies the <see cref="P:Avalonia.Controls.DataGrid.DropLocationIndicatorStyle" />
/// dependency property.
/// </summary>
/*public static readonly DependencyProperty DropLocationIndicatorStyleProperty =
DependencyProperty.Register(
"DropLocationIndicatorStyle",
typeof(Style),
typeof(DataGrid),
null);*/
#endregion DropLocationIndicatorStyle

29
src/Avalonia.DataGrid/DataGridColumnHeader.cs

@ -94,14 +94,13 @@ namespace Avalonia.Controls
DefaultStyleKey = typeof(DataGridColumnHeader);
} */
#region Protected Methods
/// <summary>
/// Builds the visual tree for the column header when a new template is applied.
/// </summary>
//TODO Implement
/*public override void OnApplyTemplate()
{
base.OnApplyTemplate();
@ -116,6 +115,7 @@ namespace Avalonia.Controls
/// <exception cref="T:System.NotSupportedException">
/// <paramref name="newContent" /> is not a UIElement.
/// </exception>
//TODO Implement
/*protected override void OnContentChanged(object oldContent, object newContent)
{
if (newContent is UIElement)
@ -254,7 +254,6 @@ namespace Avalonia.Controls
//protected override void OnPointerReleased(PointerReleasedEventArgs e)
//{
// base.OnPointerReleased(e);
// Debug.WriteLine(nameof(OnPointerReleased));
// bool handled = e.Handled;
// if (e.MouseButton == MouseButton.Left)
// {
@ -805,7 +804,9 @@ namespace Avalonia.Controls
ContentTemplate = ContentTemplate
};
Control dropLocationIndicator = new ContentControl();
dragIndicator.PseudoClasses.Add(":dragIndicator");
IControl dropLocationIndicator = OwningGrid.DropLocationIndicatorTemplate?.Build();
//dropLocationIndicator.SetStyleWithType(OwningGrid.DropLocationIndicatorStyle);
//if (OwningColumn.DragIndicatorStyle != null)
@ -816,17 +817,11 @@ namespace Avalonia.Controls
//{
// dragIndicator.SetStyleWithType(OwningGrid.DragIndicatorStyle);
//}
// If the user didn't style the dragIndicator's Width, default it to the column header's width
if (double.IsNaN(dragIndicator.Width))
{
dragIndicator.Width = Bounds.Width;
}
// If the user didn't style the dropLocationIndicator's Height, default to the column header's height
if (double.IsNaN(dropLocationIndicator.Height))
if (dropLocationIndicator != null && double.IsNaN(dropLocationIndicator.Height) && dropLocationIndicator is Control element)
{
dropLocationIndicator.Height = Bounds.Height;
element.Height = Bounds.Height;
}
// pass the caret's data template to the user for modification
@ -850,6 +845,12 @@ namespace Avalonia.Controls
OwningGrid.ColumnHeaders.DragColumn = OwningColumn;
OwningGrid.ColumnHeaders.DragIndicator = columnReorderingEventArgs.DragIndicator;
OwningGrid.ColumnHeaders.DropLocationIndicator = columnReorderingEventArgs.DropLocationIndicator;
// If the user didn't style the dragIndicator's Width, default it to the column header's width
if (double.IsNaN(dragIndicator.Width))
{
dragIndicator.Width = Bounds.Width;
}
}
//TODO DragEvents

2
src/Avalonia.DataGrid/EventArgs.cs

@ -309,7 +309,7 @@ namespace Avalonia.Controls
/// <summary>
/// UIElement to display at the insertion position. If null and Handled = true, then do not display an insertion indicator.
/// </summary>
public Control DropLocationIndicator
public IControl DropLocationIndicator
{
get;
set;

17
src/Avalonia.DataGrid/Primitives/DataGridColumnHeadersPresenter.cs

@ -17,7 +17,7 @@ namespace Avalonia.Controls.Primitives
public sealed class DataGridColumnHeadersPresenter : Panel
{
private Control _dragIndicator;
private Control _dropLocationIndicator;
private IControl _dropLocationIndicator;
/// <summary>
/// Tracks which column is currently being dragged.
@ -66,7 +66,7 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// The drop location indicator control. This value is null if no column is being dragged.
/// </summary>
internal Control DropLocationIndicator
internal IControl DropLocationIndicator
{
get
{
@ -164,11 +164,20 @@ namespace Avalonia.Controls.Primitives
if (DragIndicator != null)
{
EnsureColumnReorderingClip(DragIndicator, finalSize.Height, frozenLeftEdge, dragIndicatorLeftEdge);
DragIndicator.Arrange(new Rect(dragIndicatorLeftEdge, 0, DragIndicator.Bounds.Width, DragIndicator.Bounds.Height));
var height = DragIndicator.Bounds.Height;
if (height <= 0)
height = DragIndicator.DesiredSize.Height;
DragIndicator.Arrange(new Rect(dragIndicatorLeftEdge, 0, DragIndicator.Bounds.Width, height));
}
if (DropLocationIndicator != null)
{
EnsureColumnReorderingClip(DropLocationIndicator, finalSize.Height, frozenLeftEdge, DropLocationIndicatorOffset);
if (DropLocationIndicator is Control element)
{
EnsureColumnReorderingClip(element, finalSize.Height, frozenLeftEdge, DropLocationIndicatorOffset);
}
DropLocationIndicator.Arrange(new Rect(DropLocationIndicatorOffset, 0, DropLocationIndicator.Bounds.Width, DropLocationIndicator.Bounds.Height));
}
}

Loading…
Cancel
Save