Skip to content

Commit cab9938

Browse files
committed
Created action groups
1 parent b1390c5 commit cab9938

File tree

6 files changed

+289
-128
lines changed

6 files changed

+289
-128
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using Files.App.Data.Commands;
5+
using Microsoft.UI.Xaml;
6+
using Microsoft.UI.Xaml.Controls;
7+
8+
namespace Files.App.Actions;
9+
10+
public abstract class CommandGroup
11+
{
12+
public abstract string DisplayName { get; }
13+
public abstract RichGlyph Glyph { get; }
14+
public abstract IReadOnlyList<CommandCodes> Commands { get; }
15+
16+
public object? Icon
17+
=> Glyph.ToIcon();
18+
19+
public FontIcon? FontIcon
20+
=> Glyph.ToFontIcon();
21+
22+
public Style? ThemedIconStyle
23+
=> Glyph.ToThemedIconStyle();
24+
}
25+
26+
internal sealed class ExtractCommandGroup : CommandGroup
27+
{
28+
public override string DisplayName
29+
=> Strings.Extract.GetLocalizedResource();
30+
31+
public override RichGlyph Glyph
32+
=> new(themedIconStyle: "App.ThemedIcons.Zip");
33+
34+
public override IReadOnlyList<CommandCodes> Commands =>
35+
[
36+
CommandCodes.DecompressArchive,
37+
CommandCodes.DecompressArchiveHereSmart,
38+
CommandCodes.DecompressArchiveHere,
39+
CommandCodes.DecompressArchiveToChildFolder,
40+
];
41+
}
42+
43+
internal sealed class SetAsCommandGroup : CommandGroup
44+
{
45+
public override string DisplayName
46+
=> Strings.SetAsBackgroundFlyout.GetLocalizedResource();
47+
48+
public override RichGlyph Glyph
49+
=> new(themedIconStyle: "App.ThemedIcons.SetWallpaper.16");
50+
51+
public override IReadOnlyList<CommandCodes> Commands =>
52+
[
53+
CommandCodes.SetAsWallpaperBackground,
54+
CommandCodes.SetAsLockscreenBackground,
55+
CommandCodes.SetAsAppBackground,
56+
];
57+
}
58+
59+
internal sealed class NewItemCommandGroup : CommandGroup
60+
{
61+
public override string DisplayName
62+
=> Strings.BaseLayoutContextFlyoutNew_Label.GetLocalizedResource();
63+
64+
public override RichGlyph Glyph
65+
=> new(themedIconStyle: "App.ThemedIcons.New.Item");
66+
67+
public override IReadOnlyList<CommandCodes> Commands =>
68+
[
69+
CommandCodes.CreateFolder,
70+
CommandCodes.CreateFile,
71+
CommandCodes.CreateShortcutFromDialog,
72+
];
73+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
namespace Files.App.Actions
5+
{
6+
[GeneratedRichCommand]
7+
internal sealed partial class CreateFileAction : BaseUIAction, IAction
8+
{
9+
private readonly IContentPageContext context;
10+
11+
public string Label
12+
=> Strings.File.GetLocalizedResource();
13+
14+
public string Description
15+
=> Strings.NewFile.GetLocalizedResource();
16+
17+
public RichGlyph Glyph
18+
=> new(baseGlyph: "\uE7C3");
19+
20+
public override bool IsExecutable =>
21+
context.CanCreateItem &&
22+
UIHelpers.CanShowDialog;
23+
24+
public CreateFileAction()
25+
{
26+
context = Ioc.Default.GetRequiredService<IContentPageContext>();
27+
28+
context.PropertyChanged += Context_PropertyChanged;
29+
}
30+
31+
public Task ExecuteAsync(object? parameter = null)
32+
{
33+
if (context.ShellPage is not null)
34+
_ = UIFilesystemHelpers.CreateFileFromDialogResultTypeAsync(AddItemDialogItemType.File, null, context.ShellPage);
35+
36+
return Task.CompletedTask;
37+
}
38+
39+
private void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
40+
{
41+
switch (e.PropertyName)
42+
{
43+
case nameof(IContentPageContext.CanCreateItem):
44+
case nameof(IContentPageContext.HasSelection):
45+
OnPropertyChanged(nameof(IsExecutable));
46+
break;
47+
}
48+
}
49+
}
50+
}

src/Files.App/Data/Commands/Manager/CommandManager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Files Community
22
// Licensed under the MIT License.
33

4+
using Files.App.Actions;
45
using Microsoft.Extensions.Logging;
56
using System.Collections.Immutable;
67

@@ -25,6 +26,8 @@ public IRichCommand this[HotKey hotKey]
2526
: _allKeyBindings.TryGetValue(hotKey with { IsVisible = false }, out command) ? command
2627
: None;
2728

29+
public CommandGroups Groups { get; } = new();
30+
2831
public CommandManager()
2932
{
3033
_commands = CreateCommands();

src/Files.App/UserControls/Toolbar.xaml

Lines changed: 14 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -93,40 +93,6 @@
9393
x:Name="NewEmptySpace"
9494
Opening="NewEmptySpace_Opening"
9595
Placement="BottomEdgeAlignedLeft">
96-
<MenuFlyoutItem
97-
x:Name="ToolbarNewFolderItem"
98-
AccessKey="D"
99-
AutomationProperties.AutomationId="InnerNavigationToolbarNewFolderButton"
100-
Command="{x:Bind Commands.CreateFolder, Mode=OneWay}"
101-
KeyboardAcceleratorTextOverride="{x:Bind Commands.CreateFolder.HotKeyText, Mode=OneWay}"
102-
Text="{x:Bind Commands.CreateFolder.Label}">
103-
<MenuFlyoutItem.Icon>
104-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="&#xE8B7;" />
105-
</MenuFlyoutItem.Icon>
106-
</MenuFlyoutItem>
107-
<MenuFlyoutItem
108-
x:Name="NewFile"
109-
AccessKey="F"
110-
AutomationProperties.AutomationId="File"
111-
Command="{x:Bind ViewModel.CreateNewFileCommand, Mode=OneWay}"
112-
CommandParameter="{x:Null}"
113-
IsEnabled="{x:Bind ViewModel.InstanceViewModel.CanCreateFileInPage, Mode=OneWay}"
114-
Text="{helpers:ResourceString Name=File}">
115-
<MenuFlyoutItem.Icon>
116-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="&#xE7C3;" />
117-
</MenuFlyoutItem.Icon>
118-
</MenuFlyoutItem>
119-
<MenuFlyoutItem
120-
x:Name="NewShortcut"
121-
AccessKey="S"
122-
AutomationProperties.AutomationId="InnerNavigationToolbarNewShortcutButton"
123-
Command="{x:Bind Commands.CreateShortcutFromDialog, Mode=OneWay}"
124-
KeyboardAcceleratorTextOverride="{x:Bind Commands.CreateShortcutFromDialog.HotKeyText, Mode=OneWay}"
125-
Text="{x:Bind Commands.CreateShortcutFromDialog.Label}">
126-
<MenuFlyoutItem.Icon>
127-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="&#xE71B;" />
128-
</MenuFlyoutItem.Icon>
129-
</MenuFlyoutItem>
13096
<MenuFlyoutSeparator x:Name="NewMenuFileFolderSeparator" />
13197
</MenuFlyout>
13298
</AppBarButton.Flyout>
@@ -291,38 +257,19 @@
291257
AccessKey="Z"
292258
AccessKeyInvoked="AppBarButton_AccessKeyInvoked"
293259
IsEnabled="{x:Bind ViewModel.CanExtract, Mode=OneWay, FallbackValue=False}"
294-
Label="{helpers:ResourceString Name=Extract}"
260+
Label="{x:Bind Commands.Groups.Extract.DisplayName}"
295261
LabelPosition="Default"
296262
Style="{StaticResource ToolBarAppBarButtonFlyoutStyle}"
297263
Visibility="{x:Bind ViewModel.CanExtract, Mode=OneWay}">
298264

299-
<controls:ThemedIcon Style="{StaticResource App.ThemedIcons.Zip}" />
265+
<controls:ThemedIcon Style="{x:Bind Commands.Groups.Extract.ThemedIconStyle}" />
300266

301267
<AppBarButton.Flyout>
302-
<MenuFlyout helpers:MenuFlyoutHelper.IsVisible="{x:Bind ViewModel.CanExtract, Mode=OneWay}" Placement="Bottom">
303-
<MenuFlyoutItem
304-
x:Name="ExtractSingle"
305-
Command="{x:Bind Commands.DecompressArchive, Mode=OneWay}"
306-
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchive.HotKeyText, Mode=OneWay}"
307-
Text="{x:Bind Commands.DecompressArchive.Label}"
308-
Visibility="{x:Bind Commands.DecompressArchive.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
309-
<MenuFlyoutItem
310-
x:Name="ExtractHereSmart"
311-
Command="{x:Bind Commands.DecompressArchiveHereSmart, Mode=OneWay}"
312-
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchiveHereSmart.HotKeyText, Mode=OneWay}"
313-
Text="{x:Bind Commands.DecompressArchiveHereSmart.Label}"
314-
Visibility="{x:Bind Commands.DecompressArchiveHereSmart.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
315-
<MenuFlyoutItem
316-
x:Name="ExtractHere"
317-
Command="{x:Bind Commands.DecompressArchiveHere, Mode=OneWay}"
318-
Text="{x:Bind Commands.DecompressArchiveHere.Label}"
319-
Visibility="{x:Bind Commands.DecompressArchiveHere.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
320-
<MenuFlyoutItem
321-
x:Name="ExtractTo"
322-
Command="{x:Bind Commands.DecompressArchiveToChildFolder, Mode=OneWay}"
323-
Text="{x:Bind Commands.DecompressArchiveToChildFolder.Label, Mode=OneWay}"
324-
Visibility="{x:Bind Commands.DecompressArchiveToChildFolder.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
325-
</MenuFlyout>
268+
<MenuFlyout
269+
x:Name="ExtractFlyout"
270+
helpers:MenuFlyoutHelper.IsVisible="{x:Bind ViewModel.CanExtract, Mode=OneWay}"
271+
Opening="ActionGroupFlyout_Opening"
272+
Placement="Bottom" />
326273
</AppBarButton.Flyout>
327274

