Make TopBar dynamic
This commit is contained in:
@@ -64,6 +64,8 @@ namespace Wino.Mail.ViewModels
|
|||||||
public ObservableCollection<MailItemViewModel> SelectedItems { get; set; } = [];
|
public ObservableCollection<MailItemViewModel> SelectedItems { get; set; } = [];
|
||||||
public ObservableCollection<FolderPivotViewModel> PivotFolders { get; set; } = [];
|
public ObservableCollection<FolderPivotViewModel> PivotFolders { get; set; } = [];
|
||||||
|
|
||||||
|
public ObservableCollection<MailOperationMenuItem> ActionItems { get; set; } = new ObservableCollection<MailOperationMenuItem>();
|
||||||
|
|
||||||
private readonly SemaphoreSlim listManipulationSemepahore = new SemaphoreSlim(1);
|
private readonly SemaphoreSlim listManipulationSemepahore = new SemaphoreSlim(1);
|
||||||
private CancellationTokenSource listManipulationCancellationTokenSource = new CancellationTokenSource();
|
private CancellationTokenSource listManipulationCancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
@@ -200,6 +202,13 @@ namespace Wino.Mail.ViewModels
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupTopBarActions()
|
||||||
|
{
|
||||||
|
ActionItems.Clear();
|
||||||
|
var actions = GetAvailableMailActions(SelectedItems);
|
||||||
|
actions.ForEach(a => ActionItems.Add(a));
|
||||||
|
}
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -365,6 +374,8 @@ namespace Wino.Mail.ViewModels
|
|||||||
|
|
||||||
NotifyItemSelected();
|
NotifyItemSelected();
|
||||||
|
|
||||||
|
SetupTopBarActions();
|
||||||
|
|
||||||
Messenger.Send(new SelectedMailItemsChanged(SelectedItems.Count));
|
Messenger.Send(new SelectedMailItemsChanged(SelectedItems.Count));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,19 +426,31 @@ namespace Wino.Mail.ViewModels
|
|||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
public Task ExecuteHoverAction(MailOperationPreperationRequest request) => ExecuteMailOperationAsync(request);
|
public Task ExecuteHoverAction(MailOperationPreperationRequest request) => ExecuteMailOperationAsync(request);
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private async Task OperationClicked(MailOperationMenuItem menuItem)
|
||||||
|
{
|
||||||
|
if (menuItem == null || !SelectedItems.Any()) return;
|
||||||
|
|
||||||
|
await HandleMailOperation(menuItem.Operation, SelectedItems);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Executes the requested mail operation for currently selected items.
|
/// Executes the requested mail operation for currently selected items.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="operation">Action to execute for selected items.</param>
|
/// <param name="operation">Action to execute for selected items.</param>
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private async Task MailOperationAsync(int mailOperationIndex)
|
private async Task MailOperationAsync(MailOperation mailOperation)
|
||||||
{
|
{
|
||||||
if (!SelectedItems.Any()) return;
|
if (!SelectedItems.Any()) return;
|
||||||
|
|
||||||
// Commands don't like enums. So it has to be int.
|
await HandleMailOperation(mailOperation, SelectedItems);
|
||||||
var operation = (MailOperation)mailOperationIndex;
|
}
|
||||||
|
|
||||||
var package = new MailOperationPreperationRequest(operation, SelectedItems.Select(a => a.MailCopy));
|
private async Task HandleMailOperation(MailOperation mailOperation, IEnumerable<MailItemViewModel> mailItems)
|
||||||
|
{
|
||||||
|
if (!mailItems.Any()) return;
|
||||||
|
|
||||||
|
var package = new MailOperationPreperationRequest(mailOperation, mailItems.Select(a => a.MailCopy));
|
||||||
|
|
||||||
await ExecuteMailOperationAsync(package);
|
await ExecuteMailOperationAsync(package);
|
||||||
}
|
}
|
||||||
@@ -649,6 +672,8 @@ namespace Wino.Mail.ViewModels
|
|||||||
Debug.WriteLine($"Updating {updatedMail.Id}-> {updatedMail.UniqueId}");
|
Debug.WriteLine($"Updating {updatedMail.Id}-> {updatedMail.UniqueId}");
|
||||||
|
|
||||||
await MailCollection.UpdateMailCopy(updatedMail);
|
await MailCollection.UpdateMailCopy(updatedMail);
|
||||||
|
|
||||||
|
await ExecuteUIThread(() => { SetupTopBarActions(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async void OnMailRemoved(MailCopy removedMail)
|
protected override async void OnMailRemoved(MailCopy removedMail)
|
||||||
|
|||||||
@@ -12,7 +12,9 @@
|
|||||||
xmlns:helpers="using:Wino.Helpers"
|
xmlns:helpers="using:Wino.Helpers"
|
||||||
xmlns:i="using:Microsoft.Xaml.Interactivity"
|
xmlns:i="using:Microsoft.Xaml.Interactivity"
|
||||||
xmlns:ic="using:Microsoft.Xaml.Interactions.Core"
|
xmlns:ic="using:Microsoft.Xaml.Interactions.Core"
|
||||||
|
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
||||||
xmlns:listview="using:Wino.Controls.Advanced"
|
xmlns:listview="using:Wino.Controls.Advanced"
|
||||||
|
xmlns:local="using:Wino.Behaviors"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:menuflyouts="using:Wino.MenuFlyouts"
|
xmlns:menuflyouts="using:Wino.MenuFlyouts"
|
||||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||||
@@ -31,6 +33,28 @@
|
|||||||
IsSourceGrouped="True"
|
IsSourceGrouped="True"
|
||||||
Source="{x:Bind ViewModel.MailCollection.MailItems, Mode=OneWay}" />
|
Source="{x:Bind ViewModel.MailCollection.MailItems, Mode=OneWay}" />
|
||||||
|
|
||||||
|
<selectors:RendererCommandBarItemTemplateSelector
|
||||||
|
x:Key="RendererCommandBarItemTemplateSelector"
|
||||||
|
Archive="{StaticResource CommandBarItemArchiveTemplate}"
|
||||||
|
ClearFlag="{StaticResource CommandBarItemClearFlagTemplate}"
|
||||||
|
DarkEditor="{StaticResource CommandBarItemDarkEditorTemplate}"
|
||||||
|
Delete="{StaticResource CommandBarItemDeleteTemplate}"
|
||||||
|
Find="{StaticResource CommandBarItemFindTemplate}"
|
||||||
|
Forward="{StaticResource CommandBarItemForwardTemplate}"
|
||||||
|
LightEditor="{StaticResource CommandBarItemLightEditorTemplate}"
|
||||||
|
MarkAsRead="{StaticResource CommandBarItemMarkReadTemplate}"
|
||||||
|
MarkAsUnread="{StaticResource CommandBarItemMarkUnreadTemplate}"
|
||||||
|
Move="{StaticResource CommandBarItemMoveTemplate}"
|
||||||
|
MoveToJunk="{StaticResource CommandBarItemMoveToJunkTemplate}"
|
||||||
|
Print="{StaticResource CommandBarItemPrintTemplate}"
|
||||||
|
Reply="{StaticResource CommandBarItemReplyTemplate}"
|
||||||
|
ReplyAll="{StaticResource CommandBarItemReplyAllTemplate}"
|
||||||
|
SaveAs="{StaticResource CommandBarItemSaveTemplate}"
|
||||||
|
SeperatorTemplate="{StaticResource CommandBarItemSeperatorTemplate}"
|
||||||
|
SetFlag="{StaticResource CommandBarItemSetFlagTemplate}"
|
||||||
|
Unarchive="{StaticResource CommandBarItemUnarchiveTemplate}"
|
||||||
|
Zoom="{StaticResource CommandBarItemZoomTemplate}" />
|
||||||
|
|
||||||
<Thickness x:Key="ExpanderHeaderPadding">0,0,0,0</Thickness>
|
<Thickness x:Key="ExpanderHeaderPadding">0,0,0,0</Thickness>
|
||||||
<Thickness x:Key="ExpanderChevronMargin">0,0,12,0</Thickness>
|
<Thickness x:Key="ExpanderChevronMargin">0,0,12,0</Thickness>
|
||||||
<Thickness x:Key="ExpanderHeaderBorderThickness">0,0,0,0</Thickness>
|
<Thickness x:Key="ExpanderHeaderBorderThickness">0,0,0,0</Thickness>
|
||||||
@@ -251,7 +275,6 @@
|
|||||||
|
|
||||||
<!-- Action bar -->
|
<!-- Action bar -->
|
||||||
<Grid
|
<Grid
|
||||||
Grid.Row="0"
|
|
||||||
Margin="0,0,0,5"
|
Margin="0,0,0,5"
|
||||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||||
CornerRadius="8"
|
CornerRadius="8"
|
||||||
@@ -260,113 +283,12 @@
|
|||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
DefaultLabelPosition="Collapsed"
|
DefaultLabelPosition="Collapsed"
|
||||||
OverflowButtonVisibility="Auto">
|
OverflowButtonVisibility="Auto">
|
||||||
<AppBarButton
|
<interactivity:Interaction.Behaviors>
|
||||||
x:Name="ArchiveAppBarButton"
|
<local:BindableCommandBarBehavior
|
||||||
x:Load="{x:Bind helpers:XamlHelpers.ReverseBoolConverter(ViewModel.IsArchiveSpecialFolder), Mode=OneWay}"
|
ItemClickedCommand="{x:Bind ViewModel.OperationClickedCommand}"
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
ItemTemplateSelector="{StaticResource RendererCommandBarItemTemplateSelector}"
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
PrimaryCommands="{x:Bind ViewModel.ActionItems, Mode=OneWay}" />
|
||||||
Label="{x:Bind domain:Translator.MailOperation_Archive}"
|
</interactivity:Interaction.Behaviors>
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_Archive}">
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="Archive" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>Archive</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
x:Name="UnarchiveAppBarButton"
|
|
||||||
x:Load="{x:Bind ViewModel.IsArchiveSpecialFolder, Mode=OneWay}"
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_Unarchive}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_Unarchive}">
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="UnArchive" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>UnArchive</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_Delete}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_Delete}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>SoftDelete</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="Delete" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_Move}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_Move}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>Move</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="Move" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_SetFlag}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_SetFlag}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>SetFlag</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="Flag" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_ClearFlag}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_ClearFlag}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>ClearFlag</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="ClearFlag" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_MarkAsRead}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_MarkAsRead}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>MarkAsRead</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="MarkRead" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
|
|
||||||
<AppBarButton
|
|
||||||
Command="{x:Bind ViewModel.MailOperationCommand}"
|
|
||||||
IsEnabled="{x:Bind ViewModel.HasSelectedItems, Mode=OneWay}"
|
|
||||||
Label="{x:Bind domain:Translator.MailOperation_MarkAsUnread}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind domain:Translator.MailOperation_MarkAsUnread}">
|
|
||||||
<AppBarButton.CommandParameter>
|
|
||||||
<enums:MailOperation>MarkAsUnread</enums:MailOperation>
|
|
||||||
</AppBarButton.CommandParameter>
|
|
||||||
<AppBarButton.Icon>
|
|
||||||
<controls:WinoFontIcon FontSize="18" Icon="MarkUnread" />
|
|
||||||
</AppBarButton.Icon>
|
|
||||||
</AppBarButton>
|
|
||||||
</CommandBar>
|
</CommandBar>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
|||||||
@@ -375,7 +375,7 @@ namespace Wino.Views
|
|||||||
{
|
{
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
|
|
||||||
ViewModel?.MailOperationCommand?.Execute((int)MailOperation.SoftDelete);
|
ViewModel?.MailOperationCommand?.Execute(MailOperation.SoftDelete);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user