|
Problem You would like to add a combobox (or pulldown menu) inside a treeview as shown below:

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
| <?php $window = new GtkWindow(); $window->set_size_request(400, 200); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Using GtkCellRendererCombo - Part 1 (Setup)"); $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);
// 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));
display_table($vbox, $data);
$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_STRING); } else { $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING, Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE, Gtk::TYPE_STRING); } $field_header = array('Row #', 'Description', 'Qty', 'Price');
// Creates the view to display the list store
$view = new GtkTreeView($model); $scrolled_win->add($view);
// Creates columns
for ($col=0; $col<count($field_header); ++$col) { $cell_renderer = new GtkCellRendererText(); $column = new GtkTreeViewColumn($field_header[$col], $cell_renderer, 'text', $col); $view->append_column($column); }
// Set up the combobox
$cell_renderer = new GtkCellRendererCombo(); // note 1
if (defined("GObject::TYPE_STRING")) { $category = new GtkListStore(GObject::TYPE_STRING); // note 2
|
- 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
- Create a new combobox renderer.
- Create a liststore to store the options of the combobox. Note: Please refer to the comments from Andre Colomb: "If you change the column type of the list store to Gtk::TYPE_LONG and fill it with integers, the application crashes as soon as one selects a value from the list." This might be a php-gtk bug. Till they fix it, just use
Gtk::TYPE_STRING for the model of the combobox.
- Populate the combobox.
- It is here that we bind the data model of the combo box to the renderer with: GtkCellrenderercombo::model().
- '0' refers to the 1st col in $category
- Allow user to change value
- When you set GtkCellrenderercombo::has-entry() to
true, you allow users to specify values other than those in the combo box. Set it to false if you only want users to select from the list.
Note
Note that here we have only set up the combo box. You can now see the combo box and selects the value. However the moment you select another row, the value disappears. This is because the value is not being stored in the data model associated with the tree view.
In Part 2, we will show you how to process user selection from the combo box.
Related Links
|