From 7fa2e3d34f4cf2bbf611e3af70def1fab3a8a33f Mon Sep 17 00:00:00 2001 From: Joursoir Date: Tue, 23 Nov 2021 13:30:51 +0300 Subject: implement the panel --- Library/UefiShellUfmCommandLib/panel.c | 113 +++++++++++++++++++++++++++++++++ Library/UefiShellUfmCommandLib/panel.h | 52 +++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 Library/UefiShellUfmCommandLib/panel.c create mode 100644 Library/UefiShellUfmCommandLib/panel.h 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 +#include +#include +#include +#include +#include + +#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 + +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 */ -- cgit v1.2.3-18-g5258