Forráskód Böngészése

contextual toolbar defined by tool

Johann 6 éve
szülő
commit
76381619fa

+ 47 - 71
lazpaint/tools/utool.pas

@@ -27,6 +27,12 @@ const
 
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 
+type
+  TContextualToolbar = (ctColor, ctPenWidth, ctAliasing, ctShape, ctEraserOption, ctTolerance,
+    ctGradient, ctDeformation, ctLineCap, ctJoinStyle, ctSplineStyle, ctText,
+    ctPhong, ctAltitude, ctPerspective, ctBrush, ctTexture, ctRatio);
+  TContextualToolbars = set of TContextualToolbar;
+
 type
   TToolManager = class;
   TBitmapToVirtualScreenFunction = function(PtF: TPointF): TPointF of object;
@@ -86,6 +92,7 @@ type
     function ToolProvideCopy: boolean; virtual;
     function ToolProvideCut: boolean; virtual;
     function ToolProvidePaste: boolean; virtual;
+    function GetContextualToolbars: TContextualToolbars; virtual;
     function GetToolDrawingLayer: TBGRABitmap;
     procedure RestoreBackupDrawingLayer;
     function GetBackupLayerIfExists: TBGRABitmap;
@@ -220,6 +227,7 @@ type
 
     function GetCurrentToolType: TPaintToolType;
     function SetCurrentToolType(tool: TPaintToolType): boolean;
+    procedure UpdateContextualToolbars;
     function ToolCanBeUsed: boolean;
     procedure ToolWakeUp;
     procedure ToolSleep;
@@ -702,6 +710,11 @@ begin
   result := false;
 end;
 
+function TGenericTool.GetContextualToolbars: TContextualToolbars;
+begin
+  result := [ctColor,ctTexture];
+end;
+
 function TGenericTool.GetToolDrawingLayer: TBGRABitmap;
 begin
   result := DoGetToolDrawingLayer;
@@ -1115,8 +1128,6 @@ begin
 end;
 
 procedure TToolManager.InternalSetCurrentToolType(tool: TPaintToolType);
-var showPenwidth, showShape, showLineCap, showJoinStyle, showSplineStyle, showEraserOption, showTolerance, showGradient, showDeformation,
-    showText, showPhong, showAltitude, showPerspective, showColor, showTexture, showBrush: boolean;
 begin
   if (tool <> FCurrentToolType) or (FCurrentTool=nil) then
   begin
@@ -1129,83 +1140,48 @@ begin
     FCurrentToolType:= tool;
   end;
 
-  showColor:= true;
-  showPenwidth := false;
-  showShape := false;
-  showEraserOption := false;
-  showTolerance := false;
-  showGradient := false;
-  showDeformation := false;
-  showLineCap := false;
-  showJoinStyle:= false;
-  showSplineStyle:= false;
-  showText := false;
-  showPhong := false;
-  showAltitude:= false;
-  showPerspective := false;
-  showBrush:= false;
-  showTexture := false;
-
-  case FCurrentToolType of
-  ptPen,ptSelectPen,ptBrush,ptClone:
-    begin
-      showPenwidth := true;
-      showBrush:= FCurrentToolType in[ptBrush,ptClone];
-    end;
-  ptEditShape: showTexture := true;
-  ptSelectSpline: showSplineStyle := true;
-  ptEraser: begin showPenwidth := true; showEraserOption := true; showColor := false; end;
-  ptRect, ptEllipse, ptPolygon, ptSpline:
-    begin
-      showShape := true;
-      showPenwidth := true;
-      showLineCap := FCurrentToolType in[ptPolygon,ptSpline];
-      showJoinStyle:= FCurrentToolType in[ptRect,ptPolygon];
-      showSplineStyle:= FCurrentToolType = ptSpline;
-    end;
-  ptFloodFill,ptMagicWand: showTolerance := true;
-  ptGradient: showGradient := true;
-  ptDeformation: showDeformation:= true;
-  ptText: begin showText := True; showAltitude := ToolTextPhong; end;
-  ptPhong: begin showPhong := true; showAltitude:= true; end;
-  ptTextureMapping,ptLayerMapping: showPerspective := true;
-  end;
-  if FCurrentToolType in [ptSelectEllipse,ptSelectPen,ptSelectPoly,ptSelectRect,
-    ptSelectSpline,ptDeformation,ptClone,ptMagicWand,ptMoveSelection,ptRotateSelection] then
-    showColor:= false;
-  If FCurrentToolType in [ptPen,ptRect,ptEllipse,ptPolygon,ptSpline,ptFloodFill,
-    ptPhong,ptText,ptHand] then
-    showTexture:= true;
-
   if not IsSelectingTool then
     Image.ReleaseEmptySelection;
 
