mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-25 09:40:08 +02:00
DockedFormEditor: Changed logic of moving of control - only free sides can be moved - a docked side stays docked
git-svn-id: trunk@64587 -
This commit is contained in:
parent
3b018cd3fd
commit
54dc02b128
@ -74,7 +74,7 @@ type
|
|||||||
procedure PopupMenuAdapt(Sender: TObject);
|
procedure PopupMenuAdapt(Sender: TObject);
|
||||||
procedure SelectedAdaptAnchors;
|
procedure SelectedAdaptAnchors;
|
||||||
procedure SelectedAdaptBorder;
|
procedure SelectedAdaptBorder;
|
||||||
procedure SelectedAdaptBounds(var ALeft, ATop, AWidth, AHeight: Integer);
|
procedure SelectedAdaptBounds(RemoveAnchorSides: Boolean);
|
||||||
procedure SelectedAnchorNewTarget(AKind: TAnchorKind);
|
procedure SelectedAnchorNewTarget(AKind: TAnchorKind);
|
||||||
procedure SetSelectedControl(AValue: TAnchorControl);
|
procedure SetSelectedControl(AValue: TAnchorControl);
|
||||||
public
|
public
|
||||||
@ -139,8 +139,6 @@ end;
|
|||||||
|
|
||||||
procedure TAnchorDesigner.AnchorControlMouseMove(Sender: TObject;
|
procedure TAnchorDesigner.AnchorControlMouseMove(Sender: TObject;
|
||||||
Shift: TShiftState; X, Y: Integer);
|
Shift: TShiftState; X, Y: Integer);
|
||||||
var
|
|
||||||
LMouseOffset: TPoint;
|
|
||||||
begin
|
begin
|
||||||
if not State.IsMouseDown then Exit;
|
if not State.IsMouseDown then Exit;
|
||||||
if not (Shift = [ssLeft]) and not (Shift = [ssCtrl, ssLeft]) then Exit;
|
if not (Shift = [ssLeft]) and not (Shift = [ssCtrl, ssLeft]) then Exit;
|
||||||
@ -155,8 +153,16 @@ begin
|
|||||||
FPreviousControl.AssignAnchors(FSelectedControl);
|
FPreviousControl.AssignAnchors(FSelectedControl);
|
||||||
if not State.IsBordering then
|
if not State.IsBordering then
|
||||||
begin
|
begin
|
||||||
FSelectedControl.RemoveAnchorSides;
|
|
||||||
FBackGround.Invalidate;
|
FBackGround.Invalidate;
|
||||||
|
FState := FState + [asAnchorTop, asAnchorLeft, asAnchorRight, asAnchorBottom];
|
||||||
|
if (akTop in FPreviousControl.Anchors) and Assigned(FPreviousControl.AnchorSide[akTop].Control) then
|
||||||
|
FState := FState - [asAnchorTop];
|
||||||
|
if (akLeft in FPreviousControl.Anchors) and Assigned(FPreviousControl.AnchorSide[akLeft].Control) then
|
||||||
|
FState := FState - [asAnchorLeft];
|
||||||
|
if (akRight in FPreviousControl.Anchors) and Assigned(FPreviousControl.AnchorSide[akRight].Control) then
|
||||||
|
FState := FState - [asAnchorRight];
|
||||||
|
if (akBottom in FPreviousControl.Anchors) and Assigned(FPreviousControl.AnchorSide[akBottom].Control) then
|
||||||
|
FState := FState - [asAnchorBottom];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -165,13 +171,8 @@ begin
|
|||||||
// borderspacing
|
// borderspacing
|
||||||
SelectedAdaptBorder;
|
SelectedAdaptBorder;
|
||||||
end else begin
|
end else begin
|
||||||
LMouseOffset := MouseOffset;
|
|
||||||
// sizing
|
// sizing
|
||||||
FSelectedControl.SetBounds(
|
SelectedAdaptBounds(False);
|
||||||
FPreviousControl.Left + LMouseOffset.x,
|
|
||||||
FPreviousControl.Top + LMouseOffset.y,
|
|
||||||
FPreviousControl.Width,
|
|
||||||
FPreviousControl.Height);
|
|
||||||
end;
|
end;
|
||||||
AdjustGrips;
|
AdjustGrips;
|
||||||
end;
|
end;
|
||||||
@ -238,9 +239,8 @@ procedure TAnchorDesigner.AnchorGripMouseMove(Sender: TObject;
|
|||||||
var
|
var
|
||||||
LAnchoring: Boolean;
|
LAnchoring: Boolean;
|
||||||
LMousePos: TPoint;
|
LMousePos: TPoint;
|
||||||
LRect: TRect;
|
|
||||||
LTargetControl: TAnchorControl;
|
LTargetControl: TAnchorControl;
|
||||||
LLeft, LWidth, LTop, LHeight: Integer;
|
LRect: TRect;
|
||||||
begin
|
begin
|
||||||
if not State.IsMouseDown then Exit;
|
if not State.IsMouseDown then Exit;
|
||||||
if not (Shift = [ssLeft]) and not (Shift = [ssCtrl, ssLeft]) then Exit;
|
if not (Shift = [ssLeft]) and not (Shift = [ssCtrl, ssLeft]) then Exit;
|
||||||
@ -286,22 +286,15 @@ begin
|
|||||||
if State.IsAnchoringVert and LAnchoring then
|
if State.IsAnchoringVert and LAnchoring then
|
||||||
LAnchoring := FindAnchorVertSide(LRect, LMousePos, FTargetVertSide);
|
LAnchoring := FindAnchorVertSide(LRect, LMousePos, FTargetVertSide);
|
||||||
|
|
||||||
LRect := FPreviousControl.BoundsRect;
|
|
||||||
LLeft := LRect.Left;
|
|
||||||
LWidth := LRect.Width;
|
|
||||||
LTop := LRect.Top;
|
|
||||||
LHeight := LRect.Height;
|
|
||||||
|
|
||||||
if LAnchoring then
|
if LAnchoring then
|
||||||
begin
|
begin
|
||||||
// use Anchors
|
// use Anchors
|
||||||
FSelectedControl.SetBounds(LLeft, LTop, LWidth, LHeight);
|
FSelectedControl.AssignBounds(FPreviousControl);
|
||||||
SelectedAdaptAnchors;
|
SelectedAdaptAnchors;
|
||||||
FTargetControl.Color := DockedOptions.AnchorTargetColor;
|
FTargetControl.Color := DockedOptions.AnchorTargetColor;
|
||||||
end else begin
|
end else begin
|
||||||
// size control
|
// size control
|
||||||
SelectedAdaptBounds(LLeft, LTop, LWidth, LHeight);
|
SelectedAdaptBounds(True);
|
||||||
FSelectedControl.SetBounds(LLeft, LTop, LWidth, LHeight);
|
|
||||||
FState := [asMouseDown, asMoving];
|
FState := [asMouseDown, asMoving];
|
||||||
FTargetControl.Color := DockedOptions.AnchorControlColor;
|
FTargetControl.Color := DockedOptions.AnchorControlColor;
|
||||||
FTargetControl := nil;
|
FTargetControl := nil;
|
||||||
@ -780,57 +773,57 @@ begin
|
|||||||
FSelectedControl.BorderSpacing.Bottom := Max(0, LBottomBorder);
|
FSelectedControl.BorderSpacing.Bottom := Max(0, LBottomBorder);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TAnchorDesigner.SelectedAdaptBounds(var ALeft, ATop, AWidth,
|
procedure TAnchorDesigner.SelectedAdaptBounds(RemoveAnchorSides: Boolean);
|
||||||
AHeight: Integer);
|
|
||||||
var
|
var
|
||||||
LMouseOffset: TPoint;
|
LMouseOffset: TPoint;
|
||||||
|
LRect: TRect;
|
||||||
begin
|
begin
|
||||||
LMouseOffset := MouseOffset;
|
LMouseOffset := MouseOffset;
|
||||||
|
LRect := FPreviousControl.BoundsRect;
|
||||||
|
|
||||||
if State.IsAnchoringHorz then
|
if State.IsAnchoringLeft then
|
||||||
begin
|
begin
|
||||||
if State.IsAnchoringLeft then
|
LRect.Left := LRect.Left + LMouseOffset.x;
|
||||||
begin
|
if RemoveAnchorSides then
|
||||||
ALeft := ALeft + LMouseOffset.x;
|
|
||||||
AWidth := AWidth - LMouseOffset.x;
|
|
||||||
FSelectedControl.RemoveAnchorSide(akLeft);
|
FSelectedControl.RemoveAnchorSide(akLeft);
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akRight);
|
end else
|
||||||
end else begin
|
if RemoveAnchorSides then
|
||||||
AWidth := AWidth + LMouseOffset.x;
|
|
||||||
FSelectedControl.RemoveAnchorSide(akRight);
|
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akLeft);
|
FSelectedControl.AssignAnchor(FPreviousControl, akLeft);
|
||||||
end;
|
if State.IsAnchoringRight then
|
||||||
end else begin
|
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akLeft);
|
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akRight);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if State.IsAnchoringVert then
|
|
||||||
begin
|
begin
|
||||||
if State.IsAnchoringTop then
|
LRect.Right := LRect.Right + LMouseOffset.x;
|
||||||
begin
|
if RemoveAnchorSides then
|
||||||
ATop := ATop + LMouseOffset.y;
|
FSelectedControl.RemoveAnchorSide(akRight);
|
||||||
AHeight := AHeight - LMouseOffset.y;
|
end else
|
||||||
|
if RemoveAnchorSides then
|
||||||
|
FSelectedControl.AssignAnchor(FPreviousControl, akRight);
|
||||||
|
if State.IsAnchoringTop then
|
||||||
|
begin
|
||||||
|
LRect.Top := LRect.Top + LMouseOffset.y;
|
||||||
|
if RemoveAnchorSides then
|
||||||
FSelectedControl.RemoveAnchorSide(akTop);
|
FSelectedControl.RemoveAnchorSide(akTop);
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akBottom);
|
end else
|
||||||
end else begin
|
if RemoveAnchorSides then
|
||||||
AHeight := AHeight + LMouseOffset.y;
|
|
||||||
FSelectedControl.RemoveAnchorSide(akBottom);
|
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akTop);
|
FSelectedControl.AssignAnchor(FPreviousControl, akTop);
|
||||||
end;
|
if State.IsAnchoringBottom then
|
||||||
end else begin
|
begin
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akTop);
|
LRect.Bottom := LRect.Bottom + LMouseOffset.y;
|
||||||
FSelectedControl.AssignAnchor(FPreviousControl, akBottom);
|
if RemoveAnchorSides then
|
||||||
end;
|
FSelectedControl.RemoveAnchorSide(akBottom);
|
||||||
|
end else
|
||||||
|
if RemoveAnchorSides then
|
||||||
|
FSelectedControl.AssignAnchor(FPreviousControl, akBottom);
|
||||||
|
|
||||||
if FSelectedControl.RootControl.Constraints.MaxWidth > 0 then
|
if FSelectedControl.RootControl.Constraints.MaxWidth > 0 then
|
||||||
AWidth := Min(AWidth, FSelectedControl.RootControl.Constraints.MaxWidth);
|
LRect.Width := Min(LRect.Width, FSelectedControl.RootControl.Constraints.MaxWidth);
|
||||||
if FSelectedControl.RootControl.Constraints.MinWidth > 0 then
|
if FSelectedControl.RootControl.Constraints.MinWidth > 0 then
|
||||||
AWidth := Max(AWidth, FSelectedControl.RootControl.Constraints.MinWidth);
|
LRect.Width := Max(LRect.Width, FSelectedControl.RootControl.Constraints.MinWidth);
|
||||||
if FSelectedControl.RootControl.Constraints.MaxHeight > 0 then
|
if FSelectedControl.RootControl.Constraints.MaxHeight > 0 then
|
||||||
AHeight := Min(AHeight, FSelectedControl.RootControl.Constraints.MaxHeight);
|
LRect.Height := Min(LRect.Height, FSelectedControl.RootControl.Constraints.MaxHeight);
|
||||||
if FSelectedControl.RootControl.Constraints.MinHeight > 0 then
|
if FSelectedControl.RootControl.Constraints.MinHeight > 0 then
|
||||||
AHeight := Max(AHeight, FSelectedControl.RootControl.Constraints.MinHeight);
|
LRect.Height := Max(LRect.Height, FSelectedControl.RootControl.Constraints.MinHeight);
|
||||||
|
|
||||||
|
FSelectedControl.SetBounds(LRect.Left, LRect.Top, LRect.Width, LRect.Height);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TAnchorDesigner.SelectedAnchorNewTarget(AKind: TAnchorKind);
|
procedure TAnchorDesigner.SelectedAnchorNewTarget(AKind: TAnchorKind);
|
||||||
|
Loading…
Reference in New Issue
Block a user