/
OpenItemAction.cs
146 lines (111 loc) · 3.89 KB
/
OpenItemAction.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright (c) 2024 Files Community
// Licensed under the MIT License. See the LICENSE.
using System.IO;
using Windows.Storage;
namespace Files.App.Actions
{
internal class OpenItemAction : ObservableObject, IAction
{
private readonly IContentPageContext context;
public string Label
=> "Open".GetLocalizedResource();
public string Description
=> "OpenItemDescription".GetLocalizedResource();
public RichGlyph Glyph
=> new(opacityStyle: "ColorIconOpenFile");
public HotKey HotKey
=> new(Keys.Enter);
private const int MaxOpenCount = 10;
public bool IsExecutable =>
context.HasSelection &&
context.SelectedItems.Count <= MaxOpenCount &&
!(context.ShellPage is ColumnShellPage &&
context.SelectedItem?.PrimaryItemAttribute == StorageItemTypes.Folder);
public OpenItemAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
context.PropertyChanged += Context_PropertyChanged;
}
public Task ExecuteAsync()
{
if (context.ShellPage is not null)
return NavigationHelpers.OpenSelectedItemsAsync(context.ShellPage);
return Task.CompletedTask;
}
private void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(IContentPageContext.HasSelection))
OnPropertyChanged(nameof(IsExecutable));
}
}
internal class OpenItemWithApplicationPickerAction : ObservableObject, IAction
{
private readonly IContentPageContext context;
public string Label
=> "OpenWith".GetLocalizedResource();
public string Description
=> "OpenItemWithApplicationPickerDescription".GetLocalizedResource();
public RichGlyph Glyph
=> new(opacityStyle: "ColorIconOpenWith");
public bool IsExecutable =>
context.HasSelection &&
context.SelectedItems.All(i =>
(i.PrimaryItemAttribute == StorageItemTypes.File && !i.IsShortcut && !i.IsExecutable) ||
(i.PrimaryItemAttribute == StorageItemTypes.Folder && i.IsArchive));
public OpenItemWithApplicationPickerAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
context.PropertyChanged += Context_PropertyChanged;
}
public Task ExecuteAsync()
{
if (context.ShellPage is null)
return Task.CompletedTask;
return NavigationHelpers.OpenSelectedItemsAsync(context.ShellPage, true);
}
private void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(IContentPageContext.HasSelection))
OnPropertyChanged(nameof(IsExecutable));
}
}
internal class OpenParentFolderAction : ObservableObject, IAction
{
private readonly IContentPageContext context;
public string Label
=> "BaseLayoutItemContextFlyoutOpenParentFolder/Text".GetLocalizedResource();
public string Description
=> "OpenParentFolderDescription".GetLocalizedResource();
public RichGlyph Glyph
=> new(baseGlyph: "\uE197");
public bool IsExecutable =>
context.HasSelection &&
context.ShellPage is not null &&
context.ShellPage.InstanceViewModel.IsPageTypeSearchResults;
public OpenParentFolderAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
context.PropertyChanged += Context_PropertyChanged;
}
public async Task ExecuteAsync()
{
if (context.ShellPage is null)
return;
var item = context.SelectedItem;
var folderPath = Path.GetDirectoryName(item?.ItemPath.TrimEnd('\\'));
if (folderPath is null || item is null)
return;
context.ShellPage.NavigateWithArguments(context.ShellPage.InstanceViewModel.FolderSettings.GetLayoutType(folderPath), new NavigationArguments()
{
NavPathParam = folderPath,
SelectItems = new[] { item.ItemNameRaw },
AssociatedTabInstance = context.ShellPage
});
}
private void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(IContentPageContext.HasSelection))
OnPropertyChanged(nameof(IsExecutable));
}
}
}