]> git.mxchange.org Git - flightgear.git/blob - Lib/PUI/puMenuBar.cxx
Merge FG_Lib as subdirectory
[flightgear.git] / Lib / PUI / puMenuBar.cxx
1
2 #include "puLocal.h"
3
4 void drop_down_the_menu ( puObject *b )
5 {
6   puPopupMenu *p = (puPopupMenu *) b -> getUserData () ;
7
8   if ( b -> getValue () )
9     p->reveal () ;
10   else
11     p->hide () ;
12
13   for ( puObject *child = b -> getParent () -> getFirstChild () ;
14         child != NULL ; child = child -> next )
15   {
16     if (( child -> getType() & PUCLASS_BUTTON    ) != 0 && child != b ) child -> clrValue () ;
17     if (( child -> getType() & PUCLASS_POPUPMENU ) != 0 && child != p ) child -> hide     () ;
18   }
19 }
20
21 void puMenuBar::add_submenu ( char *str, char *items[], puCallback cb[] )
22 {
23   int w, h ;
24   getSize ( &w, &h ) ;
25
26   puOneShot    *b = new puOneShot ( w+10, 0, str ) ;
27   b -> setStyle ( PUSTYLE_SPECIAL_UNDERLINED ) ;
28   b -> setColourScheme ( colour[PUCOL_FOREGROUND][0],
29                          colour[PUCOL_FOREGROUND][1],
30                          colour[PUCOL_FOREGROUND][2],
31                          colour[PUCOL_FOREGROUND][3] ) ;
32   b -> setCallback ( drop_down_the_menu ) ;
33   b -> setActiveDirn ( PU_UP_AND_DOWN ) ;
34
35   puPopupMenu *p = new puPopupMenu ( w+10, 0 ) ;
36
37   b -> setUserData ( p ) ;
38
39   for ( int i = 0 ; items[i] != NULL ; i++ )
40     p -> add_item ( items[i], cb[i] ) ;
41
42   p->close () ;
43   recalc_bbox () ;
44 }
45
46 void puMenuBar::close (void)
47 {
48   puInterface::close () ;
49
50   if ( dlist == NULL )
51     return ;
52
53   int width = 0 ;
54   puObject *ob ;
55
56   /*
57     Use alternate objects - which gets the puOneShot/puPopupMenu pairs
58   */
59
60   for ( ob = dlist ; ob != NULL ; ob = ob -> next )
61   {
62     int w, h ;
63
64     /* Reposition the button so it looks nice */
65
66     ob -> getSize ( &w, &h ) ;
67     ob -> setPosition ( width, 0 ) ;
68     ob = ob -> next ;
69
70     /* Reposition the submenu so it sits under the button */
71
72     int w2, h2 ;
73     ob -> getSize ( &w2, &h2 ) ;
74     ob -> setPosition ( width, -h2 ) ;
75
76     /* Next please! */
77     width += w ;
78   }
79
80   recalc_bbox () ;
81 }
82
83