Skip to content

Commit 8bf9f5f

Browse files
committed
Merge remote-tracking branch 'origin/DevBranch' into DevBranch
2 parents 3fa8915 + ca97cf7 commit 8bf9f5f

7 files changed

Lines changed: 66 additions & 92 deletions

File tree

Pulsar4X/Pulsar4X.Client/Interface/HUD/EntityFilterBar.cs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Numerics;
33
using ImGuiNET;
44
using Pulsar4X.Client.Interface.Widgets;
5+
using System;
56

67
namespace Pulsar4X.Client;
78

@@ -13,19 +14,6 @@ public class EntityFilterBar : PulsarGuiWindow
1314
{
1415
private const string ViewKey = "map";
1516

16-
private static readonly List<(UserOrbitSettings.OrbitBodyType type, string label, string tooltip)> Filters = new ()
17-
{
18-
(UserOrbitSettings.OrbitBodyType.Star, "*", "Stars"),
19-
(UserOrbitSettings.OrbitBodyType.Planet, "P", "Planets"),
20-
(UserOrbitSettings.OrbitBodyType.DwarfPlanet, "D", "Dwarf Planets"),
21-
(UserOrbitSettings.OrbitBodyType.Moon, "M", "Moons"),
22-
(UserOrbitSettings.OrbitBodyType.Asteroid, "A", "Asteroids"),
23-
(UserOrbitSettings.OrbitBodyType.Comet, "C", "Comets"),
24-
(UserOrbitSettings.OrbitBodyType.Colony, "H", "Colonies"),
25-
(UserOrbitSettings.OrbitBodyType.Ship, "S", "Ships"),
26-
(UserOrbitSettings.OrbitBodyType.Unknown, "?", "Unknown"),
27-
};
28-
2917
private EntityFilterBar()
3018
{
3119
_flags = ImGuiWindowFlags.NoScrollbar
@@ -59,12 +47,12 @@ internal override void Display()
5947

6048
if (Window.Begin("###entity-filter-bar", _flags))
6149
{
62-
for (int i = 0; i < Filters.Count; i++)
50+
foreach (UserOrbitSettings.OrbitBodyType type in Enum.GetValues(typeof(UserOrbitSettings.OrbitBodyType)))
6351
{
64-
var (type, label, tooltip) = Filters[i];
6552
bool isVisible = prefs.ShouldDisplay(ViewKey, type);
6653

67-
if (i > 0) ImGui.SameLine(0, 2);
54+
var idx = (int)type;
55+
if (idx > 0) ImGui.SameLine(0, 2);
6856

6957
// Style: bright when active, dim when filtered out
7058
if (isVisible)
@@ -80,6 +68,8 @@ internal override void Display()
8068
ImGui.PushStyleColor(ImGuiCol.Text, new Vector4(0.5f, 0.5f, 0.5f, 0.8f));
8169
}
8270

71+
var label = UserOrbitSettings.OrbitBodyTypeShortNames[idx];
72+
8373
if (ImGui.SmallButton($"{label}##filter-{type}"))
8474
{
8575
prefs.ToggleFilter(ViewKey, type);
@@ -89,7 +79,8 @@ internal override void Display()
8979

9080
if (ImGui.IsItemHovered())
9181
{
92-
ImGui.SetTooltip(isVisible ? $"Hide {tooltip}" : $"Show {tooltip}");
82+
var tip = UserOrbitSettings.OrbitBodyTypeTooltips[idx];
83+
ImGui.SetTooltip(isVisible ? $"Hide {tip}" : $"Show {tip}");
9384
}
9485
}
9586
}
@@ -99,6 +90,6 @@ internal override void Display()
9990
private float EstimateWidth()
10091
{
10192
// Rough estimate: each small button is ~16px + 2px spacing
102-
return Filters.Count * 18 + 8;
93+
return Utils.EnumEntries<UserOrbitSettings.OrbitBodyType>() * 18 + 8;
10394
}
10495
}

Pulsar4X/Pulsar4X.Client/Interface/Menus/SettingsWindow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ private void DisplayMapSettings()
416416
ImGui.Text("Map Settings");
417417
ImGui.Separator();
418418

419-
for (int i = 0; i < (int)UserOrbitSettings.OrbitBodyType.NumberOf; i++)
419+
for (int i = 0; i < Utils.EnumEntries<UserOrbitSettings.OrbitBodyType>(); i++)
420420
{
421421
UserOrbitSettings.OrbitBodyType otype = (UserOrbitSettings.OrbitBodyType)i;
422422
string typeStr = otype.ToString();
@@ -426,7 +426,7 @@ private void DisplayMapSettings()
426426
ImGui.SliderFloat("Draw Names at Zoom: ", ref _nameZoomLevel, 0.01f, 10000f);
427427
_uiState.DrawNameZoomLvl[otype] = _nameZoomLevel;
428428

429-
for (int j = 0; j < (int)UserOrbitSettings.OrbitTrajectoryType.NumberOf; j++)
429+
for (int j = 0; j < Utils.EnumEntries<UserOrbitSettings.OrbitTrajectoryType>(); j++)
430430
{
431431
UserOrbitSettings.OrbitTrajectoryType trtype = (UserOrbitSettings.OrbitTrajectoryType)j;
432432
string trtypeStr = trtype.ToString();

Pulsar4X/Pulsar4X.Client/Interface/Menus/SystemViewPreferences.cs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,6 @@ public View(string fileName, string displayName, int id)
3333

3434
private const string DefaultFileName = "default.ini";
3535

36-
readonly Dictionary<UserOrbitSettings.OrbitBodyType, string> FilterDisplayOptions = new ()
37-
{
38-
{ UserOrbitSettings.OrbitBodyType.Asteroid, "Asteroids" },
39-
{ UserOrbitSettings.OrbitBodyType.Colony, "Colonies" },
40-
{ UserOrbitSettings.OrbitBodyType.Comet, "Comets" },
41-
{ UserOrbitSettings.OrbitBodyType.Moon, "Moons" },
42-
{ UserOrbitSettings.OrbitBodyType.Planet, "Planets" },
43-
{ UserOrbitSettings.OrbitBodyType.DwarfPlanet, "Dwarf Planets" },
44-
{ UserOrbitSettings.OrbitBodyType.Ship, "Ships" },
45-
{ UserOrbitSettings.OrbitBodyType.Star, "Stars" },
46-
{ UserOrbitSettings.OrbitBodyType.Unknown, "Unknown Objects" }
47-
};
48-
4936
Dictionary<int, View> Views = new ();
5037
int _selectedEditorViewIndex = 0;
5138
string[]? _selectedEditorViewNames;
@@ -59,6 +46,8 @@ public string[] ViewNames
5946

6047
Dictionary<string, int> ViewIndexes { get; set; } = new ();
6148

49+
internal event EventHandler<View> ViewUpdateOccured;
50+
6251
public int GetViewIndex(string key)
6352
{
6453
if(!ViewIndexes.ContainsKey(key))
@@ -88,6 +77,7 @@ internal void ToggleFilter(string key, UserOrbitSettings.OrbitBodyType orbitBody
8877
var view = Views[viewIndex];
8978
view.FilterCheckmarks[orbitBodyType] = !view.FilterCheckmarks[orbitBodyType];
9079
SaveViewIni(view);
80+
ViewUpdateOccured?.Invoke(this, view);
9181
}
9282

9383
internal static SystemViewPreferences GetInstance()
@@ -350,6 +340,7 @@ internal override void Display()
350340
SaveViewIni(view);
351341
LoadAllIni();
352342
_showModal = false;
343+
ViewUpdateOccured?.Invoke(this, view);
353344
}, delegate
354345
{
355346
// Cancel was clicked
@@ -360,13 +351,17 @@ internal override void Display()
360351

361352
ImGui.Separator();
362353

363-
foreach((var bodyType, var displayName) in FilterDisplayOptions)
354+
foreach (UserOrbitSettings.OrbitBodyType type in Enum.GetValues(typeof(UserOrbitSettings.OrbitBodyType)))
364355
{
365-
bool isChecked = Views[_selectedEditorViewIndex].FilterCheckmarks[bodyType];
366-
if(ImGui.Checkbox(displayName, ref isChecked))
356+
var idx = (int)type;
357+
var tip = UserOrbitSettings.OrbitBodyTypeTooltips[idx];
358+
359+
bool isChecked = Views[_selectedEditorViewIndex].FilterCheckmarks[type];
360+
if(ImGui.Checkbox(tip, ref isChecked))
367361
{
368-
Views[_selectedEditorViewIndex].FilterCheckmarks[bodyType] = isChecked;
362+
Views[_selectedEditorViewIndex].FilterCheckmarks[type] = isChecked;
369363
SaveViewIni(Views[_selectedEditorViewIndex]);
364+
ViewUpdateOccured?.Invoke(this, Views[_selectedEditorViewIndex]);
370365
}
371366
}
372367
}
@@ -397,4 +392,4 @@ internal void DisplayCombo(string key, Action<int> onItemSelected)
397392
ImGui.EndCombo();
398393
}
399394
}
400-
}
395+
}

Pulsar4X/Pulsar4X.Client/Rendering/SystemMapRendering.cs

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal class SystemMapRendering : UpdateWindowState
4747
//internal SystemMap_DrawableVM SysMap;
4848
Entity? _faction;
4949

50-
bool _panned = false;
50+
bool _updateLabels = false;
5151

5252
internal SystemMapRendering(SDL3Window window, GlobalUIState state)
5353
{
@@ -172,7 +172,11 @@ internal SystemMapRendering(SDL3Window window, GlobalUIState state)
172172
}
173173
};
174174

175-
_camera.PanOccured += (object sender, Orbital.Vector3 pos) => _panned = true;
175+
_camera.PanOccured +=
176+
(object sender, Orbital.Vector3 pos) => _updateLabels = true;
177+
178+
SystemViewPreferences.GetInstance().ViewUpdateOccured +=
179+
(object sender, SystemViewPreferences.View view) => _updateLabels = true;
176180

177181
// should be empty
178182
_interactableGrouped = _interactable
@@ -210,7 +214,7 @@ internal void Initialize(StarSystem starSys)
210214
AddIconable(entityItem);
211215
}
212216

213-
_panned = true; // run HandlePan on first frame
217+
_updateLabels = true; // update labels on first frame
214218
}
215219

216220
public void UpdateSystemState(SystemState systemState)
@@ -511,18 +515,23 @@ internal void Update()
511515
foreach (var item in _allLabels)
512516
item.OnFrameUpdate(matrix, _camera);
513517

