PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 300: How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 1 - one radio button?
Written by kksou   
Wednesday, 15 August 2007
Problem

We have set up checkboxes for users to select rows using GtkCellRendererToggle in How to use GtkCellRendererToggle - Part 1 - setup?

Suppose instead of checkboxes, you want to set up radio buttons in a treeview as shown below:

How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 1 - one radio button?


Solution

Sample Code
1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 230);
$window->connect_simple('destroy', array('Gtk','main_quit'));

$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("          Set up radio buttons in GtkTreeView\n".
"Using GtkCellRendererToggle - Part 1 (1 button)");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$title->set_size_request(-1, 40);
$vbox->pack_start($title, 0, 0);
$vbox->pack_start(new GtkLabel(), 0, 0);

$vbox->pack_start($hbox = new GtkHBox, 0, 0);
$button = new GtkButton('Process Rows');
$hbox->pack_start(new GtkLabel(
    'Press the button to process all rows '), 0, 0);
$hbox->pack_start($button, 0, 0);

// the 2D table
$data = array(
array('row0', 'item 1', 2, 3.1),
array('row1', 'item 4', 5, 6.21),
array('row2', 'item 7', 8, 9.36),
array('row3', 'item 10', 11, 12.4),
array('row4', 'item 21', 14, 15.5),
array('row5', 'item 36', 17, 18.6),
array('row6', 'item 42', 20, 21.73));

$model = display_table($vbox, $data);
$button->connect('clicked', 'on_clicked', $model);

$window->show_all();
Gtk::main();

function display_table($vbox, $data) {

    // Set up a scroll window
    $scrolled_win = new GtkScrolledWindow();
    $scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC,
        Gtk::POLICY_AUTOMATIC);
    $vbox->pack_start($scrolled_win);

    // Creates the list store
    if (defined("GObject::TYPE_STRING")) {
        $model = new GtkListStore(GObject::TYPE_STRING,
            GObject::TYPE_STRING, GObject::TYPE_LONG, GObject::TYPE_DOUBLE,
            GObject::TYPE_BOOLEAN); // note 1
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING,
            Gtk::TYPE_STRING, Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE,
            Gtk::TYPE_BOOLEAN); // note 1
    }
    $field_header = array('Row #', 'Description', 'Qty', 'Price');

    // Creates the view to display the list store
    $view = new GtkTreeView($model);
    $scrolled_win->add($view);

    // Creates the rest of the column
    for ($col=0; $col<count($field_header); ++$col) {
        $cell_renderer = new GtkCellRendererText();
        $column = new GtkTreeViewColumn($field_header[$col],
            $cell_renderer, 'text', $col);
        $column->set_cell_data_func($cell_renderer, "format_col", $col);
        if ($col==1) $column->set_expand(true);
        $view->append_column($column);
    }

    // option 1
    $column = new GtkTreeViewColumn();
    $view->append_column($column);
    $cell_renderer = new GtkCellRendererText(); // note 2
    $cell_renderer->set_property('text', 'Option A');
    $column->pack_start($cell_renderer, true);
    $column->set_cell_data_func($cell_renderer, "format_col", 4);

    $cell_renderer = new GtkCellRendererToggle(); // note 3
    $cell_renderer->set_property('activatable', true);
    $cell_renderer->set_radio(true); // note 4
    $cell_renderer->connect('toggled', 'on_toggle', $view); // note 5
    $column->pack_start($cell_renderer, true);
    $column->set_attributes($cell_renderer, 'active', 4); // note 6
    $column->set_cell_data_func($cell_renderer, "format_col", 4);

    // pupulates the data
    for ($row=0; $row<count($data); ++$row) {
  • Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
  • Registration is free and immediate.
  • Have some doubt about the registration? Please read this forum article.
Explanation

The code above are almost the same as that of How to use GtkCellRendererToggle - Part 1 - setup?

We also make use of the technique as outlined in How to display gif or jpg images in GtkTreeView - Part 2? to pack both the radio button and its label in one treeview column.

What's new here:

  1. Note that in this example, we moved the radio button to the last column (column 4).
  2. The first cellrenderer holds the label of the radio button.
  3. The second cellrenderer holds the radio button.
  4. Set GtkCellRendererToggle to display as radio button instead of checkbox.
  5. Process the radio button toggle.
  6. Binds the radio button to column 4 of the model.
  7. Note that I turn off the selection here so that you can see the radio button. Try comment out this line and you will see what I mean.

Note
  • Note that in this example, when you press the radio button, it behaves like a checkbox button. That is, it toggles.
  • In the next article, we will have three buttons and show you how to make them behave the way radio buttons should be.

Related Articles


User reviews   Average user ratings:    0.0   (from 2 users)
  1. Andre Colomb from Germany
    October 15, 2007 8:14am

    I believe there is a typo near the top, you say one should use the set_active() method when it should actually be set_radio(). The sample code is correct, though.

  2. kksou
    October 16, 2007 2:00am

    Yes, it should be set_radio. Thanks for pointing this out. Have just fixed it.

Note: You have to be a registered member to leave a comment. Free registration here.

 
< Prev   Next >

Blog - Forum - Privacy Policy - Contact Us
Copyright © 2006-2008. kksou.com. All Rights Reserved