Skip to content

Commit

Permalink
Improve the SystemTreeViewer
Browse files Browse the repository at this point in the history
  • Loading branch information
behindcurtain3 committed Mar 21, 2024
1 parent abac3bd commit 087fbb2
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 75 deletions.
15 changes: 15 additions & 0 deletions Pulsar4X/GameEngine/Extensions/EntityExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -422,5 +422,20 @@ internal static bool AreAllDependenciesPresent(this IHasDataBlobs entity)
// Now Compare the two HashSets to make sure entityDataBlobTypes has all requiredDataBlobTypes
return requiredDataBlobTypes.IsSubsetOf(entityDataBlobTypes);
}

public static bool IsOrHasColony(this Entity entity) {
if(entity.HasDataBlob<ColonyInfoDB>()) return true;

if(entity.TryGetDatablob<PositionDB>(out var positionDB))
{
foreach(var child in positionDB.Children)
{
if(child.HasDataBlob<ColonyInfoDB>())
return true;
}
}

return false;
}
}
}
144 changes: 70 additions & 74 deletions Pulsar4X/Pulsar4X.Client/GalaxyManagement/SystemTreeViewer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,103 +4,99 @@
using System.Numerics;
using System.Collections.Generic;
using System.Linq;
using Pulsar4X.Extensions;

