[Lazarus] Autosize behaviour
Mattias Gaertner
nc-gaertnma at netcologne.de
Mon Apr 5 21:45:24 CEST 2010
On Mon, 5 Apr 2010 18:26:36 +0200 (CEST)
Michael Van Canneyt <michael at freepascal.org> wrote:
>[...]
> I have been thinking about layout managers. I think that this should be an add-on to the currently existing layouting (to preserve delphi compatibility):
> I imagine a component that one drops on a form.
> One sets the 'target' control (control whose children should be managed) and some properties.
>
> Depending on the layout one wants, a different component must be dropped:
>
> TLayout
> +- TAbsoluteLayout
> +- THBoxLayout
> +- TVBoxLayout
> +- TTableLayout
> +- TBorderLayout
> ...
> Each descendent has different properties. Changing the layout just means
> dropping another component; something that can be done run-time.
>
> Something like this exists in ExtJS, and it works very well.
>
> The only thing I am unsure about is whether TControl should be made TLayout-aware.
> As far as I understand, a layouter only needs to be able to handle rectangles,
> within some restrictions (some callbacks to get min/max rectangles).
> It need not know anything about TControl or it's properties, and as such could
> be implemented totally independent of the LCL.
See below.
> I discussed this idea once with Mattias Gaertner, but he seems to disagree
> on the TControl-unawareness, if I recall correctly.
With the new autosizing it is now possible to think about layout
managers.
A layout manager that handles the layout of children of a TWinControl
must implement the following:
- a computation of the total preferred space (children plus
space). At the moment this is done by TControl.CalculatePreferredSize.
- a computation of the layout (position and size of each child)
(AlignControls).
- a computation of the size (DoAutoSize)
The layouter needs access to Left, Top, Width, Height, ClientWidth,
ClientHeight, ReadBounds, BaseBounds, BaseParentClientSize,
AdjustSize, InvalidatePreferredSize.
Optionally a layouter could layout only a subset of the children (e.g.
those with Align=alCustom or only those with default Anchors).
So the LCL must call instead of its own functions the
layouter. Namely: DoAutoSize, AlignControl, CalculatePreferredSize,
ControlsAligned, CreateControlAlignList, CustomAlignInsertBefore,
CustomAlignPosition, DoAlignChildControls.
One solution would be a TWinControl property Layouter.
> Maybe the planned Lazarus day in the netherlands would be a good place to
> discuss this and settle things once and for all :-)
:)
Mattias
More information about the Lazarus
mailing list