Skip to content

Commit af42776

Browse files
committed
convert the leaderboard form as well
1 parent 45f54ef commit af42776

File tree

6 files changed

+108
-28
lines changed

6 files changed

+108
-28
lines changed

src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ private void BuildMenu(ToolStripItemCollection raDropDownItems)
200200
var viewLboardListItem = new ToolStripMenuItem("View Leaderboard List");
201201
viewLboardListItem.Click += (_, _) =>
202202
{
203-
_lboardListForm.OnFrameAdvance(true);
203+
_lboardListForm.OnFrameAdvance();
204204
_lboardListForm.Show();
205205
};
206206
raDropDownItems.Add(viewLboardListItem);

src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementListForm.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace BizHawk.Client.EmuHawk
1111
public partial class RCheevosAchievementListForm : Form
1212
{
1313
private RCheevos.Cheevo[] _cheevos;
14-
private RCheevosAchievementForm[] _cheevoForms;
14+
private RCheevosAchievementForm[] _cheevoForms = [ ];
1515
private Func<uint, string> _getCheevoProgress;
1616
private Func<bool> _isHardcodeMode;
1717

@@ -21,7 +21,6 @@ public RCheevosAchievementListForm()
2121
{
2222
InitializeComponent();
2323
FormClosing += RCheevosAchievementListForm_FormClosing;
24-
_cheevoForms = Array.Empty<RCheevosAchievementForm>();
2524
using var temp = new RCheevosAchievementForm(null);
2625
_controlHeight = temp.Height + temp.Margin.Bottom + temp.Margin.Top;
2726
flowLayoutPanel1.BoundScrollBar = vScrollBar1;

src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLeaderboardForm.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,32 @@ namespace BizHawk.Client.EmuHawk
77
/// </summary>
88
public partial class RCheevosLeaderboardForm : Form
99
{
10-
private readonly RCheevos.LBoard _lboard;
10+
private RCheevos.LBoard _lboard;
1111

12-
public RCheevosLeaderboardForm(RCheevos.LBoard lboard)
12+
public RCheevosLeaderboardForm()
1313
{
1414
InitializeComponent();
15+
TopLevel = false;
16+
Show();
17+
}
18+
19+
public bool UpdateLBoard(RCheevos.LBoard lboard)
20+
{
21+
bool updated = _lboard != lboard;
22+
23+
_lboard = lboard;
24+
1525
titleBox.Text = lboard.Title;
1626
descriptionBox.Text = lboard.Description;
17-
scoreBox.Text = lboard.Score;
1827
lowerIsBetterBox.Checked = lboard.LowerIsBetter;
19-
_lboard = lboard;
20-
TopLevel = false;
21-
Show();
28+
29+
if (scoreBox.Text != _lboard.Score)
30+
{
31+
scoreBox.Text = _lboard.Score;
32+
updated = true;
33+
}
34+
35+
return updated;
2236
}
2337

2438
public void OnFrameAdvance()

src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLeaderboardListForm.Designer.cs

Lines changed: 19 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosLeaderboardListForm.cs

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Drawing;
23
using System.Linq;
34
using System.Windows.Forms;
45

@@ -9,18 +10,18 @@ namespace BizHawk.Client.EmuHawk
910
/// </summary>
1011
public partial class RCheevosLeaderboardListForm : Form
1112
{
12-
public bool IsShown { get; private set; }
13+
private RCheevos.LBoard[] _lboards;
14+
private RCheevosLeaderboardForm[] _lboardForms = [ ];
1315

14-
private RCheevosLeaderboardForm[] _lboardForms;
15-
private int _updateCooldown;
16+
private readonly int _controlHeight;
1617

1718
public RCheevosLeaderboardListForm()
1819
{
1920
InitializeComponent();
2021
FormClosing += RCheevosLeaderboardListForm_FormClosing;
21-
Shown += (_, _) => IsShown = true;
22-
_lboardForms = Array.Empty<RCheevosLeaderboardForm>();
23-
_updateCooldown = 5; // only update every 5 frames / 12 fps (as this is rather expensive to update)
22+
using var temp = new RCheevosLeaderboardForm();
23+
_controlHeight = temp.Height + temp.Margin.Bottom + temp.Margin.Top;
24+
flowLayoutPanel1.BoundScrollBar = vScrollBar1;
2425
}
2526

2627
private void DisposeLboardForms()
@@ -33,16 +34,17 @@ private void DisposeLboardForms()
3334

3435
public void Restart(IEnumerable<RCheevos.LBoard> lboards)
3536
{
37+
_lboards = lboards.ToArray();
3638
flowLayoutPanel1.Controls.Clear();
37-
DisposeLboardForms();
38-
_lboardForms = lboards.Select(lboard => new RCheevosLeaderboardForm(lboard)).ToArray();
39-
flowLayoutPanel1.Controls.AddRange(_lboardForms);
39+
40+
RCheevosLeaderboardListForm_SizeChanged(this, EventArgs.Empty);
41+
vScrollBar1.Value = 0;
42+
vScrollBar1.Maximum = _controlHeight * _lboards.Length;
43+
4044
}
4145

42-
public void OnFrameAdvance(bool forceUpdate = false)
46+
public void OnFrameAdvance()
4347
{
44-
if (--_updateCooldown > 0 && !forceUpdate) return;
45-
_updateCooldown = 5;
4648
foreach (var lb in _lboardForms)
4749
{
4850
lb.OnFrameAdvance();
@@ -53,7 +55,55 @@ private void RCheevosLeaderboardListForm_FormClosing(object sender, FormClosingE
5355
{
5456
Hide();
5557
e.Cancel = true;
56-
IsShown = false;
58+
}
59+
60+
private void UpdateForms()
61+
{
62+
int firstIndex = vScrollBar1.Value / _controlHeight;
63+
int indexOffset = vScrollBar1.Value % _controlHeight;
64+
while (firstIndex > _lboards.Length - _lboardForms.Length)
65+
{
66+
firstIndex--;
67+
indexOffset += _controlHeight;
68+
}
69+
flowLayoutPanel1.SuspendDrawing();
70+
flowLayoutPanel1.SuspendLayout();
71+
bool refresh = flowLayoutPanel1.AutoScrollPosition.Y != -indexOffset;
72+
for (int i = 0; i < _lboardForms.Length; i++)
73+
{
74+
refresh |= _lboardForms[i].UpdateLBoard(_lboards[firstIndex + i]);
75+
}
76+
flowLayoutPanel1.AutoScrollPosition = new Point(0, indexOffset);
77+
flowLayoutPanel1.ResumeLayout();
78+
flowLayoutPanel1.ResumeDrawing();
79+
if (refresh)
80+
{
81+
Refresh();
82+
}
83+
}
84+
85+
private void vScrollBar1_ValueChanged(object sender, EventArgs e) => UpdateForms();
86+
87+
private int DisplayedItems()
88+
{
89+
return Math.Min((int) Math.Ceiling((double) flowLayoutPanel1.Height / _controlHeight) + 1, _lboards.Length);
90+
}
91+
92+
private void RCheevosLeaderboardListForm_SizeChanged(object sender, EventArgs e)
93+
{
94+
if (flowLayoutPanel1.Controls.Count != DisplayedItems())
95+
{
96+
flowLayoutPanel1.Controls.Clear();
97+
DisposeLboardForms();
98+
_lboardForms = new RCheevosLeaderboardForm[DisplayedItems()];
99+
for (int i = 0; i < DisplayedItems(); i++)
100+
{
101+
_lboardForms[i] = new RCheevosLeaderboardForm();
102+
}
103+
flowLayoutPanel1.Controls.AddRange(_lboardForms);
104+
}
105+
106+
UpdateForms();
57107
}
58108
}
59109
}

src/BizHawk.WinForms.Controls/FLPs/VirtualizedFlowLayoutPanel.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Windows.Forms;
1+
using System.ComponentModel;
2+
using System.Windows.Forms;
23

34
using BizHawk.Common.NumberExtensions;
45

@@ -7,6 +8,8 @@ namespace BizHawk.Client.EmuHawk;
78
public class VirtualizedFlowLayoutPanel : FlowLayoutPanel
89
{
910
private VScrollBar? _boundScrollBar;
11+
[Browsable(false)]
12+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1013
public VScrollBar BoundScrollBar
1114
{
1215
get => _boundScrollBar!;

0 commit comments

Comments
 (0)