I'm new to Gtk, so I'm not sure if I've looked in the right places yet, 
but I have tried to RTFM before asking these two questions.

I'm working on Windows XP with MSYS/Mingw and GTK+ 2.10.11 and I'm using 
Glade/libglade to define the UI.  I've pasted in the relevant source 
code, which is very much a "work in progress", at the end of this message.

First question - is there any (preferably easy) way with a GtkTreeView 
to make any editable cell that is selected automatically enter edit mode 
and automatically commit the changes when focus moves elsewhere?

Second - in the application that I'm trying to develop I have a 
GtkTreeview with data in a GtkListStore and some, but not all, of the 
cells editable.  If I have a cell selected, but not opened for editing 
(this includes non-editable cells) and I then start typing, an editable 
box appears in the bottom right-hand corner of the GtkTreeView, which 
displays what I'm typing.  If I press enter, it goes away and the text 
of the selected cell is not updated.  Does anyone know why this odd 
behaviour is happening and what I can do to stop it?

Here are the relevant bits of source code:

/* Notebook Page Numbers */
enum {
     NB_PAGE_TITLE,
     NB_PAGE_LABOUR
};

/* List column numbers */
enum {
     LABOUR_GROUP,
     LABOUR_OPS_SHIFT,
     LABOUR_SHIFTS,
     LABOUR_TOTAL_OPS,
     LABOUR_OVERTIME,
     LABOUR_HIRE,
     LABOUR_FIRE,
     LABOUR_RETRAIN_FROM,
     LABOUR_RETRAIN_TO,
     LABOUR_LEFT_PAD,
     LABOUR_N_COLUMNS
};

#ifdef G_OS_WIN32
     #define HANDLER __declspec(dllexport)
#endif

void labour_cell_edited (GtkCellRendererText *cell,
                          gchar               *path_string,
                          gchar               *new_text,
                          gpointer             model) {
     if(!model) {g_error("Unable to get model from cell renderer");}
     GtkTreeIter row;
     gtk_tree_model_get_iter_from_string(model, &row, path_string);
     guint column_no = GPOINTER_TO_UINT(g_object_get_data(
                                             G_OBJECT(cell), "column_no"));
     g_print("Column :%d, new text: \"%s\"\n", column_no, new_text);
};

