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