Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,43 +12,49 @@
<DockPanel Margin="5">
<TextBlock DockPanel.Dock="Top" Margin="0,0,0,10" TextWrapping="Wrap" Text="{l:Loc ConflictResolutionView_ChooseDescription}"/>

<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding View.Columns[0].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[1].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[2].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[3].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[4].ActualWidth, ElementName=SelectConflictOptions}"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.Resources>
<Style x:Key="Header" TargetType="TextBlock">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="0,0,0,5"/>
</Style>
<Style x:Key="Value" TargetType="FrameworkElement">
<Setter Property="Margin" Value="7,0,0,0"/>
</Style>
</Grid.Resources>
<ScrollViewer x:Name="DetailsScrollViewer"
DockPanel.Dock="Top"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Disabled"
CanContentScroll="False">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding View.Columns[0].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[1].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[2].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[3].ActualWidth, ElementName=SelectConflictOptions}"/>
<ColumnDefinition Width="{Binding View.Columns[4].ActualWidth, ElementName=SelectConflictOptions}"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.Resources>
<Style x:Key="Header" TargetType="TextBlock">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="0,0,0,5"/>
</Style>
<Style x:Key="Value" TargetType="FrameworkElement">
<Setter Property="Margin" Value="7,0,0,0"/>
</Style>
</Grid.Resources>

<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_OriginalFile}"/>
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_LastModified}"/>
<TextBlock Grid.Row="0" Grid.Column="2" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_Size}"/>
<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_OriginalFile}"/>
<TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_LastModified}"/>
<TextBlock Grid.Row="0" Grid.Column="2" Style="{StaticResource Header}" Text="{l:Loc ConflictResolutionView_Header_Size}"/>

<TextBlock Grid.Row="1" Grid.Column="0" Style="{StaticResource Value}" Text="{Binding Conflict.DisplayName}"/>
<TextBlock Grid.Row="1" Grid.Column="1" Style="{StaticResource Value}" Text="{Binding Conflict.LastModified}"/>
<TextBlock Grid.Row="1" Grid.Column="2" Style="{StaticResource Value}" Text="{Binding Conflict.Size}"/>

<Button Grid.Row="1" Grid.Column="4"
HorizontalAlignment="Left"
Style="{StaticResource Value}"
Padding="5,0"
Command="{s:Action ChooseOriginal}"
Content="{l:Loc ConflictResolutionView_Button_Choose}"/>
</Grid>
<TextBlock Grid.Row="1" Grid.Column="0" Style="{StaticResource Value}" Text="{Binding Conflict.DisplayName}"/>
<TextBlock Grid.Row="1" Grid.Column="1" Style="{StaticResource Value}" Text="{Binding Conflict.LastModified}"/>
<TextBlock Grid.Row="1" Grid.Column="2" Style="{StaticResource Value}" Text="{Binding Conflict.Size}"/>

<Button Grid.Row="1" Grid.Column="4"
HorizontalAlignment="Left"
Style="{StaticResource Value}"
Padding="5,0"
Command="{s:Action ChooseOriginal}"
Content="{l:Loc ConflictResolutionView_Button_Choose}"/>
</Grid>
</ScrollViewer>

<Button DockPanel.Dock="Bottom" Margin="0,8,0,5" Padding="7,2"
HorizontalAlignment="Left"
Expand All @@ -58,6 +64,7 @@
ItemsSource="{Binding Conflict.ConflictOptions}"
Style="{StaticResource BoringListViewStyle}"
BorderThickness="0"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListView.View>
<GridView>
Expand All @@ -69,7 +76,7 @@
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="{l:Loc ConflictResolutionView_Header_ConflictCreated}"
DisplayMemberBinding="{Binding DateCreated}"/>
DisplayMemberBinding="{Binding DateCreated}"/>
<GridViewColumn Header="{l:Loc ConflictResolutionView_Header_Size}">
<GridViewColumn.CellTemplate>
<DataTemplate>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace SyncTrayzor.Pages.ConflictResolution
{
public partial class SingleConflictResolutionView
{
private ScrollViewer _optionsScrollViewer;
private bool _isSyncingHorizontalScroll;

public SingleConflictResolutionView()
{
InitializeComponent();
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}

private void OnLoaded(object sender, RoutedEventArgs e)
{
HookHorizontalScrollSync();
}

private void OnUnloaded(object sender, RoutedEventArgs e)
{
UnhookHorizontalScrollSync();
}

private void HookHorizontalScrollSync()
{
UnhookHorizontalScrollSync();

SelectConflictOptions.ApplyTemplate();

_optionsScrollViewer =
SelectConflictOptions.Template?.FindName("PART_ScrollViewer", SelectConflictOptions) as ScrollViewer ??
FindDescendant<ScrollViewer>(SelectConflictOptions);

if (_optionsScrollViewer == null)
return;

DetailsScrollViewer.ScrollChanged += DetailsScrollViewerOnScrollChanged;
_optionsScrollViewer.ScrollChanged += OptionsScrollViewerOnScrollChanged;

DetailsScrollViewer.ScrollToHorizontalOffset(_optionsScrollViewer.HorizontalOffset);
}

private void UnhookHorizontalScrollSync()
{
DetailsScrollViewer.ScrollChanged -= DetailsScrollViewerOnScrollChanged;

if (_optionsScrollViewer != null)
{
_optionsScrollViewer.ScrollChanged -= OptionsScrollViewerOnScrollChanged;
_optionsScrollViewer = null;
}
}

private void DetailsScrollViewerOnScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (_isSyncingHorizontalScroll || _optionsScrollViewer == null || e.HorizontalChange == 0)
return;

_isSyncingHorizontalScroll = true;
_optionsScrollViewer.ScrollToHorizontalOffset(DetailsScrollViewer.HorizontalOffset);
_isSyncingHorizontalScroll = false;
}

private void OptionsScrollViewerOnScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (_isSyncingHorizontalScroll || e.HorizontalChange == 0)
return;

_isSyncingHorizontalScroll = true;
DetailsScrollViewer.ScrollToHorizontalOffset(_optionsScrollViewer.HorizontalOffset);
_isSyncingHorizontalScroll = false;
}

private static T FindDescendant<T>(DependencyObject root) where T : DependencyObject
{
if (root == null)
return null;

var childCount = VisualTreeHelper.GetChildrenCount(root);
for (var i = 0; i < childCount; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
if (child is T typedChild)
return typedChild;

var descendant = FindDescendant<T>(child);
if (descendant != null)
return descendant;
}

return null;
}
}
}

Loading