Re: inserting ColorButton in CellRenderer ....



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:

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'

Can anyone help me??
Thanks

On Fri, Mar 14, 2008 at 11:10 AM, Andrew E. Makeev <andrew solvo ru> wrote:
В Птн, 14/03/2008 в 10:43 -0400, Roberto Alejandro Espí Muñoz пишет:
> Ok I saw it .. What I don't understand is why do you have to paint the
> widget from scratch?? and check if it is active, or toggled to paint
> that particular behaviour?? isn't there a simpler way to just add it
> to the cell and call the widget's own paint function?? The widget I
> want is a little more complex it has an inner rectangle showing the
> current color.

Because it is not QT :).

TreeView was designed to hold and show lot of data from TreeModel. If
each cell was represented as widget it could increase CPU usage
dramatically and slow down the View.

So, you must to draw the widget "from scratch" using cell area. There is
no other way.

The states and flags I am checking is used to draw my cell properly -
selected, checked/toggled, etc.

See GTK sources.

-andrew





--
teratux
------------
http://teratux.blogspot.com


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]