Stephen George wrote:
Hi,

I am trying to get a treeview (with liststore model) to display rows in different colors based on content in the list.

From what I've read in GTK+ 2.0 Tree View Tutorial - Tim-Philipp Muller ( c code based)

"The most suitable approach for most cases is that you add two columns to your model, one for the property itself (e.g. a column COL_ROW_COLOR of type G_TYPE_STRING), and one for the boolean flag of the property (e.g. a column COL_ROW_COLOR_SET of type G_TYPE_BOOLEAN). You would then connect these columns with the "foreground" and "foreground-set" properties of each renderer. Now, whenever you set a row’s COL_ROW_COLOR field to a colour, and set that row’s COL_ROW_COLOR_SET field to TRUE, then this column will be rendered in the colour of your choice. If you only want either the default text colour or one special other colour, you could even achieve the same thing with just one extra model column: in this case you could just set all renderer’s "foreground" property to whatever special color you want, and only connect the COL_ROW_COLOR_SET column to all renderer’s "foreground-set" property using attributes."

Which I've implemented as attached.

The setting of foreground seems to be working (half list blue, half red)
However my implementation seems to be ignoring the foreground-set flag.

I am expecting to ONLY see my 'special' foreground color when the modified flag is also set to true, and grey/black writing when the foreground-set flag is False.

I can get grey writing by setting the foreground to None, but I don't belive this was the intent of the above description.

Am I mis-understanding how this functionality should work, .. or made some errors in my code?

Thanks for any suggestions.
Steve


Hi Steve,

I can't see the pattern in why the colors are how they are. I think some of the trouble has to be with some 'foreground-color' set as None.

It would probably be better to not use the 'Modified' column to affect the color, and just put the color you want the row in the 'foreground-color' column (i.e. red,black or blue) and change the set-up to.

column.add_attribute(mycell, 'foreground', COLUMN_FOREGROUND)
mycell.set_property('foreground-set', True)




If you must stay with this set-up, this function seems to do what you want

    def _cell_data_func(self, column, cell, model, iter):
(modified,foreground) = model.get(iter,COLUMN_MODIFIED,COLUMN_FOREGROUND)
                if foreground == None : foreground = 'black'
                if modified :
                        cell.set_property('foreground',foreground)
                else :
                        cell.set_property('foreground','black')
                cell.set_property('foreground-set',True)
                return False

And use "column.set_cell_data_func(mycell, self._cell_data_func)" to set it up.

Regards Neil.


77a78,84
>     def _cell_data_func(self, column, cell, model, iter):
>               #print "totalcelldatamethod()"
>               (modified,foreground) = 
> model.get(iter,COLUMN_MODIFIED,COLUMN_FOREGROUND)
>               cell.set_property('foreground',foreground)
>               cell.set_property('foreground-set',modified)
>               return False
> 
92,93c99,101
<         column.add_attribute(mycell, 'foreground', COLUMN_FOREGROUND)
<         column.add_attribute(mycell, 'foreground-set', COLUMN_MODIFIED)
---
> #        column.add_attribute(mycell, 'foreground', COLUMN_FOREGROUND)
> #        column.add_attribute(mycell, 'foreground-set', COLUMN_MODIFIED)
>         column.set_cell_data_func(mycell, self._cell_data_func)
_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to