PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 301: How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 2 - three radio buttons?
Written by kksou   
Thursday, 16 August 2007
Problem

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

In this Part 2, we will show you how to set up three radio buttons in the treeview as shown below:

How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 2 - three radio buttons?


Solution
  • First use the technique as outlined in Part 1 to set up the three radio buttons.
  • Note that each radio button is placed in its own GtkTreeViewColumn and corresponds to one column in the data model.
  • Perhaps the only "tricky" part is that you need to manually make the radio buttons behave like radio buttons. That is, when a person clicks on one radio button, you need to manually turn off the other two radios. No that difficult though. Just need to add a couple of lines of codes.

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   
91   
92   
93   
94   
95   
96   
97   
98   
99   
100   
<?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 2 (3 buttons)");
$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, GObject::TYPE_BOOLEAN, GObject::TYPE_BOOLEAN);
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING,
            Gtk::TYPE_STRING, Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE,
            Gtk::TYPE_BOOLEAN, Gtk::TYPE_BOOLEAN, Gtk::TYPE_BOOLEAN);
    }
    $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);
    }

    setup_radio($view, 'A', 4); // note 1
    setup_radio($view, 'B', 5); // note 1
    setup_radio($view, 'C', 6); // note 1

    // pupulates the data
    for ($row=0; $row<count($data); ++$row) {
        $values = array();
        for ($col=0; $col<count($data[$row]); ++$col) {
            $values[] = $data[$row][$col];
        }
        $values = array_merge($values, array(0, 0, 0));
        $model->append($values);
    }

    $selection = $view->get_selection();
    $selection->set_mode(Gtk::SELECTION_NONE);

    return $model;

}

// setup radio buttons
function setup_radio($view, $label, $col_num) {
    $column = new GtkTreeViewColumn();
    $view->append_column($column);

    $cell_renderer1 = new GtkCellRendererText();
    $cell_renderer1->set_property('text', $label);
  • 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

We make use of the code in How to set up radio buttons in GtkTreeView using GtkCellRendererToggle - Part 1 - one radio button?

What's new here:

  1. Add the three radio buttons. Please refer to Part 1 for more explanation.
  2. Turn on the radio button that is clicked on.
  3. Turn off the radio buttons that are not clicked on.

Related Articles


User reviews

There are no user reviews yet.

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