namespace Pulsar4X.SDL2UI
namespace Pulsar4X.SDL2UI;
public class SystemTreeViewer : PulsarGuiWindow
{
public class SystemTreeViewer : PulsarGuiWindow
private SystemTreeViewer()
{
private SystemTreeViewer()
{
_flags = ImGuiWindowFlags.AlwaysAutoResize;

}

internal static SystemTreeViewer GetInstance() {
SystemTreeViewer thisItem;
if (!_uiState.LoadedWindows.ContainsKey(typeof(SystemTreeViewer)))
{
thisItem = new SystemTreeViewer();
}
else
{
thisItem = (SystemTreeViewer)_uiState.LoadedWindows[typeof(SystemTreeViewer)];
}

internal static SystemTreeViewer GetInstance() {
SystemTreeViewer thisItem;
if (!_uiState.LoadedWindows.ContainsKey(typeof(SystemTreeViewer)))
{
thisItem = new SystemTreeViewer();
}
else
{
thisItem = (SystemTreeViewer)_uiState.LoadedWindows[typeof(SystemTreeViewer)];
}
return thisItem;
}

return thisItem;
}
//displays selected entity info
internal override void Display()
{
if(!IsActive) return;

//displays selected entity info
internal override void Display()
if (ImGui.Begin("System Viewer", _flags))
{
if (IsActive && ImGui.Begin("System Tree", _flags))
if (_uiState.StarSystemStates.ContainsKey(_uiState.SelectedStarSysGuid))
{
if (_uiState.StarSystemStates.ContainsKey(_uiState.SelectedStarSysGuid))
SystemState starSystemState = _uiState.StarSystemStates[_uiState.SelectedStarSysGuid];
List<EntityState> stars = starSystemState.EntityStatesWithPosition.Values
.Where(e => e.IsStar())
.OrderBy(x => x.Position?.AbsolutePosition ?? Orbital.Vector3.Zero)
.ToList();

if(ImGui.BeginTable("DesignStatsTables", 3, ImGuiTableFlags.BordersInnerV | ImGuiTableFlags.RowBg))
{
SystemState _StarSystemState = _uiState.StarSystemStates[_uiState.SelectedStarSysGuid];
List<EntityState> _NamedEntityStates = _StarSystemState.EntityStatesWithPosition.Values.OrderBy(x => x.Position.AbsolutePosition).ToList();
List<EntityState> _Stars = new List<EntityState>();
ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.None);
ImGui.TableSetupColumn("Type", ImGuiTableColumnFlags.None);
ImGui.TableSetupColumn("", ImGuiTableColumnFlags.None);
ImGui.TableHeadersRow();

foreach (EntityState Body in _NamedEntityStates)
foreach (var body in stars)
{
if (Body.IsStar())
{
if (_uiState.LastClickedEntity != null)
{
TreeGen(Body.Entity, _uiState.LastClickedEntity.Entity);
}
else
{
TreeGen(Body.Entity, Body.Entity);
}
}
TreeGen(body.Entity, _uiState.LastClickedEntity?.Entity ?? body.Entity);
}

ImGui.EndTable();
}
}
}
}

void TreeGen(Entity _CurrentBody, Entity _SelectedBody)
{
SystemState _StarSystemState = _uiState.StarSystemStates[_uiState.SelectedStarSysGuid];
var _NamedEntityStates = _StarSystemState.EntityStatesWithPosition;

if (_NamedEntityStates.ContainsKey(_CurrentBody.Id))
{
var _ChildList = _CurrentBody.GetDataBlob<PositionDB>().Children;

if (_ChildList.Count > 0)
{
ImGuiTreeNodeFlags _TreeFlags = ImGuiTreeNodeFlags.OpenOnArrow;
if (_CurrentBody == _SelectedBody)
{
_TreeFlags = ImGuiTreeNodeFlags.Selected | _TreeFlags;
}
void TreeGen(Entity currentBody, Entity selectedBody, int depth = 0)
{
SystemState starSystemState = _uiState.StarSystemStates[_uiState.SelectedStarSysGuid];
var entityStates = starSystemState.EntityStatesWithPosition;

bool _Opened = ImGui.TreeNodeEx(_NamedEntityStates[_CurrentBody.Id].Name, _TreeFlags);
if (entityStates.ContainsKey(currentBody.Id) && (currentBody.HasDataBlob<StarInfoDB>() || currentBody.HasDataBlob<SystemBodyInfoDB>()))
{
if(!currentBody.TryGetDatablob<PositionDB>(out var positionDB))
return;

if (ImGui.IsItemClicked())
{
_uiState.EntityClicked(_CurrentBody.Id, _uiState.SelectedStarSysGuid, MouseButtons.Primary);
}
PrintEntity(currentBody, depth);

if (_Opened)
{
_ChildList = _ChildList.OrderBy(x => x.GetDataBlob<PositionDB>().AbsolutePosition).ToList();
foreach (Entity _ChildBody in _ChildList)
{
TreeGen(_ChildBody, _SelectedBody);
}
ImGui.TreePop();
}
}
else
var children = positionDB.Children;
if (children.Count > 0)
{
children = children.OrderBy(x => x.GetDataBlob<PositionDB>().AbsolutePosition).ToList();
foreach (var child in children)
{
if (ImGui.Selectable(_NamedEntityStates[_CurrentBody.Id].Name, _CurrentBody == _SelectedBody))
{
_uiState.EntityClicked(_CurrentBody.Id, _uiState.SelectedStarSysGuid, MouseButtons.Primary);
}
TreeGen(child, selectedBody, depth + 1);
}

}
}
}

private void PrintEntity(Entity entity, int depth = 0)
{
var bodyType = entity.HasDataBlob<SystemBodyInfoDB>() ?
entity.GetDataBlob<SystemBodyInfoDB>().BodyType.ToDescription() :
"Star";

ImGui.TableNextColumn();
if(depth > 0) ImGui.Indent(16 * depth);
ImGui.Text(entity.GetName(_uiState.Faction.Id));
if(depth > 0) ImGui.Unindent(16 * depth);
ImGui.TableNextColumn();
ImGui.Text(bodyType);
ImGui.TableNextColumn();
ImGui.Text(entity.IsOrHasColony() ? "C" : "");
}
}
2 changes: 1 addition & 1 deletion Pulsar4X/Pulsar4X.Client/GameManagment/GlobalUIState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public class GlobalUIState
internal Dictionary<string, IntPtr> SDLImageDictionary = new ();
internal Dictionary<string, int> GLImageDictionary = new ();
public event EntityClickedEventHandler EntityClickedEvent;
internal EntityState LastClickedEntity = null;
internal EntityState? LastClickedEntity = null;
internal EntityState PrimaryEntity { get; private set; }
internal Orbital.Vector3 LastWorldPointClicked_m { get; set; }
//internal SpaceMasterVM SpaceMasterVM;
Expand Down

0 comments on commit 087fbb2

Please sign in to comment.