From 8c758faf6b317e7eedaf09d3326d541ce2a66283 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Tue, 18 Mar 2025 01:14:59 +0900 Subject: [PATCH 1/3] Initial commit --- .../Sidebar/SidebarDisplayMode.cs | 2 + .../Sidebar/SidebarItem.Properties.cs | 136 ++-- .../Sidebar/SidebarItemAutomationPeer.cs | 33 +- .../Sidebar/SidebarItemDropPosition.cs | 2 + .../Sidebar/SidebarView.Events.cs | 145 ++++ .../Sidebar/SidebarView.Properties.cs | 112 +-- src/Files.App.Controls/Sidebar/SidebarView.cs | 188 ++++++ .../Sidebar/SidebarView.xaml | 637 +++++++++--------- .../Sidebar/SidebarView.xaml.cs | 246 ------- .../Sidebar/SidebarViewAutomationPeer.cs | 20 +- src/Files.App.Controls/Themes/Generic.xaml | 3 +- src/Files.App/Views/MainPage.xaml | 2 + .../{TestData => Data}/TestSidebarModel.cs | 7 +- .../TestSidebarViewModel.cs | 7 +- .../Views/SidebarViewPage.xaml | 11 +- .../Views/SidebarViewPage.xaml.cs | 16 +- 16 files changed, 770 insertions(+), 797 deletions(-) create mode 100644 src/Files.App.Controls/Sidebar/SidebarView.Events.cs create mode 100644 src/Files.App.Controls/Sidebar/SidebarView.cs delete mode 100644 src/Files.App.Controls/Sidebar/SidebarView.xaml.cs rename tests/Files.App.UITests/{TestData => Data}/TestSidebarModel.cs (76%) rename tests/Files.App.UITests/{TestData => Data}/TestSidebarViewModel.cs (83%) diff --git a/src/Files.App.Controls/Sidebar/SidebarDisplayMode.cs b/src/Files.App.Controls/Sidebar/SidebarDisplayMode.cs index 6b0bd385b5bb..c389472a68c6 100644 --- a/src/Files.App.Controls/Sidebar/SidebarDisplayMode.cs +++ b/src/Files.App.Controls/Sidebar/SidebarDisplayMode.cs @@ -12,10 +12,12 @@ public enum SidebarDisplayMode /// The sidebar is hidden and moves in from the side when the is set to true. /// Minimal, + /// /// Only the icons of the top most sections are visible. /// Compact, + /// /// The sidebar is expanded and items can also be expanded. /// diff --git a/src/Files.App.Controls/Sidebar/SidebarItem.Properties.cs b/src/Files.App.Controls/Sidebar/SidebarItem.Properties.cs index 68b1d440c126..6f8f940bc956 100644 --- a/src/Files.App.Controls/Sidebar/SidebarItem.Properties.cs +++ b/src/Files.App.Controls/Sidebar/SidebarItem.Properties.cs @@ -1,125 +1,73 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using CommunityToolkit.WinUI; + namespace Files.App.Controls { - public sealed partial class SidebarItem : Control + public sealed partial class SidebarItem { - public SidebarView? Owner - { - get { return (SidebarView?)GetValue(OwnerProperty); } - set { SetValue(OwnerProperty, value); } - } - public static readonly DependencyProperty OwnerProperty = - DependencyProperty.Register(nameof(Owner), typeof(SidebarView), typeof(SidebarItem), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial SidebarView? Owner { get; set; } - public bool IsSelected - { - get { return (bool)GetValue(IsSelectedProperty); } - set { SetValue(IsSelectedProperty, value); } - } - public static readonly DependencyProperty IsSelectedProperty = - DependencyProperty.Register(nameof(IsSelected), typeof(bool), typeof(SidebarItem), new PropertyMetadata(false, OnPropertyChanged)); + [GeneratedDependencyProperty] + public partial bool IsSelected { get; set; } - public bool IsExpanded - { - get { return (bool)GetValue(IsExpandedProperty); } - set { SetValue(IsExpandedProperty, value); } - } - public static readonly DependencyProperty IsExpandedProperty = - DependencyProperty.Register(nameof(IsExpanded), typeof(bool), typeof(SidebarItem), new PropertyMetadata(true, OnPropertyChanged)); + [GeneratedDependencyProperty(DefaultValue = true)] + public partial bool IsExpanded { get; set; } - public bool IsInFlyout - { - get { return (bool)GetValue(IsInFlyoutProperty); } - set { SetValue(IsInFlyoutProperty, value); } - } - public static readonly DependencyProperty IsInFlyoutProperty = - DependencyProperty.Register(nameof(IsInFlyout), typeof(bool), typeof(SidebarItem), new PropertyMetadata(false)); + [GeneratedDependencyProperty] + public partial bool IsInFlyout { get; set; } - public double ChildrenPresenterHeight - { - get { return (double)GetValue(ChildrenPresenterHeightProperty); } - set { SetValue(ChildrenPresenterHeightProperty, value); } - } - // Using 30 as a default in case something goes wrong - public static readonly DependencyProperty ChildrenPresenterHeightProperty = - DependencyProperty.Register(nameof(ChildrenPresenterHeight), typeof(double), typeof(SidebarItem), new PropertyMetadata(30d)); + [GeneratedDependencyProperty(DefaultValue = 30d)] + public partial double ChildrenPresenterHeight { get; set; } - public ISidebarItemModel? Item - { - get { return (ISidebarItemModel)GetValue(ItemProperty); } - set { SetValue(ItemProperty, value); } - } - public static readonly DependencyProperty ItemProperty = - DependencyProperty.Register(nameof(Item), typeof(ISidebarItemModel), typeof(SidebarItem), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial ISidebarItemModel? Item { get; set; } - public bool UseReorderDrop - { - get { return (bool)GetValue(UseReorderDropProperty); } - set { SetValue(UseReorderDropProperty, value); } - } - public static readonly DependencyProperty UseReorderDropProperty = - DependencyProperty.Register(nameof(UseReorderDrop), typeof(bool), typeof(SidebarItem), new PropertyMetadata(false)); + [GeneratedDependencyProperty] + public partial bool UseReorderDrop { get; set; } - public FrameworkElement? Icon - { - get { return (FrameworkElement?)GetValue(IconProperty); } - set { SetValue(IconProperty, value); } - } - public static readonly DependencyProperty IconProperty = - DependencyProperty.Register(nameof(Icon), typeof(FrameworkElement), typeof(SidebarItem), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial FrameworkElement? Icon { get; set; } - public FrameworkElement? Decorator - { - get { return (FrameworkElement?)GetValue(DecoratorProperty); } - set { SetValue(DecoratorProperty, value); } - } - public static readonly DependencyProperty DecoratorProperty = - DependencyProperty.Register(nameof(Decorator), typeof(FrameworkElement), typeof(SidebarItem), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial FrameworkElement? Decorator { get; set; } - public SidebarDisplayMode DisplayMode - { - get { return (SidebarDisplayMode)GetValue(DisplayModeProperty); } - set { SetValue(DisplayModeProperty, value); } - } - public static readonly DependencyProperty DisplayModeProperty = - DependencyProperty.Register(nameof(DisplayMode), typeof(SidebarDisplayMode), typeof(SidebarItem), new PropertyMetadata(SidebarDisplayMode.Expanded, OnPropertyChanged)); + [GeneratedDependencyProperty(DefaultValue = SidebarDisplayMode.Expanded)] + public partial SidebarDisplayMode DisplayMode { get; set; } public static void SetTemplateRoot(DependencyObject target, FrameworkElement value) { target.SetValue(TemplateRootProperty, value); } + public static FrameworkElement GetTemplateRoot(DependencyObject target) { return (FrameworkElement)target.GetValue(TemplateRootProperty); } + public static readonly DependencyProperty TemplateRootProperty = DependencyProperty.Register("TemplateRoot", typeof(FrameworkElement), typeof(FrameworkElement), new PropertyMetadata(null)); - public static void OnPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + partial void OnDisplayModePropertyChanged(DependencyPropertyChangedEventArgs e) + { + SidebarDisplayModeChanged((SidebarDisplayMode)e.OldValue); + } + + partial void OnIsSelectedChanged(bool newValue) + { + UpdateSelectionState(); + } + + partial void OnIsExpandedChanged(bool newValue) + { + UpdateExpansionState(); + } + + partial void OnItemChanged(ISidebarItemModel? newValue) { - if (sender is not SidebarItem item) return; - if (e.Property == DisplayModeProperty) - { - item.SidebarDisplayModeChanged((SidebarDisplayMode)e.OldValue); - } - else if (e.Property == IsSelectedProperty) - { - item.UpdateSelectionState(); - } - else if (e.Property == IsExpandedProperty) - { - item.UpdateExpansionState(); - } - else if(e.Property == ItemProperty) - { - item.HandleItemChange(); - } - else - { - Debug.Write(e.Property.ToString()); - } + HandleItemChange(); } } } diff --git a/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs b/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs index 47721f6cc443..e823bc7e918f 100644 --- a/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs +++ b/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs @@ -11,15 +11,12 @@ namespace Files.App.Controls { public sealed partial class SidebarItemAutomationPeer : FrameworkElementAutomationPeer, IInvokeProvider, IExpandCollapseProvider, ISelectionItemProvider { - public ExpandCollapseState ExpandCollapseState - { - get - { - if (Owner.HasChildren) - return Owner.IsExpanded ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed; - return ExpandCollapseState.LeafNode; - } - } + public ExpandCollapseState ExpandCollapseState => + Owner.HasChildren + ? Owner.IsExpanded + ? ExpandCollapseState.Expanded + : ExpandCollapseState.Collapsed + : ExpandCollapseState.LeafNode; public bool IsSelected => Owner.IsSelected; public IRawElementProviderSimple SelectionContainer => ProviderFromPeer(CreatePeerForElement(Owner.Owner)); @@ -27,7 +24,7 @@ public ExpandCollapseState ExpandCollapseState public SidebarItemAutomationPeer(SidebarItem owner) : base(owner) { - this.Owner = owner; + Owner = owner; } protected override AutomationControlType GetAutomationControlTypeCore() @@ -49,28 +46,22 @@ protected override object GetPatternCore(PatternInterface patternInterface) else if (patternInterface == PatternInterface.ExpandCollapse) { if (Owner.CollapseEnabled) - { return this; - } } + return base.GetPatternCore(patternInterface); } public void Collapse() { if (Owner.CollapseEnabled) - { Owner.IsExpanded = false; - } } public void Expand() { - if (Owner.CollapseEnabled) - { Owner.IsExpanded = true; - } } public void Invoke() @@ -106,13 +97,11 @@ protected override int GetPositionInSetCore() private IList GetOwnerCollection() { if (Owner.FindAscendant() is SidebarItem parent && parent.Item?.Children is IList list) - { return list; - } - if (Owner?.Owner is not null && Owner.Owner.ViewModel.SidebarItems is IList items) - { + + if (Owner?.Owner is not null && Owner.Owner?.ViewModel?.SidebarItems is IList items) return items; - } + return new List(); } } diff --git a/src/Files.App.Controls/Sidebar/SidebarItemDropPosition.cs b/src/Files.App.Controls/Sidebar/SidebarItemDropPosition.cs index 7ce253577529..31c8ad483495 100644 --- a/src/Files.App.Controls/Sidebar/SidebarItemDropPosition.cs +++ b/src/Files.App.Controls/Sidebar/SidebarItemDropPosition.cs @@ -12,10 +12,12 @@ public enum SidebarItemDropPosition /// The item was dropped on the top of the sidebar item indicating it should be moved/inserted above this item. /// Top, + /// /// The item was dropped on the bottom of the sidebar item indicating it should be moved/inserted below this item. /// Bottom, + /// /// The item was dropped on the center of the sidebar item indicating it should be moved/inserted as a child of this item. /// diff --git a/src/Files.App.Controls/Sidebar/SidebarView.Events.cs b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs new file mode 100644 index 000000000000..84361d7e96c7 --- /dev/null +++ b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs @@ -0,0 +1,145 @@ +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Microsoft.UI.Input; +using Microsoft.UI.Xaml.Input; +using Windows.System; +using Windows.UI.Core; + +namespace Files.App.Controls +{ + public partial class SidebarView + { + private void SidebarResizer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) + { + DisplayMode = DisplayMode is SidebarDisplayMode.Expanded + ? SidebarDisplayMode.Compact + : SidebarDisplayMode.Expanded; + + e.Handled = true; + } + + private void SidebarResizer_PointerEntered(object sender, PointerRoutedEventArgs e) + { + if (sender is not FrameworkElement sizer) + return; + + sizer.ChangeCursor(InputSystemCursor.Create(InputSystemCursorShape.SizeWestEast)); + + VisualStateManager.GoToState(this, VisualStateName_ResizerPointerOver, true); + e.Handled = true; + } + + private void SidebarResizer_PointerExited(object sender, PointerRoutedEventArgs e) + { + if (_draggingSidebarResizer) + return; + + if (sender is not FrameworkElement sizer) + return; + + sizer.ChangeCursor(InputSystemCursor.Create(InputSystemCursorShape.Arrow)); + + VisualStateManager.GoToState(this, VisualStateName_ResizerNormal, true); + + e.Handled = true; + } + + private void SidebarResizer_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) + { + _draggingSidebarResizer = true; + + _preManipulationPaneWidth = _panePanel?.ActualWidth ?? throw new ArgumentNullException($"{_panePanel} is null."); + + VisualStateManager.GoToState(this, VisualStateName_ResizerPressed, true); + + e.Handled = true; + } + + private void SidebarResizer_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) + { + UpdateDisplayModeForPaneWidth(_preManipulationPaneWidth + e.Cumulative.Translation.X); + + e.Handled = true; + } + + private void SidebarResizer_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) + { + _draggingSidebarResizer = false; + + VisualStateManager.GoToState(this, VisualStateName_ResizerPressed, true); + + e.Handled = true; + } + + private void SidebarResizer_KeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key is not VirtualKey.Space and + not VirtualKey.Enter and + not VirtualKey.Left and + not VirtualKey.Right and + not VirtualKey.Control) + return; + + var primaryInvocation = e.Key is VirtualKey.Space or VirtualKey.Enter; + + if (DisplayMode is SidebarDisplayMode.Expanded) + { + if (primaryInvocation) + { + DisplayMode = SidebarDisplayMode.Compact; + return; + } + + var ctrl = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control); + var increment = ctrl.HasFlag(CoreVirtualKeyStates.Down) ? 5 : 1; + + // Left makes the pane smaller so we invert the increment + if (e.Key == VirtualKey.Left) + increment = -increment; + + var newWidth = OpenPaneLength + increment; + UpdateDisplayModeForPaneWidth(newWidth); + e.Handled = true; + + return; + } + else if (DisplayMode is SidebarDisplayMode.Compact) + { + if (primaryInvocation || e.Key is VirtualKey.Right) + { + DisplayMode = SidebarDisplayMode.Expanded; + e.Handled = true; + } + } + } + + private void PaneLightDismissLayer_PointerPressed(object sender, PointerRoutedEventArgs e) + { + IsPaneOpen = false; + + e.Handled = true; + } + + private void PaneLightDismissLayer_Tapped(object sender, TappedRoutedEventArgs e) + { + IsPaneOpen = false; + + e.Handled = true; + } + + private void PanePanel_ContextRequested(UIElement sender, ContextRequestedEventArgs e) + { + var newArgs = new ItemContextInvokedArgs(null, e.TryGetPosition(this, out var point) ? point : default); + ViewModel?.HandleItemContextInvokedAsync(this, newArgs); + + e.Handled = true; + } + + private void MenuItemsItemsRepeater_ElementPrepared(ItemsRepeater sender, ItemsRepeaterElementPreparedEventArgs args) + { + if (args.Element is SidebarItem sidebarItem) + sidebarItem.HandleItemChange(); + } + } +} diff --git a/src/Files.App.Controls/Sidebar/SidebarView.Properties.cs b/src/Files.App.Controls/Sidebar/SidebarView.Properties.cs index c6dfc8460122..3d1751dcc362 100644 --- a/src/Files.App.Controls/Sidebar/SidebarView.Properties.cs +++ b/src/Files.App.Controls/Sidebar/SidebarView.Properties.cs @@ -1,105 +1,53 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using CommunityToolkit.WinUI; + namespace Files.App.Controls { - public sealed partial class SidebarView + public partial class SidebarView { - public SidebarDisplayMode DisplayMode - { - get { return (SidebarDisplayMode)GetValue(DisplayModeProperty); } - set { SetValue(DisplayModeProperty, value); } - } - public static readonly DependencyProperty DisplayModeProperty = - DependencyProperty.Register(nameof(DisplayMode), typeof(SidebarDisplayMode), typeof(SidebarView), new PropertyMetadata(SidebarDisplayMode.Expanded, OnPropertyChanged)); + [GeneratedDependencyProperty(DefaultValue = SidebarDisplayMode.Expanded)] + public partial SidebarDisplayMode DisplayMode { get; set; } - public UIElement InnerContent - { - get { return (UIElement)GetValue(InnerContentProperty); } - set { SetValue(InnerContentProperty, value); } - } - public static readonly DependencyProperty InnerContentProperty = - DependencyProperty.Register(nameof(InnerContent), typeof(UIElement), typeof(SidebarView), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial UIElement? InnerContent { get; set; } - public UIElement Footer - { - get { return (UIElement)GetValue(FooterProperty); } - set { SetValue(FooterProperty, value); } - } - public static readonly DependencyProperty FooterProperty = - DependencyProperty.Register("Footer", typeof(UIElement), typeof(SidebarView), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial UIElement? Footer { get; set; } - public bool IsPaneOpen - { - get { return (bool)GetValue(IsPaneOpenProperty); } - set { SetValue(IsPaneOpenProperty, value); } - } - public static readonly DependencyProperty IsPaneOpenProperty = - DependencyProperty.Register(nameof(IsPaneOpen), typeof(bool), typeof(SidebarView), new PropertyMetadata(false, OnPropertyChanged)); + [GeneratedDependencyProperty] + public partial bool IsPaneOpen { get; set; } - public double OpenPaneLength - { - get { return (double)GetValue(OpenPaneLengthProperty); } - set - { - SetValue(OpenPaneLengthProperty, value); - NegativeOpenPaneLength = -value; - } - } - public static readonly DependencyProperty OpenPaneLengthProperty = - DependencyProperty.Register(nameof(OpenPaneLength), typeof(double), typeof(SidebarView), new PropertyMetadata(240d, OnPropertyChanged)); + [GeneratedDependencyProperty(DefaultValue = 240d)] + public partial double OpenPaneLength { get; set; } - public double NegativeOpenPaneLength - { - get { return (double)GetValue(NegativeOpenPaneLengthProperty); } - set { SetValue(NegativeOpenPaneLengthProperty, value); } - } - public static readonly DependencyProperty NegativeOpenPaneLengthProperty = - DependencyProperty.Register(nameof(NegativeOpenPaneLength), typeof(double), typeof(SidebarView), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial double NegativeOpenPaneLength { get; set; } - public ISidebarViewModel ViewModel - { - get => (ISidebarViewModel)GetValue(ViewModelProperty); - set => SetValue(ViewModelProperty, value); - } - public static readonly DependencyProperty ViewModelProperty = - DependencyProperty.Register(nameof(ViewModel), typeof(ISidebarViewModel), typeof(SidebarView), new PropertyMetadata(null)); + [GeneratedDependencyProperty] + public partial ISidebarViewModel? ViewModel { get; set; } + + [GeneratedDependencyProperty] + public partial ISidebarItemModel? SelectedItem { get; set; } - public ISidebarItemModel SelectedItem + [GeneratedDependencyProperty] + public partial object? MenuItemsSource { get; set; } + + partial void OnDisplayModeChanged(SidebarDisplayMode newValue) { - get => (ISidebarItemModel)GetValue(SelectedItemProperty); - set - { - SetValue(SelectedItemProperty, value); - } + UpdateDisplayMode(); } - public static readonly DependencyProperty SelectedItemProperty = - DependencyProperty.Register(nameof(SelectedItem), typeof(ISidebarItemModel), typeof(SidebarView), new PropertyMetadata(null)); - public object MenuItemsSource + partial void OnIsPaneOpenChanged(bool newValue) { - get => (object)GetValue(MenuItemsSourceProperty); - set => SetValue(MenuItemsSourceProperty, value); + UpdateMinimalMode(); } - public static readonly DependencyProperty MenuItemsSourceProperty = - DependencyProperty.Register(nameof(MenuItemsSource), typeof(object), typeof(SidebarView), new PropertyMetadata(null)); - public static void OnPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + partial void OnOpenPaneLengthChanged(double newValue) { - if (sender is not SidebarView control) return; - - if (e.Property == OpenPaneLengthProperty) - { - control.UpdateOpenPaneLengthColumn(); - } - else if (e.Property == DisplayModeProperty) - { - control.UpdateDisplayMode(); - } - else if (e.Property == IsPaneOpenProperty) - { - control.UpdateMinimalMode(); - } + UpdateOpenPaneLength(); + NegativeOpenPaneLength = -newValue; } } } diff --git a/src/Files.App.Controls/Sidebar/SidebarView.cs b/src/Files.App.Controls/Sidebar/SidebarView.cs new file mode 100644 index 000000000000..10386a745224 --- /dev/null +++ b/src/Files.App.Controls/Sidebar/SidebarView.cs @@ -0,0 +1,188 @@ +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Microsoft.UI.Input; +using Microsoft.UI.Xaml.Markup; +using Windows.Foundation; + +namespace Files.App.Controls +{ + [ContentProperty(Name = nameof(InnerContent))] + // Template parts + [TemplatePart(Name = TemplatePartName_PanePanel, Type = typeof(Grid))] + [TemplatePart(Name = TemplatePartName_PaneSizer, Type = typeof(Border))] + [TemplatePart(Name = TemplatePartName_PaneLightDismissLayer, Type = typeof(Border))] + [TemplatePart(Name = TemplatePartName_MenuItemsItemsRepeater, Type = typeof(ItemsRepeater))] + // Visual states + [TemplateVisualState(GroupName = VisualStateGroupName_DisplayModes, Name = VisualStateName_Expanded)] + [TemplateVisualState(GroupName = VisualStateGroupName_DisplayModes, Name = VisualStateName_Compact)] + [TemplateVisualState(GroupName = VisualStateGroupName_DisplayModes, Name = VisualStateName_MinimalCollapsed)] + [TemplateVisualState(GroupName = VisualStateGroupName_DisplayModes, Name = VisualStateName_MinimalExpanded)] + [TemplateVisualState(GroupName = VisualStateGroupName_ResizerStates, Name = VisualStateName_ResizerNormal)] + [TemplateVisualState(GroupName = VisualStateGroupName_ResizerStates, Name = VisualStateName_ResizerPointerOver)] + [TemplateVisualState(GroupName = VisualStateGroupName_ResizerStates, Name = VisualStateName_ResizerPressed)] + public partial class SidebarView : Control + { + // Constants + + private const double CompactModeThresholdWidth = 200d; + + private const string TemplatePartName_PanePanel = "PART_PanePanel"; + private const string TemplatePartName_PaneSizer = "PART_PaneResizer"; + private const string TemplatePartName_PaneLightDismissLayer = "PART_PaneLightDismissLayer"; + private const string TemplatePartName_MenuItemsItemsRepeater = "PART_MenuItemsItemsRepeater"; + + private const string VisualStateGroupName_DisplayModes = "DisplayModes"; + private const string VisualStateGroupName_ResizerStates = "ResizerStates"; + + private const string VisualStateName_Expanded = "Expanded"; + private const string VisualStateName_Compact = "Compact"; + private const string VisualStateName_MinimalCollapsed = "MinimalCollapsed"; + private const string VisualStateName_MinimalExpanded = "MinimalExpanded"; + + private const string VisualStateName_ResizerNormal = "ResizerNormal"; + private const string VisualStateName_ResizerPointerOver = "ResizerPointerOver"; + private const string VisualStateName_ResizerPressed = "ResizerPressed"; + + // Events + + public event EventHandler? ItemInvoked; + public event EventHandler? ItemContextInvoked; + public event PropertyChangedEventHandler? PropertyChanged; + + // Fields + + private Grid? _panePanel; + private Border? _paneSizer; + private Border? _paneLightDismissLayer; + private ItemsRepeater? _menuItemsItemsRepeater; + + internal SidebarItem? SelectedItemContainer = null; + + private bool _draggingSidebarResizer; + private double _preManipulationPaneWidth = 0; + + // Constructor + + public SidebarView() + { + DefaultStyleKey = typeof(SidebarView); + } + + // Methods + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + // Get template parts + _panePanel = GetTemplateChild(TemplatePartName_PanePanel) as Grid + ?? throw new MissingFieldException($"Could not find {TemplatePartName_PanePanel} in the given {nameof(SidebarView)}'s style."); + _paneSizer = GetTemplateChild(TemplatePartName_PaneSizer) as Border + ?? throw new MissingFieldException($"Could not find {TemplatePartName_PaneSizer} in the given {nameof(SidebarView)}'s style."); + _paneLightDismissLayer = GetTemplateChild(TemplatePartName_PaneLightDismissLayer) as Border + ?? throw new MissingFieldException($"Could not find {TemplatePartName_PaneLightDismissLayer} in the given {nameof(SidebarView)}'s style."); + _menuItemsItemsRepeater = GetTemplateChild(TemplatePartName_MenuItemsItemsRepeater) as ItemsRepeater + ?? throw new MissingFieldException($"Could not find {TemplatePartName_MenuItemsItemsRepeater} in the given {nameof(SidebarView)}'s style."); + + // Subscribe events + _paneSizer.DoubleTapped += SidebarResizer_DoubleTapped; + _paneSizer.PointerEntered += SidebarResizer_PointerEntered; + _paneSizer.PointerExited += SidebarResizer_PointerExited; + _paneSizer.ManipulationStarted += SidebarResizer_ManipulationStarted; + _paneSizer.ManipulationDelta += SidebarResizer_ManipulationDelta; + _paneSizer.ManipulationCompleted += SidebarResizer_ManipulationCompleted; + _paneSizer.KeyDown += SidebarResizer_KeyDown; + _paneLightDismissLayer.PointerPressed += PaneLightDismissLayer_PointerPressed; + _paneLightDismissLayer.Tapped += PaneLightDismissLayer_Tapped; + _panePanel.ContextRequested += PanePanel_ContextRequested; + _menuItemsItemsRepeater.ElementPrepared += MenuItemsItemsRepeater_ElementPrepared; + + // Initialize visuals + UpdateDisplayMode(); + UpdateOpenPaneLength(); + _panePanel.Translation = new System.Numerics.Vector3(0, 0, 32); + } + + internal void UpdateSelectedItemContainer(SidebarItem container) + { + SelectedItemContainer = container; + } + + internal void RaiseItemInvoked(SidebarItem item, PointerUpdateKind pointerUpdateKind) + { + // Only leaves can be selected + if (item.Item is null || item.IsGroupHeader) return; + + SelectedItem = item.Item; + ItemInvoked?.Invoke(item, item.Item); + ViewModel?.HandleItemInvokedAsync(item.Item, pointerUpdateKind); + } + + internal void RaiseContextRequested(SidebarItem item, Point e) + { + ItemContextInvoked?.Invoke(item, new ItemContextInvokedArgs(item.Item, e)); + ViewModel?.HandleItemContextInvokedAsync(item, new ItemContextInvokedArgs(item.Item, e)); + } + + internal async Task RaiseItemDropped(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent) + { + if (sideBarItem.Item is null || ViewModel is null) return; + await ViewModel.HandleItemDroppedAsync(new ItemDroppedEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent)); + } + + internal async Task RaiseItemDragOver(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent) + { + if (sideBarItem.Item is null || ViewModel is null) return; + await ViewModel.HandleItemDragOverAsync(new ItemDragOverEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent)); + } + + private void UpdateMinimalMode() + { + if (DisplayMode is not SidebarDisplayMode.Minimal) + return; + + VisualStateManager.GoToState(this, IsPaneOpen ? VisualStateName_MinimalExpanded : VisualStateName_MinimalCollapsed, true); + } + + private void UpdateDisplayMode() + { + if (DisplayMode is SidebarDisplayMode.Minimal) + { + IsPaneOpen = false; + UpdateMinimalMode(); + return; + } + + VisualStateManager.GoToState( + this, + DisplayMode switch + { + SidebarDisplayMode.Compact => VisualStateName_Compact, + SidebarDisplayMode.Expanded => VisualStateName_Expanded, + _ => throw new InvalidOperationException("Invalid display mode"), + }, + true); + + } + + private void UpdateDisplayModeForPaneWidth(double newPaneWidth) + { + if (newPaneWidth < CompactModeThresholdWidth) + { + DisplayMode = SidebarDisplayMode.Compact; + } + else if (newPaneWidth > CompactModeThresholdWidth) + { + DisplayMode = SidebarDisplayMode.Expanded; + OpenPaneLength = newPaneWidth; + } + } + + private void UpdateOpenPaneLength() + { + if (_panePanel is not null) + _panePanel.Width = OpenPaneLength; + } + } +} diff --git a/src/Files.App.Controls/Sidebar/SidebarView.xaml b/src/Files.App.Controls/Sidebar/SidebarView.xaml index 9adda0121df6..f844c2b9c8b9 100644 --- a/src/Files.App.Controls/Sidebar/SidebarView.xaml +++ b/src/Files.App.Controls/Sidebar/SidebarView.xaml @@ -1,349 +1,326 @@  - + xmlns:local="using:Files.App.Controls"> - - - - - - + 480 + 4 + 0,60,0,40 + 2 + 2,0,0,0 + 4,8,4,16 - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/Files.App.Controls/Sidebar/SidebarView.xaml.cs b/src/Files.App.Controls/Sidebar/SidebarView.xaml.cs deleted file mode 100644 index 02ed4fdf4c69..000000000000 --- a/src/Files.App.Controls/Sidebar/SidebarView.xaml.cs +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright (c) Files Community -// Licensed under the MIT License. - -using Microsoft.UI.Input; -using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Markup; -using Windows.Foundation; -using Windows.System; -using Windows.UI.Core; - -namespace Files.App.Controls -{ - [ContentProperty(Name = "InnerContent")] - public sealed partial class SidebarView : UserControl, INotifyPropertyChanged - { - private const double COMPACT_MAX_WIDTH = 200; - - public event EventHandler? ItemInvoked; - public event EventHandler? ItemContextInvoked; - public event PropertyChangedEventHandler? PropertyChanged; - - internal SidebarItem? SelectedItemContainer = null; - - private bool draggingSidebarResizer; - private double preManipulationSidebarWidth = 0; - - public SidebarView() - { - InitializeComponent(); - } - - internal void UpdateSelectedItemContainer(SidebarItem container) - { - SelectedItemContainer = container; - } - - internal void RaiseItemInvoked(SidebarItem item, PointerUpdateKind pointerUpdateKind) - { - // Only leaves can be selected - if (item.Item is null || item.IsGroupHeader) return; - - SelectedItem = item.Item; - ItemInvoked?.Invoke(item, item.Item); - ViewModel.HandleItemInvokedAsync(item.Item, pointerUpdateKind); - } - - internal void RaiseContextRequested(SidebarItem item, Point e) - { - ItemContextInvoked?.Invoke(item, new ItemContextInvokedArgs(item.Item, e)); - ViewModel.HandleItemContextInvokedAsync(item, new ItemContextInvokedArgs(item.Item, e)); - } - - internal async Task RaiseItemDropped(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent) - { - if (sideBarItem.Item is null) return; - await ViewModel.HandleItemDroppedAsync(new ItemDroppedEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent)); - } - - internal async Task RaiseItemDragOver(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent) - { - if (sideBarItem.Item is null) return; - await ViewModel.HandleItemDragOverAsync(new ItemDragOverEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent)); - } - - private void UpdateMinimalMode() - { - if (DisplayMode != SidebarDisplayMode.Minimal) return; - - if (IsPaneOpen) - { - VisualStateManager.GoToState(this, "MinimalExpanded", true); - } - else - { - VisualStateManager.GoToState(this, "MinimalCollapsed", true); - } - } - - private void UpdateDisplayMode() - { - switch (DisplayMode) - { - case SidebarDisplayMode.Compact: - VisualStateManager.GoToState(this, "Compact", true); - return; - case SidebarDisplayMode.Expanded: - VisualStateManager.GoToState(this, "Expanded", true); - return; - case SidebarDisplayMode.Minimal: - IsPaneOpen = false; - UpdateMinimalMode(); - return; - } - } - - private void UpdateDisplayModeForPaneWidth(double newPaneWidth) - { - if (newPaneWidth < COMPACT_MAX_WIDTH) - { - DisplayMode = SidebarDisplayMode.Compact; - } - else if (newPaneWidth > COMPACT_MAX_WIDTH) - { - DisplayMode = SidebarDisplayMode.Expanded; - OpenPaneLength = newPaneWidth; - } - } - - private void UpdateOpenPaneLengthColumn() - { - PaneColumnDefinition.Width = new GridLength(OpenPaneLength); - } - - private void SidebarView_Loaded(object sender, RoutedEventArgs e) - { - UpdateDisplayMode(); - UpdateOpenPaneLengthColumn(); - PaneColumnGrid.Translation = new System.Numerics.Vector3(0, 0, 32); - } - - private void SidebarResizer_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) - { - draggingSidebarResizer = true; - preManipulationSidebarWidth = PaneColumnGrid.ActualWidth; - VisualStateManager.GoToState(this, "ResizerPressed", true); - e.Handled = true; - } - - private void SidebarResizer_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) - { - var newWidth = preManipulationSidebarWidth + e.Cumulative.Translation.X; - UpdateDisplayModeForPaneWidth(newWidth); - e.Handled = true; - } - - private void SidebarResizerControl_KeyDown(object sender, KeyRoutedEventArgs e) - { - if - ( - e.Key != VirtualKey.Space && - e.Key != VirtualKey.Enter && - e.Key != VirtualKey.Left && - e.Key != VirtualKey.Right && - e.Key != VirtualKey.Control - ) - return; - - var primaryInvocation = e.Key == VirtualKey.Space || e.Key == VirtualKey.Enter; - if (DisplayMode == SidebarDisplayMode.Expanded) - { - if (primaryInvocation) - { - DisplayMode = SidebarDisplayMode.Compact; - return; - } - - var ctrl = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control); - var increment = ctrl.HasFlag(CoreVirtualKeyStates.Down) ? 5 : 1; - - // Left makes the pane smaller so we invert the increment - if (e.Key == VirtualKey.Left) - increment = -increment; - - var newWidth = OpenPaneLength + increment; - UpdateDisplayModeForPaneWidth(newWidth); - e.Handled = true; - return; - } - else if (DisplayMode == SidebarDisplayMode.Compact) - { - if (primaryInvocation || e.Key == VirtualKey.Right) - { - DisplayMode = SidebarDisplayMode.Expanded; - e.Handled = true; - } - } - } - - private void PaneLightDismissLayer_PointerPressed(object sender, PointerRoutedEventArgs e) - { - IsPaneOpen = false; - e.Handled = true; - } - - private void PaneLightDismissLayer_Tapped(object sender, TappedRoutedEventArgs e) - { - IsPaneOpen = false; - e.Handled = true; - } - - private void SidebarResizer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) - { - if (DisplayMode == SidebarDisplayMode.Expanded) - { - DisplayMode = SidebarDisplayMode.Compact; - e.Handled = true; - } - else - { - DisplayMode = SidebarDisplayMode.Expanded; - e.Handled = true; - } - } - - private void SidebarResizer_PointerEntered(object sender, PointerRoutedEventArgs e) - { - var sidebarResizer = (FrameworkElement)sender; - sidebarResizer.ChangeCursor(InputSystemCursor.Create(InputSystemCursorShape.SizeWestEast)); - VisualStateManager.GoToState(this, "ResizerPointerOver", true); - e.Handled = true; - } - - private void SidebarResizer_PointerExited(object sender, PointerRoutedEventArgs e) - { - if (draggingSidebarResizer) - return; - - var sidebarResizer = (FrameworkElement)sender; - sidebarResizer.ChangeCursor(InputSystemCursor.Create(InputSystemCursorShape.Arrow)); - VisualStateManager.GoToState(this, "ResizerNormal", true); - e.Handled = true; - } - - private void SidebarResizer_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) - { - draggingSidebarResizer = false; - VisualStateManager.GoToState(this, "ResizerNormal", true); - e.Handled = true; - } - - private void PaneColumnGrid_ContextRequested(UIElement sender, ContextRequestedEventArgs e) - { - var newArgs = new ItemContextInvokedArgs(null, e.TryGetPosition(this, out var point) ? point : default); - ViewModel.HandleItemContextInvokedAsync(this, newArgs); - e.Handled = true; - } - - private void MenuItemsHost_ElementPrepared(ItemsRepeater sender, ItemsRepeaterElementPreparedEventArgs args) - { - if (args.Element is SidebarItem sidebarItem) - { - sidebarItem.HandleItemChange(); - } - } - } -} diff --git a/src/Files.App.Controls/Sidebar/SidebarViewAutomationPeer.cs b/src/Files.App.Controls/Sidebar/SidebarViewAutomationPeer.cs index 94c98558942e..efbb2ae233b4 100644 --- a/src/Files.App.Controls/Sidebar/SidebarViewAutomationPeer.cs +++ b/src/Files.App.Controls/Sidebar/SidebarViewAutomationPeer.cs @@ -6,6 +6,9 @@ namespace Files.App.Controls { + /// + /// Automation peer for . + /// public sealed partial class SidebarViewAutomationPeer : FrameworkElementAutomationPeer, ISelectionProvider { public bool CanSelectMultiple => false; @@ -20,21 +23,16 @@ public SidebarViewAutomationPeer(SidebarView owner) : base(owner) protected override object GetPatternCore(PatternInterface patternInterface) { - if (patternInterface == PatternInterface.Selection) - { - return this; - } - return base.GetPatternCore(patternInterface); + return patternInterface is PatternInterface.Selection + ? this + : base.GetPatternCore(patternInterface); } public IRawElementProviderSimple[] GetSelection() { - if (Owner.SelectedItemContainer != null) - return - [ - ProviderFromPeer(CreatePeerForElement(Owner.SelectedItemContainer)) - ]; - return []; + return Owner.SelectedItemContainer is null + ? [] + : [ProviderFromPeer(CreatePeerForElement(Owner.SelectedItemContainer))]; } } } diff --git a/src/Files.App.Controls/Themes/Generic.xaml b/src/Files.App.Controls/Themes/Generic.xaml index 895bc9763802..b4bfd39aff49 100644 --- a/src/Files.App.Controls/Themes/Generic.xaml +++ b/src/Files.App.Controls/Themes/Generic.xaml @@ -55,7 +55,8 @@ - + + diff --git a/src/Files.App/Views/MainPage.xaml b/src/Files.App/Views/MainPage.xaml index d13211e23e3b..4043644ec030 100644 --- a/src/Files.App/Views/MainPage.xaml +++ b/src/Files.App/Views/MainPage.xaml @@ -161,6 +161,7 @@ Grid.Row="2" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" + Background="{ThemeResource App.Theme.Sidebar.BackgroundBrush}" DisplayMode="{x:Bind SidebarAdaptiveViewModel.SidebarDisplayMode, Mode=TwoWay}" IsPaneOpen="{x:Bind ViewModel.IsSidebarPaneOpen, Mode=TwoWay}" Loaded="SidebarControl_Loaded" @@ -173,6 +174,7 @@ diff --git a/tests/Files.App.UITests/TestData/TestSidebarModel.cs b/tests/Files.App.UITests/Data/TestSidebarModel.cs similarity index 76% rename from tests/Files.App.UITests/TestData/TestSidebarModel.cs rename to tests/Files.App.UITests/Data/TestSidebarModel.cs index 84313019676a..f4bf661be480 100644 --- a/tests/Files.App.UITests/TestData/TestSidebarModel.cs +++ b/tests/Files.App.UITests/Data/TestSidebarModel.cs @@ -1,8 +1,11 @@ -using Files.App.Controls; +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Files.App.Controls; using Microsoft.UI.Xaml.Controls; using System.ComponentModel; -namespace Files.App.UITests.TestData +namespace Files.App.UITests.Data { class TestSidebarModel : ISidebarItemModel { diff --git a/tests/Files.App.UITests/TestData/TestSidebarViewModel.cs b/tests/Files.App.UITests/Data/TestSidebarViewModel.cs similarity index 83% rename from tests/Files.App.UITests/TestData/TestSidebarViewModel.cs rename to tests/Files.App.UITests/Data/TestSidebarViewModel.cs index be26cdae9136..84aed902a0a5 100644 --- a/tests/Files.App.UITests/TestData/TestSidebarViewModel.cs +++ b/tests/Files.App.UITests/Data/TestSidebarViewModel.cs @@ -1,9 +1,12 @@ -using Files.App.Controls; +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Files.App.Controls; using Microsoft.UI.Input; using System.Collections.ObjectModel; using System.Threading.Tasks; -namespace Files.App.UITests.TestData +namespace Files.App.UITests.Data { class TestSidebarViewModel : ISidebarViewModel { diff --git a/tests/Files.App.UITests/Views/SidebarViewPage.xaml b/tests/Files.App.UITests/Views/SidebarViewPage.xaml index 26182a5172ca..691a739e0353 100644 --- a/tests/Files.App.UITests/Views/SidebarViewPage.xaml +++ b/tests/Files.App.UITests/Views/SidebarViewPage.xaml @@ -6,8 +6,15 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="using:Files.App.UITests.Views" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="d"> - + + + + + + + + + diff --git a/tests/Files.App.UITests/Views/SidebarViewPage.xaml.cs b/tests/Files.App.UITests/Views/SidebarViewPage.xaml.cs index 3c1050de8615..8276d767e0a7 100644 --- a/tests/Files.App.UITests/Views/SidebarViewPage.xaml.cs +++ b/tests/Files.App.UITests/Views/SidebarViewPage.xaml.cs @@ -1,4 +1,7 @@ -using Files.App.UITests.TestData; +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Files.App.UITests.Data; using Microsoft.UI.Xaml.Controls; using System.Collections.ObjectModel; @@ -6,15 +9,18 @@ namespace Files.App.UITests.Views { public sealed partial class SidebarViewPage : Page { - private ObservableCollection sidebarModels = new(); + private ObservableCollection SidebarViewItems; public SidebarViewPage() { InitializeComponent(); - sidebarModels.Add(new TestSidebarModel { Text = "Test 1" }); - sidebarModels.Add(new TestSidebarModel { Text = "Test 2" }); - sidebarModels.Add(new TestSidebarModel { Text = "Test 3" }); + SidebarViewItems = + [ + new TestSidebarModel { Text = "Test 1" }, + new TestSidebarModel { Text = "Test 2" }, + new TestSidebarModel { Text = "Test 3" } + ]; Sidebar.ViewModel = new TestSidebarViewModel(); } From 1ca5a195266f3631af82df5ecfcb44de82b336d6 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:28:45 +0900 Subject: [PATCH 2/3] Update leftovers --- .../Sidebar/SidebarItemAutomationPeer.cs | 7 +++++-- src/Files.App.Controls/Sidebar/SidebarView.Events.cs | 2 +- src/Files.App.Controls/Util.cs | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs b/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs index e823bc7e918f..db3fade37c83 100644 --- a/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs +++ b/src/Files.App.Controls/Sidebar/SidebarItemAutomationPeer.cs @@ -9,6 +9,9 @@ namespace Files.App.Controls { + /// + /// Automation peer for . + /// public sealed partial class SidebarItemAutomationPeer : FrameworkElementAutomationPeer, IInvokeProvider, IExpandCollapseProvider, ISelectionItemProvider { public ExpandCollapseState ExpandCollapseState => @@ -39,11 +42,11 @@ protected override string GetNameCore() protected override object GetPatternCore(PatternInterface patternInterface) { - if (patternInterface == PatternInterface.Invoke || patternInterface == PatternInterface.SelectionItem) + if (patternInterface is PatternInterface.Invoke or PatternInterface.SelectionItem) { return this; } - else if (patternInterface == PatternInterface.ExpandCollapse) + else if (patternInterface is PatternInterface.ExpandCollapse) { if (Owner.CollapseEnabled) return this; diff --git a/src/Files.App.Controls/Sidebar/SidebarView.Events.cs b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs index 84361d7e96c7..99b5c92a6853 100644 --- a/src/Files.App.Controls/Sidebar/SidebarView.Events.cs +++ b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs @@ -95,7 +95,7 @@ not VirtualKey.Right and var increment = ctrl.HasFlag(CoreVirtualKeyStates.Down) ? 5 : 1; // Left makes the pane smaller so we invert the increment - if (e.Key == VirtualKey.Left) + if (e.Key is VirtualKey.Left) increment = -increment; var newWidth = OpenPaneLength + increment; diff --git a/src/Files.App.Controls/Util.cs b/src/Files.App.Controls/Util.cs index e9866d156880..0580fac871c5 100644 --- a/src/Files.App.Controls/Util.cs +++ b/src/Files.App.Controls/Util.cs @@ -1,4 +1,7 @@ -using Microsoft.UI.Input; +// Copyright (c) Files Community +// Licensed under the MIT License. + +using Microsoft.UI.Input; using System.Reflection; namespace Files.App.Controls From 8465d336dd74f302ceb067c5afb44a3bb8800370 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Tue, 18 Mar 2025 21:33:06 +0900 Subject: [PATCH 3/3] Fixed naming of event methods --- .../Sidebar/SidebarView.Events.cs | 14 +++++++------- src/Files.App.Controls/Sidebar/SidebarView.cs | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Files.App.Controls/Sidebar/SidebarView.Events.cs b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs index 99b5c92a6853..b11a62f897d2 100644 --- a/src/Files.App.Controls/Sidebar/SidebarView.Events.cs +++ b/src/Files.App.Controls/Sidebar/SidebarView.Events.cs @@ -10,7 +10,7 @@ namespace Files.App.Controls { public partial class SidebarView { - private void SidebarResizer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) + private void PaneResizer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) { DisplayMode = DisplayMode is SidebarDisplayMode.Expanded ? SidebarDisplayMode.Compact @@ -19,7 +19,7 @@ private void SidebarResizer_DoubleTapped(object sender, DoubleTappedRoutedEventA e.Handled = true; } - private void SidebarResizer_PointerEntered(object sender, PointerRoutedEventArgs e) + private void PaneResizer_PointerEntered(object sender, PointerRoutedEventArgs e) { if (sender is not FrameworkElement sizer) return; @@ -30,7 +30,7 @@ private void SidebarResizer_PointerEntered(object sender, PointerRoutedEventArgs e.Handled = true; } - private void SidebarResizer_PointerExited(object sender, PointerRoutedEventArgs e) + private void PaneResizer_PointerExited(object sender, PointerRoutedEventArgs e) { if (_draggingSidebarResizer) return; @@ -45,7 +45,7 @@ private void SidebarResizer_PointerExited(object sender, PointerRoutedEventArgs e.Handled = true; } - private void SidebarResizer_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) + private void PaneResizer_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) { _draggingSidebarResizer = true; @@ -56,14 +56,14 @@ private void SidebarResizer_ManipulationStarted(object sender, ManipulationStart e.Handled = true; } - private void SidebarResizer_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) + private void PaneResizer_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { UpdateDisplayModeForPaneWidth(_preManipulationPaneWidth + e.Cumulative.Translation.X); e.Handled = true; } - private void SidebarResizer_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) + private void PaneResizer_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) { _draggingSidebarResizer = false; @@ -72,7 +72,7 @@ private void SidebarResizer_ManipulationCompleted(object sender, ManipulationCom e.Handled = true; } - private void SidebarResizer_KeyDown(object sender, KeyRoutedEventArgs e) + private void PaneResizer_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key is not VirtualKey.Space and not VirtualKey.Enter and diff --git a/src/Files.App.Controls/Sidebar/SidebarView.cs b/src/Files.App.Controls/Sidebar/SidebarView.cs index 10386a745224..30343c2a4b5e 100644 --- a/src/Files.App.Controls/Sidebar/SidebarView.cs +++ b/src/Files.App.Controls/Sidebar/SidebarView.cs @@ -86,13 +86,13 @@ protected override void OnApplyTemplate() ?? throw new MissingFieldException($"Could not find {TemplatePartName_MenuItemsItemsRepeater} in the given {nameof(SidebarView)}'s style."); // Subscribe events - _paneSizer.DoubleTapped += SidebarResizer_DoubleTapped; - _paneSizer.PointerEntered += SidebarResizer_PointerEntered; - _paneSizer.PointerExited += SidebarResizer_PointerExited; - _paneSizer.ManipulationStarted += SidebarResizer_ManipulationStarted; - _paneSizer.ManipulationDelta += SidebarResizer_ManipulationDelta; - _paneSizer.ManipulationCompleted += SidebarResizer_ManipulationCompleted; - _paneSizer.KeyDown += SidebarResizer_KeyDown; + _paneSizer.DoubleTapped += PaneResizer_DoubleTapped; + _paneSizer.PointerEntered += PaneResizer_PointerEntered; + _paneSizer.PointerExited += PaneResizer_PointerExited; + _paneSizer.ManipulationStarted += PaneResizer_ManipulationStarted; + _paneSizer.ManipulationDelta += PaneResizer_ManipulationDelta; + _paneSizer.ManipulationCompleted += PaneResizer_ManipulationCompleted; + _paneSizer.KeyDown += PaneResizer_KeyDown; _paneLightDismissLayer.PointerPressed += PaneLightDismissLayer_PointerPressed; _paneLightDismissLayer.Tapped += PaneLightDismissLayer_Tapped; _panePanel.ContextRequested += PanePanel_ContextRequested;