mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 20:15:35 -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 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-----------------------------------------------------*
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user