port from perforce

This commit is contained in:
2026-04-18 22:31:51 +02:00
commit 8d0ab5b7cc
8409 changed files with 3972376 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
using System.Collections.Generic;
using System.Linq;
using System.Reactive;
using Intromat.Views.Editors;
using NodeNetwork.Toolkit.ValueNode;
using NodeNetwork.ViewModels;
using ReactiveUI;
using Splat;
namespace Intromat.ViewModels.Nodes
{
/// <summary>
/// A non-generic interface that provides access to the data in GroupEndpointEditorViewModel.
/// Mapping a view onto a generic viewmodel is problematic because the generic type often isn't known in the view,
/// and generic views are often not allowed.
/// </summary>
public interface IGroupEndpointEditorViewModel
{
public Endpoint Endpoint { get; }
public ReactiveCommand<Unit, Unit> MoveUp { get; }
public ReactiveCommand<Unit, Unit> MoveDown { get; }
public ReactiveCommand<Unit, Unit> Delete { get; }
}
public class GroupEndpointEditorViewModel<T> : ValueEditorViewModel<T>, IGroupEndpointEditorViewModel
{
static GroupEndpointEditorViewModel()
{
Locator.CurrentMutable.Register(() => new GroupEndpointEditorView(), typeof(IViewFor<GroupEndpointEditorViewModel<T>>));
}
public GroupEndpointEditorViewModel(CodeNodeGroupIOBinding nodeGroupBinding)
{
MoveUp = ReactiveCommand.Create(() =>
{
var isInput = Parent is NodeInputViewModel;
IEnumerable<Endpoint> endpoints = isInput ? Parent.Parent.Inputs.Items : Parent.Parent.Outputs.Items;
// Swap SortIndex of this endpoint with the SortIndex of the previous endpoint in the list, if any.
var prevElement = endpoints
.Where(e => e.SortIndex < Parent.SortIndex)
.MaxBy(e => e.SortIndex);
if (prevElement != null)
{
var idx = prevElement.SortIndex;
prevElement.SortIndex = Parent.SortIndex;
Parent.SortIndex = idx;
}
});
MoveDown = ReactiveCommand.Create(() =>
{
var isInput = Parent is NodeInputViewModel;
IEnumerable<Endpoint> endpoints = isInput ? Parent.Parent.Inputs.Items : Parent.Parent.Outputs.Items;
var nextElement = endpoints
.Where(e => e.SortIndex > Parent.SortIndex)
.MinBy(e => e.SortIndex);
if (nextElement != null)
{
var idx = nextElement.SortIndex;
nextElement.SortIndex = Parent.SortIndex;
Parent.SortIndex = idx;
}
});
Delete = ReactiveCommand.Create(() => { nodeGroupBinding.DeleteEndpoint(Parent); });
}
public Endpoint Endpoint => Parent;
public ReactiveCommand<Unit, Unit> MoveUp { get; }
public ReactiveCommand<Unit, Unit> MoveDown { get; }
public ReactiveCommand<Unit, Unit> Delete { get; }
}
}