From 7d6e60fc653dce760bcefde7255c1bc3de96a3d3 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 21 Aug 2015 14:46:15 +0000 Subject: [PATCH] ColorPalette: New property SelectedIndex. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4281 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/colorpalette/colorpalette.pas | 101 +++++++++++++++++------ components/colorpalette/demo/unit1.lfm | 19 +++-- components/colorpalette/demo/unit1.pas | 62 +++++++------- 3 files changed, 120 insertions(+), 62 deletions(-) diff --git a/components/colorpalette/colorpalette.pas b/components/colorpalette/colorpalette.pas index fad004236..abb476ad5 100644 --- a/components/colorpalette/colorpalette.pas +++ b/components/colorpalette/colorpalette.pas @@ -76,22 +76,26 @@ type FOnSelectColor: TColorPaletteEvent; FRows: Integer; FColors: TList; - FPickedColor: TColor; - FSelectedColor: TColor; // same as PickedColor, but updated only if "IsCorrectShift" + FSelectedColor: TColor; + FSelectedIndex: Integer; FPickMode: TPickMode; FPickShift: TPickShift; FMousePt: TPoint; FMouseIndex: Integer; FPrevMouseIndex: Integer; FStoredShift: TShiftState; + FShowSelection: Boolean; function GetColorCount: Integer; - function GetColors(Index: Integer): TColor; + function GetColors(AIndex: Integer): TColor; + function GetPickedColor: TColor; procedure SetButtonHeight(const AValue: Integer); procedure SetButtonWidth(const AValue: Integer); - procedure SetColors(Index: Integer; const AValue: TColor); + procedure SetColors(AIndex: Integer; const AValue: TColor); procedure SetCols(AValue: Integer); + procedure SetSelectedIndex(AValue: Integer); + procedure SetShowSelection(AValue: Boolean); protected - procedure ColorPick(AColor: TColor; Shift: TShiftState); dynamic; + procedure ColorPick(AIndex: Integer; Shift: TShiftState); dynamic; procedure ColorMouseMove(AColor: TColor; Shift: TShiftState); dynamic; procedure DoAddColor(AColor: TColor); virtual; procedure DoColorPick(AColor: TColor; AShift: TShiftState); virtual; @@ -107,6 +111,8 @@ type property ColumnCount: Integer read FCols write SetCols; property PickMode: TPickMode read FPickMode write FPickMode default pmDefault; property PickShift: TPickShift read FPickShift write FPickShift default [ssLeft]; + property SelectedIndex: Integer read FSelectedIndex write SetSelectedIndex default 0; + property ShowSelection: Boolean read FShowSelection write SetShowSelection default false; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; @@ -119,7 +125,7 @@ type property Colors[Index: Integer]: TColor read GetColors write SetColors; property ColorCount: Integer read GetColorCount; - property PickedColor: TColor read FSelectedColor; deprecated 'Use SelectedColor'; + property PickedColor: TColor read GetPickedColor; deprecated 'Use SelectedColor'; property SelectedColor: TColor read FSelectedColor; property OnSelectColor: TColorPaletteEvent read FOnSelectColor write FOnSelectColor; @@ -150,7 +156,9 @@ type property PickMode; property PickShift; property PopupMenu; + property SelectedIndex; property ShowHint; + property ShowSelection; property Visible; property OnChangeBounds; @@ -227,11 +235,14 @@ begin Invalidate; end; -procedure TCustomColorPalette.ColorPick(AColor: TColor; Shift: TShiftState); +procedure TCustomColorPalette.ColorPick(AIndex: Integer; Shift: TShiftState); +var + c: TColor; begin - DoColorPick(AColor, Shift); + c := GetColors(AIndex); + DoColorPick(c, Shift); if IsCorrectShift(Shift) then - DoSelectColor(AColor); + SelectedIndex := AIndex; end; procedure TCustomColorPalette.ColorMouseMove(AColor: TColor; Shift: TShiftState); @@ -260,12 +271,15 @@ end; procedure TCustomColorPalette.DoDeleteColor(AIndex: Integer); begin + if (AIndex < 0) or (AIndex >= FColors.Count) then + exit; FColors.Delete(AIndex); end; procedure TCustomColorPalette.DoSelectColor(AColor: TColor); begin FSelectedColor := AColor; + Invalidate; if Assigned(FOnSelectColor) then FOnSelectColor(self, AColor); end; @@ -274,14 +288,20 @@ begin Result := FColors.Count; end; -function TCustomColorPalette.GetColors(Index: Integer): TColor; +function TCustomColorPalette.GetColors(AIndex: Integer): TColor; begin - Result := TColor(PtrUInt(FColors.Items[Index])); + if (AIndex < 0) or (AIndex >= FColors.Count) then + Result := clNone + else + Result := TColor(PtrUInt(FColors.Items[AIndex])); +end; + +function TCustomColorPalette.GetPickedColor: TColor; +begin + Result := GetColors(FMouseIndex); end; function TCustomColorPalette.IsCorrectShift(Shift: TShiftState): Boolean; -var - ss: TShiftState; begin Result := True; if (ssLeft in FPickShift) and (Classes.ssLeft in Shift) then exit; @@ -376,7 +396,7 @@ begin end; UpdateSize; - Invalidate; + SelectedIndex := 0; end; procedure TCustomColorPalette.MouseDown(Button: TMouseButton; @@ -398,10 +418,9 @@ begin if (FMouseIndex < FColors.Count) then begin - FPickedColor := GetColors(FMouseIndex); FStoredShift := Shift; // store for usage by pmDefault at MouseUp if FPickMode <> pmDefault then - ColorPick(FPickedColor, Shift); + ColorPick(FMouseIndex, Shift); end; end; @@ -422,10 +441,8 @@ begin if C <> clNone then ColorMouseMove(C, Shift); - if FPickMode = pmContinuous then begin - FPickedColor := GetColors(FMouseIndex); - ColorPick(FPickedColor, Shift); - end; + if FPickMode = pmContinuous then + ColorPick(FMouseIndex, Shift); end; FPrevMouseIndex := FMouseIndex; @@ -437,7 +454,7 @@ begin case FPickMode of pmDefault: if (FMousePt.X = X) and (FMousePt.Y = Y) then - ColorPick(FPickedColor, FStoredShift); + ColorPick(FMouseIndex, FStoredShift); pmImmediate, pmContinuous: begin X := X div FButtonWidth; @@ -446,8 +463,7 @@ begin if (FMouseIndex >= 0) and (FMouseIndex < FColors.Count) and (FMouseIndex <> FPrevMouseIndex) then begin - FPickedColor := GetColors(FMouseIndex); - ColorPick(FPickedColor, Shift); + ColorPick(FMouseIndex, Shift); end; end; end; @@ -460,6 +476,7 @@ procedure TCustomColorPalette.Paint; var I, X, Y: Integer; c: TColor; + R: TRect; begin Canvas.Pen.Color := clBlack; for I := 0 to Pred(FColors.Count) do @@ -469,9 +486,19 @@ begin c := GetColors(I); if c <> clNone then begin + R := Bounds(X * FButtonWidth, Y*FButtonHeight, FButtonWidth, FButtonHeight); + if FShowSelection and (FSelectedIndex = I) then + begin + if Red(c) + Green(c) + Blue(c) > 128*3 then + Canvas.Pen.Color := clBlack else + Canvas.Pen.Color := clWhite; + Canvas.Pen.Width := 3; + end else begin + Canvas.Pen.Color := clBlack; + Canvas.Pen.Width := 1; + end; Canvas.Brush.Color := c; - Canvas.Rectangle(Bounds(X * FButtonWidth, Y * FButtonHeight, FButtonWidth, - FButtonHeight)); + Canvas.Rectangle(R); end; end; end; @@ -517,9 +544,9 @@ begin UpdateSize; end; -procedure TCustomColorPalette.SetColors(Index: Integer; const AValue: TColor); +procedure TCustomColorPalette.SetColors(AIndex: Integer; const AValue: TColor); begin - FColors.Items[Index] := Pointer(AValue); + FColors.Items[AIndex] := Pointer(AValue); Invalidate; end; @@ -532,6 +559,26 @@ begin Invalidate; end; +procedure TCustomColorPalette.SetShowSelection(AValue: Boolean); +begin + if FShowSelection = AValue then exit; + FShowSelection := AValue; + Invalidate; +end; + +procedure TCustomColorPalette.SetSelectedIndex(AValue: Integer); +begin + if FSelectedIndex = AValue then exit; + if AValue < 0 then + FSelectedIndex := 0 + else + if AValue >= FColors.Count then + FSelectedIndex := FColors.Count-1 + else + FSelectedIndex := AValue; + DoSelectColor(GetColors(FSelectedIndex)); +end; + procedure TCustomColorPalette.UpdateSize; begin if (FCols = 0) or (FColors.Count = 0) then FRows := 0 diff --git a/components/colorpalette/demo/unit1.lfm b/components/colorpalette/demo/unit1.lfm index ab34cc627..3076e9993 100644 --- a/components/colorpalette/demo/unit1.lfm +++ b/components/colorpalette/demo/unit1.lfm @@ -40,10 +40,10 @@ object MainForm: TMainForm Width = 63 end object LblColorInfo: TLabel - Left = 12 + Left = 9 Height = 65 Top = 45 - Width = 135 + Width = 146 AutoSize = False Caption = 'LblColorInfo' Font.Color = clGreen @@ -118,7 +118,7 @@ object MainForm: TMainForm object EdColCount: TSpinEdit Left = 11 Height = 23 - Top = 432 + Top = 463 Width = 66 MinValue = 1 OnChange = EdColCountChange @@ -128,7 +128,7 @@ object MainForm: TMainForm object Label2: TLabel Left = 11 Height = 15 - Top = 411 + Top = 442 Width = 80 Caption = 'Column count:' ParentColor = False @@ -152,13 +152,22 @@ object MainForm: TMainForm Text = 'default' end object LblPickMode: TLabel - Left = 11 + Left = 10 Height = 15 Top = 355 Width = 56 Caption = 'Pick mode' ParentColor = False end + object CbShowSelection: TCheckBox + Left = 11 + Height = 19 + Top = 413 + Width = 99 + Caption = 'Show selection' + OnChange = CbShowSelectionChange + TabOrder = 9 + end end object Bevel1: TBevel Left = 160 diff --git a/components/colorpalette/demo/unit1.pas b/components/colorpalette/demo/unit1.pas index e040d9212..53d32c659 100644 --- a/components/colorpalette/demo/unit1.pas +++ b/components/colorpalette/demo/unit1.pas @@ -21,6 +21,7 @@ type BtnAddColor: TButton; BtnLoadDefaultPal: TButton; BtnEditColor: TButton; + CbShowSelection: TCheckBox; ColorDialog: TColorDialog; ColorPalette: TColorPalette; CbPickMode: TComboBox; @@ -41,6 +42,7 @@ type procedure BtnLoadDefaultPalClick(Sender: TObject); procedure BtnLoadRndPaletteClick(Sender: TObject); procedure CbPickModeSelect(Sender: TObject); + procedure CbShowSelectionChange(Sender: TObject); procedure ColorPaletteDblClick(Sender: TObject); procedure ColorPaletteMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -51,7 +53,6 @@ type procedure MnuEditPickedColorClick(Sender: TObject); private { private declarations } - curIndex: integer; procedure EditCurColor; procedure SetColorInfo(ATitle: string; AColor: TColor); procedure UpdateCaption; @@ -105,17 +106,14 @@ procedure TMainForm.BtnDeleteColorClick(Sender: TObject); begin with ColorPalette do begin - if (curIndex < ColorCount) and (ColorCount > 0) then - begin - DeleteColor(curIndex); - if curIndex = ColorCount then dec(curIndex); - ColorSample.Brush.Color := Colors[curIndex] ; - if Colors[curIndex] = clNone then - ColorSample.Brush.Style := bsClear else - ColorSample.Brush.Style := bsSolid; - UpdateCaption; - SetColorInfo('Current', ColorPalette.Colors[curIndex]); - end; + DeleteColor(SelectedIndex); + if SelectedIndex = ColorCount then SelectedIndex := ColorCount-1; + ColorSample.Brush.Color := Colors[SelectedColor]; + if Colors[SelectedColor] = clNone then + ColorSample.Brush.Style := bsClear else + ColorSample.Brush.Style := bsSolid; + UpdateCaption; + SetColorInfo('Current', Colors[SelectedIndex]); end; end; @@ -151,14 +149,19 @@ begin ColorPalette.PickMode := TPickMode(CbPickMode.ItemIndex); end; +procedure TMainForm.CbShowSelectionChange(Sender: TObject); +begin + ColorPalette.ShowSelection := CbShowSelection.Checked; +end; + procedure TMainForm.ColorPaletteDblClick(Sender: TObject); begin with ColorDialog do begin - Color := ColorPalette.Colors[curIndex]; + Color := ColorPalette.Colors[ColorPalette.SelectedIndex]; if Execute then begin - ColorPalette.Colors[curIndex] := Color; + ColorPalette.Colors[ColorPalette.SelectedIndex] := Color; ColorSample.Brush.Color := Color; ColorSample.Brush.Style := bsSolid; SetColorInfo('Current', Color); @@ -174,23 +177,23 @@ end; procedure TMainForm.ColorPaletteMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin - with ColorPalette do - begin - X := X div ButtonWidth; - Y := Y div ButtonHeight; - curIndex := X + Y * ColumnCount; - end; - BtnDeleteColor.caption := 'Delete color #' + IntToStr(curIndex); +exit; + + + + BtnDeleteColor.caption := 'Delete color #' + IntToStr(ColorPalette.SelectedIndex); UpdateCaption; end; procedure TMainForm.ColorPaletteSelectColor(Sender: TObject; AColor: TColor); begin - ColorSample.Brush.Color := ColorPalette.SelectedColor; - if ColorPalette.Colors[curIndex] = clNone then + ColorSample.Brush.Color := AColor; + if AColor = clNone then ColorSample.Brush.Style := bsClear else ColorSample.Brush.Style := bsSolid; - SetColorInfo('SelectedColor', ColorPalette.SelectedColor); + SetColorInfo('SelectedColor', AColor); + BtnDeleteColor.Caption := 'Delete color #' + IntToStr(ColorPalette.SelectedIndex); + UpdateCaption; end; procedure TMainForm.EdColCountChange(Sender: TObject); @@ -218,9 +221,8 @@ end; procedure TMainForm.FormCreate(Sender: TObject); begin - curIndex := 0; - ColorSample.Brush.Color := ColorPalette.Colors[0]; - SetColorInfo('Current', ColorPalette.Colors[curIndex]); + ColorSample.Brush.Color := ColorPalette.SelectedColor; + SetColorInfo('Current', ColorPalette.SelectedColor); UpdateCaption; { ColorPalette.PickShift must contain ssRight in order to be able to select @@ -257,14 +259,14 @@ end; procedure TMainForm.UpdateCaption; begin Caption := Format('ColorPalette demo - CurIndex: %d (%d colors available)', - [curIndex, ColorPalette.ColorCount] + [ColorPalette.SelectedIndex, ColorPalette.ColorCount] ); end; procedure TMainForm.UpdatePalette; begin - ColorPalette.Colors[curIndex] := ColorSample.Brush.Color; - SetColorInfo('Current', ColorPalette.Colors[curIndex]); + ColorPalette.Colors[ColorPalette.SelectedIndex] := ColorSample.Brush.Color; + SetColorInfo('Current', ColorSample.Brush.Color); with BtnEditColor do begin Caption := 'Edit';