Skip to content

Feature: Improved checkbox behavior #11993

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 14, 2023
Merged
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
58 changes: 32 additions & 26 deletions src/Files.App/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,6 @@ namespace Files.App.Views.LayoutModes
{
public sealed partial class DetailsLayoutBrowser : StandardViewBase
{
public bool IsPointerOver
{
get { return (bool)GetValue(IsPointerOverProperty); }
set { SetValue(IsPointerOverProperty, value); }
}
public static readonly DependencyProperty IsPointerOverProperty =
DependencyProperty.Register("IsPointerOver", typeof(bool), typeof(DetailsLayoutBrowser), new PropertyMetadata(false));

private const int TAG_TEXT_BLOCK = 1;

private uint currentIconSize;
Expand Down Expand Up @@ -727,16 +719,23 @@ private void ItemSelected_Unchecked(object sender, RoutedEventArgs e)

private new void FileList_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
args.ItemContainer.PointerEntered -= ItemRow_PointerEntered;
args.ItemContainer.PointerExited -= ItemRow_PointerExited;
args.ItemContainer.PointerCanceled -= ItemRow_PointerCanceled;
var iconBox = args.ItemContainer.FindDescendant("IconBox")!;
var selectionCheckbox = args.ItemContainer.FindDescendant("SelectionCheckbox")!;

iconBox.PointerEntered -= IconBox_PointerEntered;
iconBox.PointerExited -= IconBox_PointerExited;
iconBox.PointerCanceled -= IconBox_PointerCanceled;
selectionCheckbox.PointerExited -= SelectionCheckbox_PointerExited;
selectionCheckbox.PointerCanceled -= SelectionCheckbox_PointerCanceled;

base.FileList_ContainerContentChanging(sender, args);
SetCheckboxSelectionState(args.Item, args.ItemContainer as ListViewItem);

args.ItemContainer.PointerEntered += ItemRow_PointerEntered;
args.ItemContainer.PointerExited += ItemRow_PointerExited;
args.ItemContainer.PointerCanceled += ItemRow_PointerCanceled;
iconBox.PointerEntered += IconBox_PointerEntered;
iconBox.PointerExited += IconBox_PointerExited;
iconBox.PointerCanceled += IconBox_PointerCanceled;
selectionCheckbox.PointerExited += SelectionCheckbox_PointerExited;
selectionCheckbox.PointerCanceled += SelectionCheckbox_PointerCanceled;
}

private void SetCheckboxSelectionState(object item, ListViewItem? lviContainer = null)
Expand All @@ -756,7 +755,7 @@ private void SetCheckboxSelectionState(object item, ListViewItem? lviContainer =
checkbox.Checked += ItemSelected_Checked;
checkbox.Unchecked += ItemSelected_Unchecked;
}
UpdateCheckboxVisibility(container);
UpdateCheckboxVisibility(container, false);
}
}

Expand Down Expand Up @@ -796,30 +795,37 @@ private void TagIcon_Tapped(object sender, TappedRoutedEventArgs e)
e.Handled = true;
}

private void ItemRow_PointerEntered(object sender, PointerRoutedEventArgs e)
private void IconBox_PointerEntered(object sender, PointerRoutedEventArgs e)
{
UpdateCheckboxVisibility((sender as FrameworkElement)!.FindAscendant<ListViewItem>()!, true);
}

private void IconBox_PointerExited(object sender, PointerRoutedEventArgs e)
{
e.Handled = true;
}

private void IconBox_PointerCanceled(object sender, PointerRoutedEventArgs e)
{
UpdateCheckboxVisibility(sender, true);
e.Handled = true;
}

private void ItemRow_PointerExited(object sender, PointerRoutedEventArgs e)
private void SelectionCheckbox_PointerExited(object sender, PointerRoutedEventArgs e)
{
UpdateCheckboxVisibility(sender, false);
UpdateCheckboxVisibility((sender as FrameworkElement)!.FindAscendant<ListViewItem>()!, false);
}

private void ItemRow_PointerCanceled(object sender, PointerRoutedEventArgs e)
private void SelectionCheckbox_PointerCanceled(object sender, PointerRoutedEventArgs e)
{
UpdateCheckboxVisibility(sender, false);
UpdateCheckboxVisibility((sender as FrameworkElement)!.FindAscendant<ListViewItem>()!, false);
}

private void UpdateCheckboxVisibility(object sender, bool? isPointerOver = null)
private void UpdateCheckboxVisibility(object sender, bool isPointerOver)
{
if (sender is ListViewItem control && control.FindDescendant<UserControl>() is UserControl userControl)
{
// Save pointer over state accordingly
if (isPointerOver.HasValue)
control.SetValue(IsPointerOverProperty, isPointerOver);
// Handle visual states
if (control.IsSelected || control.GetValue(IsPointerOverProperty) is not false && SelectedItems?.Count >= 1)
if (control.IsSelected || isPointerOver || (control.FindDescendant("SelectionCheckbox") as CheckBox)!.IsPointerOver)
VisualStateManager.GoToState(userControl, "ShowCheckbox", true);
else
VisualStateManager.GoToState(userControl, "HideCheckbox", true);
Expand Down
2 changes: 1 addition & 1 deletion src/Files.App/Views/LayoutModes/GridViewBrowser.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ private void UpdateCheckboxVisibility(object sender, bool? isPointerOver = null)
if (isPointerOver.HasValue)
control.SetValue(IsPointerOverProperty, isPointerOver);
// Handle visual states
if (control.IsSelected || control.GetValue(IsPointerOverProperty) is not false && SelectedItems?.Count >= 1)
if (control.IsSelected || control.GetValue(IsPointerOverProperty) is not false)
VisualStateManager.GoToState(userControl, "ShowCheckbox", true);
else
VisualStateManager.GoToState(userControl, "HideCheckbox", true);
Expand Down