From f01de620ca2f9aec63dbab1ac58b7116fc132bb6 Mon Sep 17 00:00:00 2001 From: Samuel Chapleau Date: Tue, 17 Jan 2023 09:46:58 -0800 Subject: [PATCH] Remove Peek.UI.WPF project --- PowerToys.sln | 15 - src/modules/peek/Peek.UI.WPF/App.xaml | 15 - src/modules/peek/Peek.UI.WPF/App.xaml.cs | 94 ------ src/modules/peek/Peek.UI.WPF/AssemblyInfo.cs | 10 - src/modules/peek/Peek.UI.WPF/Assets/error.png | Bin 1469 -> 0 bytes .../Extensions/LinkedListNodeExtensions.cs | 21 -- .../Peek.UI.WPF/Extensions/SizeExtensions.cs | 61 ---- .../Extensions/WindowExtensions.cs | 41 --- .../Peek.UI.WPF/Helpers/FileExplorerHelper.cs | 34 -- .../Peek.UI.WPF/Helpers/FileLoadHelper.cs | 122 ------- .../Peek.UI.WPF/Helpers/FileTypeHelper.cs | 77 ----- .../Peek.UI.WPF/Helpers/ThumbnailHelper.cs | 128 -------- .../peek/Peek.UI.WPF/Models/DimensionData.cs | 21 -- .../peek/Peek.UI.WPF/Models/IShellItem.cs | 30 -- .../Peek.UI.WPF/Models/ObservableObject.cs | 19 -- .../Peek.UI.WPF/Models/ObservableRectangle.cs | 85 ----- .../Models/ObservableWindowData.cs | 88 ----- .../Peek.UI.WPF/Native/NativeEventWaiter.cs | 28 -- .../peek/Peek.UI.WPF/Native/NativeMethods.cs | 54 ---- .../peek/Peek.UI.WPF/Native/NativeModels.cs | 182 ----------- .../peek/Peek.UI.WPF/Peek.UI.WPF.csproj | 90 ------ .../peek/Peek.UI.WPF/Resources/Peek.ico | Bin 152126 -> 0 bytes src/modules/peek/Peek.UI.WPF/Themes/Dark.xaml | 19 -- .../Peek.UI.WPF/Themes/HighContrast1.xaml | 19 -- .../Peek.UI.WPF/Themes/HighContrast2.xaml | 19 -- .../Peek.UI.WPF/Themes/HighContrastBlack.xaml | 19 -- .../Peek.UI.WPF/Themes/HighContrastWhite.xaml | 19 -- .../peek/Peek.UI.WPF/Themes/Light.xaml | 19 -- .../Peek.UI.WPF/ViewModels/MainViewModel.cs | 301 ------------------ .../peek/Peek.UI.WPF/Views/MainWindow.xaml | 37 --- .../peek/Peek.UI.WPF/Views/MainWindow.xaml.cs | 115 ------- 31 files changed, 1782 deletions(-) delete mode 100644 src/modules/peek/Peek.UI.WPF/App.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/App.xaml.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/AssemblyInfo.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Assets/error.png delete mode 100644 src/modules/peek/Peek.UI.WPF/Extensions/LinkedListNodeExtensions.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Extensions/SizeExtensions.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Extensions/WindowExtensions.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Helpers/FileExplorerHelper.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Helpers/FileLoadHelper.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Helpers/FileTypeHelper.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Helpers/ThumbnailHelper.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Models/DimensionData.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Models/IShellItem.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Models/ObservableObject.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Models/ObservableRectangle.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Models/ObservableWindowData.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Native/NativeEventWaiter.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Native/NativeMethods.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Native/NativeModels.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Peek.UI.WPF.csproj delete mode 100644 src/modules/peek/Peek.UI.WPF/Resources/Peek.ico delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/Dark.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/HighContrast1.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/HighContrast2.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/HighContrastBlack.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/HighContrastWhite.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Themes/Light.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/ViewModels/MainViewModel.cs delete mode 100644 src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml delete mode 100644 src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml.cs diff --git a/PowerToys.sln b/PowerToys.sln index 94b05bacb7..b794636e50 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -470,8 +470,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GPOWrapperProjection", "src EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Peek", "Peek", "{17B4FA70-001E-4D33-BBBB-0D142DBC2E20}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Peek.UI.WPF", "src\modules\peek\Peek.UI.WPF\Peek.UI.WPF.csproj", "{C0240BC3-95AF-4B38-811A-76E3FD56B576}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Peek", "src\modules\peek\peek\peek.vcxproj", "{A1425B53-3D61-4679-8623-E64A0D3D0A48}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Peek.UI", "src\modules\peek\Peek.UI\Peek.UI.csproj", "{9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}" @@ -1927,18 +1925,6 @@ Global {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x64.Build.0 = Release|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x86.ActiveCfg = Release|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x86.Build.0 = Release|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|ARM64.Build.0 = Debug|ARM64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|x64.ActiveCfg = Debug|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|x64.Build.0 = Debug|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|x86.ActiveCfg = Debug|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Debug|x86.Build.0 = Debug|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|ARM64.ActiveCfg = Release|ARM64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|ARM64.Build.0 = Release|ARM64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|x64.ActiveCfg = Release|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|x64.Build.0 = Release|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|x86.ActiveCfg = Release|x64 - {C0240BC3-95AF-4B38-811A-76E3FD56B576}.Release|x86.Build.0 = Release|x64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|ARM64.Build.0 = Debug|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|x64.ActiveCfg = Debug|x64 @@ -2275,7 +2261,6 @@ Global {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788} = {1AFB6476-670D-4E80-A464-657E01DFF482} {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97} = {1AFB6476-670D-4E80-A464-657E01DFF482} {17B4FA70-001E-4D33-BBBB-0D142DBC2E20} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} - {C0240BC3-95AF-4B38-811A-76E3FD56B576} = {17B4FA70-001E-4D33-BBBB-0D142DBC2E20} {A1425B53-3D61-4679-8623-E64A0D3D0A48} = {17B4FA70-001E-4D33-BBBB-0D142DBC2E20} {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03} = {17B4FA70-001E-4D33-BBBB-0D142DBC2E20} {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB} = {17B4FA70-001E-4D33-BBBB-0D142DBC2E20} diff --git a/src/modules/peek/Peek.UI.WPF/App.xaml b/src/modules/peek/Peek.UI.WPF/App.xaml deleted file mode 100644 index 1fc9407448..0000000000 --- a/src/modules/peek/Peek.UI.WPF/App.xaml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/App.xaml.cs b/src/modules/peek/Peek.UI.WPF/App.xaml.cs deleted file mode 100644 index 54225caef6..0000000000 --- a/src/modules/peek/Peek.UI.WPF/App.xaml.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Threading; -using System.Windows; -using Common.UI; -using ManagedCommon; - -namespace Peek.UI -{ - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application, IDisposable - { - private ThemeManager? _themeManager; - - private Mutex? _instanceMutex; - private static string[] _args = Array.Empty(); - private int _powerToysRunnerPid; - private bool disposedValue; - - // TODO: Make sure no window appears or blinks at startup - protected override void OnStartup(StartupEventArgs e) - { - _args = e?.Args ?? Array.Empty(); - - // allow only one instance of peek - _instanceMutex = new Mutex(true, @"Local\PowerToys_Peek_InstanceMutex", out bool createdNew); - if (!createdNew) - { - _instanceMutex = null; - Environment.Exit(0); - return; - } - - if (_args?.Length > 0) - { - _ = int.TryParse(_args[0], out _powerToysRunnerPid); - - RunnerHelper.WaitForPowerToysRunner(_powerToysRunnerPid, () => - { - Environment.Exit(0); - }); - } - else - { - _powerToysRunnerPid = -1; - } - - _themeManager = new ThemeManager(this); - base.OnStartup(e); - } - - protected override void OnExit(ExitEventArgs e) - { - if (_instanceMutex != null) - { - _instanceMutex.ReleaseMutex(); - } - - base.OnExit(e); - } - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - _instanceMutex?.Dispose(); - } - - // TODO: free unmanaged resources (unmanaged objects) and override finalizer - // TODO: set large fields to null - disposedValue = true; - } - } - - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(true); - GC.SuppressFinalize(this); - } - - public bool IsRunningDetachedFromPowerToys() - { - return _powerToysRunnerPid == -1; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/AssemblyInfo.cs b/src/modules/peek/Peek.UI.WPF/AssemblyInfo.cs deleted file mode 100644 index bcac370d7d..0000000000 --- a/src/modules/peek/Peek.UI.WPF/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Windows; - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located (used if a resource is not found in the page, or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly) // where the generic resource dictionary is locate (used if a resource is not found in the page, app, or any theme specific resource dictionaries) -] diff --git a/src/modules/peek/Peek.UI.WPF/Assets/error.png b/src/modules/peek/Peek.UI.WPF/Assets/error.png deleted file mode 100644 index c2eb2fc2dfd054ceaca4953b115b3bc30223f81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1469 zcmV;u1w#6XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1yV^wK~#8N<(t>5 z^i&i_KkW5E1uNL~MN!lTdj~;8#oiS=s0f0J`e1ob5iBU!uprng*xNrKC}MfABG|C^ zj&=R;JFwlelXH?xlDXr81((d3+?<_LcQT8nz&3aV-iH_9I{3fgJp2RyHolKr;M}t# z+KO9W$E9(uc^0F}Cy&RuWoL{kZG8)u#knMR_md~#+);A(lW*g4I9EJ{QDv(<8Rv#* zC51#iH_lK2|>GN+(tQ}pHf_7glG zTTwOdAB2`W(U*A-qgJ35q%S*!kKhW}h^TqXL(y_KM&+VbuonJ^QTe{TAB))uqm#(P z&~gt(<*LSlUGNw@vImbqo%?e982vRJjzv6&{>#bI0LW8uEY`*s(O%Chm?bywHwl1R z!SXm3o8ixxu17OimZ#BH!rLSOG8zkp#E)gQl&t!i2H+hWb9Lxvsal>yTR5_50OXjf zLw|jhl&<;P1VF7|tes+U07}>VZ2}<2Y6V3BsLS?v+XkRbD_9AS#hdY7)Jk$sY(h~0 zawEU>5VYKdQMt$_S))Dh4UEq77;2s`Asc`ucVGI|)B_lmi&WNV8O))||BBH$lCR=w zm?Im2C(stisd+UmZZ^lyF)CMOt`)3|+Dt{?_1=UzY6Gw>+7C-r7Fc)wYjdpBH?gi2 zXgzPs|B2V2*7`m*r&Zp%SVwID)R*jsLwN#Lp#jg9Rpk>)q0c`Yh;>v3U^~>>*nT*a zbs1!3jcnP2(V~ox{rqUGqcQ+v-Th=$E4UVIIW>Db=6r_s^IfryFaT})zD#{mgV{5S zkF`-5Z-U1AL!ssun#FtK#+eCED^zvYd{k zOaws5L3^N$UDg5K+$g>#?v2`mXdjU4^PY(SoaGLT?N-<)69G`uDqU*!tu|79GZ6rx zzWWl|4~FzNyak6yn1%rmdZR;qN`27h*ZWe>6SbREwst5g12Bsy*Kp~-e@=}B695f{ z-=Z$^4jq^hGamq@%#|ju}dYQtWOX^N5;Uo0txDuN(cmS#@zaBPW zOVm3){#<%Ns|kY!z$Y}N_WT=S8?-j~6#Y5%gs7Ck0-({_eow0MrOmzy4VXSBATPrb z1_?k_<=ftQ&-VBY`u}kW=IA{DQJ>d?&}mgZQ5A#>v5sB?p!wOBl^XD-UHOFGVfYUH z|I{y6s^~2MRd>E?pU<%yevkftpNkQ_1V9;CTSn^6Z-hgjJci#q$+OWj^#DWzp6-0p zdA=(O!cXY0@hjbdA=+A z+B~UcXp3FM68I?klPqLQ-X-`CN>@j}2U=)qid3SvHChS2fc{tGv#!Pg^?8$kU9{*Q Xch5vLZAau100000NkvXXu0mjfF6O+5 diff --git a/src/modules/peek/Peek.UI.WPF/Extensions/LinkedListNodeExtensions.cs b/src/modules/peek/Peek.UI.WPF/Extensions/LinkedListNodeExtensions.cs deleted file mode 100644 index 5e740726e4..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Extensions/LinkedListNodeExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Collections.Generic; - -namespace Peek.UI.Extensions -{ - public static class LinkedListNodeExtensions - { - public static LinkedListNode? GetNextOrFirst(this LinkedListNode current) - { - return current.Next ?? current.List?.First; - } - - public static LinkedListNode? GetPreviousOrLast(this LinkedListNode current) - { - return current.Previous ?? current.List?.Last; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Extensions/SizeExtensions.cs b/src/modules/peek/Peek.UI.WPF/Extensions/SizeExtensions.cs deleted file mode 100644 index 19ac26c8b9..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Extensions/SizeExtensions.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Windows; - -namespace Peek.UI.Extensions -{ - public static class SizeExtensions - { - public static Rect Fit(this Size sizeToFit, Rect bounds, Size maxSize, Size minSize, Size allowedGap, double reservedHeight) - { - double resultingWidth = sizeToFit.Width; - double resultingHeight = sizeToFit.Height; - - var ratioWidth = sizeToFit.Width / maxSize.Width; - var ratioHeight = sizeToFit.Height / maxSize.Height; - - if (ratioWidth > ratioHeight) - { - if (ratioWidth > 1) - { - resultingWidth = maxSize.Width; - resultingHeight = sizeToFit.Height / ratioWidth; - } - } - else - { - if (ratioHeight > 1) - { - resultingWidth = sizeToFit.Width / ratioHeight; - resultingHeight = maxSize.Height; - } - } - - if (resultingWidth < minSize.Width - allowedGap.Width) - { - resultingWidth = minSize.Width; - } - - if (resultingHeight < minSize.Height - allowedGap.Height) - { - resultingHeight = minSize.Height; - } - - resultingHeight += reservedHeight; - - // Calculate offsets to center content - double offsetX = (maxSize.Width - resultingWidth) / 2; - double offsetY = (maxSize.Height - resultingHeight) / 2; - - var maxWindowLeft = bounds.Left + ((bounds.Right - bounds.Left - maxSize.Width) / 2); - var maxWindowTop = bounds.Top + ((bounds.Bottom - bounds.Top - maxSize.Height) / 2); - - var resultingLeft = maxWindowLeft + offsetX; - var resultingTop = maxWindowTop + offsetY; - - return new Rect(resultingLeft, resultingTop, resultingWidth, resultingHeight); - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Extensions/WindowExtensions.cs b/src/modules/peek/Peek.UI.WPF/Extensions/WindowExtensions.cs deleted file mode 100644 index 17abcda12c..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Extensions/WindowExtensions.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Windows; -using System.Windows.Interop; -using Peek.UI.Native; -using static Peek.UI.Native.NativeModels; - -namespace Peek.UI.Extensions -{ - public static class WindowExtensions - { - public static void SetToolStyle(this Window window) - { - var handle = new WindowInteropHelper(window).Handle; - _ = NativeMethods.SetWindowLong(handle, GwlExStyle, NativeMethods.GetWindowLong(handle, GwlExStyle) | WsExToolWindow); - } - - public static void BringToForeground(this Window window) - { - // Use SendInput hack to allow Activate to work - required to resolve focus issue https://github.com/microsoft/PowerToys/issues/4270 - Input input = new Input { Type = InputType.InputMouse, Data = { } }; - Input[] inputs = new Input[] { input }; - - // Send empty mouse event. This makes this thread the last to send input, and hence allows it to pass foreground permission checks - _ = NativeMethods.SendInput(1, inputs, Input.Size); - - window.Activate(); - } - - public static void RoundCorners(this Window window) - { - IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(Window.GetWindow(window)).EnsureHandle(); - var attribute = DwmWindowAttributed.DwmaWindowCornerPreference; - var preference = DwmWindowCornerPreference.DwmCpRound; - NativeMethods.DwmSetWindowAttribute(hWnd, attribute, ref preference, sizeof(uint)); - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Helpers/FileExplorerHelper.cs b/src/modules/peek/Peek.UI.WPF/Helpers/FileExplorerHelper.cs deleted file mode 100644 index c5262a3279..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Helpers/FileExplorerHelper.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; - -namespace Peek.UI.Helpers -{ - public static class FileExplorerHelper - { - public static IEnumerable GetSelectedItems(IntPtr handle) - { - var selectedItems = new List(); - var shell = new Shell32.Shell(); - foreach (SHDocVw.InternetExplorer window in shell.Windows()) - { - if (window.HWND == (int)handle) - { - Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); - if (items != null && items.Count > 0) - { - foreach (Shell32.FolderItem item in items) - { - selectedItems.Add(item.Path); - } - } - } - } - - return selectedItems; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Helpers/FileLoadHelper.cs b/src/modules/peek/Peek.UI.WPF/Helpers/FileLoadHelper.cs deleted file mode 100644 index e43e7d72c2..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Helpers/FileLoadHelper.cs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media.Imaging; -using Peek.UI.Models; - -namespace Peek.UI.Helpers -{ - public static class FileLoadHelper - { - public static Task LoadDimensionsAsync(string filename) - { - return Task.Run(() => - { - Size size = new Size(0, 0); - try - { - using (FileStream stream = File.OpenRead(filename)) - { - string extension = Path.GetExtension(stream.Name); - if (FileTypeHelper.IsSupportedImage(extension)) - { - using (System.Drawing.Image sourceImage = System.Drawing.Image.FromStream(stream, false, false)) - { - var rotation = EvaluateRotationToApply(sourceImage); - if (rotation == Rotation.Rotate90 || rotation == Rotation.Rotate270) - { - size = new Size(sourceImage.Height, sourceImage.Width); - } - else - { - size = new Size(sourceImage.Width, sourceImage.Height); - } - - return Task.FromResult(new DimensionData { Size = size, Rotation = rotation }); - } - } - else - { - return Task.FromResult(new DimensionData { Size = size, Rotation = Rotation.Rotate0 }); - } - } - } - catch (Exception) - { - return Task.FromResult(new DimensionData { Size = size, Rotation = Rotation.Rotate0 }); - } - }); - } - - public static async Task LoadThumbnailAsync(string filename, bool iconFallback) - { - var thumbnail = await Task.Run(() => - { - var bitmapSource = ThumbnailHelper.GetThumbnail(filename, iconFallback); - bitmapSource.Freeze(); - return bitmapSource; - }); - - return thumbnail; - } - - public static Task LoadIconAsync(string filename) - { - return Task.Run(() => - { - var bitmapSource = ThumbnailHelper.GetIcon(filename); - bitmapSource.Freeze(); - return bitmapSource; - }); - } - - public static Task LoadFullImageAsync(string filename, Rotation rotation) - { - return Task.Run(() => - { - var bitmap = new BitmapImage(); - bitmap.BeginInit(); - bitmap.CacheOption = BitmapCacheOption.OnLoad; - bitmap.UriSource = new Uri(filename); - bitmap.Rotation = rotation; - bitmap.EndInit(); - bitmap.Freeze(); - return bitmap; - }); - } - - private static Rotation EvaluateRotationToApply(System.Drawing.Image image) - { - PropertyItem? property = image.PropertyItems?.FirstOrDefault(p => p.Id == 274); - - if (property != null && property.Value != null && property.Value.Length > 0) - { - int orientation = property.Value[0]; - - if (orientation == 6) - { - return Rotation.Rotate90; - } - - if (orientation == 3) - { - return Rotation.Rotate180; - } - - if (orientation == 8) - { - return Rotation.Rotate270; - } - } - - return Rotation.Rotate0; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Helpers/FileTypeHelper.cs b/src/modules/peek/Peek.UI.WPF/Helpers/FileTypeHelper.cs deleted file mode 100644 index 40b6a2ad23..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Helpers/FileTypeHelper.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using Peek.UI.Native; -using static Peek.UI.Native.NativeModels; - -namespace Peek.UI.Helpers -{ - public static class FileTypeHelper - { - public static bool IsSupportedImage(string extension) => extension switch - { - ".bmp" => true, - ".gif" => true, - ".jpg" => true, - ".jfif" => true, - ".jfi" => true, - ".jif" => true, - ".jpeg" => true, - ".jpe" => true, - ".png" => true, - ".tif" => true, - ".tiff" => true, - _ => false, - }; - - public static bool IsMedia(string extension) - { - return IsImage(extension) || IsVideo(extension); - } - - public static bool IsImage(string extension) - { - return IsPerceivedType(extension, PerceivedType.Image); - } - - public static bool IsVideo(string extension) - { - return IsPerceivedType(extension, PerceivedType.Video); - } - - public static bool IsDocument(string extension) - { - return IsPerceivedType(extension, PerceivedType.Document); - } - - internal static bool IsPerceivedType(string extension, PerceivedType perceivedType) - { - if (string.IsNullOrEmpty(extension)) - { - return false; - } - - PerceivedType perceived; - Perceived flag; - bool isPerceivedType = false; - - try - { - if (NativeMethods.AssocGetPerceivedType(extension, out perceived, out flag, IntPtr.Zero) == HResult.Ok) - { - isPerceivedType = perceived == perceivedType; - } - } - catch (Exception) - { - // TODO: AssocGetPerceivedType throws on some file types (json, ps1, exe, etc.) - // Properly handle these - return false; - } - - return isPerceivedType; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Helpers/ThumbnailHelper.cs b/src/modules/peek/Peek.UI.WPF/Helpers/ThumbnailHelper.cs deleted file mode 100644 index 77a9bcf099..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Helpers/ThumbnailHelper.cs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows; -using System.Windows.Interop; -using System.Windows.Media.Imaging; -using Peek.UI.Models; -using Peek.UI.Native; -using static Peek.UI.Native.NativeModels; - -namespace Peek.UI.Helpers -{ - public static class ThumbnailHelper - { - private static readonly Assembly Assembly = Assembly.GetExecutingAssembly(); - public static readonly string ProgramDirectory = Directory.GetParent(Assembly.Location)!.ToString(); - public static readonly string ErrorIcon = Path.Combine(ProgramDirectory, "Assets", "error.png"); - - // Based on https://stackoverflow.com/questions/21751747/extract-thumbnail-for-any-file-in-windows - private const string IShellItem2Guid = "7E9FB0D3-919F-4307-AB2E-9B1860310C93"; - - public static BitmapSource GetIcon(string fileName) - { - IntPtr hbitmap; - HResult hr = GetIconImpl(Path.GetFullPath(fileName), out hbitmap); - - if (hr != HResult.Ok) - { - return new BitmapImage(new Uri(ErrorIcon)); - } - - try - { - return Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); - } - finally - { - // delete HBitmap to avoid memory leaks - NativeMethods.DeleteObject(hbitmap); - } - } - - public static BitmapSource GetThumbnail(string fileName, bool iconFallback) - { - IntPtr hbitmap; - HResult hr = GetThumbnailImpl(Path.GetFullPath(fileName), out hbitmap); - - if (hr != HResult.Ok && iconFallback) - { - return GetIcon(fileName); - } - - try - { - return Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); - } - finally - { - // delete HBitmap to avoid memory leaks - NativeMethods.DeleteObject(hbitmap); - } - } - - private static HResult GetIconImpl(string filename, out IntPtr hbitmap) - { - Guid shellItem2Guid = new Guid(IShellItem2Guid); - int retCode = NativeMethods.SHCreateItemFromParsingName(filename, IntPtr.Zero, ref shellItem2Guid, out IShellItem nativeShellItem); - - if (retCode != 0) - { - throw Marshal.GetExceptionForHR(retCode)!; - } - - NativeSize large = new NativeSize { Width = 256, Height = 256 }; - var options = ThumbnailOptions.BiggerSizeOk | ThumbnailOptions.IconOnly; - - HResult hr = ((IShellItemImageFactory)nativeShellItem).GetImage(large, options, out hbitmap); - - Marshal.ReleaseComObject(nativeShellItem); - - return hr; - } - - private static HResult GetThumbnailImpl(string filename, out IntPtr hbitmap) - { - Guid shellItem2Guid = new Guid(IShellItem2Guid); - int retCode = NativeMethods.SHCreateItemFromParsingName(filename, IntPtr.Zero, ref shellItem2Guid, out IShellItem nativeShellItem); - - if (retCode != 0) - { - throw Marshal.GetExceptionForHR(retCode)!; - } - - var extraLarge = new NativeSize { Width = 1024, Height = 1024, }; - var large = new NativeSize { Width = 256, Height = 256 }; - var medium = new NativeSize { Width = 96, Height = 96 }; - var small = new NativeSize { Width = 32, Height = 32 }; - - var options = ThumbnailOptions.BiggerSizeOk | ThumbnailOptions.ThumbnailOnly | ThumbnailOptions.ScaleUp; - - HResult hr = ((IShellItemImageFactory)nativeShellItem).GetImage(extraLarge, options, out hbitmap); - - if (hr != HResult.Ok) - { - hr = ((IShellItemImageFactory)nativeShellItem).GetImage(large, options, out hbitmap); - } - - if (hr != HResult.Ok) - { - hr = ((IShellItemImageFactory)nativeShellItem).GetImage(medium, options, out hbitmap); - } - - if (hr != HResult.Ok) - { - hr = ((IShellItemImageFactory)nativeShellItem).GetImage(small, options, out hbitmap); - } - - Marshal.ReleaseComObject(nativeShellItem); - - return hr; - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Models/DimensionData.cs b/src/modules/peek/Peek.UI.WPF/Models/DimensionData.cs deleted file mode 100644 index 42d0567238..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Models/DimensionData.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media.Imaging; - -namespace Peek.UI.Models -{ - public class DimensionData - { - public Size Size { get; set; } - - public Rotation Rotation { get; set; } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Models/IShellItem.cs b/src/modules/peek/Peek.UI.WPF/Models/IShellItem.cs deleted file mode 100644 index 908e79428c..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Models/IShellItem.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Runtime.InteropServices; -using static Peek.UI.Native.NativeModels; - -namespace Peek.UI.Models -{ - [ComImport] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")] - internal interface IShellItem - { - void BindToHandler( - IntPtr pbc, - [MarshalAs(UnmanagedType.LPStruct)] Guid bhid, - [MarshalAs(UnmanagedType.LPStruct)] Guid riid, - out IntPtr ppv); - - void GetParent(out IShellItem ppsi); - - void GetDisplayName(Sigdn sigdnName, out IntPtr ppszName); - - void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs); - - void Compare(IShellItem psi, uint hint, out int piOrder); - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Models/ObservableObject.cs b/src/modules/peek/Peek.UI.WPF/Models/ObservableObject.cs deleted file mode 100644 index 8925029cbd..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Models/ObservableObject.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Peek.UI.Models -{ - public abstract class ObservableObject : INotifyPropertyChanged - { - public event PropertyChangedEventHandler? PropertyChanged; - - protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Models/ObservableRectangle.cs b/src/modules/peek/Peek.UI.WPF/Models/ObservableRectangle.cs deleted file mode 100644 index 3a9c91c523..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Models/ObservableRectangle.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace Peek.UI.Models -{ - public class ObservableRectangle : ObservableObject - { - private double _left; - - public double Left - { - get - { - return _left; - } - - set - { - if (_left != value) - { - _left = value; - OnPropertyChanged(nameof(Left)); - } - } - } - - private double _top; - - public double Top - { - get - { - return _top; - } - - set - { - if (_top != value) - { - _top = value; - OnPropertyChanged(nameof(Top)); - } - } - } - - private double _height; - - public double Height - { - get - { - return _height; - } - - set - { - if (_height != value) - { - _height = value; - OnPropertyChanged(nameof(Height)); - } - } - } - - private double _width; - - public double Width - { - get - { - return _width; - } - - set - { - if (_width != value) - { - _width = value; - OnPropertyChanged(nameof(Width)); - } - } - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Models/ObservableWindowData.cs b/src/modules/peek/Peek.UI.WPF/Models/ObservableWindowData.cs deleted file mode 100644 index 0aab543369..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Models/ObservableWindowData.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Windows; - -namespace Peek.UI.Models -{ - public class ObservableWindowData : ObservableObject - { - private double _titleBarHeight; - - public double TitleBarHeight - { - get - { - return _titleBarHeight; - } - - set - { - if (_titleBarHeight != value) - { - _titleBarHeight = value; - OnPropertyChanged(nameof(TitleBarHeight)); - } - } - } - - private ObservableRectangle _rectangle = new ObservableRectangle(); - - public ObservableRectangle Rectangle - { - get - { - return _rectangle; - } - - set - { - if (_rectangle != value) - { - _rectangle = value; - OnPropertyChanged(nameof(Rectangle)); - } - } - } - - private string _title = string.Empty; - - public string Title - { - get - { - return _title; - } - - set - { - if (_title != value) - { - _title = value; - OnPropertyChanged(nameof(Title)); - } - } - } - - private Visibility _visibility; - - public Visibility Visibility - { - get - { - return _visibility; - } - - set - { - if (_visibility != value) - { - _visibility = value; - - OnPropertyChanged(nameof(Visibility)); - } - } - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Native/NativeEventWaiter.cs b/src/modules/peek/Peek.UI.WPF/Native/NativeEventWaiter.cs deleted file mode 100644 index efb07bf413..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Native/NativeEventWaiter.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Threading; -using System.Windows; - -namespace Peek.UI.Native -{ - public static class NativeEventWaiter - { - public static void WaitForEventLoop(string eventName, Action callback) - { - new Thread(() => - { - var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName); - while (true) - { - if (eventHandle.WaitOne()) - { - Application.Current.Dispatcher.Invoke(callback); - } - } - }).Start(); - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Native/NativeMethods.cs b/src/modules/peek/Peek.UI.WPF/Native/NativeMethods.cs deleted file mode 100644 index 2be17a45d1..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Native/NativeMethods.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Runtime.InteropServices; -using Peek.UI.Models; -using static Peek.UI.Native.NativeModels; - -namespace Peek.UI.Native -{ - public static class NativeMethods - { - [DllImport("dwmapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern long DwmSetWindowAttribute( - IntPtr hwnd, - DwmWindowAttributed attribute, - ref DwmWindowCornerPreference pvAttribute, - uint cbAttribute); - - [DllImport("gdi32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool DeleteObject(IntPtr hObject); - - [DllImport("Shlwapi.dll", ExactSpelling = true, PreserveSig = false)] - internal static extern HResult AssocGetPerceivedType( - [MarshalAs(UnmanagedType.LPWStr)] string extension, - out PerceivedType perceivedType, - out Perceived perceivedFlags, - IntPtr ptrType); - - [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern int SHCreateItemFromParsingName( - [MarshalAs(UnmanagedType.LPWStr)] string path, - IntPtr pbc, - ref Guid riid, - [MarshalAs(UnmanagedType.Interface)] out IShellItem shellItem); - - [DllImport("user32.dll", SetLastError = true)] - internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); - - [DllImport("user32.dll")] - internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); - - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - internal static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - internal static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); - - [DllImport("user32.dll")] - internal static extern uint SendInput(uint nInputs, Input[] pInputs, int cbSize); - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Native/NativeModels.cs b/src/modules/peek/Peek.UI.WPF/Native/NativeModels.cs deleted file mode 100644 index 1cb3b6421e..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Native/NativeModels.cs +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Runtime.InteropServices; - -namespace Peek.UI.Native -{ - public class NativeModels - { - public const int GwlExStyle = -20; - public const int WsExToolWindow = 0x00000080; - - public enum PerceivedType - { - Folder = -1, - Unknown = 0, - Image = 2, - Video = 4, - Document = 6, - } - - public enum Perceived - { - Undefined = 0x0000, - Softcoded = 0x0001, - Hardcoded = 0x0002, - NativeSupport = 0x0004, - GdiPlus = 0x0010, - WMSDK = 0x0020, - ZipFolder = 0x0040, - } - - public enum HResult - { - Ok = 0x0000, - False = 0x0001, - InvalidArguments = unchecked((int)0x80070057), - OutOfMemory = unchecked((int)0x8007000E), - NoInterface = unchecked((int)0x80004002), - Fail = unchecked((int)0x80004005), - ExtractionFailed = unchecked((int)0x8004B200), - ElementNotFound = unchecked((int)0x80070490), - TypeElementNotFound = unchecked((int)0x8002802B), - NoObject = unchecked((int)0x800401E5), - Win32ErrorCanceled = 1223, - Canceled = unchecked((int)0x800704C7), - ResourceInUse = unchecked((int)0x800700AA), - AccessDenied = unchecked((int)0x80030005), - } - - [StructLayout(LayoutKind.Sequential)] - public struct Input - { - public InputType Type; - public InputUnion Data; - - public static int Size - { - get { return Marshal.SizeOf(typeof(Input)); } - } - } - - [StructLayout(LayoutKind.Explicit)] - public struct InputUnion - { - [FieldOffset(0)] - public MouseInput Mi; - - [FieldOffset(0)] - public KeybdInput Ki; - - [FieldOffset(0)] - public HardwareInput Hi; - } - - [StructLayout(LayoutKind.Sequential)] - public struct MouseInput - { - public int Dx; - public int Dy; - public int MouseData; - public uint DwFlags; - public uint Time; - public UIntPtr DwExtraInfo; - } - - [StructLayout(LayoutKind.Sequential)] - public struct KeybdInput - { - public short WVk; - public short WScan; - public uint DwFlags; - public int Time; - public UIntPtr DwExtraInfo; - } - - [StructLayout(LayoutKind.Sequential)] - public struct HardwareInput - { - public int UMsg; - public short WParamL; - public short WParamH; - } - - public enum InputType : uint - { - InputMouse = 0, - InputKeyboard = 1, - InputHardware = 2, - } - - public enum Sigdn : uint - { - NormalDisplay = 0, - ParentRelativeParsing = 0x80018001, - ParentRelativeForAddressBar = 0x8001c001, - DesktopAbsoluteParsing = 0x80028000, - ParentRelativeEditing = 0x80031001, - DesktopAbsoluteEditing = 0x8004c000, - FileSysPath = 0x80058000, - Url = 0x80068000, - } - - public enum DwmWindowAttributed - { - DwmaWindowCornerPreference = 33, - } - - // The DWM_WINDOW_CORNER_PREFERENCE enum for DwmSetWindowAttribute's third parameter, which tells the function - // what value of the enum to set. - public enum DwmWindowCornerPreference - { - DwmCpDefault = 0, - DwmCpDoNotRound = 1, - DwmCpRound = 2, - DwmCpRoundSmall = 3, - } - - [Flags] - public enum ThumbnailOptions - { - None = 0x00, - BiggerSizeOk = 0x01, - InMemoryOnly = 0x02, - IconOnly = 0x04, - ThumbnailOnly = 0x08, - InCacheOnly = 0x10, - ScaleUp = 0x100, - } - - [ComImport] - [Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IShellItemImageFactory - { - [PreserveSig] - HResult GetImage( - [In, MarshalAs(UnmanagedType.Struct)] NativeSize size, - [In] ThumbnailOptions flags, - [Out] out IntPtr phbm); - } - - [StructLayout(LayoutKind.Sequential)] - internal struct NativeSize - { - private int width; - private int height; - - public int Width - { - set { width = value; } - } - - public int Height - { - set { height = value; } - } - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Peek.UI.WPF.csproj b/src/modules/peek/Peek.UI.WPF/Peek.UI.WPF.csproj deleted file mode 100644 index 8bda35d12b..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Peek.UI.WPF.csproj +++ /dev/null @@ -1,90 +0,0 @@ - - - - WinExe - net7.0-windows10.0.19041.0 - PowerToys.Peek.UI.WPF - enable - true - false - false - ..\..\..\..\$(Platform)\$(Configuration)\modules\Peek.WPF\ - True - Resources\FluentIconsPeek.ico - - - - - tlbimp - 0 - 1 - 50a7e9b0-70ef-11d1-b75a-00a0c90564fe - 0 - false - true - - - tlbimp - 1 - 1 - eab22ac0-30c1-11cf-a7eb-0000c05bae0b - 0 - false - true - - - - - Resources\Peek.ico - - - - - - - - - Always - - - Always - - - - - - - - - - - - - - - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - $(DefaultXamlRuntime) - - - - - - - - diff --git a/src/modules/peek/Peek.UI.WPF/Resources/Peek.ico b/src/modules/peek/Peek.UI.WPF/Resources/Peek.ico deleted file mode 100644 index daf81fdeb3fa4e733ee2bf715e29ba6472131199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152126 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 diff --git a/src/modules/peek/Peek.UI.WPF/Themes/Dark.xaml b/src/modules/peek/Peek.UI.WPF/Themes/Dark.xaml deleted file mode 100644 index 14204cfe7f..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/Dark.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Dark.Accent1 - PowerToysPeek - Accent1 (Dark) - Dark - Accent1 - Black - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Themes/HighContrast1.xaml b/src/modules/peek/Peek.UI.WPF/Themes/HighContrast1.xaml deleted file mode 100644 index cf168baaae..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/HighContrast1.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - HighContrast.Accent2 - PowerToysPeek - Accent2 (HighContrast) - HighContrast - Accent2 - White - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Themes/HighContrast2.xaml b/src/modules/peek/Peek.UI.WPF/Themes/HighContrast2.xaml deleted file mode 100644 index 65d8065e29..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/HighContrast2.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - HighContrast.Accent3 - PowerToysPeek - Accent3 (HighContrast) - HighContrast - Accent3 - White - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Themes/HighContrastBlack.xaml b/src/modules/peek/Peek.UI.WPF/Themes/HighContrastBlack.xaml deleted file mode 100644 index 402f414db6..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/HighContrastBlack.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - HighContrast.Accent4 - PowerToysPeek - Accent4 (HighContrast) - HighContrast - Accent4 - White - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Themes/HighContrastWhite.xaml b/src/modules/peek/Peek.UI.WPF/Themes/HighContrastWhite.xaml deleted file mode 100644 index bfe85de54f..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/HighContrastWhite.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - HighContrast.Accent5 - PowerToysPeek - Accent5 (HighContrast) - HighContrast - Accent5 - White - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Themes/Light.xaml b/src/modules/peek/Peek.UI.WPF/Themes/Light.xaml deleted file mode 100644 index 4ca102d2fe..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Themes/Light.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Light.Accent1 - PowerToysPeek - Accent1 (Light) - Light - Accent1 - White - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/ViewModels/MainViewModel.cs b/src/modules/peek/Peek.UI.WPF/ViewModels/MainViewModel.cs deleted file mode 100644 index 406a36b4a3..0000000000 --- a/src/modules/peek/Peek.UI.WPF/ViewModels/MainViewModel.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media.Imaging; -using Peek.UI.Extensions; -using Peek.UI.Helpers; -using Peek.UI.Models; -using Peek.UI.Native; -using WpfScreenHelper; -using Size = System.Windows.Size; - -namespace Peek.UI.ViewModels -{ - public class MainViewModel : ObservableObject, IDisposable - { - private const double ImageScale = 0.75; - private static readonly Size MinWindowSize = new Size(720, 720); - private static readonly Size AllowedContentGap = new Size(220, 220); - - private CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); - - private CancellationToken CancellationToken => _cancellationTokenSource.Token; - - public IntPtr ForegroundWindowHandle { get; internal set; } - - public Image ImageControl { get; set; } - - public LinkedList SelectedFilePaths { get; set; } = new LinkedList(); - - private BitmapSource? _bitmap; - - public BitmapSource? Bitmap - { - get - { - return _bitmap; - } - - set - { - if (_bitmap != value) - { - _bitmap = value; - OnPropertyChanged(nameof(Bitmap)); - } - } - } - - private LinkedListNode? _currentSelectedFilePath; - - public LinkedListNode? CurrentSelectedFilePath - { - get - { - return _currentSelectedFilePath; - } - - set - { - if (_currentSelectedFilePath != value) - { - _currentSelectedFilePath = value; - var title = Path.GetFileName(_currentSelectedFilePath?.Value ?? string.Empty); - MainWindowData.Title = title; - OnPropertyChanged(nameof(CurrentSelectedFilePath)); - } - } - } - - public Visibility IsImageReady => IsLoading ? Visibility.Collapsed : Visibility.Visible; - - private bool _isLoading = true; - - public bool IsLoading - { - get - { - return _isLoading; - } - - set - { - if (_isLoading != value) - { - _isLoading = value; - OnPropertyChanged(nameof(IsLoading)); - OnPropertyChanged(nameof(IsImageReady)); - } - } - } - - private ObservableWindowData _mainWindowData = new ObservableWindowData(); - - public ObservableWindowData MainWindowData - { - get - { - return _mainWindowData; - } - - set - { - if (_mainWindowData != value) - { - _mainWindowData = value; - OnPropertyChanged(nameof(MainWindowData)); - } - } - } - - public MainViewModel(Image imageControl) - { - ImageControl = imageControl; - } - - // TODO: Implement proper disposal pattern - public void Dispose() - { - _cancellationTokenSource.Dispose(); - GC.SuppressFinalize(this); - } - - public void ClearSelection() - { - _cancellationTokenSource.Cancel(); - _cancellationTokenSource = new CancellationTokenSource(); - - CurrentSelectedFilePath = null; - MainWindowData.Visibility = Visibility.Collapsed; - } - - public bool TryUpdateSelectedFilePaths() - { - ForegroundWindowHandle = NativeMethods.GetForegroundWindow(); - - // TODO: Get all neighborings files in correct sorted order - var selectedItems = FileExplorerHelper.GetSelectedItems(ForegroundWindowHandle); - - var isDifferentSelectedItems = !SelectedFilePaths.SequenceEqual(selectedItems); - - if (isDifferentSelectedItems) - { - SelectedFilePaths = new LinkedList(selectedItems); - } - - CurrentSelectedFilePath = SelectedFilePaths.First; - - return isDifferentSelectedItems; - } - - // TODO: Implement proper cancellation pattern to support quick navigation - public async Task RenderImageToWindowAsync(string filename) - { - IsLoading = true; - - var screen = Screen.FromHandle(ForegroundWindowHandle); - Size maxWindowSize = new Size(screen.WpfBounds.Width * ImageScale, screen.WpfBounds.Height * ImageScale); - - // TODO: Support preview or thumbnail for document files - if (FileTypeHelper.IsSupportedImage(Path.GetExtension(filename))) - { - await RenderSupportedImageToWindowAsync(filename, screen.Bounds, maxWindowSize); - } - else if (FileTypeHelper.IsMedia(Path.GetExtension(filename)) || FileTypeHelper.IsDocument(Path.GetExtension(filename))) - { - await RenderMediaOrDocumentToWindowAsync(filename, screen.Bounds, maxWindowSize); - } - else - { - await RenderUnsupportedFileToWindowAsync(filename, screen.Bounds, maxWindowSize); - } - } - - private async Task RenderSupportedImageToWindowAsync(string filename, Rect windowBounds, Size maxWindowSize) - { - DimensionData dimensionData = await FileLoadHelper.LoadDimensionsAsync(filename); - if (CancellationToken.IsCancellationRequested) - { - _cancellationTokenSource = new CancellationTokenSource(); - return; - } - - var windowRect = dimensionData.Size.Fit(windowBounds, maxWindowSize, MinWindowSize, AllowedContentGap, MainWindowData.TitleBarHeight); - - MainWindowData.Rectangle.Width = windowRect.Width; - MainWindowData.Rectangle.Height = windowRect.Height; - MainWindowData.Rectangle.Left = windowRect.Left; - MainWindowData.Rectangle.Top = windowRect.Top; - - if (dimensionData.Size.Width > MainWindowData.Rectangle.Width || dimensionData.Size.Height > MainWindowData.Rectangle.Height) - { - ImageControl.StretchDirection = StretchDirection.Both; - } - else - { - ImageControl.StretchDirection = StretchDirection.DownOnly; - } - - await LoadImageAsync(filename, ImageControl, dimensionData.Rotation, CancellationToken); - } - - private async Task RenderMediaOrDocumentToWindowAsync(string filename, Rect windowBounds, Size maxWindowSize) - { - var bitmap = await FileLoadHelper.LoadThumbnailAsync(filename, true); - if (CancellationToken.IsCancellationRequested) - { - _cancellationTokenSource = new CancellationTokenSource(); - return; - } - - Bitmap = bitmap; - - var imageSize = new Size(bitmap.PixelWidth, bitmap.PixelHeight); - var windowRect = imageSize.Fit(windowBounds, maxWindowSize, MinWindowSize, AllowedContentGap, MainWindowData.TitleBarHeight); - - MainWindowData.Rectangle.Width = windowRect.Width; - MainWindowData.Rectangle.Height = windowRect.Height; - MainWindowData.Rectangle.Left = windowRect.Left; - MainWindowData.Rectangle.Top = windowRect.Top; - - MainWindowData.Visibility = Visibility.Visible; - IsLoading = false; - } - - private async Task RenderUnsupportedFileToWindowAsync(string filename, Rect windowBounds, Size maxWindowSize) - { - var contentSize = new Size(0, 0); - var windowRect = contentSize.Fit(windowBounds, maxWindowSize, MinWindowSize, AllowedContentGap, MainWindowData.TitleBarHeight); - - MainWindowData.Rectangle.Width = windowRect.Width; - MainWindowData.Rectangle.Height = windowRect.Height; - MainWindowData.Rectangle.Left = windowRect.Left; - MainWindowData.Rectangle.Top = windowRect.Top; - - var bitmap = await FileLoadHelper.LoadIconAsync(filename); - if (CancellationToken.IsCancellationRequested) - { - _cancellationTokenSource = new CancellationTokenSource(); - return; - } - - Bitmap = bitmap; - MainWindowData.Visibility = Visibility.Visible; - IsLoading = false; - } - - private Task LoadImageAsync(string filename, System.Windows.Controls.Image imageControl, Rotation rotation, CancellationToken cancellationToken) - { - bool isFullImageLoaded = false; - bool isThumbnailLoaded = false; - var thumbnailLoadTask = imageControl.Dispatcher.Invoke(async () => - { - var bitmap = await FileLoadHelper.LoadThumbnailAsync(filename, false); - isThumbnailLoaded = true; - - if (CancellationToken.IsCancellationRequested) - { - _cancellationTokenSource = new CancellationTokenSource(); - return; - } - - if (!isFullImageLoaded) - { - Bitmap = bitmap; - MainWindowData.Visibility = Visibility.Visible; - IsLoading = false; - } - }); - - var fullImageLoadTask = imageControl.Dispatcher.Invoke(async () => - { - var bitmap = await FileLoadHelper.LoadFullImageAsync(filename, rotation); - isFullImageLoaded = true; - - if (CancellationToken.IsCancellationRequested) - { - _cancellationTokenSource = new CancellationTokenSource(); - return; - } - - Bitmap = bitmap; - if (!isThumbnailLoaded) - { - MainWindowData.Visibility = Visibility.Visible; - IsLoading = false; - } - }); - - return Task.WhenAll(thumbnailLoadTask, fullImageLoadTask); - } - } -} diff --git a/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml b/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml deleted file mode 100644 index 6da3d32725..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml.cs b/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml.cs deleted file mode 100644 index dcfbc5cd53..0000000000 --- a/src/modules/peek/Peek.UI.WPF/Views/MainWindow.xaml.cs +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Windows; -using System.Windows.Input; -using interop; -using ModernWpf.Controls; -using Peek.UI.Extensions; -using Peek.UI.Native; -using Peek.UI.ViewModels; - -namespace Peek.UI.Views -{ - /// - /// Interaction logic for MainWindow.xaml - /// - public partial class MainWindow : Window, IDisposable - { - private readonly MainViewModel _viewModel; - - public MainWindow() - { - InitializeComponent(); - - this.RoundCorners(); - - _viewModel = new MainViewModel(ImageControl); - _viewModel.PropertyChanged += MainViewModel_PropertyChanged; - - DataContext = _viewModel; - - NativeEventWaiter.WaitForEventLoop(Constants.ShowPeekEvent(), OnPeekHotkey); - - Loaded += MainWindow_Loaded; - Closing += MainWindow_Closing; - KeyDown += MainWindow_KeyDown; - } - - private void MainWindow_Loaded(object sender, RoutedEventArgs e) - { - _viewModel.MainWindowData.Visibility = Visibility.Collapsed; - _viewModel.MainWindowData.TitleBarHeight = TitleBar.GetHeight(this); - _viewModel.ImageControl = ImageControl; - } - - private void MainWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e) - { - _viewModel.MainWindowData.Visibility = Visibility.Collapsed; - e.Cancel = true; - } - - private void MainWindow_KeyDown(object? sender, KeyEventArgs e) - { - if (!e.IsRepeat && _viewModel.CurrentSelectedFilePath != null) - { - switch (e.Key) - { - case Key.Left: - _viewModel.CurrentSelectedFilePath = _viewModel.CurrentSelectedFilePath.GetPreviousOrLast(); - e.Handled = true; - break; - - case Key.Right: - _viewModel.CurrentSelectedFilePath = _viewModel.CurrentSelectedFilePath.GetNextOrFirst(); - e.Handled = true; - break; - - default: break; - } - } - } - - public void Dispose() - { - _viewModel.Dispose(); - GC.SuppressFinalize(this); - } - - protected override void OnSourceInitialized(EventArgs e) - { - base.OnSourceInitialized(e); - this.SetToolStyle(); - } - - private async void MainViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case nameof(MainViewModel.CurrentSelectedFilePath): - if (_viewModel.CurrentSelectedFilePath != null) - { - await _viewModel.RenderImageToWindowAsync(_viewModel.CurrentSelectedFilePath.Value); - } - - break; - } - } - - private void OnPeekHotkey() - { - if (IsActive && _viewModel.MainWindowData.Visibility == Visibility.Visible) - { - _viewModel.ClearSelection(); - } - else - { - _viewModel.TryUpdateSelectedFilePaths(); - } - - this.BringToForeground(); - } - } -}