/* * Copyright (C) 2010 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by * Neil Jagdish Patel * Mikkel Kamstrup Erlandsen * * Compile with: * * gcc synced-lists.c -o synced-lists `pkg-config --libs --cflags dee-1.0 gtk+-2.0` * */ #include #include #include #include #include #include static DeeModel *model; static GtkWidget *window; static GtkWidget *list; static GtkListStore *store; static void on_row_added (DeeModel *model, DeeModelIter *iter) { gint i = 0; gchar *str = NULL; GtkTreeIter titer; dee_model_get (model, iter, &i, &str); gtk_list_store_append (store, &titer); gtk_list_store_set (store, &titer, 0, g_strdup_printf ("%d", i), 1, str, 2, iter, -1); g_free (str); } static void on_row_removed (DeeModel *model, DeeModelIter *old_iter) { GtkTreeIter iter = { 0}; gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); do { gpointer data = NULL; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &data, -1); if (data == old_iter) { gtk_list_store_remove (store, &iter); break; } } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } static void on_row_changed (DeeModel *model, DeeModelIter *row_iter) { GtkTreeIter iter = { 0 }; gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); do { gpointer data = NULL; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &data, -1); if (data == row_iter) { gint i = 0; gchar *str = NULL; dee_model_get (model, row_iter, &i, &str); gtk_list_store_set (store, &iter, 0, g_strdup_printf ("%d", i), 1, str, -1); break; } } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } static void add_row (GtkWidget *button) { dee_model_append (model, (gint)getpid (), "Wazza"); } static void remove_row (GtkWidget *button) { GtkTreeSelection *sel; GtkTreeIter iter; sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list)); if (gtk_tree_selection_get_selected (sel, NULL, &iter)) { gpointer data = NULL; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &data, -1); dee_model_remove (model, data); } else g_debug ("No selection to delete"); } static void clear_rows (GtkWidget *button) { dee_model_clear (model); } static void on_cell_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer old_data) { GtkTreeIter iter; if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path)) { gpointer data = NULL; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &data, -1); dee_model_set (model, (DeeModelIter *)data, new_text); } } gint main (gint argc, gchar *argv[]) { GtkWidget *vbox, *hbox, *scroll, *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_resize (GTK_WINDOW (window), 300, 600); gtk_container_set_border_width (GTK_CONTAINER (window), 12); vbox = gtk_vbox_new (FALSE, 12); gtk_container_add (GTK_CONTAINER (window), vbox); button = gtk_label_new (g_strdup_printf ("My PID: %d", getpid())); g_object_set (button, "use-markup", TRUE, NULL); gtk_misc_set_alignment (GTK_MISC (button), 0.5, 0.5); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); scroll = gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0); gtk_widget_show (scroll); list = gtk_tree_view_new (); gtk_container_add (GTK_CONTAINER (scroll), list); gtk_widget_show (list); { GtkCellRenderer *cell; GtkTreeViewColumn *col; cell = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("0", cell, "text", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), col); cell = gtk_cell_renderer_text_new (); g_object_set (cell, "editable", TRUE, NULL); g_signal_connect (cell, "edited", G_CALLBACK (on_cell_edited), NULL); col = gtk_tree_view_column_new_with_attributes ("1", cell, "text", 1, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), col); } hbox = gtk_hbox_new (TRUE, 12); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); button = gtk_button_new_from_stock (GTK_STOCK_ADD); gtk_container_add (GTK_CONTAINER (hbox), button); g_signal_connect (button, "clicked", G_CALLBACK (add_row), NULL); button = gtk_button_new_from_stock (GTK_STOCK_REMOVE); gtk_container_add (GTK_CONTAINER (hbox), button); g_signal_connect (button, "clicked", G_CALLBACK (remove_row), NULL); button = gtk_button_new_from_stock (GTK_STOCK_CLEAR); gtk_container_add (GTK_CONTAINER (hbox), button); g_signal_connect (button, "clicked", G_CALLBACK (clear_rows), NULL); gtk_widget_show_all (window); store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); gtk_tree_view_set_model (GTK_TREE_VIEW (list), GTK_TREE_MODEL (store)); model = dee_shared_model_new ("com.canonical.Dbus.Model.Example"); dee_model_set_schema (model, "i", "s", NULL); g_signal_connect (model, "row-added", G_CALLBACK (on_row_added), NULL); g_signal_connect (model, "row-removed", G_CALLBACK (on_row_removed), NULL); g_signal_connect (model, "row-changed", G_CALLBACK (on_row_changed), NULL); gtk_main (); return 0; }