Couple UI Fixes (#255)

- Disabled UI navigation cache for all pages.
- Restore the renderer<>composer page animation back.
- IdlePage functionality into mail list page.
- Couple bugfixes.
This commit is contained in:
Burak Kaan Köse
2024-06-26 20:00:10 +02:00
committed by GitHub
parent ca40730600
commit 39626e0df9
12 changed files with 180 additions and 109 deletions

View File

@@ -225,7 +225,14 @@ namespace Wino.Mail.ViewModels
private async Task SaveBodyAsync()
{
if (GetHTMLBodyFunction != null)
bodyBuilder.HtmlBody = Regex.Unescape(await GetHTMLBodyFunction());
{
var htmlBody = await GetHTMLBodyFunction();
if (!string.IsNullOrEmpty(htmlBody))
{
bodyBuilder.HtmlBody = Regex.Unescape(htmlBody);
}
}
if (!string.IsNullOrEmpty(bodyBuilder.HtmlBody))
bodyBuilder.TextBody = HtmlAgilityPackExtensions.GetPreviewText(bodyBuilder.HtmlBody);
@@ -269,8 +276,6 @@ namespace Wino.Mail.ViewModels
base.OnNavigatedFrom(mode, parameters);
await UpdateMimeChangesAsync().ConfigureAwait(false);
await ExecuteUIThread(() => { _statePersistanceService.IsReadingMail = false; });
}
public override async void OnNavigatedTo(NavigationMode mode, object parameters)
@@ -289,8 +294,6 @@ namespace Wino.Mail.ViewModels
ToItems.CollectionChanged -= ContactListCollectionChanged;
ToItems.CollectionChanged += ContactListCollectionChanged;
_statePersistanceService.IsReadingMail = true;
// Check if there is any delivering mail address from protocol launch.
if (_launchProtocolService.MailtoParameters != null)
@@ -388,6 +391,11 @@ namespace Wino.Mail.ViewModels
return;
}
catch (IOException)
{
DialogService.InfoBarMessage("Busy", "Mail is being processed. Please wait a moment and try again.", InfoBarMessageType.Warning);
}
catch (ComposerMimeNotFoundException)
{
DialogService.InfoBarMessage(Translator.Info_ComposerMissingMIMETitle, Translator.Info_ComposerMissingMIMEMessage, InfoBarMessageType.Error);

View File

@@ -1,38 +1,9 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Wino.Core.Domain;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.Messages.Mails;
using Wino.Core.Domain.Interfaces;
namespace Wino.Mail.ViewModels
{
public partial class IdlePageViewModel : BaseViewModel, IRecipient<SelectedMailItemsChanged>
public partial class IdlePageViewModel : BaseViewModel
{
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(HasSelectedItems))]
[NotifyPropertyChangedFor(nameof(SelectedMessageText))]
private int selectedItemCount;
public bool HasSelectedItems => SelectedItemCount > 0;
public string SelectedMessageText => HasSelectedItems ? string.Format(Translator.MailsSelected, SelectedItemCount) : Translator.NoMailSelected;
public IdlePageViewModel(IDialogService dialogService) : base(dialogService) { }
public void Receive(SelectedMailItemsChanged message)
{
SelectedItemCount = message.SelectedItemCount;
}
public override void OnNavigatedTo(NavigationMode mode, object parameters)
{
base.OnNavigatedTo(mode, parameters);
if (parameters != null && parameters is int selectedItemCount)
SelectedItemCount = selectedItemCount;
else
SelectedItemCount = 0;
}
}
}

View File

