📄 listedit.c
字号:
for (i=item->next,depth=item->depth;i!=ld->list&&i->depth>depth;) { j=i; i=i->next; ld->delete_item(j); } /* strong premise: we can't delete head of the list */ if (ld->current_pos->next!=ld->list) { if (ld->current_pos == ld->win_offset) ld->win_offset = ld->current_pos->next; ld->current_pos=ld->current_pos->next; } else /* last item */ { if (!(ld->win_pos)) /* only one line on the screen */ ld->win_offset=prev_in_tree(ld,ld->win_offset); else ld->win_pos--; ld->current_pos=prev_in_tree(ld,ld->current_pos); } ld->delete_item(item); rd.ld=ld; rd.dlg=dlg; rd.n=0; ld->modified=1; draw_to_window(dlg->win,redraw_list,&rd);}/* tests if directory is emty */int is_empty_dir(struct list_description *ld, struct list *dir){ if (!(ld->type))return 1; /* flat list */ if (!((dir->type)&1))return 1; /* not a directory */ return (((struct list *)(dir->next))->depth<=dir->depth); /* head depth is -1 */}/* delete dialog */int list_item_delete(struct dialog_data *dlg,struct dialog_item_data *useless){ struct terminal *term=dlg->win->term; struct list_description *ld=(struct list_description*)(dlg->dlg->udata2); struct list *item=ld->current_pos; /*struct session *ses=(struct session *)(dlg->dlg->udata);*/ unsigned char *txt; struct ve_skodarne_je_jeste_vetsi_narez *narez; useless=useless; if (item==(ld->list)||list_empty(*item))return 0; /* head or empty list */ narez=mem_alloc(sizeof(struct ve_skodarne_je_jeste_vetsi_narez)); narez->ld=ld;narez->item=item;narez->dlg=dlg; txt=ld->type_item(term, item,0); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } if ((item->type)&1) /* folder */ { if (!is_empty_dir(ld,item)) msg_box( term, /* terminal */ getml(txt,narez,NULL), /* blocks to free */ TEXT(T_DELETE_FOLDER), /* title */ AL_CENTER|AL_EXTD_TEXT, /* alignment */ TEXT(T_FOLDER)," \"",txt,"\" ",TEXT(T_NOT_EMPTY_SURE_DELETE),NULL, /* text */ narez, /* data for ld->delete_item */ 2, /* # of buttons */ TEXT(T_NO),NULL,B_ESC, /* button1 */ TEXT(T_YES),delete_folder_recursively,B_ENTER /* button2 */ ); else msg_box( term, /* terminal */ getml(txt,narez,NULL), /* blocks to free */ TEXT(T_DELETE_FOLDER), /* title */ AL_CENTER|AL_EXTD_TEXT, /* alignment */ TEXT(T_SURE_DELETE)," ",TEXT(T_fOLDER)," \"",txt,"\"?",NULL, /* null-terminated text */ narez, /* data for ld->delete_item */ 2, /* # of buttons */ TEXT(T_YES),delete_ok,B_ENTER, /* button1 */ TEXT(T_NO),NULL,B_ESC /* button2 */ ); } else /* item */ msg_box( term, /* terminal */ getml(txt,narez,NULL), /* blocks to free */ TEXT(ld->delete_dialog_title), /* title */ AL_CENTER|AL_EXTD_TEXT, /* alignment */ TEXT(T_SURE_DELETE)," ",TEXT(ld->item_description)," \"",txt,"\"?",NULL, /* null-terminated text */ narez, /* data for ld->delete_item */ 2, /* # of buttons */ TEXT(T_YES),delete_ok,B_ENTER, /* button1 */ TEXT(T_NO),NULL,B_ESC /* button2 */ ); return 0;}/* redraws list */void redraw_list(struct terminal *term, void *bla){ struct redraw_data* rd=(struct redraw_data *)bla; struct list_description *ld=rd->ld; struct dialog_data *dlg=rd->dlg; /*struct session *ses=(struct session*)(dlg->dlg->udata);*/ int y,a; struct list *l; int w=dlg->xw-2*DIALOG_LB-(F?sirka_scrollovadla:0); y=dlg->y+DIALOG_TB;#ifdef G if (F) { int total=get_total_items(ld); int visible=get_visible_items(ld); int pos=get_scroll_pos(ld); struct rect old_area; restrict_clip_area(term->dev,&old_area,dlg->x+w+DIALOG_LB+G_SCROLL_BAR_WIDTH,y,dlg->x+DIALOG_LB+w+sirka_scrollovadla,y+G_BFU_FONT_SIZE*ld->n_items); term->dev->drv->set_clip_area(term->dev,&old_area); draw_vscroll_bar(term->dev,dlg->x+DIALOG_LB+w+G_SCROLL_BAR_WIDTH,y,G_BFU_FONT_SIZE*ld->n_items,total,visible,pos); if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB+w+G_SCROLL_BAR_WIDTH,y,dlg->x+DIALOG_LB+w+sirka_scrollovadla,y+G_BFU_FONT_SIZE*ld->n_items); }#endif switch (ld->type) { case 0: /* flat */ for (a=0,l=ld->win_offset;a<ld->n_items;) { unsigned char *txt; int x=0; txt=ld->type_item(term, l,1); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } /* everything except head */ if (!F) { unsigned color=(l==ld->current_pos)?COLOR_MENU_SELECTED:COLOR_MENU; if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,color,0,0,BFU_ELEMENT_TEE,(l->type)&4); print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,color); x+=strlen(txt); fill_area(term,dlg->x+DIALOG_LB+x,y,w-x,1,' '); set_line_color(term,dlg->x+DIALOG_LB+x,y,w-x,color); }#ifdef G else { struct rect old_area; long bgcolor=(l==ld->current_pos)?G_BFU_FG_COLOR:G_BFU_BG_COLOR; long fgcolor=(l==ld->current_pos)?G_BFU_BG_COLOR:G_BFU_FG_COLOR; struct style* stl=(l==ld->current_pos)?bfu_style_wb:bfu_style_bw; bgcolor=dip_get_color_sRGB(bgcolor); fgcolor=dip_get_color_sRGB(fgcolor); if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,0,bgcolor,fgcolor,BFU_ELEMENT_TEE,(l->type)&4); restrict_clip_area(term->dev,&old_area,dlg->x+x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE); g_print_text(term->dev->drv,term->dev,dlg->x+x+DIALOG_LB,y,stl,txt,0); x+=g_text_width(stl,txt); term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB+x,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE,bgcolor); term->dev->drv->set_clip_area(term->dev,&old_area); if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE); }#endif mem_free(txt); l=l->next; a++; y+=gf_val(1,G_BFU_FONT_SIZE); if (l==ld->list) break; } if (!F) fill_area(term,dlg->x+DIALOG_LB,y,w,ld->n_items-a,' '|COLOR_MENU);#ifdef G else { term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,dlg->y+DIALOG_TB+(ld->n_items)*G_BFU_FONT_SIZE,dip_get_color_sRGB(G_BFU_BG_COLOR)); }#endif break; case 1: /* tree */ for (a=0,l=ld->win_offset;a<ld->n_items;) { unsigned char *txt; int b; int x=0; unsigned color=0; long fgcolor=0; long bgcolor=0; int element=0; if (!F){ color=(l==ld->current_pos)?COLOR_MENU_SELECTED:COLOR_MENU;#ifdef G }else{ bgcolor=(l==ld->current_pos)?G_BFU_FG_COLOR:G_BFU_BG_COLOR; fgcolor=(l==ld->current_pos)?G_BFU_BG_COLOR:G_BFU_FG_COLOR; bgcolor=dip_get_color_sRGB(bgcolor); fgcolor=dip_get_color_sRGB(fgcolor);#endif }; txt=ld->type_item(term,l,1); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } for (b=0;b<l->depth;b++) x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,color,bgcolor,fgcolor,BFU_ELEMENT_PIPE,0); if (l->depth>=0) /* everything except head */ { switch((l->type)&1) { case 0: /* item */ element=BFU_ELEMENT_TEE; break; case 1: /* directory */ element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED; break; default: /* this should never happen */ internal("=8-Q lunacy level too high! Call "BOHNICE".\n"); } x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,color,bgcolor,fgcolor,element,(l->type)&4); } if (!F) { print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,color); x+=strlen(txt); fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' '); set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,color); }#ifdef G else { struct rect old_area; restrict_clip_area(term->dev,&old_area,dlg->x+x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE); g_print_text(term->dev->drv,term->dev,dlg->x+x+DIALOG_LB,y,(l==ld->current_pos)?bfu_style_wb:bfu_style_bw,txt,0); x+=g_text_width((l==ld->current_pos)?bfu_style_wb:bfu_style_bw,txt); term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB+x,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE,bgcolor); term->dev->drv->set_clip_area(term->dev,&old_area); if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE); }#endif mem_free(txt); l=next_in_tree(ld,l); a++; y+=gf_val(1,G_BFU_FONT_SIZE); if (l==ld->list) break; } if (!F) fill_area(term,dlg->x+DIALOG_LB,y,w,ld->n_items-a,' '|COLOR_MENU);#ifdef G else { term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,dlg->y+DIALOG_TB+(ld->n_items)*G_BFU_FONT_SIZE,dip_get_color_sRGB(G_BFU_BG_COLOR)); }#endif break; default: internal( "Invalid list description type.\n" "Somebody's probably shooting into memory.\n" "_______________\n" "`--|_____|--|___ `\\\n" " \" \\___\\\n"); break; }}/* moves cursor from old position to a new one *//* direction: -1=old is previous, +1=old is next */void redraw_list_line(struct terminal *term, void *bla){ struct redraw_data *rd=(struct redraw_data *)bla; struct list_description *ld=rd->ld; struct dialog_data *dlg=rd->dlg; /*struct session *ses=(struct session *)(dlg->dlg->udata);*/ int direction=rd->n; int w=dlg->xw-2*DIALOG_LB-(F?sirka_scrollovadla:0); int y=dlg->y+DIALOG_TB+gf_val(ld->win_pos,ld->win_pos*G_BFU_FONT_SIZE); if (!F) { /* novou radku musim prekreslit celou, protoze ji BFU mohlo oznacit a mohla to byt posledni radka v seznamu */ set_line_color(term,dlg->x+DIALOG_LB,y,w,COLOR_MENU_SELECTED); if (ld->type) /* tree */ { unsigned char *txt; int b; int x=0; int element=0; struct list*l=ld->current_pos; txt=ld->type_item(term, l,1); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } if (!term->spec->block_cursor || term->spec->braille) set_cursor(term, dlg->x + DIALOG_LB + x, y, dlg->x + DIALOG_LB + x, y); for (b=0;b<l->depth;b++) x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU_SELECTED,0,0,BFU_ELEMENT_PIPE,0); if (l->depth>=0) /* everything except head */ { switch((l->type)&1) { case 0: /* item */ element=BFU_ELEMENT_TEE; break; case 1: /* directory */ element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED; break; default: /* this should never happen */ internal("=8-Q lunacy level too high! Call "BOHNICE".\n"); } x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU_SELECTED,0,0,element,(l->type)&4); } print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU_SELECTED); x+=strlen(txt); fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' '); set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,COLOR_MENU_SELECTED); mem_free(txt); } else /* flat */ { unsigned char *txt; int x=0; struct list *l=ld->current_pos; txt=ld->type_item(term, l,1); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } if (!term->spec->block_cursor || term->spec->braille) set_cursor(term, dlg->x + DIALOG_LB + x, y, dlg->x + DIALOG_LB + x, y); /* everything except head */ if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,COLOR_MENU_SELECTED,0,0,BFU_ELEMENT_TEE,(l->type)&4); print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU_SELECTED); x+=strlen(txt); fill_area(term,dlg->x+DIALOG_LB+x,y,w-x,1,' '); set_line_color(term,dlg->x+DIALOG_LB+x,y,w-x,COLOR_MENU_SELECTED); mem_free(txt); } /* starou radku musim prekreslit celou, protoze ji BFU mohlo oznacit */ if (!direction) goto skip_old_1; if (ld->type) /* tree */ { unsigned char *txt; int b; int x=0; int element=0; struct list*l; y+=direction; if (direction==1)l=next_in_tree(ld,ld->current_pos); else l=prev_in_tree(ld,ld->current_pos); txt=ld->type_item(term, l,1); if (!txt) { txt=mem_alloc(sizeof(unsigned char)); *txt=0; } for (b=0;b<l->depth;b++) x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU,0,0,BFU_ELEMENT_PIPE,0); if (l->depth>=0) /* everything except head */ { switch((l->type)&1) { case 0: /* item */ element=BFU_ELEMENT_TEE; break; case 1: /* directory */ element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED; break; default: /* this should never happen */ internal("=8-Q lunacy level too high! Call "BOHNICE".\n"); } x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU,0,0,element,(l->type)&4); } print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU); x+=strlen(txt); fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' '); set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,COLOR_MENU); mem_free(txt); } else /* flat */ { unsigned char *txt; int x=0; struct list *l; y+=direction;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -