unit krndcol;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  kRndLed, StdCtrls;

type
  TFormRndLedColor = class(TForm)
    kRndLedOff: TkRndLed;
    kRndLedOn: TkRndLed;
    Label1: TLabel;
    EditRate: TEdit;
    ButtonOK: TButton;
    ButtonCancel: TButton;
    kRndLedBlink: TkRndLed;
    kRndLedNeg: TkRndLed;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure FormShow(Sender: TObject);
    procedure EditRateChange(Sender: TObject);
    procedure ButtonOKClick(Sender: TObject);
    procedure kRndLedOnDblClick(Sender: TObject);
    procedure kRndLedBlinkClick(Sender: TObject);
  private
    { Private declarations }
    ThisLed,ActiveLed : TkRndLed;
    leds : Array [0..MAXLCCOLOR] of Array [0..1] of TkRndLed;
    procedure LedClick(Sender: TObject); virtual;
    procedure DoLed(i,j:integer);        virtual;
  public
    { Public declarations }
    procedure EditColor(led:TkRndLed);
  end;

var
  FormRndLedColor: TFormRndLedColor;

implementation
{$R *.DFM}

procedure TFormRndLedColor.DoLed(i,j:integer);
begin
  leds[i,j] := TkRndLed.Create(self);
  if ( leds[i,j] = nil ) then exit;
  leds[i,j].parent := self;
  leds[i,j].top := j*leds[i,j].Height;
  leds[i,j].left := i*leds[i,j].Width;
  leds[i,j].OnClick := LedClick;
  leds[i,j].IniName := '-';
  leds[i,j].AllowEdit := False;
  leds[i,j].AutoSelectColor := false;
  leds[i,j].LedOnColor := TLedOnColors(i);
  leds[i,j].LedOffColor := TLedOffColors(i);
  leds[i,j].LedOn := ( j = 0 );
  leds[i,j].Tag := 100*j + i;
end;

procedure TFormRndLedColor.LedClick(Sender: TObject);
var led : TkRndLed;
    color : TColor;
begin
  led :=  Sender as TkRndLed;
  if ( ActiveLed = kRndLedBlink ) then begin
    kRndLedBlink.LedOffRealColor := led.LedOffRealColor;
    kRndLedBlink.LedOnRealColor := led.LedOnRealColor;
    kRndLedOff.LedOnRealColor := led.LedOffRealColor;
    kRndLedOn.LedOnRealColor := led.LedOnRealColor;
    Exit;
  end;

  if ( led.Tag >= 100 ) then color := led.LedOffRealColor
                        else color := led.LedOnRealColor;
  ActiveLed.LedOnRealColor := color;

  if ( ActiveLed.Tag = 1 ) then kRndLedBlink.LedOnRealColor := color;
  if ( ActiveLed.Tag = 0 ) then kRndLedBlink.LedOffRealColor := color;
  if ( ActiveLed.Tag =-1 ) then kRndLedBlink.LedNegRealColor := color;
end;

procedure TFormRndLedColor.FormShow(Sender: TObject);
var i:integer;
begin
  kRndLedBlinkClick(kRndLedBlink);
  for i:=0 to MAXLCCOLOR do begin
    DoLed(i,0);
    DoLed(i,1);
  end;
end;

procedure TFormRndLedColor.EditRateChange(Sender: TObject);
var br :integer; st:string;
begin
  st := EditRate.Text;
//  if ( st = '' )  or ( pos(st[1],'-123456789')=0 ) then exit;
  br := StrToIntDef(EditRate.Text,0);
  kRndLedBlink.IntBlinkRate := br;
end;


procedure TFormRndLedColor.EditColor(led:TkRndLed);
var br : integer; // p,ps : TPoint;
begin
  br := led.IntBlinkRate;
  kRndLedBlink.IntBlinkRate := br;
  EditRate.Text := IntToStr(br);
  ThisLed := led;
  kRndLedBlink.LedOnRealColor := ThisLed.LedOnRealColor;
  kRndLedBlink.LedOffRealColor := ThisLed.LedOffRealColor;
  kRndLedBlink.LedNegRealColor := ThisLed.LedNegRealColor;

  kRndLedOff.LedOnRealColor := ThisLed.LedOffRealColor;
  kRndLedOn.LedOnRealColor := ThisLed.LedOnRealColor;
  kRndLedNeg.LedOnRealColor := ThisLed.LedNegRealColor;
//  p.y := led.top; p.x := led.left; ps := ClientToScreen(p);
//  Top := ps.y - Height div 2; if ( top < 0 ) then top := 0;
//  Left := ps.x - Width div 2; if ( Left < 0 ) then Left := 0;
  ShowModal;
end;


procedure TFormRndLedColor.ButtonOKClick(Sender: TObject);
begin
  ThisLed.IntBlinkRate    := kRndLedBlink.IntBlinkRate;
  ThisLed.LedOnRealColor  := kRndLedBlink.LedOnRealColor;
  ThisLed.LedOffRealColor := kRndLedBlink.LedOffRealColor;
  ThisLed.LedNegRealColor := kRndLedBlink.LedNegRealColor;
  Close;
end;

procedure TFormRndLedColor.kRndLedOnDblClick(Sender: TObject);
var led : TkRndLed;
    cd : TColorDialog;
begin
  led :=  Sender as TkRndLed;
  cd := TColorDialog.Create(self);
  cd.color := led.LedOnRealColor;
  cd.Options := [cdFullOpen,cdAnyColor];
  if ( cd.Execute ) then begin
    led.LedOnRealColor := cd.color;
    if ( led.Tag = 0 ) then kRndLedBlink.LedOffRealColor := cd.color;
    if ( led.Tag = 1 ) then kRndLedBlink.LedOnRealColor := cd.color;
    if ( led.Tag =-1 ) then kRndLedBlink.LedNegRealColor := cd.color;
  end;
  cd.free;
end;

procedure TFormRndLedColor.kRndLedBlinkClick(Sender: TObject);
var led : TkRndLed;
begin
  led :=  Sender as TkRndLed;
  ActiveLed := led;
  if ( led.Tag <> 0 ) then kRndLedBlink.Value := led.Tag;
  if ( led.Tag <> 2 ) then kRndLedBlink.Top := led.Top
  else kRndLedBlink.Top := ( kRndLedOn.Top + kRndLedOff.Top ) div 2;
end;

end.
