March 05, 2021, 07:25:13 AM

Author Topic: [bmx] Photoshop Like ColorPicker by Bobysait [ 1+ years ago ]  (Read 541 times)

Offline BlitzBot

Title : Photoshop Like ColorPicker
Author : Bobysait
Posted : 1+ years ago

Description : Originally coded for a module to extend maxgui, this color picker is made to be easy to use, and can be used as an include.

You only need to call PickColor (with optional initial color argument) to launch a window in the style of photoshop color picker.

The color being modified is updated in the loop while the window is still on top.
It allows to modify the color of something without the need to hit "Ok" and try again with another color.
Also, if you hit "Cancel" or close the window, it will generate a last EVENT_COLOR event with the initial color as EventData(), so you can reset to the initial color the stuff that has been modified.

The module has not been tested in depth, so post comment if you find any kind of bug.

The Photoshop-like ColorPicker can convert RGB to HSL and back. So, it's pretty accurate for almost any case.


Code :
Code: BlitzMax
  1. 'Module mdt.uisdk
  2.  
  3. Import maxgui.drivers
  4.  
  5. Global EVENT_COLOR:Int                  =       AllocHookId                     ( );
  6.  
  7. Type TColorPicker Extends TProxygadget
  8.        
  9.         Const _cursorS:Int = 12;
  10.        
  11.         Field _sourceEvent:Object;
  12.        
  13.         Field _initColor:Int;
  14.         Field _color:Int;
  15.         Field _rgb:Int[];
  16.         Field _hsl:Int[];
  17.        
  18.         Field style:Int;
  19.         Field _win:TGadget;
  20.         Field _core:TGadget;
  21.        
  22.         Field _pix_sl:TPixmap;
  23.         Field _pix_hue:TPixmap;
  24.        
  25.         Field _col_sl:TGadget;
  26.         Field _col_hue:TGadget;
  27.         Field _col_col:TGadget;
  28.         Field _col_cH:TGadget;
  29.         Field _col_tH:TGadget;
  30.         Field _col_cS:TGadget;
  31.         Field _col_tS:TGadget;
  32.         Field _col_cL:TGadget;
  33.         Field _col_tL:TGadget;
  34.         Field _col_cR:TGadget;
  35.         Field _col_tR:TGadget;
  36.         Field _col_cG:TGadget;
  37.         Field _col_tG:TGadget;
  38.         Field _col_cB:TGadget;
  39.         Field _col_tB:TGadget;
  40.         Field _col_tHex:TGadget;
  41.        
  42.         Field _cursorHue:TGadget;
  43.        
  44.         Field _ok:TGadget;
  45.         Field _cc:TGadget;
  46.        
  47.         Field _hueHit:Byte;
  48.         Field _slHit:Byte;
  49.        
  50.         Function RGB2HSL:Int[](rgb:Int[])
  51.                 Local i0:Int = 0, i1:Int = 1, i2:Int = 2, t:Int = 0;
  52.                 If rgb[i1]>rgb[i0] Then t = i0; i0 = i1; i1=t;
  53.                 If rgb[i2]>rgb[i0] Then t = i0; i0 = i2; i2=t;
  54.                 If rgb[i2]>rgb[i1] Then t = i1; i1 = i2; i2=t;
  55.                 i1 = (i0+1)Mod(3); i2 = (i1+1)Mod(3);
  56.                 Local c:Int = rgb[i0] - rgb[i2]; If c=0 Then Return [0,0, (100*rgb[i0])/255];
  57.                 Return [(60*(rgb[i1]-rgb[i2]))/c+i0*120, (100*c)/rgb[i0], (100*rgb[i0])/255];
  58.         End Function
  59.        
  60.         Function HSL2RGB :Int [](hsl :Int [])
  61.                 Local h:Float = Float(hsl[0])/60.0;
  62.                 Local s:Float = Float(hsl[1])/100.0;
  63.                 Local l:Float = Float(hsl[2])/100.0;
  64.                 Local r:Int, g:Int, b:Int, t:Float = h Mod(1.0);
  65.                 If h<1
  66.                         r = 255;
  67.                         g = 255*t;
  68.                         b = 0;
  69.                 ElseIf h<2
  70.                         r = 255-255*t;
  71.                         g = 255;
  72.                         b = 0;
  73.                 ElseIf h<3
  74.                         r = 0;
  75.                         g = 255;
  76.                         b = 255*t;
  77.                 ElseIf h<4
  78.                         r = 0;
  79.                         g = 255-255*t;
  80.                         b = 255;
  81.                 ElseIf h<5
  82.                         r = 255*t;
  83.                         g = 0;
  84.                         b = 255;
  85.                 Else
  86.                         r = 255
  87.                         g = 0
  88.                         b = 255-255*t;
  89.                 End If
  90.                 Return [Int ( (255+(r-255)*s)*l), Int ( (255+(g-255)*s)*l),Int ( (255+(b-255)*s)*l)  ];
  91.         End Function
  92.        
  93.         Function rgbFromRGB:Int[](rgb:Int)
  94.                 Return [rgb Shr(16) & $FF, rgb Shr(8) & $FF, rgb & $FF];
  95.         End Function
  96.        
  97.        
  98.         Function getInstance:TColorPicker ( initRGBColor:Int=$FFFFFF, source:Object = Null, Style:Int = 0 )
  99.                
  100.                 Local cp:TColorPicker           =       New TColorPicker;
  101.                 cp._sourceEvent                         =       source;
  102.                
  103.                 cp._initColor                           =       initRGBColor;
  104.                 cp._rgb                                         =       rgbFromRGB(initRGBColor);
  105.                 cp._hsl                                         =       rgb2hsl(cp._rgb);
  106.                
  107.                 cp.style                                        =       style;
  108.                
  109.                 cp._win                                         =       CreateWindow            ( "Color Picker" ..
  110.                                                                                                                                                 , 0,0..
  111.                                                                                                                                                 , 384, 278..
  112.                                                                                                                                                 , Null..
  113.                                                                                                                                                 , WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS|..
  114.                                                                                                                                                   WINDOW_CENTER|WINDOW_HIDDEN..
  115.                                                                                                                         );
  116.                                                                                
  117.                 cp._pix_sl                                      =       CreatePixmap            ( 256, 256, PF_RGB888 );ClearPixels(cp._pix_sl, initRGBColor );
  118.                 cp._pix_hue                                     =       CreatePixmap            ( 1, 360, PF_RGB888 );ClearPixels(cp._pix_hue, initRGBColor );
  119.                                                                                
  120.                         cp._core                                =       CreatePanel                     ( 0,0, ClientWidth(cp._win), ClientHeight(cp._win), cp._win);
  121.                                                                                
  122.                         cp._col_hue                             =       CreatePanel                     ( 276,010, 020, 256, cp._core, PANEL_ACTIVE );
  123.                                                                                
  124.                         cp._col_sl                              =       CreatePanel                     ( 010,010, 256, 256, cp._core, PANEL_ACTIVE );
  125.                                                                                
  126.                         cp._col_col                             =       CreatePanel                     ( 306,010, 065, 035, cp._core, PANEL_SUNKEN | PANEL_ACTIVE );
  127.                        
  128.                         cp._col_cH                              =       CreateLabel                     ( "H", 306, 055, 030, 020, cp._core );
  129.                         cp._col_tH                              =       CreateTextField         ( 339, 055, 032, 020, cp._core );
  130.                                                                                 SetButtonState          ( cp._col_cH, True );
  131.                         cp._col_cS                              =       CreateLabel                     ( "S", 306, 077, 030, 020, cp._core );
  132.                         cp._col_tS                              =       CreateTextField         ( 339, 077, 032, 020, cp._core );
  133.                         cp._col_cL                              =       CreateLabel                     ( "L", 306, 099, 030, 020, cp._core );
  134.                         cp._col_tL                              =       CreateTextField         ( 339, 099, 032, 020, cp._core );
  135.                                                                                
  136.                         cp._col_cR                              =       CreateLabel                     ( "R", 306, 124, 030, 020, cp._core );
  137.                         cp._col_tR                              =       CreateTextField         ( 339, 124, 032, 020, cp._core );
  138.                         cp._col_cG                              =       CreateLabel                     ( "G", 306, 146, 030, 020, cp._core );
  139.                         cp._col_tG                              =       CreateTextField         ( 339, 146, 032, 020, cp._core );
  140.                         cp._col_cB                              =       CreateLabel                     ( "B", 306, 168, 030, 020, cp._core );
  141.                         cp._col_tB                              =       CreateTextField         ( 339, 168, 032, 020, cp._core );
  142.                                                                                
  143.                                                                                 CreateLabel                     ( "#", 306, 190, 015, 020, cp._core );
  144.                         cp._col_tHex                    =       CreateTextField         ( 321, 190, 050, 020, cp._core );
  145.                                                                                
  146.                         cp._ok                                  =       CreateButton            ( "Ok", 306, 214, 065, 020, cp._core, BUTTON_OK );
  147.                         cp._cc                                  =       CreateButton            ( "Cancel", 306, 236, 065, 020, cp._core, BUTTON_CANCEL );
  148.                                                                                
  149.                         cp._cursorHue                   =       CreatePanel                     ( 271,010, 030,001, cp._core );
  150.                                                                                 SetPanelColor           ( cp._cursorHue, 1,1,1 );
  151.                        
  152.                 cp.SetProxy(cp._win);
  153.                 AddHook                                                 ( EmitEventHook, EventHook, cp );
  154.                
  155.                 cp                                                              .SetCurrentColor        ( initRGBColor );
  156.                        
  157.                         cp                                                      ._updateHuePix          ( );
  158.                         cp                                                      ._updateSLPix           ( );
  159.                         cp                                                      ._updateUI                      ( );
  160.                        
  161.                         SetGadgetPixmap                         ( cp._col_hue , cp._pix_hue, PANELPIXMAP_STRETCH );
  162.                         SetGadgetPixmap                         ( cp._col_sl , cp._pix_sl );
  163.                 ShowGadget                                              ( cp._win );
  164.                 RedrawGadget                                    ( cp._win );
  165.                
  166.                 Return cp;
  167.                
  168.         End Function
  169.        
  170.         Function clampI(i:Int var, m0:Int, m1:Int)
  171.                 i=max(min(i, m1), m0);
  172.         End Function
  173.        
  174.         Method pickHueColor(r:Int Var, g:Int Var, b:Int Var )
  175.                 Local rgb:Int = Self._pix_hue.ReadPixel(0,359-Self._hsl[0]);
  176.                 r = rgb Shr(16) & $FF;
  177.                 g = rgb Shr(8) & $FF;
  178.                 b = rgb & $FF;
  179.                 Return;
  180.         End Method
  181.        
  182.         ' update ui gadgets
  183.         Method _updateUI ( )
  184.                 ' update color
  185.                 Self._color             =       (Self._rgb[0] Shl(16)) + (Self._rgb[1] Shl(8)) + Self._rgb[2];
  186.                 ' textfields
  187.                 Self._col_tHex          .SetText                        ( Right(Hex(Self._color),6) );
  188.                 Self._col_tH            .SetText                        ( Self._hsl[0] );
  189.                 Self._col_tS            .SetText                        ( Self._hsl[1] );
  190.                 Self._col_tL            .SetText                        ( Self._hsl[2] );
  191.                 Self._col_tR            .SetText                        ( Self._rgb[0] );
  192.                 Self._col_tG            .SetText                        ( Self._rgb[1] );
  193.                 Self._col_tB            .SetText                        ( Self._rgb[2] );
  194.                 ' hue cursor
  195.                 SetGadgetShape          ( Self._cursorHue, 271, 10+255-Self._hsl[0]*255/359, 30, 1);
  196.                 ' refresh color panel
  197.                 SetPanelColor           ( Self._col_col, Self._rgb[0], Self._rgb[1], Self._rgb[2] );
  198.                
  199.                 RedrawGadget            ( Self._win );
  200.                
  201.                 ' emit the event for the main program to receive the modification in realtime.
  202.                 EmitEvent                       ( CreateEvent(EVENT_COLOR, Self._sourceEvent, Self._color) );
  203.                
  204.         End Method
  205.        
  206.         Method SetCurrentColor(RGB:Int)
  207.                 Self._rgb               =       rgbFromRGB                      ( RGB );
  208.                 Self._hsl               =       rgb2hsl                         ( Self._rgb );
  209.                                                         clampI                          ( Self._hsl[0], 0,359 );
  210.                                                         clampI                          ( Self._hsl[1], 0,99 );
  211.                                                         clampI                          ( Self._hsl[2], 0,99 );
  212.                 Self                            ._updateHuePix          ( );
  213.                 Self                            ._updateSLPix           ( );
  214.                 Self                            ._updateUI                      ( );
  215.         End Method
  216.        
  217.        
  218.         Method _updateHuePix();
  219.                 Local r:Int, g:Int, b:Int, u0:Int, u1:Int;
  220.                 Local du1:Int = 60;
  221.                 Local du2:Int = 60;
  222.                
  223.                 Local x:Int = 0;
  224.                
  225.                 u1 = 0;
  226.                
  227.                 u0 = u1; u1 = u0+du1;
  228.                 ' R(255) - B(0->255)
  229.                 For Local y0:Int = u0 Until u1
  230.                         r = 255; g = 0; b = 255*(y0-u0)/(u1-u0);
  231.                         Self._pix_hue.WritePixel(x,y0, r Shl(16) | g Shl(8) | b);
  232.                 Next;
  233.                
  234.                 u0 = u1; u1 = u0+du2;
  235.                 ' R(255->0) - B(255)
  236.                 For Local y1:Int = u0 Until u1
  237.                         r = 255-255*(y1-u0)/(u1-u0); g = 0; b = 255;
  238.                         Self._pix_hue.WritePixel(x,y1, r Shl(16) | g Shl(8) | b);
  239.                 Next;
  240.                
  241.                 u0 = u1; u1 = u0+du1;
  242.                 ' B(255) - G(0->255)
  243.                 For Local y2:Int = u0 Until u1
  244.                         r = 0; g = 255*(y2-u0)/(u1-u0); b = 255;
  245.                         Self._pix_hue.WritePixel(x,y2, r Shl(16) | g Shl(8) | b);
  246.                 Next
  247.                
  248.                 u0 = u1; u1 = u0+du2;
  249.                 ' B(255->0) - G(255)
  250.                 For Local y3:Int = u0 Until u1
  251.                         r = 0; g = 255; b = 255-255*(y3-u0)/(u1-u0);
  252.                         Self._pix_hue.WritePixel(x,y3, r Shl(16) | g Shl(8) | b);
  253.                 Next;
  254.                
  255.                 u0 = u1; u1 = u0+du1;
  256.                 ' G(255) - R(0->255)
  257.                 For Local y4:Int = u0 Until u1
  258.                         r = 255*(y4-u0)/(u1-u0); g = 255; b = 0;
  259.                         Self._pix_hue.WritePixel(x,y4, r Shl(16) | g Shl(8) | b);
  260.                 Next;
  261.                
  262.                 u0 = u1; u1 = u0+du2;
  263.                 ' G(255->0) - R(255)
  264.                 For Local y5:Int = u0 Until u1
  265.                         r = 255; g = 255-255*(y5-u0)/(u1-u0); b = 0;
  266.                         Self._pix_hue.WritePixel(x,y5, r Shl(16) | g Shl(8) | b);
  267.                 Next;
  268.                
  269.                 SetGadgetPixmap ( Self._col_hue, Self._pix_hue, PANELPIXMAP_STRETCH );
  270.         End Method
  271.        
  272.         Method _updateSLPix()
  273.                
  274.                 Local r:Int=0, g:Int=0, b:Int=0;
  275.                 Self.pickHueColor(r,g,b);
  276.                
  277.                 For Local y:Int = 0 To 255
  278.                         Local rnb:Float = 1.0-Float(y) / 255;
  279.                         For Local x:Int = 0 To 255
  280.                                 Local whyte:Float = Float(x)/255;
  281.                                 Local r_:Int = (255+(r-255)*whyte)*rnb;
  282.                                 Local g_:Int = (255+(g-255)*whyte)*rnb;
  283.                                 Local b_:Int = (255+(b-255)*whyte)*rnb;
  284.                                 Self._pix_sl.WritePixel(x,y, r_ Shl(16) | g_ Shl(8) | b_);
  285.                         Next;
  286.                 Next;
  287.                
  288.                 Self._updateSLCursor();
  289.                
  290.                 SetGadgetPixmap         ( Self._col_sl , Self._pix_sl );
  291.                
  292.         End Method
  293.        
  294.         Method _updateSLCursor()
  295.                
  296.                 ' draw the new cursor
  297.                 Local cr0:Int = Floor(Float(_cursorS)*.5);
  298.                 Local perimeter:Int = cr0 * 2 * Pi;
  299.                 Local cr1:Int = cr0-1;
  300.                 Local sat:Int = (255 * Self._hsl[1])/100;
  301.                 Local lit:Int = (255 * (100-Self._hsl[2]))/100;
  302.                 For Local p:Int = 0 To perimeter
  303.                         Local ang:Float = Float(p*360)/perimeter;
  304.                         Local x0:Int = sat + Cos(ang)*cr0;
  305.                         Local y0:Int = lit + Sin(ang)*cr0;
  306.                         Local x1:Int = sat + Cos(ang)*cr1;
  307.                         Local y1:Int = lit + Sin(ang)*cr1;
  308.                         If x0>=0 And x0<256
  309.                                 If y0>=0 And y0<256 Then Self._pix_sl.WritePixel(x0,y0, $FF010101);
  310.                         EndIf;
  311.                         If x1>=0 And x1<256
  312.                                 If y1>=0 And y1<256 Then Self._pix_sl.WritePixel(x1,y1, $FFFFFFFF);
  313.                         EndIf;
  314.                 Next;
  315.                
  316.                 SetGadgetPixmap         ( Self._col_sl , Self._pix_sl );
  317.                
  318.         End Method
  319.        
  320.        
  321.         Method clearSLCursor()
  322.                
  323.                 ' overwrite old cursor
  324.                 Local r:Int=Self._rgb[0], g:Int=Self._rgb[1], b:Int=Self._rgb[2];
  325.                 Self.pickHueColor(r,g,b);
  326.                 Local sat:Int = 255*Float(Self._hsl[1])/99;
  327.                 Local lit:Int = 255*Float(99-Self._hsl[2])/99;
  328.                 For Local y:Int = -_cursorS-1 To _cursorS+1
  329.                         Local j:Int = lit+y;
  330.                         If j>=0 And j<256
  331.                                 Local rnb:Float = 1.0-Float(j) / 255;
  332.                                 For Local x:Int = -_cursorS-1 To _cursorS+1
  333.                                         Local i:Int = sat+x;
  334.                                         If i>=0 And i<256
  335.                                                 Local whyte:Float = Float(i)/255;
  336.                                                 Local r_:Int = (255+(r-255)*whyte)*rnb;
  337.                                                 Local g_:Int = (255+(g-255)*whyte)*rnb;
  338.                                                 Local b_:Int = (255+(b-255)*whyte)*rnb;
  339.                                                 Self._pix_sl.WritePixel(i,j, r_ Shl(16) | g_ Shl(8) | b_);
  340.                                         End If;
  341.                                 Next;
  342.                         End If;
  343.                 Next;
  344.                
  345.         End Method
  346.        
  347.         Method setHue ( h:Int )
  348.                
  349.                 ' clamp hue
  350.                 clampI(h, 0,359);
  351.                
  352.                 ' apply only if different from current pos
  353.                 If Self._hsl[0]<>h
  354.                        
  355.                         Self._hsl[0]    =       h;
  356.                        
  357.                         ' update current color
  358.                         Self._rgb               =       hsl2rgb(Self._hsl);
  359.                        
  360.                         ' update gadgets
  361.                         Self                            ._updateSLPix   ( );
  362.                         Self                            ._updateUI              ( );
  363.                        
  364.                 EndIf;
  365.                
  366.         End Method
  367.        
  368.         Method setSL ( s:Int, l:Int )
  369.                
  370.                 clampI(s, 0,100);
  371.                 clampI(l, 0,100);
  372.                
  373.                 If ( (s<>Self._hsl[1]) Or (l<> Self._hsl[2]) )
  374.                         Self                            .clearSLCursor  ( )
  375.                         Self._hsl[1]    =       s;
  376.                         Self._hsl[2]    =       l;
  377.                         Self._rgb               =       hsl2rgb(Self._hsl);
  378.                         Self                            ._updateSLCursor( );
  379.                         Self                            ._updateUI              ( );
  380.                 EndIf;
  381.                
  382.         End Method
  383.        
  384.         Method setSat(s:Int)
  385.                 clampI(s, 0,100);
  386.                 If (Self._hsl[1]<>s)
  387.                         Self                            .clearSLCursor  ( );
  388.                         Self._hsl[1]    =       s;
  389.                         Self._rgb               =       HSL2RGB(Self._hsl);
  390.                         Self                            ._updateSLCursor( );
  391.                         Self._updateUI ();
  392.                 EndIf;
  393.         End Method
  394.        
  395.         Method setLight(l:Int)
  396.                 clampI(l, 0, 100);
  397.                 If Self._hsl[2]<>l
  398.                         Self                            .clearSLCursor  ( );
  399.                         Self._hsl[2]    =       l;
  400.                         Self._rgb               =       HSL2RGB(Self._hsl);
  401.                         Self                            ._updateSLCursor( );
  402.                         Self._updateUI ();
  403.                 EndIf;
  404.         End Method
  405.        
  406.         Method setRed(r:Int)
  407.                 clampI(r, 0, 255);
  408.                 If Self._rgb[0]<>r
  409.                         Self._rgb[0]    =       r;
  410.                         Self._hsl               =       rgb2hsl(Self._rgb);
  411.                         Self._updateUI ();
  412.                 EndIf;
  413.         End Method
  414.        
  415.         Method setGreen(g:Int)
  416.                 clampI(g, 0, 255);
  417.                 If Self._rgb[1]<>g
  418.                         Self._rgb[1]    =       g;
  419.                         Self._hsl               =       rgb2hsl(Self._rgb);
  420.                         Self._updateUI();
  421.                 EndIf;
  422.         End Method
  423.        
  424.         Method setBlue(b:Int)
  425.                 clampI(b, 0, 255);
  426.                 If Self._rgb[2]<>b
  427.                         Self._rgb[2]    =       b;
  428.                         Self._hsl               =       RGB2HSL(Self._rgb);
  429.                         Self._updateUI();
  430.                 EndIf;
  431.         End Method
  432.        
  433.        
  434.         Method ProcessEvent:Int(event:TEvent)
  435.                 Select event.id
  436.                        
  437.                         Case EVENT_WINDOWCLOSE
  438.                                
  439.                                 If event.Source=Self
  440.                                         FreeGadget Self;
  441.                                         Return True;
  442.                                 EndIf;
  443.                                
  444.                         Case EVENT_MOUSEMOVE
  445.                                
  446.                                 Select event.source
  447.                                        
  448.                                         ' mouse down on hue pixmap
  449.                                         Case Self._col_hue
  450.                                                
  451.                                                 If Self._hueHit Then Self.setHue(359-Float(359*event.y)/255);
  452.                                                 Self._slHit = False;
  453.                                                 Return True;
  454.                                                
  455.                                         ' mouse down on saturation/brightness pixmap
  456.                                         Case Self._col_sl
  457.                                                
  458.                                                 If Self._slHit Then Self.setsl(100*Float(event.x)/255.0, 100-100*Float(event.y)/255.0);
  459.                                                 Self._hueHit = False;
  460.                                                 Return True;
  461.                                                
  462.                                         Default
  463.                                                
  464.                                                 Self._slHit = False;
  465.                                                 Self._hueHit = False;
  466.                                                 Return False;
  467.                                                
  468.                                 End Select
  469.                                
  470.                         Case EVENT_MOUSEUP
  471.                                
  472.                                 Self._slHit = False;
  473.                                 Self._hueHit = False;
  474.                                 Return False;
  475.                                
  476.                         Case EVENT_MOUSEDOWN
  477.                                
  478.                                 Select event.source
  479.                                        
  480.                                         Case Self._col_hue
  481.                                                
  482.                                                 Self.setHue(359-Float(359*event.y)/255);
  483.                                                
  484.                                                 Self._slHit = False;
  485.                                                 Self._hueHit = True;
  486.                                                 Return True;
  487.                                                
  488.                                         Case Self._col_sl
  489.                                                
  490.                                                 Self.setSL(100*Float(event.x)/255.0, 100-100*Float(event.y)/255.0);
  491.                                                
  492.                                                 Self._slHit = True;
  493.                                                 Self._hueHit = False;
  494.                                                 Return True;
  495.                                                
  496.                                 End Select
  497.                                
  498.                         'Case EVENT_MOUSEENTER
  499.                                
  500.                         'Case EVENT_MOUSELEAVE
  501.                                
  502.                         Case EVENT_GADGETACTION
  503.                                
  504.                                 Select event.Source
  505.                                        
  506.                                         Case Self._col_tHex
  507.                                                
  508.                                                 Self.SetCurrentColor ( ("$"+Self._col_tHex.GetText()).ToInt() ); Return True;
  509.                                                
  510.                                         Case Self._col_tH
  511.                                                
  512.                                                 Self.setHue(Self._col_tH.GetText().ToInt()); Return True;
  513.                                                
  514.                                         Case Self._col_tS
  515.                                                
  516.                                                 Self.setSat(Self._col_tS.GetText().ToInt()); Return True;
  517.                                        
  518.                                         Case Self._col_tL
  519.                                                
  520.                                                 Self.setLight(Self._col_tL.GetText().ToInt()); Return True;
  521.                                                
  522.                                         Case Self._col_tR
  523.                                                
  524.                                                 Self.setRed(Self._col_tR.GetText().ToInt()); Return True;
  525.                                        
  526.                                         Case Self._col_tG
  527.                                                
  528.                                                 Self.setGreen(Self._col_tG.GetText().ToInt()); Return True;
  529.                                                
  530.                                         Case Self._col_tB
  531.                                                
  532.                                                 Self.setBlue(Self._col_tB.GetText().ToInt()); Return True;
  533.                                                
  534.                                         Case Self._ok
  535.                                                
  536.                                                 FreeGadget Self;
  537.                                                 Return True;
  538.                                                
  539.                                         ' cancel
  540.                                         Case Self._cc
  541.                                                
  542.                                                 ' reset color to its initial value
  543.                                                 EmitEvent CreateEvent ( EVENT_COLOR, Self._sourceEvent, Self._initColor );
  544.                                                 FreeGadget Self;
  545.                                                 Return True;
  546.                                                
  547.                                 End Select;
  548.                                
  549.                 End Select;
  550.                
  551.                 Return False;
  552.                
  553.         EndMethod
  554.        
  555.        
  556.        
  557.         Function EventHook:Object(id:Int,data:Object,context:Object)
  558.                
  559.                 If TEvent(data)<>Null Then If TColorPicker(context)<>Null Then If TColorPicker(context).ProcessEvent(TEvent(data)) Then Return Null;
  560.                 Return data;
  561.                
  562.         EndFunction
  563.        
  564.         Method CleanUp()
  565.                 _sourceEvent=Null;
  566.                 _rgb =Null;
  567.                 _hsl=Null;
  568.                 _col_col = Null; _pix_sl = Null; _col_tHex = Null;
  569.                 _pix_hue = Null; _col_sl = Null; _col_hue = Null;
  570.                 _col_cH = Null; _col_tH = Null;
  571.                 _col_cS = Null; _col_tS = Null;
  572.                 _col_cL = Null; _col_tL = Null;
  573.                 _col_cR = Null; _col_tR = Null;
  574.                 _col_cG = Null; _col_tG = Null;
  575.                 _col_cB = Null; _col_tB = Null;
  576.                 _cursorHue=Null;
  577.                 _ok=Null;
  578.                 _cc=Null;
  579.                 If _core<>Null Then FreeGadget(_core); _core=Null;
  580.                 If _win<>Null Then FreeGadget(_win); _win=Null;
  581.                 RemoveHook(EmitEventHook, EventHook, Self);
  582.                 Super.CleanUp();
  583.         End Method
  584.        
  585.        
  586.         Function Demo()
  587.                
  588.                 Local WIN:TGadget = CreateWindow("test", 0,0,600,300,Null, WINDOW_TITLEBAR|WINDOW_CENTER|WINDOW_RESIZABLE)
  589.                 Local button:TGadget = CreateButton("pick", 2,2,ClientWidth(WIN)-4,ClientHeight(WIN)-4,WIN)
  590.                 SetGadgetLayout(button, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED);
  591.                
  592.                 Local rgb:Int = $FF8000
  593.                
  594.                 Repeat
  595.                         While PollEvent()<>Null
  596.                                 Select EventID()
  597.                                         Case EVENT_WINDOWCLOSE
  598.                                                 End
  599.                                                
  600.                                         Case EVENT_GADGETACTION
  601.                                                 If EventSource() = button Then pickColor(rgb)
  602.                                                
  603.                                         Case EVENT_COLOR
  604.                                                 rgb = EventData(); SetGadgetColor button, rgb Shr(16) & $ff, rgb Shr(8) & $ff, rgb & $ff, 1
  605.                                                
  606.                                 End Select
  607.                         Wend;
  608.                        
  609.                         Delay 30;
  610.                        
  611.                 Forever
  612.                
  613.         End Function
  614.  
  615. End Type
  616.  
  617. Function pickColor ( initColor:Int=$FFFFFF, source:Object=Null, Style:Int = 0 )
  618.         TColorPicker.getInstance ( initColor, source, Style);
  619. End Function
  620.  
  621.  
  622.  
  623. TColorPicker.Demo(); End;


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal