home *** CD-ROM | disk | FTP | other *** search
/ Kyūkyoku!! X68000 Emulator / X68000Book.dat / mac / OLS / X68000 / Ko-Window / kow142s.lzh / wsrv / slider.c < prev    next >
C/C++ Source or Header  |  1995-09-07  |  4KB  |  182 lines

  1.  
  2. #include "clip.h"
  3. #include "slider.h"
  4.  
  5. /*
  6.     proto -s slider.c > temp
  7. */
  8. static    void    GetReal( SliderClass*, int*, int* );
  9.  
  10. void    SliderSet( sp, x, y, dir, width, length, min, max )
  11. SliderClass    *sp ;
  12. int        x, y ;
  13. int        dir, width, length ;
  14. int        min, max ;
  15. {
  16.     if ( dir == DirectionY )
  17.         ClipSet( (ClipClass*)sp, x, y, width, length );
  18.     else
  19.         ClipSet( (ClipClass*)sp, x, y, length, width );
  20.  
  21.     sp->slider.dir = dir ;
  22.     sp->slider.width = width ;
  23.     sp->slider.length = length ;
  24.     sp->slider.min = min ;
  25.     sp->slider.max = max ;
  26.     sp->slider.top = 0 ;
  27.     sp->slider.size = 0 ;
  28. }
  29.  
  30. int        SliderGetCurrentPosition( sp )
  31. SliderClass    *sp ;
  32. {
  33.     return( sp->slider.top );
  34. }
  35.  
  36. int        SliderGetMaxPosition( sp )
  37. SliderClass    *sp ;
  38. {
  39.     return( sp->slider.max - sp->slider.size + 1 );
  40. }
  41.  
  42. int        SliderGetPosition( sp, x, y )
  43. SliderClass    *sp ;
  44. int        x, y ;
  45. {
  46.     int        pos, ret, max ;
  47.  
  48.     if ( sp->slider.dir == DirectionY )
  49.         pos = y - sp->clip.y1 - 1 ;
  50.     else
  51.         pos = x - sp->clip.x1 - 1 ;
  52.  
  53.     ret= ( sp->slider.max - sp->slider.min + 1 )*pos /
  54.                 (sp->slider.length <= 2 ? 1 : ( sp->slider.length - 2 ))
  55.         + sp->slider.min - sp->slider.size / 2 ;
  56.     /* Debug 1993 by H.Ogasawara(COR.)    */
  57.  
  58.     if ( ret < sp->slider.min )
  59.         ret = sp->slider.min ;
  60.     max = SliderGetMaxPosition( sp );
  61.     if ( ret > max )
  62.         ret = max ;
  63.     if ( ret < sp->slider.min )
  64.         ret = sp->slider.min ;
  65.     return( ret );
  66. }
  67.  
  68. int        SliderGetScroll( sp, step )
  69. SliderClass    *sp ;
  70. int            step ;
  71. {
  72.     int        ret, max ;
  73.  
  74.     ret = sp->slider.top + step ;
  75.     max = SliderGetMaxPosition( sp );
  76.     if ( ret > max )
  77.         ret = max ;
  78.     if ( ret < sp->slider.min )
  79.         ret = sp->slider.min ;
  80.     return( ret );
  81. }
  82.  
  83. int        SliderSetPosition( bufp, sp, top, size )
  84. DrawBuf        *bufp ;
  85. SliderClass    *sp ;
  86. int        top, size ;
  87. {
  88.     DrawBuf    *topbuf ;
  89.     int        realtop, realsize ;
  90.     int        x, y ;
  91.  
  92.     if ( bufp == NULL )
  93.     {
  94.         sp->slider.top = top ;
  95.         sp->slider.size = size ;
  96.         return( 0 );
  97.     }
  98.  
  99.     topbuf = bufp ;
  100.     x = sp->clip.x1 ;
  101.     y = sp->clip.y1 ;
  102.  
  103.     GetReal( sp, &realtop, &realsize );
  104.     if ( sp->slider.dir == DirectionY )
  105.     {
  106.         DrawSetLine( bufp++, x+1, y+1+realtop, x+sp->slider.width-2, y+realtop+realsize,
  107.                      1, OptionBox );
  108.     }
  109.     else
  110.     {
  111.         DrawSetLine( bufp++, x+1+realtop, y+1, x+realtop+realsize, y+sp->slider.width-2,
  112.                      1, OptionBox );
  113.     }
  114.  
  115.     sp->slider.top = top ;
  116.     sp->slider.size = size ;
  117.     GetReal( sp, &realtop, &realsize );
  118.     if ( sp->slider.dir == DirectionY )
  119.     {
  120.         DrawSetLine( bufp++, x+1, y+1+realtop, x+sp->slider.width-2, y+realtop+realsize,
  121.                         ShadowUp, OptionShadow );
  122.     }
  123.     else
  124.     {
  125.         DrawSetLine( bufp++, x+1+realtop, y+1, x+realtop+realsize, y+sp->slider.width-2,
  126.                         ShadowUp, OptionShadow );
  127.     }
  128.  
  129.     return 2; /* ( bufp - topbuf ) */    /* M 19950904 Copel */
  130. }
  131.  
  132. int        SliderSetDraw( bufp, sp )
  133. DrawBuf        *bufp ;
  134. SliderClass    *sp ;
  135. {
  136.     DrawBuf    *top ;
  137.     int        realtop, realsize ;
  138.     int        x, y ;
  139.  
  140.     x = sp->clip.x1 ;
  141.     y = sp->clip.y1 ;
  142.  
  143.     GetReal( sp, &realtop, &realsize );
  144.  
  145.     top = bufp ;
  146.     if ( sp->slider.dir == DirectionY )
  147.     {
  148.         DrawSetLine( bufp++, x, y, x+sp->slider.width-1, y+sp->slider.length-1,
  149.                             ShadowDown, OptionShadow );
  150.         DrawSetLine( bufp++, x+1, y+1, x+sp->slider.width-2, y+sp->slider.length-2,
  151.                             1, OptionFill );    /* M 19950905 Copel */
  152.         DrawSetLine( bufp++, x+1, y+1+realtop, x+sp->slider.width-2, y+realtop+realsize,
  153.                             ShadowUp, OptionShadow );
  154.     }
  155.     else
  156.     {
  157.         DrawSetLine( bufp++, x, y, x+sp->slider.length-1, y+sp->slider.width-1,
  158.                             ShadowDown, OptionShadow );
  159.         DrawSetLine( bufp++, x+1, y+1, x+sp->slider.length-2, y+sp->slider.width-2,
  160.                             1, OptionFill );    /* M 19950905 Copel */
  161.         DrawSetLine( bufp++, x+1+realtop, y+1, x+realtop+realsize, y+sp->slider.width-2,
  162.                             ShadowUp, OptionShadow );
  163.     }
  164.     return 3; /* ( bufp - top ) */    /* M 19950905 Copel */
  165. }
  166.  
  167. static    void    GetReal( sp, realtopp, realsizep )
  168. SliderClass    *sp ;
  169. int            *realtopp,  *realsizep ;
  170. {
  171.     int        max, len ;
  172.  
  173.     max = sp->slider.max - sp->slider.min + 1 ;
  174.     len = sp->slider.length - 2 ;
  175.     *realtopp = ( len * ( sp->slider.top - sp->slider.min ) + max / 2 )/ max ;
  176.     *realsizep = ( len * sp->slider.size + max / 2 )/ max ;    /* DEBUG 19950714 Copel */
  177.     if ( *realtopp + *realsizep > sp->slider.length - 2 )
  178.     {
  179.         *realsizep = sp->slider.length - 2 - *realtopp ;
  180.     }
  181. }
  182.