/* * Displays the currently active menu for the current window */ void fgDisplayMenu( void ) { SFG_Window* window = fgStructure.Window; SFG_Menu* menu = NULL; freeglut_assert_window; /* * Check if there is an active menu attached to this window... */ menu = window->ActiveMenu; freeglut_return_if_fail( menu ); fgSetWindow( menu->Window ); glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_TEXTURE_BIT | GL_LIGHTING_BIT | GL_POLYGON_BIT ); glDisable( GL_DEPTH_TEST ); glDisable( GL_TEXTURE_2D ); glDisable( GL_LIGHTING ); glDisable( GL_CULL_FACE ); glMatrixMode( GL_PROJECTION ); glPushMatrix( ); glLoadIdentity( ); glOrtho( 0, glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ), 0, -1, 1 ); glMatrixMode( GL_MODELVIEW ); glPushMatrix( ); glLoadIdentity( ); fghCheckMenuStatus( window, menu ); fghDisplayMenuBox( menu ); glPopAttrib( ); glMatrixMode( GL_PROJECTION ); glPopMatrix( ); glMatrixMode( GL_MODELVIEW ); glPopMatrix( ); glutSwapBuffers( ); fgSetWindow ( window ); }
/* * Displays the currently active menu for the current window */ void fgDisplayMenu( void ) { SFG_Window* window = fgStructure.CurrentWindow; SFG_Menu* menu = NULL; FREEGLUT_INTERNAL_ERROR_EXIT ( fgStructure.CurrentWindow, "Displaying menu in nonexistent window", "fgDisplayMenu" ); if (!window) return; /* Check if there is an active menu attached to this window... */ menu = window->ActiveMenu; freeglut_return_if_fail( menu ); fgSetWindow( menu->Window ); glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_TEXTURE_BIT | GL_LIGHTING_BIT | GL_POLYGON_BIT ); glDisable( GL_DEPTH_TEST ); glDisable( GL_TEXTURE_2D ); glDisable( GL_LIGHTING ); glDisable( GL_CULL_FACE ); glMatrixMode( GL_PROJECTION ); glPushMatrix( ); glLoadIdentity( ); glOrtho( 0, glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ), 0, -1, 1 ); glMatrixMode( GL_MODELVIEW ); glPushMatrix( ); glLoadIdentity( ); fghDisplayMenuBox( menu ); glPopAttrib( ); glMatrixMode( GL_PROJECTION ); glPopMatrix( ); glMatrixMode( GL_MODELVIEW ); glPopMatrix( ); glutSwapBuffers( ); fgSetWindow ( window ); }
/* * Displays a menu box and all of its submenus (if they are active) */ static void fghDisplayMenuBox( SFG_Menu* menu ) { SFG_MenuEntry *menuEntry; int i; int border = FREEGLUT_MENU_BORDER; /* * Have the menu box drawn first. The +- values are * here just to make it more nice-looking... */ /* a non-black dark version of the below. */ glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glBegin( GL_QUAD_STRIP ); glVertex2i( menu->Width , 0 ); glVertex2i( menu->Width - border, border); glVertex2i( 0 , 0 ); glVertex2i( border, border); glVertex2i( 0 , menu->Height ); glVertex2i( border, menu->Height - border); glEnd( ); /* a non-black dark version of the below. */ glColor4f( 0.5f, 0.5f, 0.5f, 1.0f ); glBegin( GL_QUAD_STRIP ); glVertex2i( 0 , menu->Height ); glVertex2i( border, menu->Height - border); glVertex2i( menu->Width , menu->Height ); glVertex2i( menu->Width - border, menu->Height - border); glVertex2i( menu->Width , 0 ); glVertex2i( menu->Width - border, border); glEnd( ); glColor4fv( menu_pen_back ); glBegin( GL_QUADS ); glVertex2i( border, border); glVertex2i( menu->Width - border, border); glVertex2i( menu->Width - border, menu->Height - border); glVertex2i( border, menu->Height - border); glEnd( ); /* * Check if any of the submenus is currently active... */ for( menuEntry = (SFG_MenuEntry *)menu->Entries.First; menuEntry; menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next ) { /* * Has the menu been marked as active, maybe? */ if( menuEntry->IsActive ) { /* * That's truly right, and we need to have it highlighted. * There is an assumption that mouse cursor didn't move * since the last check of menu activity state: */ int menuID = menuEntry->Ordinal; /* * So have the highlight drawn... */ glColor4fv( menu_pen_hback ); glBegin( GL_QUADS ); glVertex2i( border, (menuID + 0)*FREEGLUT_MENU_HEIGHT + border ); glVertex2i( menu->Width - border, (menuID + 0)*FREEGLUT_MENU_HEIGHT + border ); glVertex2i( menu->Width - border, (menuID + 1)*FREEGLUT_MENU_HEIGHT + border ); glVertex2i( border, (menuID + 1)*FREEGLUT_MENU_HEIGHT + border ); glEnd( ); } } /* * Print the menu entries now... */ glColor4fv( menu_pen_fore ); for( menuEntry = (SFG_MenuEntry *)menu->Entries.First, i = 0; menuEntry; menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next, ++i ) { /* * If the menu entry is active, set the color to white */ if( menuEntry->IsActive ) glColor4fv( menu_pen_hfore ); /* * Move the raster into position... */ /* Try to center the text - JCJ 31 July 2003*/ glRasterPos2i( 2 * border, ( i + 1 )*FREEGLUT_MENU_HEIGHT - ( int )( FREEGLUT_MENU_HEIGHT*0.3 - border ) ); /* * Have the label drawn, character after character: */ glutBitmapString( FREEGLUT_MENU_FONT, (unsigned char *)menuEntry->Text); /* * If it's a submenu, draw a right arrow */ if( menuEntry->SubMenu ) { int width = glutBitmapWidth( FREEGLUT_MENU_FONT, '_' ); int x_base = menu->Width - 2 - width; int y_base = i*FREEGLUT_MENU_HEIGHT + border; glBegin( GL_TRIANGLES ); glVertex2i( x_base, y_base + 2*border); glVertex2i( menu->Width - 2, y_base + ( FREEGLUT_MENU_HEIGHT + border) / 2 ); glVertex2i( x_base, y_base + FREEGLUT_MENU_HEIGHT - border ); glEnd( ); } /* * If the menu entry is active, reset the color */ if( menuEntry->IsActive ) glColor4fv( menu_pen_fore ); } /* * Now we are ready to check if any of our children needs to be redrawn: */ for( menuEntry = ( SFG_MenuEntry * )menu->Entries.First; menuEntry; menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next ) { /* * Is that an active sub menu by any case? */ if( menuEntry->SubMenu && menuEntry->IsActive ) { /* * Yeah, indeed. Have it redrawn now: */ fgSetWindow( menuEntry->SubMenu->Window ); fghDisplayMenuBox( menuEntry->SubMenu ); fgSetWindow( menu->Window ); } } }