Xfce Foundation Classes
« Main Page | Index

# Button Boxes

Button Boxes are a convenient way to quickly layout a group of buttons. They come in both horizontal and vertical flavours. You create a new ButtonBox with one of the following constructors, which create a horizontal or vertical box, respectively:
`HButtonBox(Gtk::ButtonBoxStyle layout = Gtk::BUTTONBOX_DEFAULT_STYLE, int spacing = default_spacing);
VButtonBox(Gtk::ButtonBoxStyle layout = Gtk::BUTTONBOX_DEFAULT_STYLE, int spacing = default_spacing);`
The 'layout' argument sets the method used to spread the buttons in a button box. It can be one of the values from the Gtk::ButtonBoxStyle enum:

- BUTTONBOX_DEFAULT_STYLE - default packing.
- BUTTONBOX_SPREAD - buttons are evenly spread across the ButtonBox.
- BUTTONBOX_EDGE - buttons are placed at the edges of the ButtonBox.
- BUTTONBOX_START - buttons are grouped towards the start of box, (on the left for a HBox, or the top for a VBox).
- BUTTONBOX_END - buttons are grouped towards the end of a box, (on the right for a HBox, or the bottom for a VBox).

The 'spacing' argument specifies the number of pixels to put between the buttons in the button box. The 'default_spacing' is defined as -1 and implies zero pixels. The spacing can be set or retrieved using the inherited Gtk::Box::set_spacing() and Gtk::Box::get_spacing() methods.
`void set_spacing(int spacing);
int get_spacing() const;`
The Button Box layout can be set or retrieved using the following methods, respectively.
`void set_layout(Gtk::ButtonBoxStyle layout_style);
Gtk::ButtonBoxStyle get_layout() const;`
Buttons are added to a Button Box using the usual method, Gtk::Container::add():
`buttonbox->add(*button);`

## Button Box Example

Here's an example that illustrates all the different layout settings for Button Boxes.
The header file for the Button Box example is <buttonbox.h>:
`#include <xfc/main.hh>
#include <xfc/gtk/button.hh>
#include <xfc/gtk/buttonbox.hh>
#include <xfc/gtk/frame.hh>
#include <xfc/gtk/window.hh>
using namespace Xfc;
class ButtonBoxFrame : public Gtk::Frame
{
public:
ButtonBoxFrame(bool horizontal, const char *title, int spacing, Gtk::ButtonBoxStyle layout);
virtual ~ButtonBoxFrame();
};
class ButtonBoxWindow : public Gtk::Window
{
public:
ButtonBoxWindow();
virtual ~ButtonBoxWindow();
};`
and the source file is <buttonbox.cc>:
`#include "buttonbox.hh"
#include <xfc/gtk/box.hh>
#include <xfc/gtk/stockid.hh>
// ButtonBoxFrame
ButtonBoxFrame::ButtonBoxFrame(bool horizontal, const char *title, int spacing, Gtk::ButtonBoxStyle layout)
{
set_label(title);
Gtk::ButtonBox *bbox;
if (horizontal)
bbox = new Gtk::HButtonBox;
else
bbox = new Gtk::VButtonBox;
bbox->set_border_width(5);
add(*bbox);
bbox->set_layout(layout);
bbox->set_spacing(spacing);
Gtk::Button *button = new Gtk::Button(Gtk::StockId::OK);
bbox->add(*button);
button = new Gtk::Button(Gtk::StockId::CANCEL);
bbox->add(*button);
button = new Gtk::Button(Gtk::StockId::HELP);
bbox->add(*button);
}
ButtonBoxFrame::~ButtonBoxFrame()
{
}
// ButtonBoxWindow
ButtonBoxWindow::ButtonBoxWindow()
{
set_title("Button Boxes");
set_border_width(10);
Gtk::VBox *main_vbox = new Gtk::VBox;
add(*main_vbox);
// Horizontal Button Boxes
Gtk::Frame *frame = new Gtk::Frame("Horizontal Button Boxes");
main_vbox->pack_start(*frame, true, true, 10);
Gtk::Box *box = new Gtk::VBox;
box->set_border_width(10);
frame->add(*box);
ButtonBoxFrame *button_box_frame = new ButtonBoxFrame(true, "Spread (spacing 40)", 40, Gtk::BUTTONBOX_SPREAD);
box->pack_start(*button_box_frame);
button_box_frame = new ButtonBoxFrame(true, "Edge (spacing 30)", 30, Gtk::BUTTONBOX_EDGE);
box->pack_start(*button_box_frame, true, true, 5);
button_box_frame = new ButtonBoxFrame(true, "Start (spacing 20)", 20, Gtk::BUTTONBOX_START);
box->pack_start(*button_box_frame, true, true, 5);
button_box_frame = new ButtonBoxFrame(true, "End (spacing 10)", 10, Gtk::BUTTONBOX_END);
box->pack_start(*button_box_frame, true, true, 5);
// Vertical Button Boxes
frame = new Gtk::Frame("Vertical Button Boxes");
main_vbox->pack_start(*frame, true, true, 10);
box = new Gtk::HBox;
box->set_border_width(10);
frame->add(*box);
button_box_frame = new ButtonBoxFrame(false, "Spread (spacing 5)", 5, Gtk::BUTTONBOX_SPREAD);
box->pack_start(*button_box_frame);
button_box_frame = new ButtonBoxFrame(false, "Edge (spacing 30)", 30, Gtk::BUTTONBOX_EDGE);
box->pack_start(*button_box_frame, true, true, 5);
button_box_frame = new ButtonBoxFrame(false, "Start (spacing 20)", 20, Gtk::BUTTONBOX_START);
box->pack_start(*button_box_frame, true, true, 5);
button_box_frame = new ButtonBoxFrame(false, "End (spacing 20)", 20, Gtk::BUTTONBOX_END);
box->pack_start(*button_box_frame, true, true, 5);
show_all();
}
ButtonBoxWindow::~ButtonBoxWindow()
{
}
int main (int argc, char *argv[])
{
using namespace Main;
init(&argc, &argv);
ButtonBoxWindow window;
window.signal_destroy().connect(sigc::ptr_fun(&Xfc::Main::quit));
run();
return 0;
}
`

## Compiling Button Box

If you compiled and installed XFC yourself, you will find the source code for Button Box in the <examples/buttonbox> source directory along with a Makefile. If XFC came pre-installed, or you installed it from an RPM package, you will find the source code in the </usr/share/doc/xfcui-X.X/examples/buttonbox> subdirectory. In this case you will have to create the Makefile yourself (replace X.X with the version number of the libXFCui library you have installed).
To create a Makefile for Button Box, add the following lines to a new text file and save it using the name "Makefile":
`CC = g++
CFLAGS = -Wall -O2
buttonbox: buttonbox.cc buttonbox.hh
$(CC) buttonbox.cc -o buttonbox $(CFLAGS) `pkg-config xfcui-X.X --cflags --libs`
clean:
rm -f *.o buttonbox`
If you cut and paste these lines make sure the whitespace before $(CC) and rm is a tab character. When you compile and run this program you will see the following window appear:
This window displays several vertical and horizontal button boxes, each using a different layout style.

Copyright © 2004-2005 The XFC Development Team | Top | XFC 4.4