Intro Overview Window Widgets Layout Events

Layout

Each window can have a layout manager. Even a Label can have one, probably needs one, when a pictogram is shown next to the text.

A layout manager is assigned to a window when constructed:

Window.new(parent, :layout=>Layout)
where Layout is a module that implements at least the methods add_child(), user_width(), user_height() and pack().

Predefined X, Y, Width, Height

Each layout manager has its own ways of dealing with those values. Some may ignore it, others may use it. For example, VLayout and HLayout ignore three out of four of these values.

My Widget is too big/small!

Layout managers have the freedom to set the place and size of the children. Actually, that is their task! Your widgets should be able to cope with that. Layout managers may implement hints like :expand=>true, :weight=>2.4, :align=>"left" to adjust size and placement, but need not.

In particular, the Window Manager in an X environment has the absolute, given right to place and dimension a toplevel window to its liking. For instance, on PDA's, some Window Managers give applications invariably (almost) the full screen, without taking any request from the application itself into account.

Ignoring the Window Manager

Specify
Window.new(parent, :override=>true)
and you can do the rest yourself. Use with care. Use seldomly.

Building your Own Widget

A widget has the user-space, for which it specifies the width and height with user_width() and user_height(). Added to that for the total dimensions are space and border. The border can look just like space when no relief is specified.

The Window widget will pass the total width and height to the parent window, your widget does not have to provide for this.

Some lower graphics engines can not deal with windows of size zero, so your user_width() and user_height() should not return zero (but it is caught by the default total_width() and total_height()).

Building your Own Layout Manager

The layout manager should place and resize all children from a window when its pack() method is called. It may choose not to map some children, in which case they need not be resized or placed, either. Before packing, the layout manager will be asked the user_width() and user_height() it would like to use. As such, the layout manager can use these functions to precompute values, precisely once (not when pack() is called a second time).

Current Problem

An empty window with a defined layout manager, but no children has a default width/height (specifically, on creation). That sucks, since those dimensions are used on popup.
Kero
Intro Overview Window Widgets Layout Events