tangled
alpha
login
or
join now
keii.dev
/
osu-framework
0
fork
atom
A game framework written with osu! in mind.
0
fork
atom
overview
issues
pulls
pipelines
Rename RearrangeableListItem
smoogipoo
6 years ago
20c0bb3b
89710685
+92
-79
5 changed files
expand all
collapse all
unified
split
osu.Framework
Graphics
Containers
DrawableRearrangeableListItem.cs
RearrangeableListContainer.cs
RearrangeableListItem.cs
UserInterface
BasicRearrangeableListContainer.cs
osu.Framework.Tests
Visual
UserInterface
TestSceneRearrangeableListContainer.cs
+9
-9
osu.Framework.Tests/Visual/UserInterface/TestSceneRearrangeableListContainer.cs
···
44
string itemString = i.ToString();
45
46
AddStep($"add item \"{itemString}\"", () => list.Items.Add(itemString));
47
-
AddAssert($"last item is \"{itemString}\"", () => list.ChildrenOfType<DrawableRearrangeableListItem<string>>().Last().Model == itemString);
48
}
49
}
50
···
62
string itemString = i.ToString();
63
64
AddStep($"remove item \"{itemString}\"", () => list.Items.Remove(itemString));
65
-
AddAssert($"first item is not \"{itemString}\"", () => list.ChildrenOfType<DrawableRearrangeableListItem<string>>().FirstOrDefault()?.Model != itemString);
66
}
67
}
68
···
77
78
AddStep("clear items", () => list.Items.Clear());
79
80
-
AddAssert("no items contained", () => !list.ChildrenOfType<DrawableRearrangeableListItem<string>>().Any());
81
}
82
83
[Test]
···
263
() => list.Items.SequenceEqual(sequence.Select(value => value.ToString())));
264
}
265
266
-
private DrawableRearrangeableListItem<string> getItem(int index)
267
-
=> list.ChildrenOfType<DrawableRearrangeableListItem<string>>().First(i => i.Model == index.ToString());
268
269
-
private BasicDrawableRearrangeableListItem<string>.Button getDragger(int index)
270
-
=> list.ChildrenOfType<BasicDrawableRearrangeableListItem<string>>().First(i => i.Model == index.ToString())
271
-
.ChildrenOfType<BasicDrawableRearrangeableListItem<string>.Button>().First();
272
273
private class TestRearrangeableList : BasicRearrangeableListContainer<string>
274
{
275
public float ScrollPosition => ScrollContainer.Current;
276
277
public void ScrollTo(string item)
278
-
=> ScrollContainer.ScrollTo(this.ChildrenOfType<BasicDrawableRearrangeableListItem<string>>().First(i => i.Model == item), false);
279
}
280
}
281
}
···
44
string itemString = i.ToString();
45
46
AddStep($"add item \"{itemString}\"", () => list.Items.Add(itemString));
47
+
AddAssert($"last item is \"{itemString}\"", () => list.ChildrenOfType<RearrangeableListItem<string>>().Last().Model == itemString);
48
}
49
}
50
···
62
string itemString = i.ToString();
63
64
AddStep($"remove item \"{itemString}\"", () => list.Items.Remove(itemString));
65
+
AddAssert($"first item is not \"{itemString}\"", () => list.ChildrenOfType<RearrangeableListItem<string>>().FirstOrDefault()?.Model != itemString);
66
}
67
}
68
···
77
78
AddStep("clear items", () => list.Items.Clear());
79
80
+
AddAssert("no items contained", () => !list.ChildrenOfType<RearrangeableListItem<string>>().Any());
81
}
82
83
[Test]
···
263
() => list.Items.SequenceEqual(sequence.Select(value => value.ToString())));
264
}
265
266
+
private RearrangeableListItem<string> getItem(int index)
267
+
=> list.ChildrenOfType<RearrangeableListItem<string>>().First(i => i.Model == index.ToString());
268
269
+
private BasicRearrangeableListItem<string>.Button getDragger(int index)
270
+
=> list.ChildrenOfType<BasicRearrangeableListItem<string>>().First(i => i.Model == index.ToString())
271
+
.ChildrenOfType<BasicRearrangeableListItem<string>.Button>().First();
272
273
private class TestRearrangeableList : BasicRearrangeableListContainer<string>
274
{
275
public float ScrollPosition => ScrollContainer.Current;
276
277
public void ScrollTo(string item)
278
+
=> ScrollContainer.ScrollTo(this.ChildrenOfType<BasicRearrangeableListItem<string>>().First(i => i.Model == item), false);
279
}
280
}
281
}
-52
osu.Framework/Graphics/Containers/DrawableRearrangeableListItem.cs
···
1
-
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2
-
// See the LICENCE file in the repository root for full licence text.
3
-
4
-
using System;
5
-
using osu.Framework.Input.Events;
6
-
using osuTK;
7
-
8
-
namespace osu.Framework.Graphics.Containers
9
-
{
10
-
public abstract class DrawableRearrangeableListItem<TModel> : CompositeDrawable
11
-
{
12
-
internal Action<DrawableRearrangeableListItem<TModel>, DragStartEvent> StartArrangement;
13
-
14
-
internal Action<DrawableRearrangeableListItem<TModel>, DragEvent> Arrange;
15
-
16
-
internal Action<DrawableRearrangeableListItem<TModel>, DragEndEvent> EndArrangement;
17
-
18
-
/// <summary>
19
-
/// The item this <see cref="DrawableRearrangeableListItem{TModel}"/> represents.
20
-
/// </summary>
21
-
public TModel Model;
22
-
23
-
/// <summary>
24
-
/// Creates a new <see cref="DrawableRearrangeableListItem{TModel}"/>.
25
-
/// </summary>
26
-
/// <param name="item">The item to represent.</param>
27
-
protected DrawableRearrangeableListItem(TModel item)
28
-
{
29
-
Model = item;
30
-
}
31
-
32
-
/// <summary>
33
-
/// Returns whether the item is currently able to be dragged.
34
-
/// </summary>
35
-
protected virtual bool IsDraggableAt(Vector2 screenSpacePos) => true;
36
-
37
-
protected override bool OnDragStart(DragStartEvent e)
38
-
{
39
-
if (IsDraggableAt(e.ScreenSpaceMouseDownPosition))
40
-
{
41
-
StartArrangement?.Invoke(this, e);
42
-
return true;
43
-
}
44
-
45
-
return false;
46
-
}
47
-
48
-
protected override void OnDrag(DragEvent e) => Arrange?.Invoke(this, e);
49
-
50
-
protected override void OnDragEnd(DragEndEvent e) => EndArrangement?.Invoke(this, e);
51
-
}
52
-
}
···
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
+12
-12
osu.Framework/Graphics/Containers/RearrangeableListContainer.cs
···
38
protected readonly ScrollContainer<Drawable> ScrollContainer;
39
40
/// <summary>
41
-
/// The <see cref="FillFlowContainer"/> containing of all the <see cref="DrawableRearrangeableListItem{TModel}"/>s.
42
/// </summary>
43
-
protected readonly FillFlowContainer<DrawableRearrangeableListItem<TModel>> ListContainer;
44
45
/// <summary>
46
-
/// The mapping of <see cref="TModel"/> to <see cref="DrawableRearrangeableListItem{TModel}"/>.
47
/// </summary>
48
-
protected IReadOnlyDictionary<TModel, DrawableRearrangeableListItem<TModel>> ItemMap => itemMap;
49
50
-
private readonly Dictionary<TModel, DrawableRearrangeableListItem<TModel>> itemMap = new Dictionary<TModel, DrawableRearrangeableListItem<TModel>>();
51
-
private DrawableRearrangeableListItem<TModel> currentlyDraggedItem;
52
private Vector2 screenSpaceDragPosition;
53
private bool isCurrentlyRearranging; // Will be true only for the duration that indices are being moved around
54
···
125
ListContainer.SetLayoutPosition(itemMap[Items[i]], i);
126
}
127
128
-
private void startArrangement(DrawableRearrangeableListItem<TModel> item, DragStartEvent e)
129
{
130
currentlyDraggedItem = item;
131
screenSpaceDragPosition = e.ScreenSpaceMousePosition;
132
}
133
134
-
private void arrange(DrawableRearrangeableListItem<TModel> item, DragEvent e) => screenSpaceDragPosition = e.ScreenSpaceMousePosition;
135
136
-
private void endArrangement(DrawableRearrangeableListItem<TModel> item, DragEndEvent e) => currentlyDraggedItem = null;
137
138
protected override void Update()
139
{
···
226
/// <summary>
227
/// Creates the <see cref="FillFlowContainer{DrawableRearrangeableListItem}"/> for the items.
228
/// </summary>
229
-
protected virtual FillFlowContainer<DrawableRearrangeableListItem<TModel>> CreateListFillFlowContainer() => new FillFlowContainer<DrawableRearrangeableListItem<TModel>>();
230
231
/// <summary>
232
/// Creates the <see cref="ScrollContainer"/> for the list of items.
···
237
/// Creates the <see cref="Drawable"/> representation of an item.
238
/// </summary>
239
/// <param name="item">The item to create the <see cref="Drawable"/> representation of.</param>
240
-
/// <returns>The <see cref="DrawableRearrangeableListItem{T}"/>.</returns>
241
-
protected abstract DrawableRearrangeableListItem<TModel> CreateDrawable(TModel item);
242
}
243
}
···
38
protected readonly ScrollContainer<Drawable> ScrollContainer;
39
40
/// <summary>
41
+
/// The <see cref="FillFlowContainer"/> containing of all the <see cref="RearrangeableListItem{TModel}"/>s.
42
/// </summary>
43
+
protected readonly FillFlowContainer<RearrangeableListItem<TModel>> ListContainer;
44
45
/// <summary>
46
+
/// The mapping of <see cref="TModel"/> to <see cref="RearrangeableListItem{TModel}"/>.
47
/// </summary>
48
+
protected IReadOnlyDictionary<TModel, RearrangeableListItem<TModel>> ItemMap => itemMap;
49
50
+
private readonly Dictionary<TModel, RearrangeableListItem<TModel>> itemMap = new Dictionary<TModel, RearrangeableListItem<TModel>>();
51
+
private RearrangeableListItem<TModel> currentlyDraggedItem;
52
private Vector2 screenSpaceDragPosition;
53
private bool isCurrentlyRearranging; // Will be true only for the duration that indices are being moved around
54
···
125
ListContainer.SetLayoutPosition(itemMap[Items[i]], i);
126
}
127
128
+
private void startArrangement(RearrangeableListItem<TModel> item, DragStartEvent e)
129
{
130
currentlyDraggedItem = item;
131
screenSpaceDragPosition = e.ScreenSpaceMousePosition;
132
}
133
134
+
private void arrange(RearrangeableListItem<TModel> item, DragEvent e) => screenSpaceDragPosition = e.ScreenSpaceMousePosition;
135
136
+
private void endArrangement(RearrangeableListItem<TModel> item, DragEndEvent e) => currentlyDraggedItem = null;
137
138
protected override void Update()
139
{
···
226
/// <summary>
227
/// Creates the <see cref="FillFlowContainer{DrawableRearrangeableListItem}"/> for the items.
228
/// </summary>
229
+
protected virtual FillFlowContainer<RearrangeableListItem<TModel>> CreateListFillFlowContainer() => new FillFlowContainer<RearrangeableListItem<TModel>>();
230
231
/// <summary>
232
/// Creates the <see cref="ScrollContainer"/> for the list of items.
···
237
/// Creates the <see cref="Drawable"/> representation of an item.
238
/// </summary>
239
/// <param name="item">The item to create the <see cref="Drawable"/> representation of.</param>
240
+
/// <returns>The <see cref="RearrangeableListItem{TModel}"/>.</returns>
241
+
protected abstract RearrangeableListItem<TModel> CreateDrawable(TModel item);
242
}
243
}
+65
osu.Framework/Graphics/Containers/RearrangeableListItem.cs
···
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
···
1
+
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2
+
// See the LICENCE file in the repository root for full licence text.
3
+
4
+
using System;
5
+
using osu.Framework.Input.Events;
6
+
using osuTK;
7
+
8
+
namespace osu.Framework.Graphics.Containers
9
+
{
10
+
/// <summary>
11
+
/// An item of a <see cref="RearrangeableListContainer{TModel}"/>.
12
+
/// </summary>
13
+
/// <typeparam name="TModel"></typeparam>
14
+
public abstract class RearrangeableListItem<TModel> : CompositeDrawable
15
+
{
16
+
/// <summary>
17
+
/// Invoked on drag start, if an arrangement should be started.
18
+
/// </summary>
19
+
internal Action<RearrangeableListItem<TModel>, DragStartEvent> StartArrangement;
20
+
21
+
/// <summary>
22
+
/// Invoked on drag, if this item is being arranged.
23
+
/// </summary>
24
+
internal Action<RearrangeableListItem<TModel>, DragEvent> Arrange;
25
+
26
+
/// <summary>
27
+
/// Invoked on drag end, if this item is being arranged.
28
+
/// </summary>
29
+
internal Action<RearrangeableListItem<TModel>, DragEndEvent> EndArrangement;
30
+
31
+
/// <summary>
32
+
/// The item this <see cref="RearrangeableListItem{TModel}"/> represents.
33
+
/// </summary>
34
+
public TModel Model;
35
+
36
+
/// <summary>
37
+
/// Creates a new <see cref="RearrangeableListItem{TModel}"/>.
38
+
/// </summary>
39
+
/// <param name="item">The item to represent.</param>
40
+
protected RearrangeableListItem(TModel item)
41
+
{
42
+
Model = item;
43
+
}
44
+
45
+
/// <summary>
46
+
/// Whether the item is able to be dragged at the given screen-space position.
47
+
/// </summary>
48
+
protected virtual bool IsDraggableAt(Vector2 screenSpacePos) => true;
49
+
50
+
protected override bool OnDragStart(DragStartEvent e)
51
+
{
52
+
if (IsDraggableAt(e.ScreenSpaceMouseDownPosition))
53
+
{
54
+
StartArrangement?.Invoke(this, e);
55
+
return true;
56
+
}
57
+
58
+
return false;
59
+
}
60
+
61
+
protected override void OnDrag(DragEvent e) => Arrange?.Invoke(this, e);
62
+
63
+
protected override void OnDragEnd(DragEndEvent e) => EndArrangement?.Invoke(this, e);
64
+
}
65
+
}
+6
-6
osu.Framework/Graphics/UserInterface/BasicRearrangeableListContainer.cs
···
14
{
15
public class BasicRearrangeableListContainer<TModel> : RearrangeableListContainer<TModel>
16
{
17
-
protected override FillFlowContainer<DrawableRearrangeableListItem<TModel>> CreateListFillFlowContainer() => base.CreateListFillFlowContainer().With(d =>
18
{
19
d.LayoutDuration = 160;
20
d.LayoutEasing = Easing.OutQuint;
···
28
d.Padding = new MarginPadding(5);
29
});
30
31
-
protected sealed override DrawableRearrangeableListItem<TModel> CreateDrawable(TModel item) => CreateBasicItem(item).With(d =>
32
{
33
d.RequestRemoval += _ => Items.Remove(item);
34
});
35
36
-
protected virtual BasicDrawableRearrangeableListItem<TModel> CreateBasicItem(TModel item) => new BasicDrawableRearrangeableListItem<TModel>(item);
37
}
38
39
-
public class BasicDrawableRearrangeableListItem<TModel> : DrawableRearrangeableListItem<TModel>
40
{
41
-
internal Action<DrawableRearrangeableListItem<TModel>> RequestRemoval;
42
43
private readonly bool removable;
44
private Drawable dragHandle;
45
46
-
public BasicDrawableRearrangeableListItem(TModel item, bool removable = false)
47
: base(item)
48
{
49
this.removable = removable;
···
14
{
15
public class BasicRearrangeableListContainer<TModel> : RearrangeableListContainer<TModel>
16
{
17
+
protected override FillFlowContainer<RearrangeableListItem<TModel>> CreateListFillFlowContainer() => base.CreateListFillFlowContainer().With(d =>
18
{
19
d.LayoutDuration = 160;
20
d.LayoutEasing = Easing.OutQuint;
···
28
d.Padding = new MarginPadding(5);
29
});
30
31
+
protected sealed override RearrangeableListItem<TModel> CreateDrawable(TModel item) => CreateBasicItem(item).With(d =>
32
{
33
d.RequestRemoval += _ => Items.Remove(item);
34
});
35
36
+
protected virtual BasicRearrangeableListItem<TModel> CreateBasicItem(TModel item) => new BasicRearrangeableListItem<TModel>(item);
37
}
38
39
+
public class BasicRearrangeableListItem<TModel> : RearrangeableListItem<TModel>
40
{
41
+
internal Action<RearrangeableListItem<TModel>> RequestRemoval;
42
43
private readonly bool removable;
44
private Drawable dragHandle;
45
46
+
public BasicRearrangeableListItem(TModel item, bool removable = false)
47
: base(item)
48
{
49
this.removable = removable;