Fix merge conflicts

This commit is contained in:
Aleh Khantsevich
2024-06-13 01:42:19 +02:00
31 changed files with 484 additions and 33 deletions

View File

@@ -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();

View File

@@ -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>

View File

@@ -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; }
}
}

View File

@@ -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);
}
}

View File

@@ -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>

View File

@@ -8,6 +8,7 @@ namespace Wino.Core.Domain.Interfaces
public interface IFolderMenuItem : IBaseFolderMenuItem
{
MailAccount ParentAccount { get; }
void UpdateParentAccounnt(MailAccount account);
}
public interface IMergedAccountFolderMenuItem : IBaseFolderMenuItem { }

View File

@@ -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)
{

View File

@@ -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.",

View File

@@ -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>

View File

@@ -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()

View File

@@ -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;
}
}

View 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);
}

View File

@@ -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);

View File

@@ -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));
}
}
}

View File

@@ -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));
}

View File

@@ -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()));

View File

@@ -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.

View File

@@ -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.

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View 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>

View 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;
}
}
}
}

View File

@@ -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();
}
}

View File

@@ -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"/>

View 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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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>

View File

@@ -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>