mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-20 14:19:33 +01:00
lcl: add overlay support to imagelist and treeview (based on patch of David Jenkins, issue #0021754)
git-svn-id: trunk@36805 -
This commit is contained in:
parent
49fc5776c9
commit
62cc1885af
@ -103,6 +103,7 @@ type
|
|||||||
|
|
||||||
TDrawingStyle = (dsFocus, dsSelected, dsNormal, dsTransparent);
|
TDrawingStyle = (dsFocus, dsSelected, dsNormal, dsTransparent);
|
||||||
TImageType = (itImage, itMask);
|
TImageType = (itImage, itMask);
|
||||||
|
TOverlay = 0..14; // windows limitation
|
||||||
|
|
||||||
TCustomImageList = class(TLCLReferenceComponent)
|
TCustomImageList = class(TLCLReferenceComponent)
|
||||||
private
|
private
|
||||||
@ -123,6 +124,7 @@ type
|
|||||||
FBkColor: TColor;
|
FBkColor: TColor;
|
||||||
FChanged: boolean;
|
FChanged: boolean;
|
||||||
FUpdateCount: integer;
|
FUpdateCount: integer;
|
||||||
|
FOverlays: array[TOverlay] of Integer;
|
||||||
|
|
||||||
procedure AllocData(ACount: Integer);
|
procedure AllocData(ACount: Integer);
|
||||||
function GetReference: TWSCustomImageListReference;
|
function GetReference: TWSCustomImageListReference;
|
||||||
@ -146,6 +148,7 @@ type
|
|||||||
procedure Initialize; virtual;
|
procedure Initialize; virtual;
|
||||||
procedure DefineProperties(Filer: TFiler); override;
|
procedure DefineProperties(Filer: TFiler); override;
|
||||||
procedure SetWidthHeight(NewWidth, NewHeight: integer); virtual;
|
procedure SetWidthHeight(NewWidth, NewHeight: integer); virtual;
|
||||||
|
procedure ClearOverlays;
|
||||||
|
|
||||||
class procedure WSRegisterClass; override;
|
class procedure WSRegisterClass; override;
|
||||||
function WSCreateReference(AParams: TCreateParams): PWSReference; override;
|
function WSCreateReference(AParams: TCreateParams): PWSReference; override;
|
||||||
@ -177,6 +180,10 @@ type
|
|||||||
AEnabled: Boolean = True); overload;
|
AEnabled: Boolean = True); overload;
|
||||||
procedure Draw(ACanvas: TCanvas; AX, AY, AIndex: Integer; ADrawingStyle: TDrawingStyle; AImageType: TImageType;
|
procedure Draw(ACanvas: TCanvas; AX, AY, AIndex: Integer; ADrawingStyle: TDrawingStyle; AImageType: TImageType;
|
||||||
ADrawEffect: TGraphicsDrawEffect); overload; virtual;
|
ADrawEffect: TGraphicsDrawEffect); overload; virtual;
|
||||||
|
procedure DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer; AOverlay: TOverlay; AEnabled: Boolean = True);
|
||||||
|
procedure DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer; AOverlay: TOverlay; ADrawEffect: TGraphicsDrawEffect);
|
||||||
|
procedure DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer; AOverlay: TOverlay; ADrawingStyle:
|
||||||
|
TDrawingStyle; AImageType: TImageType; ADrawEffect: TGraphicsDrawEffect); virtual;
|
||||||
procedure FillDescription(out ADesc: TRawImageDescription);
|
procedure FillDescription(out ADesc: TRawImageDescription);
|
||||||
|
|
||||||
procedure GetBitmap(Index: Integer; Image: TCustomBitmap); overload;
|
procedure GetBitmap(Index: Integer; Image: TCustomBitmap); overload;
|
||||||
@ -193,6 +200,7 @@ type
|
|||||||
procedure InsertIcon(AIndex: Integer; AIcon: TCustomIcon);
|
procedure InsertIcon(AIndex: Integer; AIcon: TCustomIcon);
|
||||||
procedure InsertMasked(Index: Integer; AImage: TCustomBitmap; MaskColor: TColor);
|
procedure InsertMasked(Index: Integer; AImage: TCustomBitmap; MaskColor: TColor);
|
||||||
procedure Move(ACurIndex, ANewIndex: Integer);
|
procedure Move(ACurIndex, ANewIndex: Integer);
|
||||||
|
procedure Overlay(AIndex: Integer; Overlay: TOverlay);
|
||||||
procedure Replace(AIndex: Integer; AImage, AMask: TCustomBitmap);
|
procedure Replace(AIndex: Integer; AImage, AMask: TCustomBitmap);
|
||||||
procedure ReplaceMasked(Index: Integer; NewImage: TCustomBitmap; MaskColor: TColor);
|
procedure ReplaceMasked(Index: Integer; NewImage: TCustomBitmap; MaskColor: TColor);
|
||||||
procedure RegisterChanges(Value: TChangeLink);
|
procedure RegisterChanges(Value: TChangeLink);
|
||||||
|
|||||||
@ -376,6 +376,7 @@ begin
|
|||||||
then TWSCustomImageListClass(WidgetSetClass).Clear(Self);
|
then TWSCustomImageListClass(WidgetSetClass).Clear(Self);
|
||||||
SetLength(FData, 0);
|
SetLength(FData, 0);
|
||||||
FAllocCount := 0;
|
FAllocCount := 0;
|
||||||
|
ClearOverlays;
|
||||||
|
|
||||||
FCount := 0;
|
FCount := 0;
|
||||||
Change;
|
Change;
|
||||||
@ -519,6 +520,38 @@ begin
|
|||||||
BkColor, BlendColor, ADrawEffect, ADrawingStyle, AImageType);
|
BkColor, BlendColor, ADrawEffect, ADrawingStyle, AImageType);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomImageList.DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer;
|
||||||
|
AOverlay: TOverlay; AEnabled: Boolean = True);
|
||||||
|
begin
|
||||||
|
DrawOverlay(ACanvas, AX, AY, AIndex, AOverlay, EffectMap[AEnabled]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomImageList.DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer;
|
||||||
|
AOverlay: TOverlay; ADrawEffect: TGraphicsDrawEffect);
|
||||||
|
begin
|
||||||
|
DrawOverlay(ACanvas, AX, AY, AIndex, AOverlay, DrawingStyle, ImageType, ADrawEffect);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomImageList.DrawOverlay(ACanvas: TCanvas; AX, AY, AIndex: Integer;
|
||||||
|
AOverlay: TOverlay; ADrawingStyle: TDrawingStyle; AImageType: TImageType;
|
||||||
|
ADrawEffect: TGraphicsDrawEffect);
|
||||||
|
var
|
||||||
|
OverlayIndex: Integer;
|
||||||
|
begin
|
||||||
|
if (AIndex < 0) or (AIndex >= FCount) then Exit;
|
||||||
|
|
||||||
|
ReferenceNeeded;
|
||||||
|
TWSCustomImageListClass(WidgetSetClass).Draw(Self, AIndex, ACanvas, Rect(AX, AY, FWidth, FHeight),
|
||||||
|
BkColor, BlendColor, ADrawEffect, ADrawingStyle, AImageType);
|
||||||
|
|
||||||
|
OverlayIndex := FOverlays[AOverlay];
|
||||||
|
if (OverlayIndex < 0) or (OverlayIndex >= FCount) then Exit;
|
||||||
|
|
||||||
|
TWSCustomImageListClass(WidgetSetClass).Draw(Self, OverlayIndex, ACanvas, Rect(AX, AY, FWidth, FHeight),
|
||||||
|
clNone, BlendColor, ADrawEffect, ADrawingStyle, AImageType);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Method: TCustomImageList.EndUpdate
|
Method: TCustomImageList.EndUpdate
|
||||||
Params: none
|
Params: none
|
||||||
@ -738,6 +771,7 @@ begin
|
|||||||
FBlendColor := clNone;
|
FBlendColor := clNone;
|
||||||
FBkColor := clNone;
|
FBkColor := clNone;
|
||||||
FDrawingStyle := dsNormal;
|
FDrawingStyle := dsNormal;
|
||||||
|
ClearOverlays;
|
||||||
|
|
||||||
if (Height < 1) or (Height > 32768) or (Width < 1)
|
if (Height < 1) or (Height > 32768) or (Width < 1)
|
||||||
then raise EInvalidOperation.Create(SInvalidImageSize);
|
then raise EInvalidOperation.Create(SInvalidImageSize);
|
||||||
@ -751,6 +785,14 @@ begin
|
|||||||
Clear;
|
Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomImageList.ClearOverlays;
|
||||||
|
var
|
||||||
|
I: TOverlay;
|
||||||
|
begin
|
||||||
|
for I := Low(TOverlay) to High(TOverlay) do
|
||||||
|
FOverlays[I] := -1;
|
||||||
|
end;
|
||||||
|
|
||||||
class procedure TCustomImageList.WSRegisterClass;
|
class procedure TCustomImageList.WSRegisterClass;
|
||||||
begin
|
begin
|
||||||
inherited WSRegisterClass;
|
inherited WSRegisterClass;
|
||||||
@ -1321,6 +1363,11 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomImageList.Overlay(AIndex: Integer; Overlay: TOverlay);
|
||||||
|
begin
|
||||||
|
FOverlays[Overlay] := AIndex;
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Method: TCustomImageList.RegisterChanges
|
Method: TCustomImageList.RegisterChanges
|
||||||
Params: Value: a reference to changelink object
|
Params: Value: a reference to changelink object
|
||||||
|
|||||||
@ -4884,8 +4884,12 @@ begin
|
|||||||
ImgIndex := Node.SelectedIndex;
|
ImgIndex := Node.SelectedIndex;
|
||||||
end;
|
end;
|
||||||
if (ImgIndex >= 0) and (ImgIndex < Images.Count) then
|
if (ImgIndex >= 0) and (ImgIndex < Images.Count) then
|
||||||
Images.Draw(Canvas, x + 1, (NodeRect.Top + NodeRect.Bottom - Images.Height) div 2,
|
if Node.OverlayIndex < 0 then
|
||||||
ImgIndex, Node.FNodeEffect);
|
Images.Draw(Canvas, x + 1, (NodeRect.Top + NodeRect.Bottom - Images.Height) div 2,
|
||||||
|
ImgIndex, Node.FNodeEffect)
|
||||||
|
else
|
||||||
|
Images.DrawOverlay(Canvas, x + 1, (NodeRect.Top + NodeRect.Bottom - Images.Height) div 2,
|
||||||
|
ImgIndex, Node.OverlayIndex, Node.FNodeEffect);
|
||||||
inc(x, Images.Width + 2);
|
inc(x, Images.Width + 2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user