mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 20:15:35 -04:00
Fix clicking on column headers to sort not working
This commit is contained in:
parent
49ddd8bf68
commit
c168ff9e60
@ -641,7 +641,7 @@ static void PlayersColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args
|
|||||||
String_Format2(&args->Text, "%i/%i", &row->Players, &row->MaxPlayers);
|
String_Format2(&args->Text, "%i/%i", &row->Players, &row->MaxPlayers);
|
||||||
}
|
}
|
||||||
static int PlayersColumn_Sort(struct ServerInfo* a, struct ServerInfo* b) {
|
static int PlayersColumn_Sort(struct ServerInfo* a, struct ServerInfo* b) {
|
||||||
return b->Players - a->Players;
|
return a->Players - b->Players;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UptimeColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y) {
|
static void UptimeColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y) {
|
||||||
@ -658,7 +658,7 @@ static void UptimeColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args,
|
|||||||
String_Format2(&args->Text, "%i%r", &uptime, &unit);
|
String_Format2(&args->Text, "%i%r", &uptime, &unit);
|
||||||
}
|
}
|
||||||
static int UptimeColumn_Sort(struct ServerInfo* a, struct ServerInfo* b) {
|
static int UptimeColumn_Sort(struct ServerInfo* a, struct ServerInfo* b) {
|
||||||
return b->Uptime - a->Uptime;
|
return a->Uptime - b->Uptime;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SoftwareColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y) {
|
static void SoftwareColumn_Draw(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y) {
|
||||||
@ -669,14 +669,16 @@ static int SoftwareColumn_Sort(struct ServerInfo* a, struct ServerInfo* b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct LTableColumn tableColumns[5] = {
|
static struct LTableColumn tableColumns[5] = {
|
||||||
{ "", 15, FlagColumn_Draw, NULL, false },
|
{ "", 15, FlagColumn_Draw, NULL, false, false },
|
||||||
{ "Name", 320, NameColumn_Draw, NameColumn_Sort, true },
|
{ "Name", 320, NameColumn_Draw, NameColumn_Sort, true, true },
|
||||||
{ "Players", 65, PlayersColumn_Draw, PlayersColumn_Sort, true },
|
{ "Players", 65, PlayersColumn_Draw, PlayersColumn_Sort, true, true },
|
||||||
{ "Uptime", 65, UptimeColumn_Draw, UptimeColumn_Sort, true },
|
{ "Uptime", 65, UptimeColumn_Draw, UptimeColumn_Sort, true, true },
|
||||||
{ "Software", 140, SoftwareColumn_Draw, SoftwareColumn_Sort, false }
|
{ "Software", 140, SoftwareColumn_Draw, SoftwareColumn_Sort, false, true }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define LTable_Get(row) (&FetchServersTask.Servers[FetchServersTask.Servers[row]._order])
|
#define LTable_Get(row) (&FetchServersTask.Servers[FetchServersTask.Servers[row]._order])
|
||||||
|
static int sortingCol = -1;
|
||||||
|
|
||||||
/* Works out top and height of the scrollbar */
|
/* Works out top and height of the scrollbar */
|
||||||
static void LTable_GetScrollbarCoords(struct LTable* w, int* y, int* height) {
|
static void LTable_GetScrollbarCoords(struct LTable* w, int* y, int* height) {
|
||||||
@ -928,10 +930,14 @@ static void LTable_HeadersClick(struct LTable* w) {
|
|||||||
|
|
||||||
for (i = 0, x = w->X; i < w->NumColumns; i++) {
|
for (i = 0, x = w->X; i < w->NumColumns; i++) {
|
||||||
if (mouseX >= x && mouseX < (x + w->Columns[i].Width) && w->Columns[i].Interactable) {
|
if (mouseX >= x && mouseX < (x + w->Columns[i].Width) && w->Columns[i].Interactable) {
|
||||||
/* TODO: Fix this.. */
|
sortingCol = i;
|
||||||
//LTable_Sort(w);
|
LTable_Sort(w);
|
||||||
|
w->Columns[i].InvertSort = !w->Columns[i].InvertSort;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
x += w->Columns[i].Width;
|
||||||
|
if (w->Columns[i].ColumnGridline) x += GRIDLINE_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,12 +970,6 @@ static void LTable_MouseDown(struct LTable* w, bool wasSelected) {
|
|||||||
LWidget_Draw(w);
|
LWidget_Draw(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default sort order. (most active server, then by highest uptime) */
|
|
||||||
static int LTable_DefaultSort(struct ServerInfo* a, struct ServerInfo* b) {
|
|
||||||
if (a->Players != b->Players) return b->Players - a->Players;
|
|
||||||
return b->Uptime - a->Uptime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stops an in-progress dragging of resizing column. */
|
/* Stops an in-progress dragging of resizing column. */
|
||||||
static void LTable_StopDragging(struct LTable* table) {
|
static void LTable_StopDragging(struct LTable* table) {
|
||||||
table->DraggingColumn = -1;
|
table->DraggingColumn = -1;
|
||||||
@ -1018,8 +1018,8 @@ void LTable_Reset(struct LTable* w) {
|
|||||||
LTable_StopDragging(w);
|
LTable_StopDragging(w);
|
||||||
LTable_Reposition(w);
|
LTable_Reposition(w);
|
||||||
|
|
||||||
w->TopRow = 0;
|
w->TopRow = 0;
|
||||||
w->Sorter = LTable_DefaultSort;
|
sortingCol = -1;
|
||||||
w->SelectedHash->length = 0;
|
w->SelectedHash->length = 0;
|
||||||
w->Filter->length = 0;
|
w->Filter->length = 0;
|
||||||
LTable_Sort(w);
|
LTable_Sort(w);
|
||||||
@ -1044,7 +1044,18 @@ void LTable_ApplyFilter(struct LTable* w) {
|
|||||||
LTable_ClampTopRow(w); /* TODO: may need to move this elsewhere */
|
LTable_ClampTopRow(w); /* TODO: may need to move this elsewhere */
|
||||||
}
|
}
|
||||||
|
|
||||||
static LTableSorter curSorter;
|
static int LTable_SortOrder(struct ServerInfo* a, struct ServerInfo* b) {
|
||||||
|
int order;
|
||||||
|
if (sortingCol >= 0) {
|
||||||
|
order = tableColumns[sortingCol].SortOrder(a, b);
|
||||||
|
return tableColumns[sortingCol].InvertSort ? -order : order;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default sort order. (most active server, then by highest uptime) */
|
||||||
|
if (a->Players != b->Players) return a->Players - b->Players;
|
||||||
|
return a->Uptime - b->Uptime;
|
||||||
|
}
|
||||||
|
|
||||||
static void LTable_QuickSort(int left, int right) {
|
static void LTable_QuickSort(int left, int right) {
|
||||||
uint16_t* keys = FetchServersTask.Orders; uint16_t key;
|
uint16_t* keys = FetchServersTask.Orders; uint16_t key;
|
||||||
struct ServerInfo* values = FetchServersTask.Servers;
|
struct ServerInfo* values = FetchServersTask.Servers;
|
||||||
@ -1055,8 +1066,8 @@ static void LTable_QuickSort(int left, int right) {
|
|||||||
|
|
||||||
/* partition the list */
|
/* partition the list */
|
||||||
while (i <= j) {
|
while (i <= j) {
|
||||||
while (curSorter(mid, &values[keys[i]]) < 0) i++;
|
while (LTable_SortOrder(mid, &values[keys[i]]) < 0) i++;
|
||||||
while (curSorter(mid, &values[keys[j]]) > 0) j--;
|
while (LTable_SortOrder(mid, &values[keys[j]]) > 0) j--;
|
||||||
QuickSort_Swap_Maybe();
|
QuickSort_Swap_Maybe();
|
||||||
}
|
}
|
||||||
/* recurse into the smaller subset */
|
/* recurse into the smaller subset */
|
||||||
@ -1067,7 +1078,6 @@ 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();
|
FetchServersTask_ResetOrder();
|
||||||
curSorter = w->Sorter;
|
|
||||||
LTable_QuickSort(0, FetchServersTask.NumServers - 1);
|
LTable_QuickSort(0, FetchServersTask.NumServers - 1);
|
||||||
|
|
||||||
LTable_ApplyFilter(w);
|
LTable_ApplyFilter(w);
|
||||||
|
@ -113,8 +113,6 @@ CC_NOINLINE void LSlider_Init(struct LSlider* w, int width, int height);
|
|||||||
|
|
||||||
struct ServerInfo;
|
struct ServerInfo;
|
||||||
struct DrawTextArgs;
|
struct DrawTextArgs;
|
||||||
/* Returns sort order of two rows/server entries. */
|
|
||||||
typedef int (*LTableSorter)(struct ServerInfo* a, struct ServerInfo* b);
|
|
||||||
|
|
||||||
struct LTableColumn {
|
struct LTableColumn {
|
||||||
/* Name of this column. */
|
/* Name of this column. */
|
||||||
@ -125,8 +123,8 @@ struct LTableColumn {
|
|||||||
/* If args.Text is changed to something, that text gets drawn afterwards. */
|
/* If args.Text is changed to something, that text gets drawn afterwards. */
|
||||||
/* Most of the time that's all you need to do. */
|
/* Most of the time that's all you need to do. */
|
||||||
void (*DrawRow)(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y);
|
void (*DrawRow)(struct ServerInfo* row, struct DrawTextArgs* args, int x, int y);
|
||||||
/* Sorts two rows based on value of this column in both rows. */
|
/* Returns sort order of two rows, based on value of this column in both rows. */
|
||||||
LTableSorter SortRows;
|
int (*SortOrder)(struct ServerInfo* a, struct ServerInfo* b);
|
||||||
/* Whether a vertical gridline (and padding) appears after this. */
|
/* Whether a vertical gridline (and padding) appears after this. */
|
||||||
bool ColumnGridline;
|
bool ColumnGridline;
|
||||||
/* Whether user can interact with this column. */
|
/* Whether user can interact with this column. */
|
||||||
@ -155,8 +153,6 @@ struct LTable {
|
|||||||
int RowsCount;
|
int RowsCount;
|
||||||
/* Index of top row currently visible. */
|
/* Index of top row currently visible. */
|
||||||
int TopRow;
|
int TopRow;
|
||||||
/* Comparison function used to sort rows. */
|
|
||||||
LTableSorter Sorter;
|
|
||||||
|
|
||||||
/* Hash of the currently selected server. */
|
/* Hash of the currently selected server. */
|
||||||
String* SelectedHash;
|
String* SelectedHash;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user