home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / pufferfish / source / handlegadgets.c < prev    next >
C/C++ Source or Header  |  1994-03-26  |  6KB  |  292 lines

  1. /*
  2.  * handlegadgets.c
  3.  *
  4.  * Gadget handling routines for PufferFish
  5.  *
  6.  */
  7. #include <exec/types.h>
  8.  
  9. #include <intuition/intuition.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <intuition/imageclass.h>
  12.  
  13. #include <clib/exec_protos.h>
  14. #include <clib/intuition_protos.h>
  15.  
  16. #include "PufferFish.h"
  17.  
  18. /*
  19.  * update_gadgets()
  20.  *
  21.  * General dispatcher to handle gadgets
  22.  *
  23.  */
  24. void update_gadgets( ULONG id )
  25. {
  26.     if( id <= GAD_UPARROW_8 )
  27.     {
  28.         /* Increasing value */
  29.         increase_digits(id);
  30.         update_disknum();
  31.     }
  32.     else if( id <= GAD_DIGIT_8 )
  33.     {
  34.         /* Chose a digit button, so reset it */
  35.         reset_digit( id );
  36.         update_disknum();
  37.     }
  38.     else if( id <= GAD_DOWNARROW_8 )
  39.     {
  40.         /* Decreasing value */
  41.         decrease_digits(id);
  42.         update_disknum();
  43.     }
  44.     else if( id <= GAD_INTEGER_2 )
  45.     {
  46.         /* Changed integer gadget */
  47.         handle_integer(id);
  48.     }
  49.     else if( id <= GAD_PROP_2 )
  50.     {
  51.         /* Changed prop gadget */
  52.         handle_prop(id);
  53.     }
  54.     else if( id <= GAD_DRIVE_4 )
  55.     {
  56.         /* Changed drive gadget */
  57.         handle_drive(id);
  58.     }
  59.     else
  60.     {
  61.         /* Bad gadget id */
  62.         ;
  63.     }
  64.     refresh_gadgets();
  65.     RefreshGList( uparrows[0], win, NULL, -1 );
  66. }
  67.  
  68. /*
  69.  * handle_integer()
  70.  *
  71.  * Handles changes in integer gadgets
  72.  *
  73.  */
  74. void handle_integer( ULONG id )
  75. {
  76.     if( id == GAD_INTEGER_1 )
  77.     {
  78.         GetAttr( STRINGA_LongVal, integer[0], (ULONG *)&start_disknum );
  79.     }
  80.     else
  81.     {
  82.         GetAttr( STRINGA_LongVal, integer[1], (ULONG *)&end_disknum );
  83.     }
  84. }
  85.  
  86. /*
  87.  * decrease_digits()
  88.  *
  89.  * Handles down arrows
  90.  *
  91.  */
  92. void decrease_digits( ULONG id )
  93. {
  94.     int gadnum = id - GAD_DOWNARROW_1;
  95.     
  96.     dig[gadnum] -= 1;
  97.     if( dig[gadnum] < 0 )
  98.     {
  99.         dig[gadnum] = 0;
  100.     }
  101. }
  102.  
  103. /*
  104.  * reset_digit()
  105.  *
  106.  * Handles clicks on digits
  107.  *
  108.  */
  109. void reset_digit( ULONG id )
  110. {
  111.     int gadnum = id - GAD_DIGIT_1;
  112.     
  113.     dig[gadnum] = 0;
  114. }
  115.  
  116. /*
  117.  * increase_digits()
  118.  *
  119.  * Handles up arrows
  120.  *
  121.  */
  122. void increase_digits( ULONG id )
  123. {
  124.     int gadnum = id - GAD_UPARROW_1;
  125.     
  126.     dig[gadnum] += 1;
  127.     if( dig[gadnum] >= 9 )
  128.     {
  129.         dig[gadnum] = 9;
  130.     }
  131. }
  132.  
  133. /*
  134.  * handle_prop()
  135.  *
  136.  * Handles slider gadgets
  137.  *
  138.  */
  139. void handle_prop( ULONG id )
  140. {
  141.     if( id == GAD_PROP_1 )
  142.     {
  143.         GetAttr( PGA_Top, prop[0], (ULONG *)&start_disknum );
  144.         start_disknum += firstdisk;
  145.     }
  146.     else
  147.     {
  148.         GetAttr( PGA_Top, prop[1], (ULONG *)&end_disknum );
  149.         end_disknum += firstdisk;
  150.     }
  151. }
  152.  
  153. /*
  154.  * handle_drives()
  155.  *
  156.  * Handles drive selection gadgets
  157.  *
  158.  */
  159. void handle_drive( ULONG id )
  160. {
  161.     int gadnum = id - GAD_DRIVE_0;
  162.     
  163.     if( drives_selected & 1<<gadnum )
  164.     {
  165.         SetGadgetAttrs( drives[gadnum], win, NULL,
  166.             GA_Selected, FALSE,
  167.             TAG_END );
  168.         drives_selected &= ~(1<<gadnum);
  169.     }
  170.     else
  171.     {
  172.         SetGadgetAttrs( drives[gadnum], win, NULL,
  173.             GA_Selected, TRUE,
  174.             TAG_END );
  175.         drives_selected |= 1<<gadnum;
  176.     }
  177. }
  178.  
  179. /*
  180.  * refresh_gadgets()
  181.  *
  182.  * Enables, disables, validates and updates gadgets
  183.  *
  184.  */
  185. void refresh_gadgets( void )
  186. {
  187.     int i;
  188.     
  189.     if( start_disknum <= firstdisk )
  190.     {
  191.         start_disknum = firstdisk;
  192.     }
  193.     if( start_disknum >= lastdisk )
  194.     {
  195.         start_disknum = lastdisk;
  196.     }
  197.     if( start_disknum > end_disknum )
  198.     {
  199.         end_disknum = start_disknum;
  200.     }
  201.     if( end_disknum >= lastdisk )
  202.     {
  203.         end_disknum = lastdisk;
  204.     }
  205.     for( i = 0; i < 4; i += 1 )
  206.     {
  207.         SetGadgetAttrs( uparrows[i], win, NULL,
  208.             GA_Disabled, (dig[i] < 9 && start_disknum < lastdisk && start_disknum / (10 ^ i) <= lastdisk / (10 ^ i)) ? FALSE : TRUE,
  209.             TAG_END );
  210.         SetGadgetAttrs( downarrows[i], win, NULL,
  211.             GA_Disabled, (dig[i] > 0 && start_disknum > firstdisk && start_disknum / (10 ^ i) >= firstdisk / (10 ^ i)) ? FALSE : TRUE,
  212.             TAG_END );
  213.     }
  214.     for( i = 4; i < 8; i += 1 )
  215.     {
  216.         SetGadgetAttrs( uparrows[i], win, NULL,
  217.             GA_Disabled, (dig[i] < 9 && end_disknum / (10 ^ (i-4)) < lastdisk / (10 ^ (i-4))) ? FALSE : TRUE,
  218.             TAG_END );
  219.         SetGadgetAttrs( downarrows[i], win, NULL,
  220.             GA_Disabled, (dig[i] > 0 && end_disknum > start_disknum && end_disknum / (10 ^ (i-4)) >= start_disknum / (10 ^ (i-4))) ? FALSE : TRUE,
  221.             TAG_END );
  222.     }
  223.     
  224.     dig[0] = start_disknum / 1000;
  225.     dig[1] = (start_disknum - dig[0] * 1000) / 100;
  226.     dig[2] = (start_disknum - dig[0] * 1000 - dig[1] * 100) / 10;
  227.     dig[3] = (start_disknum - dig[0] * 1000 - dig[1] * 100 - dig[2] * 10);
  228.     dig[4] = end_disknum / 1000;
  229.     dig[5] = (end_disknum - dig[4] * 1000) / 100;
  230.     dig[6] = (end_disknum - dig[4] * 1000 - dig[5] * 100) / 10;
  231.     dig[7] = (end_disknum - dig[4] * 1000 - dig[5] * 100 - dig[6] * 10);
  232.     
  233.     for( i = 0; i < 8; i += 1 )
  234.     {
  235.         dig_text[i][0] = '0' + dig[i];
  236.         SetGadgetAttrs( digits[i], win, NULL,
  237.             GA_Text, dig_text[i],
  238.             TAG_END );
  239.     }
  240.     SetGadgetAttrs( integer[0], win, NULL,
  241.         STRINGA_LongVal, start_disknum,
  242.         TAG_END );
  243.     SetGadgetAttrs( prop[0], win, NULL,
  244.         PGA_Top, start_disknum - firstdisk,
  245.         TAG_END );
  246.     SetGadgetAttrs( integer[1], win, NULL,
  247.         STRINGA_LongVal, end_disknum,
  248.         TAG_END );
  249.     SetGadgetAttrs( prop[1], win, NULL,
  250.         PGA_Top, end_disknum - firstdisk,
  251.         TAG_END );
  252. }
  253.  
  254. /*
  255.  * update_disknum()
  256.  *
  257.  * Updates disk numbers from individual digits;
  258.  * updates digits if invalid
  259.  *
  260.  */
  261. void update_disknum( void )
  262. {
  263.     int i;
  264.     
  265.     start_disknum = dig[0] * 1000 + dig[1] * 100 + dig[2] * 10 + dig[3];
  266.     if( start_disknum > lastdisk )
  267.     {
  268.         start_disknum = lastdisk;
  269.         dig[0] = start_disknum / 1000;
  270.         dig[1] = (start_disknum - dig[0] * 1000) / 100;
  271.         dig[2] = (start_disknum - dig[0] * 1000 - dig[1] * 100) / 10;
  272.         dig[3] = (start_disknum - dig[0] * 1000 - dig[1] * 100 - dig[2] * 10);
  273.     }
  274.     end_disknum = dig[4] * 1000 + dig[5] * 100 + dig[6] * 10 + dig[7];
  275.     if( end_disknum > lastdisk )
  276.     {
  277.         end_disknum = lastdisk;
  278.         dig[4] = end_disknum / 1000;
  279.         dig[5] = (end_disknum - dig[4] * 1000) / 100;
  280.         dig[6] = (end_disknum - dig[4] * 1000 - dig[5] * 100) / 10;
  281.         dig[7] = (end_disknum - dig[4] * 1000 - dig[5] * 100 - dig[6] * 10);
  282.     }
  283.     if( start_disknum > end_disknum )
  284.     {
  285.         end_disknum = start_disknum;
  286.         for( i = 0; i < 4; i += 1 )
  287.         {
  288.             dig[i+4] = dig[i];
  289.         }
  290.     }
  291. }
  292.