514-
if (_panned)
518+
if (_updateLabels)
515519
{
516-
_panned = false;
520+
_updateLabels = false;
521+
522+
var prefs = SystemViewPreferences.GetInstance();
517523

518524
foreach (var item in _interactable.Values)
519525
{
520526
foreach (var i in item)
521527
i.IsDisabled = true;
522528
}
523529

530+
var lbl = _allLabels
531+
.Where(x => prefs.ShouldDisplay("map", Utils.EntityBodyType(x.Entity)));
532+
524533
_visibleLabels.Clear();
525-
foreach (var i in _distributor(_allLabels))
534+
foreach (var i in _distributor(lbl))
526535
{
527536
foreach (var j in _interactable[i.Entity.Id])
528537
j.IsDisabled = false;
@@ -539,46 +548,18 @@ internal void Update()
539548

540549
internal void Draw()
541550
{
542-
DrawIcons(UIWidgets.Values.ToList());
543-
DrawFilteredIcons(_orbitRings);
544-
DrawFilteredIcons(_moveIcons);
545-
DrawFilteredIcons(_entityIcons);
546-
DrawFilteredIcons(_bodyIcons);
551+
DrawIcons(UIWidgets.Values);
552+
DrawIcons(_orbitRings.Values);
553+
DrawIcons(_moveIcons.Values);
554+
DrawIcons(_entityIcons.Values);
555+
DrawIcons(_bodyIcons.Values);
547556
DrawIcons(SelectedEntityExtras);
548557

549-
var prefs = SystemViewPreferences.GetInstance();
550-
551558
foreach (var i in _visibleLabels)
552-
{
553-
var type = Utils.EntityBodyType(i.Entity);
554-
if (!prefs.ShouldDisplay("map", type))
555-
continue;
556-
557559
i.Draw(_window.Renderer, _camera);
558-
}
559-
}
560-
561-
void DrawFilteredIcons(ConcurrentDictionary<int, Icon> icons)
562-
{
563-
if (_sysState == null)
564-
{
565-
foreach (var item in icons.Values)
566-
item.Draw(_window.Renderer, _camera);
567-
return;
568-
}
569-
570-
var prefs = SystemViewPreferences.GetInstance();
571-
foreach (var (entityId, item) in icons)
572-
{
573-
if (_sysState.EntityStatesWithPosition.TryGetValue(entityId, out var entityState)
574-
&& !prefs.ShouldDisplay("map", entityState.BodyType))
575-
continue;
576-
577-
item.Draw(_window.Renderer, _camera);
578-
}
579560
}
580561

581-
void DrawIcons(List<IDrawData> icons)
562+
void DrawIcons(IEnumerable<IDrawData> icons)
582563
{
583564
foreach (var item in icons)
584565
item.Draw(_window.Renderer, _camera);

Pulsar4X/Pulsar4X.Client/State/GlobalUIState.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ public class GlobalUIState
113113
// Maneuver node dragging
114114
private bool _isDraggingNode = false;
115115

116-
internal View? SelectedMapView { get; set; } = null;
117-
118116
// Game Settings
119117
internal GameSettings GameSettings { get; set; }
120118

@@ -139,10 +137,10 @@ internal GlobalUIState(SDL3Window viewport)
139137
DrawNameZoomLvl.Add(UserOrbitSettings.OrbitBodyType.Ship, 64f);
140138
DrawNameZoomLvl.Add(UserOrbitSettings.OrbitBodyType.Unknown, 16f);
141139

142-
for (int i = 0; i < (int)UserOrbitSettings.OrbitBodyType.NumberOf; i++)
140+
for (int i = 0; i < Utils.EnumEntries<UserOrbitSettings.OrbitBodyType>(); i++)
143141
{
144142
UserOrbitSettingsMtx.Add(new List<UserOrbitSettings>());
145-
for (int j = 0; j < (int)UserOrbitSettings.OrbitTrajectoryType.NumberOf; j++)
143+
for (int j = 0; j < Utils.EnumEntries<UserOrbitSettings.OrbitTrajectoryType>(); j++)
146144
{
147145
UserOrbitSettingsMtx[i].Add(new UserOrbitSettings());
148146
}

Pulsar4X/Pulsar4X.Client/State/UserOrbitSettings.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,32 @@ public class UserOrbitSettings
66
{
77
internal enum OrbitBodyType
88
{
9+
Unknown,
910
Star,
1011
Planet,
1112
DwarfPlanet,
1213
Moon,
1314
Asteroid,
1415
Comet,
1516
Colony,
16-
Ship,
17-
Unknown,
18-
19-
[Description("Number Of")]
20-
NumberOf
17+
Ship
2118
}
2219

20+
public static readonly string[] OrbitBodyTypeTooltips = new []
21+
{
22+
"Unknown", "Stars", "Planets", "Dwarf Planets", "Moons", "Asteroids",
23+
"Comets", "Colonies", "Ships"
24+
};
25+
26+
public static readonly string[] OrbitBodyTypeShortNames = new []
27+
{
28+
"?", "*", "P", "D", "M", "A", "C", "H", "S"
29+
};
30+
2331
internal enum OrbitTrajectoryType
2432
{
2533
Unknown,
34+
2635
[Description("An Elliptical Orbit")]
2736
Elliptical,
2837
Hyperbolic,
@@ -31,10 +40,7 @@ internal enum OrbitTrajectoryType
3140
NewtonionThrust,
3241

3342
[Description("Non-Newtonian Translation")]
34-
NonNewtonionTranslation,
35-
36-
[Description("Number Of")]
37-
NumberOf
43+
NonNewtonionTranslation
3844
}
3945
//the arc thats actualy drawn, ie we don't normaly draw a full 360 degree (6.28rad) orbit, but only
4046
//a section of it ie 3/4 of the orbit (4.71rad) and this is player adjustable.
@@ -54,4 +60,4 @@ internal enum OrbitTrajectoryType
5460
public byte MaxAlpha = 255;
5561
public byte MinAlpha = 0;
5662
public byte GhostOrbitAlpha = 20;
57-
}
63+
}

Pulsar4X/Pulsar4X.Client/Utils.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ namespace Pulsar4X.Client;
1313

1414
public static class Utils
1515
{
16+
public static int EnumEntries<T>() where T : struct, System.Enum =>
17+
Enum.GetNames(typeof(T)).Length;
18+
1619
public static byte[] BytesFromString(string str, int sizeMax = 128)
1720
{
1821
byte[] dstArray = new byte[sizeMax];

0 commit comments

Comments
 (0)