Blame demos/gtk-demo/iconview_edit.c

Packit Service fb6fa5
/* Icon View/Editing and Drag-and-Drop
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * The GtkIconView widget supports Editing and Drag-and-Drop.
Packit Service fb6fa5
 * This example also demonstrates using the generic GtkCellLayout
Packit Service fb6fa5
 * interface to set up cell renderers in an icon view.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include "demo-common.h"
Packit Service fb6fa5
Packit Service fb6fa5
static GtkWidget *window = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
enum
Packit Service fb6fa5
{
Packit Service fb6fa5
  COL_TEXT,
Packit Service fb6fa5
  NUM_COLS
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
fill_store (GtkListStore *store)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  const gchar *text[] = { "Red", "Green", "Blue", "Yellow" };
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
Packit Service fb6fa5
  /* First clear the store */
Packit Service fb6fa5
  gtk_list_store_clear (store);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 4; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_list_store_append (store, &iter);
Packit Service fb6fa5
      gtk_list_store_set (store, &iter, COL_TEXT, text[i], -1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkListStore *
Packit Service fb6fa5
create_store (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkListStore *store;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING);
Packit Service fb6fa5
Packit Service fb6fa5
  return store;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
set_cell_color (GtkCellLayout   *cell_layout,
Packit Service fb6fa5
		GtkCellRenderer *cell,
Packit Service fb6fa5
		GtkTreeModel    *tree_model,
Packit Service fb6fa5
		GtkTreeIter     *iter,
Packit Service fb6fa5
		gpointer         data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar *text;
Packit Service fb6fa5
  GdkColor color;
Packit Service fb6fa5
  guint32 pixel = 0;
Packit Service fb6fa5
  GdkPixbuf *pixbuf;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get (tree_model, iter, COL_TEXT, &text, -1);
Packit Service fb6fa5
  if (gdk_color_parse (text, &color))
Packit Service fb6fa5
    pixel =
Packit Service fb6fa5
      (color.red   >> 8) << 24 |
Packit Service fb6fa5
      (color.green >> 8) << 16 |
Packit Service fb6fa5
      (color.blue  >> 8) << 8;
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (text);
Packit Service fb6fa5
Packit Service fb6fa5
  pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 24, 24);
Packit Service fb6fa5
  gdk_pixbuf_fill (pixbuf, pixel);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_set (cell, "pixbuf", pixbuf, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (pixbuf);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
edited (GtkCellRendererText *cell,
Packit Service fb6fa5
	gchar               *path_string,
Packit Service fb6fa5
	gchar               *text,
Packit Service fb6fa5
	gpointer             data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_icon_view_get_model (GTK_ICON_VIEW (data));
Packit Service fb6fa5
  path = gtk_tree_path_new_from_string (path_string);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get_iter (model, &iter, path);
Packit Service fb6fa5
  gtk_list_store_set (GTK_LIST_STORE (model), &iter,
Packit Service fb6fa5
		      COL_TEXT, text, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
do_iconview_edit (GtkWidget *do_widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkWidget *icon_view;
Packit Service fb6fa5
      GtkListStore *store;
Packit Service fb6fa5
      GtkCellRenderer *renderer;
Packit Service fb6fa5
Packit Service fb6fa5
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_window_set_screen (GTK_WINDOW (window),
Packit Service fb6fa5
			     gtk_widget_get_screen (do_widget));
Packit Service fb6fa5
      gtk_window_set_title (GTK_WINDOW (window), "Editing and Drag-and-Drop");
Packit Service fb6fa5
Packit Service fb6fa5
      g_signal_connect (window, "destroy",
Packit Service fb6fa5
			G_CALLBACK (gtk_widget_destroyed), &window);
Packit Service fb6fa5
Packit Service fb6fa5
      store = create_store ();
Packit Service fb6fa5
      fill_store (store);
Packit Service fb6fa5
Packit Service fb6fa5
      icon_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store));
Packit Service fb6fa5
      g_object_unref (store);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view),
Packit Service fb6fa5
					GTK_SELECTION_SINGLE);
Packit Service fb6fa5
      gtk_icon_view_set_orientation (GTK_ICON_VIEW (icon_view),
Packit Service fb6fa5
				     GTK_ORIENTATION_HORIZONTAL);
Packit Service fb6fa5
      gtk_icon_view_set_columns (GTK_ICON_VIEW (icon_view), 2);
Packit Service fb6fa5
      gtk_icon_view_set_reorderable (GTK_ICON_VIEW (icon_view), TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
      renderer = gtk_cell_renderer_pixbuf_new ();
Packit Service fb6fa5
      gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
Packit Service fb6fa5
				  renderer, TRUE);
Packit Service fb6fa5
      gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (icon_view),
Packit Service fb6fa5
					  renderer,
Packit Service fb6fa5
					  set_cell_color,
Packit Service fb6fa5
					  NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      renderer = gtk_cell_renderer_text_new ();
Packit Service fb6fa5
      gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view),
Packit Service fb6fa5
				  renderer, TRUE);
Packit Service fb6fa5
      g_object_set (renderer, "editable", TRUE, NULL);
Packit Service fb6fa5
      g_signal_connect (renderer, "edited", G_CALLBACK (edited), icon_view);
Packit Service fb6fa5
      gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
Packit Service fb6fa5
				      renderer,
Packit Service fb6fa5
				      "text", COL_TEXT,
Packit Service fb6fa5
				      NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_container_add (GTK_CONTAINER (window), icon_view);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_widget_get_visible (window))
Packit Service fb6fa5
    gtk_widget_show_all (window);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_widget_destroy (window);
Packit Service fb6fa5
      window = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return window;
Packit Service fb6fa5
}
Packit Service fb6fa5