#include <gtk/gtk.h>
#if GTK_MAJOR_VERSION == 2
static void on_up(GtkWidget *btn, gpointer user_data)
{
GtkTreeSelection *sel = GTK_TREE_SELECTION(user_data);
GtkTreeModel *model;
GtkTreeIter current;
GtkTreePath *path;
gtk_tree_selection_get_selected(sel, &model, ¤t);
path = gtk_tree_model_get_path(model, ¤t);
gtk_tree_path_prev(path);
gtk_tree_selection_select_path(sel, path);
gtk_tree_path_free(path);
}
static void on_down(GtkWidget *btn, gpointer user_data)
{
GtkTreeSelection *sel = GTK_TREE_SELECTION(user_data);
GtkTreeModel *model;
GtkTreeIter current;
GtkTreePath *path;
gtk_tree_selection_get_selected(sel, &model, ¤t);
path = gtk_tree_model_get_path(model, ¤t);
gtk_tree_path_next(path);
gtk_tree_selection_select_path(sel, path);
gtk_tree_path_free(path);
}
#elif GTK_MAJOR_VERSION == 3
static void on_up(GtkWidget *btn, gpointer user_data)
{
GtkTreeSelection *sel = GTK_TREE_SELECTION(user_data);
GtkTreeModel *model;
GtkTreeIter current;
gtk_tree_selection_get_selected(sel, &model, ¤t);
if (gtk_tree_model_iter_previous(model, ¤t))
gtk_tree_selection_select_iter(sel, ¤t);
}
static void on_down(GtkWidget *btn, gpointer user_data)
{
GtkTreeSelection *sel = GTK_TREE_SELECTION(user_data);
GtkTreeModel *model;
GtkTreeIter current;
gtk_tree_selection_get_selected(sel, &model, ¤t);
if (gtk_tree_model_iter_next(model, ¤t))
gtk_tree_selection_select_iter(sel, ¤t);
}
#endif
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
GtkTreeIter iter;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "One item", 1, FALSE, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Two items", 1, TRUE, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Last item", 1, FALSE, -1);
GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
g_object_unref(G_OBJECT(store));
GtkCellRenderer *render = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes
(GTK_TREE_VIEW(view), -1, "String", render, "text", 0, NULL);
gtk_tree_view_insert_column_with_attributes
(GTK_TREE_VIEW(view), -1, "Bool", render, "text", 1, NULL);
#if GTK_MAJOR_VERSION == 2
GtkWidget *vbox = gtk_vbox_new(FALSE, 4);
GtkWidget *hbox = gtk_hbox_new(FALSE, 4);
#else
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
#endif
GtkWidget *btn_up = gtk_button_new_with_label("Up");
GtkWidget *btn_down = gtk_button_new_with_label("Down");
gtk_box_pack_start(GTK_BOX(vbox), btn_up, FALSE, FALSE, 4);
gtk_box_pack_start(GTK_BOX(vbox), btn_down, FALSE, FALSE, 4);
GtkTreeSelection *selection =
gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
g_signal_connect
(G_OBJECT(btn_up), "clicked", G_CALLBACK(on_up), selection);
g_signal_connect
(G_OBJECT(btn_down), "clicked", G_CALLBACK(on_down), selection);
gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 4);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
g_signal_connect(window, "delete-event", gtk_main_quit, NULL);
gtk_main();
}