summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/graph_gui.cpp69
-rw-r--r--src/players.cpp2
2 files changed, 55 insertions, 16 deletions
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp
index 69264ec9b..41a71ef5f 100644
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -16,6 +16,7 @@
#include "window_func.h"
#include "date_func.h"
#include "gfx_func.h"
+#include "sortlist_type.h"
#include "table/strings.h"
#include "table/sprites.h"
@@ -758,34 +759,54 @@ static inline StringID GetPerformanceTitleFromValue(uint value)
return _performance_titles[minu(value, 1000) >> 6];
}
-static int CDECL PerfHistComp(const void* elem1, const void* elem2)
-{
- const Player* p1 = *(const Player* const*)elem1;
- const Player* p2 = *(const Player* const*)elem2;
+class CompanyLeagueWindow : public Window {
+private:
+ GUIList<const Player*> players;
- return p2->old_economy[1].performance_history - p1->old_economy[1].performance_history;
-}
+ /**
+ * (Re)Build the company league list
+ */
+ void BuildPlayerList()
+ {
+ if (!this->players.NeedRebuild()) return;
+
+ this->players.Clear();
+
+ const Player *p;
+ FOR_ALL_PLAYERS(p) {
+ if (p->is_active) {
+ *this->players.Append() = p;
+ }
+ }
+
+ this->players.Compact();
+ this->players.RebuildDone();
+ }
-struct CompanyLeagueWindow : Window {
+ /** Sort the company league by performance history */
+ static int CDECL PerformanceSorter(const Player* const *p1, const Player* const *p2)
+ {
+ return (*p2)->old_economy[1].performance_history - (*p1)->old_economy[1].performance_history;
+ }
+
+public:
CompanyLeagueWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
{
+ this->players.ForceRebuild();
+ this->players.NeedResort();
+
this->FindWindowPlacementAndResize(desc);
}
virtual void OnPaint()
{
- const Player *plist[MAX_PLAYERS];
- const Player *p;
+ this->BuildPlayerList();
+ this->players.Sort(&PerformanceSorter);
this->DrawWidgets();
- uint pl_num = 0;
- FOR_ALL_PLAYERS(p) if (p->is_active) plist[pl_num++] = p;
-
- qsort((void*)plist, pl_num, sizeof(*plist), PerfHistComp);
-
- for (uint i = 0; i != pl_num; i++) {
- p = plist[i];
+ for (uint i = 0; i != this->players.Length(); i++) {
+ const Player *p = this->players[i];
SetDParam(0, i + STR_01AC_1ST);
SetDParam(1, p->index);
SetDParam(2, p->index);
@@ -795,6 +816,22 @@ struct CompanyLeagueWindow : Window {
DrawPlayerIcon(p->index, 27, 16 + i * 10);
}
}
+
+ virtual void OnTick()
+ {
+ if (this->players.NeedResort()) {
+ this->SetDirty();
+ }
+ }
+
+ virtual void OnInvalidateData(int data)
+ {
+ if (data == 0) {
+ this->players.ForceRebuild();
+ } else {
+ this->players.ForceResort();
+ }
+ }
};
diff --git a/src/players.cpp b/src/players.cpp
index a024cd47a..c568b603d 100644
--- a/src/players.cpp
+++ b/src/players.cpp
@@ -818,6 +818,8 @@ CommandCost CmdPlayerCtrl(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
if (flags & DC_EXEC) _current_player = OWNER_NONE;
+ InvalidateWindowData(WC_COMPANY_LEAGUE, 0, 0);
+
switch (p1) {
case 0: { /* Create a new player */
/* Joining Client: