I tried the solution you provided, but didn't work. The cell still renders
a black box ( from the default color in ColorButton ). Here's the
implementation from what you told me:
Gtk::TreeViewColumn* new123 = new Gtk::TreeViewColumn( "Color" );
new123->pack_start( *zoneColorRenderer, true );
new123->add_attribute(zoneColorRenderer->property_color(),
zoneModel.columnColor);
view->append_column( *new123 );
Gtk::TreeModel::Row row = *( referenceZones->append() );
row[zoneModel.columnStart] = 123;
row[zoneModel.columnEnd] = 456;
Gdk::Color color;
double red = 1;
double green = 0;
double blue = 0;
color.set_rgb_p( red, green, blue );
row[zoneModel.columnColor] = color;
I created a custom TreeViewColumn and packed in it my CellRenderer. I
related the thow attributes from the CellRenderer and the TreeModelColumn,
and later initialized a row with the color yellow on that column.
Thanks ...
On Wed, Mar 26, 2008 at 5:53 AM, Andrew E. Makeev <[EMAIL PROTECTED]> wrote:
> В Срд, 19/03/2008 в 10:58 -0400, Roberto Alejandro Espí Muñoz пишет:
> > Ok, I decided to try and insert the ColorButton widget in the
> > TreeView. I declared in my CellRendererColorButton class the thow
> > functions that are needed for the rendering.
> >
> > void get_size_vfunc ( Gtk::Widget& widget,
> > const Gdk::Rectangle* cell_area,
> > int * x_offset,
> > int * y_offset,
> > int * width,
> > int * height
> > )
> > {
> > Glib::RefPtr<Pango::Layout> ptrLayout =
> > widget.create_pango_layout( "Hello" );
> > Pango::Rectangle rect = ptrLayout-
> > >get_pixel_logical_extents();
> >
> > const int calc_width = 2 * 4 + rect.get_width();
> > const int calc_height = 2 * 4 + rect.get_height();
> >
> > std::cout << "Done" << std::endl;
> > *width = calc_width;
> > *height = calc_height;
> >
> > if( cell_area )
> > {
> > if( x_offset )
> > {
> > *x_offset = int( property_xalign() *
> > ( cell_area->get_width() - this->button-
> > >get_width() ) );
> > *x_offset = std::max( 0, *x_offset );
> > }
> >
> > if( y_offset )
> > {
> > *y_offset = int( property_yalign() *
> > ( cell_area->get_height() - this->button-
> > >get_height() ) );
> > *y_offset = std::max( 0, *y_offset );
> > }
> > }
> >
> > and
> >
> > void render_vfunc ( const Glib::RefPtr<Gdk::Drawable>&
> > window,
> > Gtk::Widget& widget,
> > const Gdk::Rectangle& background_area,
> > const Gdk::Rectangle& cell_area,
> > const Gdk::Rectangle& expose_area,
> > Gtk::CellRendererState flags
> > )
> > {
> > int x_offset = 0, y_offset = 0, width = 0, height = 0;
> > get_size( widget, cell_area, x_offset, y_offset, width,
> > height );
> >
> > Gtk::StateType state;
> >
> > if( ( flags & Gtk::CELL_RENDERER_SELECTED ) != 0 )
> > {
> > state = Gtk::STATE_SELECTED;
> > }
> > else
> > {
> > state = Gtk::STATE_NORMAL;
> > }
> >
> > Gdk::Color bgColor;
> > bgColor.set_rgb_p( 1, 0.5, 0.5 );
> >
> > // Glib::RefPtr< Gdk::GC >
> > gc = Gdk::GC::create( window );
> > // gc->set_rgb_bg_color
> > ( bgColor );
> > //
> > // window->draw_rectangle
> > ( gc,
> > // true,
> > //
> > background_area.get_x(),
> > //
> > background_area.get_y(),
> > //
> > background_area.get_width(),
> > //
> > background_area.get_height() );
> >
> > Glib::RefPtr<Gdk::Window> win =
> > Glib::RefPtr<Gdk::Window>::cast_dynamic( window );
> > Glib::RefPtr< Pango::Layout > ptrLayout =
> > widget.create_pango_layout( "" );
> > widget.get_style()->paint_layout
> > ( win,
> > state,
> > true,
> > cell_area,
> > widget,
> > "cellrenderertext",
> > cell_area.get_x() + x_offset,
> > cell_area.get_y() + y_offset,
> > ptrLayout );
> >
> > Glib::RefPtr< Gdk::GC > gc = Gdk::GC::create( window );
> > gc->set_rgb_fg_color( bgColor );
> >
> > window->draw_rectangle( gc,
> > true,
> > background_area.get_x(),
> > background_area.get_y() + 1,
> > background_area.get_width(),
> > 3 );
> > window->draw_rectangle( gc,
> > true,
> > background_area.get_x(),
> > background_area.get_y() +
> > background_area.get_height() - 4,
> > background_area.get_width(),
> > 3 );
> > std::cout << "By here" << std::endl;
> > }
> >
> > But the cell appears empty. Here are is the model I defined:
>
> Of course it's empty.
> You should draw button (rectangle), color rectangle, and only then text
> layout inside.
> But wait, you set layout as empty... If you don't need text, then you
> shouldn't draw text layout at all.
>
> >
> > class ZoneModel : public Gtk::TreeModel::ColumnRecord
> > {
> > public:
> >
> > ZoneModel()
> > {
> > add(columnStart);
> > add(columnEnd);
> > add(columnColor);
> > }
> >
> > Gtk::TreeModelColumn< int > columnStart;
> > Gtk::TreeModelColumn< int > columnEnd;
> > Gtk::TreeModelColumn< Gdk::Color > columnColor;
> > };
> >
> > ZoneModel zoneModel;
> > Glib::RefPtr<Gtk::ListStore> referenceZones;
> > CellRendererColorButton* zoneColorRenderer;
> >
> > When I try assign the color value to the model I get this warning from
> > gtk:
> >
> > unable to set property `text' of type `gchararray' from value of type
> > `GdkColor'
> >
>
> You should create your cell renderer and add new column "manually" to
> TreeView.
>
> Then add attribute:
>
> TreeViewColumn* col = new TreeViewColumn( caption );
> YourCellRenderer* cr = new YourCellRenderer();
> column->pack_start( *cr, true );
> column->add_attribute( cr->property_color(), yourColumnModel.columnColor);
>
> -andrew
>
>
>
--
teratux
------------
http://teratux.blogspot.com
_______________________________________________
gtkmm-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list