#!/usr/cogent/bin/gamma
/* Example: Packing Widgets using Boxes. Packing is a
* common way to arrange widgets in GTK that allows for
* flexible control over vertical and horizontal layout,
* alignment, and spacing.
*/
/* Initialize Cogent interprocess communication.*/
init_ipc("a", "aq");
/* Set variables TRUE and FALSE to 1 and 0 respectively, to allow our
* code to emulate GTK better.
*/
TRUE = 1;
FALSE = 0;
/* Create a function to pack a horizontal box with several
* buttons, labelled: "button", "expand = TRUE/FALSE",
* "fill = TRUE/FALSE", and "padding = n". The function applies
* the expand, fill, and padding parameters to all of the buttons
* in the box. The homogeneity and spacing within the box can be
* set using the respective parameters.
*/
function make_box (homogenous, spacing, expand, fill, padding)
{
/* Make a horizontal box.*/
box1 = new(GtkHBox);
box1.set_homogeneous(homogenous);
box1.set_spacing(spacing);
/* Make the buttons and pack them in the box.*/
button = new(GtkButton);
button.label = "button";
box1.pack_start(button, expand, fill, padding);
button = new(GtkButton);
if(expand != FALSE)
button.label = "expand = TRUE";
else
button.label = "expand = FALSE";
box1.pack_start(button, expand, fill, padding);
button = new(GtkButton);
button.label = ((fill != FALSE) ? "fill = TRUE" : "fill = FALSE");
box1.pack_start(button, expand, fill, padding);
button = new(GtkButton);
button.label = (string("padding = ", padding));
box1.pack_start(button, expand, fill, padding);
box1;
}
/* Make a vertical box to hold the horizontal boxes.*/
box2 = new(GtkVBox);
box2.set_homogeneous(0);
box2.set_spacing(0);
/* Three steps to make a label and two rows of buttons:
*
* 1) Make a label for the rows of buttons.
*/
label = new(GtkLabel);
label.set_text("Homogeneous = FALSE, Spacing = 0:");
label.set_justify(GTK_JUSTIFY_RIGHT);
/* 2) Pack the label and two rows of buttons into
* the vertical box. The buttons are created within
* the method call, by calling the make_box function.
*/
box2.pack_start(label, FALSE, FALSE, 0);
box2.pack_start(make_box(0, 10, TRUE, FALSE, 0), FALSE, FALSE, 0);
box2.pack_start(make_box(0, 10, TRUE, TRUE, 0), FALSE, FALSE, 0);
/* 3) Make a separator and pack it in the vertical box.
*/
separator = new(GtkHSeparator);
box2.pack_start(separator, FALSE, TRUE, 5);
/* Repeat the above three steps, changing variables and
* labels as desired.
*/
label = new(GtkLabel);
label.set_text("Homogeneous = TRUE, Spacing = 0:");
label.set_justify(GTK_JUSTIFY_RIGHT);
box2.pack_start(label, FALSE, FALSE, 0);
box2.pack_start(make_box(1, 0, TRUE, FALSE, 0), FALSE, FALSE, 0);
box2.pack_start(make_box(1, 0, TRUE, TRUE, 0), FALSE, FALSE, 0);
separator = new(GtkHSeparator);
box2.pack_start(separator, FALSE, TRUE, 5);
label = new(GtkLabel);
label.set_text("Homogeneous = TRUE, Spacing = 20:");
label.set_justify(GTK_JUSTIFY_RIGHT);
box2.pack_start(label, FALSE, FALSE, 0);
box2.pack_start(make_box(1, 20, TRUE, FALSE, 0), FALSE, FALSE, 0);
box2.pack_start(make_box(1, 20, TRUE, TRUE, 0), FALSE, FALSE, 0);
separator = new(GtkHSeparator);
box2.pack_start(separator, FALSE, TRUE, 5);
/* Note that this group packs from the end, so the first line
* appears at the bottom of the window, with successive lines
* each above the other.
*/
label = new(GtkLabel);
label.set_text("Note: pack_end is used here.
Homogeneous = TRUE, Spacing = 0:");
label.set_justify(GTK_JUSTIFY_RIGHT);
box2.pack_end(label, FALSE, FALSE, 0);
box2.pack_end(make_box(1, 0, TRUE, FALSE, 0), FALSE, FALSE, 0);
box2.pack_end(make_box(1, 0, TRUE, TRUE, 20), FALSE, FALSE, 0);
separator = new(GtkHSeparator);
box2.pack_end(separator, FALSE, TRUE, 5);
/* Make a button to quit the program. Like the above buttons,
* it must be in a horizontal box to control its width.
*/
button = new(GtkButton);
button.label = "Quit";
button.signal("button_release_event",#gtk_main_quit());
quitbox = new(GtkHBox);
quitbox.pack_start(button, TRUE, FALSE, 0);
box2.pack_start(quitbox, FALSE, FALSE, 0);
/* Create a GtkWindow with a title and add the vertical box to it.
*/
window = new(GtkWindow);
window.set_border_width(10);
window.set_default_size(600,30);
window.set_title("Box Packing Example");
window.add(box2);
/* Show everything and enter the GTK main processing loop.
*/
window.show_all();
gtk_main();