Skip to content

Commit dcafdd4

Browse files
authored
Feature: Display progress in status center while installing fonts (#16958)
1 parent 391848b commit dcafdd4

File tree

9 files changed

+157
-18
lines changed

9 files changed

+157
-18
lines changed

src/Files.App/Actions/Content/Install/InstallFontAction.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace Files.App.Actions
88
internal sealed partial class InstallFontAction : ObservableObject, IAction
99
{
1010
private readonly IContentPageContext context;
11+
private static readonly StatusCenterViewModel StatusCenterViewModel = Ioc.Default.GetRequiredService<StatusCenterViewModel>();
1112

1213
public string Label
1314
=> Strings.Install.GetLocalizedResource();
@@ -16,7 +17,7 @@ public string Description
1617
=> Strings.InstallFontDescription.GetLocalizedResource();
1718

1819
public RichGlyph Glyph
19-
=> new("\uE8D2");
20+
=> new(themedIconStyle: "App.ThemedIcons.Actions.FontInstall");
2021

2122
public bool IsExecutable =>
2223
context.SelectedItems.Any() &&
@@ -31,10 +32,19 @@ public InstallFontAction()
3132
context.PropertyChanged += Context_PropertyChanged;
3233
}
3334

34-
public Task ExecuteAsync(object? parameter = null)
35+
public async Task ExecuteAsync(object? parameter = null)
3536
{
37+
if (context?.ShellPage?.ShellViewModel.WorkingDirectory is null)
38+
return;
39+
40+
var banner = StatusCenterHelper.AddCard_InstallFont(context.ShellPage.ShellViewModel.WorkingDirectory.CreateEnumerable(), ReturnResult.InProgress, context.SelectedItems.Count);
41+
banner.IsCancelable = false;
42+
3643
var paths = context.SelectedItems.Select(item => item.ItemPath).ToArray();
37-
return Win32Helper.InstallFontsAsync(paths, false);
44+
await Win32Helper.InstallFontsAsync(paths, false);
45+
46+
StatusCenterViewModel.RemoveItem(banner);
47+
StatusCenterHelper.AddCard_InstallFont(context.ShellPage.ShellViewModel.WorkingDirectory.CreateEnumerable(), ReturnResult.Success, context.SelectedItems.Count);
3848
}
3949

4050
public void Context_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)

src/Files.App/Converters/StatusCenterStateToStateIconConverter.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ partial class StatusCenterStateToStateIconConverter : IValueConverter
1717
{
1818
var pathMarkup = state switch
1919
{
20-
StatusCenterItemIconKind.Copy => Application.Current.Resources["App.Theme.PathIcon.ActionCopy"] as string,
21-
StatusCenterItemIconKind.Move => Application.Current.Resources["App.Theme.PathIcon.ActionMove"] as string,
22-
StatusCenterItemIconKind.Delete => Application.Current.Resources["App.Theme.PathIcon.ActionDelete"] as string,
23-
StatusCenterItemIconKind.Recycle => Application.Current.Resources["App.Theme.PathIcon.ActionDelete"] as string,
24-
StatusCenterItemIconKind.Extract => Application.Current.Resources["App.Theme.PathIcon.ActionExtract"] as string,
25-
StatusCenterItemIconKind.Compress => Application.Current.Resources["App.Theme.PathIcon.ActionExtract"] as string,
26-
StatusCenterItemIconKind.Successful => Application.Current.Resources["App.Theme.PathIcon.ActionSuccess"] as string,
27-
StatusCenterItemIconKind.Error => Application.Current.Resources["App.Theme.PathIcon.ActionInfo"] as string,
28-
StatusCenterItemIconKind.GitClone => Application.Current.Resources["App.Theme.PathIcon.ActionGitClone"] as string,
20+
StatusCenterItemIconKind.Copy => Application.Current.Resources["App.Theme.PathIcon.ActionCopy"] as string,
21+
StatusCenterItemIconKind.Move => Application.Current.Resources["App.Theme.PathIcon.ActionMove"] as string,
22+
StatusCenterItemIconKind.Delete => Application.Current.Resources["App.Theme.PathIcon.ActionDelete"] as string,
23+
StatusCenterItemIconKind.Recycle => Application.Current.Resources["App.Theme.PathIcon.ActionDelete"] as string,
24+
StatusCenterItemIconKind.Extract => Application.Current.Resources["App.Theme.PathIcon.ActionExtract"] as string,
25+
StatusCenterItemIconKind.Compress => Application.Current.Resources["App.Theme.PathIcon.ActionExtract"] as string,
26+
StatusCenterItemIconKind.Successful => Application.Current.Resources["App.Theme.PathIcon.ActionSuccess"] as string,
27+
StatusCenterItemIconKind.Error => Application.Current.Resources["App.Theme.PathIcon.ActionInfo"] as string,
28+
StatusCenterItemIconKind.GitClone => Application.Current.Resources["App.Theme.PathIcon.ActionGitClone"] as string,
29+
StatusCenterItemIconKind.InstallFont => Application.Current.Resources["App.Theme.PathIcon.ActionInstallFont"] as string,
2930
_ => ""
3031
};
3132

src/Files.App/Data/Enums/FileOperationType.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,10 @@ public enum FileOperationType : byte
6767
/// A git repo has been cloned
6868
/// </summary>
6969
GitClone = 12,
70+
71+
/// <summary>
72+
/// A font has been installed
73+
/// </summary>
74+
InstallFont = 13,
7075
}
7176
}

