forked from AuroraMiddleware/gtk
1f93c4359c
2004-07-30 Matthias Clasen <mclasen@redhat.com> * gtk/gtkcombobox.h: * gtk/gtkcombobox.c: Change the api for separators to use a separator function instead of a boolean column. * tests/testcombo.c: Update to match the api change.
371 lines
12 KiB
C
371 lines
12 KiB
C
#include <config.h>
|
|
#include <gtk/gtk.h>
|
|
#include <gtk/gtkcellview.h>
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
/**
|
|
* oh yes, this test app surely has a lot of ugly code
|
|
*/
|
|
|
|
/* grid combo demo */
|
|
static GdkPixbuf *
|
|
create_color_pixbuf (const char *color)
|
|
{
|
|
GdkPixbuf *pixbuf;
|
|
GdkColor col;
|
|
|
|
int x;
|
|
int num;
|
|
int rowstride;
|
|
guchar *pixels, *p;
|
|
|
|
if (!gdk_color_parse (color, &col))
|
|
return NULL;
|
|
|
|
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
|
|
FALSE, 8,
|
|
16, 16);
|
|
|
|
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
|
p = pixels = gdk_pixbuf_get_pixels (pixbuf);
|
|
|
|
num = gdk_pixbuf_get_width (pixbuf) *
|
|
gdk_pixbuf_get_height (pixbuf);
|
|
|
|
for (x = 0; x < num; x++) {
|
|
p[0] = col.red / 65535 * 255;
|
|
p[1] = col.green / 65535 * 255;
|
|
p[2] = col.blue / 65535 * 255;
|
|
p += 3;
|
|
}
|
|
|
|
return pixbuf;
|
|
}
|
|
|
|
static GtkWidget *
|
|
create_combo_box_grid_demo ()
|
|
{
|
|
GtkWidget *combo;
|
|
GtkTreeIter iter;
|
|
GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
|
|
GtkListStore *store;
|
|
|
|
store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
|
|
|
|
combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
|
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
|
|
cell, TRUE);
|
|
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo),
|
|
cell, "pixbuf", 0, NULL);
|
|
gtk_combo_box_set_wrap_width (GTK_COMBO_BOX (combo),
|
|
3);
|
|
|
|
/* first row */
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("red"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("green"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("blue"),
|
|
-1);
|
|
|
|
/* second row */
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("yellow"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("black"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("white"),
|
|
-1);
|
|
|
|
/* third row */
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("gray"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("snow"),
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, create_color_pixbuf ("magenta"),
|
|
-1);
|
|
|
|
g_object_unref (store);
|
|
|
|
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
|
|
|
|
return combo;
|
|
}
|
|
|
|
/* blaat */
|
|
static GtkTreeModel *
|
|
create_blaat ()
|
|
{
|
|
GdkPixbuf *pixbuf;
|
|
GtkWidget *cellview;
|
|
GtkTreeIter iter;
|
|
GtkListStore *store;
|
|
|
|
cellview = gtk_cell_view_new ();
|
|
|
|
store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
|
|
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, pixbuf,
|
|
1, "gtk-stock-dialog-warning",
|
|
-1);
|
|
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_STOP,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, pixbuf,
|
|
1, "gtk-stock-stop",
|
|
-1);
|
|
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_NEW,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, pixbuf,
|
|
1, "gtk-stock-new",
|
|
-1);
|
|
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_CLEAR,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, pixbuf,
|
|
1, "gtk-stock-clear",
|
|
-1);
|
|
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, NULL,
|
|
1, "separator",
|
|
-1);
|
|
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_OPEN,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
gtk_list_store_append (store, &iter);
|
|
gtk_list_store_set (store, &iter,
|
|
0, pixbuf,
|
|
1, "gtk-stock-open",
|
|
-1);
|
|
|
|
gtk_widget_destroy (cellview);
|
|
|
|
return GTK_TREE_MODEL (store);
|
|
}
|
|
|
|
static void
|
|
setup_combo_entry (GtkWidget *entry_box)
|
|
{
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"dum de dum");
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"la la la");
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"la la la dum de dum la la la la la la boom de da la la");
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"bloop");
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"bleep");
|
|
gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
|
|
"klaas");
|
|
}
|
|
|
|
static void
|
|
set_sensitive (GtkCellLayout *cell_layout,
|
|
GtkCellRenderer *cell,
|
|
GtkTreeModel *tree_model,
|
|
GtkTreeIter *iter,
|
|
gpointer data)
|
|
{
|
|
GtkTreePath *path;
|
|
gint *indices;
|
|
gboolean sensitive;
|
|
|
|
path = gtk_tree_model_get_path (tree_model, iter);
|
|
indices = gtk_tree_path_get_indices (path);
|
|
sensitive = indices[0] != 1;
|
|
gtk_tree_path_free (path);
|
|
|
|
g_object_set (cell, "sensitive", sensitive, NULL);
|
|
}
|
|
|
|
static gboolean
|
|
is_separator (GtkTreeModel *model,
|
|
GtkTreeIter *iter,
|
|
gpointer data)
|
|
{
|
|
GtkTreePath *path;
|
|
gboolean result;
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
result = gtk_tree_path_get_indices (path)[0] == 4;
|
|
gtk_tree_path_free (path);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
GtkWidget *window, *cellview, *mainbox;
|
|
GtkWidget *combobox, *comboboxtext, *comboboxgrid;
|
|
GtkWidget *tmp, *boom;
|
|
GtkCellRenderer *renderer;
|
|
GdkPixbuf *pixbuf;
|
|
GtkTreeModel *model;
|
|
GValue value = {0, };
|
|
|
|
gtk_init (&argc, &argv);
|
|
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (window), 5);
|
|
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
|
|
|
|
mainbox = gtk_vbox_new (FALSE, 2);
|
|
gtk_container_add (GTK_CONTAINER (window), mainbox);
|
|
|
|
|
|
/* GtkCellView */
|
|
tmp = gtk_frame_new ("GtkCellView");
|
|
gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
|
|
|
|
boom = gtk_vbox_new (FALSE, 0);
|
|
gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
|
|
gtk_container_add (GTK_CONTAINER (tmp), boom);
|
|
|
|
cellview = gtk_cell_view_new ();
|
|
renderer = gtk_cell_renderer_pixbuf_new ();
|
|
pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
|
|
GTK_ICON_SIZE_BUTTON, NULL);
|
|
|
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
|
|
renderer,
|
|
FALSE);
|
|
g_value_init (&value, GDK_TYPE_PIXBUF);
|
|
g_value_set_instance (&value, pixbuf);
|
|
gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
|
|
renderer,
|
|
"pixbuf", &value,
|
|
NULL);
|
|
g_value_unset (&value);
|
|
|
|
renderer = gtk_cell_renderer_text_new ();
|
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
|
|
renderer,
|
|
TRUE);
|
|
g_value_init (&value, G_TYPE_STRING);
|
|
g_value_set_string (&value, "la la la");
|
|
gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
|
|
renderer,
|
|
"text", &value,
|
|
NULL);
|
|
g_value_unset (&value);
|
|
gtk_container_add (GTK_CONTAINER (boom), cellview);
|
|
|
|
|
|
/* GtkComboBox */
|
|
tmp = gtk_frame_new ("GtkComboBox");
|
|
gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
|
|
|
|
boom = gtk_vbox_new (FALSE, 0);
|
|
gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
|
|
gtk_container_add (GTK_CONTAINER (tmp), boom);
|
|
|
|
model = create_blaat ();
|
|
combobox = gtk_combo_box_new_with_model (model);
|
|
g_object_unref (model);
|
|
gtk_container_add (GTK_CONTAINER (boom), combobox);
|
|
|
|
renderer = gtk_cell_renderer_pixbuf_new ();
|
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
|
|
renderer,
|
|
FALSE);
|
|
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
|
|
"pixbuf", 0,
|
|
NULL);
|
|
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
|
|
renderer,
|
|
set_sensitive,
|
|
NULL, NULL);
|
|
|
|
renderer = gtk_cell_renderer_text_new ();
|
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
|
|
renderer,
|
|
TRUE);
|
|
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
|
|
"text", 1,
|
|
NULL);
|
|
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
|
|
renderer,
|
|
set_sensitive,
|
|
NULL, NULL);
|
|
gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox),
|
|
is_separator, NULL, NULL);
|
|
|
|
gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
|
|
|
|
|
|
/* GtkComboBox (grid mode) */
|
|
tmp = gtk_frame_new ("GtkComboBox (grid mode)");
|
|
gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
|
|
|
|
boom = gtk_vbox_new (FALSE, 0);
|
|
gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
|
|
gtk_container_add (GTK_CONTAINER (tmp), boom);
|
|
|
|
comboboxgrid = create_combo_box_grid_demo ();
|
|
gtk_box_pack_start (GTK_BOX (boom), comboboxgrid, FALSE, FALSE, 0);
|
|
|
|
|
|
/* GtkComboBoxEntry */
|
|
tmp = gtk_frame_new ("GtkComboBoxEntry");
|
|
gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
|
|
|
|
boom = gtk_vbox_new (FALSE, 0);
|
|
gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
|
|
gtk_container_add (GTK_CONTAINER (tmp), boom);
|
|
|
|
comboboxtext = gtk_combo_box_entry_new_text ();
|
|
setup_combo_entry (comboboxtext);
|
|
gtk_container_add (GTK_CONTAINER (boom), comboboxtext);
|
|
|
|
/* done */
|
|
gtk_widget_show_all (window);
|
|
|
|
gtk_main ();
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* vim:expandtab
|
|
*/
|