]> git.mxchange.org Git - simgear.git/blob - PUI/puSlider.cxx
Added the Serial subdirectory
[simgear.git] / PUI / puSlider.cxx
1
2 #include "puLocal.h"
3
4 void puSlider::draw ( int dx, int dy )
5 {
6   if ( !visible ) return ;
7
8   abox . draw ( dx, dy,
9                 (style==PUSTYLE_BEVELLED||
10                  style==PUSTYLE_SHADED) ? -PUSTYLE_BOXED : -style,
11                 colour, FALSE ) ;
12
13   int sd, od ;
14
15   if ( isVertical() ) { sd = 1 ; od = 0 ; } else { sd = 0 ; od = 1 ; }
16
17   int sz = abox.max [sd] - abox.min [sd] ;
18
19   float val ;
20
21   getValue ( & val ) ;
22
23   if ( val < 0.0f ) val = 0.0f ;
24   if ( val > 1.0f ) val = 1.0f ;
25
26   val *= (float) sz * (1.0f - slider_fraction) ;
27
28   puBox bx ;
29     
30   bx . min [ sd ] = abox . min [ sd ] + (int) val ;
31   bx . max [ sd ] = (int) ( (float) bx . min [ sd ] + (float) sz * slider_fraction ) ;
32   bx . min [ od ] = abox . min [ od ] + 2 ;
33   bx . max [ od ] = abox . max [ od ] - 2 ;
34
35   bx . draw ( dx, dy, PUSTYLE_SMALL_SHADED, colour, FALSE ) ;
36
37   /* If greyed out then halve the opacity when drawing the label and legend */
38
39   if ( active )
40     glColor4fv ( colour [ PUCOL_LEGEND ] ) ;
41   else
42     glColor4f ( colour [ PUCOL_LEGEND ][0],
43                 colour [ PUCOL_LEGEND ][1],
44                 colour [ PUCOL_LEGEND ][2],
45                 colour [ PUCOL_LEGEND ][3] / 2.0f ) ; /* 50% more transparent */
46
47   int xx = ( abox.max[0] - abox.min[0] - puGetStringWidth(legendFont,legend) ) / 2 ;
48   int yy = ( abox.max[1] - abox.min[1] - puGetStringHeight(legendFont) ) / 2 ;
49
50   puDrawString ( legendFont, legend,
51                   dx + abox.min[0] + xx,
52                   dy + abox.min[1] + yy ) ;
53
54   draw_label ( dx, dy ) ;
55 }
56
57
58 void puSlider::doHit ( int button, int updown, int x, int y )
59 {
60   if ( button == PU_LEFT_BUTTON )
61   {
62     int sd = isVertical() ;
63     int sz = abox.max [sd] - abox.min [sd] ;
64     int coord = isVertical() ? y : x ;
65
66     float next_value ;
67
68     if ( sz == 0 )
69       next_value = 0.5f ;
70     else
71     {
72       next_value = ( (float)coord - (float)abox.min[sd] - (float)sz * slider_fraction / 2.0f ) /
73                    ( (float) sz * (1.0f - slider_fraction) ) ;
74     }
75
76     next_value = (next_value < 0.0f) ? 0.0f : (next_value > 1.0) ? 1.0f : next_value ;
77
78     setValue ( next_value ) ;
79
80     switch ( cb_mode )
81     {
82       case PUSLIDER_CLICK :
83         if ( updown == active_mouse_edge )
84         {
85           last_cb_value = next_value ;
86           invokeCallback () ;
87         }
88         break ;
89
90       case PUSLIDER_DELTA :
91         if ( fabs ( last_cb_value - next_value ) >= cb_delta )
92         {
93           last_cb_value = next_value ;
94           invokeCallback () ;
95         }
96         break ;
97
98       case PUSLIDER_ALWAYS :
99       default :
100         last_cb_value = next_value ;
101         invokeCallback () ;
102         break ;
103     }
104   }
105 }
106
107