treeview-tutorial-xml/examples/tree-model-filter/main-filter-rows.c

229 lines
6.1 KiB
C

#include <gtk/gtk.h>
#include "guitreemodelfilter.h"
/**************************************************************
* *
* Short demonstration of how to use GtkTreeModelFilter *
* to filter out certain rows of a tree model/tree view *
* *
* Note: we changed the namespace from GtkTreeModelFilter *
* to GuiTreeModelFilter here, in order to make this *
* demo work with Gtk+ versions < 2.3 *
* *
* GtkTreeModelFilter will be in Gtk+-2.4 and is already *
* in the (unstable) Gtk+-2.3 development series *
* *
* part of the GtkTreeView tutorial *
* written by Tim Mueller <tim @at@ centricular .dot. net> *
* *
**************************************************************/
enum
{
COL_NAME = 0,
COL_YEAR,
NUM_COLS
};
static GtkTreeModel *filter; /* NULL */
static guint minyear; /* 0 */
/**************************************************************
*
* filter_visible_function
*
* This is where the action is. Returns TRUE if
* the row should be visible, and FALSE if the
* row should be hidden
*
**************************************************************/
static gboolean
filter_visible_function (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
gint year;
gtk_tree_model_get(model, iter, COL_YEAR, &year, -1);
if (year < minyear)
return FALSE;
return TRUE;
}
/**************************************************************
*
* fill_list_store
*
**************************************************************/
static void
fill_list_store (GtkListStore *store)
{
const gchar *names[] = { "John B.", "Jane Z.", "Carl O.", "Owen P.", "Jeremy F.",
"Michael M.", "Ute D.", "Akira T.", "Thomas F.", "Matthew J."};
guint i;
for (i = 0; i < G_N_ELEMENTS(names); ++i)
{
GtkTreeIter iter;
guint randomyear;
randomyear = 1900 + (g_random_int() % 103);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_NAME, names[i],
COL_YEAR, randomyear,
-1);
}
}
/**************************************************************
*
* create_models_and_view
*
**************************************************************/
GtkWidget *
create_models_and_view (void)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *col;
GtkListStore *store;
GtkWidget *view;
store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_INT);
filter = gui_tree_model_filter_new(GTK_TREE_MODEL(store), NULL);
gui_tree_model_filter_set_visible_func(GUI_TREE_MODEL_FILTER(filter),
filter_visible_function,
NULL,
NULL);
fill_list_store(store);
/* set up the view */
view = gtk_tree_view_new_with_model(filter);
/* column 1: name */
renderer = gtk_cell_renderer_text_new();
col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, renderer, FALSE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_NAME);
gtk_tree_view_column_set_title(col, "Name");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
/* column 2: year of birth - note: COL_YEAR is of G_TYPE_INT,
* but it will automatically converted to a string
* (the "text" property/attribute requires a string) */
renderer = gtk_cell_renderer_text_new();
col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, renderer, FALSE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_YEAR);
gtk_tree_view_column_set_title(col, "Year Born");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
return view;
}
/**************************************************************
*
* onSpinButtonValueChanged
*
**************************************************************/
static void
onSpinButtonValueChanged (GtkSpinButton *spin, gpointer data)
{
g_assert(filter != NULL);
minyear = gtk_spin_button_get_value_as_int(spin);
gui_tree_model_filter_refilter(GUI_TREE_MODEL_FILTER(filter));
g_print("%s: %d\n", __FUNCTION__, minyear);
}
/**************************************************************
*
* create_spin_button_row
*
**************************************************************/
static GtkWidget *
create_spin_button_row (void)
{
GtkWidget *hbox, *spinbutton, *label;
hbox = gtk_hbox_new(FALSE, 2);
spinbutton = gtk_spin_button_new_with_range(1900.0, 2004.0, 1.0);
g_signal_connect(spinbutton, "value-changed", G_CALLBACK(onSpinButtonValueChanged), NULL);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), 1900.0);
label = gtk_label_new("Show all persons born after ");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
return hbox;
}
/**************************************************************
*
* fill_window
*
**************************************************************/
static void
fill_window(GtkWidget *mainwindow)
{
GtkWidget *vbox, *view, *spinrowhbox;
spinrowhbox = create_spin_button_row();
view = create_models_and_view();
vbox = gtk_vbox_new(FALSE,2);
gtk_box_pack_start(GTK_BOX(vbox), spinrowhbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), view, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(mainwindow), vbox);
}
/**************************************************************
*
* main
*
**************************************************************/
gint
main (gint argc, gchar **argv)
{
GtkWidget *mainwindow, *vbox;
gtk_init(&argc, &argv);
mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* quit when window close button is clicked */
g_signal_connect(mainwindow, "delete_event", gtk_main_quit, NULL); /* dirty */
fill_window(mainwindow);
gtk_widget_show_all(mainwindow);
gtk_main();
return 0;
}