Fixes Webview jumps when navigating emails and added Tooltips to the collapsed nav view. (#373)
* Prepare To/Cc/Bcc info in advance to avoid layout shifts * Changed tooltips in nav view to apply to whole element instead of content * Revert comment
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -109,11 +110,11 @@ namespace Wino.Mail.ViewModels
|
|||||||
private DateTime creationDate;
|
private DateTime creationDate;
|
||||||
|
|
||||||
|
|
||||||
public ObservableCollection<AccountContact> ToItems { get; set; } = new ObservableCollection<AccountContact>();
|
public ObservableCollection<AccountContact> ToItems { get; set; } = [];
|
||||||
public ObservableCollection<AccountContact> CCItemsItems { get; set; } = new ObservableCollection<AccountContact>();
|
public ObservableCollection<AccountContact> CcItems { get; set; } = [];
|
||||||
public ObservableCollection<AccountContact> BCCItems { get; set; } = new ObservableCollection<AccountContact>();
|
public ObservableCollection<AccountContact> BccItems { get; set; } = [];
|
||||||
public ObservableCollection<MailAttachmentViewModel> Attachments { get; set; } = new ObservableCollection<MailAttachmentViewModel>();
|
public ObservableCollection<MailAttachmentViewModel> Attachments { get; set; } = [];
|
||||||
public ObservableCollection<MailOperationMenuItem> MenuItems { get; set; } = new ObservableCollection<MailOperationMenuItem>();
|
public ObservableCollection<MailOperationMenuItem> MenuItems { get; set; } = [];
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -399,12 +400,24 @@ namespace Wino.Mail.ViewModels
|
|||||||
|
|
||||||
var renderingOptions = PreferencesService.GetRenderingOptions();
|
var renderingOptions = PreferencesService.GetRenderingOptions();
|
||||||
|
|
||||||
await ExecuteUIThread(async () =>
|
// Prepare account contacts info in advance, to avoid UI shifts after clearing collections.
|
||||||
|
var toAccountContacts = await GetAccountContacts(message.To);
|
||||||
|
var ccAccountContacts = await GetAccountContacts(message.Cc);
|
||||||
|
var bccAccountContacts = await GetAccountContacts(message.Bcc);
|
||||||
|
|
||||||
|
await ExecuteUIThread(() =>
|
||||||
{
|
{
|
||||||
Attachments.Clear();
|
Attachments.Clear();
|
||||||
ToItems.Clear();
|
ToItems.Clear();
|
||||||
CCItemsItems.Clear();
|
CcItems.Clear();
|
||||||
BCCItems.Clear();
|
BccItems.Clear();
|
||||||
|
|
||||||
|
foreach (var item in toAccountContacts)
|
||||||
|
ToItems.Add(item);
|
||||||
|
foreach (var item in ccAccountContacts)
|
||||||
|
CcItems.Add(item);
|
||||||
|
foreach (var item in bccAccountContacts)
|
||||||
|
BccItems.Add(item);
|
||||||
|
|
||||||
Subject = message.Subject;
|
Subject = message.Subject;
|
||||||
|
|
||||||
@@ -414,11 +427,6 @@ namespace Wino.Mail.ViewModels
|
|||||||
CreationDate = message.Date.DateTime;
|
CreationDate = message.Date.DateTime;
|
||||||
ContactPicture = initializedMailItemViewModel.SenderContact?.Base64ContactPicture;
|
ContactPicture = initializedMailItemViewModel.SenderContact?.Base64ContactPicture;
|
||||||
|
|
||||||
// Extract to,cc and bcc
|
|
||||||
await LoadAddressInfoAsync(message.To, ToItems);
|
|
||||||
await LoadAddressInfoAsync(message.Cc, CCItemsItems);
|
|
||||||
await LoadAddressInfoAsync(message.Bcc, BCCItems);
|
|
||||||
|
|
||||||
// Automatically disable images for Junk folder to prevent pixel tracking.
|
// Automatically disable images for Junk folder to prevent pixel tracking.
|
||||||
// This can only work for selected mail item rendering, not for EML file rendering.
|
// This can only work for selected mail item rendering, not for EML file rendering.
|
||||||
if (initializedMailItemViewModel != null &&
|
if (initializedMailItemViewModel != null &&
|
||||||
@@ -448,6 +456,27 @@ namespace Wino.Mail.ViewModels
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<List<AccountContact>> GetAccountContacts(InternetAddressList internetAddresses)
|
||||||
|
{
|
||||||
|
var accounts = new List<AccountContact>();
|
||||||
|
foreach (var item in internetAddresses)
|
||||||
|
{
|
||||||
|
if (item is MailboxAddress mailboxAddress)
|
||||||
|
{
|
||||||
|
var foundContact = await _contactService.GetAddressInformationByAddressAsync(mailboxAddress.Address).ConfigureAwait(false)
|
||||||
|
?? new AccountContact() { Name = mailboxAddress.Name, Address = mailboxAddress.Address };
|
||||||
|
|
||||||
|
accounts.Add(foundContact);
|
||||||
|
}
|
||||||
|
else if (item is GroupAddress groupAddress)
|
||||||
|
{
|
||||||
|
accounts.AddRange(await GetAccountContacts(groupAddress.Members));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return accounts;
|
||||||
|
}
|
||||||
|
|
||||||
public override void OnNavigatedFrom(NavigationMode mode, object parameters)
|
public override void OnNavigatedFrom(NavigationMode mode, object parameters)
|
||||||
{
|
{
|
||||||
base.OnNavigatedFrom(mode, parameters);
|
base.OnNavigatedFrom(mode, parameters);
|
||||||
@@ -463,22 +492,6 @@ namespace Wino.Mail.ViewModels
|
|||||||
StatePersistenceService.IsReadingMail = false;
|
StatePersistenceService.IsReadingMail = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task LoadAddressInfoAsync(InternetAddressList list, ObservableCollection<AccountContact> collection)
|
|
||||||
{
|
|
||||||
foreach (var item in list)
|
|
||||||
{
|
|
||||||
if (item is MailboxAddress mailboxAddress)
|
|
||||||
{
|
|
||||||
var foundContact = await _contactService.GetAddressInformationByAddressAsync(mailboxAddress.Address).ConfigureAwait(false)
|
|
||||||
?? new AccountContact() { Name = mailboxAddress.Name, Address = mailboxAddress.Address };
|
|
||||||
|
|
||||||
await ExecuteUIThread(() => { collection.Add(foundContact); });
|
|
||||||
}
|
|
||||||
else if (item is GroupAddress groupAddress)
|
|
||||||
await LoadAddressInfoAsync(groupAddress.Members, collection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ResetProgress()
|
private void ResetProgress()
|
||||||
{
|
{
|
||||||
CurrentDownloadPercentage = 0;
|
CurrentDownloadPercentage = 0;
|
||||||
|
|||||||
@@ -190,7 +190,8 @@
|
|||||||
IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}"
|
IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}"
|
||||||
IsSelected="{x:Bind IsSelected, Mode=TwoWay}"
|
IsSelected="{x:Bind IsSelected, Mode=TwoWay}"
|
||||||
MenuItemsSource="{x:Bind SubMenuItems, Mode=OneWay}"
|
MenuItemsSource="{x:Bind SubMenuItems, Mode=OneWay}"
|
||||||
SelectsOnInvoked="{x:Bind IsMoveTarget, Mode=OneWay}">
|
SelectsOnInvoked="{x:Bind IsMoveTarget, Mode=OneWay}"
|
||||||
|
ToolTipService.ToolTip="{x:Bind FolderName, Mode=OneWay}">
|
||||||
<animations:Implicit.Animations>
|
<animations:Implicit.Animations>
|
||||||
<animations:ScaleAnimation Duration="0:0:0.5" />
|
<animations:ScaleAnimation Duration="0:0:0.5" />
|
||||||
</animations:Implicit.Animations>
|
</animations:Implicit.Animations>
|
||||||
@@ -210,9 +211,6 @@
|
|||||||
x:Name="FolderBackgroundGrid"
|
x:Name="FolderBackgroundGrid"
|
||||||
Padding="2"
|
Padding="2"
|
||||||
VerticalAlignment="Center">
|
VerticalAlignment="Center">
|
||||||
<ToolTipService.ToolTip>
|
|
||||||
<ToolTip Content="{x:Bind FolderName, Mode=OneWay}" />
|
|
||||||
</ToolTipService.ToolTip>
|
|
||||||
<Grid
|
<Grid
|
||||||
x:Name="BackgroundColorGrid"
|
x:Name="BackgroundColorGrid"
|
||||||
x:Load="{x:Bind HasTextColor, Mode=OneWay}"
|
x:Load="{x:Bind HasTextColor, Mode=OneWay}"
|
||||||
@@ -308,7 +306,8 @@
|
|||||||
FontWeight="{x:Bind helpers:XamlHelpers.GetFontWeightByChildSelectedState(IsSelected), Mode=OneWay}"
|
FontWeight="{x:Bind helpers:XamlHelpers.GetFontWeightByChildSelectedState(IsSelected), Mode=OneWay}"
|
||||||
IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}"
|
IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}"
|
||||||
IsSelected="{x:Bind IsSelected, Mode=TwoWay}"
|
IsSelected="{x:Bind IsSelected, Mode=TwoWay}"
|
||||||
SelectsOnInvoked="True">
|
SelectsOnInvoked="True"
|
||||||
|
ToolTipService.ToolTip="{x:Bind FolderName, Mode=OneWay}">
|
||||||
<animations:Implicit.Animations>
|
<animations:Implicit.Animations>
|
||||||
<animations:ScaleAnimation Duration="0:0:0.5" />
|
<animations:ScaleAnimation Duration="0:0:0.5" />
|
||||||
</animations:Implicit.Animations>
|
</animations:Implicit.Animations>
|
||||||
@@ -327,9 +326,6 @@
|
|||||||
x:Name="FolderBackgroundGrid"
|
x:Name="FolderBackgroundGrid"
|
||||||
Padding="2"
|
Padding="2"
|
||||||
VerticalAlignment="Center">
|
VerticalAlignment="Center">
|
||||||
<ToolTipService.ToolTip>
|
|
||||||
<ToolTip Content="{x:Bind FolderName, Mode=OneWay}" />
|
|
||||||
</ToolTipService.ToolTip>
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
x:Name="NormalTitle"
|
x:Name="NormalTitle"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
|||||||
@@ -263,12 +263,12 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
Text="Cc:"
|
Text="Cc:"
|
||||||
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.CCItemsItems.Count), Mode=OneWay}" />
|
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.CcItems.Count), Mode=OneWay}" />
|
||||||
<ItemsControl
|
<ItemsControl
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
ItemTemplate="{StaticResource InternetAddressTemplate}"
|
ItemTemplate="{StaticResource InternetAddressTemplate}"
|
||||||
ItemsSource="{x:Bind ViewModel.CCItemsItems, Mode=OneWay}"
|
ItemsSource="{x:Bind ViewModel.CcItems, Mode=OneWay}"
|
||||||
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.CCItemsItems.Count), Mode=OneWay}">
|
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.CcItems.Count), Mode=OneWay}">
|
||||||
<ItemsControl.ItemsPanel>
|
<ItemsControl.ItemsPanel>
|
||||||
<ItemsPanelTemplate>
|
<ItemsPanelTemplate>
|
||||||
<toolkit:WrapPanel Orientation="Horizontal" />
|
<toolkit:WrapPanel Orientation="Horizontal" />
|
||||||
@@ -286,13 +286,13 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
FontWeight="SemiBold"
|
FontWeight="SemiBold"
|
||||||
Text="Bcc:"
|
Text="Bcc:"
|
||||||
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.BCCItems.Count), Mode=OneWay}" />
|
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.BccItems.Count), Mode=OneWay}" />
|
||||||
|
|
||||||
<ItemsControl
|
<ItemsControl
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
ItemTemplate="{StaticResource InternetAddressTemplate}"
|
ItemTemplate="{StaticResource InternetAddressTemplate}"
|
||||||
ItemsSource="{x:Bind ViewModel.BCCItems, Mode=OneWay}"
|
ItemsSource="{x:Bind ViewModel.BccItems, Mode=OneWay}"
|
||||||
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.BCCItems.Count), Mode=OneWay}">
|
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.BccItems.Count), Mode=OneWay}">
|
||||||
<ItemsControl.ItemsPanel>
|
<ItemsControl.ItemsPanel>
|
||||||
<ItemsPanelTemplate>
|
<ItemsPanelTemplate>
|
||||||
<toolkit:WrapPanel Orientation="Horizontal" />
|
<toolkit:WrapPanel Orientation="Horizontal" />
|
||||||
|
|||||||
Reference in New Issue
Block a user