diff --git a/src/common/interop/interop.cpp b/src/common/interop/interop.cpp index 6b5a86ec9b..1266fcb2ce 100644 --- a/src/common/interop/interop.cpp +++ b/src/common/interop/interop.cpp @@ -196,6 +196,10 @@ public return gcnew String(CommonSharedConstants::FANCY_ZONES_EDITOR_TOGGLE_EVENT); } + static String ^ ProjectsLaunchEditorEvent() { + return gcnew String(CommonSharedConstants::PROJECTS_LAUNCH_EDITOR_EVENT); + } + static String ^ ColorPickerSendSettingsTelemetryEvent() { return gcnew String(CommonSharedConstants::COLOR_PICKER_SEND_SETTINGS_TELEMETRY_EVENT); } diff --git a/src/common/interop/shared_constants.h b/src/common/interop/shared_constants.h index 8f606c99cb..4fcfadadb4 100644 --- a/src/common/interop/shared_constants.h +++ b/src/common/interop/shared_constants.h @@ -41,6 +41,8 @@ namespace CommonSharedConstants const wchar_t FANCY_ZONES_EDITOR_TOGGLE_EVENT[] = L"Local\\FancyZones-ToggleEditorEvent-1e174338-06a3-472b-874d-073b21c62f14"; + const wchar_t PROJECTS_LAUNCH_EDITOR_EVENT[] = L"Local\\Projects-LaunchEditorEvent-a55ff427-cf62-4994-a2cd-9f72139296bf"; + const wchar_t SHOW_HOSTS_EVENT[] = L"Local\\Hosts-ShowHostsEvent-5a0c0aae-5ff5-40f5-95c2-20e37ed671f0"; const wchar_t SHOW_HOSTS_ADMIN_EVENT[] = L"Local\\Hosts-ShowHostsAdminEvent-60ff44e2-efd3-43bf-928a-f4d269f98bec"; diff --git a/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp b/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp index 856f9b998a..5520aad5f9 100644 --- a/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp +++ b/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp @@ -16,6 +16,7 @@ #include #include "resource.h" +#include // Non-localizable const std::wstring projectsLauncherPath = L"PowerToys.ProjectsLauncher.exe"; @@ -53,6 +54,8 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*lp class ProjectsModuleInterface : public PowertoyModuleIface { public: + EventWaiter m_toggleEditorEventWaiter; + // Return the localized display name of the powertoy virtual PCWSTR get_name() override { @@ -219,6 +222,24 @@ public: app_key = L"Projects"; LoggerHelpers::init_logger(app_key, L"ModuleInterface", "Projects"); init_settings(); + + m_toggleEditorEvent = CreateDefaultEvent(CommonSharedConstants::PROJECTS_LAUNCH_EDITOR_EVENT); + if (!m_toggleEditorEvent) + { + Logger::error(L"Failed to create launch editor event"); + auto message = get_last_error_message(GetLastError()); + if (message.has_value()) + { + Logger::error(message.value()); + } + } + m_toggleEditorEventWaiter = EventWaiter(CommonSharedConstants::PROJECTS_LAUNCH_EDITOR_EVENT, [&](int err) { + if (err == ERROR_SUCCESS) + { + Logger::trace(L"{} event was signaled", CommonSharedConstants::PROJECTS_LAUNCH_EDITOR_EVENT); + launch_editor(); + } + }); } private: diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.PowerToys/Components/UtilityProvider.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.PowerToys/Components/UtilityProvider.cs index c2a428eccc..a85963ff5d 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.PowerToys/Components/UtilityProvider.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.PowerToys/Components/UtilityProvider.cs @@ -190,7 +190,7 @@ namespace Microsoft.PowerToys.Run.Plugin.PowerToys generalSettings.Enabled.Projects, (_) => { - using var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShowEnvironmentVariablesSharedEvent()); + using var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ProjectsLaunchEditorEvent()); eventHandle.Set(); return true; })); diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Flyout/LaunchPage.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/Flyout/LaunchPage.xaml.cs index 602a390dd4..c496955b12 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Flyout/LaunchPage.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/Flyout/LaunchPage.xaml.cs @@ -116,6 +116,14 @@ namespace Microsoft.PowerToys.Settings.UI.Flyout break; + case ModuleType.Projects: // Launch Projects Editor + using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ProjectsLaunchEditorEvent())) + { + eventHandle.Set(); + } + + break; + case ModuleType.ShortcutGuide: // Launch Shortcut Guide using (var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.ShortcutGuideTriggerEvent())) { diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/ProjectsPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/ProjectsPage.xaml index 584ae75dfe..b0e91bab52 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/ProjectsPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/ProjectsPage.xaml @@ -29,12 +29,18 @@ Severity="Informational" /> - + HeaderIcon="{ui:FontIcon Glyph=}"> - + + + diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw index bc5f4c4c5b..b35f552eff 100644 --- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw @@ -3143,6 +3143,12 @@ Right-click to remove the key combination, thereby deactivating the shortcut. Activation shortcut + + Create and manage projects + + + Launch editor + Learn more about the Projects utility Projects is the name of the module. diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs index 4cb47455d6..5cf860e4d7 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs @@ -433,9 +433,13 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels private ObservableCollection GetModuleItemsProjects() { + ISettingsRepository moduleSettingsRepository = SettingsRepository.GetInstance(new SettingsUtils()); + var settings = moduleSettingsRepository.SettingsConfig; + var list = new List { - new DashboardModuleTextItem() { Label = resourceLoader.GetString("Projects_ShortDescription") }, + new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("Projects_ShortDescription"), Shortcut = settings.Properties.Hotkey.Value.GetKeysList() }, + new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("Projects_LaunchEditorButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Description"), ButtonGlyph = "\uEB3C", ButtonClickHandler = ProjectsLaunchClicked }, }; return new ObservableCollection(list); } @@ -509,6 +513,12 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels SendConfigMSG("{\"action\":{\"FancyZones\":{\"action_name\":\"ToggledFZEditor\", \"value\":\"\"}}}"); } + private void ProjectsLaunchClicked(object sender, RoutedEventArgs e) + { + // send message to launch the projects editor; + SendConfigMSG("{\"action\":{\"Projects\":{\"action_name\":\"LaunchEditor\", \"value\":\"\"}}}"); + } + private void KbmKeyLaunchClicked(object sender, RoutedEventArgs e) { var settingsUtils = new SettingsUtils(); diff --git a/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs index 5e6ce8e0c3..49acd6e891 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs @@ -44,6 +44,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels AddFlyoutMenuItem(ModuleType.Hosts); AddFlyoutMenuItem(ModuleType.PowerLauncher); AddFlyoutMenuItem(ModuleType.PowerOCR); + AddFlyoutMenuItem(ModuleType.Projects); AddFlyoutMenuItem(ModuleType.RegistryPreview); AddFlyoutMenuItem(ModuleType.MeasureTool); AddFlyoutMenuItem(ModuleType.ShortcutGuide); @@ -89,6 +90,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels ModuleType.FancyZones => SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.FancyzonesEditorHotkey.Value.ToString(), ModuleType.PowerLauncher => SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.OpenPowerLauncher.ToString(), ModuleType.PowerOCR => SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.ActivationShortcut.ToString(), + ModuleType.Projects => SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.Hotkey.Value.ToString(), ModuleType.MeasureTool => SettingsRepository.GetInstance(new SettingsUtils()).SettingsConfig.Properties.ActivationShortcut.ToString(), ModuleType.ShortcutGuide => GetShortcutGuideToolTip(), _ => string.Empty, diff --git a/src/settings-ui/Settings.UI/ViewModels/ProjectsViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/ProjectsViewModel.cs index 68849133ef..2dfacabf1a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/ProjectsViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/ProjectsViewModel.cs @@ -6,12 +6,11 @@ using System; using System.Globalization; using System.Runtime.CompilerServices; using System.Text.Json; -using Common.UI; using global::PowerToys.GPOWrapper; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; -using Microsoft.PowerToys.Settings.UI.Library.Utilities; +using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; namespace Microsoft.PowerToys.Settings.UI.ViewModels { @@ -25,6 +24,8 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels private Func SendConfigMSG { get; } + public ButtonClickCommand LaunchEditorEventHandler { get; set; } + public ProjectsViewModel(ISettingsUtils settingsUtils, ISettingsRepository settingsRepository, ISettingsRepository moduleSettingsRepository, Func ipcMSGCallBackFunc) { ArgumentNullException.ThrowIfNull(settingsUtils); @@ -47,6 +48,14 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels // set the callback functions value to handle outgoing IPC message. SendConfigMSG = ipcMSGCallBackFunc; + + LaunchEditorEventHandler = new ButtonClickCommand(LaunchEditor); + } + + private void LaunchEditor() + { + // send message to launch the zones editor; + SendConfigMSG("{\"action\":{\"Projects\":{\"action_name\":\"LaunchEditor\", \"value\":\"\"}}}"); } private void InitializeEnabledValue()