From: abellenir Date: Sat, 26 Jul 2014 09:46:48 +0000 (+0000) Subject: add additional file info X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=214090cc92021ad120874764d848de6af6f69acf;p=archive%2Fafm.git add additional file info --- diff --git a/source/input.c b/source/input.c index 8b1f2a0..883305e 100644 --- a/source/input.c +++ b/source/input.c @@ -47,6 +47,12 @@ static void handle_page_up(void){ static void handle_page_down(void){ screen_frame_page_down(state_get_focused_frame()); } +static void handle_expand(void){ + workdir_expand_selected(state_get_focused_frame()->workdir); +} +static void handle_collapse(void){ + workdir_collapse_selected(state_get_focused_frame()->workdir); +} static void search_mode(void){ @@ -92,6 +98,8 @@ static binding_t Default_Bindings[] = { { "G", &handle_scroll_to_bottom }, { "U", &handle_page_up }, { "D", &handle_page_down }, + { "l", &handle_expand }, + { "h", &handle_collapse }, //{ "wj", NULL }, //{ "wk", NULL }, }; diff --git a/source/screen.c b/source/screen.c index 8e2d8f4..cf68a14 100644 --- a/source/screen.c +++ b/source/screen.c @@ -144,31 +144,36 @@ static void screen_frame_scroll(frame_t* p_frame){ } void screen_frame_draw_files(frame_t* frame){ - int i; + int file_i, frame_i = FrameTopBuffer; int rows, cols; int pathlength = strlen(frame->workdir->path); getmaxyx(frame->p_win, rows, cols); screen_frame_scroll(frame); - i = frame->top_index; + file_i = frame->top_index; //draw path wattron(frame->p_win, A_UNDERLINE); mvwaddnstr(frame->p_win, 1, 1, frame->workdir->path, cols-2); wattroff(frame->p_win, A_UNDERLINE); //list files - while (i < vec_size(frame->workdir->vfiles)){ - File_T* file = (File_T*)vec_at(frame->workdir->vfiles, i); + while (file_i < vec_size(frame->workdir->vfiles)){ + File_T* file = (File_T*)vec_at(frame->workdir->vfiles, file_i); bool dir = is_dir(file->path); - if(frame == state_get_focused_frame() && i == frame->workdir->idx){ + if(frame == state_get_focused_frame() && file_i == frame->workdir->idx){ wattron(frame->p_win, A_STANDOUT | A_BOLD); } if(dir) wattron(frame->p_win, COLOR_PAIR(DIRECTORY)); - mvwaddnstr(frame->p_win, FrameTopBuffer+i-frame->top_index, 1, file->name, cols-2); - if(frame == state_get_focused_frame() && i == frame->workdir->idx){ + mvwaddnstr(frame->p_win, frame_i, 1, file->name, cols-2); + frame_i++; + if(file->expanded){ + mvwprintw(frame->p_win, frame_i, 1, " owned by user id %d, group id %d", file->uid, file->gid); + frame_i++; + } + if(frame == state_get_focused_frame() && file_i == frame->workdir->idx){ wattroff(frame->p_win, A_STANDOUT | A_BOLD); } if(dir) wattroff(frame->p_win, COLOR_PAIR(DIRECTORY)); - i++; - if((FrameTopBuffer+i-frame->top_index+FrameBotBuffer) > rows) break; + file_i++; + if((frame_i+FrameBotBuffer) > rows) break; } } diff --git a/source/workdir.c b/source/workdir.c index dc7ee04..a8d37ae 100644 --- a/source/workdir.c +++ b/source/workdir.c @@ -22,6 +22,14 @@ bool is_dir(char* path) { return ((stat(path, &s) == 0) && (s.st_mode & S_IFDIR)); } +void populate_owner_info(File_T* p_file){ + struct stat s; + if(stat(p_file->path, &s) == 0){ + p_file->uid = s.st_uid; + p_file->gid = s.st_gid; + } //else error +} + void workdir_free(void* p_wd); WorkDir_T* workdir_new(char* path){ @@ -88,6 +96,7 @@ File_T* make_dotdot(char* path){ int last_slash = 0; if(strcmp(path, "/") != 0){ dd = mem_allocate(sizeof(File_T), &file_free); + dd->expanded = false; dd->name = mem_allocate(sizeof(char)*3, NULL); strcpy(dd->name, ".."); for(int i=0; path[i] != 0; i++){ @@ -139,6 +148,8 @@ void workdir_ls(WorkDir_T* wd){ } strcat(file->path, filename); file->name = &(file->path[filename_offset]); + populate_owner_info(file); + file->expanded = false; vec_push_back(wd->vfiles, file); } free(filename); @@ -153,4 +164,12 @@ void workdir_seek(WorkDir_T* wd, char* search){ workdir_set_idx(wd, i); } +void workdir_expand_selected(WorkDir_T* wd){ + ((File_T*)vec_at(wd->vfiles, wd->idx))->expanded = true; + state_set_screen_dirty(true); +} +void workdir_collapse_selected(WorkDir_T* wd){ + ((File_T*)vec_at(wd->vfiles, wd->idx))->expanded = false; + state_set_screen_dirty(true); +} diff --git a/source/workdir.h b/source/workdir.h index 9e436ba..a88c7bf 100644 --- a/source/workdir.h +++ b/source/workdir.h @@ -21,6 +21,9 @@ typedef struct { typedef struct { char* path; char* name; + int uid; + int gid; + bool expanded; } File_T; WorkDir_T* workdir_new(char* path); @@ -42,4 +45,7 @@ void workdir_seek(WorkDir_T* wd, char* search); void workdir_scroll_to_top(WorkDir_T* wd); void workdir_scroll_to_bot(WorkDir_T* wd); +void workdir_expand_selected(WorkDir_T* wd); +void workdir_collapse_selected(WorkDir_T* wd); + #endif /* WORKDIR_H */