/// <summary> /// Move an item in the rendered layout. /// </summary> /// <param name="moveItemRequest"></param> public void MoveItem(MoveItemRequest moveItemRequest) { if (moveItemRequest == null) { throw new ArgumentNullException(nameof(moveItemRequest)); } if (ItemsOrganiser == null) { return; } var dragablzItem = moveItemRequest.Item as DragablzItem ?? ItemContainerGenerator.ContainerFromItem( moveItemRequest.Item) as DragablzItem; var contextDragablzItem = moveItemRequest.Context as DragablzItem ?? ItemContainerGenerator.ContainerFromItem( moveItemRequest.Context) as DragablzItem; if (dragablzItem == null) { return; } var sortedItems = DragablzItems( ).OrderBy(di => di.LogicalIndex).ToList( ); sortedItems.Remove(dragablzItem); switch (moveItemRequest.AddLocationHint) { case AddLocationHint.First: sortedItems.Insert(0, dragablzItem); break; case AddLocationHint.Last: sortedItems.Add(dragablzItem); break; case AddLocationHint.Prior: case AddLocationHint.After: if (contextDragablzItem == null) { return; } var contextIndex = sortedItems.IndexOf(contextDragablzItem); sortedItems.Insert(moveItemRequest.AddLocationHint == AddLocationHint.Prior ? contextIndex : contextIndex + 1, dragablzItem); break; default: throw new ArgumentOutOfRangeException(nameof(AddLocationHint)); } //TODO might not be too great for perf on larger lists var orderedEnumerable = sortedItems.OrderBy(di => sortedItems.IndexOf(di)); ItemsOrganiser.Organise(this, new Size(ItemsPresenterWidth, ItemsPresenterHeight), orderedEnumerable); }
internal void MoveItem(MoveItemRequest moveItemRequest) { if (moveItemRequest == null) throw new ArgumentNullException("moveItemRequest"); if (ItemsOrganiser == null) return; var dragablzItem = moveItemRequest.Item as DragablzItem ?? ItemContainerGenerator.ContainerFromItem( moveItemRequest.Item) as DragablzItem; var contextDragablzItem = moveItemRequest.Context as DragablzItem ?? ItemContainerGenerator.ContainerFromItem( moveItemRequest.Context) as DragablzItem; if (dragablzItem == null) return; var sortedItems = DragablzItems().OrderBy(di => di.LogicalIndex).ToList(); sortedItems.Remove(dragablzItem); switch (moveItemRequest.AddLocationHint) { case AddLocationHint.First: sortedItems.Insert(0, dragablzItem); break; case AddLocationHint.Last: sortedItems.Add(dragablzItem); break; case AddLocationHint.Prior: case AddLocationHint.After: if (contextDragablzItem == null) return; var contextIndex = sortedItems.IndexOf(contextDragablzItem); sortedItems.Insert(moveItemRequest.AddLocationHint == AddLocationHint.Prior ? contextIndex : contextIndex + 1, dragablzItem); break; default: throw new ArgumentOutOfRangeException(); } //TODO might not be too great for perf on larger lists var orderedEnumerable = sortedItems.OrderBy(di => sortedItems.IndexOf(di)); ItemsOrganiser.Organise(this, new Size(ItemsPresenterWidth, ItemsPresenterHeight), orderedEnumerable); }