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

View File

@ -34,8 +34,10 @@ struct ServerInfo {
String Hash, Name, IP, Mppass, Software, Country;
int Players, MaxPlayers, Port, Uptime;
bool Featured;
char _Buffer[6][STRING_SIZE];
int _order; /* (internal) order in servers table */
int _order; /* (internal) order in servers table after filtering */
char _hashBuffer[32], _nameBuffer[STRING_SIZE];
char _ipBuffer[16], _mppassBuffer[STRING_SIZE];
char _countryBuffer[8], _softBuffer[STRING_SIZE];
};
struct LWebTask;
@ -79,9 +81,11 @@ void FetchServerTask_Run(const String* hash);
extern struct FetchServersData {
struct LWebTask Base;
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. */
} FetchServersTask;
void FetchServersTask_Run(void);
void FetchServersTask_ResetOrder(void);
extern struct CheckUpdateData {

View File

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