Skip to content

Commit 0ef1930

Browse files
committed
convert the leaderboard form as well
1 parent 8be6512 commit 0ef1930

File tree

7 files changed

+107
-38
lines changed

7 files changed

+107
-38
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ namespace BizHawk.Client.EmuHawk
44
{
55
public partial class RCheevos
66
{
7-
#if false
87
private readonly RCheevosLeaderboardListForm _lboardListForm = new();
9-
#endif
108

119
private sealed class LboardTriggerRequest : RCheevoHttpRequest
1210
{

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,13 @@ private void BuildMenu(ToolStripItemCollection raDropDownItems)
196196
};
197197
raDropDownItems.Add(viewCheevoListItem);
198198

199-
#if false
200199
var viewLboardListItem = new ToolStripMenuItem("View Leaderboard List");
201200
viewLboardListItem.Click += (_, _) =>
202201
{
203-
_lboardListForm.OnFrameAdvance(true);
202+
_lboardListForm.OnFrameAdvance();
204203
_lboardListForm.Show();
205204
};
206205
raDropDownItems.Add(viewLboardListItem);
207-
#endif
208206
}
209207

210208
protected override void HandleHardcoreModeDisable(string reason)
@@ -267,9 +265,7 @@ public override void Dispose()
267265
Stop();
268266
_gameInfoForm.Dispose();
269267
_cheevoListForm.Dispose();
270-
#if false
271268
_lboardListForm.Dispose();
272-
#endif
273269
_mainForm.QuicksaveLoad -= QuickLoadCallback;
274270
}
275271

@@ -455,9 +451,7 @@ public override void Restart()
455451

456452
_gameInfoForm.Restart(_gameData.Title, _gameData.TotalCheevoPoints(HardcoreMode), CurrentRichPresence ?? "N/A");
457453
_cheevoListForm.Restart(_gameData.GameID == 0 ? Array.Empty<Cheevo>() : _gameData.CheevoEnumerable, GetCheevoProgress, () => HardcoreMode);
458-
#if false
459454
_lboardListForm.Restart(_gameData.GameID == 0 ? Array.Empty<LBoard>() : _gameData.LBoardEnumerable);
460-
#endif
461455

462456
Update();
463457

@@ -710,12 +704,10 @@ public override void OnFrameAdvance()
710704
_cheevoListForm.OnFrameAdvance(HardcoreMode);
711705
}
712706

713-
#if false
714707
if (_lboardListForm.Visible)
715708
{
716709
_lboardListForm.OnFrameAdvance();
717710
}
718-
#endif
719711
}
720712
}
721713
}

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: 62 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,16 @@ 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;
4043
}
4144

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

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)