mirror of https://gitlab.com/nakst/essence
				
				
				
			introduce EsListViewFixedItemSortAll; use fixed item API in System Monitor
This commit is contained in:
		
							parent
							
								
									8a3bd28c92
								
							
						
					
					
						commit
						b5692266f7
					
				| 
						 | 
				
			
			@ -63,7 +63,7 @@ void _start() {
 | 
			
		|||
					"Age", -1,                                // Its title string.
 | 
			
		||||
					ES_LIST_VIEW_COLUMN_HAS_MENU              // Column header has a menu.
 | 
			
		||||
					| ES_TEXT_H_RIGHT                         // Align the text in the column to the right.
 | 
			
		||||
					| ES_DRAW_CONTENT_TABULAR                 // Use the tabular digits style, so that digits between items line up.
 | 
			
		||||
					| ES_DRAW_CONTENT_TABULAR                 // Use the tabular digits style, so that digits line up between rows.
 | 
			
		||||
					| ES_LIST_VIEW_COLUMN_FIXED_DATA_INTEGERS // We're storing integers in this column (the default is strings).
 | 
			
		||||
					| ES_LIST_VIEW_COLUMN_FIXED_SORT_SIZE,    // The items in the column can be sorted by their size.
 | 
			
		||||
					100);                                     // Initial width.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,13 @@ struct Instance : EsInstance {
 | 
			
		|||
#define DISPLAY_GENERAL_LOG (3)
 | 
			
		||||
#define DISPLAY_MEMORY (12)
 | 
			
		||||
 | 
			
		||||
#define PROCESSES_COLUMN_NAME    (0)
 | 
			
		||||
#define PROCESSES_COLUMN_PID     (1)
 | 
			
		||||
#define PROCESSES_COLUMN_MEMORY  (2)
 | 
			
		||||
#define PROCESSES_COLUMN_CPU     (3)
 | 
			
		||||
#define PROCESSES_COLUMN_HANDLES (4)
 | 
			
		||||
#define PROCESSES_COLUMN_THREADS (5)
 | 
			
		||||
 | 
			
		||||
const EsStyle styleMonospacedTextbox = {
 | 
			
		||||
	.inherit = ES_STYLE_TEXTBOX_NO_BORDER,
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +163,8 @@ void UpdateProcesses(Instance *instance) {
 | 
			
		|||
 | 
			
		||||
	for (uintptr_t i = 0; i < previous.Length(); i++) {
 | 
			
		||||
		if (!FindProcessByPID(processes, previous[i].data.pid)) {
 | 
			
		||||
			EsListViewRemove(instance->listViewProcesses, 0, i, 1);
 | 
			
		||||
			bool found = EsListViewFixedItemRemove(instance->listViewProcesses, previous[i].data.pid);
 | 
			
		||||
			EsAssert(found);
 | 
			
		||||
			previous.Delete(i--);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -194,11 +202,21 @@ void UpdateProcesses(Instance *instance) {
 | 
			
		|||
 | 
			
		||||
	for (uintptr_t i = 0; i < processes.Length(); i++) {
 | 
			
		||||
		if (!FindProcessByPID(previous, processes[i].data.pid)) {
 | 
			
		||||
			EsListViewInsert(instance->listViewProcesses, 0, i, 1);
 | 
			
		||||
			EsListViewIndex index = EsListViewFixedItemInsert(instance->listViewProcesses, processes[i].data.pid);
 | 
			
		||||
			EsAssert(index == (EsListViewIndex) i);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	EsListViewInvalidateAll(instance->listViewProcesses);
 | 
			
		||||
	for (uintptr_t i = 0; i < processes.Length(); i++) {
 | 
			
		||||
		EsListViewFixedItemSetString (instance->listViewProcesses, i, PROCESSES_COLUMN_NAME,    processes[i].data.name, processes[i].data.nameBytes);
 | 
			
		||||
		EsListViewFixedItemSetInteger(instance->listViewProcesses, i, PROCESSES_COLUMN_PID,     processes[i].data.pid);
 | 
			
		||||
		EsListViewFixedItemSetInteger(instance->listViewProcesses, i, PROCESSES_COLUMN_MEMORY,  processes[i].data.memoryUsage);
 | 
			
		||||
		EsListViewFixedItemSetInteger(instance->listViewProcesses, i, PROCESSES_COLUMN_CPU,     processes[i].cpuUsage);
 | 
			
		||||
		EsListViewFixedItemSetInteger(instance->listViewProcesses, i, PROCESSES_COLUMN_HANDLES, processes[i].data.handleCount);
 | 
			
		||||
		EsListViewFixedItemSetInteger(instance->listViewProcesses, i, PROCESSES_COLUMN_THREADS, processes[i].data.threadCount);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	EsListViewFixedItemSortAll(instance->listViewProcesses);
 | 
			
		||||
	EsCommandSetDisabled(&instance->commandTerminateProcess, selectedPID < 0 || !FindProcessByPID(processes, selectedPID));
 | 
			
		||||
 | 
			
		||||
	EsTimerSet(REFRESH_INTERVAL, [] (EsGeneric context) {
 | 
			
		||||
| 
						 | 
				
			
			@ -305,17 +323,7 @@ void UpdateDisplay(Instance *instance, int index) {
 | 
			
		|||
#define GET_CONTENT(...) EsBufferFormat(message->getContent.buffer, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
int ListViewProcessesCallback(EsElement *element, EsMessage *message) {
 | 
			
		||||
	if (message->type == ES_MSG_LIST_VIEW_GET_CONTENT) {
 | 
			
		||||
		int column = message->getContent.columnID, index = message->getContent.index;
 | 
			
		||||
		ProcessItem *item = &processes[index];
 | 
			
		||||
		if      (column == 0) GET_CONTENT("%s", item->data.nameBytes, item->data.name);
 | 
			
		||||
		else if (column == 1) { if (item->data.pid == -1) GET_CONTENT("n/a"); else GET_CONTENT("%d", item->data.pid); }
 | 
			
		||||
		else if (column == 2) GET_CONTENT("%D", item->data.memoryUsage);
 | 
			
		||||
		else if (column == 3) GET_CONTENT("%d%%", item->cpuUsage);
 | 
			
		||||
		else if (column == 4) GET_CONTENT("%d", item->data.handleCount);
 | 
			
		||||
		else if (column == 5) GET_CONTENT("%d", item->data.threadCount);
 | 
			
		||||
		else EsAssert(false);
 | 
			
		||||
	} else if (message->type == ES_MSG_LIST_VIEW_IS_SELECTED) {
 | 
			
		||||
	if (message->type == ES_MSG_LIST_VIEW_IS_SELECTED) {
 | 
			
		||||
		message->selectItem.isSelected = processes[message->selectItem.index].data.pid == selectedPID;
 | 
			
		||||
	} else if (message->type == ES_MSG_LIST_VIEW_SELECT && message->selectItem.isSelected) {
 | 
			
		||||
		selectedPID = processes[message->selectItem.index].data.pid;
 | 
			
		||||
| 
						 | 
				
			
			@ -370,16 +378,17 @@ void ProcessApplicationMessage(EsMessage *message) {
 | 
			
		|||
 | 
			
		||||
		instance->textboxGeneralLog = EsTextboxCreate(switcher, ES_TEXTBOX_MULTILINE | ES_CELL_FILL | ES_ELEMENT_DISABLED, &styleMonospacedTextbox);
 | 
			
		||||
 | 
			
		||||
		instance->listViewProcesses = EsListViewCreate(switcher, ES_CELL_FILL | ES_LIST_VIEW_COLUMNS | ES_LIST_VIEW_SINGLE_SELECT);
 | 
			
		||||
		instance->listViewProcesses = EsListViewCreate(switcher, ES_CELL_FILL | ES_LIST_VIEW_COLUMNS | ES_LIST_VIEW_SINGLE_SELECT | ES_LIST_VIEW_FIXED_ITEMS);
 | 
			
		||||
		instance->listViewProcesses->messageUser = ListViewProcessesCallback;
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 0, "Name", -1, 0, 150);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 1, "PID", -1, ES_TEXT_H_RIGHT, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 2, "Memory", -1, ES_TEXT_H_RIGHT, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 3, "CPU", -1, ES_TEXT_H_RIGHT, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 4, "Handles", -1, ES_TEXT_H_RIGHT, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, 5, "Threads", -1, ES_TEXT_H_RIGHT, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_NAME, "Name", -1, ES_LIST_VIEW_COLUMN_HAS_MENU, 150);
 | 
			
		||||
		uint32_t numericColumnFlags = ES_LIST_VIEW_COLUMN_HAS_MENU | ES_TEXT_H_RIGHT | ES_DRAW_CONTENT_TABULAR 
 | 
			
		||||
			| ES_LIST_VIEW_COLUMN_FIXED_DATA_INTEGERS | ES_LIST_VIEW_COLUMN_FIXED_SORT_SIZE;
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_PID, "PID", -1, numericColumnFlags, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_MEMORY, "Memory", -1, numericColumnFlags | ES_LIST_VIEW_COLUMN_FIXED_FORMAT_BYTES, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_CPU, "CPU", -1, numericColumnFlags | ES_LIST_VIEW_COLUMN_FIXED_FORMAT_PERCENTAGE, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_HANDLES, "Handles", -1, numericColumnFlags, 120);
 | 
			
		||||
		EsListViewRegisterColumn(instance->listViewProcesses, PROCESSES_COLUMN_THREADS, "Threads", -1, numericColumnFlags, 120);
 | 
			
		||||
		EsListViewAddAllColumns(instance->listViewProcesses);
 | 
			
		||||
		EsListViewInsertGroup(instance->listViewProcesses, 0);
 | 
			
		||||
 | 
			
		||||
		instance->panelMemoryStatistics = EsPanelCreate(switcher, 
 | 
			
		||||
				ES_CELL_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL | ES_PANEL_V_SCROLL_AUTO, &stylePanelMemoryStatistics);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,12 +11,11 @@
 | 
			
		|||
// TODO Close menus within menus (bug).
 | 
			
		||||
// TODO Keyboard navigation - menus; escape to restore default focus.
 | 
			
		||||
// TODO Middle click panning.
 | 
			
		||||
// TODO Scrollbar middle click and zooming; scroll wheel.
 | 
			
		||||
// TODO Scrollbar middle click and zooming.
 | 
			
		||||
// TODO Textboxes: date/time overlays, keyboard shortcut overlay, custom overlays.
 | 
			
		||||
// TODO Breadcrumb bar overflow menu; keep hover after recreating UI.
 | 
			
		||||
// TODO Textbox embedded objects.
 | 
			
		||||
// TODO Closing windows in menu/access key mode.
 | 
			
		||||
// TODO Ignore ES_MSG_LAYOUT in panels if layout.sizeChanged is false?
 | 
			
		||||
 | 
			
		||||
// Behaviour of activation clicks. --> Only ignore activation clicks from menus.
 | 
			
		||||
// Behaviour of the scroll wheel with regards to focused/hovered elements --> Scroll the hovered element only.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,8 @@ struct ListViewColumn {
 | 
			
		|||
	size_t enumStringCount;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef void (*ListViewSortFunction)(EsListViewIndex *, size_t, ListViewColumn *);
 | 
			
		||||
 | 
			
		||||
int ListViewProcessItemMessage(EsElement *element, EsMessage *message);
 | 
			
		||||
void ListViewSetSortAscending(EsMenu *menu, EsGeneric context);
 | 
			
		||||
void ListViewSetSortDescending(EsMenu *menu, EsGeneric context);
 | 
			
		||||
| 
						 | 
				
			
			@ -2582,6 +2584,42 @@ void EsListViewInvalidateContent(EsListView *view, EsListViewIndex group, EsList
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LIST_VIEW_SORT_FUNCTION(_name, _line) \
 | 
			
		||||
	ES_MACRO_SORT(_name, EsListViewIndex, { \
 | 
			
		||||
		ListViewFixedItemData *left = (ListViewFixedItemData *) &context->items[*_left]; \
 | 
			
		||||
		ListViewFixedItemData *right = (ListViewFixedItemData *) &context->items[*_right]; \
 | 
			
		||||
		result = _line; \
 | 
			
		||||
	}, ListViewColumn *)
 | 
			
		||||
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByStringsAscending, EsStringCompare(left->s.string, left->s.bytes, right->s.string, right->s.bytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByStringsDescending, -EsStringCompare(left->s.string, left->s.bytes, right->s.string, right->s.bytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByEnumsAscending, EsStringCompare(context->enumStrings[left->i].string, context->enumStrings[left->i].stringBytes, 
 | 
			
		||||
			context->enumStrings[right->i].string, context->enumStrings[right->i].stringBytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByEnumsDescending, -EsStringCompare(context->enumStrings[left->i].string, context->enumStrings[left->i].stringBytes, 
 | 
			
		||||
			context->enumStrings[right->i].string, context->enumStrings[right->i].stringBytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByIntegersAscending, left->i > right->i ? 1 : left->i == right->i ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByIntegersDescending, left->i < right->i ? 1 : left->i == right->i ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByDoublesAscending, left->d > right->d ? 1 : left->d == right->d ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByDoublesDescending, left->d < right->d ? 1 : left->d == right->d ? 0 : -1);
 | 
			
		||||
 | 
			
		||||
ListViewSortFunction ListViewGetSortFunction(ListViewColumn *column, uint8_t direction) {
 | 
			
		||||
	if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_STRINGS) {
 | 
			
		||||
		return (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByStringsDescending : ListViewSortByStringsAscending);
 | 
			
		||||
	} else if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_INTEGERS) {
 | 
			
		||||
		if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_FORMAT_MASK) == ES_LIST_VIEW_COLUMN_FIXED_FORMAT_ENUM_STRING) {
 | 
			
		||||
			return (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByEnumsDescending : ListViewSortByEnumsAscending);
 | 
			
		||||
		} else {
 | 
			
		||||
			return (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByIntegersDescending : ListViewSortByIntegersAscending);
 | 
			
		||||
		}
 | 
			
		||||
	} else if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_DOUBLES) {
 | 
			
		||||
		return (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByDoublesDescending : ListViewSortByDoublesAscending);
 | 
			
		||||
	} else {
 | 
			
		||||
		EsAssert(false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EsListViewIndex EsListViewFixedItemInsert(EsListView *view, EsGeneric data, EsListViewIndex index, uint32_t iconID) {
 | 
			
		||||
	EsAssert(view->flags & ES_LIST_VIEW_FIXED_ITEMS);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2643,12 +2681,32 @@ void ListViewFixedItemSetInternal(EsListView *view, EsListViewIndex index, uint3
 | 
			
		|||
		EsMemoryZero(&column->items[oldLength], (view->fixedItems.Length() - oldLength) * sizeof(column->items[0]));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool changed = false;
 | 
			
		||||
 | 
			
		||||
	if (dataType == ES_LIST_VIEW_COLUMN_FIXED_DATA_STRINGS) {
 | 
			
		||||
		changed = EsStringCompareRaw(column->items[index].s.string, column->items[index].s.bytes, data.s.string, data.s.bytes);
 | 
			
		||||
	} else if (dataType == ES_LIST_VIEW_COLUMN_FIXED_DATA_DOUBLES) {
 | 
			
		||||
		changed = column->items[index].d != data.d;
 | 
			
		||||
	} else if (dataType == ES_LIST_VIEW_COLUMN_FIXED_DATA_INTEGERS) {
 | 
			
		||||
		changed = column->items[index].i != data.i;
 | 
			
		||||
	} else {
 | 
			
		||||
		EsAssert(false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (dataType == ES_LIST_VIEW_COLUMN_FIXED_DATA_STRINGS) {
 | 
			
		||||
		EsHeapFree(column->items[index].s.string);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	column->items[index] = data;
 | 
			
		||||
	EsListViewInvalidateContent(view, 0, index);
 | 
			
		||||
 | 
			
		||||
	if (changed) {
 | 
			
		||||
		for (uintptr_t i = 0; i < view->fixedItemIndices.Length(); i++) {
 | 
			
		||||
			if (view->fixedItemIndices[i] == index) {
 | 
			
		||||
				EsListViewInvalidateContent(view, 0, i);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EsListViewFixedItemSetString(EsListView *view, EsListViewIndex index, uint32_t columnID, const char *string, ptrdiff_t stringBytes) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2765,29 +2823,11 @@ void EsListViewFixedItemSetEnumStringsForColumn(EsListView *view, uint32_t colum
 | 
			
		|||
	EsAssert(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define LIST_VIEW_SORT_FUNCTION(_name, _line) \
 | 
			
		||||
	ES_MACRO_SORT(_name, EsListViewIndex, { \
 | 
			
		||||
		ListViewFixedItemData *left = (ListViewFixedItemData *) &context->items[*_left]; \
 | 
			
		||||
		ListViewFixedItemData *right = (ListViewFixedItemData *) &context->items[*_right]; \
 | 
			
		||||
		result = _line; \
 | 
			
		||||
	}, ListViewColumn *)
 | 
			
		||||
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByStringsAscending, EsStringCompare(left->s.string, left->s.bytes, right->s.string, right->s.bytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByStringsDescending, -EsStringCompare(left->s.string, left->s.bytes, right->s.string, right->s.bytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByEnumsAscending, EsStringCompare(context->enumStrings[left->i].string, context->enumStrings[left->i].stringBytes, 
 | 
			
		||||
			context->enumStrings[right->i].string, context->enumStrings[right->i].stringBytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByEnumsDescending, -EsStringCompare(context->enumStrings[left->i].string, context->enumStrings[left->i].stringBytes, 
 | 
			
		||||
			context->enumStrings[right->i].string, context->enumStrings[right->i].stringBytes));
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByIntegersAscending, left->i > right->i ? 1 : left->i == right->i ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByIntegersDescending, left->i < right->i ? 1 : left->i == right->i ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByDoublesAscending, left->d > right->d ? 1 : left->d == right->d ? 0 : -1);
 | 
			
		||||
LIST_VIEW_SORT_FUNCTION(ListViewSortByDoublesDescending, left->d < right->d ? 1 : left->d == right->d ? 0 : -1);
 | 
			
		||||
 | 
			
		||||
void ListViewSetSortDirection(EsListView *view, uint32_t columnID, uint8_t direction) {
 | 
			
		||||
void EsListViewFixedItemSortAll(EsListView *view) {
 | 
			
		||||
	ListViewColumn *column = nullptr;
 | 
			
		||||
 | 
			
		||||
	for (uintptr_t i = 0; i < view->registeredColumns.Length(); i++) {
 | 
			
		||||
		if (view->registeredColumns[i].id == columnID) {
 | 
			
		||||
		if (view->registeredColumns[i].id == view->fixedItemSortColumnID) {
 | 
			
		||||
			column = &view->registeredColumns[i];
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -2795,34 +2835,12 @@ void ListViewSetSortDirection(EsListView *view, uint32_t columnID, uint8_t direc
 | 
			
		|||
 | 
			
		||||
	EsAssert(column);
 | 
			
		||||
 | 
			
		||||
	if (view->fixedItemSortColumnID == columnID && view->fixedItemSortDirection == direction) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	view->fixedItemSortColumnID = columnID;
 | 
			
		||||
	view->fixedItemSortDirection = direction;
 | 
			
		||||
 | 
			
		||||
	EsAssert(view->fixedItems.Length() == view->fixedItemIndices.Length());
 | 
			
		||||
 | 
			
		||||
	void (*sortFunction)(EsListViewIndex *, size_t, ListViewColumn *) = nullptr;
 | 
			
		||||
 | 
			
		||||
	if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_STRINGS) {
 | 
			
		||||
		sortFunction = (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByStringsDescending : ListViewSortByStringsAscending);
 | 
			
		||||
	} else if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_INTEGERS) {
 | 
			
		||||
		if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_FORMAT_MASK) == ES_LIST_VIEW_COLUMN_FIXED_FORMAT_ENUM_STRING) {
 | 
			
		||||
			sortFunction = (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByEnumsDescending : ListViewSortByEnumsAscending);
 | 
			
		||||
		} else {
 | 
			
		||||
			sortFunction = (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByIntegersDescending : ListViewSortByIntegersAscending);
 | 
			
		||||
		}
 | 
			
		||||
	} else if ((column->flags & ES_LIST_VIEW_COLUMN_FIXED_DATA_MASK) == ES_LIST_VIEW_COLUMN_FIXED_DATA_DOUBLES) {
 | 
			
		||||
		sortFunction = (direction == LIST_SORT_DIRECTION_DESCENDING ? ListViewSortByDoublesDescending : ListViewSortByDoublesAscending);
 | 
			
		||||
	} else {
 | 
			
		||||
		EsAssert(false);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	EsListViewIndex previousSelectionIndex = view->fixedItemSelection >= 0 && (uintptr_t) view->fixedItemSelection < view->fixedItemIndices.Length() 
 | 
			
		||||
		? view->fixedItemIndices[view->fixedItemSelection] : -1;
 | 
			
		||||
 | 
			
		||||
	ListViewSortFunction sortFunction = ListViewGetSortFunction(column, view->fixedItemSortDirection);
 | 
			
		||||
	sortFunction(view->fixedItemIndices.array, view->fixedItems.Length(), column);
 | 
			
		||||
	EsListViewInvalidateAll(view);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2838,6 +2856,14 @@ void ListViewSetSortDirection(EsListView *view, uint32_t columnID, uint8_t direc
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ListViewSetSortDirection(EsListView *view, uint32_t columnID, uint8_t direction) {
 | 
			
		||||
	if (view->fixedItemSortColumnID != columnID || view->fixedItemSortDirection != direction) {
 | 
			
		||||
		view->fixedItemSortColumnID = columnID;
 | 
			
		||||
		view->fixedItemSortDirection = direction;
 | 
			
		||||
		EsListViewFixedItemSortAll(view);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ListViewSetSortAscending(EsMenu *menu, EsGeneric context) {
 | 
			
		||||
	ListViewSetSortDirection((EsListView *) menu->userData.p, context.u, LIST_SORT_DIRECTION_ASCENDING);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2626,3 +2626,4 @@ function void EsListViewFixedItemSetInteger(EsListView *view, EsListViewIndex in
 | 
			
		|||
function bool EsListViewFixedItemSelect(EsListView *view, EsGeneric data); // Returns false if the item was not found.
 | 
			
		||||
function bool EsListViewFixedItemGetSelected(EsListView *view, EsGeneric *data); // Returns false if no item was selected.
 | 
			
		||||
function void EsListViewFixedItemSetEnumStringsForColumn(EsListView *view, uint32_t columnID, const EsListViewEnumString *strings, size_t stringCount);
 | 
			
		||||
function void EsListViewFixedItemSortAll(EsListView *view); // Re-sort the list after inserting new items or modifying existing items. TODO EsListViewFixedItemSortSingleItem.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -142,6 +142,7 @@ EsMutexAcquire=140
 | 
			
		|||
EsMutexDestroy=141
 | 
			
		||||
EsMutexRelease=142
 | 
			
		||||
EsListViewAddAllColumns=143
 | 
			
		||||
EsListViewFixedItemSortAll=144
 | 
			
		||||
EsSchedulerYield=145
 | 
			
		||||
EsSleep=146
 | 
			
		||||
EsSpinlockAcquire=147
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue