XAML-Map-Control/MapControl/Shared/MapItemsControl.cs

118 lines
3.3 KiB
C#
Raw Normal View History

// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
2024-02-03 21:01:53 +01:00
// Copyright © 2024 Clemens Fischer
// Licensed under the Microsoft Public License (Ms-PL)
2018-11-13 21:35:48 +01:00
using System;
2024-05-22 11:25:32 +02:00
#if WPF
using System.Windows;
using System.Windows.Controls;
2021-11-17 23:17:11 +01:00
#elif UWP
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
2024-05-22 11:25:32 +02:00
#elif WINUI
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
2017-09-05 20:57:17 +02:00
#endif
namespace MapControl
{
/// <summary>
2024-07-22 18:06:27 +02:00
/// An ItemsControl with selectable items on a Map. Uses MapItem as item container.
/// </summary>
public partial class MapItemsControl : ListBox
{
2024-05-23 18:08:14 +02:00
public static readonly DependencyProperty LocationMemberPathProperty =
DependencyPropertyHelper.Register<MapItemsControl, string>(nameof(LocationMemberPath));
2021-01-13 00:08:55 +01:00
/// <summary>
/// Path to a source property for binding the Location property of MapItem containers.
2021-01-13 00:08:55 +01:00
/// </summary>
public string LocationMemberPath
{
2022-08-06 10:40:59 +02:00
get => (string)GetValue(LocationMemberPathProperty);
set => SetValue(LocationMemberPathProperty, value);
}
2020-10-21 22:18:16 +02:00
public void SelectItems(Predicate<object> predicate)
2018-11-13 21:35:48 +01:00
{
if (SelectionMode == SelectionMode.Single)
{
throw new InvalidOperationException("SelectionMode must not be Single");
}
foreach (var item in Items)
{
var selected = predicate(item);
if (selected != SelectedItems.Contains(item))
{
if (selected)
{
SelectedItems.Add(item);
}
else
{
SelectedItems.Remove(item);
}
}
}
}
2020-10-21 22:18:16 +02:00
public void SelectItemsByLocation(Predicate<Location> predicate)
2018-11-13 21:35:48 +01:00
{
SelectItems(item =>
{
2024-05-27 16:35:02 +02:00
var location = MapPanel.GetLocation(ContainerFromItem(item));
return location != null && predicate(location);
2018-11-13 21:35:48 +01:00
});
}
2020-10-21 22:18:16 +02:00
public void SelectItemsByPosition(Predicate<Point> predicate)
2018-11-13 21:35:48 +01:00
{
SelectItems(item =>
{
var pos = MapPanel.GetViewPosition(ContainerFromItem(item));
2018-11-13 21:35:48 +01:00
return pos.HasValue && predicate(pos.Value);
});
}
public void SelectItemsInRect(Rect rect)
{
SelectItemsByPosition(p => rect.Contains(p));
}
2024-05-29 16:29:13 +02:00
protected internal void OnItemClicked(MapItem mapItem, bool controlKey)
{
2018-11-14 17:53:37 +01:00
var item = ItemFromContainer(mapItem);
2018-11-13 21:35:48 +01:00
2024-05-31 00:07:20 +02:00
if (SelectionMode == SelectionMode.Single)
2018-11-13 21:35:48 +01:00
{
if (SelectedItem != item)
{
SelectedItem = item;
}
else if (controlKey)
{
SelectedItem = null;
}
}
2024-05-31 00:07:20 +02:00
else if (controlKey)
2018-11-13 21:35:48 +01:00
{
if (SelectedItems.Contains(item))
{
SelectedItems.Remove(item);
}
else
{
SelectedItems.Add(item);
}
}
2024-05-31 00:07:20 +02:00
else
2018-11-13 21:35:48 +01:00
{
2024-05-31 09:59:38 +02:00
ResetSelectedItems(item);
2018-11-13 21:35:48 +01:00
}
}
}
}