-  SetControlsVisible(PenWidthControls, showPenwidth);
-  SetControlsVisible(AliasingControls, FCurrentToolType in[ptPen,ptEraser]);
-  SetControlsVisible(SplineStyleControls, showSplineStyle);
-  SetControlsVisible(JoinStyleControls, showJoinStyle);
-  SetControlsVisible(LineCapControls, showLineCap);
-  SetControlsVisible(ShapeControls, showShape);
-  SetControlsVisible(EraserControls, showEraserOption);
-  SetControlsVisible(ToleranceControls, showTolerance);
-  SetControlsVisible(GradientControls, showGradient);
-  SetControlsVisible(DeformationControls, showDeformation);
-  SetControlsVisible(TextControls, showText);
-  SetControlsVisible(PhongControls, showPhong);
-  SetControlsVisible(AltitudeControls, showAltitude);
-  SetControlsVisible(PerspectiveControls, showPerspective);
-  SetControlsVisible(PenColorControls, showColor);
-  SetControlsVisible(TextureControls, showTexture);
-  SetControlsVisible(BrushControls, showBrush);
-  SetControlsVisible(RatioControls, FCurrentToolType in[ptSelectRect,ptSelectEllipse]);
-
   Image.RenderMayChange(rect(0,0,Image.Width,Image.Height),True);
-  If Assigned(FOnToolChangedHandler) then
-    FOnToolChangedHandler(self, tool);
+
+  UpdateContextualToolbars;
 
   FShouldExitTool:= false;
 end;
 
+procedure TToolManager.UpdateContextualToolbars;
+var
+  contextualToolbars: TContextualToolbars;
+begin
+  if Assigned(FCurrentTool) then
+    contextualToolbars := FCurrentTool.GetContextualToolbars
+  else
+    contextualToolbars := [ctColor,ctTexture];
+
+  SetControlsVisible(PenWidthControls, ctPenWidth in contextualToolbars);
+  SetControlsVisible(AliasingControls, ctAliasing in contextualToolbars);
+  SetControlsVisible(SplineStyleControls, ctSplineStyle in contextualToolbars);
+  SetControlsVisible(JoinStyleControls, ctJoinStyle in contextualToolbars);
+  SetControlsVisible(LineCapControls, ctLineCap in contextualToolbars);
+  SetControlsVisible(ShapeControls, ctShape in contextualToolbars);
+  SetControlsVisible(EraserControls, ctEraserOption in contextualToolbars);
+  SetControlsVisible(ToleranceControls, ctTolerance in contextualToolbars);
+  SetControlsVisible(GradientControls, ctGradient in contextualToolbars);
+  SetControlsVisible(DeformationControls, ctDeformation in contextualToolbars);
+  SetControlsVisible(TextControls, ctText in contextualToolbars);
+  SetControlsVisible(PhongControls, ctPhong in contextualToolbars);
+  SetControlsVisible(AltitudeControls, ctAltitude in contextualToolbars);
+  SetControlsVisible(PerspectiveControls, ctPerspective in contextualToolbars);
+  SetControlsVisible(PenColorControls, ctColor in contextualToolbars);
+  SetControlsVisible(TextureControls, ctTexture in contextualToolbars);
+  SetControlsVisible(BrushControls, ctBrush in contextualToolbars);
+  SetControlsVisible(RatioControls, ctRatio in contextualToolbars);
+
+  If Assigned(FOnToolChangedHandler) then
+    FOnToolChangedHandler(self, FCurrentToolType);
+end;
+
 function TToolManager.InternalBitmapToVirtualScreen(PtF: TPointF): TPointF;
 begin
   if Assigned(FCurrentTool) then

+ 18 - 0
lazpaint/tools/utoolbasic.pas

@@ -36,6 +36,7 @@ type
     function DoToolMove(toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
   public
     function ToolUp: TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolPen }
@@ -57,6 +58,7 @@ type
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolKeyUp(var key: Word): TRect; override;
     function ToolUp: TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     destructor Destroy; override;
   end;
 
@@ -68,6 +70,7 @@ type
     function BlurRadius: single;
     function StartDrawing(toolDest: TBGRABitmap; ptF: TPointF; {%H-}rightBtn: boolean): TRect; override;
     function ContinueDrawing(toolDest: TBGRABitmap; originF, destF: TPointF): TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
 
@@ -206,6 +209,11 @@ begin
   end;
 end;
 
+function TToolErase.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctPenWidth,ctEraserOption,ctAliasing];
+end;
+
 { TToolPen }
 
 function TToolPen.GetIsSelectingTool: boolean;
@@ -349,6 +357,11 @@ begin
   result := EmptyRect;
 end;
 
+function TToolPen.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctPenWidth,ctAliasing];
+end;
+
 destructor TToolPen.Destroy;
 begin
   if penDrawing then ValidateAction;
@@ -389,6 +402,11 @@ begin
   colorpicking := false;
 end;
 
+function TToolColorPicker.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor];
+end;
+
 { TToolHand }
 
 function TToolHand.FixSelectionTransform: boolean;

+ 12 - 0
lazpaint/tools/utoolbrush.pas

@@ -43,6 +43,7 @@ type
     procedure ReleaseBrush; override;
   public
     destructor Destroy; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolClone }
@@ -61,6 +62,7 @@ type
     function SubPixelAccuracy: boolean; override;
     constructor Create(AManager: TToolManager); override;
     destructor Destroy; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth, VirtualScreenHeight: integer;
       BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
   end;
@@ -145,6 +147,11 @@ begin
   inherited Destroy;
 end;
 
+function TToolClone.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctPenWidth,ctBrush];
+end;
+
 function TToolClone.Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth,
   VirtualScreenHeight: integer;
   BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;
@@ -207,6 +214,11 @@ begin
   inherited Destroy;
 end;
 
+function TToolBrush.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctPenWidth,ctBrush];
+end;
+
 { TToolGenericBrush }
 
 function TToolGenericBrush.GetBrushInfo: TLazPaintBrush;

+ 19 - 1
lazpaint/tools/utooldeformationgrid.pas

@@ -33,6 +33,7 @@ type
   public
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolUp: TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
     procedure BeforeGridSizeChange; override;
     procedure AfterGridSizeChange(NewNbX,NewNbY: Integer); override;
@@ -81,6 +82,7 @@ type
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolKeyUp(var key: Word): TRect; override;
     function ToolUp: TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
     destructor Destroy; override;
   end;
@@ -97,6 +99,7 @@ type
     function GetTexture: TBGRABitmap; override;
     function DefaultTextureCenter: TPointF; override;
   public
+    function GetContextualToolbars: TContextualToolbars; override;
     destructor Destroy; override;
   end;
 
@@ -149,6 +152,11 @@ begin
   result := FDefaultTextureCenter;
 end;
 
+function TToolLayerMapping.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctPerspective];
+end;
+
 destructor TToolLayerMapping.Destroy;
 begin
   FreeAndNil(FTexture);
@@ -673,6 +681,11 @@ begin
     result := EmptyRect;
 end;
 
+function TToolTextureMapping.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctTexture,ctPerspective];
+end;
+
 function TToolTextureMapping.Render(VirtualScreen: TBGRABitmap;
   VirtualScreenWidth, VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;
 
@@ -812,7 +825,7 @@ begin
 end;
 
 function TToolDeformationGrid.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
-  ptF: TPointF): TRect;
+  ptF: TPointF): Trect;
 var xb,yb,NbX,NbY: integer;
     gridDone: array of array of boolean;
     layer,backupLayer : TBGRABitmap;
@@ -1028,6 +1041,11 @@ begin
   deformationGridMoving := false;
 end;
 
+function TToolDeformationGrid.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctDeformation];
+end;
+
 initialization
 
   RegisterTool(ptDeformation, TToolDeformationGrid);

+ 12 - 0
lazpaint/tools/utoolfloodfill.pas

@@ -19,6 +19,7 @@ type
   public
     function DoToolDown(toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
       rightBtn: boolean): TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolGradient }
@@ -31,6 +32,7 @@ type
     procedure QuickDefineShape(AStart,AEnd: TPointF); override;
     function SlowShape: boolean; override;
     function GetStatusText: string; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
 implementation
@@ -109,6 +111,11 @@ begin
     Result:=inherited GetStatusText;
 end;
 
+function TToolGradient.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor, ctGradient];
+end;
+
 function TToolGradient.SlowShape: boolean;
 begin
   Result:= true;
@@ -145,6 +152,11 @@ begin
   result := OnlyRenderChange;
 end;
 
+function TToolFloodFill.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctTolerance];
+end;
+
 initialization
 
   RegisterTool(ptFloodFill, TToolFloodFill);

+ 6 - 0
lazpaint/tools/utoolicon.pas

@@ -17,6 +17,7 @@ type
   {%H-}rightBtn: boolean): TRect; override;
     function GetStatusText: string; override;
   public
+    function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth,
       VirtualScreenHeight: integer;
       BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
@@ -40,6 +41,11 @@ begin
   Result:= rsHotSpot + '|x = ' + IntToStr(Manager.Image.CursorHotSpot.X)+'|y = '+IntToStr(Manager.Image.CursorHotSpot.Y);
 end;
 
+function TCursorHotspotTool.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [];
+end;
+
 function TCursorHotspotTool.Render(VirtualScreen: TBGRABitmap;
   VirtualScreenWidth, VirtualScreenHeight: integer;
   BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;

+ 12 - 0
lazpaint/tools/utoollayer.pas

@@ -34,6 +34,7 @@ type
   public
     function ToolUp: TRect; override;
     function ToolKeyDown(var key: Word): TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth,
       {%H-}VirtualScreenHeight: integer;
       BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect; override;
@@ -84,6 +85,7 @@ type
   public
     constructor Create(AManager: TToolManager); override;
     destructor Destroy; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolKeyUp(var key: Word): TRect; override;
     function ToolUp: TRect; override;
@@ -268,6 +270,11 @@ begin
     Result:=inherited ToolKeyDown(key);
 end;
 
+function TToolMoveLayer.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [];
+end;
+
 function TToolMoveLayer.Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth,
   VirtualScreenHeight: integer;
   BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;
@@ -470,6 +477,11 @@ begin
   inherited Destroy;
 end;
 
+function TToolTransformLayer.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [];
+end;
+
 function TToolTransformLayer.ToolKeyDown(var key: Word): TRect;
 begin
   if key = VK_CONTROL then

+ 6 - 0
lazpaint/tools/utoolphong.pas

@@ -20,6 +20,7 @@ type
     function SlowShape: boolean; override;
   public
     constructor Create(AManager: TToolManager); override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
 implementation
@@ -34,6 +35,11 @@ begin
   FMatrix := AffineMatrixIdentity;
 end;
 
+function TToolPhong.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctPhong,ctAltitude];
+end;
+
 procedure TToolPhong.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff);
 var
   posF: TPointF;

+ 27 - 0
lazpaint/tools/utoolpolygon.pas

@@ -19,6 +19,8 @@ type
   TToolRectangle = class(TVectorialTool)
   protected
     function CreateShape: TVectorShape; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolEllipse }
@@ -26,6 +28,8 @@ type
   TToolEllipse = class(TVectorialTool)
   protected
     function CreateShape: TVectorShape; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolPolygon }
@@ -35,6 +39,8 @@ type
     function CreateShape: TVectorShape; override;
     procedure AssignShapeStyle(AMatrix: TAffineMatrix); override;
     procedure UpdateUserMode; virtual;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSpline }
@@ -53,6 +59,7 @@ type
   public
     constructor Create(AManager: TToolManager); override;
     function ToolKeyPress(var key: TUTF8Char): TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
     property CurrentMode: TToolSplineMode read GetCurrentMode write SetCurrentMode;
   end;
 
@@ -67,6 +74,11 @@ begin
   result := TEllipseShape.Create(nil);
 end;
 
+function TToolEllipse.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctShape,ctPenWidth];
+end;
+
 { TToolRectangle }
 
 function TToolRectangle.CreateShape: TVectorShape;
@@ -74,6 +86,11 @@ begin
   result := TRectShape.Create(nil);
 end;
 
+function TToolRectangle.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctJoinStyle];
+end;
+
 { TToolSpline }
 
 function TToolSpline.GetCurrentMode: TToolSplineMode;
@@ -161,6 +178,11 @@ begin
   if Key='x' then Key := #0;
 end;
 
+function TToolSpline.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctLineCap];
+end;
+
 { TToolPolygon }
 
 function TToolPolygon.CreateShape: TVectorShape;
@@ -184,6 +206,11 @@ begin
   if FQuickDefine then FShape.Usermode := vsuCreate;
 end;
 
+function TToolPolygon.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctJoinStyle,ctLineCap];
+end;
+
 initialization
 
   RegisterTool(ptRect,TToolRectangle);

+ 47 - 0
lazpaint/tools/utoolselect.pas

@@ -20,6 +20,8 @@ type
     function UpdateShape(toolDest: TBGRABitmap): TRect; override;
     procedure QuickDefineEnd; override;
     function BigImage: boolean;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSelectRect }
@@ -29,6 +31,7 @@ type
     function CreateShape: TVectorShape; override;
   public
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSelectEllipse }
@@ -38,6 +41,7 @@ type
     function CreateShape: TVectorShape; override;
   public
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSelectPoly }
@@ -46,6 +50,8 @@ type
   protected
     procedure AssignShapeStyle(AMatrix: TAffineMatrix); override;
     function GetIsSelectingTool: boolean; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSelectSpline }
@@ -54,6 +60,8 @@ type
   protected
     procedure AssignShapeStyle(AMatrix: TAffineMatrix); override;
     function GetIsSelectingTool: boolean; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolMagicWand }
@@ -63,6 +71,8 @@ type
     function GetIsSelectingTool: boolean; override;
     function DoToolDown(toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
       rightBtn: boolean): TRect; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TToolSelectionPen }
@@ -72,6 +82,8 @@ type
     function GetIsSelectingTool: boolean; override;
     function StartDrawing(toolDest: TBGRABitmap; ptF: TPointF; rightBtn: boolean): TRect; override;
     function ContinueDrawing(toolDest: TBGRABitmap; originF, destF: TPointF): TRect; override;
+  public
+    function GetContextualToolbars: TContextualToolbars; override;
   end;
 
   { TTransformSelectionTool }
@@ -161,6 +173,11 @@ begin
   Result:= true;
 end;
 
+function TToolSelectSpline.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctSplineStyle];
+end;
+
 { TToolSelectPoly }
 
 procedure TToolSelectPoly.AssignShapeStyle(AMatrix: TAffineMatrix);
@@ -176,6 +193,11 @@ begin
   Result:= true;
 end;
 
+function TToolSelectPoly.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [];
+end;
+
 { TVectorialSelectTool }
 
 function TVectorialSelectTool.GetIsSelectingTool: boolean;
@@ -223,6 +245,11 @@ begin
   result := Manager.Image.Width*Manager.Image.Height > 480000;
 end;
 
+function TVectorialSelectTool.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [];
+end;
+
 { TToolSelectRect }
 
 function TToolSelectRect.CreateShape: TVectorShape;
@@ -260,6 +287,11 @@ begin
   end;
 end;
 
+function TToolSelectRect.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctRatio];
+end;
+
 { TToolSelectEllipse }
 
 function TToolSelectEllipse.CreateShape: TVectorShape;
@@ -299,6 +331,11 @@ begin
   end;
 end;
 
+function TToolSelectEllipse.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctRatio];
+end;
+
 { TTransformSelectionTool }
 
 function TTransformSelectionTool.GetIsSelectingTool: boolean;
@@ -524,6 +561,11 @@ begin
   result := GetShapeBounds([destF,originF],Manager.ToolPenWidth+1);
 end;
 
+function TToolSelectionPen.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctPenWidth];
+end;
+
 { TToolMagicWand }
 
 function TToolMagicWand.GetIsSelectingTool: boolean;
@@ -547,6 +589,11 @@ begin
   ValidateAction;
 end;
 
+function TToolMagicWand.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctTolerance];
+end;
+
 initialization
 
   RegisterTool(ptMagicWand,TToolMagicWand);

+ 7 - 0
lazpaint/tools/utooltext.pas

@@ -31,6 +31,7 @@ type
     function RoundCoordinate(ptF: TPointF): TPointF; override;
   public
     constructor Create(AManager: TToolManager); override;
+    function GetContextualToolbars: TContextualToolbars; override;
     function ToolKeyDown(var key: Word): TRect; override;
     function ToolCopy: boolean; override;
     function ToolCut: boolean; override;
@@ -217,6 +218,12 @@ begin
   FMatrix := AffineMatrixIdentity;
 end;
 
+function TToolText.GetContextualToolbars: TContextualToolbars;
+begin
+  Result:= [ctColor,ctTexture,ctText];
+  if Manager.ToolTextPhong then include(result, ctAltitude);
+end;
+
 function TToolText.ToolKeyDown(var key: Word): TRect;
 var
   keyUtf8: TUTF8Char;