Skip to content

Commit 7c93e46

Browse files
committed
Implemented populating drop down flyout
1 parent 5eccf7a commit 7c93e46

File tree

7 files changed

+60
-51
lines changed

7 files changed

+60
-51
lines changed

src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ public sealed partial class BreadcrumbBar : Control
2929

3030
// Events
3131

32-
/// <summary>
33-
/// Occurs when an item is clicked in this <see cref="BreadcrumbBar"/> instance.
34-
/// </summary>
3532
public event TypedEventHandler<BreadcrumbBar, BreadcrumbBarItemClickedEventArgs>? ItemClicked;
33+
public event EventHandler<BreadcrumbBarItemDropDownFlyoutEventArgs>? ItemDropDownFlyoutOpening;
34+
public event EventHandler<BreadcrumbBarItemDropDownFlyoutEventArgs>? ItemDropDownFlyoutClosed;
3635

3736
// Constructor
3837

@@ -64,6 +63,18 @@ internal void RaiseItemClickedEvent(BreadcrumbBarItem item)
6463
ItemClicked?.Invoke(this, eventArgs);
6564
}
6665

66+
internal void RaiseItemDropDownFlyoutOpening(BreadcrumbBarItem item, MenuFlyout flyout)
67+
{
68+
var index = _itemsRepeater.GetElementIndex(item);
69+
ItemDropDownFlyoutOpening?.Invoke(this, new(item, index, flyout));
70+
}
71+
72+
internal void RaiseItemDropDownFlyoutClosed(BreadcrumbBarItem item, MenuFlyout flyout)
73+
{
74+
var index = _itemsRepeater.GetElementIndex(item);
75+
ItemDropDownFlyoutClosed?.Invoke(this, new(item, index, flyout));
76+
}
77+
6778
// Event methods
6879

6980
private void ItemsRepeater_ElementPrepared(ItemsRepeater sender, ItemsRepeaterElementPreparedEventArgs args)