@@ -24,6 +24,7 @@ using Wino.Core.Domain.Models.Menus;
using Wino.Core.Domain.Models.Reader;
using Wino.Core.Domain.Models.Synchronization;
using Wino.Core.Messages.Mails;
using Wino.Core.Messages.Shell;
using Wino.Core.Messages.Synchronization;
using Wino.Mail.ViewModels.Collections;
using Wino.Mail.ViewModels.Data;
@@ -38,7 +39,8 @@ namespace Wino.Mail.ViewModels
IRecipient<MailItemSelectionRemovedEvent>,
IRecipient<AccountSynchronizationCompleted>,
IRecipient<NewSynchronizationRequested>,
IRecipient<AccountSynchronizerStateChanged>
IRecipient<AccountSynchronizerStateChanged>,
IRecipient<SelectedMailItemsChanged>
{
private bool isChangingFolder = false;
@@ -93,6 +95,9 @@ namespace Wino.Mail.ViewModels
private FolderPivotViewModel _selectedFolderPivot;
[ObservableProperty]
private bool isMultiSelectionModeEnabled;
[ObservableProperty]
private string searchQuery;
@@ -207,9 +212,11 @@ namespace Wino.Mail.ViewModels
public bool IsFolderSynchronizationEnabled => ActiveFolder?.IsSynchronizationEnabled ?? false;
public int SelectedItemCount => SelectedItems.Count;
public bool HasMultipleItemSelections => SelectedItemCount > 1;
public bool HasSingleItemSelection => SelectedItemCount == 1;
public bool HasSelectedItems => SelectedItems.Any();
public bool IsArchiveSpecialFolder => ActiveFolder?.SpecialFolderType == SpecialFolderType.Archive;
public string SelectedMessageText => HasSelectedItems ? string.Format(Translator.MailsSelected, SelectedItemCount) : Translator.NoMailSelected;
/// <summary>
/// Indicates current state of the mail list. Doesn't matter it's loading or no.
/// </summary>
@@ -231,14 +238,21 @@ namespace Wino.Mail.ViewModels
{
if (_activeMailItem == selectedMailItemViewModel) return;
// Don't update active mail item if Ctrl key is pressed.
// Don't update active mail item if Ctrl key is pressed or multi selection is ennabled.
// User is probably trying to select multiple items.
// This is not the same behavior in Windows Mail,
// but it's a trash behavior.
var isCtrlKeyPressed = _keyPressService.IsCtrlKeyPressed();
if (isCtrlKeyPressed) return;
bool isMultiSelecting = isCtrlKeyPressed || IsMultiSelectionModeEnabled;
if (isMultiSelecting ? StatePersistanceService.IsReaderNarrowed : false)
{
// Don't change the active mail item if the reader is narrowed, but just update the shell.
Messenger.Send(new ShellStateUpdated());
return;
}
_activeMailItem = selectedMailItemViewModel;
@@ -271,6 +285,8 @@ namespace Wino.Mail.ViewModels
public void NotifyItemSelected()
{
OnPropertyChanged(nameof(SelectedMessageText));
OnPropertyChanged(nameof(HasSingleItemSelection));
OnPropertyChanged(nameof(HasSelectedItems));
OnPropertyChanged(nameof(SelectedItemCount));
OnPropertyChanged(nameof(HasMultipleItemSelections));
@@ -812,14 +828,21 @@ namespace Wino.Mail.ViewModels
}
#region Receivers
void IRecipient<MailItemSelectedEvent>.Receive(MailItemSelectedEvent message)
=> SelectedItems.Add(message.SelectedMailItem);
{
if (!SelectedItems.Contains(message.SelectedMailItem)) SelectedItems.Add(message.SelectedMailItem);
}
void IRecipient<MailItemSelectionRemovedEvent>.Receive(MailItemSelectionRemovedEvent message)
=> SelectedItems.Remove(message.RemovedMailItem);
{
if (SelectedItems.Contains(message.RemovedMailItem)) SelectedItems.Remove(message.RemovedMailItem);
}
async void IRecipient<ActiveMailFolderChangedEvent>.Receive(ActiveMailFolderChangedEvent message)
{
NotifyItemSelected();
isChangingFolder = true;
ActiveFolder = message.BaseFolderMenuItem;
@@ -963,5 +986,7 @@ namespace Wino.Mail.ViewModels
await ExecuteUIThread(() => { IsAccountSynchronizerInSynchronization = isAnyAccountSynchronizing; });
}
public void Receive(SelectedMailItemsChanged message) => NotifyItemSelected();
}
}

View File

@@ -460,8 +460,13 @@ namespace Wino.Mail.ViewModels
initializedMailItemViewModel = null;
initializedMimeMessageInformation = null;
StatePersistanceService.IsReadingMail = false;
forceImageLoading = false;
ToItems.Clear();
CCItemsItems.Clear();
BCCItems.Clear();
Attachments.Clear();
MenuItems.Clear();
}
private void LoadAddressInfo(InternetAddressList list, ObservableCollection<AddressInformation> collection)