New list view items.

This commit is contained in:
Burak Kaan Köse
2025-10-27 22:52:26 +01:00
parent 4eea21c4f5
commit 4f85fa6ba9
12 changed files with 398 additions and 243 deletions
+17 -15
View File
@@ -69,7 +69,10 @@
</DataTemplate>
<DataTemplate x:Key="ThreadMailItemTemplate" x:DataType="viewModelData:ThreadMailItemViewModel">
<controls:WinoExpander x:Name="ExpanderPart" IsExpanded="{x:Bind IsThreadExpanded, Mode=TwoWay}">
<controls:WinoExpander
x:Name="ExpanderPart"
Margin="0,2"
IsExpanded="{x:Bind IsThreadExpanded, Mode=TwoWay}">
<controls:WinoExpander.Header>
<controls:MailItemDisplayInformationControl
x:DefaultBindMode="OneWay"
@@ -95,11 +98,20 @@
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
ChoosingItemContainer="WinoListViewChoosingItemContainer"
IsItemClickEnabled="True"
IsThreadListView="True"
ItemClick="WinoListViewItemClicked"
ItemContainerStyle="{StaticResource DefaultMailListViewItemStyle}"
ItemTemplate="{StaticResource SingleMailItemTemplate}"
ItemsSource="{x:Bind ThreadEmails, Mode=OneTime}"
ProcessKeyboardAccelerators="WinoListViewProcessKeyboardAccelerators"
SelectionMode="Extended" />
SelectionMode="Extended">
<listview:WinoListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Margin="8,0,12,0" AreStickyGroupHeadersEnabled="True" />
</ItemsPanelTemplate>
</listview:WinoListView.ItemsPanel>
</listview:WinoListView>
</controls:WinoExpander.Content>
</controls:WinoExpander>
@@ -117,7 +129,7 @@
<DataTemplate x:Key="MailGroupHeaderDefaultTemplate" x:DataType="collections:IReadOnlyObservableGroup">
<Grid
Margin="4,2"
Margin="0,0,0,6"
AllowFocusOnInteraction="False"
Background="{ThemeResource MailListHeaderBackgroundColor}"
CornerRadius="6">
@@ -386,12 +398,11 @@
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
ChoosingItemContainer="WinoListViewChoosingItemContainer"
IsItemClickEnabled="True"
ItemClick="WinoListView_ItemClick"
ItemClick="WinoListViewItemClicked"
ItemContainerStyleSelector="{StaticResource WinoMailItemContainerStyleSelector}"
ItemTemplateSelector="{StaticResource MailItemTemplateSelector}"
ItemsSource="{x:Bind MailCollectionViewSource.View, Mode=OneWay}"
ProcessKeyboardAccelerators="WinoListViewProcessKeyboardAccelerators"
SelectionChanged="WinoListViewSelectionChanged"
SelectionMode="Extended">
<listview:WinoListView.ItemContainerTransitions>
<TransitionCollection>
@@ -400,7 +411,7 @@
</listview:WinoListView.ItemContainerTransitions>
<listview:WinoListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Margin="8,0,12,0" AreStickyGroupHeadersEnabled="True" />
<ItemsStackPanel AreStickyGroupHeadersEnabled="True" GroupPadding="10,10,10,0" />
</ItemsPanelTemplate>
</listview:WinoListView.ItemsPanel>
<listview:WinoListView.Resources>
@@ -412,15 +423,6 @@
<GroupStyle HeaderTemplate="{StaticResource MailGroupHeaderDefaultTemplate}" HidesIfEmpty="True" />
</listview:WinoListView.GroupStyle>
</listview:WinoListView>
<!--<advanced:WinoItemsView
x:Name="MailListView"
Margin="4"
ItemTemplate="{StaticResource MailItemContainerSelector}"
ItemsSource="{x:Bind ViewModel.MailCollection.Items, Mode=OneTime}"
Layout="{StaticResource DefaultItemsViewLayout}"
LoadMoreCommand="{x:Bind ViewModel.LoadMoreItemsCommand}"
ProcessKeyboardAccelerators="MailListView_ProcessKeyboardAccelerators"
SelectionMode="Extended" />-->
<!-- Try online search panel. -->
<Grid Grid.Row="1" Visibility="{x:Bind ViewModel.IsOnlineSearchButtonVisible, Mode=OneWay}">
+77 -11
View File
@@ -63,6 +63,7 @@ public sealed partial class MailListPage : MailListPageAbstract,
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
@@ -162,6 +163,8 @@ public sealed partial class MailListPage : MailListPageAbstract,
args.IsContainerPrepared = false;
}
private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args)
{
// TODO: New ItemsView implementation.
@@ -496,7 +499,7 @@ public sealed partial class MailListPage : MailListPageAbstract,
private void UpdateAdaptiveness()
{
bool isMultiSelectionEnabled = ViewModel.IsMultiSelectionModeEnabled || KeyPressService.IsCtrlKeyPressed();
bool isMultiSelectionEnabled = ViewModel.IsMultiSelectionModeEnabled;
if (StatePersistenceService.IsReaderNarrowed)
{
@@ -545,22 +548,85 @@ public sealed partial class MailListPage : MailListPageAbstract,
}
}
private void WinoListViewSelectionChanged(object sender, SelectionChangedEventArgs e)
private async void WinoListViewItemClicked(object sender, ItemClickEventArgs e)
{
if (sender is not WinoListView listView) return;
}
bool isSelectedItemFromThread = listView.IsThreadListView;
bool isCtrlPressed = KeyPressService.IsCtrlKeyPressed();
private void WinoListView_ItemClick(object sender, ItemClickEventArgs e)
{
if (e.ClickedItem is ThreadMailItemViewModel clickedThread)
bool isClickingThreadItem = e.ClickedItem is ThreadMailItemViewModel;
// Unselect all items. It's single selection.
if (!isCtrlPressed)
{
// Only if container is selected.
await ViewModel.MailCollection.UnselectAllAsync();
var threadContainer = MailListView.ContainerFromItem(clickedThread) as WinoThreadMailItemViewModelListViewItem;
if (threadContainer?.IsSelected ?? false)
if (!isSelectedItemFromThread && !isClickingThreadItem)
{
clickedThread.IsThreadExpanded = !clickedThread.IsThreadExpanded;
await ViewModel.MailCollection.CollapseAllThreadsAsync();
}
}
if (e.ClickedItem is MailItemViewModel mailListItem)
{
mailListItem.IsSelected = !mailListItem.IsSelected;
}
else if (e.ClickedItem is ThreadMailItemViewModel threadMailItemViewModel)
{
// Extended selection mode handling for threads
if (isCtrlPressed)
{
// If thread is selected and Ctrl is pressed
if (threadMailItemViewModel.IsSelected)
{
// If thread was collapsed, expand it
if (!threadMailItemViewModel.IsThreadExpanded)
{
threadMailItemViewModel.IsThreadExpanded = true;
}
else
{
// Check if all items are selected.
// If so, then unselect all items in the thread and unselect the thread itself.
if (threadMailItemViewModel.ThreadEmails.All(a => a.IsSelected))
{
foreach (var threadEmail in threadMailItemViewModel.ThreadEmails)
{
threadEmail.IsSelected = false;
}
threadMailItemViewModel.IsSelected = false;
return;
}
else
{
// If thread was already expanded, select all items in the thread
foreach (var threadEmail in threadMailItemViewModel.ThreadEmails)
{
threadEmail.IsSelected = true;
}
}
}
}
else
{
// Thread is not selected, select and expand it.
if (!threadMailItemViewModel.IsThreadExpanded) threadMailItemViewModel.IsThreadExpanded = true;
if (!threadMailItemViewModel.IsSelected)
{
threadMailItemViewModel.IsSelected = true;
foreach (var threadEmail in threadMailItemViewModel.ThreadEmails)
{
threadEmail.IsSelected = true;
}
}
}
}
else
{
// No Ctrl pressed, toggle expansion state (default behavior)
threadMailItemViewModel.IsThreadExpanded = !threadMailItemViewModel.IsThreadExpanded;
}
}
}