src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,16 @@ public sealed partial class BreadcrumbBarItem : ContentControl
1515
{
1616
private void ItemButton_PointerEntered(object sender, PointerRoutedEventArgs e)
1717
{
18-
_pointerOverItem = true;
19-
_pointerPressedOnItem = false;
20-
2118
VisualStateManager.GoToState(this, "PointerOverItem", true);
2219
}
2320

2421
private void ItemButton_PointerPressed(object sender, PointerRoutedEventArgs e)
2522
{
26-
_pointerOverItem = false;
27-
_pointerPressedOnItem = true;
28-
2923
VisualStateManager.GoToState(this, "PointerPressedOnItem", true);
3024
}
3125

3226
private void ItemButton_PointerReleased(object sender, PointerRoutedEventArgs e)
3327
{
34-
_pointerOverItem = true;
35-
_pointerPressedOnItem = false;
36-
3728
if (_ownerRef?.TryGetTarget(out var breadcrumbBar) ?? false)
3829
breadcrumbBar.RaiseItemClickedEvent(this);
3930

@@ -42,47 +33,39 @@ private void ItemButton_PointerReleased(object sender, PointerRoutedEventArgs e)
4233

4334
private void ItemButton_PointerExited(object sender, PointerRoutedEventArgs e)
4435
{
45-
_pointerOverItem = _pointerPressedOnItem = false;
46-
4736
VisualStateManager.GoToState(this, "PointerNormal", true);
4837
}
4938

5039
private void ChevronButton_PointerEntered(object sender, PointerRoutedEventArgs e)
5140
{
52-
_pointerOverChevron = true;
53-
_pointerPressedOnChevron = false;
54-
5541
VisualStateManager.GoToState(this, "PointerOverChevron", true);
5642
}
5743

5844
private void ChevronButton_PointerPressed(object sender, PointerRoutedEventArgs e)
5945
{
60-
_pointerOverChevron = false;
61-
_pointerPressedOnChevron = true;
62-
6346
VisualStateManager.GoToState(this, "PointerPressedOnChevron", true);
6447
}
6548

6649
private void ChevronButton_PointerReleased(object sender, PointerRoutedEventArgs e)
6750
{
68-
_pointerOverChevron = true;
69-
_pointerPressedOnChevron = false;
70-
7151
VisualStateManager.GoToState(this, "PointerOverChevron", true);
7252

7353
TryOpenFlyout();
7454
}
7555

7656
private void ChevronButton_PointerExited(object sender, PointerRoutedEventArgs e)
7757
{
78-
_pointerOverChevron = _pointerPressedOnChevron = false;
79-
8058
VisualStateManager.GoToState(this, "PointerNormal", true);
8159
}
8260

8361
private void ChevronDropDownMenuFlyout_Opening(object? sender, object e)
8462
{
85-
Opening?.Invoke(sender, e);
63+
if (_ownerRef is null ||
64+
_ownerRef.TryGetTarget(out var breadcrumbBar) is false ||
65+
sender is not MenuFlyout flyout)
66+
return;
67+
68+
breadcrumbBar.RaiseItemDropDownFlyoutOpening(this, flyout);
8669
}
8770

8871
private void ChevronDropDownMenuFlyout_Opened(object? sender, object e)
@@ -92,7 +75,12 @@ private void ChevronDropDownMenuFlyout_Opened(object? sender, object e)
9275

9376
private void ChevronDropDownMenuFlyout_Closed(object? sender, object e)
9477
{
95-
Closed?.Invoke(sender, e);
78+
if (_ownerRef is null ||
79+
_ownerRef.TryGetTarget(out var breadcrumbBar) is false ||
80+
sender is not MenuFlyout flyout)
81+
return;
82+
83+
breadcrumbBar.RaiseItemDropDownFlyoutClosed(this, flyout);
9684

9785
VisualStateManager.GoToState(this, "ChevronNormalOff", true);
9886
VisualStateManager.GoToState(this, "PointerNormal", true);

src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Microsoft.UI.Xaml.Markup;
99
using Microsoft.UI.Xaml.Media;
1010
using Microsoft.UI.Xaml.Shapes;
11-
using Windows.Foundation;
1211

1312
namespace Files.App.Controls
1413
{
@@ -28,16 +27,6 @@ public sealed partial class BreadcrumbBarItem : ContentControl
2827
private Border _chevronButton = null!;
2928
private MenuFlyout _chevronDropDownMenuFlyout = null!;
3029

31-
private bool _pointerOverItem;
32-
private bool _pointerOverChevron;
33-
private bool _pointerPressedOnItem;
34-
private bool _pointerPressedOnChevron;
35-
36-
// Events
37-
38-
public event EventHandler<object>? Opening;
39-
public event EventHandler<object>? Closed;
40-
4130
// Constructor
4231

4332
public BreadcrumbBarItem()
@@ -71,19 +60,13 @@ protected override void OnApplyTemplate()
7160
_chevronDropDownMenuFlyout.Opening += ChevronDropDownMenuFlyout_Opening;
7261
_chevronDropDownMenuFlyout.Opened += ChevronDropDownMenuFlyout_Opened; ;
7362
_chevronDropDownMenuFlyout.Closed += ChevronDropDownMenuFlyout_Closed;
74-
75-
UpdateVisualStates();
7663
}
7764

7865
internal void SetOwner(BreadcrumbBar breadcrumbBar)
7966
{
8067
_ownerRef = new(breadcrumbBar);
8168
}
8269

83-
private void UpdateVisualStates()
84-
{
85-
}
86-
8770
private void TryOpenFlyout()
8871
{
8972
FlyoutBase.ShowAttachedFlyout(_chevronButton);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
namespace Files.App.Controls
5+
{
6+
public record class BreadcrumbBarItemDropDownFlyoutEventArgs(BreadcrumbBarItem Item, int Index, MenuFlyout Flyout);
7+
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Files Community
22
// Licensed under the MIT License.
33

4-
using CommunityToolkit.WinUI;
54
using Microsoft.UI;
65
using Microsoft.UI.Xaml;
76
using Microsoft.UI.Xaml.Controls;
@@ -12,10 +11,13 @@
1211

1312
namespace Files.App.Controls
1413
{
15-
internal class BreadcrumbBarLayout
14+
public partial class BreadcrumbBarLayout : NonVirtualizingLayout
1615
{
17-
internal BreadcrumbBarLayout(BreadcrumbBar breadcrumb)
16+
private WeakReference<BreadcrumbBar>? _ownerRef;
17+
18+
public BreadcrumbBarLayout(BreadcrumbBar breadcrumb)
1819
{
20+
_ownerRef = new(breadcrumb);
1921
}
2022
}
2123
}

tests/Files.App.UITests/Views/BreadcrumbBarPage.xaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
x:Name="BreadcrumbBar1"
2727
FlowDirection="{x:Bind BreadcrumbBar1FlowDirection, Mode=OneWay}"
2828
ItemClicked="BreadcrumbBar1_ItemClicked"
29-
ItemsSource="{x:Bind DummyItems2, Mode=OneWay}">
29+
ItemDropDownFlyoutClosed="BreadcrumbBar1_ItemDropDownFlyoutClosed"
30+
ItemDropDownFlyoutOpening="BreadcrumbBar1_ItemDropDownFlyoutOpening"
31+
ItemsSource="{x:Bind DummyItems, Mode=OneWay}">
3032
<controls:BreadcrumbBar.ItemTemplate>
3133
<DataTemplate x:DataType="data:DummyItem2">
3234
<controls:BreadcrumbBarItem Content="{x:Bind}">

tests/Files.App.UITests/Views/BreadcrumbBarPage.xaml.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using CommunityToolkit.WinUI;
5+
using Files.App.Controls;
56
using Files.App.UITests.Data;
67
using Microsoft.UI.Xaml;
78
using Microsoft.UI.Xaml.Controls;
@@ -11,7 +12,7 @@ namespace Files.App.UITests.Views
1112
{
1213
public sealed partial class BreadcrumbBarPage : Page
1314
{
14-
private readonly ObservableCollection<DummyItem2> DummyItems2;
15+
private readonly ObservableCollection<DummyItem2> DummyItems;
1516

1617
[GeneratedDependencyProperty]
1718
private partial string? ClickedItemName { get; set; }
@@ -26,7 +27,7 @@ public BreadcrumbBarPage()
2627
{
2728
InitializeComponent();
2829

29-
DummyItems2 =
30+
DummyItems =
3031
[
3132
new("Local Disk (C:)"),
3233
new("Users"),
@@ -40,7 +41,22 @@ public BreadcrumbBarPage()
4041

4142
private void BreadcrumbBar1_ItemClicked(Controls.BreadcrumbBar sender, Controls.BreadcrumbBarItemClickedEventArgs args)
4243
{
43-
ClickedItemName = DummyItems2[args.Index].Text;
44+
ClickedItemName = DummyItems[args.Index].Text;
45+
}
46+
47+
private void BreadcrumbBar1_ItemDropDownFlyoutOpening(object sender, BreadcrumbBarItemDropDownFlyoutEventArgs e)
48+
{
49+
if (sender is not Controls.BreadcrumbBar breadcrumbBar)
50+
return;
51+
52+
e.Flyout.Items.Add(new MenuFlyoutItem { Icon = new FontIcon() { Glyph = "\uE8B7" }, Text = "Item 1" });
53+
e.Flyout.Items.Add(new MenuFlyoutItem { Icon = new FontIcon() { Glyph = "\uE8B7" }, Text = "Item 2" });
54+
e.Flyout.Items.Add(new MenuFlyoutItem { Icon = new FontIcon() { Glyph = "\uE8B7" }, Text = "Item 3" });
55+
}
56+
57+
private void BreadcrumbBar1_ItemDropDownFlyoutClosed(object sender, BreadcrumbBarItemDropDownFlyoutEventArgs e)
58+
{
59+
e.Flyout.Items.Clear();
4460
}
4561

4662
partial void OnIsRTLEnabledChanged(bool newValue)

0 commit comments

Comments
 (0)