gnope php gtk gui gnope.org  

how to iterate GtkTreeViewColumn of a GtkList or TreeView

 
Post new topic   Reply to topic    gnope.org Forum Index -> PHP GTK2 Beginners
View previous topic :: View next topic  
Author Message
firepages



Joined: 09 Jan 2007
Posts: 4

PostPosted: Tue Jan 09, 2007 4:09 am    Post subject: how to iterate GtkTreeViewColumn of a GtkList or TreeView Reply with quote

Hi, only just started with v2 & the gtklist/tree/etc is a bit confusing.

I have seen examples of setting alternate row colours via a callback when creating the columns...

$column->set_cell_data_func($cell_renderer, "callback", $col);

But I would like to iterate over the columns at a later date and change the colour (or whatever) as and when I require it.

So given that I have access to either the GtkTreeView and the GtkListStore models ($this->treeView & $this->treeViewModel) , how would I get at the column to set_property() ?

Pointers much appreciated.
Back to top
kksou



Joined: 06 Sep 2006
Posts: 25

PostPosted: Tue Jan 16, 2007 6:48 am    Post subject: Reply with quote

Here's a sample code:

Code:

<?php
$window = new GtkWindow();
$window->set_size_request(400, 320);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);

$highlight=0;

// define menu definition
$menu_definition = array(
    '_File' => array('_Quit|Q'),
    '_Test' => array('Show All Rows|1', 'Show Rows where Qty > 10|2', 'Show Rows where Price < $10|3')
);
setup_menu($vbox, $menu_definition);

// display title
$title = new GtkLabel("Selectively highlight some rows in treeview");
$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("Press Ctrl-1 to for default view\nCtrl-2 to highlight qty > 10\nCtrl-3 to highlight price < \$10"), 0, 0);
$vbox->pack_start(new GtkLabel(), 0, 0); // add a small gap

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

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

display_table ($scrolled_win, $data);

function display_table($scrolled_win, $data) {
    // Creates the list store
    global $model, $view;
    $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING,
                Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE, Gtk::TYPE_BOOLEAN);
    $field_header = array('Row #', 'Description', 'Qty', 'Price');
    $field_justification = array(0, 0, 0.5, 1);

    $view = new GtkTreeView($model);
    $scrolled_win->add($view);

    // Creates the columns
    for ($col=0; $col<count($field_header); ++$col) {
        $cell_renderer = new GtkCellRendererText();
        $cell_renderer->set_property("xalign", $field_justification[$col]);
        $column = new GtkTreeViewColumn($field_header[$col], $cell_renderer, 'text', $col);
        $column->set_alignment($field_justification[$col]);
        $column->set_sort_column_id($col);

        // set the header font and color
        $label = new GtkLabel($field_header[$col]);
        $label->modify_font(new PangoFontDescription("Arial Bold"));
        $label->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000FF"));
        $column->set_widget($label);
        $label->show();

        // setup self-defined function to display alternate row color
        $column->set_cell_data_func($cell_renderer, "format_col", $col);
        $view->append_column($column);
    }

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

    // setup selection
    $selection = $view->get_selection(); // get the selection associated with the view
    $selection->connect('changed', 'on_selection');

}

// self-defined function to format the price column
function format_col($column, $cell, $model, $iter, $col_num) {
    $path = $model->get_path($iter); // get the current path
    $row_num = $path[0]; // get the row number
    if ($col_num==3) {
        $amt = $model->get_value($iter, 3);
        $cell->set_property('text', '$'.number_format($amt,2));
    }
    global $highlight;
    if ($highlight==0) {  // note 1
        $row_color = ($row_num%2==1) ? '#dddddd' : '#ffffff'; // sets the row color for odd and even rows
    } elseif ($highlight==1) {  // note 2
        $qty = $model->get_value($iter, 2);
        $row_color = ($qty>10) ? '#99FF99' : '#dddddd';
    } elseif ($highlight==2) {  // note 3
        $amt = $model->get_value($iter, 3);
        $row_color = ($amt<10) ? '#99FF99' : '#dddddd';
    }
    $cell->set_property('cell-background', $row_color); // sets the background color
}

