forked from bit/DotRecastNetSim
add file picker for imgui
This commit is contained in:
parent
47239c92f3
commit
804316b600
|
@ -7,18 +7,18 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Serilog" Version="2.12.0"/>
|
||||
<PackageReference Include="Silk.NET" Version="2.16.0"/>
|
||||
<PackageReference Include="Silk.NET.OpenGL.Extensions.ImGui" Version="2.16.0"/>
|
||||
<PackageReference Include="Serilog" Version="2.12.0" />
|
||||
<PackageReference Include="Silk.NET" Version="2.16.0" />
|
||||
<PackageReference Include="Silk.NET.OpenGL.Extensions.ImGui" Version="2.16.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\DotRecast.Detour.Crowd\DotRecast.Detour.Crowd.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Detour.Dynamic\DotRecast.Detour.Dynamic.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Detour.Extras\DotRecast.Detour.Extras.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Detour.TileCache\DotRecast.Detour.TileCache.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Recast\DotRecast.Recast.csproj"/>
|
||||
<ProjectReference Include="..\DotRecast.Detour.Crowd\DotRecast.Detour.Crowd.csproj" />
|
||||
<ProjectReference Include="..\DotRecast.Detour.Dynamic\DotRecast.Detour.Dynamic.csproj" />
|
||||
<ProjectReference Include="..\DotRecast.Detour.Extras\DotRecast.Detour.Extras.csproj" />
|
||||
<ProjectReference Include="..\DotRecast.Detour.TileCache\DotRecast.Detour.TileCache.csproj" />
|
||||
<ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj" />
|
||||
<ProjectReference Include="..\DotRecast.Recast\DotRecast.Recast.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -16,8 +16,8 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System;
|
||||
using System.IO;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Recast.Demo.Draw;
|
||||
using DotRecast.Recast.Demo.UI;
|
||||
|
@ -85,7 +85,25 @@ public class RcSettingsView : IRcView
|
|||
bool mouseInside = false;
|
||||
ImGui.Text("Input Mesh");
|
||||
ImGui.Separator();
|
||||
ImGui.Button("Load Source Geom...");
|
||||
|
||||
const string strLoadSourceGeom = "Load Source Geom...";
|
||||
if (ImGui.Button(strLoadSourceGeom))
|
||||
{
|
||||
ImGui.OpenPopup(strLoadSourceGeom);
|
||||
}
|
||||
|
||||
bool loadSourceGeomPopup = true;
|
||||
if (ImGui.BeginPopupModal(strLoadSourceGeom, ref loadSourceGeomPopup, ImGuiWindowFlags.NoTitleBar))
|
||||
{
|
||||
var picker = ImFilePicker.GetFilePicker(strLoadSourceGeom, Path.Combine(Environment.CurrentDirectory));
|
||||
if (picker.Draw())
|
||||
{
|
||||
Console.WriteLine(picker.SelectedFile);
|
||||
ImFilePicker.RemoveFilePicker(strLoadSourceGeom);
|
||||
}
|
||||
ImGui.EndPopup();
|
||||
}
|
||||
|
||||
ImGui.Text($"Verts: {voxels[0]} Tris: {voxels[1]}");
|
||||
ImGui.NewLine();
|
||||
|
||||
|
@ -159,8 +177,24 @@ public class RcSettingsView : IRcView
|
|||
ImGui.Text($"Build Time: {buildTime} ms");
|
||||
ImGui.Separator();
|
||||
buildTriggered = ImGui.Button("Build");
|
||||
ImGui.SameLine();
|
||||
navMeshInputTrigerred = ImGui.Button("Load Nav Mesh...");
|
||||
const string strLoadNavMesh = "Load Nav Mesh...";
|
||||
if (ImGui.Button(strLoadNavMesh))
|
||||
{
|
||||
ImGui.OpenPopup(strLoadNavMesh);
|
||||
}
|
||||
|
||||
bool isLoadNavMesh = true;
|
||||
if (ImGui.BeginPopupModal(strLoadNavMesh, ref isLoadNavMesh, ImGuiWindowFlags.NoTitleBar))
|
||||
{
|
||||
var picker = ImFilePicker.GetFilePicker(strLoadNavMesh, Path.Combine(Environment.CurrentDirectory));
|
||||
if (picker.Draw())
|
||||
{
|
||||
Console.WriteLine(picker.SelectedFile);
|
||||
ImFilePicker.RemoveFilePicker(strLoadNavMesh);
|
||||
}
|
||||
ImGui.EndPopup();
|
||||
}
|
||||
|
||||
ImGui.NewLine();
|
||||
|
||||
ImGui.Text("Draw");
|
||||
|
|
|
@ -0,0 +1,186 @@
|
|||
using System;
|
||||
using System.Numerics;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using ImGuiNET;
|
||||
|
||||
namespace DotRecast.Recast.Demo.UI;
|
||||
|
||||
// original code : https://gist.github.com/prime31/91d1582624eb2635395417393018016e
|
||||
public class ImFilePicker
|
||||
{
|
||||
private static readonly Dictionary<string, ImFilePicker> _filePickers = new Dictionary<string, ImFilePicker>();
|
||||
|
||||
public string RootFolder;
|
||||
public string CurrentFolder;
|
||||
public string SelectedFile;
|
||||
public List<string> AllowedExtensions;
|
||||
public bool OnlyAllowFolders;
|
||||
|
||||
public static ImFilePicker GetFolderPicker(string pickerName, string startingPath)
|
||||
=> GetFilePicker(pickerName, startingPath, null, true);
|
||||
|
||||
public static ImFilePicker GetFilePicker(string pickerName, string startingPath, string searchFilter = null, bool onlyAllowFolders = false)
|
||||
{
|
||||
if (File.Exists(startingPath))
|
||||
{
|
||||
startingPath = new FileInfo(startingPath).DirectoryName;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(startingPath) || !Directory.Exists(startingPath))
|
||||
{
|
||||
startingPath = Environment.CurrentDirectory;
|
||||
if (string.IsNullOrEmpty(startingPath))
|
||||
startingPath = AppContext.BaseDirectory;
|
||||
}
|
||||
|
||||
if (!_filePickers.TryGetValue(pickerName, out ImFilePicker fp))
|
||||
{
|
||||
fp = new ImFilePicker();
|
||||
fp.RootFolder = startingPath;
|
||||
fp.CurrentFolder = startingPath;
|
||||
fp.OnlyAllowFolders = onlyAllowFolders;
|
||||
|
||||
if (searchFilter != null)
|
||||
{
|
||||
if (fp.AllowedExtensions != null)
|
||||
fp.AllowedExtensions.Clear();
|
||||
else
|
||||
fp.AllowedExtensions = new List<string>();
|
||||
|
||||
fp.AllowedExtensions.AddRange(searchFilter.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries));
|
||||
}
|
||||
|
||||
_filePickers.Add(pickerName, fp);
|
||||
}
|
||||
|
||||
return fp;
|
||||
}
|
||||
|
||||
public static void RemoveFilePicker(string pickerName) => _filePickers.Remove(pickerName);
|
||||
|
||||
public bool Draw()
|
||||
{
|
||||
ImGui.Text("Current Folder: " + CurrentFolder);
|
||||
bool result = false;
|
||||
|
||||
if (ImGui.BeginChildFrame(1, new Vector2(1024, 400)))
|
||||
{
|
||||
var di = new DirectoryInfo(CurrentFolder);
|
||||
if (di.Exists)
|
||||
{
|
||||
if (di.Parent != null)
|
||||
{
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, (uint)Color.Yellow.ToArgb());
|
||||
if (ImGui.Selectable("../", false, ImGuiSelectableFlags.DontClosePopups))
|
||||
CurrentFolder = di.Parent.FullName;
|
||||
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
|
||||
var fileSystemEntries = GetFileSystemEntries(di.FullName);
|
||||
foreach (var fse in fileSystemEntries)
|
||||
{
|
||||
if (Directory.Exists(fse))
|
||||
{
|
||||
var name = Path.GetFileName(fse);
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, (uint)Color.Yellow.ToArgb());
|
||||
if (ImGui.Selectable(name + "/", false, ImGuiSelectableFlags.DontClosePopups))
|
||||
CurrentFolder = fse;
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
else
|
||||
{
|
||||
var name = Path.GetFileName(fse);
|
||||
bool isSelected = SelectedFile == fse;
|
||||
if (ImGui.Selectable(name, isSelected, ImGuiSelectableFlags.DontClosePopups))
|
||||
SelectedFile = fse;
|
||||
|
||||
if (ImGui.IsMouseDoubleClicked(0))
|
||||
{
|
||||
result = true;
|
||||
ImGui.CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImGui.EndChildFrame();
|
||||
|
||||
|
||||
if (ImGui.Button("Cancel"))
|
||||
{
|
||||
result = false;
|
||||
ImGui.CloseCurrentPopup();
|
||||
}
|
||||
|
||||
if (OnlyAllowFolders)
|
||||
{
|
||||
ImGui.SameLine();
|
||||
if (ImGui.Button("Open"))
|
||||
{
|
||||
result = true;
|
||||
SelectedFile = CurrentFolder;
|
||||
ImGui.CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
else if (SelectedFile != null)
|
||||
{
|
||||
ImGui.SameLine();
|
||||
if (ImGui.Button("Open"))
|
||||
{
|
||||
result = true;
|
||||
ImGui.CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool TryGetFileInfo(string fileName, out FileInfo realFile)
|
||||
{
|
||||
try
|
||||
{
|
||||
realFile = new FileInfo(fileName);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
realFile = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
List<string> GetFileSystemEntries(string fullName)
|
||||
{
|
||||
var files = new List<string>();
|
||||
var dirs = new List<string>();
|
||||
|
||||
foreach (var fse in Directory.GetFileSystemEntries(fullName, ""))
|
||||
{
|
||||
if (Directory.Exists(fse))
|
||||
{
|
||||
dirs.Add(fse);
|
||||
}
|
||||
else if (!OnlyAllowFolders)
|
||||
{
|
||||
if (AllowedExtensions != null)
|
||||
{
|
||||
var ext = Path.GetExtension(fse);
|
||||
if (AllowedExtensions.Contains(ext))
|
||||
files.Add(fse);
|
||||
}
|
||||
else
|
||||
{
|
||||
files.Add(fse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ret = new List<string>(dirs);
|
||||
ret.AddRange(files);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue