diff options
| -rw-r--r-- | Library/UefiShellUfmCommandLib/panel.c | 75 | 
1 files changed, 75 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/panel.c b/Library/UefiShellUfmCommandLib/panel.c index b02bddb..df1be44 100644 --- a/Library/UefiShellUfmCommandLib/panel.c +++ b/Library/UefiShellUfmCommandLib/panel.c @@ -13,6 +13,7 @@  #define SIZE_COLS 7  #define MODIFYTIME_COLS 12 +#define MONTH_LENGTH 3  #define HIGHLIGHT_LINE_AS_CURRENT(panel, line) \  	highlight_line(panel, line, -1, EFI_CYAN) @@ -23,6 +24,27 @@  #define UNHIGHLIGHT_LINE_AS_MARK(panel, line) \  	highlight_line(panel, line, EFI_LIGHTGRAY, -1) +STATIC CONST CHAR16 *get_month_string(UINT8 month) +{ +	switch(month) { +		case 1: return L"jan"; +		case 2: return L"feb"; +		case 3: return L"mar"; +		case 4: return L"apr"; +		case 5: return L"may"; +		case 6: return L"jun"; +		case 7: return L"jul"; +		case 8: return L"aug"; +		case 9: return L"sep"; +		case 10: return L"oct"; +		case 11: return L"nov"; +		case 12: return L"dec"; +		default: break; +	} + +	return L"xxx"; +} +  STATIC VOID display_fs(struct panel_ctx *p, UINTN start_index)  {  	UINTN line, i; @@ -41,6 +63,59 @@ STATIC VOID display_fs(struct panel_ctx *p, UINTN start_index)  	}  } +STATIC VOID display_files(struct panel_ctx *p, UINTN start_index) +{ +	UINTN i; +	EFI_SHELL_FILE_INFO *list_head, *node; +	EFI_TIME cur_time, *mod_time; +	BOOLEAN directory; + +	gRT->GetTime(&cur_time, NULL); +	list_head = p->dirs->list_head; + +	node = dirl_getn(p->dirs, start_index); +	for(i = 0; i <= p->list_lines; i++) +	{ +		if(IsNull(&list_head->Link, &node->Link) ||  +				((start_index + i) > p->dirs->len)) { +			clear_list_line(p, i); +			continue; +		} + +		mod_time = &(node->Info->ModificationTime); +		directory = FALSE; +		if((node->Info->Attribute & EFI_FILE_DIRECTORY) != 0) +			directory = TRUE; + +		// mvwprintf doesn't support "-*.*s" :( + +		// column "name" +		mvwprintf(p->wlist, 0, i, L"%c%-*s", directory ? L'/' : L' ', +			p->name_cols - 1, node->FileName); + +		// column "size" +		if(directory) +			mvwprintf(p->wlist, p->name_cols, i, L"%c%*.*s%c", BOXDRAW_VERTICAL, +				SIZE_COLS, SIZE_COLS, L"<dir>"); +		else +			mvwprintf(p->wlist, p->name_cols, i, L"%c%*d%c", BOXDRAW_VERTICAL, +				SIZE_COLS, node->Info->FileSize); + +		// column "modify time" +		mvwprintf(p->wlist, p->wlist->width - MODIFYTIME_COLS - 1, i,  +			L"%c%*s %02u ", BOXDRAW_VERTICAL, MONTH_LENGTH, +			get_month_string(mod_time->Month), mod_time->Day); +		if(cur_time.Year == mod_time->Year) +			mvwprintf(p->wlist, p->wlist->width - MODIFYTIME_COLS + 7, i, +				L"%02u:%02u", mod_time->Hour, mod_time->Minute); +		else +			mvwprintf(p->wlist, p->wlist->width - MODIFYTIME_COLS + 7, i, +				L"%5u", mod_time->Year); + +		node = (EFI_SHELL_FILE_INFO *)GetNextNode(&list_head->Link, &node->Link); +	} +} +  STATIC VOID highlight_line(struct panel_ctx *p, UINTN line, INT32 fg, INT32 bg)  {  	CHAR16 *str;  | 
