Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions src/LiveSplit.Splits/UI/Components/LabelsComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class LabelsComponent : IComponent

public IEnumerable<ColumnData> ColumnsList { get; set; }
public IList<SimpleLabel> LabelsList { get; set; }
protected List<float> ColumnWidths { get; }
protected List<(int exLength, float exWidth, float width)> ColumnWidths { get; }

public float PaddingTop => 0f;
public float PaddingLeft => 0f;
Expand All @@ -35,7 +35,7 @@ public class LabelsComponent : IComponent
public float MinimumHeight { get; set; }

public IDictionary<string, Action> ContextMenuControls => null;
public LabelsComponent(SplitsSettings settings, IEnumerable<ColumnData> columns, List<float> columnWidths)
public LabelsComponent(SplitsSettings settings, IEnumerable<ColumnData> columns, List<(int exLength, float exWidth, float width)> columnWidths)
{
Settings = settings;
MinimumHeight = 31;
Expand Down Expand Up @@ -69,13 +69,13 @@ private void DrawGeneral(Graphics g, LiveSplitState state, float width, float he
{
while (ColumnWidths.Count < LabelsList.Count)
{
ColumnWidths.Add(0f);
ColumnWidths.Add((0, 0f, 0f));
}

float curX = width - 7;
foreach (SimpleLabel label in LabelsList.Reverse())
{
float labelWidth = ColumnWidths[LabelsList.IndexOf(label)];
float labelWidth = ColumnWidths[LabelsList.IndexOf(label)].width;

curX -= labelWidth + 5;
label.Width = labelWidth;
Expand Down Expand Up @@ -165,9 +165,14 @@ public void Update(IInvalidator invalidator, LiveSplitState state, float width,

Cache.Restart();
Cache["ColumnsCount"] = ColumnsList.Count();
foreach (SimpleLabel label in LabelsList)
for (int index = 0; index < LabelsList.Count; index++)
{
Cache["Columns" + LabelsList.IndexOf(label) + "Text"] = label.Text;
SimpleLabel label = LabelsList[index];
Cache["Columns" + index + "Text"] = label.Text;
if (index < ColumnWidths.Count)
{
Cache["Columns" + index + "Width"] = ColumnWidths[index].width;
}
}

if (invalidator != null && (Cache.HasChanged || FrameCount > 1))
Expand Down
17 changes: 11 additions & 6 deletions src/LiveSplit.Splits/UI/Components/SplitComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class SplitComponent : IComponent

public IEnumerable<ColumnData> ColumnsList { get; set; }
public IList<SimpleLabel> LabelsList { get; set; }
protected List<float> ColumnWidths { get; }
protected List<(int exLength, float exWidth, float width)> ColumnWidths { get; }

public float VerticalHeight { get; set; }

Expand All @@ -59,7 +59,7 @@ public float HorizontalWidth

public IDictionary<string, Action> ContextMenuControls => null;

public SplitComponent(SplitsSettings settings, IEnumerable<ColumnData> columnsList, List<float> columnWidths)
public SplitComponent(SplitsSettings settings, IEnumerable<ColumnData> columnsList, List<(int exLength, float exWidth, float width)> columnWidths)
{
NameLabel = new SimpleLabel()
{
Expand Down Expand Up @@ -218,14 +218,15 @@ private void DrawGeneral(Graphics g, LiveSplitState state, float width, float he
{
while (ColumnWidths.Count < LabelsList.Count)
{
ColumnWidths.Add(0f);
ColumnWidths.Add((0, 0f, 0f));
}

float curX = width - 7;
float nameX = width - 7;
foreach (SimpleLabel label in LabelsList.Reverse())
{
float labelWidth = ColumnWidths[LabelsList.IndexOf(label)];
int i = LabelsList.IndexOf(label);
float labelWidth = ColumnWidths[i].width;

label.Width = labelWidth + 20;
curX -= labelWidth + 5;
Expand All @@ -239,6 +240,10 @@ private void DrawGeneral(Graphics g, LiveSplitState state, float width, float he
if (!string.IsNullOrEmpty(label.Text))
{
nameX = curX + labelWidth + 5 - label.ActualWidth;
if (ColumnWidths[i].exWidth < label.ActualWidth)
{
ColumnWidths[i] = (label.Text.Length, label.ActualWidth, labelWidth);
}
}
}

Expand Down Expand Up @@ -507,7 +512,7 @@ protected float CalculateLabelsWidth()
{
if (ColumnWidths != null)
{
return ColumnWidths.Sum() + (5 * ColumnWidths.Count());
return ColumnWidths.Sum(e => e.width) + (5 * ColumnWidths.Count());
}

return 0f;
Expand Down Expand Up @@ -565,7 +570,7 @@ public void Update(IInvalidator invalidator, LiveSplitState state, float width,
Cache["Columns" + index + "Color"] = label.ForeColor.ToArgb();
if (index < ColumnWidths.Count)
{
Cache["Columns" + index + "Width"] = ColumnWidths[index];
Cache["Columns" + index + "Width"] = ColumnWidths[index].width;
}
}

Expand Down
57 changes: 47 additions & 10 deletions src/LiveSplit.Splits/UI/Components/SplitsComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class SplitsComponent : IComponent
protected Color OldShadowsColor { get; set; }

protected IEnumerable<ColumnData> ColumnsList => Settings.ColumnsList.Select(x => x.Data);
protected List<float> ColumnWidths { get; set; }
protected List<(int exLength, float exWidth, float width)> ColumnWidths { get; set; }

public string ComponentName => "Splits";

Expand Down Expand Up @@ -77,7 +77,7 @@ public SplitsComponent(LiveSplitState state)
visualSplitCount = Settings.VisualSplitCount;
settingsSplitCount = Settings.VisualSplitCount;
Settings.SplitLayoutChanged += Settings_SplitLayoutChanged;
ColumnWidths = Settings.ColumnsList.Select(_ => 0f).ToList();
ColumnWidths = Settings.ColumnsList.Select(_ => (0, 0f, 0f)).ToList();
ScrollOffset = 0;
RebuildVisualSplits();
state.ComparisonRenamed += state_ComparisonRenamed;
Expand Down Expand Up @@ -412,41 +412,78 @@ private void CalculateColumnWidths(IRun run)
{
while (ColumnWidths.Count < ColumnsList.Count())
{
ColumnWidths.Add(0f);
ColumnWidths.Add((0, 0f, 0f));
}

TimeSpan longestTime = new TimeSpan(9, 0, 0);
TimeSpan longestDelta = new TimeSpan(0, 0, 59, 0);
foreach (ISegment split in run.Reverse())
{
if (split.SplitTime.RealTime is TimeSpan splitRealTime && longestTime < splitRealTime)
{
longestTime = splitRealTime;
}

foreach (KeyValuePair<string, Time> kv in split.Comparisons)
{
if (kv.Value.RealTime is TimeSpan cmpRealTime && longestTime < cmpRealTime)
{
longestTime = cmpRealTime;
}

if (split.SplitTime.RealTime - kv.Value.RealTime is TimeSpan deltaRealTime)
{
if (longestDelta < deltaRealTime)
{
longestDelta = deltaRealTime;
}
else if (longestDelta < (- deltaRealTime))
{
longestDelta = - deltaRealTime;
}
}
}
}

int timeLength = TimeFormatter.Format(longestTime).Length;
int deltaLength = DeltaTimeFormatter.Format(longestDelta).Length;
float timeCharWidth = MeasureTimeLabel.Text.Length > 0 ? MeasureTimeLabel.ActualWidth / MeasureTimeLabel.Text.Length : MeasureCharLabel.ActualWidth;
float timeWidth = Math.Max(MeasureTimeLabel.ActualWidth, timeCharWidth * (timeLength + 1));
float deltaWidth = Math.Max(MeasureDeltaLabel.ActualWidth, timeCharWidth * (deltaLength + 1));

for (int i = 0; i < ColumnsList.Count(); i++)
{
ColumnData column = ColumnsList.ElementAt(i);

float labelWidth = 0f;
if (column.Type is ColumnType.DeltaorSplitTime or ColumnType.SegmentDeltaorSegmentTime)
{
labelWidth = Math.Max(MeasureDeltaLabel.ActualWidth, MeasureTimeLabel.ActualWidth);
labelWidth = Math.Max(deltaWidth, timeWidth);
}
else if (column.Type is ColumnType.Delta or ColumnType.SegmentDelta)
{
labelWidth = MeasureDeltaLabel.ActualWidth;
labelWidth = deltaWidth;
}
else if (column.Type is ColumnType.SplitTime or ColumnType.SegmentTime)
{
labelWidth = MeasureTimeLabel.ActualWidth;
labelWidth = timeWidth;
}
else if (column.Type is ColumnType.CustomVariable)
{
int longest_length = run.Metadata.CustomVariableValue(column.Name).Length;
int longestLength = run.Metadata.CustomVariableValue(column.Name).Length;
foreach (ISegment split in run)
{
if (split.CustomVariableValues.TryGetValue(column.Name, out string value) && !string.IsNullOrEmpty(value))
{
longest_length = Math.Max(longest_length, value.Length);
longestLength = Math.Max(longestLength, value.Length);
}
}

labelWidth = MeasureCharLabel.ActualWidth * longest_length;
float exCharWidth = ColumnWidths[i].exLength > 0 ? ColumnWidths[i].exWidth / ColumnWidths[i].exLength : MeasureCharLabel.ActualWidth;
labelWidth = exCharWidth * (longestLength + 1);
}

ColumnWidths[i] = labelWidth;
ColumnWidths[i] = (ColumnWidths[i].exLength, ColumnWidths[i].exWidth, labelWidth);
}
}
}
Expand Down