2
// This unit is part of the GLScene Engine https://github.com/glscene
34
{$IFDEF LINUX}, Process {$ENDIF};
37
TLayouts_form = class(TForm)
43
open_image_button: TBitBtn;
46
OpenDialog1: TOpenDialog;
47
SaveDialog1: TSaveDialog;
48
delete_item_button: TBitBtn;
56
height_edit: TSpinEdit;
57
width_edit: TSpinEdit;
60
elements_grid: TStringGrid;
64
ScrollBox1: TScrollBox;
70
GLGuiLayout1: TGLGuiLayout;
71
procedure open_image_buttonClick(Sender: TObject);
72
procedure open_buttonClick(Sender: TObject);
73
procedure save_buttonClick(Sender: TObject);
74
procedure FormCreate(Sender: TObject);
75
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
77
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
78
Shift: TShiftState; X, Y: Integer);
79
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
80
Shift: TShiftState; X, Y: Integer);
81
procedure add_buttonClick(Sender: TObject);
82
procedure delete_item_buttonClick(Sender: TObject);
83
procedure items_listClick(Sender: TObject);
84
procedure name_editExit(Sender: TObject);
85
procedure name_editKeyPress(Sender: TObject; var Key: Char);
86
procedure elements_gridClick(Sender: TObject);
87
procedure left_editChange(Sender: TObject);
88
procedure top_editChange(Sender: TObject);
89
procedure width_editChange(Sender: TObject);
90
procedure height_editChange(Sender: TObject);
91
procedure BitBtn4Click(Sender: TObject);
92
procedure BitBtn6Click(Sender: TObject);
93
procedure elements_gridDblClick(Sender: TObject);
97
procedure DrawCurrentElement;
98
procedure RefreshComponentBox;
99
function GetEnabledSpins: Boolean;
100
procedure SetEnabledSpins(Value: Boolean);
103
procedure Execute(AGUILayout: TGLGuiLayout);
104
property EnabledSpins: Boolean read GetEnabledSpins write SetEnabledSpins;
107
function GUILayoutEditorForm: TLayouts_form;
108
procedure ReleaseGUILayoutEditor;
110
//--------------------------------------------------------------------------
112
//--------------------------------------------------------------------------
115
vGUILayoutEditor: Tlayouts_form;
116
rect_point1, rect_point2: TPoint;
118
sorted_elements: array[0..9] of TGLGuiElement;
120
function GUILayoutEditorForm: Tlayouts_form;
122
if not Assigned(vGUILayoutEditor) then
123
vGUILayoutEditor := Tlayouts_form.Create(nil);
124
Result := vGUILayoutEditor;
127
procedure ReleaseGUILayoutEditor;
129
if Assigned(vGUILayoutEditor) then
131
vGUILayoutEditor.Free;
132
vGUILayoutEditor := nil;
136
function SnapPoint(X, Y: integer): TPoint;
138
Result.X := (X div zoom) * zoom;
139
Result.Y := (Y div zoom) * zoom;
142
procedure TLayouts_form.SetEnabledSpins(Value: Boolean);
144
left_edit.Enabled := Value;
145
top_edit.Enabled := Value;
146
height_edit.Enabled := Value;
147
width_edit.Enabled := Value;
150
procedure TLayouts_form.SyncImages;
152
Image2.Width := Image1.Width;
153
Image2.Height := Image1.Height;
154
Image2.Picture.Bitmap.Width := Image1.Width;
155
Image2.Picture.Bitmap.Height := Image1.Height;
156
PaintBox1.Width := Image1.Width;
157
PaintBox1.Height := Image1.Height;
158
ScrollBox1.HorzScrollBar.Range := Image1.Width;
159
ScrollBox1.VertScrollBar.Range := Image1.Height;
160
PaintBox1.Canvas.CopyRect(PaintBox1.Canvas.ClipRect,
161
Image1.Canvas, Image1.Canvas.ClipRect);
164
procedure TLayouts_form.DrawCurrentElement;
166
with elements_grid do
167
if (items_list.ItemIndex > -1) and (sorted_elements[Col + 3 * Row] <> nil)
169
with sorted_elements[Col + 3 * Row], Image2.Canvas do
172
Rectangle(Rect(zoom * Round(TopLeft.X), zoom * Round(TopLeft.Y),
173
zoom * Round(BottomRight.X), zoom * Round(BottomRight.Y)));
177
procedure TLayouts_form.open_image_buttonClick(Sender: TObject);
182
if OpenPictureDialog(LFileName) then
184
Image1.Stretch := false;
185
Image1.AutoSize := true;
186
Image1.Picture.LoadFromFile(LFileName);
187
Image1.AutoSize := false;
188
Image1.Stretch := true;
189
Image2.Canvas.Pen.Width := 1;
193
Application.MessageBox('Unable to load picture!', 'Error', MB_ICONERROR);
197
procedure TLayouts_form.RefreshComponentBox;
202
for i := 0 to GLGuiLayout1.GuiComponents.Count - 1 do
203
items_list.Items.Add(GLGuiLayout1.GuiComponents[i].Name);
204
items_list.ItemIndex := 0;
205
items_listClick(nil);
208
procedure TLayouts_form.open_buttonClick(Sender: TObject);
211
case Application.MessageBox('Save layout?',
212
'Question', MB_ICONQUESTION + MB_YESNOCANCEL) of
213
mrYes: save_buttonClick(nil);
217
if OpenDialog1.Execute then
220
GLGuiLayout1.LoadFromFile(OpenDialog1.FileName);
223
Application.MessageBox('Unable to load layout!', 'Error', MB_ICONERROR);
227
procedure TLayouts_form.save_buttonClick(Sender: TObject);
229
if SaveDialog1.FileName = '' then
230
if SaveDialog1.Execute then
231
GLGuiLayout1.SaveToFile(SaveDialog1.FileName)
234
GLGuiLayout1.SaveToFile(SaveDialog1.FileName);
237
procedure TLayouts_form.FormCreate(Sender: TObject);
240
Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
241
Image2.Canvas.Pen.Color := clAqua;
244
function TLayouts_form.GetEnabledSpins: Boolean;
246
Result := left_edit.Enabled;
249
procedure TLayouts_form.Image1MouseMove(Sender: TObject;
250
Shift: TShiftState; X, Y: Integer);
252
x_label.Caption := 'X: ' + IntToStr(X div zoom);
253
y_label.Caption := 'Y: ' + IntToStr(Y div zoom);
255
if not (ssRight in Shift) then
257
if (X < 0) or (Y < 0) or (X > Image2.Width) or (Y > Image2.Height) then
260
if rect_point1.X < 0 then
261
rect_point1 := SnapPoint(X, Y)
263
with Image2.Canvas do
266
rect_point2 := SnapPoint(X, Y);
267
Rectangle(rect_point1.x, rect_point1.y, X, Y);
270
if items_list.ItemIndex = -1 then
272
if rect_point1.X < rect_point2.X then
273
left_edit.Value := rect_point1.X div zoom
275
left_edit.Value := rect_point2.X div zoom;
276
if rect_point1.Y > rect_point2.Y then
277
top_edit.Value := rect_point2.Y div zoom
279
top_edit.Value := rect_point1.Y div zoom;
281
width_edit.Value := Abs(rect_point2.X - rect_point1.X) div zoom;
282
height_edit.Value := Abs(rect_point2.Y - rect_point1.Y) div zoom;
285
procedure TLayouts_form.Image1MouseDown(Sender: TObject;
286
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
288
if not (ssRight in Shift) then
290
with Image2.Canvas do
293
rect_point1 := SnapPoint(X, Y);
294
rect_point2 := rect_point1;
298
procedure TLayouts_form.Image1MouseUp(Sender: TObject;
299
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
301
if not (ssRight in Shift) then
306
procedure TLayouts_form.add_buttonClick(Sender: TObject);
310
with TGLGuiComponent(GLGuiLayout1.GuiComponents.Add) do
312
Name := InputBox('Question', 'Name of new region:', '');
318
items_list.Items.Add(Name);
319
items_list.ItemIndex := items_list.Count - 1;
322
sorted_elements[i] := TGLGuiElement(Elements.Add);
323
sorted_elements[i].Align := TGUIAlignments(i);
325
name_edit.Text := Name;
329
procedure TLayouts_form.delete_item_buttonClick(Sender: TObject);
331
if items_list.ItemIndex = -1 then
333
GLGuiLayout1.GuiComponents.Delete(items_list.ItemIndex);
335
items_list.ClearSelection;
336
if items_list.ItemIndex > -1 then
337
name_edit.Text := GLGuiLayout1.GuiComponents[items_list.ItemIndex].Name
339
name_edit.Text := '';
342
procedure TLayouts_form.items_listClick(Sender: TObject);
346
if items_list.ItemIndex = -1 then
349
name_edit.Text := GLGuiLayout1.GuiComponents[
350
items_list.ItemIndex].Name;
351
elements_grid.Row := 0;
352
elements_grid.Col := 0;
353
for i := 0 to Length(sorted_elements) - 1 do
355
sorted_elements[i] := nil;
357
elements_grid.Cells[i mod 3, i div 3] := #32;
360
with GLGuiLayout1.GuiComponents[items_list.ItemIndex] do
361
for i := 0 to Elements.Count - 1 do
363
p := Integer(Elements[i].Align);
364
sorted_elements[p] := Elements[i];
365
elements_grid.Cells[p mod 3, p div 3] := '+';
367
elements_gridClick(nil);
370
procedure TLayouts_form.name_editExit(Sender: TObject);
372
if items_list.ItemIndex > -1 then
374
GLGuiLayout1.GuiComponents[items_list.
375
ItemIndex].Name := name_edit.Text;
376
items_list.Items[items_list.ItemIndex] := name_edit.Text;
377
items_listClick(nil);
381
procedure TLayouts_form.name_editKeyPress(Sender: TObject; var Key: Char);
387
procedure TLayouts_form.elements_gridClick(Sender: TObject);
389
with elements_grid do
390
if (items_list.ItemIndex > -1) and (sorted_elements[Col + 3 * Row] <> nil)
392
with sorted_elements[Col + 3 * Row] do
394
EnabledSpins := True;
395
left_edit.Value := Round(TopLeft.X);
396
top_edit.Value := Round(TopLeft.Y);
397
width_edit.Value := Round(BottomRight.X - TopLeft.X);
398
height_edit.Value := Round(BottomRight.Y - TopLeft.Y);
403
EnabledSpins := False;
404
Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
408
procedure TLayouts_form.elements_gridDblClick(Sender: TObject);
413
if items_list.ItemIndex > -1 then
414
with elements_grid do
416
if Assigned(sorted_elements[Col + 3 * Row]) then
418
I := GLGuiLayout1.GuiComponents[items_list.ItemIndex].Elements.IndexOf(sorted_elements[Col + 3 * Row]);
419
GLGuiLayout1.GuiComponents[items_list.ItemIndex].Elements.Delete(I);
420
sorted_elements[Col + 3 * Row] := nil;
421
Cells[Col, Row] := #32;
422
elements_gridClick(nil);
425
E := TGLGuiElement(GLGuiLayout1.GuiComponents[items_list.ItemIndex].Elements.Add);
426
E.Align := TGUIAlignments(Col + 3 * Row);
427
sorted_elements[Col + 3 * Row] := E;
428
Cells[Col, Row] := '+';
429
elements_gridClick(nil);
434
procedure TLayouts_form.left_editChange(Sender: TObject);
436
if (items_list.ItemIndex = -1) or not EnabledSpins then
438
if left_edit.Value + width_edit.Value > Image2.Width div zoom then
439
left_edit.Value := (Image2.Width div zoom) - width_edit.Value;
440
if left_edit.Value < 0 then
441
left_edit.Value := 0;
442
with elements_grid do
443
sorted_elements[Col + 3 * Row].TopLeft.X := left_edit.Value;
447
procedure TLayouts_form.top_editChange(Sender: TObject);
449
if (items_list.ItemIndex = -1) or not EnabledSpins then
451
if top_edit.Value + height_edit.Value > Image2.Height div zoom then
452
top_edit.Value := (Image2.Height div zoom) - height_edit.Value;
453
if top_edit.Value < 0 then
455
with elements_grid do
456
sorted_elements[Col + 3 * Row].TopLeft.Y := top_edit.Value;
460
procedure TLayouts_form.width_editChange(Sender: TObject);
462
if (items_list.ItemIndex = -1) or not EnabledSpins then
464
with elements_grid do
465
sorted_elements[Col + 3 * Row].BottomRight.X := left_edit.Value +
467
if left_edit.Value + width_edit.Value > Image2.Width div zoom then
468
width_edit.Value := (Image2.Width div zoom) - left_edit.Value;
469
if width_edit.Value < 0 then
470
width_edit.Value := 0;
474
procedure TLayouts_form.height_editChange(Sender: TObject);
476
if (items_list.ItemIndex = -1) or not EnabledSpins then
478
with elements_grid do
479
sorted_elements[Col + 3 * Row].BottomRight.Y := top_edit.Value +
481
if top_edit.Value + height_edit.Value > Image2.Height div zoom then
482
height_edit.Value := (Image2.Height div zoom) - top_edit.Value;
483
if height_edit.Value < 0 then
484
height_edit.Value := 0;
488
procedure TLayouts_form.BitBtn4Click(Sender: TObject);
490
if zoom + TBitBtn(Sender).Tag < 1 then
492
Image1.Width := (Image1.Width div zoom) * (zoom + TBitBtn(Sender).Tag);
493
Image1.Height := (Image1.Height div zoom) * (zoom + TBitBtn(Sender).Tag);
495
zoom := zoom + TBitBtn(Sender).Tag;
496
Image2.Canvas.Pen.Width := zoom;
497
elements_gridClick(nil);
500
procedure TLayouts_form.BitBtn6Click(Sender: TObject);
507
ShellExecuteW(0, 'open', 'mspaint', '', '', SW_SHOW)
510
lProcess := TProcess.Create(nil);
511
lProcess.CommandLine := 'gimp';
520
procedure TLayouts_form.Execute(AGUILayout: TGLGuiLayout);
522
GLGuiLayout1.Assign(AGUILayout);
523
Image1.Stretch := false;
524
Image1.AutoSize := true;
525
Image1.Picture.Assign(AGUILayout.Material.GetActualPrimaryTexture.Image.GetBitmap32.Create32BitsBitmap);
526
Image1.AutoSize := false;
527
Image1.Stretch := true;
528
Image2.Canvas.Pen.Width := 1;
533
if ShowModal = mrOk then
534
AGUILayout.Assign(GLGuiLayout1);
539
{$I FGUILayoutEditor.lrs}
543
ReleaseGUILayoutEditor;