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/