📄 menu.c
字号:
#include "menu.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <GL/gl.h>#include "options.h"#include "sys_stuff.h"menuType * menu_new( void (* callback)( int, void * ) ){ menuType * menu; DPRINTF("menu_new:\n"); menu = malloc(sizeof(menuType)); menu->nr = 0; menu->select_id = -1; menu->p_select_id = &(menu->select_id); menu->select_index = 0; menu->textedit_mode = 0; menu->callback = callback; menu->parent = (menuType *)0; return menu;}void menu_add_submenu( menuType * menu, char * text, menuType * submenu, int show_subsetting ){ DPRINTF("menu_add_submenu:\n"); if(menu->nr<MAX_MENU_ENTRY_NUM){ menu->entry[menu->nr].type = ENTRY_TYPE_SUBMENU; strcpy( menu->entry[menu->nr].text, text); menu->entry[menu->nr].settingtext[0] = 0; menu->entry[menu->nr].submenu = submenu; menu->entry[menu->nr].text_obj = (textObj *)0;// menu->entry[menu->nr].settingtext_obj = (textObj *)0; menu->entry[menu->nr].fontname = options_menu_fontname; menu->entry[menu->nr].fontsize = 32; menu->entry[menu->nr].show_subsetting = show_subsetting; menu->entry[menu->nr].arg = (void *) 0; if(submenu!=(menuType *)0){ submenu->callback = menu->callback; submenu->p_select_id = menu->p_select_id; submenu->parent = menu; submenu->parent_entry = &(menu->entry[menu->nr]); } menu->nr++; } else { printf("menu_add_submenu: too many menu entries - ignoring this entry\n"); }}void menu_add_entry( menuType * menu, char * text, int id ){ DPRINTF("menu_add_entry:\n"); if(menu->nr<MAX_MENU_ENTRY_NUM){ menu->entry[menu->nr].type = ENTRY_TYPE_ID; strcpy( menu->entry[menu->nr].text, text ); menu->entry[menu->nr].settingtext[0] = 0; menu->entry[menu->nr].id = id; menu->entry[menu->nr].text_obj = (textObj *)0;// menu->entry[menu->nr].settingtext_obj = (textObj *)0; menu->entry[menu->nr].fontname = options_menu_fontname; menu->entry[menu->nr].fontsize = 32; menu->entry[menu->nr].arg = (void *) 0; menu->nr++; } else { printf("menu_add_entry: too many menu entries - ignoring this entry\n"); }}void menu_add_arg_entry( menuType * menu, char * text, int id, void * arg ){ DPRINTF("menu_add_arg_entry:\n"); if(menu->nr<MAX_MENU_ENTRY_NUM){ menu->entry[menu->nr].type = ENTRY_TYPE_ID; strcpy( menu->entry[menu->nr].text, text ); menu->entry[menu->nr].settingtext[0] = 0; menu->entry[menu->nr].id = id; menu->entry[menu->nr].text_obj = (textObj *)0; // menu->entry[menu->nr].settingtext_obj = (textObj *)0; menu->entry[menu->nr].fontname = options_menu_fontname; menu->entry[menu->nr].fontsize = 32; menu->entry[menu->nr].arg = arg; menu->nr++; } else { printf("menu_add_arg_entry: too many menu entries - ignoring this entry\n"); }}void menu_add_textfield( menuType * menu, char * text, int id, int fixedlen ){ DPRINTF("menu_add_arg_entry:\n"); if(menu->nr<MAX_MENU_ENTRY_NUM){ menu->entry[menu->nr].type = ENTRY_TYPE_TEXTFIELD; strcpy( menu->entry[menu->nr].text, text ); menu->entry[menu->nr].settingtext[0] = 0; menu->entry[menu->nr].id = id; menu->entry[menu->nr].text_obj = (textObj *)0; // menu->entry[menu->nr].settingtext_obj = (textObj *)0; menu->entry[menu->nr].fontname = options_menu_fontname; menu->entry[menu->nr].fontsize = 32; menu->entry[menu->nr].arg = (void *)0; menu->entry[menu->nr].fixedlen = fixedlen; menu->nr++; } else { printf("menu_add_textfield: too many menu entries - ignoring this entry\n"); }}void menu_add_exit( menuType * menu, char * text ){ DPRINTF("menu_add_exit:\n"); if(menu->nr<MAX_MENU_ENTRY_NUM){ menu->entry[menu->nr].type = ENTRY_TYPE_EXIT; strcpy( menu->entry[menu->nr].text, text ); menu->entry[menu->nr].settingtext[0] = 0; menu->entry[menu->nr].text_obj = (textObj *)0;// menu->entry[menu->nr].settingtext_obj = (textObj *)0; menu->entry[menu->nr].fontname = options_menu_fontname; menu->entry[menu->nr].fontsize = 32; menu->entry[menu->nr].arg = (void *) 0; menu->nr++; } else { printf("menu_add_exit: too many menu entries - ignoring this entry\n"); }}void menu_entry_set_text( menuEntry * entry, char * text ){ char str[256]; strcpy( entry->text, text ); if( entry->text_obj != (textObj *)0 ){ if( entry->show_subsetting && entry->settingtext[0]!=0 ){ sprintf(str,"%s : %s",entry->text,entry->settingtext); textObj_setText( entry->text_obj, str );// textObj_setText( entry->text_obj, text ); } else { textObj_setText( entry->text_obj, text ); } }}void menu_entry_set_settingtext( menuEntry * entry, char * text ){ char str[256]; strcpy( entry->settingtext, text ); if( entry->text_obj != (textObj *)0 ){ if( entry->show_subsetting && entry->settingtext[0]!=0 ){ sprintf(str,"%s : %s",entry->text,entry->settingtext); textObj_setText( entry->text_obj, str );/* sprintf(str," : %s",entry->settingtext); if( entry->settingtext_obj != (textObj *)0 ){ textObj_setText( entry->settingtext_obj, str ); } else { entry->settingtext_obj=textObj_new( str, entry->fontname, entry->fontsize ); }*/ } else { textObj_setText( entry->text_obj, text ); } }}static void menu_create_textobj( menuEntry * entry ){ char str[256]; if( entry->text_obj == (textObj *)0 ){ if( entry->show_subsetting && entry->settingtext[0]!=0 ){ sprintf(str,"%s : %s",entry->text,entry->settingtext); entry->text_obj = textObj_new( str, entry->fontname, entry->fontsize );/* entry->text_obj = textObj_new( entry->text, entry->fontname, entry->fontsize ); sprintf(str," : %s",entry->settingtext); entry->settingtext_obj = textObj_new( str, entry->fontname, entry->fontsize );*/ } else { entry->text_obj = textObj_new( entry->text, entry->fontname, entry->fontsize ); }// textObj_toggle3D(entry->text_obj); }}void menu_select_by_coord( menuType * menu, int x, int y )/* selects the menupoint under the pos x,y */{ int i,x1,y1,x2,y2, all_height; if(!menu->textedit_mode){ all_height=0; for(i=0;i<menu->nr;i++){ all_height+=menu->entry[i].fontsize; } for(i=0;i<menu->nr;i++){ // fprintf( stderr, "menu->entry[i].text_obj = %d\n", menu->entry[i].text_obj ); if( menu->entry[i].text_obj == (textObj *)0 ){ menu_create_textobj( &(menu->entry[i]) ); } x1 = -menu->entry[i].text_obj->quad_w/2; y1 = all_height/2-i*menu->entry[i].fontsize-menu->entry[i].text_obj->quad_h/2; x2 = +menu->entry[i].text_obj->quad_w/2; y2 = all_height/2-i*menu->entry[i].fontsize+menu->entry[i].text_obj->quad_h/2; if( x<=x2 && x>=x1 && y<=y2 && y>=y1 ){ menu->select_index=i; *(menu->p_select_id)=menu->entry[i].id; } } }}void menu_select_next( menuType * menu )/* selects the next menupoint in the current submenu */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -