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){
{ "G", &handle_scroll_to_bottom },
{ "U", &handle_page_up },
{ "D", &handle_page_down },
+ { "l", &handle_expand },
+ { "h", &handle_collapse },
//{ "wj", NULL },
//{ "wk", NULL },
};
}
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;
}
}
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){
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++){
}
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);
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);
+}
typedef struct {
char* path;
char* name;
+ int uid;
+ int gid;
+ bool expanded;
} File_T;
WorkDir_T* workdir_new(char* path);
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 */