src/Files.App/Data/Enums/StatusCenterItemIconKind.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public enum StatusCenterItemIconKind
1616
Compress,
1717
Successful,
1818
Error,
19-
GitClone
19+
GitClone,
20+
InstallFont
2021
}
2122
}

src/Files.App/Strings/en-US/Resources.resw

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3502,7 +3502,39 @@
35023502
<data name="StatusCenter_GitCloneInProgress_SubHeader" xml:space="preserve">
35033503
<value>Cloning {0} from "{1}" to "{2}"</value>
35043504
<comment>Shown in a StatusCenter card.</comment>
3505+
</data>
3506+
<data name="StatusCenter_InstallFontCanceled_Header" xml:space="preserve">
3507+
<value>Canceled installing {0} fonts</value>
3508+
<comment>Shown in a StatusCenter card.</comment>
3509+
</data>
3510+
<data name="StatusCenter_InstallFontCanceled_SubHeader" xml:space="preserve">
3511+
<value>Canceled installing {0} font(s) from "{1}"</value>
3512+
<comment>Shown in a StatusCenter card.</comment>
3513+
</data>
3514+
<data name="StatusCenter_InstallFontComplete_Header" xml:space="preserve">
3515+
<value>Installed {0} font(s)</value>
3516+
<comment>Shown in a StatusCenter card.</comment>
3517+
</data>
3518+
<data name="StatusCenter_InstallFontComplete_SubHeader" xml:space="preserve">
3519+
<value>Installed {0} font(s) from "{1}"</value>
3520+
<comment>Shown in a StatusCenter card.</comment>
35053521
</data>
3522+
<data name="StatusCenter_InstallFontFailed_Header" xml:space="preserve">
3523+
<value>Error installing {0} font(s)</value>
3524+
<comment>Shown in a StatusCenter card.</comment>
3525+
</data>
3526+
<data name="StatusCenter_InstallFontFailed_SubHeader" xml:space="preserve">
3527+
<value>Failed to install {0} font(s) from "{1}"</value>
3528+
<comment>Shown in a StatusCenter card.</comment>
3529+
</data>
3530+
<data name="StatusCenter_InstallFontInProgress_Header" xml:space="preserve">
3531+
<value>Installing {0} font(s)</value>
3532+
<comment>Shown in a StatusCenter card.</comment>
3533+
</data>
3534+
<data name="StatusCenter_InstallFontInProgress_SubHeader" xml:space="preserve">
3535+
<value>Installing {0} font(s) from "{1}"</value>
3536+
<comment>Shown in a StatusCenter card.</comment>
3537+
</data>
35063538
<data name="StatusCenter_CopyCanceled_Header" xml:space="preserve">
35073539
<value>Canceled copying {0} item(s) to "{1}"</value>
35083540
<comment>Shown in a StatusCenter card.</comment>

src/Files.App/Styles/PathIcons.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
<x:String x:Key="App.Theme.PathIcon.ActionGitClone">M.59,6.59c-.78.78-.78,2.05,0,2.83l6,6c.78.78,2.05.78,2.83,0l6-6c.78-.78.78-2.05,0-2.83L9.41.59c-.78-.78-2.05-.78-2.83,0L.59,6.59Zm.71,2.12c-.39-.39-.39-1.02,0-1.41L5.44,3.15l.71.71c-.09.2-.15.42-.15.65,0,.65.42,1.21,1,1.41v4.17c-.58.21-1,.76-1,1.41,0,.83.67,1.5,1.5,1.5s1.5-.67,1.5-1.5c0-.65-.42-1.21-1-1.41v-4.17c.05-.02.1-.04.15-.06l2,2c-.09.2-.15.42-.15.65,0,.83.67,1.5,1.5,1.5s1.5-.67,1.5-1.5-.67-1.5-1.5-1.5c-.23,0-.45.05-.65.15l-2-2c.09-.2.15-.42.15-.65,0-.83-.67-1.5-1.5-1.5-.23,0-.45.05-.65.15l-.71-.71,1.15-1.15c.39-.39,1.02-.39,1.41,0l6,6c.39.39.39,1.02,0,1.41l-6,6c-.39.39-1.02.39-1.41,0L1.29,8.71Z</x:String>
3939

40+
<x:String x:Key="App.Theme.PathIcon.ActionInstallFont">M3.97.34C3.91.14,3.72,0,3.51,0c-.21,0-.4.13-.48.32L.03,8.32c-.1.26.03.55.29.64.26.1.55-.03.64-.29l.63-1.68h3.56l.28.74.53-1.42L3.97.34Zm.83,5.66H1.97L3.47,2l1.33,4Zm4.43-4c.3,0,.58.17.7.45l4.91,11.05h.4c.41,0,.75.34.75.75s-.34.75-.75.75h-2.5c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h.46l-1.11-2.5h-5.34l-1,2.5h.49c.41,0,.75.34.75.75s-.34.75-.75.75h-2.5c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h.39L8.55,2.47c.11-.28.38-.47.68-.47Zm-1.88,7.5h4.07l-2.14-4.82-1.93,4.82Z</x:String>
41+
4042
<x:String x:Key="App.Theme.PathIcon.WebAsset">M 4.9219 18.75 C 4.4336 18.75 3.9665 18.6507 3.5205 18.4521 C 3.0745 18.2536 2.6839 17.9867 2.3486 17.6514 C 2.0133 17.3161 1.7464 16.9255 1.5479 16.4795 C 1.3493 16.0335 1.25 15.5664 1.25 15.0781 L 1.25 4.9219 C 1.25 4.4336 1.3493 3.9665 1.5479 3.5205 C 1.7464 3.0745 2.0133 2.6839 2.3486 2.3486 C 2.6839 2.0133 3.0745 1.7464 3.5205 1.5479 C 3.9665 1.3493 4.4336 1.25 4.9219 1.25 L 15.0781 1.25 C 15.5664 1.25 16.0335 1.3493 16.4795 1.5479 C 16.9255 1.7464 17.3161 2.0133 17.6514 2.3486 C 17.9867 2.6839 18.2536 3.0745 18.4521 3.5205 C 18.6507 3.9665 18.75 4.4336 18.75 4.9219 L 18.75 15.0781 C 18.75 15.5664 18.6507 16.0335 18.4521 16.4795 C 18.2536 16.9255 17.9867 17.3161 17.6514 17.6514 C 17.3161 17.9867 16.9255 18.2536 16.4795 18.4521 C 16.0335 18.6507 15.5664 18.75 15.0781 18.75 Z M 15.0488 17.5 C 15.3743 17.5 15.6852 17.4333 15.9814 17.2998 C 16.2777 17.1663 16.5381 16.9873 16.7627 16.7627 C 16.9873 16.5381 17.1663 16.2777 17.2998 15.9814 C 17.4333 15.6852 17.5 15.3743 17.5 15.0488 L 17.5 4.9512 C 17.5 4.6257 17.4333 4.3148 17.2998 4.0186 C 17.1663 3.7223 16.9873 3.4619 16.7627 3.2373 C 16.5381 3.0127 16.2777 2.8337 15.9814 2.7002 C 15.6852 2.5667 15.3743 2.5 15.0488 2.5 L 4.9512 2.5 C 4.6257 2.5 4.3148 2.5667 4.0186 2.7002 C 3.7223 2.8337 3.4619 3.0127 3.2373 3.2373 C 3.0127 3.4619 2.8337 3.7223 2.7002 4.0186 C 2.5667 4.3148 2.5 4.6257 2.5 4.9512 L 2.5 15.0488 C 2.5 15.3743 2.5667 15.6852 2.7002 15.9814 C 2.8337 16.2777 3.0127 16.5381 3.2373 16.7627 C 3.4619 16.9873 3.7223 17.1663 4.0186 17.2998 C 4.3148 17.4333 4.6257 17.5 4.9512 17.5 Z M 5.625 6.25 C 5.4557 6.25 5.3092 6.1882 5.1855 6.0645 C 5.0618 5.9408 5 5.7943 5 5.625 C 5 5.4557 5.0618 5.3092 5.1855 5.1855 C 5.3092 5.0618 5.4557 5 5.625 5 L 14.375 5 C 14.5443 5 14.6908 5.0618 14.8145 5.1855 C 14.9382 5.3092 15 5.4557 15 5.625 C 15 5.7943 14.9382 5.9408 14.8145 6.0645 C 14.6908 6.1882 14.5443 6.25 14.375 6.25 Z Z Z</x:String>
4143

4244
<x:String x:Key="App.Theme.PathIcon.TabActions">M3.2 0C1.43269 0 0 1.43269 0 3.2V12.8C0 14.5673 1.43269 16 3.2 16H12.8C14.5673 16 16 14.5673 16 12.8V3.2C16 1.43269 14.5673 0 12.8 0H3.2ZM1.06667 3.2C1.06667 2.02179 2.02179 1.06667 3.2 1.06667H12.8C13.9782 1.06667 14.9333 2.02179 14.9333 3.2V4.26667H5.86667C4.98301 4.26667 4.26667 4.98301 4.26667 5.86667V14.9333H3.2C2.02179 14.9333 1.06667 13.9782 1.06667 12.8V3.2ZM5.33333 14.9333H12.8C13.9782 14.9333 14.9333 13.9782 14.9333 12.8V5.33333H5.86667C5.57212 5.33333 5.33333 5.57212 5.33333 5.86667V14.9333Z</x:String>

src/Files.App/UserControls/Toolbar.xaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -464,9 +464,7 @@
464464
Label="{x:Bind Commands.InstallFont.Label}"
465465
LabelPosition="Default"
466466
ToolTipService.ToolTip="{helpers:ResourceString Name=Install}">
467-
<AppBarButton.Icon>
468-
<FontIcon Foreground="{ThemeResource App.Theme.IconBaseBrush}" Glyph="{x:Bind Commands.InstallFont.Glyph.BaseGlyph, Mode=OneTime}" />
469-
</AppBarButton.Icon>
467+
<controls:ThemedIcon Style="{x:Bind Commands.InstallFont.ThemedIconStyle}" />
470468
</AppBarButton>
471469

472470
<!-- Install Certificate -->

