Adding launcher telemetry for context buttons clicked.

This commit is contained in:
ryanbodrug-microsoft 2020-05-05 09:02:28 -07:00
parent e29e8ca0a3
commit a9cc4dabb7
11 changed files with 186 additions and 122 deletions

View File

@ -8,7 +8,8 @@ using Wox.Infrastructure.Logger;
using Wox.Infrastructure.Image; using Wox.Infrastructure.Image;
using Wox.Plugin.SharedCommands; using Wox.Plugin.SharedCommands;
using Wox.Plugin; using Wox.Plugin;
using System.Reflection;
namespace Microsoft.Plugin.Folder namespace Microsoft.Plugin.Folder
{ {
internal class ContextMenuLoader : IContextMenu internal class ContextMenuLoader : IContextMenu
@ -34,6 +35,7 @@ namespace Microsoft.Plugin.Folder
var fileOrFolder = (record.Type == ResultType.File) ? "file" : "folder"; var fileOrFolder = (record.Type == ResultType.File) ? "file" : "folder";
contextMenus.Add(new ContextMenuResult contextMenus.Add(new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = "Copy path", Title = "Copy path",
Glyph = "\xE8C8", Glyph = "\xE8C8",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",
@ -65,6 +67,7 @@ namespace Microsoft.Plugin.Folder
{ {
return new ContextMenuResult return new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = "Open containing folder", Title = "Open containing folder",
Glyph = "\xE838", Glyph = "\xE838",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",

View File

@ -6,6 +6,7 @@ using System.Windows;
using Wox.Infrastructure.Logger; using Wox.Infrastructure.Logger;
using Wox.Plugin; using Wox.Plugin;
using Microsoft.Plugin.Indexer.SearchHelper; using Microsoft.Plugin.Indexer.SearchHelper;
using System.Reflection;
namespace Microsoft.Plugin.Indexer namespace Microsoft.Plugin.Indexer
{ {
@ -39,6 +40,7 @@ namespace Microsoft.Plugin.Indexer
var fileOrFolder = (type == ResultType.File) ? "file" : "folder"; var fileOrFolder = (type == ResultType.File) ? "file" : "folder";
contextMenus.Add(new ContextMenuResult contextMenus.Add(new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = "Copy path", Title = "Copy path",
Glyph = "\xE8C8", Glyph = "\xE8C8",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",
@ -71,6 +73,7 @@ namespace Microsoft.Plugin.Indexer
{ {
return new ContextMenuResult return new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = "Open containing folder", Title = "Open containing folder",
Glyph = "\xE838", Glyph = "\xE838",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",

View File

@ -20,6 +20,7 @@ using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Media;
using System.Windows.Controls; using System.Windows.Controls;
using Wox.Plugin; using Wox.Plugin;
using System.Reflection;
namespace Microsoft.Plugin.Program.Programs namespace Microsoft.Plugin.Program.Programs
{ {
@ -314,6 +315,7 @@ namespace Microsoft.Plugin.Program.Programs
{ {
new ContextMenuResult new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), Title = api.GetTranslation("wox_plugin_program_open_containing_folder"),
Glyph = "\xE838", Glyph = "\xE838",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",

View File

@ -12,7 +12,8 @@ using Shell;
using Wox.Infrastructure; using Wox.Infrastructure;
using Microsoft.Plugin.Program.Logger; using Microsoft.Plugin.Program.Logger;
using Wox.Plugin; using Wox.Plugin;
using System.Reflection;
namespace Microsoft.Plugin.Program.Programs namespace Microsoft.Plugin.Program.Programs
{ {
[Serializable] [Serializable]
@ -95,6 +96,7 @@ namespace Microsoft.Plugin.Program.Programs
{ {
new ContextMenuResult new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = api.GetTranslation("wox_plugin_program_run_as_administrator"), Title = api.GetTranslation("wox_plugin_program_run_as_administrator"),
Glyph = "\xE7EF", Glyph = "\xE7EF",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",
@ -117,6 +119,7 @@ namespace Microsoft.Plugin.Program.Programs
}, },
new ContextMenuResult new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), Title = api.GetTranslation("wox_plugin_program_open_containing_folder"),
Glyph = "\xE838", Glyph = "\xE838",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",

View File

@ -18,6 +18,7 @@ using Wox.Plugin;
using Application = System.Windows.Application; using Application = System.Windows.Application;
using Control = System.Windows.Controls.Control; using Control = System.Windows.Controls.Control;
using Keys = System.Windows.Forms.Keys; using Keys = System.Windows.Forms.Keys;
using System.Reflection;
namespace Microsoft.Plugin.Shell namespace Microsoft.Plugin.Shell
{ {
@ -341,6 +342,7 @@ namespace Microsoft.Plugin.Shell
{ {
new ContextMenuResult new ContextMenuResult
{ {
PluginName = Assembly.GetExecutingAssembly().GetName().Name,
Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_administrator"), Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_administrator"),
Glyph = "\xE7EF", Glyph = "\xE7EF",
FontFamily = "Segoe MDL2 Assets", FontFamily = "Segoe MDL2 Assets",

View File

@ -1,124 +1,130 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x64</Platform> <Platform Condition=" '$(Platform)' == '' ">x64</Platform>
<ProjectGuid>{4A3DE70C-684C-410D-B851-C23B6DAEDF16}</ProjectGuid> <ProjectGuid>{4A3DE70C-684C-410D-B851-C23B6DAEDF16}</ProjectGuid>
<OutputType>AppContainerExe</OutputType> <OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PowerLauncher.UI</RootNamespace> <RootNamespace>PowerLauncher.UI</RootNamespace>
<AssemblyName>PowerLauncher.UI</AssemblyName> <AssemblyName>PowerLauncher.UI</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage> <DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier> <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.18362.0</TargetPlatformVersion> <TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.18362.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion> <TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion> <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview> <WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled> <AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath> <OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn> <NoWarn>;2008</NoWarn>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess> <UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit> <Prefer32Bit>true</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath> <OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants> <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<NoWarn>;2008</NoWarn> <NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess> <UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit> <Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain> <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle> <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="App.xaml.cs"> <Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon> <DependentUpon>App.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="LauncherControl.xaml.cs"> <Compile Include="LauncherControl.xaml.cs">
<DependentUpon>LauncherControl.xaml</DependentUpon> <DependentUpon>LauncherControl.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResultList.xaml.cs"> <Compile Include="ResultList.xaml.cs">
<DependentUpon>ResultList.xaml</DependentUpon> <DependentUpon>ResultList.xaml</DependentUpon>
</Compile> </Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AppxManifest Include="Package.appxmanifest"> <AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</AppxManifest> </AppxManifest>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Properties\Default.rd.xml" /> <Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" /> <Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" /> <Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" /> <Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" /> <Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" /> <Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" /> <Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" /> <Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ApplicationDefinition Include="App.xaml"> <ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</ApplicationDefinition> </ApplicationDefinition>
<Page Include="LauncherControl.xaml"> <Page Include="LauncherControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Include="ResultList.xaml"> <Page Include="ResultList.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform"> <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.10</Version> <Version>6.2.10</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI"> <PackageReference Include="Microsoft.Toolkit.Uwp.UI">
<Version>6.0.0</Version> <Version>6.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Animations"> <PackageReference Include="Microsoft.Toolkit.Uwp.UI.Animations">
<Version>6.0.0</Version> <Version>6.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls"> <PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls">
<Version>6.0.0</Version> <Version>6.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Toolkit.Win32.UI.XamlApplication"> <PackageReference Include="Microsoft.Toolkit.Win32.UI.XamlApplication">
<Version>6.0.1</Version> <Version>6.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.UI.Xaml"> <PackageReference Include="Microsoft.UI.Xaml">
<Version>2.4.0-prerelease.200322001</Version> <Version>2.4.0-prerelease.200322001</Version>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' "> <ItemGroup>
<VisualStudioVersion>14.0</VisualStudioVersion> <ProjectReference Include="..\PowerLauncher.Telemetry\PowerLauncher.Telemetry.csproj">
</PropertyGroup> <Project>{08c8c05f-0362-41bc-818c-724572df8b06}</Project>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" /> <Name>PowerLauncher.Telemetry</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
</Target> </Target>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
<PropertyGroup> <PropertyGroup>
<EnableTypeInfoReflection>false</EnableTypeInfoReflection> <EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics> <EnableXBindDiagnostics>false</EnableXBindDiagnostics>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -99,7 +99,7 @@
SelectedIndex="{Binding ContextMenuSelectedIndex}"> SelectedIndex="{Binding ContextMenuSelectedIndex}">
<GridView.ItemTemplate> <GridView.ItemTemplate>
<DataTemplate> <DataTemplate>
<Button Command="{Binding Command}" VerticalAlignment="Center" CornerRadius="4" Height="42" Width="42" BorderThickness="1" Style="{ThemeResource IconOnlyButton}"> <Button Command="{Binding Command}" VerticalAlignment="Center" CornerRadius="4" Height="42" Width="42" BorderThickness="1" Style="{ThemeResource IconOnlyButton}" Click="ContextButton_OnClick">
<ToolTipService.ToolTip> <ToolTipService.ToolTip>
<TextBlock Text="{Binding Title}"/> <TextBlock Text="{Binding Title}"/>
</ToolTipService.ToolTip> </ToolTipService.ToolTip>
@ -111,6 +111,7 @@
Key="{Binding AcceleratorKey}" Key="{Binding AcceleratorKey}"
Modifiers="{Binding AcceleratorModifiers}" Modifiers="{Binding AcceleratorModifiers}"
IsEnabled="{Binding IsAcceleratorKeyEnabled}" IsEnabled="{Binding IsAcceleratorKeyEnabled}"
Invoked="ContextButton_OnAcceleratorInvoked"
/> />
</Button.KeyboardAccelerators> </Button.KeyboardAccelerators>
</Button> </Button>

View File

@ -1,4 +1,5 @@
using System; using Microsoft.PowerLauncher.Telemetry;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -10,9 +11,35 @@ namespace PowerLauncher.UI
{ {
public sealed partial class ResultList : UserControl public sealed partial class ResultList : UserControl
{ {
private ResultActionEvent.TriggerType triggerType = ResultActionEvent.TriggerType.Click;
public ResultList() public ResultList()
{ {
InitializeComponent(); InitializeComponent();
} }
private void ContextButton_OnAcceleratorInvoked(Windows.UI.Xaml.Input.KeyboardAccelerator sender, Windows.UI.Xaml.Input.KeyboardAcceleratorInvokedEventArgs args)
{
this.triggerType = ResultActionEvent.TriggerType.KeyboardShortcut;
}
private void ContextButton_OnClick(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
var button = sender as Windows.UI.Xaml.Controls.Button;
if (button != null)
{
//We currently can't take a reference on the wox project from a UWP project. The dynamic method invoke should be replace
//by an call to the view model once we refactor the project.
var dataContext = ((dynamic)button.DataContext);
if(dataContext?.GetType().GetMethod("SendTelemetryEvent") != null)
{
dataContext.SendTelemetryEvent(triggerType);
}
}
//Restore the trigger type back to click
triggerType = ResultActionEvent.TriggerType.Click;
}
} }
} }

View File

@ -8,6 +8,7 @@ namespace Wox.Plugin
public class ContextMenuResult public class ContextMenuResult
{ {
public string PluginName { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string SubTitle { get; set; } public string SubTitle { get; set; }

View File

@ -1,4 +1,6 @@
using System.Drawing; using Microsoft.PowerLauncher.Telemetry;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Input; using System.Windows.Input;
using Wox.Plugin; using Wox.Plugin;
@ -6,6 +8,7 @@ namespace Wox.ViewModel
{ {
public class ContextMenuItemViewModel : BaseModel public class ContextMenuItemViewModel : BaseModel
{ {
public string PluginName { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string Glyph { get; set; } public string Glyph { get; set; }
public string FontFamily { get; set; } public string FontFamily { get; set; }
@ -13,5 +16,17 @@ namespace Wox.ViewModel
public string AcceleratorKey { get; set; } public string AcceleratorKey { get; set; }
public string AcceleratorModifiers { get; set; } public string AcceleratorModifiers { get; set; }
public bool IsAcceleratorKeyEnabled { get; set; } public bool IsAcceleratorKeyEnabled { get; set; }
public void SendTelemetryEvent(ResultActionEvent.TriggerType triggerType)
{
var eventData = new ResultActionEvent()
{
PluginName = PluginName,
Trigger = triggerType,
ActionName = Title
};
PowerLauncherTelemetry.Log.WriteEvent(eventData);
}
} }
} }

View File

@ -119,6 +119,7 @@ namespace Wox.ViewModel
{ {
newItems.Add(new ContextMenuItemViewModel newItems.Add(new ContextMenuItemViewModel
{ {
PluginName = r.PluginName,
Title = r.Title, Title = r.Title,
Glyph = r.Glyph, Glyph = r.Glyph,
FontFamily = r.FontFamily, FontFamily = r.FontFamily,