Skip to content

Commit c5fdea7

Browse files
committed
Small tweak
1 parent 0d53a0d commit c5fdea7

File tree

1 file changed

+29
-34
lines changed

1 file changed

+29
-34
lines changed

src/Files/UserControls/Selection/RectangleSelection_ListViewBase.cs

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class RectangleSelection_ListViewBase : RectangleSelection
1717
private ListViewBase uiElement;
1818
private ScrollViewer scrollViewer;
1919
private SelectionChangedEventHandler selectionChanged;
20-
private DispatcherQueueTimer timer = DispatcherQueue.GetForCurrentThread().CreateTimer();
20+
private DispatcherQueueTimer timer;
2121
private Point originDragPoint;
2222
private Dictionary<object, System.Drawing.Rectangle> itemsPosition;
2323
private List<object> prevSelectedItems;
@@ -29,6 +29,7 @@ public RectangleSelection_ListViewBase(ListViewBase uiElement, Rectangle selecti
2929
this.selectionRectangle = selectionRectangle;
3030
this.selectionChanged = selectionChanged;
3131
itemsPosition = new Dictionary<object, System.Drawing.Rectangle>();
32+
timer = DispatcherQueue.GetForCurrentThread().CreateTimer();
3233
InitEvents(null, null);
3334
}
3435

@@ -96,35 +97,29 @@ private void RectangleSelection_PointerMoved(object sender, PointerRoutedEventAr
9697

9798
private void RectangleSelection_PointerPressed(object sender, PointerRoutedEventArgs e)
9899
{
99-
itemsPosition.Clear();
100-
101-
var verticalOffset = scrollViewer?.VerticalOffset ?? 0;
102-
foreach (var item in uiElement.Items.ToList().Except(itemsPosition.Keys))
100+
if (scrollViewer == null)
103101
{
104-
var listViewItem = (FrameworkElement)uiElement.ContainerFromItem(item); // Get ListViewItem
105-
if (listViewItem == null)
106-
{
107-
continue; // Element is not loaded (virtualized list)
108-
}
109-
110-
var gt = listViewItem.TransformToVisual(uiElement);
111-
var itemStartPoint = gt.TransformPoint(new Point(0, verticalOffset)); // Get item position relative to the top of the list (considering scrolled offset)
112-
var itemRect = new System.Drawing.Rectangle((int)itemStartPoint.X, (int)itemStartPoint.Y, (int)listViewItem.ActualWidth, (int)listViewItem.ActualHeight);
113-
itemsPosition[item] = itemRect;
102+
return;
114103
}
104+
105+
itemsPosition.Clear();
106+
115107
scrollViewer.ViewChanged -= ScrollViewer_ViewChanged;
116108
scrollViewer.ViewChanged += ScrollViewer_ViewChanged;
117109

118110
originDragPoint = new Point(e.GetCurrentPoint(uiElement).Position.X, e.GetCurrentPoint(uiElement).Position.Y); // Initial drag point relative to the topleft corner
119111
prevSelectedItems = uiElement.SelectedItems.Cast<object>().ToList(); // Save current selected items
120112

113+
var verticalOffset = scrollViewer.VerticalOffset;
121114
originDragPoint.Y += verticalOffset; // Initial drag point relative to the top of the list (considering scrolled offset)
122115
if (!e.GetCurrentPoint(uiElement).Properties.IsLeftButtonPressed || e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch)
123116
{
124117
// Trigger only on left click, do not trigger with touch
125118
return;
126119
}
127120

121+
FetchItemsPosition();
122+
128123
selectionStrategy = e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) ?
129124
new InvertPreviousItemSelectionStrategy(uiElement.SelectedItems, prevSelectedItems) :
130125
e.KeyModifiers.HasFlag(VirtualKeyModifiers.Shift) ?
@@ -144,29 +139,29 @@ private void RectangleSelection_PointerPressed(object sender, PointerRoutedEvent
144139
selectionState = SelectionState.Starting;
145140
}
146141

147-
private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
142+
private void FetchItemsPosition()
148143
{
149-
if (!e.IsIntermediate)
144+
var verticalOffset = scrollViewer.VerticalOffset;
145+
foreach (var item in uiElement.Items.ToList().Except(itemsPosition.Keys))
150146
{
151-
timer.Stop();
152-
timer.Debounce(() =>
147+
var listViewItem = (FrameworkElement)uiElement.ContainerFromItem(item); // Get ListViewItem
148+
if (listViewItem == null)
153149
{
154-
var verticalOffset = scrollViewer?.VerticalOffset ?? 0;
155-
156-
foreach (var item in uiElement.Items.ToList().Except(itemsPosition.Keys))
157-
{
158-
var listViewItem = (FrameworkElement)uiElement.ContainerFromItem(item); // Get ListViewItem
159-
if (listViewItem == null)
160-
{
161-
continue; // Element is not loaded (virtualized list)
162-
}
150+
continue; // Element is not loaded (virtualized list)
151+
}
163152

164-
var gt = listViewItem.TransformToVisual(uiElement);
165-
var itemStartPoint = gt.TransformPoint(new Point(0, verticalOffset)); // Get item position relative to the top of the list (considering scrolled offset)
166-
var itemRect = new System.Drawing.Rectangle((int)itemStartPoint.X, (int)itemStartPoint.Y, (int)listViewItem.ActualWidth, (int)listViewItem.ActualHeight);
167-
itemsPosition[item] = itemRect;
168-
}
169-
}, TimeSpan.FromSeconds(1));
153+
var gt = listViewItem.TransformToVisual(uiElement);
154+
var itemStartPoint = gt.TransformPoint(new Point(0, verticalOffset)); // Get item position relative to the top of the list (considering scrolled offset)
155+
var itemRect = new System.Drawing.Rectangle((int)itemStartPoint.X, (int)itemStartPoint.Y, (int)listViewItem.ActualWidth, (int)listViewItem.ActualHeight);
156+
itemsPosition[item] = itemRect;
157+
}
158+
}
159+
160+
private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
161+
{
162+
if (!timer.IsRunning)
163+
{
164+
timer.Debounce(FetchItemsPosition, TimeSpan.FromMilliseconds(1000));
170165
}
171166
}
172167

0 commit comments

Comments
 (0)