pack.cpp | main.cpp | menu.cpp | grs.cpp | ||||
pack.h | zoom.h | menu.h | grs.h |
// (c) Bernie Freidin 1999-2000 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gl/glut.h> #include "menu.h" static minfo_t MENU_LIST[20]; static void _menuCallback(int value) { int menu_id = glutGetMenu(); minfo_t *minfo = &MENU_LIST[menu_id]; double data; char buf[200]; if(minfo->preset_count < 0) { // ************ // Boolean menu // ************ if(value == 1) { sprintf(buf, "%s (on)", minfo->string); } else { sprintf(buf, "%s (off)", minfo->string); } *(int*)minfo->ptr = 2 - value; } else { // ********* // Data menu // ********* if(value-1 < minfo->preset_count) { data = minfo->preset_data[value-1]; } else { fprintf(stdout, "Enter %s: ", minfo->prompt); fgets(buf, 199, stdin); data = atof(buf); if(data < minfo->data_min) data = minfo->data_min; if(data > minfo->data_max) data = minfo->data_max; } sprintf(buf, "%s (%.4f)", minfo->string, data); *(double*)minfo->ptr = data; } glutSetMenu(minfo->parent_id); glutChangeToSubMenu(minfo->entry_id, buf, menu_id); glutPostRedisplay(); } int MENU_Register(int preset_count, char preset_data_str[], double data_min, double data_max, double data, char string[], int parent_id, int entry_id, void *ptr) { int i, menu_id = glutCreateMenu(_menuCallback); minfo_t *minfo = &MENU_LIST[menu_id]; minfo->preset_count = preset_count; minfo->data_min = data_min; minfo->data_max = data_max; minfo->ptr = ptr; strncpy(minfo->prompt, string, 199); strncpy(minfo->string, string, 199); for(i = 0; minfo->prompt[i] != '\0'; i++) { minfo->prompt[i] = tolower(minfo->prompt[i]); } minfo->parent_id = parent_id; minfo->entry_id = entry_id; char buf[500], *s = buf; strncpy(s, preset_data_str, 499); if(preset_count < 0) { // ************ // Boolean menu // ************ glutAddMenuEntry("On", 1); glutAddMenuEntry("Off", 2); if(data > 0.0) { sprintf(buf, "%s (on)", minfo->string); } else { sprintf(buf, "%s (off)", minfo->string); } *(int*)minfo->ptr = (int)data; } else { // ********* // Data menu // ********* for(i = 0; i < preset_count; i++) { char *s1 = strtok(s, " "); minfo->preset_data[i] = atof(s1); glutAddMenuEntry(s1, i+1); s = NULL; } glutAddMenuEntry("Set via console...", i+1); sprintf(buf, "%s (%.4f)", minfo->string, data); *(double*)minfo->ptr = data; } glutSetMenu(parent_id); glutAddSubMenu(buf, menu_id); return menu_id; }
This page © Bernie Freidin, 2000.