upreviewdialog.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit UPreviewDialog;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  7. ExtCtrls, StdCtrls, BGRAVirtualScreen, UImagePreview, LazPaintType;
  8. type
  9. { TFPreviewDialog }
  10. TFPreviewDialog = class(TForm)
  11. LStatus: TLabel;
  12. Panel1: TPanel;
  13. vsPreview: TBGRAVirtualScreen;
  14. procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
  15. procedure FormCreate(Sender: TObject);
  16. procedure FormDestroy(Sender: TObject);
  17. procedure FormShow(Sender: TObject);
  18. private
  19. FPreview: TImagePreview;
  20. function GetDuplicateSourceIndex: integer;
  21. function GetEntryCount: integer;
  22. function GetFilename: string;
  23. function GetLazPaintInstance: TLazPaintCustomInstance;
  24. procedure SetDuplicateSourceIndex(AValue: integer);
  25. procedure SetFilename(AValue: string);
  26. procedure PreviewValidate(Sender: TObject);
  27. procedure PreviewEscape(Sender: TObject);
  28. procedure SetLazPaintInstance(AValue: TLazPaintCustomInstance);
  29. public
  30. function GetPreviewBitmap: TImageEntry;
  31. property Filename: string read GetFilename write SetFilename;
  32. property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance;
  33. property EntryCount: integer read GetEntryCount;
  34. property DuplicateSourceIndex: integer read GetDuplicateSourceIndex write SetDuplicateSourceIndex;
  35. end;
  36. var
  37. FPreviewDialog: TFPreviewDialog;
  38. function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string = '';
  39. ASkipIfSingleImage: boolean = false; ADuplicateSourceIndex: integer = -1): TImageEntry;
  40. implementation
  41. function ShowPreviewDialog(AInstance: TLazPaintCustomInstance; AFilename: string; ATitle: string;
  42. ASkipIfSingleImage: boolean; ADuplicateSourceIndex: integer): TImageEntry;
  43. var f: TFPreviewDialog;
  44. begin
  45. f := TFPreviewDialog.Create(nil);
  46. f.DuplicateSourceIndex := ADuplicateSourceIndex;
  47. f.LazPaintInstance := AInstance;
  48. if ATitle <> '' then f.Caption := ATitle;
  49. f.Filename:= AFilename;
  50. if ASkipIfSingleImage and (f.EntryCount = 1) then
  51. begin
  52. result := f.GetPreviewBitmap;
  53. end else
  54. begin
  55. if f.ShowModal = mrOk then
  56. result := f.GetPreviewBitmap
  57. else
  58. result := TImageEntry.Empty;
  59. end;
  60. f.Free;
  61. end;
  62. { TFPreviewDialog }
  63. procedure TFPreviewDialog.FormCreate(Sender: TObject);
  64. begin
  65. FPreview := TImagePreview.Create(vsPreview, LStatus, false);
  66. FPreview.OnValidate:= @PreviewValidate;
  67. FPreview.OnEscape:= @PreviewEscape;
  68. end;
  69. procedure TFPreviewDialog.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  70. var r:TRect;
  71. begin
  72. LazPaintInstance.Config.SetDefaultPreviewDialogMaximized(self.WindowState = wsMaximized);
  73. if self.WindowState = wsNormal then
  74. begin
  75. r.left := Left;
  76. r.top := Top;
  77. r.right := r.left+ClientWidth;
  78. r.Bottom := r.top+ClientHeight;
  79. LazPaintInstance.Config.SetDefaultPreviewDialogPosition(r);
  80. end
  81. else
  82. LazPaintInstance.Config.SetDefaultPreviewDialogPosition(TRect.Empty);
  83. end;
  84. procedure TFPreviewDialog.FormDestroy(Sender: TObject);
  85. begin
  86. FPreview.Free;
  87. end;
  88. procedure TFPreviewDialog.FormShow(Sender: TObject);
  89. var
  90. r: TRect;
  91. begin
  92. if Assigned(LazPaintInstance) then
  93. begin
  94. if LazPaintInstance.Config.DefaultPreviewDialogMaximized then self.WindowState := wsMaximized
  95. else
  96. begin
  97. self.WindowState := wsNormal;
  98. r := LazPaintInstance.Config.DefaultPreviewDialogPosition;
  99. if (r.right > r.left) and (r.bottom > r.top) then
  100. begin
  101. self.Position := poDesigned;
  102. self.Left := r.Left;
  103. self.Top := r.Top;
  104. self.ClientWidth := r.right-r.left;
  105. self.ClientHeight := r.bottom-r.top
  106. end;
  107. end;
  108. end;
  109. end;
  110. function TFPreviewDialog.GetFilename: string;
  111. begin
  112. result := FPreview.Filename;
  113. end;
  114. function TFPreviewDialog.GetEntryCount: integer;
  115. begin
  116. if Assigned(FPreview) then
  117. result := FPreview.EntryCount
  118. else
  119. result := 0;
  120. end;
  121. function TFPreviewDialog.GetDuplicateSourceIndex: integer;
  122. begin
  123. result := FPreview.DuplicateEntrySourceIndex;
  124. end;
  125. function TFPreviewDialog.GetLazPaintInstance: TLazPaintCustomInstance;
  126. begin
  127. result := FPreview.LazPaintInstance;
  128. end;
  129. procedure TFPreviewDialog.SetDuplicateSourceIndex(AValue: integer);
  130. begin
  131. FPreview.DuplicateEntrySourceIndex:= AValue;
  132. end;
  133. procedure TFPreviewDialog.SetFilename(AValue: string);
  134. begin
  135. FPreview.Filename := AValue;
  136. end;
  137. procedure TFPreviewDialog.PreviewValidate(Sender: TObject);
  138. begin
  139. ModalResult := mrOk;
  140. end;
  141. procedure TFPreviewDialog.PreviewEscape(Sender: TObject);
  142. begin
  143. ModalResult := mrCancel;
  144. end;
  145. procedure TFPreviewDialog.SetLazPaintInstance(AValue: TLazPaintCustomInstance);
  146. begin
  147. FPreview.LazPaintInstance := AValue;
  148. end;
  149. function TFPreviewDialog.GetPreviewBitmap: TImageEntry;
  150. begin
  151. result := FPreview.GetPreviewBitmap;
  152. end;
  153. {$R *.lfm}
  154. end.