C.4 Adding a GUI to a Plugin Using MForms

MySQL Workbench is implemented with a C++ core back-end, and a native
front-end for each supported platform. Currently the front-end is
implemented with Windows Forms on Microsoft Windows, GTK+ on
Linux, and Cocoa on OS X. This approach permits the application to
have a native look and feel, while reducing the amount of work
required to maintain the project. However, the GUI functionality
required by MySQL Workbench can be met by a subset of graphical
operations. These are implemented in a cross-platform GUI library,
MForms. This further reduces the development effort because plugin
developers can use MForms rather than writing front-end specific
code for each supported platform. This also helps consistency of
operation across all platforms. MForms is coded in C++, but
provides a Python interface. To use it, the Python code must
import the mforms module.

MForms Containers

Given the problems of using an absolute coordinate system across
different platforms, MForms employs containers that perform
automatic layout. The basic containers that MForms provides
include:

Form: A top-level window
which can contain a single control, usually another container.
The window will be sized automatically to fit its contents,
but can also be sized statically.

Box: This container can be
filled with one or more controls in a vertical or horizontal
layout. Each child control can be set to use either the
minimum of required space, or fill the box in the direction of
the layout. In the direction perpendicular to the layout, for
example vertical in a horizontal layout, the smallest possible
size that can accommodate all child controls will be employed.
So, in this example, the smallest height possible to
accommodate the controls would be used.

Table: This container can
organize one or more controls in a grid. The number of rows
and columns in the table, and the location of controls within
the grid, can be set by the developer.

ScrollView: This container
can contain a single child control, and adds scrollbars if the
contents do not fit the available space.