New AI actions panel. Replaced new command bar.
This commit is contained in:
@@ -451,6 +451,20 @@ public sealed partial class ComposePage : ComposePageAbstract,
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task<string?> TryGetCachedSummaryTextAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
return Task.FromResult<string?>(null);
|
||||
}
|
||||
|
||||
public Task SaveCachedSummaryTextAsync(string summary, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public string GetSuggestedSummaryFileName() => "email-summary.txt";
|
||||
|
||||
private void OpenAttachment_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is MenuFlyoutItem item && item.CommandParameter is MailAttachmentViewModel attachment)
|
||||
|
||||
@@ -15,10 +15,7 @@
|
||||
xmlns:domain="using:Wino.Core.Domain"
|
||||
xmlns:enums="using:Wino.Core.Domain.Enums"
|
||||
xmlns:helpers="using:Wino.Helpers"
|
||||
xmlns:i="using:Microsoft.Xaml.Interactivity"
|
||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
||||
xmlns:listview="using:Wino.Mail.WinUI.Controls.ListView"
|
||||
xmlns:local="using:Wino.Behaviors"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:menuflyouts="using:Wino.MenuFlyouts"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
@@ -176,15 +173,15 @@
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||
CornerRadius="8"
|
||||
Visibility="{x:Bind ViewModel.PreferencesService.IsMailListActionBarEnabled}">
|
||||
<CommandBar
|
||||
<coreControls:OperationCommandBar
|
||||
HorizontalAlignment="Left"
|
||||
DefaultLabelPosition="Collapsed"
|
||||
IsEnabled="{x:Bind helpers:XamlHelpers.CountToBooleanConverter(ViewModel.MailCollection.SelectedItemsCount), Mode=OneWay}"
|
||||
IsAIActionsPaneToggleVisible="False"
|
||||
ItemInvokedCommand="{x:Bind ViewModel.ExecuteTopBarActionCommand}"
|
||||
MenuItems="{x:Bind ViewModel.ActionItems, Mode=OneWay}"
|
||||
OverflowButtonVisibility="Auto">
|
||||
<interactivity:Interaction.Behaviors>
|
||||
<local:BindableCommandBarBehavior ItemClickedCommand="{x:Bind ViewModel.ExecuteTopBarActionCommand}" PrimaryCommands="{x:Bind ViewModel.ActionItems, Mode=OneWay}" />
|
||||
</interactivity:Interaction.Behaviors>
|
||||
</CommandBar>
|
||||
</coreControls:OperationCommandBar>
|
||||
</Grid>
|
||||
|
||||
<!-- Pivot + Sync + Multi Select -->
|
||||
|
||||
@@ -4,16 +4,14 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:abstract="using:Wino.Views.Abstract"
|
||||
xmlns:controls="using:Wino.Controls"
|
||||
xmlns:coreControls="using:Wino.Mail.WinUI.Controls"
|
||||
xmlns:customcontrols="using:Wino.Mail.WinUI.Controls.CustomControls"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:domain="using:Wino.Core.Domain"
|
||||
xmlns:entities="using:Wino.Core.Domain.Entities.Shared"
|
||||
xmlns:helpers="using:Wino.Helpers"
|
||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
||||
xmlns:local="using:Wino.Behaviors"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
xmlns:coreControls="using:Wino.Mail.WinUI.Controls"
|
||||
xmlns:toolkit="using:CommunityToolkit.WinUI.Controls"
|
||||
xmlns:viewModelData="using:Wino.Mail.ViewModels.Data"
|
||||
x:Name="root"
|
||||
@@ -266,20 +264,17 @@
|
||||
<PathIcon Data="M12 2a4 4 0 0 1 4 4v2h1.75A2.25 2.25 0 0 1 20 10.25v9.5A2.25 2.25 0 0 1 17.75 22H6.25A2.25 2.25 0 0 1 4 19.75v-9.5A2.25 2.25 0 0 1 6.25 8H8V6a4 4 0 0 1 4-4Zm5.75 7.5H6.25a.75.75 0 0 0-.75.75v9.5c0 .414.336.75.75.75h11.5a.75.75 0 0 0 .75-.75v-9.5a.75.75 0 0 0-.75-.75Zm-5.75 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm0-10A2.5 2.5 0 0 0 9.5 6v2h5V6A2.5 2.5 0 0 0 12 3.5Z" />
|
||||
</Viewbox>
|
||||
</Grid>
|
||||
<CommandBar
|
||||
x:Name="RendererBar"
|
||||
<coreControls:OperationCommandBar
|
||||
x:Name="RendererCommandBar"
|
||||
Grid.Row="1"
|
||||
HorizontalContentAlignment="Stretch"
|
||||
DefaultLabelPosition="Right"
|
||||
DynamicOverflowItemsChanging="BarDynamicOverflowChanging"
|
||||
IsDynamicOverflowEnabled="True"
|
||||
OverflowButtonVisibility="Auto">
|
||||
<interactivity:Interaction.Behaviors>
|
||||
<local:BindableCommandBarBehavior
|
||||
ItemClickedCommand="{x:Bind ViewModel.OperationClickedCommand}"
|
||||
PrimaryCommands="{x:Bind ViewModel.MenuItems, Mode=OneWay}" />
|
||||
</interactivity:Interaction.Behaviors>
|
||||
<CommandBar.Content>
|
||||
IsAIActionsPaneToggleVisible="True"
|
||||
IsEditorThemeDark="{x:Bind ViewModel.IsDarkWebviewRenderer, Mode=TwoWay}"
|
||||
IsEditorThemeToggleVisible="True"
|
||||
ItemInvokedCommand="{x:Bind ViewModel.OperationClickedCommand}"
|
||||
MenuItems="{x:Bind ViewModel.MenuItems, Mode=OneWay}">
|
||||
<coreControls:OperationCommandBar.Content>
|
||||
<Grid Padding="0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
@@ -322,22 +317,9 @@
|
||||
<TextBlock FontSize="12" Text="{x:Bind helpers:XamlHelpers.GetCreationDateString(ViewModel.CreationDate, ViewModel.PreferencesService.Prefer24HourTimeFormat), Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<AppBarToggleButton
|
||||
x:Name="ReaderAiActionsToggleButton"
|
||||
Grid.Column="2"
|
||||
Checked="ReaderAiActionsToggleButton_Checked"
|
||||
MinWidth="40"
|
||||
HorizontalContentAlignment="Center"
|
||||
LabelPosition="Collapsed"
|
||||
ToolTipService.ToolTip="{x:Bind domain:Translator.Composer_AiActions}">
|
||||
<AppBarToggleButton.Icon>
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
</AppBarToggleButton.Icon>
|
||||
</AppBarToggleButton>
|
||||
</Grid>
|
||||
</CommandBar.Content>
|
||||
</CommandBar>
|
||||
</coreControls:OperationCommandBar.Content>
|
||||
</coreControls:OperationCommandBar>
|
||||
|
||||
<ScrollViewer
|
||||
Grid.Row="2"
|
||||
@@ -433,7 +415,7 @@
|
||||
Margin="0,8,0,0"
|
||||
AvailableActions="Translate, Summarize"
|
||||
HtmlHost="{x:Bind}"
|
||||
Visibility="{x:Bind GetAiActionsPanelVisibility(ReaderAiActionsToggleButton.IsChecked), Mode=OneWay}" />
|
||||
Visibility="{x:Bind helpers:XamlHelpers.BoolToVisibilityConverter(RendererCommandBar.IsAIActionsEnabled), Mode=OneWay}" />
|
||||
|
||||
<!-- Attachments -->
|
||||
<Grid Grid.Row="4">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -42,8 +42,6 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
|
||||
public WebView2 GetWebView() => Chromium;
|
||||
|
||||
public Visibility GetAiActionsPanelVisibility(bool? isChecked) => isChecked == true ? Visibility.Visible : Visibility.Collapsed;
|
||||
|
||||
public MailRenderingPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -56,6 +54,7 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
{
|
||||
return Chromium.CoreWebView2.PrintToPdfAsync(path, null).AsTask();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private async Task<PrintingResult> DirectPrintAsync(WebView2PrintSettingsModel settings)
|
||||
@@ -150,6 +149,8 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
ViewModel.SaveHTMLasPDFFunc = null;
|
||||
ViewModel.DirectPrintFuncAsync = null;
|
||||
_currentRenderedHtml = string.Empty;
|
||||
RendererCommandBar.AIActionsEnabledChanged -= RendererCommandBar_AIActionsEnabledChanged;
|
||||
RendererCommandBar.IsAIActionsEnabled = false;
|
||||
ReaderAiActionsPanel.CancelPendingOperation();
|
||||
|
||||
DisposeWebView2();
|
||||
@@ -168,9 +169,12 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
}
|
||||
|
||||
private async void ReaderAiActionsToggleButton_Checked(object sender, RoutedEventArgs e)
|
||||
private async void RendererCommandBar_AIActionsEnabledChanged(object? sender, bool isEnabled)
|
||||
{
|
||||
await ReaderAiActionsPanel.RefreshAvailabilityAsync();
|
||||
if (isEnabled)
|
||||
{
|
||||
await ReaderAiActionsPanel.RefreshAvailabilityAsync();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string?> TryGetCachedTranslationHtmlAsync(string languageCode, CancellationToken cancellationToken)
|
||||
@@ -206,6 +210,43 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<string?> TryGetCachedSummaryTextAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return await _mimeFileService.GetSummaryTextAsync(
|
||||
ViewModel.CurrentMailAccountId.Value,
|
||||
ViewModel.CurrentMailFileId.Value,
|
||||
cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task SaveCachedSummaryTextAsync(string summary, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (!ViewModel.CurrentMailAccountId.HasValue || !ViewModel.CurrentMailFileId.HasValue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await _mimeFileService.SaveSummaryTextAsync(
|
||||
ViewModel.CurrentMailAccountId.Value,
|
||||
ViewModel.CurrentMailFileId.Value,
|
||||
summary,
|
||||
cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public string GetSuggestedSummaryFileName()
|
||||
{
|
||||
var subject = string.IsNullOrWhiteSpace(ViewModel.Subject) ? "email-summary" : ViewModel.Subject;
|
||||
return $"{SanitizeFileNamePart(subject)}.txt";
|
||||
}
|
||||
|
||||
private void DisposeWebView2()
|
||||
{
|
||||
if (Chromium == null) return;
|
||||
@@ -228,6 +269,9 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
// Initialize WebView2 wiring before base navigation invokes ViewModel rendering.
|
||||
// Base.OnNavigatedTo triggers VM.OnNavigatedTo, which can send HtmlRenderingRequested.
|
||||
DOMLoadedTask = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||
RendererCommandBar.AIActionsEnabledChanged -= RendererCommandBar_AIActionsEnabledChanged;
|
||||
RendererCommandBar.AIActionsEnabledChanged += RendererCommandBar_AIActionsEnabledChanged;
|
||||
RendererCommandBar.IsAIActionsEnabled = false;
|
||||
Chromium.CoreWebView2Initialized -= CoreWebViewInitialized;
|
||||
Chromium.CoreWebView2Initialized += CoreWebViewInitialized;
|
||||
_ = Chromium.EnsureCoreWebView2Async();
|
||||
@@ -300,14 +344,6 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
}
|
||||
}
|
||||
|
||||
private void BarDynamicOverflowChanging(CommandBar sender, DynamicOverflowItemsChangingEventArgs args)
|
||||
{
|
||||
if (args.Action == CommandBarDynamicOverflowAction.AddingToOverflow || sender.SecondaryCommands.Any())
|
||||
sender.OverflowButtonVisibility = CommandBarOverflowButtonVisibility.Visible;
|
||||
else
|
||||
sender.OverflowButtonVisibility = CommandBarOverflowButtonVisibility.Collapsed;
|
||||
}
|
||||
|
||||
private async Task UpdateEditorThemeAsync()
|
||||
{
|
||||
await DOMLoadedTask.Task;
|
||||
@@ -404,4 +440,21 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract,
|
||||
{
|
||||
WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested());
|
||||
}
|
||||
|
||||
private static string SanitizeFileNamePart(string value)
|
||||
{
|
||||
var invalidCharacters = Path.GetInvalidFileNameChars();
|
||||
var sanitizedChars = value.Trim().ToCharArray();
|
||||
|
||||
for (var i = 0; i < sanitizedChars.Length; i++)
|
||||
{
|
||||
if (Array.IndexOf(invalidCharacters, sanitizedChars[i]) >= 0)
|
||||
{
|
||||
sanitizedChars[i] = '_';
|
||||
}
|
||||
}
|
||||
|
||||
var sanitized = new string(sanitizedChars).Trim();
|
||||
return string.IsNullOrWhiteSpace(sanitized) ? "email-summary" : sanitized;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user