mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 18:57:19 +02:00
* spell checker
* Adding OOBE Projects page
* changed the default hotkey
* module interface
* rename projects editor
* bug report tool
* installer
* gpo
* exit event constant
* extend search for projects by search over the containing apps' names
* [Projects] fix grammatical issue #43 (1 app - many apps)
* [Projects] Editor: Main page: fix layout if there are many apps, launch button not disappearing on the right side
* dsc
* github
* pipeline
* guid prefix
* [Projects] fixing general settings gpo handling in runner + minor changes
* arm build fix
* Do not allow saving project if name or applist is empty. Also minor UI changes
* version
* editor version
* spellcheck
* editor dll signing
* update projects names to filter them out
* shortcut saving fix
* [Projects] Editor: brining the highlighted app's icon into the foreground. + minor UI fixes
* spell checker
* spellcheck
* [Projects] re-implementing icon size calculation to have similar sized icons for every app.
* [projects] Adding info message for cases: there are no projects or no results for the search
* [Projects] Adding Edit button to the popup. + minor changes
* [Projects] Making popup having rounded corners
* changed "no projects" text color and position
* remove opening the first proj
* fix placing windows of the same app in the project
* [Projects] bringing back the breadcrumb on the editor page. Make it clickable.
* [Projects] optimizing click handlers
* [Projects] Removing not selected apps on save
* moved on thread executor to common
* moved display utils
* added convert rect
* unsigned monitor number
* set awareness
* app placement
* [Projects] Re-implementing preview drawing - one common image
* [Projects] fix boundary calculation, use DPI aware values
* fix launching with command line args
* Fix ARM64 CI build
* launch packaged apps using names when possible
* spell-check
* update packaged apps path
* projects editor single instance
* [Projects] Add Select all checkbox, Delete selected button
* Add Checkbox for per monitor selection
* modifying highlight in preview
* spell checker
* logs
* exclude help windows
https://github.com/JaneaSystems/PowerToys-DevProjects/issues/49
* Add intermediate step to project creation
* minor bugfix
* mutex fix
* modifying highlight for minimized apps
* Fixing bug: re-draw the preview on app deletion in the editor
* Adding helper class for getting the right bounds for screens
* spell checker
* spell checker
* Minor fixes in the capture dialog
* get dpi unaware screen bounds
* refactoring: added utils
* changed window filter
https://github.com/JaneaSystems/PowerToys-DevProjects/issues/2
* clean up
* refactoring
* projects common lib
* localizable default project prefix
* launcher resources
* clean up
* change snapshot project saving
https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14
* changed project data
https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14
* changed project creation save-cancel handles
https://github.com/JaneaSystems/PowerToys-DevProjects/issues/14
* spell-check
* Remove checkboxes, delete feature
* remove unused from the project
* get command line args in the snapshot
* minimized settings snap fix
* set window property after launching
* FZ: ignore projects launched windows
* Implementing major new features: remove button, position manipulation, arguments, admin, minimized, maximized
* modifying colors
* launcher project filters
* clean up
* Hide Admin checkbox
* hide WIP
* spell-check
* Revert "Hide Admin checkbox"
This reverts commit 3036df9d7f.
* get app elevated property
* Implementing Launch and Edit feature
* fixing: update of listed projects on the main page after hitting save in editor
* Fix for packaged app's icons
* fixing scroll speed issue
* change scroll speed to 15
* launch elevated apps
* minor fixes
* minor fix
* enhancing shortcut handling
* can-launch-elevated check
* projects module interface telemetry
* Implementing store of setting "order by".
* minor string correction
* moved projects data parsing
* telemetry
* add move apps checkbox
* notification about elevated apps
* restart unelevated
* move existing windows
* keep opened windows at the same positions
* handle powertoys settings
* use common theme
* fix corrupted data: project id and monitor id
* project launch on "launch and edit"
* clean up
* show screen numbers instead of monitor names
* launcher error messages
* fix default shortcut
* Adding launch button to projects settings, dashboard and flyout
* Adding new app which is launched when launching a project. It shows the status of the launch process
* spell checker
* Renaming Projects to App Layouts. Replacing only string values, not the variable names
* Re-ordering modules after Renaming Projects + spell checker
* setting window size according to the screen (making it bigger)
* commenting out feature "move apps if exist"
* spell checker
* Add ProjectsLauncherUI to signing
* opening apps in minimized state which are placed on a monitor, which is not found at the moment of launching
* consistent file name
* removed unused sln
* telemetry: create event
* WindowPosition comparison
* telemetry: edit event
* fix muted Launch as admin checkbox
* telemetry: delete event
* updated Edit telemetry event
* added invoke point to launcher args
* added utils
* parse invoke point
* replaced tuple with struct
* telemetry: launch event
* MonitorRect comparison
* resources
* rename: folders
* remove outdated
* rename: window property
* rename: files and folders
* rename: common data structures
* rename: telemetry namespace
* rename: workspaces data
* rename ProjectsLib -> WorkspacesLib
* rename: gpo
* rename: settings
* rename: launcher UI
* rename: other
* rename: pt run
* rename: fz
* rename: module interface
* rename: icon
* rename: snapshot tool
* rename: editor
* rename: common files
* rename: launcher
* rename: editor resources
* fix empty file crash
* rename: json
* rename: module interface
* fix custom actions build
* added launch editor event constant
* xaml formatting
* Add missing method defition to interop::Constants idl
Remove Any CPU config
* more .sln cleanup
* [Run][PowerToys] Fix Workspaces utility (#34336)
polished workspaces utility
* build fix - align CppWinRT version
* address PR comment: fix isdigit
* indentation
* address PR comment: rename function
* address PR comment: changed version for workspaces and revision
* added supported version definition
* addressPR comment: use BringToForeground
* address PR comments: updated projects
* address PR comment: uncomment gpo in settings
* address PR comment: rename oobe view
* update OOBE image with current module name
* moved AppUtils
* launching with AppUserModel.ID
* fixed module order in settings
* fix xaml formatting
* [Workspaces] Close launcher if there are failed launches. Plus adding new spinner gif
* fix topmost LauncherUI
* clean up
* UI closing
* BugReportTool - omit cmd arg data
* Delete icon on workspace removal
* Adding cancellation to launcher UI.
* reordered launching
* fix terminating UI
* Removing old shortcut on workspace renaming
* Sentence case labels
* get process path without waiting
* comment out unused
* remove unused argument
* logs
* New icon
* fix launch and edit for the new project
* fix launch and edit: save new project
* Update exe icons
---------
Co-authored-by: donlaci <laszlo@janeasystems.com>
Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
Co-authored-by: Stefan Markovic <stefan@janeasystems.com>
Co-authored-by: Davide Giacometti <davide.giacometti@outlook.it>
Co-authored-by: Niels Laute <niels.laute@live.nl>
436 lines
16 KiB
C#
436 lines
16 KiB
C#
// 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.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using ManagedCommon;
|
|
using Microsoft.PowerToys.Settings.UI.Helpers;
|
|
using Microsoft.PowerToys.Settings.UI.Library;
|
|
using Microsoft.PowerToys.Settings.UI.Library.Telemetry.Events;
|
|
using Microsoft.PowerToys.Settings.UI.Services;
|
|
using Microsoft.PowerToys.Settings.UI.Views;
|
|
using Microsoft.PowerToys.Telemetry;
|
|
using Microsoft.UI.Xaml;
|
|
using PowerToys.Interop;
|
|
using Windows.UI.Popups;
|
|
using WinRT.Interop;
|
|
using WinUIEx;
|
|
|
|
namespace Microsoft.PowerToys.Settings.UI
|
|
{
|
|
/// <summary>
|
|
/// Provides application-specific behavior to supplement the default Application class.
|
|
/// </summary>
|
|
public partial class App : Application
|
|
{
|
|
private enum Arguments
|
|
{
|
|
PTPipeName = 1,
|
|
SettingsPipeName,
|
|
PTPid,
|
|
Theme, // used in the old settings
|
|
ElevatedStatus,
|
|
IsUserAdmin,
|
|
ShowOobeWindow,
|
|
ShowScoobeWindow,
|
|
ShowFlyout,
|
|
ContainsSettingsWindow,
|
|
ContainsFlyoutPosition,
|
|
}
|
|
|
|
private const int RequiredArgumentsSetSettingQty = 4;
|
|
private const int RequiredArgumentsSetAdditionalSettingsQty = 4;
|
|
private const int RequiredArgumentsGetSettingQty = 3;
|
|
|
|
private const int RequiredArgumentsLaunchedFromRunnerQty = 12;
|
|
|
|
// 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; }
|
|
|
|
public bool ShowFlyout { get; set; }
|
|
|
|
public bool ShowScoobe { get; set; }
|
|
|
|
public Type StartupPage { get; set; } = typeof(Views.DashboardPage);
|
|
|
|
public static Action<string> IPCMessageReceivedCallback { get; set; }
|
|
|
|
/// <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>
|
|
public App()
|
|
{
|
|
Logger.InitializeLogger(@"\Settings\Logs");
|
|
|
|
InitializeComponent();
|
|
|
|
UnhandledException += App_UnhandledException;
|
|
}
|
|
|
|
private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e)
|
|
{
|
|
Logger.LogError("Unhandled exception", e.Exception);
|
|
}
|
|
|
|
public static void OpenSettingsWindow(Type type = null, bool ensurePageIsSelected = false)
|
|
{
|
|
if (settingsWindow == null)
|
|
{
|
|
settingsWindow = new MainWindow();
|
|
}
|
|
|
|
settingsWindow.Activate();
|
|
|
|
if (type != null)
|
|
{
|
|
settingsWindow.NavigateToSection(type);
|
|
|
|
WindowHelpers.BringToForeground(settingsWindow.GetWindowHandle());
|
|
}
|
|
|
|
if (ensurePageIsSelected)
|
|
{
|
|
settingsWindow.EnsurePageIsSelected();
|
|
}
|
|
}
|
|
|
|
private void OnLaunchedToSetSetting(string[] cmdArgs)
|
|
{
|
|
var settingName = cmdArgs[2];
|
|
var settingValue = cmdArgs[3];
|
|
try
|
|
{
|
|
SetSettingCommandLineCommand.Execute(settingName, settingValue, new SettingsUtils());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError($"SetSettingCommandLineCommand exception: '{settingName}' setting couldn't be set to {settingValue}", ex);
|
|
}
|
|
|
|
Exit();
|
|
}
|
|
|
|
private void OnLaunchedToSetAdditionalSetting(string[] cmdArgs)
|
|
{
|
|
var moduleName = cmdArgs[2];
|
|
var ipcFileName = cmdArgs[3];
|
|
try
|
|
{
|
|
using (var settings = JsonDocument.Parse(File.ReadAllText(ipcFileName)))
|
|
{
|
|
SetAdditionalSettingsCommandLineCommand.Execute(moduleName, settings, new SettingsUtils());
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError($"SetAdditionalSettingsCommandLineCommand exception: couldn't set additional settings for '{moduleName}'", ex);
|
|
}
|
|
|
|
Exit();
|
|
}
|
|
|
|
private void OnLaunchedToGetSetting(string[] cmdArgs)
|
|
{
|
|
var ipcFileName = cmdArgs[2];
|
|
|
|
try
|
|
{
|
|
var requestedSettings = JsonSerializer.Deserialize<Dictionary<string, List<string>>>(File.ReadAllText(ipcFileName));
|
|
File.WriteAllText(ipcFileName, GetSettingCommandLineCommand.Execute(requestedSettings));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError($"GetSettingCommandLineCommand exception", ex);
|
|
}
|
|
|
|
Exit();
|
|
}
|
|
|
|
private void OnLaunchedFromRunner(string[] cmdArgs)
|
|
{
|
|
// 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 >= RequiredArgumentsLaunchedFromRunnerQty + 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";
|
|
ShowFlyout = cmdArgs[(int)Arguments.ShowFlyout] == "true";
|
|
bool containsSettingsWindow = cmdArgs[(int)Arguments.ContainsSettingsWindow] == "true";
|
|
bool containsFlyoutPosition = cmdArgs[(int)Arguments.ContainsFlyoutPosition] == "true";
|
|
|
|
// To keep track of variable arguments
|
|
int currentArgumentIndex = RequiredArgumentsLaunchedFromRunnerQty;
|
|
|
|
if (containsSettingsWindow)
|
|
{
|
|
// Open specific window
|
|
StartupPage = GetPage(cmdArgs[currentArgumentIndex]);
|
|
|
|
currentArgumentIndex++;
|
|
}
|
|
|
|
int flyout_x = 0;
|
|
int flyout_y = 0;
|
|
if (containsFlyoutPosition)
|
|
{
|
|
// get the flyout position arguments
|
|
_ = int.TryParse(cmdArgs[currentArgumentIndex++], out flyout_x);
|
|
_ = int.TryParse(cmdArgs[currentArgumentIndex++], out flyout_y);
|
|
}
|
|
|
|
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();
|
|
|
|
if (!ShowOobe && !ShowScoobe && !ShowFlyout)
|
|
{
|
|
settingsWindow = new MainWindow();
|
|
settingsWindow.Activate();
|
|
settingsWindow.ExtendsContentIntoTitleBar = true;
|
|
settingsWindow.NavigateToSection(StartupPage);
|
|
|
|
// 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.
|
|
WindowHelpers.BringToForeground(settingsWindow.GetWindowHandle());
|
|
}
|
|
else
|
|
{
|
|
// Create the Settings window hidden so that it's fully initialized and
|
|
// it will be ready to receive the notification if the user opens
|
|
// the Settings from the tray icon.
|
|
settingsWindow = new MainWindow(true);
|
|
|
|
if (ShowOobe)
|
|
{
|
|
PowerToysTelemetry.Log.WriteEvent(new OobeStartedEvent());
|
|
OobeWindow oobeWindow = new OobeWindow(OOBE.Enums.PowerToysModules.Overview);
|
|
oobeWindow.Activate();
|
|
oobeWindow.ExtendsContentIntoTitleBar = true;
|
|
SetOobeWindow(oobeWindow);
|
|
}
|
|
else if (ShowScoobe)
|
|
{
|
|
PowerToysTelemetry.Log.WriteEvent(new ScoobeStartedEvent());
|
|
OobeWindow scoobeWindow = new OobeWindow(OOBE.Enums.PowerToysModules.WhatsNew);
|
|
scoobeWindow.Activate();
|
|
scoobeWindow.ExtendsContentIntoTitleBar = true;
|
|
SetOobeWindow(scoobeWindow);
|
|
}
|
|
else if (ShowFlyout)
|
|
{
|
|
POINT? p = null;
|
|
if (containsFlyoutPosition)
|
|
{
|
|
p = new POINT(flyout_x, flyout_y);
|
|
}
|
|
|
|
ShellPage.OpenFlyoutCallback(p);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <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();
|
|
|
|
if (cmdArgs?.Length >= RequiredArgumentsLaunchedFromRunnerQty)
|
|
{
|
|
OnLaunchedFromRunner(cmdArgs);
|
|
}
|
|
else if (cmdArgs?.Length == RequiredArgumentsSetSettingQty && cmdArgs[1] == "set")
|
|
{
|
|
OnLaunchedToSetSetting(cmdArgs);
|
|
}
|
|
else if (cmdArgs?.Length == RequiredArgumentsSetAdditionalSettingsQty && cmdArgs[1] == "setAdditional")
|
|
{
|
|
OnLaunchedToSetAdditionalSetting(cmdArgs);
|
|
}
|
|
else if (cmdArgs?.Length == RequiredArgumentsGetSettingQty && cmdArgs[1] == "get")
|
|
{
|
|
OnLaunchedToGetSetting(cmdArgs);
|
|
}
|
|
else
|
|
{
|
|
#if DEBUG
|
|
// For debugging purposes
|
|
// Window is also needed to show MessageDialog
|
|
settingsWindow = new MainWindow();
|
|
settingsWindow.ExtendsContentIntoTitleBar = true;
|
|
settingsWindow.Activate();
|
|
settingsWindow.NavigateToSection(StartupPage);
|
|
ShowMessageDialog("The application is running in Debug mode.", "DEBUG");
|
|
#else
|
|
/* 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. */
|
|
Common.UI.SettingsDeepLink.OpenSettings(Common.UI.SettingsDeepLink.SettingsWindow.Dashboard, true);
|
|
Exit();
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if !DEBUG
|
|
private async void ShowMessageDialogAndExit(string content, string title = null)
|
|
#else
|
|
private async void ShowMessageDialog(string content, string title = null)
|
|
#endif
|
|
{
|
|
await ShowDialogAsync(content, title);
|
|
#if !DEBUG
|
|
this.Exit();
|
|
#endif
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public static bool IsDarkTheme()
|
|
{
|
|
return ThemeService.Theme == ElementTheme.Dark || (ThemeService.Theme == ElementTheme.Default && ThemeHelpers.GetAppTheme() == AppTheme.Dark);
|
|
}
|
|
|
|
public static int UpdateUIThemeMethod(string themeName)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
private static ISettingsUtils settingsUtils = new SettingsUtils();
|
|
private static ThemeService themeService = new ThemeService(SettingsRepository<GeneralSettings>.GetInstance(settingsUtils));
|
|
|
|
public static ThemeService ThemeService => themeService;
|
|
|
|
private static MainWindow settingsWindow;
|
|
private static OobeWindow oobeWindow;
|
|
private static FlyoutWindow flyoutWindow;
|
|
|
|
public static void ClearSettingsWindow()
|
|
{
|
|
settingsWindow = null;
|
|
}
|
|
|
|
public static MainWindow GetSettingsWindow()
|
|
{
|
|
return settingsWindow;
|
|
}
|
|
|
|
public static OobeWindow GetOobeWindow()
|
|
{
|
|
return oobeWindow;
|
|
}
|
|
|
|
public static FlyoutWindow GetFlyoutWindow()
|
|
{
|
|
return flyoutWindow;
|
|
}
|
|
|
|
public static void SetOobeWindow(OobeWindow window)
|
|
{
|
|
oobeWindow = window;
|
|
}
|
|
|
|
public static void SetFlyoutWindow(FlyoutWindow window)
|
|
{
|
|
flyoutWindow = window;
|
|
}
|
|
|
|
public static void ClearOobeWindow()
|
|
{
|
|
oobeWindow = null;
|
|
}
|
|
|
|
public static void ClearFlyoutWindow()
|
|
{
|
|
flyoutWindow = null;
|
|
}
|
|
|
|
public static Type GetPage(string settingWindow)
|
|
{
|
|
switch (settingWindow)
|
|
{
|
|
case "Dashboard": return typeof(DashboardPage);
|
|
case "Overview": return typeof(GeneralPage);
|
|
case "AdvancedPaste": return typeof(AdvancedPastePage);
|
|
case "AlwaysOnTop": return typeof(AlwaysOnTopPage);
|
|
case "Awake": return typeof(AwakePage);
|
|
case "CmdNotFound": return typeof(CmdNotFoundPage);
|
|
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);
|
|
case "MouseWithoutBorders": return typeof(MouseWithoutBordersPage);
|
|
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 "Peek": return typeof(PeekPage);
|
|
case "CropAndLock": return typeof(CropAndLockPage);
|
|
case "EnvironmentVariables": return typeof(EnvironmentVariablesPage);
|
|
case "Workspaces": return typeof(WorkspacesPage);
|
|
default:
|
|
// Fallback to Dashboard
|
|
Debug.Assert(false, "Unexpected SettingsWindow argument value");
|
|
return typeof(DashboardPage);
|
|
}
|
|
}
|
|
}
|
|
}
|