diff --git a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs index 53545bc72f..314e503ed8 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs @@ -6,6 +6,7 @@ using System; using AdvancedPaste.Helpers; using AdvancedPaste.Settings; +using AdvancedPaste.ViewModels; using ManagedCommon; using Microsoft.UI.Windowing; using Microsoft.UI.Xaml; @@ -26,18 +27,26 @@ namespace AdvancedPaste this.InitializeComponent(); _userSettings = App.GetService(); + var optionsViewModel = App.GetService(); var baseHeight = MinHeight; void UpdateHeight() { - var trimmedCustomActionCount = Math.Min(_userSettings.CustomActions.Count, 5); + var trimmedCustomActionCount = optionsViewModel.IsPasteWithAIEnabled ? Math.Min(_userSettings.CustomActions.Count, 5) : 0; Height = MinHeight = baseHeight + (trimmedCustomActionCount * 40); } UpdateHeight(); _userSettings.CustomActions.CollectionChanged += (_, _) => UpdateHeight(); + optionsViewModel.PropertyChanged += (_, e) => + { + if (e.PropertyName == nameof(optionsViewModel.IsPasteWithAIEnabled)) + { + UpdateHeight(); + } + }; AppWindow.SetIcon("Assets/AdvancedPaste/AdvancedPaste.ico"); this.ExtendsContentIntoTitleBar = true; diff --git a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs index 141561543e..4d59e327af 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs @@ -51,6 +51,7 @@ namespace AdvancedPaste.ViewModels [ObservableProperty] [NotifyPropertyChangedFor(nameof(InputTxtBoxPlaceholderText))] [NotifyPropertyChangedFor(nameof(GeneralErrorText))] + [NotifyPropertyChangedFor(nameof(IsPasteWithAIEnabled))] [NotifyPropertyChangedFor(nameof(IsCustomAIEnabled))] private bool _isAllowedByGPO; @@ -67,7 +68,9 @@ namespace AdvancedPaste.ViewModels public ObservableCollection CustomActionPasteFormats { get; } = []; - public bool IsCustomAIEnabled => IsAllowedByGPO && IsClipboardDataText && aiHelper.IsAIEnabled; + public bool IsPasteWithAIEnabled => IsAllowedByGPO && aiHelper.IsAIEnabled; + + public bool IsCustomAIEnabled => IsPasteWithAIEnabled && IsClipboardDataText; public event EventHandler CustomActionActivated; @@ -94,7 +97,7 @@ namespace AdvancedPaste.ViewModels ClipboardHistoryEnabled = IsClipboardHistoryEnabled(); ReadClipboard(); - UpdateAllowedByGPO(); + UpdateOpenAIKey(); _clipboardTimer = new() { Interval = TimeSpan.FromSeconds(1) }; _clipboardTimer.Tick += ClipboardTimer_Tick; _clipboardTimer.Start(); @@ -103,7 +106,7 @@ namespace AdvancedPaste.ViewModels _userSettings.CustomActions.CollectionChanged += (_, _) => EnqueueRefreshPasteFormats(); PropertyChanged += (_, e) => { - if (e.PropertyName == nameof(Query)) + if (e.PropertyName == nameof(Query) || e.PropertyName == nameof(IsPasteWithAIEnabled)) { EnqueueRefreshPasteFormats(); } @@ -159,11 +162,14 @@ namespace AdvancedPaste.ViewModels } CustomActionPasteFormats.Clear(); - foreach (var customAction in _userSettings.CustomActions) + if (IsPasteWithAIEnabled) { - if (Filter(customAction.Name) || Filter(customAction.Prompt)) + foreach (var customAction in _userSettings.CustomActions) { - CustomActionPasteFormats.Add(new PasteFormat(customAction, GetNextShortcutText())); + if (Filter(customAction.Name) || Filter(customAction.Prompt)) + { + CustomActionPasteFormats.Add(new PasteFormat(customAction, GetNextShortcutText())); + } } } } @@ -183,34 +189,19 @@ namespace AdvancedPaste.ViewModels public void OnShow() { ReadClipboard(); - UpdateAllowedByGPO(); - if (IsAllowedByGPO) + if (UpdateOpenAIKey()) { - var openAIKey = AICompletionsHelper.LoadOpenAIKey(); - var currentKey = aiHelper.GetKey(); - bool keyChanged = openAIKey != currentKey; + app.GetMainWindow()?.StartLoading(); - if (keyChanged) + _dispatcherQueue.TryEnqueue(() => { - app.GetMainWindow().StartLoading(); - - Task.Run(() => - { - aiHelper.SetOpenAIKey(openAIKey); - }).ContinueWith( - (t) => - { - _dispatcherQueue.TryEnqueue(() => - { - app.GetMainWindow().FinishLoading(aiHelper.IsAIEnabled); - OnPropertyChanged(nameof(InputTxtBoxPlaceholderText)); - OnPropertyChanged(nameof(GeneralErrorText)); - OnPropertyChanged(nameof(IsCustomAIEnabled)); - }); - }, - TaskScheduler.Default); - } + app.GetMainWindow()?.FinishLoading(aiHelper.IsAIEnabled); + OnPropertyChanged(nameof(InputTxtBoxPlaceholderText)); + OnPropertyChanged(nameof(GeneralErrorText)); + OnPropertyChanged(nameof(IsPasteWithAIEnabled)); + OnPropertyChanged(nameof(IsCustomAIEnabled)); + }); } ClipboardHistoryEnabled = IsClipboardHistoryEnabled(); @@ -574,5 +565,20 @@ namespace AdvancedPaste.ViewModels { IsAllowedByGPO = PowerToys.GPOWrapper.GPOWrapper.GetAllowedAdvancedPasteOnlineAIModelsValue() != PowerToys.GPOWrapper.GpoRuleConfigured.Disabled; } + + private bool UpdateOpenAIKey() + { + UpdateAllowedByGPO(); + + if (IsAllowedByGPO) + { + var oldKey = aiHelper.GetKey(); + var newKey = AICompletionsHelper.LoadOpenAIKey(); + aiHelper.SetOpenAIKey(newKey); + return newKey != oldKey; + } + + return false; + } } } diff --git a/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/dllmain.cpp b/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/dllmain.cpp index eae8fc0b85..649342bc2f 100644 --- a/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/dllmain.cpp +++ b/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/dllmain.cpp @@ -142,13 +142,13 @@ private: { try { - winrt::Windows::Security::Credentials::PasswordVault vault; - return vault.Retrieve(OPENAI_VAULT_RESOURCE, OPENAI_VAULT_USERNAME) != nullptr; + winrt::Windows::Security::Credentials::PasswordVault().Retrieve(OPENAI_VAULT_RESOURCE, OPENAI_VAULT_USERNAME); + return true; } catch (const winrt::hresult_error& ex) { // Looks like the only way to access the PasswordVault is through the an API that throws an exception in case the resource doesn't exist. - // If the compiler breaks here when you're debugging, just continue. + // If the debugger breaks here, just continue. // If you want to disable breaking here in a more permanent way, just add a condition in Visual Studio's Exception Settings to not break on win::hresult_error, but that might make you not hit other exceptions you might want to catch. if (ex.code() == HRESULT_FROM_WIN32(ERROR_NOT_FOUND)) {