GridLayout

From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
Jump to: navigation, search

Written for CEGUI 0.6


Works with versions 0.6.x (obsolete)

Introduction

It is hard to hard-code a layout that is constantly looking good with different screen resolutions and for different window sizes - especially when dealing with resizable windows. Often, two wdgets are too close together or too far apart. The GridLayout class solves such problems: This class provides a layout manager for CEGUI that lays out a given window according to an invisible grid laid over the window's client area. The size of the grid's cells is changed according to some parameters when the window size changes. The widgets, the client application registers with the layout manager, stick to specific cells and change their size when the cells do. This concept (inspired by Trolltechs Qt) allows for many different and complex window layouts. The header file is documented with doxygen tags.

Questions, remarks, comments, blame, etc. shall be posted within the GridLayout forum thread.

Example

The following snippet is an example from the embedded documentation:

// create a new window and its layout manager
CEGUI::Window *wnd = (CEGUI::FrameWindow *)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/FrameWindow", (CEGUI::utf8*)"MyWindow");
GridLayout *layout = new GridLayout(wnd, true); // setting the second parameter to true will
                                                // cause self-destruction of the layout manager on destruction of the window
 
CEGUI::Window *btn;
btn = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Btn1"); btn->setText("1");
layout->addChildWindow(btn, 0, 0, 3, 3, UDim(1.0/512, 0.0));
 
btn = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Btn1"); btn->setText("2");
btn->setMinSize(CEGUI::UVector2(UDim(0.06, 0.0), UDim(0.03, 0.0)));
layout->addChildWindow(btn, 2, 0, 1, 1, UDim(1.0/512, 0.0));
 
btn = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Btn1"); btn->setText("3");
btn->setMinSize(CEGUI::UVector2(UDim(0.06, 0.0), UDim(0.03, 0.0)));
layout->addChildWindow(btn, 2, 1, 1, 1, UDim(1.0/512, 0.0));
 
btn = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Btn1"); btn->setText("4");
btn->setMinSize(CEGUI::UVector2(UDim(0.06, 0.0), UDim(0.03, 0.0)));
layout->addChildWindow(btn, 1, 3, 1, 1, UDim(1.0/512, 0.0));
 
btn = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", (CEGUI::utf8*)"Btn1"); btn->setText("5");
btn->setMinSize(CEGUI::UVector2(UDim(0.06, 0.0), UDim(0.03, 0.0)));
layout->addChildWindow(btn, 2, 3, 1, 1, UDim(1.0/512, 0.0));
 
layout->setRowStretch(0, 0);
layout->setRowStretch(1, 0);
layout->setRowStretch(3, 0);
layout->setColStretch(1, 0);
layout->setColStretch(2, 0);
 
layout->setOuterMargin(UDim(1.0/256, 0.0)); // adds a margin to the window's whole client area
wnd->setMinSize(layout->getMinSize()); // asks the layout manager for the window's minimum size
wnd->setSize(wnd->getMinSize());
layout->layout(); // forces an initial layout

The resulting window will look like this:

1 2
3
4 5

Only the button captioned "1" will resize when resizing the window and when viewing the window with a different resolution, everything will look the same as before

Download

The files are too big to be inlined into this page. You may download them here