home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / rom / intuition / propgadgets.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  6KB  |  322 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: propgadgets.c,v 1.2 1997/01/27 00:36:42 ldp Exp $
  4.  
  5.     Desc: Code for PROP Gadgets
  6.     Lang: english
  7. */
  8. #include <proto/graphics.h>
  9. #include <proto/intuition.h>
  10. #include "intuition_intern.h"
  11. #include "propgadgets.h"
  12. #include "gadgets.h"
  13.  
  14. int CalcKnobSize (struct Gadget * propGadget, struct BBox * knobbox)
  15. {
  16.     struct PropInfo * pi;
  17.  
  18.     pi = (struct PropInfo *)propGadget->SpecialInfo;
  19.  
  20.     if (pi->Flags & PROPBORDERLESS)
  21.     {
  22.     pi->LeftBorder = 0;
  23.     pi->TopBorder  = 0;
  24.     }
  25.     else
  26.     {
  27.     knobbox->Left += 3;
  28.     knobbox->Top += 3;
  29.     knobbox->Width -= 6;
  30.     knobbox->Height -= 6;
  31.     pi->LeftBorder = 3;
  32.     pi->TopBorder  = 3;
  33.     }
  34.  
  35.     pi->CWidth       = knobbox->Width;
  36.     pi->CHeight    = knobbox->Height;
  37.  
  38.     if (knobbox->Width < KNOBHMIN || knobbox->Height < KNOBVMIN)
  39.     return FALSE;
  40.  
  41.     if (pi->Flags & FREEHORIZ)
  42.     {
  43.     knobbox->Width = pi->CWidth * pi->HorizBody / MAXBODY;
  44.  
  45.     knobbox->Left = knobbox->Left + (pi->CWidth - knobbox->Width)
  46.         * pi->HorizPot / MAXPOT;
  47.  
  48.     if (pi->HorizBody)
  49.     {
  50.         if (pi->HorizBody < MAXBODY/2)
  51.         pi->HPotRes = MAXPOT / ((MAXBODY / pi->HorizBody) - 1);
  52.         else
  53.         pi->HPotRes = MAXPOT;
  54.     }
  55.     else
  56.         pi->HPotRes = 1;
  57.     }
  58.  
  59.     if (pi->Flags & FREEVERT)
  60.     {
  61.     knobbox->Height = pi->CHeight * pi->VertBody / MAXBODY;
  62.  
  63.     knobbox->Top = knobbox->Top + (pi->CHeight - knobbox->Height)
  64.         * pi->VertPot / MAXPOT;
  65.  
  66.     if (pi->VertBody)
  67.     {
  68.         if (pi->VertBody < MAXBODY/2)
  69.         pi->VPotRes = MAXPOT / ((MAXBODY / pi->VertBody) - 1);
  70.         else
  71.         pi->VPotRes = MAXPOT;
  72.     }
  73.     else
  74.         pi->VPotRes = 1;
  75.     }
  76.  
  77.     return TRUE;
  78. } /* CalcKnobSize */
  79.  
  80.  
  81. void RefreshPropGadget (struct Gadget * gadget, struct Window * window,
  82.     struct IntuitionBase * IntuitionBase)
  83. {
  84.     UBYTE DrawMode;
  85.     ULONG apen;
  86.     struct PropInfo * pi;
  87.     struct BBox bbox, kbox;
  88.  
  89.     CalcBBox (window, gadget, &bbox);
  90.  
  91.     if (bbox.Width <= 0 || bbox.Height <= 0)
  92.     return;
  93.  
  94.     apen = GetAPen (window->RPort);
  95.     DrawMode = GetDrMd (window->RPort);
  96.  
  97.     SetDrMd (window->RPort, JAM1);
  98.  
  99.     EraseRect (window->RPort
  100.     , bbox.Left
  101.     , bbox.Top
  102.     , bbox.Left + bbox.Width - 1
  103.     , bbox.Top + bbox.Height - 1
  104.     );
  105.  
  106.     pi = (struct PropInfo *)gadget->SpecialInfo;
  107.  
  108.     if (!pi)
  109.     return;
  110.  
  111.     kbox.Left    = bbox.Left;
  112.     kbox.Top    = bbox.Top;
  113.     kbox.Width    = bbox.Width;
  114.     kbox.Height = bbox.Height;
  115.  
  116.     if (!CalcKnobSize (gadget, &kbox))
  117.     return;
  118.  
  119.     if (!(pi->Flags & PROPBORDERLESS) )
  120.     {
  121.     if (pi->Flags & PROPNEWLOOK)
  122.     {
  123.         if (bbox.Width <= 6 || bbox.Height <= 6)
  124.         {
  125.         SetAPen (window->RPort, 2);
  126.  
  127.         RectFill (window->RPort
  128.             , bbox.Left
  129.             , bbox.Top
  130.             , bbox.Left + bbox.Width - 1
  131.             , bbox.Top + bbox.Height - 1
  132.         );
  133.  
  134.         return;
  135.         }
  136.         else
  137.         {
  138.         SetAPen (window->RPort, 2);
  139.  
  140.         /* right */
  141.         RectFill (window->RPort
  142.             , bbox.Left + bbox.Width - 2
  143.             , bbox.Top
  144.             , bbox.Left + bbox.Width - 1
  145.             , bbox.Top + bbox.Height - 1
  146.         );
  147.  
  148.         /* bottom */
  149.         RectFill (window->RPort
  150.             , bbox.Left
  151.             , bbox.Top + bbox.Height - 2
  152.             , bbox.Left + bbox.Width - 3
  153.             , bbox.Top + bbox.Height - 1
  154.         );
  155.  
  156.         SetAPen (window->RPort, 1);
  157.  
  158.         /* top */
  159.         RectFill (window->RPort
  160.             , bbox.Left
  161.             , bbox.Top
  162.             , bbox.Left + bbox.Width - 2
  163.             , bbox.Top + 1
  164.         );
  165.  
  166.         /* left */
  167.         RectFill (window->RPort
  168.             , bbox.Left
  169.             , bbox.Top
  170.             , bbox.Left + 1
  171.             , bbox.Top + bbox.Height - 2
  172.         );
  173.  
  174.         WritePixel (window->RPort, bbox.Left + bbox.Width - 1, bbox.Top);
  175.         WritePixel (window->RPort, bbox.Left, bbox.Top + bbox.Height - 1);
  176.         }
  177.     }
  178.     else
  179.     {
  180.         SetAPen (window->RPort, 2);
  181.  
  182.         if (bbox.Width <= 6 || bbox.Height <= 6)
  183.         {
  184.         RectFill (window->RPort
  185.             , bbox.Left
  186.             , bbox.Top
  187.             , bbox.Left + bbox.Width - 1
  188.             , bbox.Top + bbox.Height - 1
  189.         );
  190.  
  191.         return;
  192.         }
  193.         else
  194.         {
  195.         /* right */
  196.         RectFill (window->RPort
  197.             , bbox.Left + bbox.Width - 2
  198.             , bbox.Top
  199.             , bbox.Left + bbox.Width - 1
  200.             , bbox.Top + bbox.Height - 1
  201.         );
  202.  
  203.         /* bottom */
  204.         RectFill (window->RPort
  205.             , bbox.Left
  206.             , bbox.Top + bbox.Height - 2
  207.             , bbox.Left + bbox.Width - 1
  208.             , bbox.Top + bbox.Height - 1
  209.         );
  210.  
  211.         /* top */
  212.         RectFill (window->RPort
  213.             , bbox.Left
  214.             , bbox.Top
  215.             , bbox.Left + bbox.Width - 3
  216.             , bbox.Top + 1
  217.         );
  218.  
  219.         /* left */
  220.         RectFill (window->RPort
  221.             , bbox.Left
  222.             , bbox.Top
  223.             , bbox.Left + 1
  224.             , bbox.Top + bbox.Height - 3
  225.         );
  226.         }
  227.     }
  228.     }
  229.  
  230.     RefreshPropGadgetKnob (pi->Flags, NULL, &kbox, window, IntuitionBase);
  231.  
  232.     SetDrMd (window->RPort, DrawMode);
  233.     SetAPen (window->RPort, apen);
  234. } /* RefreshPropGadget */
  235.  
  236.  
  237. void RefreshPropGadgetKnob (UWORD flags, struct BBox * clear,
  238.     struct BBox * knob, struct Window * window,
  239.     struct IntuitionBase * IntuitionBase)
  240. {
  241.     UBYTE DrawMode;
  242.     ULONG apen;
  243.  
  244.     apen = GetAPen (window->RPort);
  245.     DrawMode = GetDrMd (window->RPort);
  246.  
  247.     SetDrMd (window->RPort, JAM1);
  248.  
  249.     if (clear && clear->Width > 0 && clear->Height > 0)
  250.     {
  251.     EraseRect (window->RPort
  252.         , clear->Left
  253.         , clear->Top
  254.         , clear->Left + clear->Width - 1
  255.         , clear->Top + clear->Height - 1
  256.     );
  257.     }
  258.  
  259.     if (flags & AUTOKNOB)
  260.     {
  261.     int hit = ((flags & KNOBHIT) != 0);
  262.  
  263.     if (flags & PROPNEWLOOK)
  264.     {
  265.         SetAPen (window->RPort, hit ? 2 : 1);
  266.  
  267.         /* Draw right border */
  268.         RectFill (window->RPort
  269.         , knob->Left + knob->Width - 2
  270.         , knob->Top
  271.         , knob->Left + knob->Width - 1
  272.         , knob->Top + knob->Height - 1
  273.         );
  274.  
  275.         /* Draw bottom border */
  276.         RectFill (window->RPort
  277.         , knob->Left
  278.         , knob->Top + knob->Height - 2
  279.         , knob->Left + knob->Width - 3
  280.         , knob->Top + knob->Height - 1
  281.         );
  282.  
  283.         SetAPen (window->RPort, hit ? 1 : 2);
  284.  
  285.         /* Draw top border */
  286.         RectFill (window->RPort
  287.         , knob->Left
  288.         , knob->Top
  289.         , knob->Left + knob->Width - 2
  290.         , knob->Top + 1
  291.         );
  292.  
  293.         /* Draw left border */
  294.         RectFill (window->RPort
  295.         , knob->Left
  296.         , knob->Top + 2
  297.         , knob->Left + 1
  298.         , knob->Top + knob->Height - 2
  299.         );
  300.  
  301.         /* Fill edges */
  302.         WritePixel (window->RPort, knob->Left + knob->Width - 1, knob->Top);
  303.  
  304.     }
  305.     else
  306.     {
  307.         SetAPen (window->RPort, 2);
  308.  
  309.         RectFill (window->RPort
  310.         , knob->Left
  311.         , knob->Top
  312.         , knob->Left + knob->Width - 1
  313.         , knob->Top + knob->Height - 1
  314.         );
  315.     }
  316.     }
  317.  
  318.     SetDrMd (window->RPort, DrawMode);
  319.     SetAPen (window->RPort, apen);
  320. } /* RefreshPropGadgetKnob */
  321.  
  322.