src/Files.App/Utils/StatusCenter/StatusCenterHelper.cs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ public static StatusCenterItem AddCard_GitClone(
487487
{
488488
return _statusCenterViewModel.AddItem(
489489
"StatusCenter_GitCloneCanceled_Header",
490-
string.Empty,
490+
"StatusCenter_GitCloneCanceled_SubHeader",
491491
ReturnResult.Cancelled,
492492
FileOperationType.GitClone,
493493
repoName,
@@ -538,6 +538,67 @@ public static StatusCenterItem AddCard_GitClone(
538538
}
539539
}
540540

541+
public static StatusCenterItem AddCard_InstallFont(
542+
IEnumerable<string> source,
543+
ReturnResult returnStatus,
544+
long itemsCount = 0,
545+
long totalSize = 0)
546+
{
547+
if (returnStatus == ReturnResult.Cancelled)
548+
{
549+
return _statusCenterViewModel.AddItem(
550+
"StatusCenter_InstallFontCanceled_Header",
551+
"StatusCenter_InstallFontCanceled_SubHeader",
552+
ReturnResult.Cancelled,
553+
FileOperationType.InstallFont,
554+
source,
555+
string.Empty.CreateEnumerable(),
556+
false,
557+
itemsCount,
558+
totalSize);
559+
}
560+
else if (returnStatus == ReturnResult.InProgress)
561+
{
562+
return _statusCenterViewModel.AddItem(
563+
"StatusCenter_InstallFontInProgress_Header",
564+
"StatusCenter_InstallFontInProgress_SubHeader",
565+
ReturnResult.InProgress,
566+
FileOperationType.InstallFont,
567+
source,
568+
string.Empty.CreateEnumerable(),
569+
false,
570+
itemsCount,
571+
totalSize,
572+
new CancellationTokenSource());
573+
}
574+
else if (returnStatus == ReturnResult.Success)
575+
{
576+
return _statusCenterViewModel.AddItem(
577+
"StatusCenter_InstallFontComplete_Header",
578+
"StatusCenter_InstallFontComplete_SubHeader",
579+
ReturnResult.Success,
580+
FileOperationType.InstallFont,
581+
source,
582+
string.Empty.CreateEnumerable(),
583+
false,
584+
itemsCount,
585+
totalSize);
586+
}
587+
else
588+
{
589+
return _statusCenterViewModel.AddItem(
590+
"StatusCenter_InstallFontFailed_Header",
591+
"StatusCenter_InstallFontFailed_SubHeader",
592+
ReturnResult.Failed,
593+
FileOperationType.InstallFont,
594+
source,
595+
string.Empty.CreateEnumerable(),
596+
false,
597+
itemsCount,
598+
totalSize);
599+
}
600+
}
601+
541602
public static StatusCenterItem AddCard_Prepare()
542603
{
543604
return _statusCenterViewModel.AddItem(
@@ -767,6 +828,32 @@ public static void UpdateCardStrings(StatusCenterItem card)
767828
}
768829
break;
769830
}
831+
case FileOperationType.InstallFont:
832+
{
833+
if (headerString is not null)
834+
{
835+
card.Header = card.FileSystemOperationReturnResult switch
836+
{
837+
ReturnResult.Cancelled => string.Format(headerString, card.TotalItemsCount),
838+
ReturnResult.Success => string.Format(headerString, card.TotalItemsCount),
839+
ReturnResult.Failed => string.Format(headerString, card.TotalItemsCount),
840+
ReturnResult.InProgress => string.Format(headerString, card.TotalItemsCount),
841+
_ => string.Format(headerString, card.TotalItemsCount),
842+
};
843+
}
844+
if (subHeaderString is not null)
845+
{
846+
card.SubHeader = card.FileSystemOperationReturnResult switch
847+
{
848+
ReturnResult.Cancelled => string.Format(subHeaderString, card.TotalItemsCount, sourcePath),
849+
ReturnResult.Success => string.Format(subHeaderString, card.TotalItemsCount, sourcePath),
850+
ReturnResult.Failed => string.Format(subHeaderString, card.TotalItemsCount, sourcePath),
851+
ReturnResult.InProgress => string.Format(subHeaderString, card.TotalItemsCount, sourcePath),
852+
_ => string.Format(subHeaderString, card.TotalItemsCount, sourcePath),
853+
};
854+
}
855+
break;
856+
}
770857
}
771858
}
772859
}

src/Files.App/Utils/StatusCenter/StatusCenterItem.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ public StatusCenterItem(
230230
FileOperationType.Recycle => StatusCenterItemIconKind.Recycle,
231231
FileOperationType.Compressed => StatusCenterItemIconKind.Compress,
232232
FileOperationType.GitClone => StatusCenterItemIconKind.GitClone,
233+
FileOperationType.InstallFont => StatusCenterItemIconKind.InstallFont,
233234
_ => StatusCenterItemIconKind.Delete,
234235
};
235236

@@ -263,6 +264,7 @@ public StatusCenterItem(
263264
FileOperationType.Recycle => StatusCenterItemIconKind.Recycle,
264265
FileOperationType.Compressed => StatusCenterItemIconKind.Compress,
265266
FileOperationType.GitClone => StatusCenterItemIconKind.GitClone,
267+
FileOperationType.InstallFont => StatusCenterItemIconKind.InstallFont,
266268
_ => StatusCenterItemIconKind.Delete,
267269
};
268270

@@ -294,7 +296,8 @@ private void ReportProgress(StatusCenterItemProgressModel value)
294296

295297
if (Operation == FileOperationType.Recycle ||
296298
Operation == FileOperationType.Delete ||
297-
Operation == FileOperationType.Compressed)
299+
Operation == FileOperationType.Compressed ||
300+
Operation == FileOperationType.GitClone)
298301
{
299302
Message =
300303
$"{string.Format(

0 commit comments

Comments
 (0)