Files
PowerToys/src/modules/launcher/Plugins/Wox.Plugin.Program/Programs/UWP.cs

576 lines
22 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Windows.ApplicationModel;
2016-08-19 23:24:21 +01:00
using Windows.Management.Deployment;
using AppxPackaing;
using Shell;
2016-08-20 01:17:28 +01:00
using Wox.Infrastructure;
using Wox.Plugin.Program.Logger;
using IStream = AppxPackaing.IStream;
2016-08-19 23:24:21 +01:00
using Rect = System.Windows.Rect;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Media;
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
using System.Windows.Controls;
2016-08-20 01:17:28 +01:00
namespace Wox.Plugin.Program.Programs
{
2017-01-13 01:21:00 +00:00
[Serializable]
public class UWP
{
public string Name { get; }
public string FullName { get; }
public string FamilyName { get; }
public string Location { get; set; }
public Application[] Apps { get; set; }
public PackageVersion Version { get; set; }
public UWP(Package package)
{
2017-01-13 01:21:00 +00:00
Location = package.InstalledLocation.Path;
Name = package.Id.Name;
FullName = package.Id.FullName;
FamilyName = package.Id.FamilyName;
InitializeAppInfo();
Apps = Apps.Where(a =>
{
var valid =
!string.IsNullOrEmpty(a.UserModelId) &&
!string.IsNullOrEmpty(a.DisplayName);
return valid;
}).ToArray();
}
private void InitializeAppInfo()
{
2016-08-19 03:00:52 +01:00
var path = Path.Combine(Location, "AppxManifest.xml");
var namespaces = XmlNamespaces(path);
InitPackageVersion(namespaces);
var appxFactory = new AppxFactory();
2016-08-19 03:00:52 +01:00
IStream stream;
const uint noAttribute = 0x80;
const Stgm exclusiveRead = Stgm.Read | Stgm.ShareExclusive;
2016-11-29 01:55:25 +00:00
var hResult = SHCreateStreamOnFileEx(path, exclusiveRead, noAttribute, false, null, out stream);
2016-11-29 01:55:25 +00:00
if (hResult == Hresult.Ok)
{
var reader = appxFactory.CreateManifestReader(stream);
var manifestApps = reader.GetApplications();
var apps = new List<Application>();
while (manifestApps.GetHasCurrent() != 0)
{
var manifestApp = manifestApps.GetCurrent();
var appListEntry = manifestApp.GetStringValue("AppListEntry");
if (appListEntry != "none")
2016-08-20 19:19:33 +01:00
{
2016-11-29 01:46:29 +00:00
var app = new Application(manifestApp, this);
apps.Add(app);
2016-08-20 19:19:33 +01:00
}
manifestApps.MoveNext();
}
Apps = apps.Where(a => a.AppListEntry != "none").ToArray();
}
2016-11-29 01:55:25 +00:00
else
{
2017-01-24 00:24:20 +00:00
var e = Marshal.GetExceptionForHR((int)hResult);
ProgramLogger.LogException($"|UWP|InitializeAppInfo|{path}" +
"|Error caused while trying to get the details of the UWP program", e);
Apps = new List<Application>().ToArray();
2016-11-29 01:55:25 +00:00
}
}
2016-11-29 01:46:29 +00:00
/// http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx
2016-11-29 01:46:29 +00:00
private string[] XmlNamespaces(string path)
{
XDocument z = XDocument.Load(path);
if (z.Root != null)
{
var namespaces = z.Root.Attributes().
Where(a => a.IsNamespaceDeclaration).
GroupBy(
a => a.Name.Namespace == XNamespace.None ? string.Empty : a.Name.LocalName,
a => XNamespace.Get(a.Value)
).Select(
g => g.First().ToString()
).ToArray();
return namespaces;
}
else
{
ProgramLogger.LogException($"|UWP|XmlNamespaces|{path}" +
$"|Error occured while trying to get the XML from {path}", new ArgumentNullException());
2016-11-29 01:46:29 +00:00
return new string[] { };
}
}
private void InitPackageVersion(string[] namespaces)
{
var versionFromNamespace = new Dictionary<string, PackageVersion>
{
{"http://schemas.microsoft.com/appx/manifest/foundation/windows10", PackageVersion.Windows10},
{"http://schemas.microsoft.com/appx/2013/manifest", PackageVersion.Windows81},
{"http://schemas.microsoft.com/appx/2010/manifest", PackageVersion.Windows8},
};
foreach (var n in versionFromNamespace.Keys)
{
if (namespaces.Contains(n))
{
Version = versionFromNamespace[n];
return;
}
}
ProgramLogger.LogException($"|UWP|XmlNamespaces|{Location}" +
"|Trying to get the package version of the UWP program, but a unknown UWP appmanifest version "
+ $"{FullName} from location {Location} is returned.", new FormatException());
Version = PackageVersion.Unknown;
}
2016-08-20 18:25:55 +01:00
public static Application[] All()
{
2016-08-20 01:17:28 +01:00
var windows10 = new Version(10, 0);
var support = Environment.OSVersion.Version.Major >= windows10.Major;
if (support)
{
2017-04-01 19:15:23 +01:00
var applications = CurrentUserPackages().AsParallel().SelectMany(p =>
{
UWP u;
try
{
u = new UWP(p);
}
#if !DEBUG
2017-04-01 19:15:23 +01:00
catch (Exception e)
{
2019-11-07 07:40:04 +11:00
ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occured and "
+ $"unable to convert Package to UWP for {p.Id.FullName}", e);
2017-04-01 19:15:23 +01:00
return new Application[] { };
}
#endif
#if DEBUG //make developer aware and implement handling
2019-11-16 02:37:01 +02:00
catch
{
2019-11-16 02:37:01 +02:00
throw;
}
#endif
2017-04-01 19:15:23 +01:00
return u.Apps;
}).ToArray();
var updatedListWithoutDisabledApps = applications
.Where(t1 => !Main._settings.DisabledProgramSources
.Any(x => x.UniqueIdentifier == t1.UniqueIdentifier))
.Select(x => x);
return updatedListWithoutDisabledApps.ToArray();
2016-08-20 01:17:28 +01:00
}
else
{
2016-11-29 01:46:29 +00:00
return new Application[] { };
2016-08-20 01:17:28 +01:00
}
}
private static IEnumerable<Package> CurrentUserPackages()
{
2017-04-01 19:15:23 +01:00
var u = WindowsIdentity.GetCurrent().User;
2017-04-01 19:15:23 +01:00
if (u != null)
{
2017-04-01 19:15:23 +01:00
var id = u.Value;
var m = new PackageManager();
var ps = m.FindPackagesForUser(id);
ps = ps.Where(p =>
{
bool valid;
2019-11-01 21:44:55 +02:00
try
{
var f = p.IsFramework;
var d = p.IsDevelopmentMode;
var path = p.InstalledLocation.Path;
valid = !f && !d && !string.IsNullOrEmpty(path);
}
catch (Exception e)
{
2019-11-16 00:57:30 +02:00
ProgramLogger.LogException("UWP" ,"CurrentUserPackages", $"id","An unexpected error occured and "
2019-11-01 21:44:55 +02:00
+ $"unable to verify if package is valid", e);
return false;
}
2017-04-01 19:15:23 +01:00
return valid;
});
return ps;
}
else
{
2016-11-29 01:46:29 +00:00
return new Package[] { };
}
}
public override string ToString()
{
return FamilyName;
}
public override bool Equals(object obj)
{
2019-11-16 02:37:01 +02:00
if (obj is UWP uwp)
{
return FamilyName.Equals(uwp.FamilyName);
}
else
{
return false;
}
}
public override int GetHashCode()
{
return FamilyName.GetHashCode();
}
2017-01-13 01:21:00 +00:00
[Serializable]
public class Application : IProgram
{
public string AppListEntry { get; set; }
public string UniqueIdentifier { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public string UserModelId { get; set; }
public string BackgroundColor { get; set; }
2016-08-20 18:50:14 +01:00
public string Name => DisplayName;
public string Location => Package.Location;
2019-09-08 22:18:55 +10:00
public bool Enabled { get; set; }
public string LogoUri { get; set; }
public string LogoPath { get; set; }
2016-11-29 01:46:29 +00:00
public UWP Package { get; set; }
2016-08-20 18:50:14 +01:00
private int Score(string query)
{
2019-12-03 15:25:19 +01:00
var displayNameMatch = StringMatcher.FuzzySearch(query, DisplayName);
var descriptionMatch = StringMatcher.FuzzySearch(query, Description);
var score = new[] { displayNameMatch.Score, descriptionMatch.Score }.Max();
return score;
}
public Result Result(string query, IPublicAPI api)
{
2019-11-29 01:38:50 +02:00
var score = Score(query);
if (score <= 0)
{ // no need to create result if score is 0
return null;
}
var result = new Result
{
2016-11-29 01:55:11 +00:00
SubTitle = Package.Location,
Icon = Logo,
2019-11-29 01:38:50 +02:00
Score = score,
ContextData = this,
Action = e =>
{
Launch(api);
return true;
}
};
if (Description.Length >= DisplayName.Length &&
Description.Substring(0, DisplayName.Length) == DisplayName)
{
result.Title = Description;
2019-12-03 15:25:19 +01:00
result.TitleHighlightData = StringMatcher.FuzzySearch(query, Description).MatchData;
}
else if (!string.IsNullOrEmpty(Description))
{
2019-12-11 19:08:52 +01:00
var title = $"{DisplayName}: {Description}";
result.Title = title;
result.TitleHighlightData = StringMatcher.FuzzySearch(query, title).MatchData;
}
else
{
result.Title = DisplayName;
2019-12-03 15:25:19 +01:00
result.TitleHighlightData = StringMatcher.FuzzySearch(query, DisplayName).MatchData;
}
return result;
}
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
public List<ContextMenuResult> ContextMenus(IPublicAPI api)
{
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
var contextMenus = new List<ContextMenuResult>
{
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
new ContextMenuResult
{
Title = api.GetTranslation("wox_plugin_program_open_containing_folder"),
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
Glyph = "\xE838",
FontFamily = "Segoe MDL2 Assets",
AcceleratorKey = "E",
AcceleratorModifiers = "Control,Shift",
Action = _ =>
{
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
Main.StartProcess(Process.Start, new ProcessStartInfo("explorer", Package.Location));
return true;
Somil55/merge custom ui into launcher (#2271) * Remove Autosuggest box (#2192) * Update Settings.Designer.cs * Revert "Update Settings.Designer.cs" This reverts commit a1bc0dda564733f079235ed48e33b6bde768b24f. * Updated LauncherControl XAML to add textbox and listview * List View displayed * Hooking up execution on the selected index, removing two way binding on selection, and experimenting with popup that doesn't work * Updated MainViewModel to Remove context menu and history * Added Resultist XAML Island project * Updated SelectedItem and SelectedList Binding. Issues : List box doesn't open when query is written for first time but opens in subsequent queries. * 1. Mouse Click working 2. List View is can't be focused 3. Fixed width of Launcher * Removed two way QueryText box binding * Removed SelectedItem two way binding and replaced with a callback * [Cleaning] Remove redundant UWP project * [Cleaning] Updated files to keep only atomic changes against dev/powerLauncher * Thmbnail fixed for NEW UI * Removed PreviewMouseDown function required by older WOX code Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> * Added the auto-complete feature * Removing ContextMenuPluginInfo, and ContextMenuTopMost as these commands are not used int the new design. * Fixed merge conflicts * Set only when index is 0 * One way binding * Removed unnecessary binding * Deleting unused (commented out code) that was legacy from wox project. * Binding Buttons to appropriate context menu commands. 1. Buttons are dynamically loaded in a listview based on the actions supported be each plugin. This change also deletes unused commands. Note: Most button events don't seem to be getting routed to the Selected Item. Currently using 'PointerEntered' to validate the behavior. The actions should be trigged by the button command property in the future. * manually handling tab in mainwindow * Loading context buttons on Selecting a suggestion list item * Allowing hover event to load content menu items and display them as well. * Adding context buttons to Indexer plugin. This allows for the following: 1. [Files] Open Containing folder 2. [Folders/Files] Copy Path * Remove White background of list (#2218) * Remove white background of list * Removed comments * Changed to ContainerContentChanging event * add const variables instead of numbers * Added comment before the updatelistSize function * Search box UI (#2224) * Added backdrop and rounded corner * Fix for two alt+space press to bring searchbox issue * Fixed merge conflict * Clean Mainwindow.xaml code * Fix for textbox focus on first visible * Allowing users to tab between the context buttons for the selected resut. Also allowing users to press 'enter' to action on the selected items. * Renaming SelectedIndex to ContextMenuSelectedIndex * Enabling key accelerators on context buttons. 1. Add new object ContextMenuResult instead instead of reusing Result for both query results and context menu results. 2. Binding KeyboardAccelerator keys to contextmenuitemviewmodel 3. Enabling and disabling contextmenu items when selecting or deselecting each row. Because we are manually maintaining selectionwe can't use ScopeOwners as the textbox is really the only item ever in focus. * Launching explorer instead of the UWP application when selecting 'open file location'. * Added fix for border showing up when result count is zero * Updated fix for border on no result * Adding visibility after clearing result in MainViewmodel * Launcher Light/Dark mode (#2235) * Fixed issue with list view background not updating with Windows theme change * Added theme change for WPF * updated ShadowDepth for dropshadow * Updated border thicknes of searchbox and listview * Diff issue with ResultList.xaml * Removed change in result delay * Added code to pull colors from UWP * Updated border resource to use system based SystemControlHighlightAccentBrush * Updated corner radius in dark mode * Updated Launcher description text Co-authored-by: ryanbodrug-microsoft <56318517+ryanbodrug-microsoft@users.noreply.github.com> Co-authored-by: Alekhya Reddy <reddykalekhya@gmail.com>
2020-04-20 19:53:20 -07:00
}
}
};
return contextMenus;
}
private async void Launch(IPublicAPI api)
{
var appManager = new ApplicationActivationManager();
uint unusedPid;
const string noArgs = "";
const ACTIVATEOPTIONS noFlags = ACTIVATEOPTIONS.AO_NONE;
await Task.Run(() =>
{
try
{
appManager.ActivateApplication(UserModelId, noArgs, noFlags, out unusedPid);
}
catch (Exception)
{
var name = "Plugin: Program";
var message = $"Can't start UWP: {DisplayName}";
api.ShowMsg(name, message, string.Empty);
}
});
}
2016-11-29 01:46:29 +00:00
public Application(IAppxManifestApplication manifestApp, UWP package)
{
UserModelId = manifestApp.GetAppUserModelId();
UniqueIdentifier = manifestApp.GetAppUserModelId();
2016-11-29 01:46:29 +00:00
DisplayName = manifestApp.GetStringValue("DisplayName");
Description = manifestApp.GetStringValue("Description");
BackgroundColor = manifestApp.GetStringValue("BackgroundColor");
Package = package;
2016-11-29 01:55:11 +00:00
2016-11-29 01:46:29 +00:00
DisplayName = ResourceFromPri(package.FullName, DisplayName);
Description = ResourceFromPri(package.FullName, Description);
LogoUri = LogoUriFromManifest(manifestApp);
LogoPath = LogoPathFromUri(LogoUri);
2019-09-08 22:18:55 +10:00
Enabled = true;
2016-11-29 01:46:29 +00:00
}
internal string ResourceFromPri(string packageFullName, string resourceReference)
{
const string prefix = "ms-resource:";
if (!string.IsNullOrWhiteSpace(resourceReference) && resourceReference.StartsWith(prefix))
{
// magic comes from @talynone
// https://github.com/talynone/Wox.Plugin.WindowsUniversalAppLauncher/blob/master/StoreAppLauncher/Helpers/NativeApiHelper.cs#L139-L153
string key = resourceReference.Substring(prefix.Length);
string parsed;
if (key.StartsWith("//"))
{
parsed = prefix + key;
}
else if (key.StartsWith("/"))
{
parsed = prefix + "//" + key;
}
else
{
parsed = prefix + "///resources/" + key;
}
var outBuffer = new StringBuilder(128);
string source = $"@{{{packageFullName}? {parsed}}}";
var capacity = (uint)outBuffer.Capacity;
var hResult = SHLoadIndirectString(source, outBuffer, capacity, IntPtr.Zero);
if (hResult == Hresult.Ok)
{
var loaded = outBuffer.ToString();
if (!string.IsNullOrEmpty(loaded))
{
return loaded;
}
else
{
ProgramLogger.LogException($"|UWP|ResourceFromPri|{Package.Location}|Can't load null or empty result "
+ $"pri {source} in uwp location {Package.Location}", new NullReferenceException());
2016-11-29 01:46:29 +00:00
return string.Empty;
}
}
else
{
2017-02-12 17:56:39 +00:00
// https://github.com/Wox-launcher/Wox/issues/964
2016-11-29 01:46:29 +00:00
// known hresult 2147942522:
// 'Microsoft Corporation' violates pattern constraint of '\bms-resource:.{1,256}'.
// for
// Microsoft.MicrosoftOfficeHub_17.7608.23501.0_x64__8wekyb3d8bbwe: ms-resource://Microsoft.MicrosoftOfficeHub/officehubintl/AppManifest_GetOffice_Description
// Microsoft.BingFoodAndDrink_3.0.4.336_x64__8wekyb3d8bbwe: ms-resource:AppDescription
2016-11-30 00:30:42 +00:00
var e = Marshal.GetExceptionForHR((int)hResult);
ProgramLogger.LogException($"|UWP|ResourceFromPri|{Package.Location}|Load pri failed {source} with HResult {hResult} and location {Package.Location}", e);
2016-11-29 01:46:29 +00:00
return string.Empty;
}
}
else
{
return resourceReference;
}
}
internal string LogoUriFromManifest(IAppxManifestApplication app)
{
var logoKeyFromVersion = new Dictionary<PackageVersion, string>
{
{ PackageVersion.Windows10, "Square44x44Logo" },
{ PackageVersion.Windows81, "Square30x30Logo" },
{ PackageVersion.Windows8, "SmallLogo" },
};
2016-11-29 01:46:29 +00:00
if (logoKeyFromVersion.ContainsKey(Package.Version))
{
var key = logoKeyFromVersion[Package.Version];
var logoUri = app.GetStringValue(key);
return logoUri;
}
else
{
return string.Empty;
}
}
internal string LogoPathFromUri(string uri)
{
// all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
// windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
// windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
// windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
string path;
if (uri.Contains("\\"))
{
2016-11-29 01:55:11 +00:00
path = Path.Combine(Package.Location, uri);
2016-11-29 01:46:29 +00:00
}
else
{
// for C:\Windows\MiracastView etc
2016-11-29 01:55:11 +00:00
path = Path.Combine(Package.Location, "Assets", uri);
2016-11-29 01:46:29 +00:00
}
var extension = Path.GetExtension(path);
if (extension != null)
{
var end = path.Length - extension.Length;
var prefix = path.Substring(0, end);
var paths = new List<string> { path };
var scaleFactors = new Dictionary<PackageVersion, List<int>>
2016-11-29 01:46:29 +00:00
{
// scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables,
{ PackageVersion.Windows10, new List<int> { 100, 125, 150, 200, 400 } },
{ PackageVersion.Windows81, new List<int> { 100, 120, 140, 160, 180 } },
{ PackageVersion.Windows8, new List<int> { 100 } }
};
if (scaleFactors.ContainsKey(Package.Version))
2016-11-29 01:46:29 +00:00
{
foreach (var factor in scaleFactors[Package.Version])
{
paths.Add($"{prefix}.scale-{factor}{extension}");
}
2016-11-29 01:46:29 +00:00
}
var selected = paths.FirstOrDefault(File.Exists);
if (!string.IsNullOrEmpty(selected))
{
return selected;
}
else
{
ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
$"|{UserModelId} can't find logo uri for {uri} in package location: {Package.Location}", new FileNotFoundException());
2016-11-29 01:46:29 +00:00
return string.Empty;
}
}
else
{
ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
$"|Unable to find extension from {uri} for {UserModelId} " +
$"in package location {Package.Location}", new FileNotFoundException());
2016-11-29 01:46:29 +00:00
return string.Empty;
}
}
public ImageSource Logo()
{
var logo = ImageFromPath(LogoPath);
return logo;
2016-08-19 03:00:52 +01:00
}
2016-09-05 20:33:31 +01:00
private BitmapImage ImageFromPath(string path)
2016-08-19 03:00:52 +01:00
{
if (File.Exists(path))
{
var image = new BitmapImage(new Uri(path));
return image;
2016-09-05 20:33:31 +01:00
}
else
{
ProgramLogger.LogException($"|UWP|ImageFromPath|{path}" +
$"|Unable to get logo for {UserModelId} from {path} and" +
$" located in {Package.Location}", new FileNotFoundException());
return new BitmapImage(new Uri(Constant.ErrorIcon));
2016-09-05 20:33:31 +01:00
}
}
public override string ToString()
{
return $"{DisplayName}: {Description}";
}
}
public enum PackageVersion
{
Windows10,
Windows81,
Windows8,
Unknown
}
[Flags]
private enum Stgm : uint
{
Read = 0x0,
ShareExclusive = 0x10,
}
private enum Hresult : uint
{
Ok = 0x0000,
}
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern Hresult SHCreateStreamOnFileEx(string fileName, Stgm grfMode, uint attributes, bool create,
IStream reserved, out IStream stream);
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern Hresult SHLoadIndirectString(string pszSource, StringBuilder pszOutBuf, uint cchOutBuf,
IntPtr ppvReserved);
}
}