// the function that is called when user selects a row
function on_selection($selection) {
    list($model, $iter) = $selection->get_selected();
    if ($iter==NULL) return;
    $desc = $model->get_value($iter, 1);
    $qty = $model->get_value($iter, 2);
    $price = $model->get_value($iter, 3);
    print "You have selected $desc: $qty ($price)\n";
}

// setup menu
function setup_menu($vbox, $menus) {
    global $accel_group;
    $menubar = new GtkMenuBar();
    $vbox->pack_start($menubar, 0, 0);
    foreach($menus as $toplevel => $sublevels) {
        $menubar->append($top_menu = new GtkMenuItem($toplevel));
        $menu = new GtkMenu();
        $top_menu->set_submenu($menu);
        foreach($sublevels as $submenu) {
            if (strpos("$submenu", '|') === false) {
                $accel_key = '';
            } else {
                list($submenu, $accel_key) = explode('|', $submenu);
            }

            if (is_array($submenu)) { // set up radio menus
                $i=0;
                $radio[0] = null;
                foreach($submenu as $radio_item) {
                    $radio[$i] = new GtkRadioMenuItem($radio[0], $radio_item);
                    $radio[$i]->connect('toggled', "on_toggle");
                    $menu->append($radio[$i]);
                    ++$i;
                }
                $radio[0]->set_active(1); // select the first item
            } else {
                if ($submenu=='<hr>') {
                    $menu->append(new GtkSeparatorMenuItem());
                } else {
                    $submenu2 = str_replace('_', '', $submenu);
                    $submenu2 = str_replace(' ', '_', $submenu2);
                    $stock_image_name = 'Gtk::STOCK_'.strtoupper($submenu2);
                    if (defined($stock_image_name)) {
                        $menu_item = new GtkImageMenuItem(constant($stock_image_name));
                    } else {
                        $menu_item = new GtkMenuItem($submenu);
                    }
                    if ($accel_key!='') {
                        $menu_item->add_accelerator("activate", $accel_group, ord($accel_key), Gdk::CONTROL_MASK, 1);
                    }

                    $menu->append($menu_item);
                    $menu_item->connect('activate', 'on_menu_select');
                }
            }
        }
    }
}

// process menu item selection
function on_menu_select($menu_item) {
    global $model, $view, $highlight;
    $item = $menu_item->child->get_label();
    echo "menu selected: $item\n";
    if ($item=='_Quit') {
        Gtk::main_quit();
    } elseif ($item=='Show All Rows') {
        $highlight=0;
    } elseif ($item=='Show Rows where Qty > 10') {
        $highlight=1;
    } elseif ($item=='Show Rows where Price < $10') {
        $highlight=2;
    }
    $view->queue_draw(); // note 4
}

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


Sample output:



More explanation at:

http://www.kksou.com/php-gtk2/articles/selectively-highlight-rows-in-GtkTreeView.php

Regards,
/kksou
Back to top
firepages



Joined: 09 Jan 2007
Posts: 4

PostPosted: Tue Jan 16, 2007 3:21 pm    Post subject: Reply with quote

Hi, I appreciate the reply & see that the queue_draw is very useful, but it still reuses the original callback.. and yes this is one way to achieve the result.

I would still like however to know how I might access the column cells given only the model or view so I can iterate though them, I simply do not understand the relationship between the model/view and the columns/cells
Back to top
firepages



Joined: 09 Jan 2007
Posts: 4

PostPosted: Tue Jan 16, 2007 5:59 pm    Post subject: Reply with quote

OK, got it ... where $this is a GtkTreeView...

Code:

<?php
   foreach($this->get_columns() as $col){
      foreach($col->get_cell_renderers() as $cell){
         //e.g.
                $cell->set_property('cell-background', $color);
      }
   }
?>
Back to top
Display posts from previous:   
Post new topic   Reply to topic    gnope.org Forum Index -> PHP GTK2 Beginners All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Templates enhanced by DigiWiki. Hosting by Tradebit.