Bunch of improvements i dunno.

This commit is contained in:
Burak Kaan Köse
2025-10-31 00:51:27 +01:00
parent 2d81d07c0a
commit 4bf8f8b3d3
28 changed files with 1133 additions and 430 deletions
@@ -13,9 +13,6 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
private const string PART_ScrollViewer = "ScrollViewer";
private ScrollViewer? internalScrollviewer;
private double lastestRaisedOffset = 0;
private int lastItemSize = 0;
[GeneratedDependencyProperty]
public partial bool IsThreadListView { get; set; }
@@ -47,24 +44,55 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
double progress = internalScrollviewer.VerticalOffset / internalScrollviewer.ScrollableHeight;
// Trigger when scrolled past 90% of total height
if (progress >= 0.9) LoadMoreCommand?.Execute(null);
if (progress >= 0.9)
{
bool canLoadMore = LoadMoreCommand?.CanExecute(null) ?? false;
if (canLoadMore)
{
LoadMoreCommand?.Execute(null);
}
}
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
// Ensure the container's selection state matches the model's state
// This is crucial for virtualization scenarios where containers are recycled
if (item is MailItemViewModel mailItemViewModel
&& element is WinoMailItemViewModelListViewItem container
&& container.Item != mailItemViewModel)
{
container.Item = mailItemViewModel;
container.IsSelected = mailItemViewModel.IsSelected;
}
else if (item is ThreadMailItemViewModel threadMailItemViewModel
&& element is WinoThreadMailItemViewModelListViewItem threadContainer
&& threadContainer.Item != threadMailItemViewModel)
{
threadContainer.Item = threadMailItemViewModel;
threadContainer.IsSelected = threadMailItemViewModel.IsSelected;
threadContainer.IsThreadExpanded = threadMailItemViewModel.IsThreadExpanded;
}
}
protected override void ClearContainerForItemOverride(DependencyObject element, object item)
{
base.ClearContainerForItemOverride(element, item);
if (item is MailItemViewModel mailItemViewModel && element is WinoMailItemViewModelListViewItem container)
{
// Ensure the container's selection state matches the model's state
// This is crucial for virtualization scenarios where containers are recycled
container.IsSelected = mailItemViewModel.IsSelected;
container.Item = null;
container.IsSelected = false;
}
else if (item is ThreadMailItemViewModel threadMailItemViewModel && element is WinoThreadMailItemViewModelListViewItem threadContainer)
{
threadContainer.IsSelected = threadMailItemViewModel.IsSelected;
threadContainer.IsThreadExpanded = threadMailItemViewModel.IsThreadExpanded;
threadContainer.Item = null;
threadContainer.IsSelected = false;
threadContainer.IsThreadExpanded = false;
}
}
@@ -93,24 +121,6 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
public WinoThreadMailItemViewModelListViewItem? GetThreadMailItemContainer(ThreadMailItemViewModel threadMailItemViewModel)
=> ContainerFromItem(threadMailItemViewModel) as WinoThreadMailItemViewModelListViewItem;
public void ToggleItemContainer(IMailListItem mailListItem)
{
DispatcherQueue.TryEnqueue(() =>
{
if (mailListItem is MailItemViewModel mailItemViewModel)
{
var container = GetMailItemContainer(mailItemViewModel);
container?.IsSelected = mailItemViewModel.IsSelected;
}
else if (mailListItem is ThreadMailItemViewModel threadMailItemViewModel)
{
var container = GetThreadMailItemContainer(threadMailItemViewModel);
container?.IsSelected = threadMailItemViewModel.IsSelected;
container?.IsThreadExpanded = threadMailItemViewModel.IsThreadExpanded;
}
});
}
public bool SelectMailItemContainer(MailItemViewModel mailItemViewModel)
{
WinoMailItemViewModelListViewItem? itemContainer = null;
@@ -178,6 +188,7 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
}
}
}
public void Cleanup()
{
DragItemsStarting -= ItemDragStarting;
@@ -13,11 +13,4 @@ public partial class WinoMailItemViewModelListViewItem : ListViewItem
{
DefaultStyleKey = typeof(WinoMailItemViewModelListViewItem);
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (newContent is MailItemViewModel mailItemViewModel) Item = mailItemViewModel;
}
}
@@ -1,6 +1,5 @@
using System.Linq;
using CommunityToolkit.WinUI;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Wino.Controls;
using Wino.Helpers;
@@ -16,59 +15,12 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem
[GeneratedDependencyProperty]
public partial ThreadMailItemViewModel? Item { get; set; }
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (newContent is ThreadMailItemViewModel threadMailItemViewModel) Item = threadMailItemViewModel;
}
public WinoThreadMailItemViewModelListViewItem()
{
DefaultStyleKey = typeof(WinoThreadMailItemViewModelListViewItem);
}
partial void OnIsThreadExpandedChanged(bool newValue)
{
// 1. Reflect expansion changes to WinoExpander.
// 2. Automatically select first item on expansion, if none selected.
// 3. Unselect all items on collapse.
}
private static void OnIsThreadExpandedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs dp)
{
// 1. Reflect expansion changes to WinoExpander.
// 2. Automatically select first item on expansion, if none selected.
// 3. Unselect all items on collapse.
//var control = sender as WinoThreadMailItemViewModelListViewItem;
//var innerControl = control?.GetWinoListViewControl();
//var expander = control?.GetExpander();
//if (innerControl == null || control == null || expander == null) return;
//// 2
//if (control.IsThreadExpanded && innerControl.SelectedItems.Count == 0 && innerControl.Items.Count > 0)
//{
// innerControl.SelectedItems.Clear();
// // Make item selected, container might not be realized yet, so set on the model.
// // It'll appear selected when container is realized.
// var firstItem = innerControl.Items.FirstOrDefault() as MailItemViewModel;
// firstItem?.IsSelected = true;
//}
//// 1
//expander.IsExpanded = control.IsThreadExpanded;
//// 3
//if (!control.IsSelected) innerControl?.SelectedItems.Clear();
}
public WinoListView? GetWinoListViewControl()
{
var expander = GetExpander();
+1 -1
View File
@@ -20,7 +20,7 @@
<Identity
Name="58272BurakKSE.WinoMailPreview"
Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
Version="0.0.4.0" />
Version="0.0.7.0" />
<mp:PhoneIdentity PhoneProductId="3879fcfb-a561-4599-9103-e0c9b35a271f" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
+10 -7
View File
@@ -154,17 +154,20 @@ public sealed partial class MailListPage : MailListPageAbstract,
private void WinoListViewChoosingItemContainer(ListViewBase sender, ChoosingItemContainerEventArgs args)
{
if (args.Item is ThreadMailItemViewModel)
if (args.Item is ThreadMailItemViewModel && args.ItemContainer is not WinoThreadMailItemViewModelListViewItem)
{
args.ItemContainer = new WinoThreadMailItemViewModelListViewItem();
args.ItemContainer = new WinoThreadMailItemViewModelListViewItem()
{
Item = args.Item as ThreadMailItemViewModel
};
}
else if (args.Item is MailItemViewModel)
else if (args.Item is MailItemViewModel && args.ItemContainer is not WinoMailItemViewModelListViewItem)
{
args.ItemContainer = new WinoMailItemViewModelListViewItem();
args.ItemContainer = new WinoMailItemViewModelListViewItem()
{
Item = args.Item as MailItemViewModel
};
}
// Handle the preparation in PrepareContainerForItemOverride
args.IsContainerPrepared = false;
}
private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args)