On 08/27/2018 01:24 AM, David C. Rankin wrote:
>   "How do I use the pointer stored in column 2 of the model to set the
> selection on that treeview entry?"
> 
> (the full source of the interface is https://github.com/drankinatty/gtkate
> which is just a concept at the moment, the project will provide the
> functionality of https://github.com/drankinatty/gtkwrite within a
> multi-document/multi-view interface when done)
> 
>   I have not worked with tree models/stores a great deal and I am a bit
> bewildered by how to get an iter or treepath given the value of column 2 to
> then set the selection on that row/entry in the treeview. I guess I could do a
> for_each and loop over the pointers, but I'm unsure if that is the correct way
> or one of my logical hacks that would be better implemented some other way.
> 

Well,

  I'm not sure this was the best way to go about it, but from the callback
from the "focus-in-event" signal from the textview, I call the following which
uses the pointer to the textview buffer to compare for equality against the
pointer held in each treemodel instance pointer. This gives me the GtkTreeIter
that I can then use with gtk_tree_selection_select_iter(), e.g.

/** given inst use tree iter to set focus on current view
 *  (widget is textview associated with window clicked inside)
 */
void tree_get_inst_iter (GtkWidget *widget, gpointer data)
{
    mainwin_t *app = data;
    GtkTreeModel *model = NULL;
    GtkTreeSelection *selection;
    GtkTreeIter iter;
    gpointer buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(widget));
    gboolean valid, found = FALSE;

    /* initialize selection to current */
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(app->treeview));

    /* get treemodel, validate */
    model = gtk_tree_view_get_model(GTK_TREE_VIEW(app->treeview));
    if (!model) {
        g_print ("error: tree_view_get_model - failed.\n");
        return;
    }

    /* get first iter, return in validate */
    valid = gtk_tree_model_get_iter_first (model, &iter);
    while (valid) {         /* loop over each entry in model */
        gchar *str = NULL;
        kinst_t *inst = NULL;

        /* TODO - remove COLNAME & str after debugging done */
        gtk_tree_model_get (model, &iter,   /* get name & inst */
                            COLNAME, &str, COLINST, &inst, -1);

        /* compare pointer to sourceview with buf from textview (widget) */
        if ((gpointer)(inst->buf) == buf) {
            gtk_tree_selection_select_iter (selection, &iter);
            g_free (str);
            found = TRUE;
            break;
        }
        g_free (str);

        valid = gtk_tree_model_iter_next (model, &iter);
    }

    if (!found)
        g_warning ("tree_get_inst_iter inst not found.");

    if (widget) {}
}


-- 
David C. Rankin, J.D.,P.E.
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to