2023-05-02 13:10:54 +02:00
// Copyright (c) Microsoft Corporation
2020-04-10 15:22:07 -07:00
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
2022-04-19 22:00:28 +02:00
using System ;
using System.Diagnostics ;
2021-02-26 13:21:58 +02:00
using System.Globalization ;
2022-04-19 22:00:28 +02:00
using System.Linq ;
using System.Threading.Tasks ;
2023-08-10 10:02:50 +02:00
using Common.UI ;
2022-04-19 22:00:28 +02:00
using interop ;
using ManagedCommon ;
2020-10-29 14:24:16 -07:00
using Microsoft.PowerToys.Settings.UI.Helpers ;
2021-02-26 13:21:58 +02:00
using Microsoft.PowerToys.Settings.UI.Library ;
2022-04-19 22:00:28 +02:00
using Microsoft.PowerToys.Settings.UI.Library.Telemetry.Events ;
2023-01-31 00:00:11 +01:00
using Microsoft.PowerToys.Settings.UI.Views ;
2022-04-19 22:00:28 +02:00
using Microsoft.PowerToys.Telemetry ;
using Microsoft.UI.Xaml ;
using Windows.UI.Popups ;
using WinRT.Interop ;
2023-05-02 13:10:54 +02:00
using WinUIEx ;
2020-03-06 17:46:51 -08:00
2020-03-11 10:43:32 -07:00
namespace Microsoft.PowerToys.Settings.UI
2020-03-06 17:46:51 -08:00
{
2022-04-19 22:00:28 +02:00
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : Application
2020-03-06 17:46:51 -08:00
{
2022-04-19 22:00:28 +02:00
private enum Arguments
{
PTPipeName = 1 ,
SettingsPipeName ,
PTPid ,
Theme , // used in the old settings
ElevatedStatus ,
IsUserAdmin ,
ShowOobeWindow ,
ShowScoobeWindow ,
2023-01-31 00:00:11 +01:00
ShowFlyout ,
2023-02-03 15:10:14 +00:00
ContainsSettingsWindow ,
ContainsFlyoutPosition ,
2022-04-19 22:00:28 +02:00
}
// Quantity of arguments
2023-02-03 15:10:14 +00:00
private const int RequiredArgumentsQty = 12 ;
2022-04-19 22:00:28 +02:00
// Create an instance of the IPC wrapper.
private static TwoWayPipeMessageIPCManaged ipcmanager ;
public static bool IsElevated { get ; set ; }
public static bool IsUserAnAdmin { get ; set ; }
public static int PowerToysPID { get ; set ; }
public bool ShowOobe { get ; set ; }
2023-01-31 00:00:11 +01:00
public bool ShowFlyout { get ; set ; }
2022-04-19 22:00:28 +02:00
public bool ShowScoobe { get ; set ; }
[Settings]Adding a Dashboard Panel (#29023)
* Dashboard: modifying page content + adding SW version button.
* Visual tweaks and minor viewmodel changes
* Updated spacing
* Adding Settings icon
* Settiing the Dashboard page as the default one. Adding functionality to switch to settings pages from the Dashboard page. Localizing texts.
* fixing csproj file
* Reimplementing Active modules handling, showing only the active modules (and not having invisible inactive modules).
* Removing unneccessary binding
* Fix text wrapping
* Adding Registry previewer launch, adding activation mode for FindMyMouse and QuickAccent, modify File Locksmith description.
* Spell checker fix typo
* Adding GPO-blocked state, modifying buttons: adding description, icon.
* Modifying dashboard button layout
* Use SettingsCard instead of button
* Restructuring the dashboard panel
* Removing togglebuttons from the left panel. Showing only active modules. Adding key remappings (to KBM)
* Removing settings buttons, removing descriptions, icons from buttons. Add update of remapped keys, shortcuts.
* Refactoring dashboard
* Making list always visible and fixing scrolling behavior
* Adding background gradient to cards
* Removing keyboard manager's key mappings, minor changes in texts, fixing enabled state when GPO-enabled.
* Use ListView instead of ItemsRepeater
* Updates
* removing right panel with all modules. Extending "left" panel with toggleswitches, showing all modules.
* Separate lists
* Adding Flyout with key remappings for KBM module, adding IsLocked property, icons
* Visual tweaks
* Tweaks
* Fixing lock icon margin
* Minor fixes.
* Removing unused resources
* Make Dashboard default when coming from the OOBE General
* Removed the Previous, Next Layout buttons from FancyZones. Added activation information
---------
Co-authored-by: Niels Laute <niels.laute@live.nl>
2023-10-20 14:23:25 +02:00
public Type StartupPage { get ; set ; } = typeof ( Views . DashboardPage ) ;
2022-04-19 22:00:28 +02:00
public static Action < string > IPCMessageReceivedCallback { get ; set ; }
2022-07-05 15:25:25 +03:00
private static bool loggedImmersiveDarkException ;
2022-04-19 22:00:28 +02:00
/// <summary>
/// Initializes a new instance of the <see cref="App"/> class.
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
2020-03-06 17:46:51 -08:00
public App ( )
{
2023-03-21 10:27:29 +01:00
Logger . InitializeLogger ( "\\Settings\\Logs" ) ;
2022-04-19 22:00:28 +02:00
this . InitializeComponent ( ) ;
}
2023-01-31 00:00:11 +01:00
public static void OpenSettingsWindow ( Type type = null , bool ensurePageIsSelected = false )
2022-04-19 22:00:28 +02:00
{
if ( settingsWindow = = null )
{
2022-07-01 21:52:48 +12:00
settingsWindow = new MainWindow ( IsDarkTheme ( ) ) ;
2022-04-19 22:00:28 +02:00
}
2020-05-09 14:10:57 -07:00
2022-04-19 22:00:28 +02:00
settingsWindow . Activate ( ) ;
2023-06-11 17:54:01 +02:00
2023-01-31 00:00:11 +01:00
if ( type ! = null )
{
settingsWindow . NavigateToSection ( type ) ;
}
if ( ensurePageIsSelected )
{
settingsWindow . EnsurePageIsSelected ( ) ;
}
2022-04-19 22:00:28 +02:00
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="args">Details about the launch request and process.</param>
protected override void OnLaunched ( Microsoft . UI . Xaml . LaunchActivatedEventArgs args )
{
var cmdArgs = Environment . GetCommandLineArgs ( ) ;
2022-07-01 21:52:48 +12:00
var isDark = IsDarkTheme ( ) ;
2022-04-19 22:00:28 +02:00
if ( cmdArgs ! = null & & cmdArgs . Length > = RequiredArgumentsQty )
{
// Skip the first argument which is prepended when launched by explorer
if ( cmdArgs [ 0 ] . EndsWith ( ".dll" , StringComparison . InvariantCultureIgnoreCase ) & & cmdArgs [ 1 ] . EndsWith ( ".exe" , StringComparison . InvariantCultureIgnoreCase ) & & ( cmdArgs . Length > = RequiredArgumentsQty + 1 ) )
{
cmdArgs = cmdArgs . Skip ( 1 ) . ToArray ( ) ;
}
_ = int . TryParse ( cmdArgs [ ( int ) Arguments . PTPid ] , out int powerToysPID ) ;
PowerToysPID = powerToysPID ;
IsElevated = cmdArgs [ ( int ) Arguments . ElevatedStatus ] = = "true" ;
IsUserAnAdmin = cmdArgs [ ( int ) Arguments . IsUserAdmin ] = = "true" ;
ShowOobe = cmdArgs [ ( int ) Arguments . ShowOobeWindow ] = = "true" ;
ShowScoobe = cmdArgs [ ( int ) Arguments . ShowScoobeWindow ] = = "true" ;
2023-01-31 00:00:11 +01:00
ShowFlyout = cmdArgs [ ( int ) Arguments . ShowFlyout ] = = "true" ;
2023-02-03 15:10:14 +00:00
bool containsSettingsWindow = cmdArgs [ ( int ) Arguments . ContainsSettingsWindow ] = = "true" ;
bool containsFlyoutPosition = cmdArgs [ ( int ) Arguments . ContainsFlyoutPosition ] = = "true" ;
2022-04-19 22:00:28 +02:00
2023-02-03 15:10:14 +00:00
// To keep track of variable arguments
int currentArgumentIndex = RequiredArgumentsQty ;
if ( containsSettingsWindow )
2022-04-19 22:00:28 +02:00
{
2023-05-02 13:10:54 +02:00
// Open specific window
StartupPage = GetPage ( cmdArgs [ currentArgumentIndex ] ) ;
2023-02-03 15:10:14 +00:00
currentArgumentIndex + + ;
}
int flyout_x = 0 ;
int flyout_y = 0 ;
if ( containsFlyoutPosition )
{
// get the flyout position arguments
2023-03-16 15:51:31 +01:00
_ = int . TryParse ( cmdArgs [ currentArgumentIndex + + ] , out flyout_x ) ;
_ = int . TryParse ( cmdArgs [ currentArgumentIndex + + ] , out flyout_y ) ;
2022-04-19 22:00:28 +02:00
}
RunnerHelper . WaitForPowerToysRunner ( PowerToysPID , ( ) = >
{
Environment . Exit ( 0 ) ;
} ) ;
ipcmanager = new TwoWayPipeMessageIPCManaged ( cmdArgs [ ( int ) Arguments . SettingsPipeName ] , cmdArgs [ ( int ) Arguments . PTPipeName ] , ( string message ) = >
{
if ( IPCMessageReceivedCallback ! = null & & message . Length > 0 )
{
IPCMessageReceivedCallback ( message ) ;
}
} ) ;
ipcmanager . Start ( ) ;
2023-01-31 00:00:11 +01:00
if ( ! ShowOobe & & ! ShowScoobe & & ! ShowFlyout )
2022-04-19 22:00:28 +02:00
{
2022-07-01 21:52:48 +12:00
settingsWindow = new MainWindow ( isDark ) ;
2022-04-19 22:00:28 +02:00
settingsWindow . Activate ( ) ;
2023-06-11 17:54:01 +02:00
settingsWindow . ExtendsContentIntoTitleBar = true ;
2022-04-19 22:00:28 +02:00
settingsWindow . NavigateToSection ( StartupPage ) ;
2023-05-02 13:10:54 +02:00
// https://github.com/microsoft/microsoft-ui-xaml/issues/7595 - Activate doesn't bring window to the foreground
// Need to call SetForegroundWindow to actually gain focus.
Utils . BecomeForegroundWindow ( settingsWindow . GetWindowHandle ( ) ) ;
2022-04-19 22:00:28 +02:00
}
else
{
2022-05-19 15:12:59 +02:00
// Create the Settings window hidden so that it's fully initialized and
2022-04-19 22:00:28 +02:00
// it will be ready to receive the notification if the user opens
// the Settings from the tray icon.
2022-07-01 21:52:48 +12:00
settingsWindow = new MainWindow ( isDark , true ) ;
2022-05-19 15:12:59 +02:00
2022-04-19 22:00:28 +02:00
if ( ShowOobe )
{
PowerToysTelemetry . Log . WriteEvent ( new OobeStartedEvent ( ) ) ;
2022-07-01 21:52:48 +12:00
OobeWindow oobeWindow = new OobeWindow ( OOBE . Enums . PowerToysModules . Overview , isDark ) ;
2022-04-19 22:00:28 +02:00
oobeWindow . Activate ( ) ;
2023-06-11 17:54:01 +02:00
oobeWindow . ExtendsContentIntoTitleBar = true ;
2022-04-19 22:00:28 +02:00
SetOobeWindow ( oobeWindow ) ;
}
else if ( ShowScoobe )
{
PowerToysTelemetry . Log . WriteEvent ( new ScoobeStartedEvent ( ) ) ;
2022-07-01 21:52:48 +12:00
OobeWindow scoobeWindow = new OobeWindow ( OOBE . Enums . PowerToysModules . WhatsNew , isDark ) ;
2022-04-19 22:00:28 +02:00
scoobeWindow . Activate ( ) ;
2023-06-11 17:54:01 +02:00
scoobeWindow . ExtendsContentIntoTitleBar = true ;
2022-04-19 22:00:28 +02:00
SetOobeWindow ( scoobeWindow ) ;
}
2023-01-31 00:00:11 +01:00
else if ( ShowFlyout )
{
2023-02-03 15:10:14 +00:00
POINT ? p = null ;
if ( containsFlyoutPosition )
{
p = new POINT ( flyout_x , flyout_y ) ;
}
ShellPage . OpenFlyoutCallback ( p ) ;
2023-01-31 00:00:11 +01:00
}
2022-04-19 22:00:28 +02:00
}
}
else
{
2023-08-10 10:02:50 +02:00
#if DEBUG
2022-04-19 22:00:28 +02:00
// For debugging purposes
// Window is also needed to show MessageDialog
2022-07-01 21:52:48 +12:00
settingsWindow = new MainWindow ( isDark ) ;
2023-06-11 17:54:01 +02:00
settingsWindow . ExtendsContentIntoTitleBar = true ;
2022-04-19 22:00:28 +02:00
settingsWindow . Activate ( ) ;
2023-06-11 17:54:01 +02:00
settingsWindow . NavigateToSection ( StartupPage ) ;
2023-08-10 10:02:50 +02:00
ShowMessageDialog ( "The application is running in Debug mode." , "DEBUG" ) ;
2022-07-27 12:39:31 +02:00
#else
[Settings]Adding a Dashboard Panel (#29023)
* Dashboard: modifying page content + adding SW version button.
* Visual tweaks and minor viewmodel changes
* Updated spacing
* Adding Settings icon
* Settiing the Dashboard page as the default one. Adding functionality to switch to settings pages from the Dashboard page. Localizing texts.
* fixing csproj file
* Reimplementing Active modules handling, showing only the active modules (and not having invisible inactive modules).
* Removing unneccessary binding
* Fix text wrapping
* Adding Registry previewer launch, adding activation mode for FindMyMouse and QuickAccent, modify File Locksmith description.
* Spell checker fix typo
* Adding GPO-blocked state, modifying buttons: adding description, icon.
* Modifying dashboard button layout
* Use SettingsCard instead of button
* Restructuring the dashboard panel
* Removing togglebuttons from the left panel. Showing only active modules. Adding key remappings (to KBM)
* Removing settings buttons, removing descriptions, icons from buttons. Add update of remapped keys, shortcuts.
* Refactoring dashboard
* Making list always visible and fixing scrolling behavior
* Adding background gradient to cards
* Removing keyboard manager's key mappings, minor changes in texts, fixing enabled state when GPO-enabled.
* Use ListView instead of ItemsRepeater
* Updates
* removing right panel with all modules. Extending "left" panel with toggleswitches, showing all modules.
* Separate lists
* Adding Flyout with key remappings for KBM module, adding IsLocked property, icons
* Visual tweaks
* Tweaks
* Fixing lock icon margin
* Minor fixes.
* Removing unused resources
* Make Dashboard default when coming from the OOBE General
* Removed the Previous, Next Layout buttons from FancyZones. Added activation information
---------
Co-authored-by: Niels Laute <niels.laute@live.nl>
2023-10-20 14:23:25 +02:00
/* If we try to run Settings as a standalone app, it will start PowerToys.exe if not running and open Settings again through it in the Dashboard page. */
SettingsDeepLink . OpenSettings ( SettingsDeepLink . SettingsWindow . Dashboard , true ) ;
2023-08-10 10:02:50 +02:00
Exit ( ) ;
2022-07-27 12:39:31 +02:00
#endif
2022-04-19 22:00:28 +02:00
}
}
2022-07-27 12:39:31 +02:00
#if ! DEBUG
private async void ShowMessageDialogAndExit ( string content , string title = null )
#else
2022-04-19 22:00:28 +02:00
private async void ShowMessageDialog ( string content , string title = null )
2022-07-27 12:39:31 +02:00
#endif
2022-04-19 22:00:28 +02:00
{
await ShowDialogAsync ( content , title ) ;
2022-07-27 12:39:31 +02:00
#if ! DEBUG
this . Exit ( ) ;
#endif
2022-04-19 22:00:28 +02:00
}
public static Task < IUICommand > ShowDialogAsync ( string content , string title = null )
{
var dialog = new MessageDialog ( content , title ? ? string . Empty ) ;
var handle = NativeMethods . GetActiveWindow ( ) ;
if ( handle = = IntPtr . Zero )
{
throw new InvalidOperationException ( ) ;
}
InitializeWithWindow . Initialize ( dialog , handle ) ;
return dialog . ShowAsync ( ) . AsTask < IUICommand > ( ) ;
}
public static TwoWayPipeMessageIPCManaged GetTwoWayIPCManager ( )
{
return ipcmanager ;
2020-03-06 17:46:51 -08:00
}
2021-02-26 13:21:58 +02:00
2023-06-11 17:54:01 +02:00
public static ElementTheme SelectedTheme ( )
2022-07-01 21:52:48 +12:00
{
2023-06-11 17:54:01 +02:00
switch ( SettingsRepository < GeneralSettings > . GetInstance ( settingsUtils ) . SettingsConfig . Theme . ToUpper ( CultureInfo . InvariantCulture ) )
{
case "DARK" : return ElementTheme . Dark ;
case "LIGHT" : return ElementTheme . Light ;
default : return ElementTheme . Default ;
}
2022-07-01 21:52:48 +12:00
}
2021-02-26 13:21:58 +02:00
public static bool IsDarkTheme ( )
{
2022-07-01 21:52:48 +12:00
var selectedTheme = SelectedTheme ( ) ;
2023-06-11 17:54:01 +02:00
return selectedTheme = = ElementTheme . Dark | | ( selectedTheme = = ElementTheme . Default & & ThemeHelpers . GetAppTheme ( ) = = AppTheme . Dark ) ;
2022-07-01 21:52:48 +12:00
}
public static void HandleThemeChange ( )
{
2022-07-05 15:25:25 +03:00
try
2022-07-01 21:52:48 +12:00
{
2023-06-11 17:54:01 +02:00
bool isDark = IsDarkTheme ( ) ;
2022-07-05 15:25:25 +03:00
if ( settingsWindow ! = null )
{
var hWnd = WinRT . Interop . WindowNative . GetWindowHandle ( settingsWindow ) ;
ThemeHelpers . SetImmersiveDarkMode ( hWnd , isDark ) ;
2023-06-11 17:54:01 +02:00
SetContentTheme ( isDark , settingsWindow ) ;
2022-07-05 15:25:25 +03:00
}
2022-07-01 21:52:48 +12:00
2022-07-05 15:25:25 +03:00
if ( oobeWindow ! = null )
{
var hWnd = WinRT . Interop . WindowNative . GetWindowHandle ( oobeWindow ) ;
ThemeHelpers . SetImmersiveDarkMode ( hWnd , isDark ) ;
2023-09-07 18:44:42 +03:00
oobeWindow . SetTheme ( isDark ) ;
2023-06-11 17:54:01 +02:00
SetContentTheme ( isDark , oobeWindow ) ;
2022-07-05 15:25:25 +03:00
}
2022-07-01 21:52:48 +12:00
2023-06-11 17:54:01 +02:00
if ( SelectedTheme ( ) = = ElementTheme . Default )
2022-07-05 15:25:25 +03:00
{
themeListener = new ThemeListener ( ) ;
themeListener . ThemeChanged + = ( _ ) = > HandleThemeChange ( ) ;
}
else if ( themeListener ! = null )
{
themeListener . Dispose ( ) ;
themeListener = null ;
}
2022-07-01 21:52:48 +12:00
}
2022-07-05 15:25:25 +03:00
catch ( Exception e )
2022-07-01 21:52:48 +12:00
{
2022-07-05 15:25:25 +03:00
if ( ! loggedImmersiveDarkException )
{
Logger . LogError ( $"HandleThemeChange exception. Please install .NET 4." , e ) ;
loggedImmersiveDarkException = true ;
}
2022-07-01 21:52:48 +12:00
}
2021-02-26 13:21:58 +02:00
}
2023-06-11 17:54:01 +02:00
public static void SetContentTheme ( bool isDark , WindowEx window )
{
var rootGrid = ( FrameworkElement ) window . Content ;
if ( rootGrid ! = null )
{
if ( isDark )
{
rootGrid . RequestedTheme = ElementTheme . Dark ;
}
else
{
rootGrid . RequestedTheme = ElementTheme . Light ;
}
}
}
2021-02-26 13:21:58 +02:00
private static ISettingsUtils settingsUtils = new SettingsUtils ( ) ;
2022-04-19 22:00:28 +02:00
private static MainWindow settingsWindow ;
private static OobeWindow oobeWindow ;
2023-01-31 00:00:11 +01:00
private static FlyoutWindow flyoutWindow ;
2022-07-01 21:52:48 +12:00
private static ThemeListener themeListener ;
2022-04-19 22:00:28 +02:00
public static void ClearSettingsWindow ( )
{
settingsWindow = null ;
}
public static MainWindow GetSettingsWindow ( )
{
return settingsWindow ;
}
public static OobeWindow GetOobeWindow ( )
{
return oobeWindow ;
}
2023-01-31 00:00:11 +01:00
public static FlyoutWindow GetFlyoutWindow ( )
{
return flyoutWindow ;
}
2022-04-19 22:00:28 +02:00
public static void SetOobeWindow ( OobeWindow window )
{
oobeWindow = window ;
}
2023-01-31 00:00:11 +01:00
public static void SetFlyoutWindow ( FlyoutWindow window )
{
flyoutWindow = window ;
}
2022-04-19 22:00:28 +02:00
public static void ClearOobeWindow ( )
{
oobeWindow = null ;
}
2023-01-31 00:00:11 +01:00
public static void ClearFlyoutWindow ( )
{
flyoutWindow = null ;
}
2023-05-02 13:10:54 +02:00
public static Type GetPage ( string settingWindow )
{
switch ( settingWindow )
{
[Settings]Adding a Dashboard Panel (#29023)
* Dashboard: modifying page content + adding SW version button.
* Visual tweaks and minor viewmodel changes
* Updated spacing
* Adding Settings icon
* Settiing the Dashboard page as the default one. Adding functionality to switch to settings pages from the Dashboard page. Localizing texts.
* fixing csproj file
* Reimplementing Active modules handling, showing only the active modules (and not having invisible inactive modules).
* Removing unneccessary binding
* Fix text wrapping
* Adding Registry previewer launch, adding activation mode for FindMyMouse and QuickAccent, modify File Locksmith description.
* Spell checker fix typo
* Adding GPO-blocked state, modifying buttons: adding description, icon.
* Modifying dashboard button layout
* Use SettingsCard instead of button
* Restructuring the dashboard panel
* Removing togglebuttons from the left panel. Showing only active modules. Adding key remappings (to KBM)
* Removing settings buttons, removing descriptions, icons from buttons. Add update of remapped keys, shortcuts.
* Refactoring dashboard
* Making list always visible and fixing scrolling behavior
* Adding background gradient to cards
* Removing keyboard manager's key mappings, minor changes in texts, fixing enabled state when GPO-enabled.
* Use ListView instead of ItemsRepeater
* Updates
* removing right panel with all modules. Extending "left" panel with toggleswitches, showing all modules.
* Separate lists
* Adding Flyout with key remappings for KBM module, adding IsLocked property, icons
* Visual tweaks
* Tweaks
* Fixing lock icon margin
* Minor fixes.
* Removing unused resources
* Make Dashboard default when coming from the OOBE General
* Removed the Previous, Next Layout buttons from FancyZones. Added activation information
---------
Co-authored-by: Niels Laute <niels.laute@live.nl>
2023-10-20 14:23:25 +02:00
case "Dashboard" : return typeof ( DashboardPage ) ;
2023-05-02 13:10:54 +02:00
case "Overview" : return typeof ( GeneralPage ) ;
case "AlwaysOnTop" : return typeof ( AlwaysOnTopPage ) ;
case "Awake" : return typeof ( AwakePage ) ;
case "ColorPicker" : return typeof ( ColorPickerPage ) ;
case "FancyZones" : return typeof ( FancyZonesPage ) ;
case "FileLocksmith" : return typeof ( FileLocksmithPage ) ;
case "Run" : return typeof ( PowerLauncherPage ) ;
case "ImageResizer" : return typeof ( ImageResizerPage ) ;
case "KBM" : return typeof ( KeyboardManagerPage ) ;
case "MouseUtils" : return typeof ( MouseUtilsPage ) ;
2023-05-15 23:32:26 +01:00
case "MouseWithoutBorders" : return typeof ( MouseWithoutBordersPage ) ;
2023-05-02 13:10:54 +02:00
case "PowerRename" : return typeof ( PowerRenamePage ) ;
case "QuickAccent" : return typeof ( PowerAccentPage ) ;
case "FileExplorer" : return typeof ( PowerPreviewPage ) ;
case "ShortcutGuide" : return typeof ( ShortcutGuidePage ) ;
case "PowerOCR" : return typeof ( PowerOcrPage ) ;
case "VideoConference" : return typeof ( VideoConferencePage ) ;
case "MeasureTool" : return typeof ( MeasureToolPage ) ;
case "Hosts" : return typeof ( HostsPage ) ;
case "RegistryPreview" : return typeof ( RegistryPreviewPage ) ;
case "PastePlain" : return typeof ( PastePlainPage ) ;
[Peek] Powertoys Peek MVP (#25922)
* Peek (#22498)
* Add peek dll project
* add spacebar preview and launch on hotkey press
* add todo
* add process handle to handle continuous press of hotkey
* add tool to stop all powertoys processes
* Add a blank Peek page and update nav menu
* Add some initial content to Peek page including a toggle
* refactor settings parsing
* rename spacebar peek to peek viewer
* rename script to stop powertoys processes
* remove tool
* Adding FileUtils for retrieving selected file in File Explorer
* Remove unnecessary SndPeekSettings
* Add shortcut setting
* Set the shortcut to ctrl+space
* Launching viewer with selected FE file
* Add PeekUI WinUI3 project with interop events
* Moving FileTypeUtils into PeekFileUtils project
* execute winui3 app on hotkey
* Fix paths with spaces
* remove winui3 project
* Resolve comment
* add wpf app with toggle visibility on hotkey
* fix visibility on startup
* remove window properties and add todos
* Fixed hidden extension and system file handling
* wip
* Add working WPF app with FileExplorer querying
* remove c++ projects
* Move native awaiter
* Working Image control with image files
* Resize and move window based on explorer monitor
* Image render, window positioning and sizing clean up
* add window management logic and selection logic
* add extension methods to add circular iterating capability to linkedlistnode
* Add OnArrowKeyPresshandler
* Added titlebar with file name and scaling with titlebar height
* fix flashing window on startup and process kept alive when powertoys exits
* remove wait for debugger loop in ui
* Add KeyIsDown method
* Fix KeyDown issue with Key handled and check for repeat
* Add thumbnail logic
* Add all folder items if only one item is selected
* File type helper
* Using hresult
* Add cancellation and rotation handling
* Use extension instead of path
* fIX CONFLICTS
* Fixing some file type checks
* Add new icon for Peek
* Update page with the new Peek icon
* Initialize IsEnabled and hook ActivationShortcut to dllmain
* add icon to taskbar and titlebar
* Add theme sensitive backgrounds
* rename event handlers
* add settings image
* Move window data into obserable object
* Refactor viewmodel, interop and helpers
* Clean up
* Add loading spinner
* Add todos
* Fix conflicts
* Move native code into its own folder
* Add peek to installer
* Fix building peek and peekui projects
* Replace UWP namespaces to WinAppSDK
* Working WASDK placeholder project
* Add exit when powertoys runner exit
* Working winui3 with image display
* Add WIC project with <TreatWarningAsErros> false for now
* Fit content to window
* Use Size from Windows.Foundation
* Change order
* Add some todos
* Refactored native/interop code and added helpers to imagepreviewer
* Rename projects
* Move some code
* Remove using
Co-authored-by: Michael Salmon <miksalmon@users.noreply.github.com>
Co-authored-by: Michael Salmon 🐟 <michaelpsalmon@outlook.com>
Co-authored-by: Alireza Ebadi Ghajari <alirezae@microsoft.com>
Co-authored-by: Jessie Su <Jessie.Su@microsoft.com>
Co-authored-by: sujessie <102062556+sujessie@users.noreply.github.com>
* Bump Microsoft.Windows.SDK.BuildTools version
* [Peek] Plugin pattern to enable any file type previewing (#22475)
* [Peek] Fetching image size through PropertyStore (#22530)
* Fetching metadata from PropertySTore
* Releasing objects to fix crash
* Creating new PropertyHelper
Co-authored-by: Daniel Chau <dancha@microsoft.com>
* Juliata/filetypes (#22538)
* Using the same list of file extensions as Lightbox's AppxManifest, and ensuring we convert file extension to lowercase
* Add IsFileTypeSupported to IPreviewer
* respond to PR comments
* Add scale awareness to window centering (#22541)
* [Peek] Fix installer builds, project configs and update assets (#22540)
* Update installer
* Fix installer errors
* Fix peek vcxproj
* Add package signing
* Add peek to arm64
* Add back ARM64 toMeasureToolUI
* Add versions to project
* Update assets and icons
* Add correct icon
* [Peek] Enable PropertyStore for offline files (#22567)
* Enabling PropertyStore for offline files
Co-authored-by: Daniel Chau <dancha@microsoft.com>
* [Peek] Adding unsupported file previewer (#22598)
* Unsupported file previewer
* Fix file display info
* Fix property store calls
* Update TODO
* [Peek] Add WebView2 integration (#22506)
* First commit with WIP logic to support WV2 in Peek module
* Minor code cleanup and try/catch block
* Added control to wrap WebView2 logic
* Cleanup
* Added logic to handle HTML previewing
Properly update FilePreview according to file type
* Code cleanup
Updated comments
* Updated comment
* Removed comment
* Code cleanup
* Improved opening of web browser preview to avoid "blank" or "seeing previous page" issue
Removed unused method
Added xaml fallback to guarantee default/starting state
* Removed folder
* Updated factory logic to match master
* address code review
* addressed PR review
* address PR review
* Address PR review
* address PR review
* Address PR review
* [Peek] Add basic file querying and navigation (#22589)
* Refactor to facilitate file data initialization
* Extract file-related code to new FileManager class
* Add temp basic version
* Clean + add todo for cancellations
* Fix various nav-related issues
* Temp - start moving iteration-related code to bg thread
* Minor tweaks
* Add FEHelper todo
* Rename FileManager + various tweaks
* Add basic throttling
* Improve bg thread synchronization
* Clean
* Clean
* Rename based on feedback
* Rename FileQuery
* Rename properties
* Rename remaining fields
* Add todos for nav success/failures
Co-authored-by: Esteban Margaron <emargaron@microsoft.com>
* [Peek] Add customized title bar (#22600)
* Add basic button UI
* Add function to get default app name and to open file in default app
* Correct error output
* Add filename to titlebar
* Remove titlebar text from Resw
* Add basic button UI
* Add function to get default app name and to open file in default app
* Add filename to titlebar
* Correct error output
* Remove titlebar text from Resw
* Add SetDragRectangles
* Correct logic, update function name
* Add localization
* Cleanup and adaptive width
* Add fileIndex/NumberOfFiles for multiple files activation
* Refine titlebar styles
* Update error message; Return HResult from native methods; Update variable initialisation and string null testing
* Titlebar height and adaptive width refinement
* Add fallback to launch app picker if fail to open default app
* Temp change to hide AppTitle_FileCount
* Update launch button to command; Add keyboard accelerator
* Update titlebar inactive background color
* Update tooltip to add keyboard accelerator
* Add comments to resw file
* Fix accidental deletion from previous merge
Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
Co-authored-by: Yawen Hou <yawenhou@microsoft.com>
* Fix crash
* Fix wrong thread exception
* Make CurrentItemIndex setter private
* Update titlebar filecount text
* Fix titlebar draggable region and interactive region (bump WinAppSdk to latest)
* [Peek] Unsupported File Previewer - Formatting string from resources (#22609)
* Moving to string resource usage
* Moving ReadableStringHelper to common project
* Fix comments
* [Peek] Fix foregrounding (#22633)
* Fixing foregrounding
* Get window handle inside BringToForeground extension method
Co-authored-by: Daniel Chau <dancha@microsoft.com>
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>
* [Peek] ImagePreviewer - Handle error states (#22637)
* add better preview state handling
* add error handling in imagepreviewer and better state handling
* fix error handling so exception is not bubbled up
* improve performance and hook up unsupported previewer on error
* remove commented code
* address pr comments
* [Peek] add PDF viewing support (#22636)
* [Peek] add PDF viewing support
* Fixed issue which would redirect some HTML and PDF files to external browser
* Fixed refactored interface name
* [Peek] Refine titlebar adaptive width (#22642)
* Adjust adaptive width of titlebar
* Remove visualstate setters for AppTitle_FileCount
Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
* [Peek] New File Explorer tabs break Shell API to get selected files (#22641)
* fix FE tab bug
* remove unnecessary unsafe keyword
* [Peek] add extra logic to properly render PNG files with transparency (#22613)
* [Peek] added extra logic to render PNG files with proper transparency
* Moved logic to ThumbnailHelper
Cleanup
* Created a separated previewer for PNG to only load the preview image with thumbnail logic
* removed unused code
* Updated state loading change
* [Peek] Unsupported File Previewer - Setting Window Size (#22645)
* Adding setting for unsupported file window
* Fix
* [Peek] Add tooltip to File (#22640)
* Add tooltip to File
* Add placeholder text for no tooltip
* Address comments
* Use StringBuilder
Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
* Add full image quality support (#22654)
* [Peek] Window foregrounding simplification and fixes + keep window visible if FE single selection changed (#22657)
* Use different apis to bring to foreground removing remote thread wait and work as well as library loading
* Keep window open if single selected file in FE is different
* Removed unused methods
* [Peek] Add cancellation token OnFilePropertyChanged (#22643)
* Cancel file loading before opening another file
* Add omitted cancellation checks
* Catch task cancelled exception; Add more cancellation checkpoints
* Add cancellation checkpoint beofre GetBitmapFromHBitmapAsync
* Correct typo
* Update to pass cancellation token individually to each async methods
* Add lost cancellationToken source
* Add cancellation token to PngPreviewer
Co-authored-by: Yawen Hou <yawenhou@microsoft.com>
* [Peek] Unsupported File Previewer - Preserve Transparency For File Icons (#22650)
* Preserving transparency or icons
* Remove TODO
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>
* [Peek] Update some installer build steps + assets update (#22683)
* Fix settings & peek.ui.wpf
* Add back missing icon
* Add missing files and actions to installer
* Keep window open if the selected file in explorer is different (only works for single file selection)
* Undo last
* [Peek] Add copy keyboard accelerator (#22647)
* add copy keyboard accelerator
* Fix comments
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>
* [Peek] add WV2 improvements (behavior and UX) (#22685)
* [Peek] added logic to get max monitor size for opening WebView2
* Removed ununsed dependency property
* Added workaround for cases where the web page would not finish navigating in a quick timing, for example google.com.
* Remove window extensions from common and use nullable size argument instead
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>
* [Peek] Merge main, self-contained .NET and fix WebView2 user data dir issue (#22899)
* Merge remote-tracking branch 'origin/main' into peek
* Test sc
* Set WebView2 user data dir
* spellcheck
* Fix comment
* Move check if higher quality image is already loaded to the exact line where we change the Preview bitmap (#23083)
* Fix opening Peek when FE window is set to full name path (#23082)
* Move check for png thubmnail loading priority
* Remove Peek.UI.WPF project
* Remove duplicated method in powertoys setup
* [Peek] Fix selecting files from the correct focused opened File Explorer tab & from Desktop (#23489)
* Get file based on active tab handle instead of window title
* Refactor code to get active tab
* Getting all items from the shell API working again, except for desktop
* Refactor and cleanup com & native code
* Add back removed peek xaml assets in Product.wxs
* Remove some dependencies that do not seem necessary in Product.wxs
* [Peek] Small images (#23554)
* change stretch value
* compare with actual window size
* consider scaling factor
* set max size
* clean up
* clean up
* clean up previewers
* scaling factor in bitmap previewer
* max image size property
* [Peek]Handle errors for HEIC/HEIF and fall back to default previewer if there is no thumbnail (#22684)
* Handle errors when getting filesize by falling back to default previewer
* Bringing back other file types that are fixed with these code changes
---------
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>
* [Peek] Add unsupported file icon fallback (#23735)
* Refactor icon retrieval, refactor hbitmap to bitmap conversion, add icon fallback
* Add svg to assets in installer
* [Peek] Refactoring of file system models, removal of PngPreviewer, retrieving of folder size via Scripting com reference and other fixes (#23955)
* Refactor icon retrieval, refactor hbitmap to bitmap conversion, add icon fallback
* Add svg to assets in installer
* - Refactor File class into IFileSystemItem, FileItem & FolderItem
- Display size for folders using Scripting namespace
- Remove default app buttons for files or folders not supporting it
* Add better content type via storage apis
* Add check for storagefile in PngPreviewer
* Fix png stretching
* Remove png previewer
* Rename ThumbnailOptions.None to ThumbnailOptions.ResizeToFit
* [Peek] Removed monitor percentage evaluation for the UnsupportedFilePreview control (#24002)
* Remove settings for percentage of windows and keep default min size.
* Fix margin on unsupported control
* Use nullable Size for image size & open file on background thread (#24004)
* [Peek] SVG support (#24237)
* svg previewer
* svg size
* set scaling factor
* set image size
* changed image source type
* non nullable image size
* notify svg previewer changed
* uncomment
* rename BitmapPreviewer
* move svg support
* remove svg previewer
* [Peek] Implementation of a performant and reliable Neighboring Files Query (#24943)
* Use IShellItemArray as the backing array of item
* Finalize and cleanup NFQ implementation
* Cleanup remainder of the code
* Remove unused using
* [Peek] Pin the window position (#24927)
* [Peek] Telemetry and logging (#25231)
* text preview
* scrolling
* changed size
* webview2 preview
* common preview project
* previewpane: use common project
* peek: use common
* previewpane: moved md
* peek: md
* previewpane: clean up
* clean up
* moved monaco files
* moved formatters
* rename
* moved common monaco helper
* dev files support
* installer
* removed versions
* warnings: culture info
* warnings: names
* clean up
* warnings: dispose
* warnings: default values
* warnings
* warnings: charset
* warnings: exceptions
* suppress warning
* installer: added peek
* changed peek guid
* monaco folders
* peek deps
* peek files
* peek resources
* removed additional monaco folder
* set host name
* Update installer
* hardcode monaco path
* leave single webview control
* moved path to common
* project
* more meaningful todos
* moved temp folder cleanup
* todo
* extension check
* spell: monaco
* spellcheck
* spellcheck
* fix id
* fix spelling
* key to spelling
* id fix
* Fix monaco resolution at install time
* Fix user install. Add needed files
* installer: remove peek localization files. It's a WinUI app
* installer:fix signing
* removed unused
* settings: flyout enable/disable for Peek
* simplify string
* property changed handle
* [Peek][Settings] Peek OOBE page (#25895)
* [Peek] GPO (#25918)
* Add Native methods file to exception
* Fix merge issue on solution file
* Adjust spellcheck
* Remove boilerplate code
* Add module interface telemetry
* Remove change to README.md
* Add entry to README
* Clean up some non-changes
* Fix order of Peek in Settings menu
* [Settings] Make peek descriptions more descriptive
---------
Co-authored-by: Michael Salmon <miksalmon@users.noreply.github.com>
Co-authored-by: Michael Salmon 🐟 <michaelpsalmon@outlook.com>
Co-authored-by: Alireza Ebadi Ghajari <alirezae@microsoft.com>
Co-authored-by: Jessie Su <Jessie.Su@microsoft.com>
Co-authored-by: sujessie <102062556+sujessie@users.noreply.github.com>
Co-authored-by: Daniel Chau <d.chau@alumni.ubc.ca>
Co-authored-by: Daniel Chau <dancha@microsoft.com>
Co-authored-by: jth-ms <73617023+jth-ms@users.noreply.github.com>
Co-authored-by: Robson <rp.pontin@gmail.com>
Co-authored-by: estebanm123 <49930791+estebanm123@users.noreply.github.com>
Co-authored-by: Esteban Margaron <emargaron@microsoft.com>
Co-authored-by: Yawen Hou <Sytta@users.noreply.github.com>
Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
Co-authored-by: Yawen Hou <yawenhou@microsoft.com>
Co-authored-by: Jojo Zhou <39350350+Joanna-Zhou@users.noreply.github.com>
Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>
Co-authored-by: Stefan Markovic <stefan@janeasystems.com>
Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
2023-05-10 10:43:03 -07:00
case "Peek" : return typeof ( PeekPage ) ;
2023-08-24 14:53:33 +02:00
case "CropAndLock" : return typeof ( CropAndLockPage ) ;
2023-10-20 16:28:07 +02:00
case "EnvironmentVariables" : return typeof ( EnvironmentVariablesPage ) ;
2023-05-02 13:10:54 +02:00
default :
[Settings]Adding a Dashboard Panel (#29023)
* Dashboard: modifying page content + adding SW version button.
* Visual tweaks and minor viewmodel changes
* Updated spacing
* Adding Settings icon
* Settiing the Dashboard page as the default one. Adding functionality to switch to settings pages from the Dashboard page. Localizing texts.
* fixing csproj file
* Reimplementing Active modules handling, showing only the active modules (and not having invisible inactive modules).
* Removing unneccessary binding
* Fix text wrapping
* Adding Registry previewer launch, adding activation mode for FindMyMouse and QuickAccent, modify File Locksmith description.
* Spell checker fix typo
* Adding GPO-blocked state, modifying buttons: adding description, icon.
* Modifying dashboard button layout
* Use SettingsCard instead of button
* Restructuring the dashboard panel
* Removing togglebuttons from the left panel. Showing only active modules. Adding key remappings (to KBM)
* Removing settings buttons, removing descriptions, icons from buttons. Add update of remapped keys, shortcuts.
* Refactoring dashboard
* Making list always visible and fixing scrolling behavior
* Adding background gradient to cards
* Removing keyboard manager's key mappings, minor changes in texts, fixing enabled state when GPO-enabled.
* Use ListView instead of ItemsRepeater
* Updates
* removing right panel with all modules. Extending "left" panel with toggleswitches, showing all modules.
* Separate lists
* Adding Flyout with key remappings for KBM module, adding IsLocked property, icons
* Visual tweaks
* Tweaks
* Fixing lock icon margin
* Minor fixes.
* Removing unused resources
* Make Dashboard default when coming from the OOBE General
* Removed the Previous, Next Layout buttons from FancyZones. Added activation information
---------
Co-authored-by: Niels Laute <niels.laute@live.nl>
2023-10-20 14:23:25 +02:00
// Fallback to Dashboard
2023-05-02 13:10:54 +02:00
Debug . Assert ( false , "Unexpected SettingsWindow argument value" ) ;
[Settings]Adding a Dashboard Panel (#29023)
* Dashboard: modifying page content + adding SW version button.
* Visual tweaks and minor viewmodel changes
* Updated spacing
* Adding Settings icon
* Settiing the Dashboard page as the default one. Adding functionality to switch to settings pages from the Dashboard page. Localizing texts.
* fixing csproj file
* Reimplementing Active modules handling, showing only the active modules (and not having invisible inactive modules).
* Removing unneccessary binding
* Fix text wrapping
* Adding Registry previewer launch, adding activation mode for FindMyMouse and QuickAccent, modify File Locksmith description.
* Spell checker fix typo
* Adding GPO-blocked state, modifying buttons: adding description, icon.
* Modifying dashboard button layout
* Use SettingsCard instead of button
* Restructuring the dashboard panel
* Removing togglebuttons from the left panel. Showing only active modules. Adding key remappings (to KBM)
* Removing settings buttons, removing descriptions, icons from buttons. Add update of remapped keys, shortcuts.
* Refactoring dashboard
* Making list always visible and fixing scrolling behavior
* Adding background gradient to cards
* Removing keyboard manager's key mappings, minor changes in texts, fixing enabled state when GPO-enabled.
* Use ListView instead of ItemsRepeater
* Updates
* removing right panel with all modules. Extending "left" panel with toggleswitches, showing all modules.
* Separate lists
* Adding Flyout with key remappings for KBM module, adding IsLocked property, icons
* Visual tweaks
* Tweaks
* Fixing lock icon margin
* Minor fixes.
* Removing unused resources
* Make Dashboard default when coming from the OOBE General
* Removed the Previous, Next Layout buttons from FancyZones. Added activation information
---------
Co-authored-by: Niels Laute <niels.laute@live.nl>
2023-10-20 14:23:25 +02:00
return typeof ( DashboardPage ) ;
2023-05-02 13:10:54 +02:00
}
}
2020-03-06 17:46:51 -08:00
}
}