Skip to content

Commit c4d61eb

Browse files
committed
Make it possible to pin TileSets to the top of the TileSet list
1 parent 1d48341 commit c4d61eb

File tree

4 files changed

+76
-4
lines changed

4 files changed

+76
-4
lines changed

src/TSMapEditor/Content/star.png

4.89 KB
Loading

src/TSMapEditor/TSMapEditor.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,9 @@
458458
<None Update="Content\SpriteFont1.xnb">
459459
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
460460
</None>
461+
<None Update="Content\star.png">
462+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
463+
</None>
461464
<None Update="Content\tileborder.png">
462465
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
463466
</None>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Microsoft.Xna.Framework;
2+
using Microsoft.Xna.Framework.Graphics;
3+
using Rampastring.XNAUI;
4+
using Rampastring.XNAUI.XNAControls;
5+
using TSMapEditor.CCEngine;
6+
7+
namespace TSMapEditor.UI.Controls
8+
{
9+
public class TileSetListBox : XNAListBox
10+
{
11+
public TileSetListBox(WindowManager windowManager, int tileSetCount) : base(windowManager)
12+
{
13+
tileSetIsFavourite = new bool[tileSetCount];
14+
favouriteTileSetTexture = AssetLoader.LoadTexture("star.png");
15+
}
16+
17+
private readonly bool[] tileSetIsFavourite;
18+
19+
private Texture2D favouriteTileSetTexture;
20+
21+
public bool IsTileSetFavourite(int tileSetIndex) => tileSetIsFavourite[tileSetIndex];
22+
23+
public void SetTileSetAsFavourite(int tileSetIndex) => tileSetIsFavourite[tileSetIndex] = true;
24+
25+
public void ClearFavouriteStatus(int tileSetIndex) => tileSetIsFavourite[tileSetIndex] = false;
26+
27+
protected override void DrawListBoxItem(int index, int y)
28+
{
29+
base.DrawListBoxItem(index, y);
30+
var tileSet = (TileSet)Items[index].Tag;
31+
32+
if (!IsTileSetFavourite(tileSet.Index))
33+
return;
34+
35+
int lineWidth = Width - 2 - (EnableScrollbar && ScrollBar.IsDrawn() ? ScrollBar.Width : 0);
36+
37+
int textureYOffset = (LineHeight - favouriteTileSetTexture.Height) / 2;
38+
39+
DrawTexture(favouriteTileSetTexture, new Point(lineWidth - 1 - favouriteTileSetTexture.Width, y + textureYOffset), Color.White);
40+
}
41+
}
42+
}

src/TSMapEditor/UI/TileSelector.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ protected override void OnClientRectangleUpdated()
5454

5555
private SortButton btnSort;
5656
private EditorSuggestionTextBox tbSearch;
57-
private XNAListBox lbTileSetList;
57+
private TileSetListBox lbTileSetList;
58+
private XNAContextMenu tileSetContextMenu;
5859

5960
private TileSetSortMode _tileSetSortMode;
6061
private TileSetSortMode TileSetSortMode
@@ -87,11 +88,12 @@ public override void Initialize()
8788
UIHelpers.AddSearchTipsBoxToControl(tbSearch);
8889
tbSearch.TextChanged += TbSearch_TextChanged;
8990

90-
lbTileSetList = new XNAListBox(WindowManager);
91+
lbTileSetList = new TileSetListBox(WindowManager, theaterGraphics.Theater.TileSets.Count);
9192
lbTileSetList.Name = nameof(lbTileSetList);
9293
lbTileSetList.Y = tbSearch.Bottom;
9394
lbTileSetList.Height = Height - tbSearch.Bottom;
9495
lbTileSetList.Width = TileSetListWidth;
96+
lbTileSetList.AllowRightClickUnselect = false;
9597
lbTileSetList.SelectedIndexChanged += LbTileSetList_SelectedIndexChanged;
9698
AddChild(lbTileSetList);
9799

@@ -114,6 +116,22 @@ public override void Initialize()
114116

115117
btnSort.LeftClick += (s, e) => sortContextMenu.Open(GetCursorPoint());
116118

119+
tileSetContextMenu = new EditorContextMenu(WindowManager);
120+
tileSetContextMenu.Name = nameof(tileSetContextMenu);
121+
tileSetContextMenu.Width = 200;
122+
tileSetContextMenu.AddItem("Pin",
123+
() => { lbTileSetList.SetTileSetAsFavourite(((TileSet)lbTileSetList.SelectedItem.Tag).Index); RefreshTileSets(); },
124+
null,
125+
() => lbTileSetList.SelectedItem != null && !lbTileSetList.IsTileSetFavourite(((TileSet)lbTileSetList.SelectedItem.Tag).Index));
126+
tileSetContextMenu.AddItem("Unpin",
127+
() => { lbTileSetList.ClearFavouriteStatus(((TileSet)lbTileSetList.SelectedItem.Tag).Index); RefreshTileSets(); },
128+
null,
129+
() => lbTileSetList.SelectedItem != null && lbTileSetList.IsTileSetFavourite(((TileSet)lbTileSetList.SelectedItem.Tag).Index));
130+
tileSetContextMenu.AddItem("Unselect", () => lbTileSetList.SelectedIndex = -1);
131+
AddChild(tileSetContextMenu);
132+
133+
lbTileSetList.RightClick += LbTileSetList_RightClick;
134+
117135
base.Initialize();
118136

119137
RefreshTileSets();
@@ -123,6 +141,14 @@ public override void Initialize()
123141
WindowManager.RenderResolutionChanged += WindowManager_RenderResolutionChanged;
124142
}
125143

144+
private void LbTileSetList_RightClick(object sender, EventArgs e)
145+
{
146+
lbTileSetList.SelectedIndex = lbTileSetList.HoveredIndex;
147+
148+
if (lbTileSetList.SelectedItem != null)
149+
tileSetContextMenu.Open(GetCursorPoint());
150+
}
151+
126152
private void WindowManager_RenderResolutionChanged(object sender, EventArgs e)
127153
{
128154
Width = WindowManager.RenderResolutionX - X;
@@ -261,14 +287,15 @@ private void LbTileSetList_SelectedIndexChanged(object sender, EventArgs e)
261287
private void RefreshTileSets()
262288
{
263289
lbTileSetList.Clear();
264-
IEnumerable<TileSet> sortedTileSets = theaterGraphics.Theater.TileSets; // TODO sort tilesets
290+
IOrderedEnumerable<TileSet> sortedTileSets = theaterGraphics.Theater.TileSets.OrderBy(ts => !lbTileSetList.IsTileSetFavourite(ts.Index));
265291

266292
switch (TileSetSortMode)
267293
{
268294
case TileSetSortMode.ID:
295+
sortedTileSets = sortedTileSets.ThenBy(ts => ts.Index);
269296
break;
270297
case TileSetSortMode.Name:
271-
sortedTileSets = sortedTileSets.OrderBy(ts => ts.SetName);
298+
sortedTileSets = sortedTileSets.ThenBy(ts => ts.SetName);
272299
break;
273300
}
274301

0 commit comments

Comments
 (0)