📄 utilmenu.c
字号:
return (PRO_TK_GENERAL_ERROR); ProStringToWstring(w_p, str); err = ProArraySizeGet((ProArray)*w_ptr, &n_str); err = ProArrayObjectAdd((ProArray*)w_ptr, n_str-1, 1, &w_p); return (err);}/*============================================================================*\ Function: ProUtilMenuStringsWstrAdd Purpose: Alloc memory and add string to MenuStrings array\*============================================================================*/ProError ProUtilMenuStringsWstrAdd( wchar_t ***w_ptr, wchar_t *w_str){ ProError err; wchar_t *w_p; int len, n_str; len = ProUtilWstrLen(w_str); w_p = (wchar_t*)calloc(len + 1, sizeof(wchar_t)); if (w_p == NULL) return (PRO_TK_GENERAL_ERROR); ProUtilWstrcpy(w_p, w_str); err = ProArraySizeGet((ProArray)*w_ptr, &n_str); err = ProArrayObjectAdd((ProArray*)w_ptr, n_str-1, 1, &w_p); return (err);}/*============================================================================*\ Function: ProUtilMenuStringsIntValueSelect Purpose: Select a string from menu and return it's number\*============================================================================*/ProError ProUtilMenuStringsIntValueSelect( char *menu_name, wchar_t **w_ptr, int *output_value){ ProUtilMenuButtons *buttons_array; int i, n_buttons; ProError err; for(n_buttons=1; w_ptr[n_buttons-1][0] != '\0'; n_buttons++); buttons_array = (ProUtilMenuButtons *)calloc(n_buttons+1, sizeof(ProUtilMenuButtons)); strcpy(buttons_array[0].button, menu_name); buttons_array[0].special_flag = TEST_CALL_PRO_MENU_DELETE; for(i=1; i<=n_buttons; i++) { ProWstringToString(buttons_array[i].button, w_ptr[i-1]); buttons_array[i].value = i - 1; } err = ProUtilMenuIntValueSelect(buttons_array, output_value); free(buttons_array); return (err);}/*============================================================================*\ Function: ProUtilMenuStringsFree Purpose: Free memory allocated by ..Alloc, ..StrAdd, ..WstrAdd\*============================================================================*/ProError ProUtilMenuStringsFree( wchar_t ***w_ptr){ ProError err; int i, n_str; wchar_t **w_p = *w_ptr; err = ProArraySizeGet((ProArray)w_p, &n_str); for (i=n_str-2; i>0; i--) free(w_p[i]); err = ProArrayFree((ProArray*)w_ptr); return (err);}typedef struct menu_toggle_info{ char *menu_name; wchar_t **w_menu_buttons; int *button_status; int n_buttons;} MenuToggleInfo;#define SELECT_ALL 0#define UNSEL_ALL 1#define DONE_SEL 2#define QUIT_SEL 3/*============================================================================*\ Function: ProUtilMenuToggleOne Purpose: Used from ProUtilMenuStringManySelect\*============================================================================*/int ProUtilMenuToggleOne( MenuToggleInfo *p_toggle_info, int n_str){ p_toggle_info->button_status[n_str] = !p_toggle_info->button_status[n_str]; return (0);}/*============================================================================*\ Function: ProUtilMenuToggleDone Purpose: Used from ProUtilMenuStringManySelect\*============================================================================*/int ProUtilMenuToggleDone( MenuToggleInfo *p_toggle_info, int action){ int i, sel; ProError err; ProCharName name; switch (action) { case SELECT_ALL: case UNSEL_ALL: sel = (action == SELECT_ALL); for (i=0; i<p_toggle_info->n_buttons; i++) if (p_toggle_info->button_status[i] != sel) { ProWstringToString(name, p_toggle_info->w_menu_buttons[i]); err = ProUtilMenubuttonHighlight(p_toggle_info->menu_name, name, sel); p_toggle_info->button_status[i] = sel; } break; case DONE_SEL: case QUIT_SEL: err = ProMenuDeleteWithStatus(action); err = ProMenuDeleteWithStatus(action); break; } return (0);}/*============================================================================*\ Function: ProUtilMenuStringManySelect Purpose: Select many string from menu with submenu Select All/Unsell All\*============================================================================*/ProError ProUtilMenuStringManySelect( char *menu_name, /* In : Menu name */ wchar_t **w_menu_buttons, /* In : Menu buttons */ int **output_array, /* Out: ProArray of numbers of selected strings, use ProArrayFree to free memory */ int *p_n_sel) /* Out: Number of selected components */{ int i, n_but, n_sel, menu_id, action; ProError err, ret_status = PRO_TK_USER_ABORT; int *toggle_array; MenuToggleInfo toggle_info; ProCharName name; wchar_t **w_menus; for(n_but=0; w_menu_buttons[n_but][0] != '\0'; n_but++); err = ProArrayAlloc(n_but, sizeof(int), 1, (ProArray*)&toggle_array); toggle_info.w_menu_buttons = w_menu_buttons; toggle_info.button_status = toggle_array; toggle_info.n_buttons = n_but; toggle_info.menu_name = menu_name; err = ProMenuFromStringsRegister ( menu_name, NULL, w_menu_buttons, NULL, NULL, &menu_id); for (i=0; i<n_but; i++) { toggle_array[i] = 0; ProWstringToString(name, w_menu_buttons[i]); err = ProMenubuttonActionSet(menu_name, name, (ProMenubuttonAction)ProUtilMenuToggleOne, &toggle_info, i); } err = ProMenubuttonActionSet(menu_name, menu_name, (ProMenubuttonAction)ProMenuDelete, NULL, 0); err = ProMenuModeSet(menu_name, PROMENUMODE_DATA); err = ProMenuDatamodeSet(menu_name, PRO_B_TRUE ); err = ProMenuCreate(PROMENUTYPE_MAIN, menu_name, &menu_id); err = ProUtilMenuStringsAlloc(&w_menus); err = ProUtilMenuStringsStrAdd(&w_menus, "Select All"); err = ProUtilMenuStringsStrAdd(&w_menus, "Unsel All"); err = ProUtilMenuStringsStrAdd(&w_menus, "Done Sel"); err = ProUtilMenuStringsStrAdd(&w_menus, "Quit Sel"); ProMenuFromStringsRegister ( "TkMenuUtilSelect", NULL, w_menus, NULL, NULL, &menu_id); err = ProMenubuttonActionSet("TkMenuUtilSelect", "Select All", (ProMenubuttonAction)ProUtilMenuToggleDone, &toggle_info, SELECT_ALL); err = ProMenubuttonActionSet("TkMenuUtilSelect", "Unsel All", (ProMenubuttonAction)ProUtilMenuToggleDone, &toggle_info, UNSEL_ALL); err = ProMenubuttonActionSet("TkMenuUtilSelect", "Done Sel", (ProMenubuttonAction)ProUtilMenuToggleDone, &toggle_info, DONE_SEL); err = ProMenubuttonActionSet("TkMenuUtilSelect", "Quit Sel", (ProMenubuttonAction)ProUtilMenuToggleDone, &toggle_info, QUIT_SEL); err = ProMenubuttonActionSet("TkMenuUtilSelect", "TkMenuUtilSelect", (ProMenubuttonAction)ProUtilMenuToggleDone, &toggle_info, QUIT_SEL); err = ProMenuCreate(PROMENUTYPE_SUB, "TkMenuUtilSelect", &menu_id); err = ProMenuProcess("TkMenuUtilSelect", &action); if(err == PRO_TK_NO_ERROR && action == DONE_SEL) { err = ProArrayAlloc(0, sizeof(int), 1, (ProArray*)output_array); n_sel = 0; for (i=0; i<n_but; i++) if (toggle_array[i]) { ProArrayObjectAdd((ProArray*)output_array, PRO_VALUE_UNUSED, 1, &i); n_sel++; } if (n_sel>0) { *p_n_sel = n_sel; ret_status = PRO_TK_NO_ERROR; } else err = ProArrayFree((ProArray*)output_array); } err = ProArrayFree((ProArray*)&toggle_array); return (ret_status);}#undef SELECT_ALL#undef UNSEL_ALL#undef DONE_SEL#undef QUIT_SEL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -