]> git.mxchange.org Git - flightgear.git/blob - src/GUI/sgVec3Slider.cxx
Fixes to vor/ils/adf range pickup.
[flightgear.git] / src / GUI / sgVec3Slider.cxx
1 /**
2  *      sgVec3Slider.cxx
3  *
4  *      Simple PUI wrapper around sgVec3 class
5  *
6  *      Created by: Norman Vine [NHV]
7  *         nhv@yahoo.com, nhv@cape.com
8  *
9  *      Revision History
10  *      ---------------- 
11  *  Started 12:53 01/28/2001
12  *
13  */
14
15 #include "sgVec3Slider.hxx"
16
17 class FloatSlider : public puSlider
18 {
19
20         protected:
21                 float maxValue;
22                 float origValue;
23                 float Adjust;
24                 float MyValue;
25                 float TmpValue;
26                 float SaveValue;
27                 char buf[8];
28                 char _title[32];
29                 char _text[16];
30         public:
31                 FloatSlider ( int x, int y, int sz, float f, const char *title,
32                                           float max = 100.0f );
33
34                 ~FloatSlider () {;}
35
36                 static void adj( puObject *);
37
38                 void updateText() {
39                         sprintf( _text, "%05.2f", MyValue );
40                 }
41
42                 float get() { return( MyValue ); }
43                 void  set() { MyValue = ((2.0*maxValue) * (TmpValue - 0.5f)) - maxValue; }
44
45                 float *getTmp() { return( &TmpValue ); }
46                 void   setTmp() { TmpValue += 0.5f; }
47
48                 // double the range from -max <-> max
49                 void init( float f ) {
50                         Adjust   = 0.5f / maxValue;
51                         setValue((f * Adjust) + 0.5f);
52                         adj( this );
53                 }
54
55                 void reinit() { init( origValue ); }
56
57                 void cancel() { MyValue = TmpValue; }
58                 void reset () { init( origValue ); }
59
60 };
61
62 void FloatSlider::adj( puObject *hs )
63 {
64         FloatSlider *slider = (FloatSlider *)hs->getUserData();
65         slider->getValue ( slider->getTmp() );
66         slider->setTmp();
67         slider->set();
68         slider->updateText();
69 }
70
71 FloatSlider::FloatSlider ( int x, int y, int sz, float f, const char *title,
72                                                    float max ) :  puSlider( x, y, sz, FALSE )
73 {
74         setUserData( this );
75         maxValue = max;
76         origValue = f;
77         init(f);
78         setDelta    ( 0.01 );
79         setCBMode   ( PUSLIDER_DELTA ) ;
80         setCallback ( adj ) ;
81         strcpy      ( _title, title);
82         setLabel    ( _title );
83         setLabelPlace ( PUPLACE_LEFT  );
84         setLegend(_text);
85         // setLegendPlace( PUPLACE_RIGHT );
86 }
87
88
89 /***********************************************/
90
91 class sgVec3Slider : public puDialogBox
92 {
93         static void goAway(puObject *p_obj);
94         static void reset(puObject *p_obj);
95         static void cancel(puObject *p_obj);
96
97         protected:
98                 char Label[64];
99                 FloatSlider *HS0;
100                 FloatSlider *HS1;
101                 FloatSlider *HS2;
102                 puOneShot *OkButton;
103                 puOneShot *ResetButton;
104                 puOneShot *CancelButton;
105                 sgVec3 Vec, SaveVec;
106         public:
107
108                 sgVec3Slider ( int x, int y, sgVec3 vec,
109                                            const char *title = "Vector Adjuster",
110                                            const char *Xtitle = "X",
111                                            const char *Ytitle = "Y",
112                                            const char *Ztitle = "Z" );
113
114                 ~sgVec3Slider () {;}
115
116                 // ???
117                 void setVec() {
118                         Vec[0] = HS2->get();
119                         Vec[1] = HS1->get();
120                         Vec[2] = HS0->get();
121                 }
122
123                 sgVec3 *getVec() { setVec(); return &Vec; };
124
125                 sgVec3 *getStashVec() { return &SaveVec; }
126                 void stashVec() { sgCopyVec3( SaveVec, Vec ); }
127
128                 FloatSlider *getHS0() { return HS0; }
129                 FloatSlider *getHS1() { return HS1; }
130                 FloatSlider *getHS2() { return HS2; }
131
132                 static void adjust(puObject *p_obj);
133 };
134
135 sgVec3Slider::sgVec3Slider ( int x, int y, sgVec3 vec, const char *title,
136                                                                    const char *Xtitle = "X",
137                                                                    const char *Ytitle = "Y",
138                                                                    const char *Ztitle = "Z"     )
139                                         : puDialogBox ( x, y )
140 {
141         int DialogX = x;
142         int DialogY = y;
143         int fudge = 20;
144         static const int DialogWidth = 230 + fudge;
145
146         sgCopyVec3(SaveVec, vec);
147         sgCopyVec3(Vec, vec);
148         strcpy( Label, title );
149
150         static const int nSliders = 3;
151         static const int slider_x = 10+fudge;
152         int slider_y = 55;
153         static const int slider_width = 210;
154         static const int slider_title_x = 15;
155         static const int slider_value_x = 160;
156
157         puFont LegendFont, LabelFont;
158         puGetDefaultFonts ( &LegendFont, &LabelFont );
159
160         int horiz_slider_height = puGetStringHeight    (&LabelFont) +
161                                                           puGetStringDescender (&LabelFont) +
162                                                           PUSTR_TGAP + PUSTR_BGAP + 5;
163
164         // HACKS
165         setUserData( this );
166         horiz_slider_height += 10;
167
168         new puFrame ( 0, 0,
169                                   DialogWidth,
170                                   85 + nSliders * horiz_slider_height );
171
172         setLabelPlace( PUPLACE_DEFAULT /*PUPLACE_CENTERED*/ );
173         setLabel( Label );
174
175         HS2 = new FloatSlider (  slider_x, slider_y, slider_width, vec[2], Ztitle );
176         slider_y += horiz_slider_height;
177
178         HS1 = new FloatSlider (  slider_x, slider_y, slider_width, vec[1], Ytitle );
179         slider_y += horiz_slider_height;
180
181         HS0 = new FloatSlider (  slider_x, slider_y, slider_width, vec[0], Xtitle );
182
183         OkButton = new puOneShot ( 10+fudge, 10, 60+fudge, 50 );
184         OkButton-> setUserData( this );
185         OkButton-> setLegend ( gui_msg_OK );
186         OkButton-> makeReturnDefault ( TRUE );
187         OkButton-> setCallback ( goAway );
188
189         CancelButton = new puOneShot ( 70+fudge, 10, 150+fudge, 50 );
190         CancelButton-> setUserData( this );
191         CancelButton-> setLegend ( gui_msg_CANCEL );
192         CancelButton-> setCallback ( cancel );
193
194         ResetButton = new puOneShot ( 160+fudge, 10, 220+fudge, 50 );
195         ResetButton-> setUserData( this );
196         ResetButton-> setLegend ( gui_msg_RESET );
197         ResetButton-> setCallback ( reset );
198
199         FG_FINALIZE_PUI_DIALOG( this );
200
201 }
202
203
204 void sgVec3Slider::goAway(puObject *p_obj)
205 {
206         sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
207         FG_POP_PUI_DIALOG( me );
208 };
209
210 void sgVec3Slider::reset(puObject *p_obj)
211 {
212         sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
213         me->HS0->reinit();
214         me->HS1->reinit();
215         me->HS2->reinit();
216 };
217
218 void sgVec3Slider::cancel(puObject *p_obj)
219 {
220         sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
221         sgVec3 vec;
222         sgVec3 *pvec = me -> getStashVec();
223         sgCopyVec3( vec, *pvec );
224         me->HS0->init(vec[0]);
225         me->HS1->init(vec[1]);
226         me->HS2->init(vec[2]);
227         FG_POP_PUI_DIALOG( me );
228 };
229
230 void sgVec3Slider::adjust(puObject *p_obj)
231 {
232         sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
233         me -> getHS0() -> adj((puObject *)me -> getHS0());
234         me -> getHS1() -> adj((puObject *)me -> getHS1());
235         me -> getHS2() -> adj((puObject *)me -> getHS2());
236         me -> setVec();
237 };
238
239 void sgVec3SliderAdjust( puObject *p_obj )
240 {
241         sgVec3Slider *me = (sgVec3Slider *)p_obj -> getUserData();
242         me -> adjust( me );
243         FG_PUSH_PUI_DIALOG( me );
244 }
245
246 // These are globals for now
247 static puObject *PO_vec = 0;
248
249 void PilotOffsetInit( sgVec3 vec )
250 {
251         // Only one of these things for now
252         if( PO_vec == 0 ) {
253                 sgVec3Slider *PO = new sgVec3Slider ( 200, 200, vec, "Pilot Offset" );
254                 PO_vec = PO;
255         }
256 }
257
258 void PilotOffsetAdjust( puObject * )
259 {
260         if( PO_vec == 0 ) {
261                 sgVec3 v;
262                 // we seem to need the ~quite zero terms ???
263                 sgSetVec3(v,15,0.0001,0.0001);
264                 PilotOffsetInit(v);
265         }
266         sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
267         me -> stashVec();
268         me -> adjust( me );
269         FG_PUSH_PUI_DIALOG( me );
270 }
271
272 sgVec3 *PilotOffsetGet()
273 {
274         if( PO_vec == 0 ) {
275                 sgVec3 v;
276                 // we seem to need the ~quite zero terms ???
277                 sgSetVec3(v,15,0.0001,0.0001);
278                 PilotOffsetInit(v);
279         }
280         sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
281         return( me -> getVec() );
282 }