mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 12:05:14 -04:00
Fix sorting of servers list not working
This commit is contained in:
parent
e97d2f12d2
commit
49ddd8bf68
25
src/LWeb.c
25
src/LWeb.c
@ -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-----------------------------------------------------*
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user