Skip to content

Commit 93a87aa

Browse files
committed
added files dialog sorting
1 parent 9511d47 commit 93a87aa

File tree

4 files changed

+104
-10
lines changed

4 files changed

+104
-10
lines changed

GeonBit.UI.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
33
<metadata>
44
<id>GeonBit.UI</id>
5-
<version>4.3.0.3</version>
5+
<version>4.3.0.4</version>
66
<authors>Ronen Ness</authors>
77
<owners>RonenNess</owners>
88
<title>MonoGame GeonBit.UI</title>
@@ -12,7 +12,7 @@ It provide all the basic elements required to make a game / editor UI, and comes
1212
<projectUrl>https://github.com/RonenNess/GeonBit.UI</projectUrl>
1313
<iconUrl>https://raw.githubusercontent.com/RonenNess/GeonBit.UI/master/assets/img/nuget_icon.png</iconUrl>
1414
<requireLicenseAcceptance>false</requireLicenseAcceptance>
15-
<releaseNotes>Updated to .net 7, added text rotation, and fixed some text validators.</releaseNotes>
15+
<releaseNotes>Added sorting to files dialog.</releaseNotes>
1616
<description>UI system for MonoGame projects.</description>
1717
<tags>monogame ui gui hud user-interface gamedev</tags>
1818
<dependencies>

GeonBit.UI/Source/UserInterface.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public enum BuiltinThemes
9494
public class UserInterface : System.IDisposable
9595
{
9696
/// <summary>Current GeonBit.UI version identifier.</summary>
97-
public const string VERSION = "4.3.0.3";
97+
public const string VERSION = "4.3.0.4";
9898

9999
/// <summary>
100100
/// The currently active user interface instance.

GeonBit.UI/Source/Utils/MessageBox.cs

Lines changed: 97 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System;
1414
using System.Collections.Generic;
1515
using System.IO;
16+
using System.Linq;
1617

1718
namespace GeonBit.UI.Utils
1819
{
@@ -260,6 +261,81 @@ public static MessageBoxHandle ShowMsgBox(string header, string text, string clo
260261
}, size: size ?? DefaultMsgBoxSize, extraEntities: extraEntities, onDone: onDone);
261262
}
262263

264+
/// <summary>
265+
/// How to sort files when presenting them in files dialog.
266+
/// </summary>
267+
public enum FilesSortingMode
268+
{
269+
/// <summary>
270+
/// Files will be presented in whatever order the OS returns them.
271+
/// </summary>
272+
Unsorted,
273+
274+
/// <summary>
275+
/// Sort files by name, ascending (0 to 9, A to Z).
276+
/// </summary>
277+
ByNameAscending,
278+
279+
/// <summary>
280+
/// Sort files by name, descending (9 to 0, Z to A).
281+
/// </summary>
282+
ByNameDescending,
283+
284+
/// <summary>
285+
/// Sort files by creation time, ascending.
286+
/// </summary>
287+
ByCreationDateAscending,
288+
289+
/// <summary>
290+
/// Sort files by creation time, descending.
291+
/// </summary>
292+
ByCreationDateDescending,
293+
294+
/// <summary>
295+
/// Sort files by modify time, ascending.
296+
/// </summary>
297+
ByModifyDateAscending,
298+
299+
/// <summary>
300+
/// Sort files by modify time, descending.
301+
/// </summary>
302+
ByModifyDateDescending,
303+
}
304+
305+
/// <summary>
306+
/// Sort list of files / folder names.
307+
/// </summary>
308+
private static void _SortFilesList(ref List<string> filenames, string path, FilesSortingMode sorting)
309+
{
310+
switch (sorting)
311+
{
312+
case FilesSortingMode.ByNameAscending:
313+
filenames.Sort();
314+
break;
315+
316+
case FilesSortingMode.ByNameDescending:
317+
filenames.Sort();
318+
filenames.Reverse();
319+
break;
320+
321+
case FilesSortingMode.ByCreationDateAscending:
322+
filenames = filenames.OrderBy(x => new FileInfo(Path.Combine(path, x)).CreationTime).ToList();
323+
break;
324+
325+
case FilesSortingMode.ByCreationDateDescending:
326+
filenames = filenames.OrderByDescending(x => new FileInfo(Path.Combine(path, x)).CreationTime).ToList();
327+
break;
328+
329+
case FilesSortingMode.ByModifyDateAscending:
330+
filenames = filenames.OrderBy(x => new FileInfo(Path.Combine(path, x)).LastWriteTime).ToList();
331+
break;
332+
333+
case FilesSortingMode.ByModifyDateDescending:
334+
filenames = filenames.OrderByDescending(x => new FileInfo(Path.Combine(path, x)).LastWriteTime).ToList();
335+
break;
336+
}
337+
}
338+
263339
/// <summary>
264340
/// Open a dialog to select file for saving.
265341
/// </summary>
@@ -274,8 +350,9 @@ public static MessageBoxHandle ShowMsgBox(string header, string text, string clo
274350
/// <param name="saveButtonTxt">String to show on the save file button.</param>
275351
/// <param name="cancelButtonTxt">String to show on the cancel button.</param>
276352
/// <param name="overrideWarning">If not null, will show this warning in a Yes/No prompt if the user tries to select an existing file.</param>
353+
/// <param name="sorting">How to sort files.</param>
277354
/// <returns>Message box handle.</returns>
278-
public static MessageBoxHandle OpenSaveFileDialog(string path, Func<FileDialogResponse, bool> onSelected, Action onCancel = null!, FileDialogOptions options = FileDialogOptions.Default, Func<string, bool> filterFiles = null!, Func<string, bool> filterFolders = null!, string title = "Save File As..", string message = null!, string saveButtonTxt = "Save File", string cancelButtonTxt = "Cancel", string overrideWarning = "File '<filename>' already exists!\nAre you sure you want to override it?")
355+
public static MessageBoxHandle OpenSaveFileDialog(string path, Func<FileDialogResponse, bool> onSelected, Action onCancel = null!, FileDialogOptions options = FileDialogOptions.Default, Func<string, bool> filterFiles = null!, Func<string, bool> filterFolders = null!, string title = "Save File As..", string message = null!, string saveButtonTxt = "Save File", string cancelButtonTxt = "Cancel", string overrideWarning = "File '<filename>' already exists!\nAre you sure you want to override it?", FilesSortingMode sorting = FilesSortingMode.Unsorted)
279356
{
280357
// current path
281358
var currPath = string.IsNullOrEmpty(path) ? Path.GetFullPath(Directory.GetCurrentDirectory()) : Path.GetFullPath(path);
@@ -346,25 +423,37 @@ void UpdateFilesList()
346423
}
347424

348425
// add folders
426+
List<string> folders = new List<string>();
349427
foreach (var dir in Directory.GetDirectories(currPath))
350428
{
351429
if (filterFolders == null || filterFolders(dir))
352430
{
353-
filesList.AddItem(Path.GetFileName(dir));
354-
filesList.SetIcon("textures/folder_icon", filesList.Count - 1);
431+
folders.Add(Path.GetFileName(dir));
355432
}
356433
}
434+
_SortFilesList(ref folders, currPath, sorting);
435+
foreach (var dir in folders)
436+
{
437+
filesList.AddItem(dir);
438+
filesList.SetIcon("textures/folder_icon", filesList.Count - 1);
439+
}
357440
}
358441

