mirror of https://github.com/OpenTTD/OpenTTD
(svn r13521) -Codechange: Use GUIList sorting instead of poll & sort for CompanyLeagueWindow
parent
704c9be0b8
commit
1ddafcadd2
|
@ -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;
|
||||
|
||||
struct CompanyLeagueWindow : Window {
|
||||
this->players.Clear();
|
||||
|
||||
const Player *p;
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active) {
|
||||
*this->players.Append() = p;
|
||||
}
|
||||
}
|
||||
|
||||
this->players.Compact();
|
||||
this->players.RebuildDone();
|
||||
}
|
||||
|
||||
/** 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();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue