lctoolbars.pas 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit LCToolbars;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, Controls, ComCtrls, Types, LResources, StdCtrls, BCTrackbarUpdown;
  7. function CreateToolBar(AImages: TImageList; AOwner: TComponent = nil): TToolbar;
  8. procedure ReorderToolbarContent(AToolbar: TToolbar);
  9. function GetToolbarSize(AToolbar: TToolbar; APadding: integer = 1): TSize;
  10. procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList; HorizPadding: integer = 5; VertPadding: integer = 4);
  11. procedure EnableDisableToolButtons(AButtons: array of TToolButton; AEnabled: boolean);
  12. procedure ShowAppendToolButtons(AButtons: array of TControl);
  13. function AddToolbarLabel(AToolbar: TToolbar; ACaption: string; AExistingContainer: TCustomControl): TLabel;
  14. function AddToolbarCheckButton(AToolbar: TToolbar; ACaption: string; AImageIndex: integer;
  15. AOnClick: TNotifyEvent; ADown: boolean; AGrouped: boolean = true; ATag: PtrInt = 0): TToolButton;
  16. function AddToolbarButton(AToolbar: TToolbar; ACaption: string; AImageIndex: integer;
  17. AOnClick: TNotifyEvent; ATag: PtrInt = 0): TToolButton;
  18. function AddToolbarUpDown(AToolbar: TToolbar; ACaption: string; AMin,AMax,AValue: Integer; AOnChange: TTrackBarUpDownChangeEvent): TBCTrackbarUpdown;
  19. function AddToolbarTextBox(AToolbar: TToolbar; ACaption: string; AText: string; AOnChange: TNotifyEvent): TEdit;
  20. procedure AddToolbarControl(AToolbar: TToolbar; AControl: TControl);
  21. function GetResourceString(AFilename: string): string;
  22. procedure LoadToolbarImage(AImages: TImageList; AIndex: integer; AFilename: string);
  23. implementation
  24. uses BGRALazPaint, Graphics, BGRABitmap, BGRABitmapTypes, math, Toolwin;
  25. function CreateToolBar(AImages: TImageList; AOwner: TComponent): TToolbar;
  26. begin
  27. result := TToolBar.Create(AOwner);
  28. result.Align := alNone;
  29. result.Height := AImages.Height+4;
  30. result.ShowHint:= true;
  31. result.ShowCaptions:= false;
  32. result.Images := AImages;
  33. result.ButtonWidth := AImages.Width+5;
  34. result.ButtonHeight := AImages.Height+4;
  35. result.ParentColor := false;
  36. result.EdgeBorders:= [];
  37. result.EdgeInner:= esNone;
  38. result.EdgeOuter:= esNone;
  39. end;
  40. procedure ReorderToolbarContent(AToolbar: TToolbar);
  41. var
  42. i,x,y: Integer;
  43. begin
  44. AToolbar.BeginUpdate;
  45. x := AToolbar.Indent;
  46. y := 0;
  47. for i := 0 to AToolbar.ControlCount-1 do
  48. begin
  49. with AToolbar.Controls[i] do
  50. begin
  51. if (x+Width > AToolbar.Width) and AToolbar.Wrapable then
  52. begin
  53. x := AToolbar.Indent;
  54. y += AToolbar.ButtonHeight;
  55. end;
  56. Left := x;
  57. Top := y;
  58. x += Width;
  59. end;
  60. if (AToolbar.Controls[i] is TToolButton) and
  61. TToolButton(AToolbar.Controls[i]).Wrap then
  62. begin
  63. x := AToolbar.Indent;
  64. y += AToolbar.ButtonHeight;
  65. end;
  66. end;
  67. AToolbar.EndUpdate;
  68. end;
  69. function GetToolbarSize(AToolbar: TToolbar; APadding: integer = 1): TSize;
  70. var
  71. i: Integer;
  72. r: TRect;
  73. begin
  74. result := Size(APadding,APadding);
  75. for i := 0 to AToolbar.ControlCount-1 do
  76. if AToolbar.Controls[i].Visible then
  77. begin
  78. r := AToolbar.Controls[i].BoundsRect;
  79. if r.Right > result.cx then result.cx := r.Right;
  80. if r.Bottom > result.cy then result.cy := r.Bottom;
  81. end;
  82. result.cx += APadding;
  83. result.cy += APadding;
  84. end;
  85. procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList; HorizPadding: integer; VertPadding: integer);
  86. begin
  87. AToolbar.Images := AImages;
  88. AToolbar.ButtonWidth:= AImages.Width+HorizPadding;
  89. AToolbar.ButtonHeight:= AImages.Height+VertPadding;
  90. end;
  91. function GetResourceString(AFilename: string): string;
  92. var
  93. strStream: TStringStream;
  94. resStream: TStream;
  95. begin
  96. resStream := BGRAResource.GetResourceStream(AFilename);
  97. strStream := TStringStream.Create('');
  98. strStream.CopyFrom(resStream, resStream.Size);
  99. resStream.Free;
  100. result:= strStream.DataString;
  101. strStream.Free;
  102. end;
  103. procedure LoadToolbarImage(AImages: TImageList; AIndex: integer; AFilename: string);
  104. var
  105. iconImg: TBGRALazPaintImage;
  106. iconFlat: array of TBGRABitmap;
  107. bmpArray: array of TCustomBitmap;
  108. i: Integer;
  109. begin
  110. iconImg := TBGRALazPaintImage.Create;
  111. iconImg.LoadFromResource(AFilename);
  112. if AImages.ResolutionCount = 0 then
  113. AImages.RegisterResolutions([AImages.Width]);
  114. setlength(iconFlat, AImages.ResolutionCount);
  115. setlength(bmpArray, length(iconFlat));
  116. for i := 0 to high(iconFlat) do
  117. begin
  118. iconImg.Resample(AImages.ResolutionByIndex[i].Width,
  119. AImages.ResolutionByIndex[i].Height,
  120. rmFineResample,rfBestQuality);
  121. iconFlat[i] := TBGRABitmap.Create(iconImg.Width, iconImg.Height);
  122. iconImg.Draw(iconFlat[i],0,0);
  123. bmpArray[i] := iconFlat[i].Bitmap;
  124. end;
  125. iconImg.Free;
  126. if AImages.Count < AIndex then
  127. begin
  128. for i := 0 to high(iconFlat) do
  129. AImages.Replace(AIndex, bmpArray[i],nil, false);
  130. end
  131. else
  132. AImages.AddMultipleResolutions(bmpArray);
  133. for i := 0 to high(iconFlat) do
  134. iconFlat[i].Free;
  135. end;
  136. function AddToolbarLabel(AToolbar: TToolbar; ACaption: string;
  137. AExistingContainer: TCustomControl): TLabel;
  138. var
  139. lbl: TLabel;
  140. begin
  141. lbl := TLabel.Create(AToolbar);
  142. lbl.AutoSize:= false;
  143. lbl.Alignment:= taCenter;
  144. lbl.Layout := tlCenter;
  145. lbl.Caption := ACaption;
  146. lbl.Width := AExistingContainer.Canvas.TextWidth(lbl.Caption)+(AToolbar.ButtonHeight div 4);
  147. lbl.Height := AToolbar.ButtonHeight;
  148. AddToolbarControl(AToolbar, lbl);
  149. result := lbl;
  150. end;
  151. function AddToolbarCheckButton(AToolbar: TToolbar; ACaption: string; AImageIndex: integer;
  152. AOnClick: TNotifyEvent; ADown: boolean; AGrouped: boolean = true; ATag: PtrInt = 0): TToolButton;
  153. var
  154. btn: TToolButton;
  155. begin
  156. btn := TToolButton.Create(AToolbar);
  157. btn.Style := tbsCheck;
  158. btn.Caption := ACaption;
  159. btn.Hint := ACaption;
  160. btn.ImageIndex := AImageIndex;
  161. btn.Down:= ADown;
  162. btn.Grouped := AGrouped;
  163. btn.OnClick:= AOnClick;
  164. btn.Tag:= ATag;
  165. AddToolbarControl(AToolbar, btn);
  166. result := btn;
  167. end;
  168. function AddToolbarButton(AToolbar: TToolbar; ACaption: string;
  169. AImageIndex: integer; AOnClick: TNotifyEvent; ATag: PtrInt): TToolButton;
  170. var
  171. btn: TToolButton;
  172. begin
  173. btn := TToolButton.Create(AToolbar);
  174. btn.Style := tbsButton;
  175. btn.Caption := ACaption;
  176. btn.Hint := ACaption;
  177. btn.ImageIndex := AImageIndex;
  178. btn.OnClick:= AOnClick;
  179. btn.Tag:= ATag;
  180. AddToolbarControl(AToolbar, btn);
  181. result := btn;
  182. end;
  183. function AddToolbarUpDown(AToolbar: TToolbar; ACaption: string; AMin,
  184. AMax, AValue: Integer; AOnChange: TTrackBarUpDownChangeEvent): TBCTrackbarUpdown;
  185. begin
  186. result := TBCTrackbarUpdown.Create(AToolbar);
  187. result.Width := AToolbar.ButtonWidth*2;
  188. result.Height:= AToolbar.ButtonHeight;
  189. result.MinValue := AMin;
  190. result.MaxValue := AMax;
  191. result.Value := AValue;
  192. result.Hint := ACaption;
  193. result.ShowHint:= true;
  194. result.OnChange:= AOnChange;
  195. AddToolbarControl(AToolbar, result);
  196. end;
  197. function AddToolbarTextBox(AToolbar: TToolbar; ACaption: string; AText: string;
  198. AOnChange: TNotifyEvent): TEdit;
  199. begin
  200. result := TEdit.Create(AToolbar);
  201. result.Width := AToolbar.ButtonWidth*5;
  202. result.Font.Height := round(AToolbar.Height*0.5);
  203. result.Hint := ACaption;
  204. result.ShowHint:= true;
  205. result.Text := AText;
  206. result.OnChange:= AOnChange;
  207. AddToolbarControl(AToolbar, result);
  208. end;
  209. procedure AddToolbarControl(AToolbar: TToolbar; AControl: TControl);
  210. var
  211. x,y, i: Integer;
  212. begin
  213. x := AToolbar.Indent;
  214. y := 0;
  215. for i := 0 to AToolbar.ControlCount-1 do
  216. begin
  217. if AToolbar.Controls[i] is TToolButton then
  218. begin
  219. inc(x, AToolbar.ButtonWidth);
  220. if TToolButton(AToolbar.Controls[i]).Wrap then
  221. begin
  222. x := 0;
  223. inc(y, AToolbar.ButtonHeight);
  224. end;
  225. end
  226. else inc(x, AToolbar.Controls[i].Width);
  227. end;
  228. AControl.Left := x;
  229. AControl.Top := y;
  230. AControl.Parent := AToolbar;
  231. end;
  232. procedure EnableDisableToolButtons(AButtons: array of TToolButton; AEnabled: boolean);
  233. var
  234. i: Integer;
  235. begin
  236. for i := 0 to high(AButtons) do
  237. AButtons[i].Enabled:= AEnabled;
  238. end;
  239. procedure ShowAppendToolButtons(AButtons: array of TControl);
  240. var btnCount,x,y, i: integer;
  241. toolbar: TToolBar;
  242. begin
  243. if length(AButtons) = 0 then exit;
  244. toolbar := AButtons[0].Parent as TToolBar;
  245. x := 0;
  246. y := 0;
  247. btnCount := 0;
  248. for i := 0 to toolbar.ControlCount-1 do
  249. if toolbar.Controls[i].Visible then
  250. begin
  251. x := max(toolbar.Controls[i].Left+toolbar.Controls[i].Width,x);
  252. y := max(toolbar.Controls[i].Top+toolbar.Controls[i].Height,y);
  253. inc(btnCount);
  254. end;
  255. toolbar.BeginUpdate;
  256. x:= max(btnCount * toolbar.ButtonWidth,x);
  257. for i := 0 to high(AButtons) do
  258. begin
  259. AButtons[i].Left := x;
  260. AButtons[i].Visible:= true;
  261. x += toolbar.ButtonWidth;
  262. end;
  263. toolbar.EndUpdate;
  264. end;
  265. end.