#!/usr/bin/perl -w # # Size Groups # # GtkSizeGroup provides a mechanism for grouping a number of # widgets together so they all request the same amount of space. # This is typically useful when you want a column of widgets to # have the same size, but you can't use a GtkTable widget. # # Note that size groups only affect the amount of space requested, # not the size that the widgets finally receive. If you want the # widgets in a GtkSizeGroup to actually be the same size, you need # to pack them in such a way that they get the size they request # and not more. For example, if you are packing your widgets # into a table, you would not include the GTK_FILL flag. # package sizegroup; use strict; use Glib qw(TRUE FALSE); use Gtk2; my $window = undef; # # Convenience function to create an option menu holding a number of strings # sub create_option_menu { my @strings = @_; if (Gtk2->CHECK_VERSION (2, 4, 0)) { my $combo_box = Gtk2::ComboBox->new_text; foreach my $str (@strings) { $combo_box->append_text ($str); } $combo_box->set_active (0); return $combo_box; } else { # on older versions, Gtk2::ComboBox is not available. my $menu = Gtk2::Menu->new; foreach my $str (@strings) { my $menu_item = Gtk2::MenuItem->new_with_label ($str); $menu_item->show; $menu->append ($menu_item); } my $option_menu = Gtk2::OptionMenu->new; $option_menu->set_menu ($menu); return $option_menu; } } sub add_row { my ($table, $row, $size_group, $label_text, @options) = @_; my $label = Gtk2::Label->new_with_mnemonic ($label_text); $label->set_alignment (0, 1); $table->attach ($label, 0, 1, $row, $row + 1, [qw/expand fill/], [], 0, 0); my $option_menu = create_option_menu (@options); $label->set_mnemonic_widget ($option_menu); $size_group->add_widget ($option_menu); $table->attach ($option_menu, 1, 2, $row, $row + 1, [], [], 0, 0); } sub toggle_grouping { my ($check_button, $size_group) = @_; # GTK_SIZE_GROUP_NONE is not generally useful, but is useful # here to show the effect of GTK_SIZE_GROUP_HORIZONTAL by # contrast. my $new_mode = $check_button->get_active ? 'horizontal' : 'none'; $size_group->set_mode ($new_mode); } sub do { my @color_options = qw/Red Green Blue/; my @dash_options = qw/Solid Dashed Dotted/; my @end_options = qw/Square Round Arrow/; if (!$window) { $window = Gtk2::Dialog->new_with_buttons ("GtkSizeGroup", undef, [], 'gtk-close' => 'none'); $window->set_resizable (FALSE); $window->signal_connect (response => sub { $window->destroy; 1 }); $window->signal_connect (destroy => sub { $window = undef; 1 }); my $vbox = Gtk2::VBox->new (FALSE, 5); $window->vbox->pack_start ($vbox, TRUE, TRUE, 0); $vbox->set_border_width (5); my $size_group = Gtk2::SizeGroup->new ('horizontal'); # Create one frame holding color options # my $frame = Gtk2::Frame->new ("Color Options"); $vbox->pack_start ($frame, TRUE, TRUE, 0); my $table = Gtk2::Table->new (2, 2, FALSE); $table->set_border_width (5); $table->set_row_spacings (5); $table->set_col_spacings (10); $frame->add ($table); add_row ($table, 0, $size_group, "_Foreground", @color_options); add_row ($table, 1, $size_group, "_Background", @color_options); # And another frame holding line style options # $frame = Gtk2::Frame->new ("Line Options"); $vbox->pack_start ($frame, FALSE, FALSE, 0); $table = Gtk2::Table->new (2, 2, FALSE); $table->set_border_width (5); $table->set_row_spacings (5); $table->set_col_spacings (10); $frame->add ($table); add_row ($table, 0, $size_group, "_Dashing", @dash_options); add_row ($table, 1, $size_group, "_Line ends", @end_options); # And a check button to turn grouping on and off my $check_button = Gtk2::CheckButton->new ("_Enable grouping"); $vbox->pack_start ($check_button, FALSE, FALSE, 0); $check_button->set_active (TRUE); $check_button->signal_connect (toggled => \&toggle_grouping, $size_group); } if (!$window->visible) { $window->show_all; } else { $window->destroy; } return $window; } 1; __END__ Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full list) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.