slider.c

Go to the documentation of this file.
00001 /* vu block 
00002  * Copyrght Enpc jpc 
00003  */
00004 #include <stdio.h>
00005 #include "core_math.h"
00006 
00007 extern int C2F(getgeom)(double *);
00008 
00009 /*----------------------------------------------------
00010  * erase a rectangle 
00011  *----------------------------------------------------*/ 
00012 extern int C2F(dr1)( char x0[],char x1[],integer *x2,integer *x3,integer *x4,integer *x5,integer *x6,
00013                          integer *x7,double *dx1,double *dx2,double *dx3,double *dx4,
00014                          integer lx0, integer lx1) ;
00015 
00016 extern int C2F(dr)(char x0[],char x1[],integer *x2,integer *x3,integer *x4,integer *x5,integer *x6,
00017                         integer *x7,double *dx1,double *dx2,double *dx3,double *dx4,
00018                         integer lx0, integer lx1) ;
00019 
00020 static void block_draw_rect_1(double r[],double percent)
00021 {
00022   integer alumode,verbose=0,narg;
00023   static integer in=6;
00024   double w = r[2]*percent;
00025   double x = r[0];
00026   C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00027   if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00028   C2F(dr1)("xfrect","v",PI0,PI0,PI0,PI0,PI0,PI0,&x,r+1,&w,r+3,0L,0L);
00029   if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00030 }
00031 
00032 static void block_draw_rect_2(double r[],double percent)
00033 {
00034   integer alumode,verbose=0,narg;
00035   /* integer flag =0;  double ang=0.0;  char foo[24]; */
00036   static integer in=6;
00037   double x = r[0]+ r[2]*percent-2;
00038   double w = 4;
00039   C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00040   if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00041   C2F(dr1)("xfrect","v",PI0,PI0,PI0,PI0,PI0,PI0,&x,r+1,&w,r+3,0L,0L);
00042   /* sprintf(foo,"%5.3f",percent);
00043      C2F(dr1)("xstring",foo,PI0,PI0,PI0,&flag,PI0,PI0,r,r+1,&ang,PD0,0L,0L);
00044   */
00045 
00046   if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00047 }
00048 
00049 
00050 static void block_draw_rect_3(double r[],double percent)
00051 {
00052   integer alumode,verbose=0,narg;
00053   integer flag =0;  double ang=0.0;  char foo[24];
00054   static integer in=6;
00055   double x = r[0] + (1.0/10)*r[2];
00056   double y = r[1] - r[3] + 2 ;
00057   C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00058   if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00059   sprintf(foo,"%5.3f",percent);
00060   C2F(dr1)("xstring",foo,PI0,PI0,PI0,&flag,PI0,PI0,&x,&y,&ang,PD0,0L,0L);
00061   if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00062 }
00063 
00064 
00065 
00066 
00067 /*----------------------------------------------------
00068  * switch to X11 driver  
00069  *----------------------------------------------------*/ 
00070 
00071 #define REMOVE_REC_DRIVER() char old_rec[4]; int rem_flag ; rem_flag = scig_driverX11(old_rec); 
00072 #define RESTORE_DRIVER() if (rem_flag == 1) C2F(SetDriver)(old_rec,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00073 
00074 static int scig_driverX11(char *old) 
00075 {
00076   GetDriver1(old,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00077   if ( old[0] == 'R' )
00078     {
00079       C2F(SetDriver)("X11",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00080       return 1;
00081     }
00082   return 0;
00083 }
00084 
00085 /*----------------------------------------------------
00086  * changes the current window to win 
00087  * returns the old current window number 
00088  *----------------------------------------------------*/ 
00089 
00090 static int set_block_win( int win)
00091 {
00092   static int verbose = 0, cur,narg;
00093   C2F(dr)("xget","window",&verbose,&cur,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00094   if ( cur != win ) 
00095     C2F(dr)("xset","window",&win,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00096   return cur ;
00097 }
00098 
00099 /*----------------------------------------------------
00100  * changes the current color to color 
00101  * returns the old color
00102  *----------------------------------------------------*/ 
00103 
00104 
00105 static int set_slider_color( int color)
00106 {
00107   static int verbose = 0, cur,narg;
00108   C2F(dr)("xget","color",&verbose,&cur,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00109   if ( cur != color ) 
00110     C2F(dr)("xset","color",&color,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00111   return cur ;
00112 }
00113 
00114 /*----------------------------------------------------
00115  * follow an input value with a graphic slider 
00116  * 
00117  *  rpar = [min-range, max-range] 
00118  *  ipar = [type (1,2),color]
00119  *  z = [val,window,x,y,w,h] 
00120  *----------------------------------------------------*/
00121 
00122 void slider(integer *flag, integer *nevprt, double *t, double *xd,
00123             double *x, integer *nx, double *z, integer *nz,
00124             double *tvec, integer *ntvec, double *rpar,
00125             integer *nrpar, integer *ipar, integer *nipar,
00126             double * u, integer *nu, double * y, integer *ny) 
00127 {
00128   
00129   int wid, idb = 0 ; /* XXX remettre idb avec son common */
00130   int cur; 
00131   static double th=2 ; /* border thickness */
00132   static double t3d = 4.0 ; /* 3d look thickness */
00133   int curcolor;
00134   if ( idb == 1 ) 
00135     sciprint("Slider t=%10.3f, flag=%d \r\n",*t,*flag);
00136 
00137   switch ( *flag ) {
00138   case 2 : 
00139     /* standard case */ 
00140     wid= (int) z[1];
00141     if( wid < 0) return;
00142     cur = set_block_win(wid) ; 
00143     {
00144       double val = Min(rpar[1],Max(rpar[0],u[0]));
00145       double percent = (val - rpar[0])/(rpar[1]-rpar[0]);
00146       if ( Abs(z[0] - percent) > 0.01 ) /* a mettre en parametre XXXXX */
00147         {
00148           REMOVE_REC_DRIVER();
00149           curcolor=set_slider_color(ipar[1]);
00150           switch (ipar[0]) 
00151             {
00152             case 1 : 
00153               block_draw_rect_1(z+2,z[0]);
00154               block_draw_rect_1(z+2,percent);
00155               break;
00156             case 2 :
00157               block_draw_rect_2(z+2,z[0]);
00158               block_draw_rect_2(z+2,percent);
00159               break;
00160             case 3 :
00161               block_draw_rect_3(z+2,z[0]);
00162               block_draw_rect_3(z+2,percent);
00163               break;
00164             }
00165           curcolor=set_slider_color(curcolor);
00166           z[0] = percent;
00167           RESTORE_DRIVER();
00168         }
00169     }
00170     set_block_win(cur);
00171     break;
00172   case 4 : 
00173     /* initial case */ 
00174     z[0]= 0.0;
00175     C2F(getgeom)(z+1);
00176     z[2] = z[2]+ t3d +th ; 
00177     z[4] -= t3d + 2*th  ;
00178     z[3] = z[3] + z[5] ;
00179     z[5] -= t3d  ;
00180     wid= (int) z[1];
00181     if( wid < 0) return;
00182     cur = set_block_win(wid) ; 
00183     {
00184       REMOVE_REC_DRIVER();
00185       curcolor=set_slider_color(ipar[1]);
00186       C2F(dr1)("xclea","v",PI0,PI0,PI0,PI0,PI0,PI0,z+2,z+3,z+4,z+5,0L,0L);
00187       switch (ipar[0]) 
00188         {
00189         case 1 : 
00190           block_draw_rect_1(z+2,z[0]);
00191           break;
00192         case 2 :
00193           block_draw_rect_2(z+2,z[0]);
00194           break;
00195         case 3 :
00196           block_draw_rect_3(z+2,z[0]);
00197           break;
00198 
00199         }
00200       curcolor=set_slider_color(curcolor);
00201       RESTORE_DRIVER();
00202     }
00203     set_block_win(cur);
00204     break;
00205   }
00206 }
00207 

Generated on Sun Mar 4 15:04:00 2007 for Scilab [trunk] by  doxygen 1.5.1