HANDLER void on_labour_menu_item_activate(GtkWidget *widget, gpointer 
user_data) {
     gtk_notebook_set_current_page(
                 GTK_NOTEBOOK(glade_xml_get_widget(xml, "main_notebook")),
                 NB_PAGE_LABOUR);
     GtkTreeView *view = GTK_TREE_VIEW(glade_xml_get_widget(xml, 
"labour_treeview"));

     /* If the TreeView hasn't been intialised, we set it up here */
     gtk_tree_view_set_grid_lines(view, GTK_TREE_VIEW_GRID_LINES_BOTH);
     if (!gtk_tree_view_get_model(view)) {
         GtkListStore *new_store = gtk_list_store_new (LABOUR_N_COLUMNS,
                                                       G_TYPE_STRING,
                                                       G_TYPE_INT,
                                                       G_TYPE_INT,
                                                       G_TYPE_INT,
                                                       G_TYPE_DOUBLE,
                                                       G_TYPE_INT,
                                                       G_TYPE_INT,
                                                       G_TYPE_INT,
                                                       G_TYPE_INT,
                                                       G_TYPE_STRING);
         gtk_tree_view_set_model(view, GTK_TREE_MODEL(new_store));

         GtkCellRenderer *renderer;
         GtkTreeViewColumn *column;

         /* Labour Group */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes (
                                         "Labour Group", renderer,
                                         "text", LABOUR_GROUP,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Ops Per Shift */
         renderer = gtk_cell_renderer_text_new();
         g_object_set_data(G_OBJECT(renderer), "column_no",
                           GUINT_TO_POINTER(LABOUR_OPS_SHIFT));
         g_object_set(renderer, "editable", TRUE, "xalign", 1.0, NULL);
         g_signal_connect(renderer, "edited",
                          (GCallback) labour_cell_edited,
                          gtk_tree_view_get_model(view));
         column = gtk_tree_view_column_new_with_attributes (
                                         "Operators/Shift", renderer,
                                         "text", LABOUR_OPS_SHIFT,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Shifts */
         renderer = gtk_cell_renderer_text_new();
         g_object_set(renderer, /*"editable", TRUE,*/ "xalign", 1.0, NULL);
         column = gtk_tree_view_column_new_with_attributes (
                                         "Shifts", renderer,
                                         "text", LABOUR_SHIFTS,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Total operators */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes (
                                         "Total Operators", renderer,
                                         "text", LABOUR_TOTAL_OPS,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Overtime */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes (
                                         "Overtime Hrs/Op.", renderer,
                                         "text", LABOUR_OVERTIME,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Hire */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes (
                                         "Hire", renderer,
                                         "text", LABOUR_HIRE,
                                         NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Fire */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes ("Fire",
                                                            renderer,
                                                            "text",
                                                            LABOUR_FIRE,
                                                            NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Retrain From */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes ("Retrain From",
                                                            renderer,
                                                            "text",
 
LABOUR_RETRAIN_FROM,
                                                            NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Retrain To */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes ("Retrain To",
                                                            renderer,
                                                            "text",
 
LABOUR_RETRAIN_TO,
                                                            NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);

         /* Padding */
         renderer = gtk_cell_renderer_text_new();
         column = gtk_tree_view_column_new_with_attributes ("",
                                                            renderer,
                                                            "text",
                                                            LABOUR_LEFT_PAD,
                                                            NULL);
         gtk_tree_view_column_set_resizable (column, TRUE);
         gtk_tree_view_column_set_alignment(column, 1.0);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
    }

     /* Now we clear any existing data in the model and load data from
        the labour file */
     GtkListStore *model = GTK_LIST_STORE(gtk_tree_view_get_model(view));
     gtk_list_store_clear(model);
     gchar *work_path;
     if (team_mode) {
         work_path = g_key_file_get_string(app_rc_key_file, "Paths",
                                           "team_work_path", NULL);
     }
     else {
         work_path = g_key_file_get_string(app_rc_key_file, "Paths",
                                           "personal_path", NULL);
     }
     gchar *labour_path = g_build_filename (work_path, LABOUR_FILE_NAME, 
NULL);
     g_free(work_path);
     GIOChannel *channel = g_io_channel_new_file(labour_path, "r", NULL);
     GString *line = g_string_new("");
     while ((g_io_channel_read_line_string(channel, line,
                                           NULL, NULL)) == 
G_IO_STATUS_NORMAL) {
         gchar *group;
         group = g_strstrip(g_strndup(line->str, 16));
         gchar *field;
         field = g_strndup(line->str + 16, 4);
         gint ops_shift = g_ascii_strtoll(field, NULL, 10);
         g_free(field);
         field = g_strndup(line->str + 20, 3);
         gint shifts = g_ascii_strtoll(field, NULL, 10);
         g_free(field);
         field = g_strndup(line->str + 23, 5);
         gdouble overtime = g_ascii_strtod(field, NULL);
         g_free(field);
         GtkTreeIter row;
         gtk_list_store_append(model, &row);
         gtk_list_store_set(model, &row,
                            LABOUR_GROUP,        group,
                            LABOUR_OPS_SHIFT,    ops_shift,
                            LABOUR_SHIFTS,       shifts,
                            LABOUR_TOTAL_OPS,    ops_shift * shifts,
                            LABOUR_OVERTIME,     overtime,
                            LABOUR_HIRE,         0,
                            LABOUR_FIRE,         0,
                            LABOUR_RETRAIN_FROM, 0,
                            LABOUR_RETRAIN_TO,   0,
                            -1);
         g_free(group);
     }
     g_io_channel_shutdown(channel, FALSE, NULL);
     g_io_channel_unref(channel);
}


Any hints to where I should be looking will be much appeciated.

TIA

Tony Cowderoy

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to