328275
</AppBarButton>
@@ -364,44 +311,19 @@
364311
x:Name="SetAsBackgroundButton"
365312
Width="Auto"
366313
MinWidth="40"
367-
Label="{helpers:ResourceString Name=SetAsBackgroundFlyout}"
314+
Label="{x:Bind Commands.Groups.SetAs.DisplayName}"
368315
LabelPosition="Default"
369316
Style="{StaticResource ToolBarAppBarButtonFlyoutStyle}"
370-
ToolTipService.ToolTip="{helpers:ResourceString Name=SetAsBackgroundFlyout}"
317+
ToolTipService.ToolTip="{x:Bind Commands.Groups.SetAs.DisplayName}"
371318
Visibility="{x:Bind Commands.SetAsWallpaperBackground.IsExecutable, Mode=OneWay}">
372319

373-
<controls:ThemedIcon Style="{StaticResource App.ThemedIcons.SetWallpaper.16}" />
320+
<controls:ThemedIcon Style="{x:Bind Commands.Groups.SetAs.ThemedIconStyle}" />
374321

375322
<AppBarButton.Flyout>
376-
<MenuFlyout Placement="Bottom">
377-
<MenuFlyoutItem
378-
x:Name="SetAsBackgroundFlyoutItem"
379-
Command="{x:Bind Commands.SetAsWallpaperBackground}"
380-
KeyboardAcceleratorTextOverride="{x:Bind Commands.SetAsWallpaperBackground.HotKeyText, Mode=OneWay}"
381-
Text="{helpers:ResourceString Name=Desktop}">
382-
<MenuFlyoutItem.Icon>
383-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="{x:Bind Commands.SetAsWallpaperBackground.Glyph.BaseGlyph}" />
384-
</MenuFlyoutItem.Icon>
385-
</MenuFlyoutItem>
386-
<MenuFlyoutItem
387-
x:Name="SetAsLockscreenFlyoutItem"
388-
Command="{x:Bind Commands.SetAsLockscreenBackground}"
389-
KeyboardAcceleratorTextOverride="{x:Bind Commands.SetAsLockscreenBackground.HotKeyText, Mode=OneWay}"
390-
Text="{helpers:ResourceString Name=Lockscreen}">
391-
<MenuFlyoutItem.Icon>
392-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="{x:Bind Commands.SetAsLockscreenBackground.Glyph.BaseGlyph}" />
393-
</MenuFlyoutItem.Icon>
394-
</MenuFlyoutItem>
395-
<MenuFlyoutItem
396-
x:Name="SetAsAppBackgroundFlyoutItem"
397-
Command="{x:Bind Commands.SetAsAppBackground}"
398-
KeyboardAcceleratorTextOverride="{x:Bind Commands.SetAsAppBackground.HotKeyText, Mode=OneWay}"
399-
Text="{helpers:ResourceString Name=Application}">
400-
<MenuFlyoutItem.Icon>
401-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="{x:Bind Commands.SetAsAppBackground.Glyph.BaseGlyph}" />
402-
</MenuFlyoutItem.Icon>
403-
</MenuFlyoutItem>
404-
</MenuFlyout>
323+
<MenuFlyout
324+
x:Name="SetAsFlyout"
325+
Opening="ActionGroupFlyout_Opening"
326+
Placement="Bottom" />
405327
</AppBarButton.Flyout>
406328

407329
</AppBarButton>

0 commit comments

Comments
 (0)