Fix sorting of servers list not working

This commit is contained in:
UnknownShadow200 2018-12-29 09:56:36 +11:00
parent e97d2f12d2
commit 49ddd8bf68
3 changed files with 33 additions and 16 deletions

View File

@ -314,13 +314,13 @@ struct FetchServerData FetchServerTask;
static struct ServerInfo* curServer; static struct ServerInfo* curServer;
static void ServerInfo_Init(struct ServerInfo* info) { static void ServerInfo_Init(struct ServerInfo* info) {
String_InitArray(info->Hash, info->_Buffer[0]); String_InitArray(info->Hash, info->_hashBuffer);
String_InitArray(info->Name, info->_Buffer[1]); String_InitArray(info->Name, info->_nameBuffer);
String_InitArray(info->IP, info->_Buffer[2]); String_InitArray(info->IP, info->_ipBuffer);
String_InitArray(info->Mppass, info->_Buffer[3]); String_InitArray(info->Mppass, info->_mppassBuffer);
String_InitArray(info->Software, info->_Buffer[4]); String_InitArray(info->Software, info->_softBuffer);
String_InitArray(info->Country, info->_Buffer[5]); String_InitArray(info->Country, info->_countryBuffer);
info->Players = 0; info->Players = 0;
info->MaxPlayers = 0; info->MaxPlayers = 0;
@ -398,6 +398,7 @@ static void FetchServersTask_Handle(uint8_t* data, uint32_t len) {
if (FetchServersTask.NumServers <= 0) return; if (FetchServersTask.NumServers <= 0) return;
FetchServersTask.Servers = Mem_Alloc(FetchServersTask.NumServers, sizeof(struct ServerInfo), "servers list"); FetchServersTask.Servers = Mem_Alloc(FetchServersTask.NumServers, sizeof(struct ServerInfo), "servers list");
FetchServersTask.Orders = Mem_Alloc(FetchServersTask.NumServers, 2, "servers order");
/* -2 because servers is surrounded by a { */ /* -2 because servers is surrounded by a { */
curServer = FetchServersTask.Servers - 2; curServer = FetchServersTask.Servers - 2;
@ -411,14 +412,24 @@ void FetchServersTask_Run(void) {
LWebTask_Reset(&FetchServersTask.Base); LWebTask_Reset(&FetchServersTask.Base);
Mem_Free(FetchServersTask.Servers); Mem_Free(FetchServersTask.Servers);
FetchServersTask.Servers = NULL; Mem_Free(FetchServersTask.Orders);
FetchServersTask.NumServers = 0; FetchServersTask.NumServers = 0;
FetchServersTask.Servers = NULL;
FetchServersTask.Orders = NULL;
FetchServersTask.Base.Identifier = id; FetchServersTask.Base.Identifier = id;
Http_AsyncGetData(&url, false, &id); Http_AsyncGetData(&url, false, &id);
FetchServersTask.Base.Handle = FetchServersTask_Handle; FetchServersTask.Base.Handle = FetchServersTask_Handle;
} }
void FetchServersTask_ResetOrder(void) {
int i;
for (i = 0; i < FetchServersTask.NumServers; i++) {
FetchServersTask.Orders[i] = i;
}
}
/*########################################################################################################################* /*########################################################################################################################*
*-----------------------------------------------------CheckUpdateTask-----------------------------------------------------* *-----------------------------------------------------CheckUpdateTask-----------------------------------------------------*

View File

@ -34,8 +34,10 @@ struct ServerInfo {
String Hash, Name, IP, Mppass, Software, Country; String Hash, Name, IP, Mppass, Software, Country;
int Players, MaxPlayers, Port, Uptime; int Players, MaxPlayers, Port, Uptime;
bool Featured; bool Featured;
char _Buffer[6][STRING_SIZE]; int _order; /* (internal) order in servers table after filtering */
int _order; /* (internal) order in servers table */ char _hashBuffer[32], _nameBuffer[STRING_SIZE];
char _ipBuffer[16], _mppassBuffer[STRING_SIZE];
char _countryBuffer[8], _softBuffer[STRING_SIZE];
}; };
struct LWebTask; struct LWebTask;
@ -79,9 +81,11 @@ void FetchServerTask_Run(const String* hash);
extern struct FetchServersData { extern struct FetchServersData {
struct LWebTask Base; struct LWebTask Base;
struct ServerInfo* Servers; /* List of all public servers on server list. */ struct ServerInfo* Servers; /* List of all public servers on server list. */
uint16_t* Orders; /* Order of each server (after sorting) */
int NumServers; /* Number of public servers. */ int NumServers; /* Number of public servers. */
} FetchServersTask; } FetchServersTask;
void FetchServersTask_Run(void); void FetchServersTask_Run(void);
void FetchServersTask_ResetOrder(void);
extern struct CheckUpdateData { extern struct CheckUpdateData {

View File

@ -1023,7 +1023,6 @@ void LTable_Reset(struct LTable* w) {
w->SelectedHash->length = 0; w->SelectedHash->length = 0;
w->Filter->length = 0; w->Filter->length = 0;
LTable_Sort(w); LTable_Sort(w);
LTable_ApplyFilter(w);
} }
void LTable_ApplyFilter(struct LTable* w) { void LTable_ApplyFilter(struct LTable* w) {
@ -1032,7 +1031,7 @@ void LTable_ApplyFilter(struct LTable* w) {
count = FetchServersTask.NumServers; count = FetchServersTask.NumServers;
for (i = 0, j = 0; i < count; i++) { for (i = 0, j = 0; i < count; i++) {
if (String_CaselessContains(&FetchServersTask.Servers[i].Name, w->Filter)) { if (String_CaselessContains(&FetchServersTask.Servers[i].Name, w->Filter)) {
FetchServersTask.Servers[j++]._order = i; FetchServersTask.Servers[j++]._order = FetchServersTask.Orders[i];
} }
} }
@ -1047,16 +1046,17 @@ void LTable_ApplyFilter(struct LTable* w) {
static LTableSorter curSorter; static LTableSorter curSorter;
static void LTable_QuickSort(int left, int right) { static void LTable_QuickSort(int left, int right) {
struct ServerInfo* keys = FetchServersTask.Servers; struct ServerInfo key; uint16_t* keys = FetchServersTask.Orders; uint16_t key;
struct ServerInfo* values = FetchServersTask.Servers;
while (left < right) { while (left < right) {
int i = left, j = right; int i = left, j = right;
struct ServerInfo* mid = &keys[(i + j) >> 1]; struct ServerInfo* mid = &values[keys[(i + j) >> 1]];
/* partition the list */ /* partition the list */
while (i <= j) { while (i <= j) {
while (curSorter(mid, &keys[i]) < 0) i++; while (curSorter(mid, &values[keys[i]]) < 0) i++;
while (curSorter(mid, &keys[j]) > 0) j--; while (curSorter(mid, &values[keys[j]]) > 0) j--;
QuickSort_Swap_Maybe(); QuickSort_Swap_Maybe();
} }
/* recurse into the smaller subset */ /* recurse into the smaller subset */
@ -1066,10 +1066,12 @@ static void LTable_QuickSort(int left, int right) {
void LTable_Sort(struct LTable* w) { void LTable_Sort(struct LTable* w) {
if (!FetchServersTask.NumServers) return; if (!FetchServersTask.NumServers) return;
FetchServersTask_ResetOrder();
curSorter = w->Sorter; curSorter = w->Sorter;
//LTable_QuickSort(0, FetchServersTask.NumServers - 1); LTable_QuickSort(0, FetchServersTask.NumServers - 1);
LTable_ApplyFilter(w); LTable_ApplyFilter(w);
LTable_ShowSelected(w);
} }
void LTable_ShowSelected(struct LTable* w) { void LTable_ShowSelected(struct LTable* w) {