359442
// add files
443+
List<string> files = new List<string>();
360444
foreach (var file in Directory.GetFiles(currPath))
361445
{
362446
if (filterFiles == null || filterFiles(file))
363447
{
364-
filesList.AddItem(Path.GetFileName(file));
365-
filesList.SetIcon("textures/file_icon", filesList.Count - 1);
448+
files.Add(Path.GetFileName(file));
366449
}
367450
}
451+
_SortFilesList(ref files, currPath, sorting);
452+
foreach (var file in files)
453+
{
454+
filesList.AddItem(file);
455+
filesList.SetIcon("textures/file_icon", filesList.Count - 1);
456+
}
368457
}
369458

370459
// click on files list - check if enter or exit folder
@@ -520,11 +609,12 @@ void UpdateFilesList()
520609
/// <param name="message">Optional message to show above files.</param>
521610
/// <param name="loadButtonTxt">String to show on the load file button.</param>
522611
/// <param name="cancelButtonTxt">String to show on the cancel button.</param>
612+
/// <param name="sorting">How to sort files.</param>
523613
/// <returns>Message box handle.</returns>
524-
public static MessageBoxHandle OpenLoadFileDialog(string path, Func<FileDialogResponse, bool> onSelected, Action onCancel = null!, FileDialogOptions options = FileDialogOptions.Default, Func<string, bool> filterFiles = null!, Func<string, bool> filterFolders = null!, string title = "Open File..", string message = null!, string loadButtonTxt = "Open File", string cancelButtonTxt = "Cancel")
614+
public static MessageBoxHandle OpenLoadFileDialog(string path, Func<FileDialogResponse, bool> onSelected, Action onCancel = null!, FileDialogOptions options = FileDialogOptions.Default, Func<string, bool> filterFiles = null!, Func<string, bool> filterFolders = null!, string title = "Open File..", string message = null!, string loadButtonTxt = "Open File", string cancelButtonTxt = "Cancel", FilesSortingMode sorting = FilesSortingMode.Unsorted)
525615
{
526616
options |= FileDialogOptions.MustSelectExistingFile;
527-
return OpenSaveFileDialog(path, onSelected, onCancel, options, filterFiles, filterFolders, title, message, loadButtonTxt, cancelButtonTxt, null);
617+
return OpenSaveFileDialog(path, onSelected, onCancel, options, filterFiles, filterFolders, title, message, loadButtonTxt, cancelButtonTxt, null, sorting);
528618
}
529619
}
530620

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,6 +2111,10 @@ If you want to use the new files dialog, you must include the new textures that
21112111
- Added option to emulate mouse click via the mouse input provider.
21122112
- Fixed repo link in demo project.
21132113

2114+
### 4.3.0.4
2115+
2116+
- Added optional sorting to file dialogs.
2117+
21142118
## Credits
21152119

21162120
GeonBit.UI was written by Ronen Ness, but uses some free textures made by awesome people who share their work for free.

0 commit comments

Comments
 (0)