Problems Re-populating GtkTreeView



All,

I've been working at this for several days now and I'm hoping someone
can guide me down the right path (although I'm not opposed to just being
given the answer).  Let me say TIA now and I apologize if I've included
too much code, error messages, etc.

Thanks,

Andrew

I have one treeview that displays system information.  Clicking a row in
this treeview causes a second listview to be populated with the
components that comprise the selected system assembly.  For example, if
Motherboard were selected in treeview 'sys_tree', then the listview
'part_tree' would be populated with microprocessor, etc.

The first time I select an item in the 'sys_tree' treeview, the
'part_tree' listview populates and all is well.  The second, and
subsequent, selections in the 'sys_tree' treeview don't populate the
'part_tree' listview.  

The following is thrown in the terminal.

(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_row_reference_new_proxy:
assertion `GTK_IS_TREE_MODEL (model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_set_property:
assertion `G_IS_VALUE (value)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_value_unset: assertion
`G_IS_VALUE (value)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_unref_node: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): Gtk-CRITICAL **: gtk_tree_model_iter_next: assertion
`GTK_IS_TREE_MODEL (tree_model)' failed
(reliafree:32523): GLib-GObject-WARNING **: instance with invalid (NULL)
class pointer
(reliafree:32523): GLib-GObject-CRITICAL **:
g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE
(instance)' failed
(reliafree:32523): GLib-GObject-WARNING **: instance with invalid (NULL)
class pointer
(reliafree:32523): GLib-GObject-CRITICAL **:
g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE
(instance)' failed
(reliafree:32523): GLib-GObject-WARNING **: instance with invalid (NULL)
class pointer
(reliafree:32523): GLib-GObject-CRITICAL **:
g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE
(instance)' failed
(reliafree:32523): GLib-GObject-WARNING **: instance with invalid (NULL)
class pointer
(reliafree:32523): GLib-GObject-CRITICAL **:
g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE
(instance)' failed
(reliafree:32523): GLib-GObject-WARNING **: instance with invalid (NULL)
class pointer
(reliafree:32523): GLib-GObject-CRITICAL **:
g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE
(instance)' failed
(reliafree:32523): GLib-GObject-CRITICAL **: g_object_unref: assertion
`G_IS_OBJECT (object)' failed

Using gdb, I've found that they're not being thrown until the program
returns to the main loop function g_main_loop_run in gmain.c at (lines
2880-2881)

        while (loop->is_running)
            g_main_context_iterate (loop->context, TRUE, TRUE, self);

and then only after 2 or 3 dozen loops.

This is the callback function for the system treeview:
****************************** CODE ******************************
void system_tree_clicked_cb( GtkTreeView *tree, GdkEventButton *butt )
{

    GtkTreeIter iter;
    GtkTreePath *path;
    GtkTreeSelection *selection;

    SELECTED_TREE = 1;

    switch ( butt->button )
    {
        case (1):

            selection =
gtk_tree_view_get_selection( GTK_TREE_VIEW( sys_tree ) );

            if (gtk_tree_selection_get_selected( selection, NULL,
&iter ))
            {
                path =
gtk_tree_model_get_path( GTK_TREE_MODEL( sys_store ), &iter );

                /* Get the selected item's information from the tree. */
                if
(gtk_tree_model_get_iter( GTK_TREE_MODEL( sys_store ), &iter, path ) )
                {
                    read_system_tree( GTK_TREE_MODEL( sys_store ),
&path, &iter, NULL );

                    if ( ! populate_system_general_tab( pSystemItem ) )
                    {
                        printf("Error populating the general tab for
Assembly %d.\n", pSystemItem.assemblyID );
                    }

                    if ( !
populate_part_tree( pSystemItem.assemblyID ) )
                    {
                        printf("Error populating the parts list for
Assembly %d.\n", pSystemItem.assemblyID );
                    }
                }
            }
            break;

<SNIP> (Just the other three buttons that are unused ATM)

    }

    return;

}
*************************** END CODE ***************************

This is the function that retrieves the components from the MySQL
database and populates the listview:
****************************** CODE ******************************
gboolean populate_part_tree( gint id )
{

    GtkTreeIter iter;

    gchar query[60];

    MYSQL_RES *result;
    MYSQL_ROW row=NULL;

    gtk_list_store_clear( GTK_LIST_STORE ( part_store ) );

    switch ( SELECTED_TREE )
    {
        case (1):
            sprintf( query,"SELECT * FROM PARTS WHERE AssemblyID=%u \
                                     ORDER BY PartID", id );
            break;

        default:
            printf( "Error: Unknown tree selected!\n" );
            break;
    }

    mysql_real_query( &mysqlconn, query, (unsigned
int)strlen( query ) );
    result = mysql_store_result( &mysqlconn );

    if( result )
    {
        printf( "Selected %lu rows for parts list.\n", (unsigned
long)mysql_affected_rows( &mysqlconn ) );
    }
    else
    {
        fprintf( stderr, "Error %d: %s\n", mysql_errno( &mysqlconn ),
mysql_error( &mysqlconn ) );
        return FALSE;
    }

    if( mysql_num_rows( result ) == 0 )
    {

          gtk_list_store_append( GTK_LIST_STORE( part_store ), &iter );
          gtk_list_store_set( GTK_LIST_STORE( part_store ), &iter,
                                           COLUMN_PN, "Part Num",
                                           COLUMN_REFDES, "Ref Des",
                                           COLUMN_CLASS, "Class",
                                           COLUMN_SUBCLASS, "Subclass",
                                           COLUMN_QUANT, (gint) 1,
                                           COLUMN_HR, (gdouble) 0.0,
                                           COLUMN_ID, (gint) 0,
                                           -1);
     }
    else
    {
        while ( ( row = mysql_fetch_row( result ) ) )
        {
            gtk_list_store_append ( GTK_LIST_STORE( part_store ),
&iter );
            gtk_list_store_set( GTK_LIST_STORE( part_store ), &iter,
                                             COLUMN_PN, row[6],
                                             COLUMN_REFDES, row[7],
                                             COLUMN_CLASS, row[3],
                                             COLUMN_SUBCLASS, row[4],
                                             COLUMN_QUANT,
atoi( row[19] ),
                                             COLUMN_HR, atof( row[34] ),
                                             COLUMN_ID, atoi( row[0] ),
                                             -1);
        }
    }

    mysql_free_result( result );
    part_model = GTK_TREE_MODEL( part_store );
    gtk_tree_view_set_model( GTK_TREE_VIEW( part_tree ), part_model );
    g_object_unref( part_model );

    gtk_tree_view_expand_all( GTK_TREE_VIEW( part_tree ) );

    return TRUE;
*************************** END CODE **************************

These are the applicable sections from the Glade file for the two
treeviews.  Let me know if you need more.
****************************** CODE *****************************
                  <widget class="GtkScrolledWindow"
id="system_tree_scroll_window">
                    <property name="width_request">600</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property
name="shadow_type">GTK_SHADOW_IN</property>
                    <child>
                      <widget class="GtkTreeView" id="tree_System">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="tooltip"
translatable="yes">Indentured display of the currently selected system
tree...</property>
                        <property
name="enable_tree_lines">True</property>
                      </widget>
                    </child>
                  </widget>

<SNIP>

                  <widget class="GtkScrolledWindow"
id="part_list_scroll_window">
                    <property name="width_request">250</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property
name="shadow_type">GTK_SHADOW_IN</property>
                    <child>
                      <widget class="GtkTreeView" id="tree_Parts">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="tooltip" translatable="yes">List
of parts for the currently selected assembly in the system
tree ...</property>
                        <property
name="enable_grid_lines">GTK_TREE_VIEW_GRID_LINES_HORIZONTAL</property>
                      </widget>
*************************** END CODE **************************
-- 
Andrew "Weibullguy" Rowland
Reliability & Safety Engineer

darowland ieee org
http://webpages.charter.net/weibullguy
http://reliafree.sourceforge.net


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