Hi.
Below you'll find a small application that demonstrates how to share data between various components of your app. Usually, data in GTK+ apps is shared by passing some common structure to all signals as a last parameter. You can achieve greater data encapsulation if you create custom widgets for various components of your GUI, but that's a bit advanced to do with your current level of knowledge. But in time, I'm sure you'll get there.
So, here is the code:
Code:
#include <gtk/gtk.h>
enum
{
F_NAME,
L_NAME,
NO_COLS
};
typedef struct _Data
{
GtkListStore *store;
GtkEntry *fname,
*lname;
GtkTreeSelection *sel;
}
Data;
static GtkListStore *
create_store (void)
{
GtkListStore *store;
GtkTreeIter iter;
char const *fnames[] = {"John", "Emma", "Fido"};
char const *lnames[] = {"King", "Jones", "The Dog"};
int limit, i;
limit = G_N_ELEMENTS (fnames);
store = gtk_list_store_new (NO_COLS, G_TYPE_STRING, G_TYPE_STRING);
for (i = 0; i < limit; i++)
{
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, F_NAME, fnames[i],
L_NAME, lnames[i], -1);
}
return store;
}
static void
sel_changed (GtkTreeSelection *sel,
Data *data)
{
GtkTreeIter iter;
GtkTreeModel *model;
char *fname, *lname;
if (!gtk_tree_selection_get_selected (data->sel, &model, &iter))
return;
gtk_tree_model_get (model, &iter, F_NAME, &fname, L_NAME, &lname, -1);
gtk_entry_set_text (data->fname, fname);
gtk_entry_set_text (data->lname, lname);
g_free (fname);
g_free (lname);
}
static void
update (GtkButton *button,
Data *data)
{
GtkTreeIter iter;
if (!gtk_tree_selection_get_selected (data->sel, NULL, &iter))
return;
gtk_list_store_set (data->store, &iter,
F_NAME, gtk_entry_get_text (data->fname),
L_NAME, gtk_entry_get_text (data->lname),
-1);
}
static void
add (GtkButton *button,
Data *data)
{
GtkTreeIter iter;
gtk_list_store_append (data->store, &iter);
gtk_list_store_set (data->store, &iter,
F_NAME, gtk_entry_get_text (data->fname),
L_NAME, gtk_entry_get_text (data->lname),
-1);
}
int
main (int argc,
char **argv)
{
GtkWidget *window,
*vbox,
*swindow,
*tree,
*hbox,
*entry,
*button;
GtkTreeSelection *sel;
Data *data;
gtk_init (&argc, &argv);
data = g_slice_new (Data);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_add (GTK_CONTAINER (window), vbox);
swindow = gtk_scrolled_window_new (NULL, NULL);
gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
data->store = create_store ();
tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (data->store));
g_object_unref (data->store);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1,
"First name",
gtk_cell_renderer_text_new (),
"text", F_NAME, NULL);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1,
"Last name",
gtk_cell_renderer_text_new (),
"text", L_NAME, NULL);
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
data->sel = sel;
gtk_tree_selection_set_mode (sel, GTK_SELECTION_BROWSE);
g_signal_connect (sel, "changed", G_CALLBACK (sel_changed), data);
gtk_container_add (GTK_CONTAINER (swindow), tree);
hbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
entry = gtk_entry_new ();
data->fname = GTK_ENTRY (entry);
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
entry = gtk_entry_new ();
data->lname = GTK_ENTRY (entry);
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
button = gtk_button_new_with_label ("Update");
g_signal_connect (button, "clicked", G_CALLBACK (update), data);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
button = gtk_button_new_with_label ("Add");
g_signal_connect (button, "clicked", G_CALLBACK (add), data);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
gtk_widget_show_all (window);
gtk_main ();
g_slice_free (Data, data);
return 0;
}
Cheers,
Tadej