Fix merge conflicts
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
using Microsoft.Toolkit.Uwp.Notifications;
|
||||
using Windows.ApplicationModel;
|
||||
using Windows.ApplicationModel.Background;
|
||||
using Wino.Core.Domain;
|
||||
|
||||
namespace Wino.BackgroundTasks
|
||||
{
|
||||
@@ -23,8 +22,9 @@ namespace Wino.BackgroundTasks
|
||||
|
||||
var versionText = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
|
||||
|
||||
builder.AddText(Translator.Notifications_WinoUpdatedTitle);
|
||||
builder.AddText(string.Format(Translator.Notifications_WinoUpdatedMessage, versionText));
|
||||
// TODO: Handle with Translator, but it's not initialized here yet.
|
||||
builder.AddText("Wino Mail is updated!");
|
||||
builder.AddText(string.Format("New version {0} is ready.", versionText));
|
||||
|
||||
builder.Show();
|
||||
|
||||
|
||||
@@ -44,6 +44,11 @@ namespace Wino.Core.Domain.Entities
|
||||
/// </summary>
|
||||
public string AccountColorHex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the listing order of the account in the accounts list.
|
||||
/// </summary>
|
||||
public int Order { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether the account has any reason for an interactive user action to fix continue operating.
|
||||
/// </summary>
|
||||
|
||||
@@ -13,5 +13,21 @@ namespace Wino.Core.Domain.Interfaces
|
||||
/// Name representation of the view model that will be used to identify the startup entity on launch.
|
||||
/// </summary>
|
||||
string StartupEntityTitle { get; }
|
||||
|
||||
/// <summary>
|
||||
/// E-mail addresses that this account holds.
|
||||
/// </summary>
|
||||
|
||||
string StartupEntityAddresses { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Represents the account order in the accounts list.
|
||||
/// </summary>
|
||||
int Order { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Provider details of the account.
|
||||
/// </summary>
|
||||
IProviderDetail ProviderDetail { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,12 +68,37 @@ namespace Wino.Core.Domain.Interfaces
|
||||
/// <returns>Current account synchronization modifier.</returns>
|
||||
Task<string> UpdateSynchronizationIdentifierAsync(Guid accountId, string newIdentifier);
|
||||
|
||||
/// <summary>
|
||||
/// Renames the merged inbox with the given id.
|
||||
/// </summary>
|
||||
/// <param name="mergedInboxId">Merged Inbox id</param>
|
||||
/// <param name="newName">New name for the merged/linked inbox.</param>
|
||||
Task RenameMergedAccountAsync(Guid mergedInboxId, string newName);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new merged inbox with the given accounts.
|
||||
/// </summary>
|
||||
/// <param name="mergedInbox">Merged inbox properties.</param>
|
||||
/// <param name="accountsToMerge">List of accounts to merge together.</param>
|
||||
Task CreateMergeAccountsAsync(MergedInbox mergedInbox, IEnumerable<MailAccount> accountsToMerge);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the merged inbox with the given id with the new linked accounts.
|
||||
/// </summary>
|
||||
/// <param name="mergedInboxId">Updating merged inbox id.</param>
|
||||
/// <param name="linkedAccountIds">List of linked account ids.</param>
|
||||
Task UpdateMergedInboxAsync(Guid mergedInboxId, IEnumerable<Guid> linkedAccountIds);
|
||||
|
||||
/// <summary>
|
||||
/// Destroys the merged inbox with the given id.
|
||||
/// </summary>
|
||||
/// <param name="mergedInboxId">Merged inbox id to destroy.</param>
|
||||
Task UnlinkMergedInboxAsync(Guid mergedInboxId);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the account listing orders.
|
||||
/// </summary>
|
||||
/// <param name="accountIdOrderPair">AccountId-OrderNumber pair for all accounts.</param>
|
||||
Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading.Tasks;
|
||||
using Wino.Core.Domain.Entities;
|
||||
using Wino.Core.Domain.Enums;
|
||||
@@ -32,6 +33,13 @@ namespace Wino.Core.Domain.Interfaces
|
||||
Task<MailAccount> ShowEditAccountDialogAsync(MailAccount account);
|
||||
Task<MailAccount> ShowAccountPickerDialogAsync(List<MailAccount> availableAccounts);
|
||||
|
||||
/// <summary>
|
||||
/// Displays a dialog to the user for reordering accounts.
|
||||
/// </summary>
|
||||
/// <param name="availableAccounts">Available accounts in order.</param>
|
||||
/// <returns>Result model that has dict of AccountId-AccountOrder.</returns>
|
||||
Task ShowAccountReorderDialogAsync(ObservableCollection<IAccountProviderDetailViewModel> availableAccounts);
|
||||
|
||||
/// <summary>
|
||||
/// Presents a dialog to the user for selecting folder.
|
||||
/// </summary>
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace Wino.Core.Domain.Interfaces
|
||||
public interface IFolderMenuItem : IBaseFolderMenuItem
|
||||
{
|
||||
MailAccount ParentAccount { get; }
|
||||
void UpdateParentAccounnt(MailAccount account);
|
||||
}
|
||||
|
||||
public interface IMergedAccountFolderMenuItem : IBaseFolderMenuItem { }
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace Wino.Core.Domain.Models.Accounts
|
||||
public string ProviderImage => $"ms-appx:///Assets/Providers/{Type}.png";
|
||||
|
||||
public bool IsSupported => Type == MailProviderType.Outlook || Type == MailProviderType.Gmail || Type == MailProviderType.IMAP4;
|
||||
public bool RequireSenderNameOnCreationDialog => Type != MailProviderType.IMAP4;
|
||||
|
||||
public ProviderDetail(MailProviderType type)
|
||||
{
|
||||
|
||||
@@ -408,6 +408,8 @@
|
||||
"SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail",
|
||||
"SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.",
|
||||
"SettingsManageAccountSettings_Title": "Manage Account Settings",
|
||||
"SettingsReorderAccounts_Title": "Reorder Accounts",
|
||||
"SettingsReorderAccounts_Description": "Change the order of accounts in the account list.",
|
||||
"SettingsManageLink_Description": "Move items to add new link or remove existing link.",
|
||||
"SettingsManageLink_Title": "Manage Link",
|
||||
"SettingsMarkAsRead_Description": "Change what should happen to the selected item.",
|
||||
|
||||
12
Wino.Core.Domain/Translator.Designer.cs
generated
12
Wino.Core.Domain/Translator.Designer.cs
generated
@@ -2063,6 +2063,18 @@ namespace Wino.Core.Domain
|
||||
/// </summary>
|
||||
public static string SettingsManageAccountSettings_Title => Resources.GetTranslatedString(@"SettingsManageAccountSettings_Title");
|
||||
|
||||
/// <summary>
|
||||
/// Reorder Accounts
|
||||
/// </summary>
|
||||
public static string SettingsReorderAccounts_Title => Resources.GetTranslatedString(@"SettingsReorderAccounts_Title");
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Change the order of accounts in the account list.
|
||||
/// </summary>
|
||||
public static string SettingsReorderAccounts_Description => Resources.GetTranslatedString(@"SettingsReorderAccounts_Description");
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Move items to add new link or remove existing link.
|
||||
/// </summary>
|
||||
|
||||
@@ -58,6 +58,16 @@ namespace Wino.Core.MenuItems
|
||||
Parameter = account;
|
||||
AccountName = account.Name;
|
||||
AttentionReason = account.AttentionReason;
|
||||
|
||||
if (SubMenuItems == null) return;
|
||||
|
||||
foreach (var item in SubMenuItems)
|
||||
{
|
||||
if (item is IFolderMenuItem folderMenuItem)
|
||||
{
|
||||
folderMenuItem.UpdateParentAccounnt(account);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateFixAccountIssueMenuItem()
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace Wino.Core.MenuItems
|
||||
|
||||
public IEnumerable<IMailItemFolder> HandlingFolders => new List<IMailItemFolder>() { Parameter };
|
||||
|
||||
public MailAccount ParentAccount { get; }
|
||||
public MailAccount ParentAccount { get; private set; }
|
||||
|
||||
public string AssignedAccountName => ParentAccount?.Name;
|
||||
|
||||
@@ -71,5 +71,7 @@ namespace Wino.Core.MenuItems
|
||||
}
|
||||
|
||||
public override string ToString() => FolderName;
|
||||
|
||||
public void UpdateParentAccounnt(MailAccount account) => ParentAccount = account;
|
||||
}
|
||||
}
|
||||
|
||||
11
Wino.Core/Messages/Accounts/AccountMenuItemsReordered.cs
Normal file
11
Wino.Core/Messages/Accounts/AccountMenuItemsReordered.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Wino.Core.Messages.Accounts
|
||||
{
|
||||
/// <summary>
|
||||
/// Emitted when account menu items are reordered.
|
||||
/// </summary>
|
||||
/// <param name="newOrderDictionary">New order info.</param>
|
||||
public record AccountMenuItemsReordered(Dictionary<Guid, int> newOrderDictionary);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using MoreLinq;
|
||||
@@ -9,8 +10,25 @@ using Wino.Core.Domain.Models.Requests;
|
||||
|
||||
namespace Wino.Core.Requests
|
||||
{
|
||||
public record SendDraftRequest(SendDraftPreparationRequest Request) : RequestBase<BatchMarkReadRequest>(Request.MailItem, MailSynchronizerOperation.Send)
|
||||
public record SendDraftRequest(SendDraftPreparationRequest Request)
|
||||
: RequestBase<BatchMarkReadRequest>(Request.MailItem, MailSynchronizerOperation.Send),
|
||||
ICustomFolderSynchronizationRequest
|
||||
{
|
||||
public List<Guid> SynchronizationFolderIds
|
||||
{
|
||||
get
|
||||
{
|
||||
var folderIds = new List<Guid> { Request.DraftFolder.Id };
|
||||
|
||||
if (Request.SentFolder != null)
|
||||
{
|
||||
folderIds.Add(Request.SentFolder.Id);
|
||||
}
|
||||
|
||||
return folderIds;
|
||||
}
|
||||
}
|
||||
|
||||
public override IBatchChangeRequest CreateBatch(IEnumerable<IRequest> matchingItems)
|
||||
=> new BatchSendDraftRequestRequest(matchingItems, Request);
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ namespace Wino.Core.Services
|
||||
|
||||
public async Task<List<MailAccount>> GetAccountsAsync()
|
||||
{
|
||||
var accounts = await Connection.Table<MailAccount>().ToListAsync();
|
||||
var accounts = await Connection.Table<MailAccount>().OrderBy(a => a.Order).ToListAsync();
|
||||
|
||||
foreach (var account in accounts)
|
||||
{
|
||||
@@ -299,12 +299,21 @@ namespace Wino.Core.Services
|
||||
{
|
||||
var account = await Connection.Table<MailAccount>().FirstOrDefaultAsync(a => a.Id == accountId);
|
||||
|
||||
if (account?.ProviderType == MailProviderType.IMAP4)
|
||||
account.ServerInformation = await GetAccountCustomServerInformationAsync(account.Id);
|
||||
if (account == null)
|
||||
{
|
||||
_logger.Error("Could not find account with id {AccountId}", accountId);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (account.ProviderType == MailProviderType.IMAP4)
|
||||
account.ServerInformation = await GetAccountCustomServerInformationAsync(account.Id);
|
||||
|
||||
account.Preferences = await GetAccountPreferencesAsync(account.Id);
|
||||
account.Preferences = await GetAccountPreferencesAsync(account.Id);
|
||||
|
||||
return account;
|
||||
return account;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Task<CustomServerInformation> GetAccountCustomServerInformationAsync(Guid accountId)
|
||||
@@ -334,6 +343,12 @@ namespace Wino.Core.Services
|
||||
{
|
||||
_preferencesService.StartupEntityId = account.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set the order of the account.
|
||||
// This can be changed by the user later in manage accounts page.
|
||||
account.Order = accountCount;
|
||||
}
|
||||
|
||||
await Connection.InsertAsync(account);
|
||||
|
||||
@@ -350,6 +365,8 @@ namespace Wino.Core.Services
|
||||
// Outlook & Office 365 supports Focused inbox. Enabled by default.
|
||||
bool isMicrosoftProvider = account.ProviderType == MailProviderType.Outlook || account.ProviderType == MailProviderType.Office365;
|
||||
|
||||
// TODO: This should come from account settings API.
|
||||
// Wino doesn't have MailboxSettings yet.
|
||||
if (isMicrosoftProvider)
|
||||
account.Preferences.IsFocusedInboxEnabled = true;
|
||||
|
||||
@@ -397,5 +414,25 @@ namespace Wino.Core.Services
|
||||
|
||||
return account.SynchronizationDeltaIdentifier;
|
||||
}
|
||||
|
||||
public async Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair)
|
||||
{
|
||||
foreach (var pair in accountIdOrderPair)
|
||||
{
|
||||
var account = await GetAccountAsync(pair.Key);
|
||||
|
||||
if (account == null)
|
||||
{
|
||||
_logger.Information("Could not find account with id {Key} for reordering. It may be a linked account.", pair.Key);
|
||||
continue;
|
||||
}
|
||||
|
||||
account.Order = pair.Value;
|
||||
|
||||
await Connection.UpdateAsync(account);
|
||||
}
|
||||
|
||||
Messenger.Send(new AccountMenuItemsReordered(accountIdOrderPair));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Wino.Core.Services
|
||||
{
|
||||
public class MailService : BaseDatabaseService, IMailService
|
||||
{
|
||||
private const int ItemLoadCount = 20;
|
||||
private const int ItemLoadCount = 100;
|
||||
|
||||
private readonly IFolderService _folderService;
|
||||
private readonly IContactService _contactService;
|
||||
@@ -415,6 +415,14 @@ namespace Wino.Core.Services
|
||||
|
||||
await Connection.DeleteAsync(mailCopy).ConfigureAwait(false);
|
||||
|
||||
// If there are no more copies exists of the same mail, delete the MIME file as well.
|
||||
var isMailExists = await IsMailExistsAsync(mailCopy.Id).ConfigureAwait(false);
|
||||
|
||||
if (!isMailExists)
|
||||
{
|
||||
await _mimeFileService.DeleteMimeMessageAsync(mailCopy.AssignedAccount.Id, mailCopy.FileId).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
ReportUIChange(new MailRemovedMessage(mailCopy));
|
||||
}
|
||||
|
||||
|
||||
@@ -148,6 +148,16 @@ namespace Wino.Core.Synchronizers
|
||||
|
||||
await synchronizationSemaphore.WaitAsync(activeSynchronizationCancellationToken);
|
||||
|
||||
// Let servers to finish their job. Sometimes the servers doesn't respond immediately.
|
||||
// TODO: Outlook sends back the deleted Draft. Might be a bug in the graph API or in Wino.
|
||||
|
||||
var hasSendDraftRequest = batches.Any(a => a is BatchSendDraftRequestRequest);
|
||||
|
||||
if (hasSendDraftRequest && DelaySendOperationSynchronization())
|
||||
{
|
||||
await Task.Delay(2000);
|
||||
}
|
||||
|
||||
// Start the internal synchronization.
|
||||
var synchronizationResult = await SynchronizeInternalAsync(options, activeSynchronizationCancellationToken).ConfigureAwait(false);
|
||||
|
||||
@@ -305,6 +315,7 @@ namespace Wino.Core.Synchronizers
|
||||
return options;
|
||||
}
|
||||
|
||||
public virtual bool DelaySendOperationSynchronization() => false;
|
||||
public virtual IEnumerable<IRequestBundle<TBaseRequest>> Move(BatchMoveRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
|
||||
public virtual IEnumerable<IRequestBundle<TBaseRequest>> ChangeFlag(BatchChangeFlagRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
|
||||
public virtual IEnumerable<IRequestBundle<TBaseRequest>> MarkRead(BatchMarkReadRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType()));
|
||||
|
||||
@@ -664,9 +664,18 @@ namespace Wino.Core.Synchronizers
|
||||
ITransferProgress transferProgress = null,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var gmailMessage = await _gmailService.Users.Messages.Get("me", mailItem.Id).ExecuteAsync(cancellationToken).ConfigureAwait(false);
|
||||
var request = _gmailService.Users.Messages.Get("me", mailItem.Id);
|
||||
request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;
|
||||
|
||||
var gmailMessage = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);
|
||||
var mimeMessage = gmailMessage.GetGmailMimeMessage();
|
||||
|
||||
if (mimeMessage == null)
|
||||
{
|
||||
_logger.Warning("Tried to download Gmail Raw Mime with {Id} id and server responded without a data.", mailItem.Id);
|
||||
return;
|
||||
}
|
||||
|
||||
await _gmailChangeProcessor.SaveMimeFileAsync(mailItem.FileId, mimeMessage, Account.Id).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -891,7 +900,8 @@ namespace Wino.Core.Synchronizers
|
||||
// This seem to be a worse approach. Now both Outlook and Gmail use X-Wino-Draft-Id header to map drafts.
|
||||
// This is a better approach since we don't need to fetch the draft resource to get the draft id.
|
||||
|
||||
if (mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader)
|
||||
if (mailCopy.IsDraft
|
||||
&& mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader)
|
||||
&& Guid.TryParse(mimeMessage.Headers[Domain.Constants.WinoLocalDraftHeader], out Guid localDraftCopyUniqueId))
|
||||
{
|
||||
// This message belongs to existing local draft copy.
|
||||
|
||||
@@ -406,6 +406,8 @@ namespace Wino.Core.Synchronizers
|
||||
|
||||
#region Mail Integration
|
||||
|
||||
public override bool DelaySendOperationSynchronization() => true;
|
||||
|
||||
public override IEnumerable<IRequestBundle<RequestInformation>> Move(BatchMoveRequest request)
|
||||
{
|
||||
var requestBody = new Microsoft.Graph.Me.Messages.Item.Move.MovePostRequestBody()
|
||||
@@ -520,6 +522,56 @@ namespace Wino.Core.Synchronizers
|
||||
});
|
||||
}
|
||||
|
||||
public override IEnumerable<IRequestBundle<RequestInformation>> SendDraft(BatchSendDraftRequestRequest request)
|
||||
{
|
||||
var sendDraftPreparationRequest = request.Request;
|
||||
|
||||
// 1. Delete draft
|
||||
// 2. Create new Message with new MIME.
|
||||
// 3. Make sure that conversation id is tagged correctly for replies.
|
||||
|
||||
var mailCopyId = sendDraftPreparationRequest.MailItem.Id;
|
||||
var mimeMessage = sendDraftPreparationRequest.Mime;
|
||||
|
||||
var batchDeleteRequest = new BatchDeleteRequest(new List<IRequest>()
|
||||
{
|
||||
new DeleteRequest(sendDraftPreparationRequest.MailItem)
|
||||
});
|
||||
|
||||
var deleteBundle = Delete(batchDeleteRequest).ElementAt(0);
|
||||
|
||||
mimeMessage.Prepare(EncodingConstraint.None);
|
||||
|
||||
var plainTextBytes = Encoding.UTF8.GetBytes(mimeMessage.ToString());
|
||||
var base64Encoded = Convert.ToBase64String(plainTextBytes);
|
||||
|
||||
var outlookMessage = new Message()
|
||||
{
|
||||
ConversationId = sendDraftPreparationRequest.MailItem.ThreadId
|
||||
};
|
||||
|
||||
// Apply importance here as well just in case.
|
||||
if (mimeMessage.Importance != MessageImportance.Normal)
|
||||
outlookMessage.Importance = mimeMessage.Importance == MessageImportance.High ? Importance.High : Importance.Low;
|
||||
|
||||
var body = new Microsoft.Graph.Me.SendMail.SendMailPostRequestBody()
|
||||
{
|
||||
Message = outlookMessage
|
||||
};
|
||||
|
||||
var sendRequest = _graphClient.Me.SendMail.ToPostRequestInformation(body);
|
||||
|
||||
sendRequest.Headers.Clear();
|
||||
sendRequest.Headers.Add("Content-Type", "text/plain");
|
||||
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(base64Encoded));
|
||||
sendRequest.SetStreamContent(stream, "text/plain");
|
||||
|
||||
var sendMailRequest = new HttpRequestBundle<RequestInformation>(sendRequest, request);
|
||||
|
||||
return [deleteBundle, sendMailRequest];
|
||||
}
|
||||
|
||||
public override async Task DownloadMissingMimeMessageAsync(IMailItem mailItem,
|
||||
MailKit.ITransferProgress transferProgress = null,
|
||||
CancellationToken cancellationToken = default)
|
||||
@@ -636,7 +688,8 @@ namespace Wino.Core.Synchronizers
|
||||
var mimeMessage = await DownloadMimeMessageAsync(message.Id, cancellationToken).ConfigureAwait(false);
|
||||
var mailCopy = message.AsMailCopy();
|
||||
|
||||
if (mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader)
|
||||
if (message.IsDraft.GetValueOrDefault()
|
||||
&& mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader)
|
||||
&& Guid.TryParse(mimeMessage.Headers[Domain.Constants.WinoLocalDraftHeader], out Guid localDraftCopyUniqueId))
|
||||
{
|
||||
// This message belongs to existing local draft copy.
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace Wino.Mail.ViewModels
|
||||
public bool IsPurchasePanelVisible => !HasUnlimitedAccountProduct;
|
||||
public bool IsAccountCreationAlmostOnLimit => Accounts != null && Accounts.Count == FREE_ACCOUNT_COUNT - 1;
|
||||
public bool HasAccountsDefined => Accounts != null && Accounts.Any();
|
||||
public bool CanReorderAccounts => Accounts?.Count > 1;
|
||||
|
||||
public string UsedAccountsString => string.Format(Translator.WinoUpgradeRemainingAccountsMessage, Accounts.Count, FREE_ACCOUNT_COUNT);
|
||||
|
||||
@@ -263,6 +264,9 @@ namespace Wino.Mail.ViewModels
|
||||
mergedAccountProviderDetailViewModel));
|
||||
}
|
||||
|
||||
[RelayCommand(CanExecute = nameof(CanReorderAccounts))]
|
||||
private Task ReorderAccountsAsync() => DialogService.ShowAccountReorderDialogAsync(availableAccounts: Accounts);
|
||||
|
||||
public override void OnNavigatedFrom(NavigationMode mode, object parameters)
|
||||
{
|
||||
base.OnNavigatedFrom(mode, parameters);
|
||||
@@ -276,6 +280,9 @@ namespace Wino.Mail.ViewModels
|
||||
{
|
||||
OnPropertyChanged(nameof(HasAccountsDefined));
|
||||
OnPropertyChanged(nameof(UsedAccountsString));
|
||||
OnPropertyChanged(nameof(IsAccountCreationAlmostOnLimit));
|
||||
|
||||
ReorderAccountsCommand.NotifyCanExecuteChanged();
|
||||
}
|
||||
|
||||
private void PagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
|
||||
@@ -39,7 +39,8 @@ namespace Wino.Mail.ViewModels
|
||||
IRecipient<RefreshUnreadCountsMessage>,
|
||||
IRecipient<AccountsMenuRefreshRequested>,
|
||||
IRecipient<MergedInboxRenamed>,
|
||||
IRecipient<LanguageChanged>
|
||||
IRecipient<LanguageChanged>,
|
||||
IRecipient<AccountMenuItemsReordered>
|
||||
{
|
||||
#region Menu Items
|
||||
|
||||
@@ -1059,5 +1060,19 @@ namespace Wino.Mail.ViewModels
|
||||
|
||||
ChangeLoadedAccount(latestSelectedAccountMenuItem, navigateInbox: false);
|
||||
}
|
||||
|
||||
private void ReorderAccountMenuItems(Dictionary<Guid, int> newAccountOrder)
|
||||
{
|
||||
foreach (var item in newAccountOrder)
|
||||
{
|
||||
var menuItem = MenuItems.GetAccountMenuItem(item.Key);
|
||||
|
||||
if (menuItem == null) continue;
|
||||
|
||||
MenuItems.Move(MenuItems.IndexOf(menuItem), item.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public void Receive(AccountMenuItemsReordered message) => ReorderAccountMenuItems(message.newOrderDictionary);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,15 +160,7 @@ namespace Wino.Mail.ViewModels
|
||||
isUpdatingMimeBlocked = true;
|
||||
|
||||
var assignedAccount = CurrentMailDraftItem.AssignedAccount;
|
||||
|
||||
MailItemFolder sentFolder = null;
|
||||
|
||||
// Load the Sent folder if user wanted to have a copy there.
|
||||
if (assignedAccount.Preferences.ShouldAppendMessagesToSentFolder)
|
||||
{
|
||||
sentFolder = await _folderService.GetSpecialFolderByAccountIdAsync(assignedAccount.Id, SpecialFolderType.Sent);
|
||||
}
|
||||
|
||||
var sentFolder = await _folderService.GetSpecialFolderByAccountIdAsync(assignedAccount.Id, SpecialFolderType.Sent);
|
||||
var draftSendPreparationRequest = new SendDraftPreparationRequest(CurrentMailDraftItem.MailCopy, currentMimeMessage, CurrentMailDraftItem.AssignedFolder, sentFolder, CurrentMailDraftItem.AssignedAccount.Preferences);
|
||||
|
||||
await _worker.ExecuteAsync(draftSendPreparationRequest);
|
||||
|
||||
@@ -17,6 +17,10 @@ namespace Wino.Mail.ViewModels.Data
|
||||
|
||||
public string StartupEntityTitle => Account.Name;
|
||||
|
||||
public int Order => Account.Order;
|
||||
|
||||
public string StartupEntityAddresses => Account.Address;
|
||||
|
||||
public AccountProviderDetailViewModel(IProviderDetail providerDetail, MailAccount account)
|
||||
{
|
||||
ProviderDetail = providerDetail;
|
||||
|
||||
@@ -18,6 +18,12 @@ namespace Wino.Mail.ViewModels.Data
|
||||
|
||||
public string StartupEntityTitle => MergedInbox.Name;
|
||||
|
||||
public int Order => 0;
|
||||
|
||||
public IProviderDetail ProviderDetail { get; set; }
|
||||
|
||||
public string StartupEntityAddresses => AccountAddresses;
|
||||
|
||||
public MergedAccountProviderDetailViewModel(MergedInbox mergedInbox, List<AccountProviderDetailViewModel> holdingAccounts)
|
||||
{
|
||||
MergedInbox = mergedInbox;
|
||||
|
||||
84
Wino.Mail/Dialogs/AccountReorderDialog.xaml
Normal file
84
Wino.Mail/Dialogs/AccountReorderDialog.xaml
Normal file
@@ -0,0 +1,84 @@
|
||||
<ContentDialog
|
||||
x:Class="Wino.Dialogs.AccountReorderDialog"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="using:Wino.Dialogs"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:interfaces="using:Wino.Core.Domain.Interfaces"
|
||||
xmlns:controls="using:Wino.Controls"
|
||||
xmlns:helpers="using:Wino.Helpers"
|
||||
xmlns:domain="using:Wino.Core.Domain"
|
||||
xmlns:selectors="using:Wino.Selectors"
|
||||
mc:Ignorable="d"
|
||||
Title="Reorder Accounnts"
|
||||
Closed="DialogClosed"
|
||||
Opened="DialogOpened"
|
||||
DefaultButton="Secondary"
|
||||
Style="{StaticResource WinoDialogStyle}"
|
||||
SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}">
|
||||
|
||||
<ContentDialog.Resources>
|
||||
<DataTemplate x:Key="RootAccountReorderTemplate" x:DataType="interfaces:IAccountProviderDetailViewModel">
|
||||
<Grid Padding="12" ColumnSpacing="24">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<controls:WinoFontIcon
|
||||
Icon="{x:Bind helpers:XamlHelpers.GetProviderIcon(ProviderDetail.Type)}"
|
||||
FontSize="24"
|
||||
Grid.RowSpan="2"
|
||||
VerticalAlignment="Center" />
|
||||
<TextBlock
|
||||
Text="{x:Bind StartupEntityTitle}"
|
||||
Grid.Column="1"
|
||||
FontWeight="SemiBold" />
|
||||
<TextBlock
|
||||
Text="{x:Bind StartupEntityAddresses}"
|
||||
Grid.Column="1"
|
||||
Grid.Row="1" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
<DataTemplate x:Key="MergedAccountReorderTemplate" x:DataType="interfaces:IAccountProviderDetailViewModel">
|
||||
<Grid Padding="12" ColumnSpacing="24">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<PathIcon
|
||||
Grid.RowSpan="2"
|
||||
VerticalAlignment="Center"
|
||||
Data="F1 M 8.613281 17.5 C 8.75 17.942709 8.945312 18.359375 9.199219 18.75 L 4.921875 18.75 C 4.433594 18.75 3.966471 18.650717 3.520508 18.452148 C 3.074544 18.25358 2.683919 17.986654 2.348633 17.651367 C 2.013346 17.31608 1.746419 16.925455 1.547852 16.479492 C 1.349284 16.033529 1.25 15.566406 1.25 15.078125 L 1.25 4.921875 C 1.25 4.433594 1.349284 3.966473 1.547852 3.520508 C 1.746419 3.074545 2.013346 2.68392 2.348633 2.348633 C 2.683919 2.013348 3.074544 1.74642 3.520508 1.547852 C 3.966471 1.349285 4.433594 1.25 4.921875 1.25 L 15.078125 1.25 C 15.566406 1.25 16.033527 1.349285 16.479492 1.547852 C 16.925455 1.74642 17.31608 2.013348 17.651367 2.348633 C 17.986652 2.68392 18.25358 3.074545 18.452148 3.520508 C 18.650715 3.966473 18.75 4.433594 18.75 4.921875 L 18.75 6.572266 C 18.580729 6.344402 18.390299 6.132813 18.178711 5.9375 C 17.967121 5.742188 17.740885 5.566407 17.5 5.410156 L 17.5 4.951172 C 17.5 4.625651 17.433268 4.314779 17.299805 4.018555 C 17.16634 3.722332 16.987305 3.461914 16.762695 3.237305 C 16.538086 3.012695 16.277668 2.83366 15.981445 2.700195 C 15.685221 2.566732 15.374349 2.5 15.048828 2.5 L 4.951172 2.5 C 4.619141 2.5 4.303385 2.568359 4.003906 2.705078 C 3.704427 2.841797 3.44401 3.02409 3.222656 3.251953 C 3.001302 3.479818 2.825521 3.745117 2.695312 4.047852 C 2.565104 4.350587 2.5 4.66797 2.5 5 L 13.310547 5 C 12.60091 5.266928 11.998697 5.683594 11.503906 6.25 L 2.5 6.25 L 2.5 15.048828 C 2.5 15.38737 2.568359 15.704753 2.705078 16.000977 C 2.841797 16.297201 3.024088 16.55599 3.251953 16.777344 C 3.479818 16.998697 3.745117 17.174479 4.047852 17.304688 C 4.350586 17.434896 4.667969 17.5 5 17.5 Z M 18.125 9.443359 C 18.125 9.866537 18.040363 10.263672 17.871094 10.634766 C 17.701822 11.005859 17.473957 11.329753 17.1875 11.606445 C 16.901041 11.883139 16.56901 12.101237 16.191406 12.260742 C 15.813802 12.420248 15.416666 12.5 15 12.5 C 14.563802 12.5 14.1569 12.41862 13.779297 12.255859 C 13.401691 12.0931 13.071288 11.870117 12.788086 11.586914 C 12.504882 11.303711 12.2819 10.973308 12.119141 10.595703 C 11.95638 10.2181 11.875 9.811198 11.875 9.375 C 11.875 8.938803 11.95638 8.531901 12.119141 8.154297 C 12.2819 7.776693 12.504882 7.446289 12.788086 7.163086 C 13.071288 6.879883 13.401691 6.656901 13.779297 6.494141 C 14.1569 6.331381 14.563802 6.25 15 6.25 C 15.449218 6.25 15.864257 6.333008 16.245117 6.499023 C 16.625977 6.665039 16.956379 6.892904 17.236328 7.182617 C 17.516275 7.472331 17.734375 7.810873 17.890625 8.198242 C 18.046875 8.585612 18.125 9.000651 18.125 9.443359 Z M 20 16.25 C 20 16.666666 19.926758 17.049154 19.780273 17.397461 C 19.633789 17.745768 19.435221 18.058268 19.18457 18.334961 C 18.933918 18.611654 18.642578 18.854166 18.310547 19.0625 C 17.978516 19.270834 17.626953 19.444986 17.255859 19.584961 C 16.884766 19.724936 16.505533 19.829102 16.118164 19.897461 C 15.730794 19.96582 15.358072 20 15 20 C 14.654947 20 14.291992 19.96582 13.911133 19.897461 C 13.530273 19.829102 13.154297 19.726562 12.783203 19.589844 C 12.412109 19.453125 12.058919 19.282227 11.723633 19.077148 C 11.388346 18.87207 11.092122 18.632812 10.834961 18.359375 C 10.577799 18.085938 10.374349 17.779947 10.224609 17.441406 C 10.074869 17.102865 10 16.731771 10 16.328125 L 10 15.78125 C 10 15.501303 10.052083 15.237631 10.15625 14.990234 C 10.260416 14.742839 10.405273 14.526367 10.59082 14.34082 C 10.776367 14.155273 10.991211 14.010417 11.235352 13.90625 C 11.479492 13.802084 11.744791 13.75 12.03125 13.75 L 17.96875 13.75 C 18.248697 13.75 18.512369 13.803711 18.759766 13.911133 C 19.00716 14.018555 19.222004 14.163412 19.404297 14.345703 C 19.586588 14.527995 19.731445 14.742839 19.838867 14.990234 C 19.946289 15.237631 20 15.501303 20 15.78125 Z " />
|
||||
<TextBlock
|
||||
Text="{x:Bind StartupEntityTitle}"
|
||||
Grid.Column="1"
|
||||
FontWeight="SemiBold" />
|
||||
<TextBlock
|
||||
Text="{x:Bind StartupEntityAddresses}"
|
||||
Grid.Column="1"
|
||||
Grid.Row="1" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
<selectors:AccountReorderTemplateSelector
|
||||
x:Key="AccountReorderTemplateSelector"
|
||||
MergedAccountReorderTemplate="{StaticResource MergedAccountReorderTemplate}"
|
||||
RootAccountReorderTemplate="{StaticResource RootAccountReorderTemplate}" />
|
||||
</ContentDialog.Resources>
|
||||
|
||||
<ListView
|
||||
CanReorderItems="True"
|
||||
SelectionMode="None"
|
||||
AllowDrop="True"
|
||||
ItemsSource="{x:Bind Accounts}"
|
||||
ItemTemplateSelector="{StaticResource AccountReorderTemplateSelector}" />
|
||||
</ContentDialog>
|
||||
52
Wino.Mail/Dialogs/AccountReorderDialog.xaml.cs
Normal file
52
Wino.Mail/Dialogs/AccountReorderDialog.xaml.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
|
||||
namespace Wino.Dialogs
|
||||
{
|
||||
public sealed partial class AccountReorderDialog : ContentDialog
|
||||
{
|
||||
public ObservableCollection<IAccountProviderDetailViewModel> Accounts { get; }
|
||||
|
||||
private int count;
|
||||
private bool isOrdering = false;
|
||||
|
||||
private readonly IAccountService _accountService = App.Current.Services.GetService<IAccountService>();
|
||||
|
||||
public AccountReorderDialog(ObservableCollection<IAccountProviderDetailViewModel> accounts)
|
||||
{
|
||||
Accounts = accounts;
|
||||
|
||||
count = accounts.Count;
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args)
|
||||
{
|
||||
Accounts.CollectionChanged -= AccountsChanged;
|
||||
Accounts.CollectionChanged += AccountsChanged;
|
||||
}
|
||||
|
||||
private void DialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) => Accounts.CollectionChanged -= AccountsChanged;
|
||||
|
||||
private async void AccountsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
if (count - 1 == Accounts.Count)
|
||||
isOrdering = true;
|
||||
|
||||
if (count == Accounts.Count && isOrdering)
|
||||
{
|
||||
// Order is completed. Apply changes.
|
||||
|
||||
var dict = Accounts.ToDictionary(a => a.StartupEntityId, a => Accounts.IndexOf(a));
|
||||
|
||||
await _accountService.UpdateAccountOrdersAsync(dict);
|
||||
|
||||
isOrdering = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ namespace Wino.Dialogs
|
||||
private static void OnSelectedProviderChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
|
||||
{
|
||||
if (obj is NewAccountDialog dialog)
|
||||
dialog.ValidateCreateButton();
|
||||
dialog.Validate();
|
||||
}
|
||||
|
||||
private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
||||
@@ -45,7 +45,7 @@ namespace Wino.Dialogs
|
||||
|
||||
private void CreateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
||||
{
|
||||
ValidateCreateButton();
|
||||
Validate();
|
||||
|
||||
if (IsSecondaryButtonEnabled)
|
||||
{
|
||||
@@ -54,8 +54,14 @@ namespace Wino.Dialogs
|
||||
}
|
||||
}
|
||||
|
||||
private void AccountNameChanged(object sender, TextChangedEventArgs e) => ValidateCreateButton();
|
||||
private void SenderNameChanged(object sender, TextChangedEventArgs e) => ValidateCreateButton();
|
||||
private void AccountNameChanged(object sender, TextChangedEventArgs e) => Validate();
|
||||
private void SenderNameChanged(object sender, TextChangedEventArgs e) => Validate();
|
||||
|
||||
private void Validate()
|
||||
{
|
||||
ValidateCreateButton();
|
||||
ValidateNames();
|
||||
}
|
||||
|
||||
// Returns whether we can create account or not.
|
||||
private void ValidateCreateButton()
|
||||
@@ -63,14 +69,17 @@ namespace Wino.Dialogs
|
||||
bool shouldEnable = SelectedMailProvider != null
|
||||
&& SelectedMailProvider.IsSupported
|
||||
&& !string.IsNullOrEmpty(AccountNameTextbox.Text)
|
||||
&& !string.IsNullOrWhiteSpace(SenderNameTextbox.Text);
|
||||
&& (SelectedMailProvider.RequireSenderNameOnCreationDialog ? !string.IsNullOrEmpty(SenderNameTextbox.Text) : true);
|
||||
|
||||
IsPrimaryButtonEnabled = shouldEnable;
|
||||
}
|
||||
|
||||
private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args)
|
||||
private void ValidateNames()
|
||||
{
|
||||
ValidateCreateButton();
|
||||
AccountNameTextbox.IsEnabled = SelectedMailProvider != null;
|
||||
SenderNameTextbox.IsEnabled = SelectedMailProvider != null && SelectedMailProvider.Type != Core.Domain.Enums.MailProviderType.IMAP4;
|
||||
}
|
||||
|
||||
private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) => Validate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<Identity
|
||||
Name="58272BurakKSE.WinoMailPreview"
|
||||
Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
|
||||
Version="1.7.1.0" />
|
||||
Version="1.7.2.0" />
|
||||
|
||||
<mp:PhoneIdentity PhoneProductId="0f6f3c1b-6ffd-4212-9c91-a16e8d1fa437" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||
|
||||
|
||||
22
Wino.Mail/Selectors/AccountReorderTemplateSelector.cs
Normal file
22
Wino.Mail/Selectors/AccountReorderTemplateSelector.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
using Wino.Mail.ViewModels.Data;
|
||||
|
||||
namespace Wino.Selectors
|
||||
{
|
||||
public class AccountReorderTemplateSelector : DataTemplateSelector
|
||||
{
|
||||
public DataTemplate MergedAccountReorderTemplate { get; set; }
|
||||
public DataTemplate RootAccountReorderTemplate { get; set; }
|
||||
|
||||
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
|
||||
{
|
||||
if (item is MergedAccountProviderDetailViewModel)
|
||||
{
|
||||
return MergedAccountReorderTemplate;
|
||||
}
|
||||
|
||||
return RootAccountReorderTemplate;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
@@ -353,5 +354,15 @@ namespace Wino.Services
|
||||
|
||||
return result == ContentDialogResult.Primary ? signatureEditorDialog.Result : null;
|
||||
}
|
||||
|
||||
public async Task ShowAccountReorderDialogAsync(ObservableCollection<IAccountProviderDetailViewModel> availableAccounts)
|
||||
{
|
||||
var accountReorderDialog = new AccountReorderDialog(availableAccounts)
|
||||
{
|
||||
RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme()
|
||||
};
|
||||
|
||||
await HandleDialogPresentationAsync(accountReorderDialog);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,6 +222,17 @@
|
||||
<PathIcon Data="F1 M 8.613281 17.5 C 8.75 17.942709 8.945312 18.359375 9.199219 18.75 L 4.921875 18.75 C 4.433594 18.75 3.966471 18.650717 3.520508 18.452148 C 3.074544 18.25358 2.683919 17.986654 2.348633 17.651367 C 2.013346 17.31608 1.746419 16.925455 1.547852 16.479492 C 1.349284 16.033529 1.25 15.566406 1.25 15.078125 L 1.25 4.921875 C 1.25 4.433594 1.349284 3.966473 1.547852 3.520508 C 1.746419 3.074545 2.013346 2.68392 2.348633 2.348633 C 2.683919 2.013348 3.074544 1.74642 3.520508 1.547852 C 3.966471 1.349285 4.433594 1.25 4.921875 1.25 L 15.078125 1.25 C 15.566406 1.25 16.033527 1.349285 16.479492 1.547852 C 16.925455 1.74642 17.31608 2.013348 17.651367 2.348633 C 17.986652 2.68392 18.25358 3.074545 18.452148 3.520508 C 18.650715 3.966473 18.75 4.433594 18.75 4.921875 L 18.75 6.572266 C 18.580729 6.344402 18.390299 6.132813 18.178711 5.9375 C 17.967121 5.742188 17.740885 5.566407 17.5 5.410156 L 17.5 4.951172 C 17.5 4.625651 17.433268 4.314779 17.299805 4.018555 C 17.16634 3.722332 16.987305 3.461914 16.762695 3.237305 C 16.538086 3.012695 16.277668 2.83366 15.981445 2.700195 C 15.685221 2.566732 15.374349 2.5 15.048828 2.5 L 4.951172 2.5 C 4.619141 2.5 4.303385 2.568359 4.003906 2.705078 C 3.704427 2.841797 3.44401 3.02409 3.222656 3.251953 C 3.001302 3.479818 2.825521 3.745117 2.695312 4.047852 C 2.565104 4.350587 2.5 4.66797 2.5 5 L 13.310547 5 C 12.60091 5.266928 11.998697 5.683594 11.503906 6.25 L 2.5 6.25 L 2.5 15.048828 C 2.5 15.38737 2.568359 15.704753 2.705078 16.000977 C 2.841797 16.297201 3.024088 16.55599 3.251953 16.777344 C 3.479818 16.998697 3.745117 17.174479 4.047852 17.304688 C 4.350586 17.434896 4.667969 17.5 5 17.5 Z M 18.125 9.443359 C 18.125 9.866537 18.040363 10.263672 17.871094 10.634766 C 17.701822 11.005859 17.473957 11.329753 17.1875 11.606445 C 16.901041 11.883139 16.56901 12.101237 16.191406 12.260742 C 15.813802 12.420248 15.416666 12.5 15 12.5 C 14.563802 12.5 14.1569 12.41862 13.779297 12.255859 C 13.401691 12.0931 13.071288 11.870117 12.788086 11.586914 C 12.504882 11.303711 12.2819 10.973308 12.119141 10.595703 C 11.95638 10.2181 11.875 9.811198 11.875 9.375 C 11.875 8.938803 11.95638 8.531901 12.119141 8.154297 C 12.2819 7.776693 12.504882 7.446289 12.788086 7.163086 C 13.071288 6.879883 13.401691 6.656901 13.779297 6.494141 C 14.1569 6.331381 14.563802 6.25 15 6.25 C 15.449218 6.25 15.864257 6.333008 16.245117 6.499023 C 16.625977 6.665039 16.956379 6.892904 17.236328 7.182617 C 17.516275 7.472331 17.734375 7.810873 17.890625 8.198242 C 18.046875 8.585612 18.125 9.000651 18.125 9.443359 Z M 20 16.25 C 20 16.666666 19.926758 17.049154 19.780273 17.397461 C 19.633789 17.745768 19.435221 18.058268 19.18457 18.334961 C 18.933918 18.611654 18.642578 18.854166 18.310547 19.0625 C 17.978516 19.270834 17.626953 19.444986 17.255859 19.584961 C 16.884766 19.724936 16.505533 19.829102 16.118164 19.897461 C 15.730794 19.96582 15.358072 20 15 20 C 14.654947 20 14.291992 19.96582 13.911133 19.897461 C 13.530273 19.829102 13.154297 19.726562 12.783203 19.589844 C 12.412109 19.453125 12.058919 19.282227 11.723633 19.077148 C 11.388346 18.87207 11.092122 18.632812 10.834961 18.359375 C 10.577799 18.085938 10.374349 17.779947 10.224609 17.441406 C 10.074869 17.102865 10 16.731771 10 16.328125 L 10 15.78125 C 10 15.501303 10.052083 15.237631 10.15625 14.990234 C 10.260416 14.742839 10.405273 14.526367 10.59082 14.34082 C 10.776367 14.155273 10.991211 14.010417 11.235352 13.90625 C 11.479492 13.802084 11.744791 13.75 12.03125 13.75 L 17.96875 13.75 C 18.248697 13.75 18.512369 13.803711 18.759766 13.911133 C 19.00716 14.018555 19.222004 14.163412 19.404297 14.345703 C 19.586588 14.527995 19.731445 14.742839 19.838867 14.990234 C 19.946289 15.237631 20 15.501303 20 15.78125 Z " />
|
||||
</winuiControls:SettingsCard.HeaderIcon>
|
||||
</winuiControls:SettingsCard>
|
||||
|
||||
<winuiControls:SettingsCard
|
||||
Command="{x:Bind ViewModel.ReorderAccountsCommand}"
|
||||
IsClickEnabled="True"
|
||||
Header="{x:Bind domain:Translator.SettingsReorderAccounts_Title}"
|
||||
IsActionIconVisible="False"
|
||||
Description="{x:Bind domain:Translator.SettingsReorderAccounts_Description}">
|
||||
<winuiControls:SettingsCard.HeaderIcon>
|
||||
<PathIcon Data="F1 M 2.5 6.25 C 2.324219 6.25 2.159831 6.217448 2.006836 6.152344 C 1.853841 6.08724 1.722005 5.99935 1.611328 5.888672 C 1.500651 5.777995 1.41276 5.646159 1.347656 5.493164 C 1.282552 5.34017 1.25 5.175782 1.25 5 L 1.25 2.5 C 1.25 2.324219 1.282552 2.161459 1.347656 2.011719 C 1.41276 1.86198 1.502279 1.730145 1.616211 1.616211 C 1.730143 1.502279 1.861979 1.412762 2.011719 1.347656 C 2.161458 1.282553 2.324219 1.25 2.5 1.25 L 5 1.25 C 5.169271 1.25 5.330403 1.282553 5.483398 1.347656 C 5.636393 1.412762 5.769856 1.502279 5.883789 1.616211 C 5.997721 1.730145 6.087239 1.863607 6.152344 2.016602 C 6.217448 2.169598 6.25 2.33073 6.25 2.5 L 6.25 5 C 6.25 5.175782 6.217448 5.338543 6.152344 5.488281 C 6.087239 5.638021 5.997721 5.769857 5.883789 5.883789 C 5.769856 5.997723 5.638021 6.08724 5.488281 6.152344 C 5.338542 6.217448 5.175781 6.25 5 6.25 Z M 2.5 2.5 L 2.5 5 L 5 5 L 5 2.5 Z M 8.125 3.75 C 7.955729 3.75 7.809245 3.688152 7.685547 3.564453 C 7.561849 3.440756 7.5 3.294271 7.5 3.125 C 7.5 2.95573 7.561849 2.809246 7.685547 2.685547 C 7.809245 2.56185 7.955729 2.5 8.125 2.5 L 18.125 2.5 C 18.29427 2.5 18.440754 2.56185 18.564453 2.685547 C 18.68815 2.809246 18.75 2.95573 18.75 3.125 C 18.75 3.294271 18.68815 3.440756 18.564453 3.564453 C 18.440754 3.688152 18.29427 3.75 18.125 3.75 Z M 2.5 12.5 C 2.324219 12.5 2.159831 12.467448 2.006836 12.402344 C 1.853841 12.33724 1.722005 12.24935 1.611328 12.138672 C 1.500651 12.027995 1.41276 11.896159 1.347656 11.743164 C 1.282552 11.59017 1.25 11.425781 1.25 11.25 L 1.25 8.75 C 1.25 8.574219 1.282552 8.411459 1.347656 8.261719 C 1.41276 8.111979 1.502279 7.980144 1.616211 7.866211 C 1.730143 7.752279 1.861979 7.662762 2.011719 7.597656 C 2.161458 7.532553 2.324219 7.5 2.5 7.5 L 5 7.5 C 5.169271 7.5 5.330403 7.532553 5.483398 7.597656 C 5.636393 7.662762 5.769856 7.752279 5.883789 7.866211 C 5.997721 7.980144 6.087239 8.113607 6.152344 8.266602 C 6.217448 8.419597 6.25 8.580729 6.25 8.75 L 6.25 11.25 C 6.25 11.425781 6.217448 11.588542 6.152344 11.738281 C 6.087239 11.888021 5.997721 12.019857 5.883789 12.133789 C 5.769856 12.247722 5.638021 12.33724 5.488281 12.402344 C 5.338542 12.467448 5.175781 12.5 5 12.5 Z M 2.5 8.75 L 2.5 11.25 L 5 11.25 L 5 8.75 Z M 8.125 10 C 7.955729 10 7.809245 9.938151 7.685547 9.814453 C 7.561849 9.690756 7.5 9.544271 7.5 9.375 C 7.5 9.205729 7.561849 9.059245 7.685547 8.935547 C 7.809245 8.81185 7.955729 8.75 8.125 8.75 L 18.125 8.75 C 18.29427 8.75 18.440754 8.81185 18.564453 8.935547 C 18.68815 9.059245 18.75 9.205729 18.75 9.375 C 18.75 9.544271 18.68815 9.690756 18.564453 9.814453 C 18.440754 9.938151 18.29427 10 18.125 10 Z M 2.5 18.75 C 2.324219 18.75 2.159831 18.717447 2.006836 18.652344 C 1.853841 18.58724 1.722005 18.49935 1.611328 18.388672 C 1.500651 18.277994 1.41276 18.146158 1.347656 17.993164 C 1.282552 17.84017 1.25 17.675781 1.25 17.5 L 1.25 15 C 1.25 14.824219 1.282552 14.661459 1.347656 14.511719 C 1.41276 14.361979 1.502279 14.230144 1.616211 14.116211 C 1.730143 14.002279 1.861979 13.912761 2.011719 13.847656 C 2.161458 13.782553 2.324219 13.75 2.5 13.75 L 5 13.75 C 5.169271 13.75 5.330403 13.782553 5.483398 13.847656 C 5.636393 13.912761 5.769856 14.002279 5.883789 14.116211 C 5.997721 14.230144 6.087239 14.363607 6.152344 14.516602 C 6.217448 14.669597 6.25 14.830729 6.25 15 L 6.25 17.5 C 6.25 17.675781 6.217448 17.838541 6.152344 17.988281 C 6.087239 18.138021 5.997721 18.269857 5.883789 18.383789 C 5.769856 18.497721 5.638021 18.58724 5.488281 18.652344 C 5.338542 18.717447 5.175781 18.75 5 18.75 Z M 2.5 15 L 2.5 17.5 L 5 17.5 L 5 15 Z M 8.125 16.25 C 7.955729 16.25 7.809245 16.188152 7.685547 16.064453 C 7.561849 15.940756 7.5 15.794271 7.5 15.625 C 7.5 15.455729 7.561849 15.309245 7.685547 15.185547 C 7.809245 15.06185 7.955729 15 8.125 15 L 18.125 15 C 18.29427 15 18.440754 15.06185 18.564453 15.185547 C 18.68815 15.309245 18.75 15.455729 18.75 15.625 C 18.75 15.794271 18.68815 15.940756 18.564453 16.064453 C 18.440754 16.188152 18.29427 16.25 18.125 16.25 Z " />
|
||||
</winuiControls:SettingsCard.HeaderIcon>
|
||||
</winuiControls:SettingsCard>
|
||||
</StackPanel>
|
||||
</ListView.Header>
|
||||
<ListView.ItemsPanel>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<Compile Include="Dialogs\AccountPickerDialog.xaml.cs">
|
||||
<DependentUpon>AccountPickerDialog.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Dialogs\AccountReorderDialog.xaml.cs">
|
||||
<DependentUpon>AccountReorderDialog.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Dialogs\BaseAccountCreationDialog.cs" />
|
||||
<Compile Include="Dialogs\CustomThemeBuilderDialog.xaml.cs">
|
||||
<DependentUpon>CustomThemeBuilderDialog.xaml</DependentUpon>
|
||||
@@ -322,6 +325,7 @@
|
||||
<Compile Include="Helpers\WinoVisualTreeHelper.cs" />
|
||||
<Compile Include="Helpers\XamlHelpers.cs" />
|
||||
<Compile Include="Selectors\AccountProviderViewModelTemplateSelector.cs" />
|
||||
<Compile Include="Selectors\AccountReorderTemplateSelector.cs" />
|
||||
<Compile Include="Selectors\AppThemePreviewTemplateSelector.cs" />
|
||||
<Compile Include="Selectors\FileAttachmentTypeSelector.cs" />
|
||||
<Compile Include="Selectors\MailItemContainerStyleSelector.cs" />
|
||||
@@ -487,6 +491,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Dialogs\AccountReorderDialog.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Dialogs\CustomThemeBuilderDialog.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
||||
Reference in New Issue
Block a user