📄 topmenu.c
字号:
#include "topmenu.h"int TopMenu::InitTopMenu(int Y,int X,int Height,int Width,int Color,int Shadow,int FontStyle,int WinType,char *Title){ int i; int maxwidth; if(InitBaseWindow(Y,X,Height,Width,Color,Shadow,FontStyle,WinType,Title)==FALSE) return FALSE; keypad(basewin,TRUE); wborder(basewin,' ',' ',' ',' ',' ',' ',' ',' '); itemcount=ARRAY_SIZE(TopMenuList); items = (ITEM **)calloc(itemcount, sizeof(ITEM *)); itemwidth=0; for(i = 0; i < itemcount; ++i) { items[i] = new_item(TopMenuList[i],NULL); item_opts_on(items[i], O_SELECTABLE); maxwidth = strlen(TopMenuList[i]); itemwidth = (itemwidth>maxwidth)?(itemwidth):(maxwidth); } items[itemcount] = (ITEM *)NULL; menu = new_menu((ITEM **)items); set_menu_fore(menu, COLOR_PAIR(Color) | A_REVERSE); set_menu_back(menu, COLOR_PAIR(Color)); set_menu_mark(menu, ""); set_menu_win(menu, basewin); set_menu_sub(menu, derwin(basewin, 1,COLS,0,0)); set_menu_format(menu, 1, itemcount); menu_opts_on(menu, O_SHOWDESC); post_menu(menu); wrefresh(basewin); active=FALSE; curitem=0; cursubitem=0; return TRUE;}int TopMenu::Active(int item){ if(active!=TRUE) { active=TRUE; ShowSubMenu((item>=0)?(item):(curitem)); } return active;}int TopMenu::Active(){ active=TRUE; ShowSubMenu(curitem); return active;}int TopMenu::IsActive(){ return active;}int TopMenu::LostActive(){ active=FALSE; DestroySubMenu(curitem); return active;}void TopMenu::DestroyTopMenu(){ int i; DestroySubMenu(curitem); if(items!=NULL) { for(i = 0; i < itemcount; ++i) { if(items[i]!=NULL) { free_item(items[i]); items[i]=NULL; } } items=NULL; } if(menu!=NULL) { unpost_menu(menu); free_menu(menu); menu=NULL; } DestroyBaseWindow(); }int TopMenu::MenuDriver(int key){ int ret=0; switch(key) { case KEY_LEFT: if (--curitem<0) { ret=menu_driver(menu, REQ_LAST_ITEM); DestroySubMenu(curitem+1); curitem=itemcount-1; //ShowSubMenu(curitem); } else { ret = menu_driver(menu, REQ_LEFT_ITEM); DestroySubMenu(curitem+1); //ShowSubMenu(curitem); } wrefresh(basewin); ret=UPDATE_CODEAREA | ACTIVE_TOPMENU; break; case KEY_RIGHT: if (++curitem>=itemcount) { ret=menu_driver(menu, REQ_FIRST_ITEM); DestroySubMenu(curitem-1); curitem=0; //ShowSubMenu(curitem); } else { ret = menu_driver(menu, REQ_RIGHT_ITEM); DestroySubMenu(curitem-1); //ShowSubMenu(curitem); } wrefresh(basewin); ret=UPDATE_CODEAREA | ACTIVE_TOPMENU; break; case KEY_UP: if(--cursubitem<0) { cursubitem=item_count(submenu)-1; ret = menu_driver(submenu,REQ_LAST_ITEM); } else { ret = menu_driver(submenu, REQ_UP_ITEM); } wrefresh(subwin); break; case KEY_DOWN: if(++cursubitem>=item_count(submenu)) { cursubitem=0; ret = menu_driver(submenu,REQ_FIRST_ITEM); } else { ret = menu_driver(submenu, REQ_DOWN_ITEM); } wrefresh(subwin); break; case KEY_F(2): LostActive(); wrefresh(subwin); ret = ACTIVE_CODEAREA; break; case 10://KEY_ENTER ret = MenuSelected((curitem+1)*10+(cursubitem+1)); break; } return ret;}void TopMenu::ShowSubMenu(){ ShowSubMenu(curitem);}void TopMenu::ShowSubMenu(int item){ int beginy,beginx; int width=0,maxwidth=0; int i; beginy = 1; beginx = (item)*itemwidth + item+1; subitemscount=SubMenuCount[item]; subitems = (ITEM **)calloc(subitemscount+1, sizeof(ITEM *)); for(i = 0; i < subitemscount; ++i) { subitems[i] = new_item(SubMenuList[item][i], NULL); width=strlen(SubMenuList[item][i]); maxwidth=(maxwidth>width)?(maxwidth):(width); } subitems[subitemscount] = (ITEM *)NULL; submenu = new_menu((ITEM **)subitems); set_menu_fore(submenu, COLOR_PAIR(GetColor()) | A_REVERSE); set_menu_back(submenu, COLOR_PAIR(GetColor())); subwin = newwin(subitemscount+2,maxwidth+3,beginy,beginx); SET_STYLE(subwin,GetColor()); keypad(subwin, TRUE); set_menu_win(submenu, subwin); set_menu_sub(submenu, derwin(subwin, subitemscount,maxwidth+1, 1, 1)); set_menu_mark(submenu, "*"); box(subwin, 0, 0); post_menu(submenu); cursubitem=0; wrefresh(subwin);}void TopMenu::DestroySubMenu(int item){ int i; if (submenu!=NULL) { unpost_menu(submenu); free_menu(submenu); submenu=NULL; } if(subitems!=NULL) for(i = 0; i <=subitemscount; i++) { if(subitems[i]!=NULL) { free_item(subitems[i]); subitems[i]=NULL; } } if (subwin!=NULL) { CLOSE_STYLE(subwin,GetColor()); wborder(subwin,' ',' ',' ',' ',' ',' ',' ',' '); wrefresh(subwin); delwin(subwin); } subitemscount=0; submenu=NULL; subwin=NULL; subitems=NULL;}int TopMenu::MenuSelected(int menuID){ int ret=0; switch(menuID) { case MENU_FILE_NEW: msg.fileobj.type=DIALOG_FILENEW; ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS; break; case MENU_FILE_OPEN: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_FILEOPEN; ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS; break; case MENU_FILE_SAVE: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_FILESAVE; ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS; break; case MENU_FILE_SAVEAS: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_FILESAVEAS; ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS; break; case MENU_FILE_SHELL: def_prog_mode(); endwin(); system("/bin/bash"); reset_prog_mode(); ret = REFRESH_ALLWINDOWS; break; case MENU_FILE_EXIT: ret = EXIT_APPLICATION; break; case MENU_EDIT_CUT: break; case MENU_EDIT_COPY: break; case MENU_EDIT_PASTER: break; case MENU_EDIT_DEL://del selected block { LostActive(); wrefresh(subwin); msg.blockop.type=BLOCKDEL; ret= BLOCK_OPERATE | UPDATE_STATUS; break; } case MENU_EDIT_FIND: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_EDITFIND; ret = UPDATE_CODEAREA| EDIT_DIALOG | UPDATE_STATUS; break; case MENU_EDIT_SELECTALL: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_EDITSELECTALL; ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS; break; case MENU_EDIT_REPLACE: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_EDITREPLACE; ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS; break; case MENU_EDIT_SELECT: LostActive(); wrefresh(subwin); msg.fileobj.type=DIALOG_EDITSELECT; ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS; break; case MENU_EDIT_UNSELECT: break; case MENU_CODE_INDENT: { msg.toolobj.type=TOOLS_INDENT; ret = UPDATE_CODEAREA | CODE_TOOLS | UPDATE_STATUS | ACTIVE_CODEAREA; break; } case MENU_CODE_AUTOMAKE: { msg.toolobj.type=TOOLS_AUTOMAKE; ret = UPDATE_CODEAREA | CODE_TOOLS | UPDATE_STATUS | ACTIVE_CODEAREA; break; } case MENU_CODE_AUTOCONF: break; case MENU_BUILD_BUILD: break; case MENU_BUILD_STRACE: break; case MENU_BUILD_DEBUG: break; case MENU_BUILD_STEPIN: break; case MENU_BUILD_STEPOUT: break; case MENU_BUILD_STEPOVER: break; case MENU_BUILD_WATCH: break; case MENU_BUILD_MEMORY: break; case MENU_SET_OPTION: break; case MENU_SET_CUSTOM: break; case MENU_SET_EDITOR: break; case MENU_SET_LANGUAGE: break; case MENU_SET_FORMAT: break; case MENU_SET_DIRECTORY: break; case MENU_SET_BACKGROUND: break; case MENU_HELP_ABOUT: ret = SHOW_ABOUT_DIALOG; break; case MENU_HELP_HELP: ret = SHOW_HELP_DIALOG; break; default: ret = -1; } return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -