diff options
| author | Joursoir <chat@joursoir.net> | 2021-11-23 13:30:51 +0300 | 
|---|---|---|
| committer | Joursoir <chat@joursoir.net> | 2021-11-23 13:30:51 +0300 | 
| commit | 7fa2e3d34f4cf2bbf611e3af70def1fab3a8a33f (patch) | |
| tree | 1087c7a888d0bc94bccc158699b3499ecb5cd557 /Library/UefiShellUfmCommandLib | |
| parent | ca42c5ae860d5e902c2cc349b6c7ca065d2dfd8d (diff) | |
| download | ufm-7fa2e3d34f4cf2bbf611e3af70def1fab3a8a33f.tar.gz ufm-7fa2e3d34f4cf2bbf611e3af70def1fab3a8a33f.tar.bz2 ufm-7fa2e3d34f4cf2bbf611e3af70def1fab3a8a33f.zip | |
implement the panel
Diffstat (limited to 'Library/UefiShellUfmCommandLib')
| -rw-r--r-- | Library/UefiShellUfmCommandLib/panel.c | 113 | ||||
| -rw-r--r-- | Library/UefiShellUfmCommandLib/panel.h | 52 | 
2 files changed, 165 insertions, 0 deletions
| diff --git a/Library/UefiShellUfmCommandLib/panel.c b/Library/UefiShellUfmCommandLib/panel.c new file mode 100644 index 0000000..3f5e208 --- /dev/null +++ b/Library/UefiShellUfmCommandLib/panel.c @@ -0,0 +1,113 @@ +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> +#include <Library/ShellLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> + +#include "tbi/screen.h" +#include "tbi/win.h" +#include "dir.h" +#include "fs.h" +#include "panel.h" + +#define SIZE_COLS 7 +#define MODIFYTIME_COLS 12 + +struct panel_ctx *panel_alloc(struct screen *scr, CONST CHAR16 *path, +		INT32 cols, INT32 lines, INT32 x, INT32 y) +{ +	ASSERT(scr != NULL); + +	struct panel_ctx *panel; +	UINTN name_cols = cols - 1 - MODIFYTIME_COLS - 1 - SIZE_COLS - 1 - 1; +	UINTN rows = lines - 2; +	BOOLEAN res = FALSE; + +	panel = AllocateZeroPool(sizeof(struct panel_ctx)); +	if(!panel) +		return NULL; + +	do { // START DO + +	panel->wname = newwin(scr, name_cols + 2, rows, x, y); +	if(!panel->wname) +		break; +	wborder(panel->wname, +		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL, +		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL, +		BOXDRAW_DOWN_RIGHT, BOXDRAW_DOWN_HORIZONTAL, +		BOXDRAW_VERTICAL_RIGHT, BOXDRAW_UP_HORIZONTAL +	); +	mvwprintf(panel->wname, 1 + ((name_cols - 4) / 2), 1, L"Name"); + +	panel->wsize = newwin(scr, SIZE_COLS + 2, rows, x + 1 + name_cols, y); +	if(!panel->wsize) +		break; +	wborder(panel->wsize, +		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL, +		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL, +		BOXDRAW_DOWN_HORIZONTAL, BOXDRAW_DOWN_HORIZONTAL, +		BOXDRAW_UP_HORIZONTAL, BOXDRAW_UP_HORIZONTAL +	); +	mvwprintf(panel->wsize, 1 + ((SIZE_COLS - 4) / 2), 1, L"Size"); + +	panel->wmodt = newwin(scr, MODIFYTIME_COLS + 2, rows, +		x + 1 + name_cols + 1 + SIZE_COLS, y); +	if(!panel->wmodt) +		break; +	wborder(panel->wmodt, +		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL, +		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL, +		BOXDRAW_DOWN_HORIZONTAL, BOXDRAW_DOWN_LEFT, +		BOXDRAW_UP_HORIZONTAL, BOXDRAW_VERTICAL_LEFT +	); +	mvwprintf(panel->wmodt, 1 + ((MODIFYTIME_COLS - 11) / 2), 1, L"Modify Time"); + +	panel->winfo = newwin(scr, cols, 3, x, y + lines - 3); +	if(!panel->winfo) +		break; +	wborder(panel->winfo, +		BOXDRAW_VERTICAL, BOXDRAW_VERTICAL, +		BOXDRAW_HORIZONTAL, BOXDRAW_HORIZONTAL, +		BOXDRAW_VERTICAL_RIGHT, BOXDRAW_VERTICAL_LEFT, +		BOXDRAW_UP_RIGHT, BOXDRAW_UP_LEFT +	); + +	res = TRUE; + +	} while(0); // END DO + +	panel->cwd = path; +	panel->curline = 1; +	panel->list_lines = rows - 2 - 1; +	panel->start_entry = 1; + +	if(!res) { +		panel_release(panel); +		return NULL; +	} + +	res = panel_show(panel, panel->cwd); +	if(!res) { +		panel_release(panel); +		return NULL; +	} +	return panel; +} + +VOID panel_release(struct panel_ctx *p) +{ +	ASSERT(p != NULL); + +	if(p->winfo) +		delwin(p->winfo); +	if(p->wname) +		delwin(p->wname); +	if(p->wsize) +		delwin(p->wsize); +	if(p->wmodt) +		delwin(p->wmodt); + +	FreePool(p); +} diff --git a/Library/UefiShellUfmCommandLib/panel.h b/Library/UefiShellUfmCommandLib/panel.h new file mode 100644 index 0000000..b0492e7 --- /dev/null +++ b/Library/UefiShellUfmCommandLib/panel.h @@ -0,0 +1,52 @@ +#ifndef UFM_PANEL_H +#define UFM_PANEL_H + +#include <Uefi.h> + +struct screen; +struct window; +struct dir_list; +struct fs_array; + +struct panel_ctx { +	struct window *wname, *wsize, *wmodt; +	struct window *winfo; +	BOOLEAN	show_fs; // is filesystems showing now? + +	CONST CHAR16 *cwd; // current work directory + +	UINTN curline; // current line +	struct dir_list *dirs; // directory contents +	struct fs_array *fsa; // aviable file systems + +	UINTN list_lines; // number of lines in the files list +	UINTN start_entry; // file index at the beginning of the files list +	UINTN marked; // count of marked files +}; + +/* + * Creates a panel with given parameters. Filled with files from the + * specified path + * + * scr: the information of the screen + * path: the pointer to path string + * cols: the number of columns + * lines: the number of lines + * x: the column coordinate (starts from 0) of upper left corner of the window + * y: the line coordinate (starts from 0) of upper left corner of the window + * + * return: A pointer to the allocated structure or NULL if allocation fails +*/ +struct panel_ctx *panel_alloc(struct screen *scr, CONST CHAR16 *path, +		INT32 cols, INT32 lines, INT32 x, INT32 y); + +/* + * Deletes the panel, frees the structure + * + * w: the panel on which to operate + * + * return: VOID +*/ +VOID panel_release(struct panel_ctx *p); + +#endif /* UFM_PANEL_H */ | 
