AI action panel improvements.

This commit is contained in:
Burak Kaan Köse
2026-04-04 01:34:57 +02:00
parent 1211e9b28a
commit 1667aa34db
12 changed files with 330 additions and 87 deletions
@@ -1,10 +1,12 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Ai;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.Domain.Models.Translations;
@@ -16,12 +18,14 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
IMailDialogService dialogService,
IPreferencesService preferencesService,
IStartupBehaviorService startupBehaviorService,
ITranslationService translationService)
ITranslationService translationService,
IAiActionOptionsService aiActionOptionsService)
{
_dialogService = dialogService;
PreferencesService = preferencesService;
_startupBehaviorService = startupBehaviorService;
_translationService = translationService;
_aiActionOptionsService = aiActionOptionsService;
SearchModes =
[
@@ -40,6 +44,7 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
SelectedDefaultSearchMode = SearchModes[(int)PreferencesService.DefaultSearchMode];
SelectedDefaultApplicationMode = ApplicationModes[(int)PreferencesService.DefaultApplicationMode];
EmailSyncIntervalMinutes = PreferencesService.EmailSyncIntervalMinutes;
SummarySavePath = PreferencesService.AiSummarySavePath;
}
public IPreferencesService PreferencesService { get; }
@@ -56,6 +61,21 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
[ObservableProperty]
public partial AppLanguageModel SelectedLanguage { get; set; }
[ObservableProperty]
public partial List<AiTranslateLanguageOption> AvailableAiLanguages { get; set; } = [];
[ObservableProperty]
public partial AiTranslateLanguageOption SelectedDefaultTranslationLanguage { get; set; }
[ObservableProperty]
public partial AiTranslateLanguageOption SelectedSummarizeLanguage { get; set; }
[ObservableProperty]
public partial string SummarySavePath { get; set; } = string.Empty;
[ObservableProperty]
public partial bool HasInvalidSummarySavePath { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IsStartupBehaviorDisabled))]
[NotifyPropertyChangedFor(nameof(IsStartupBehaviorEnabled))]
@@ -64,7 +84,9 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
private readonly IMailDialogService _dialogService;
private readonly IStartupBehaviorService _startupBehaviorService;
private readonly ITranslationService _translationService;
private readonly IAiActionOptionsService _aiActionOptionsService;
private bool _isLanguageInitialized;
private bool _isAiPreferencesInitialized;
private int _emailSyncIntervalMinutes;
private string _selectedDefaultSearchMode;
private string _selectedDefaultApplicationMode;
@@ -110,6 +132,31 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
_ = _translationService.InitializeLanguageAsync(value.Language);
}
partial void OnSelectedDefaultTranslationLanguageChanged(AiTranslateLanguageOption value)
{
if (!_isAiPreferencesInitialized || value == null)
return;
PreferencesService.AiDefaultTranslationLanguageCode = value.Code;
}
partial void OnSelectedSummarizeLanguageChanged(AiTranslateLanguageOption value)
{
if (!_isAiPreferencesInitialized || value == null)
return;
PreferencesService.AiSummarizeLanguageCode = value.Code;
}
partial void OnSummarySavePathChanged(string value)
{
if (!_isAiPreferencesInitialized)
return;
PreferencesService.AiSummarySavePath = value ?? string.Empty;
RefreshSummarySavePathState();
}
[RelayCommand]
private async Task ToggleStartupBehaviorAsync()
{
@@ -157,15 +204,56 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
}
}
[RelayCommand]
private async Task BrowseSummarySavePathAsync()
{
var pickedPath = await _dialogService.PickWindowsFolderAsync();
if (string.IsNullOrWhiteSpace(pickedPath))
return;
await ExecuteUIThread(() => SummarySavePath = pickedPath);
}
public override async void OnNavigatedTo(NavigationMode mode, object parameters)
{
base.OnNavigatedTo(mode, parameters);
AvailableLanguages = _translationService.GetAvailableLanguages();
SelectedLanguage = AvailableLanguages.Find(language => language.Language == PreferencesService.CurrentLanguage)
?? (AvailableLanguages.Count > 0 ? AvailableLanguages[0] : null);
_isLanguageInitialized = true;
var availableLanguages = _translationService.GetAvailableLanguages();
var availableAiLanguages = new List<AiTranslateLanguageOption>(_aiActionOptionsService.GetTranslateLanguageOptions());
var startupBehaviorResult = await _startupBehaviorService.GetCurrentStartupBehaviorAsync();
StartupBehaviorResult = await _startupBehaviorService.GetCurrentStartupBehaviorAsync();
await ExecuteUIThread(() =>
{
AvailableLanguages = availableLanguages;
SelectedLanguage = AvailableLanguages.Find(language => language.Language == PreferencesService.CurrentLanguage)
?? (AvailableLanguages.Count > 0 ? AvailableLanguages[0] : null);
_isLanguageInitialized = true;
AvailableAiLanguages = availableAiLanguages;
SelectedDefaultTranslationLanguage = FindAiLanguageOption(PreferencesService.AiDefaultTranslationLanguageCode)
?? FindAiLanguageOption("en-US")
?? (AvailableAiLanguages.Count > 0 ? AvailableAiLanguages[0] : null);
SelectedSummarizeLanguage = FindAiLanguageOption(PreferencesService.AiSummarizeLanguageCode)
?? FindAiLanguageOption("en-US")
?? (AvailableAiLanguages.Count > 0 ? AvailableAiLanguages[0] : null);
SummarySavePath = PreferencesService.AiSummarySavePath;
RefreshSummarySavePathState();
_isAiPreferencesInitialized = true;
StartupBehaviorResult = startupBehaviorResult;
});
}
private AiTranslateLanguageOption FindAiLanguageOption(string languageCode)
{
if (string.IsNullOrWhiteSpace(languageCode))
return null;
return AvailableAiLanguages.Find(option => option.Code == languageCode);
}
private void RefreshSummarySavePathState()
{
HasInvalidSummarySavePath = !string.IsNullOrWhiteSpace(SummarySavePath) && !Directory.Exists(SummarySavePath);
}
}