がんばって英語で書くブログ
英語勉強中なので、ブログも英語で書こうかと。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GTK+ studying8
This is GTK+ memo. using tree view(it can single and multi select)


#include <gtk/gtk.h>
#define USE_MULTI_SELECT 1

static void print_selected_text(gpointer data, gpointer user_data)
{
gchar *text;
GtkTreePath *path = (GtkTreePath *) data;
GtkTreeModel *model = (GtkTreeModel *) user_data;
GtkTreeIter ite;
int idx = 0;

idx = gtk_tree_path_get_indices(path)[0];
gtk_tree_model_get_iter(model, &ite, path);

gtk_tree_model_get(model, &ite, 0, &text, -1);

g_print("selected text is [%d:%s]\n", idx, text);
}

static gboolean button_clicked(GtkWidget *widget,
gpointer data)
{
GList *list;
GtkWidget *tree = (GtkWidget *) data;
GtkTreeSelection *selection;
GtkTreeModel *model;

selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));

#ifdef USE_MULTI_SELECT
list = gtk_tree_selection_get_selected_rows(selection, &model);
g_list_foreach(list, print_selected_text, model);
#else
if (gtk_tree_selection_get_selected(selection, &model, &ite)) {
gchar *text;

gtk_tree_model_get(model, &ite, 0, &text, -1);
g_print("selected value is [%s]\n",text);
g_free(text);
}
#endif /* USE_MULTI_SELECT */

return FALSE;
}

static GtkWidget *create_button(void *data)
{
GtkWidget *button;

button = gtk_button_new_with_label("ok");
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(button_clicked), data);

return button;
}

static GtkWidget *create_tree(void)
{
GtkWidget *tree;
GtkTreeViewColumn *col;
GtkListStore *model;
GtkTreeIter ite;
GtkCellRenderer *cell;
int i = 0;
model = gtk_list_store_new(1, G_TYPE_STRING);

tree = gtk_tree_view_new();
gtk_tree_view_set_model(GTK_TREE_VIEW(tree),
GTK_TREE_MODEL(model));

for (i = 0; i < 5; i++) {
gchar *msg = g_strdup_printf("test%d", i);

gtk_list_store_append(GTK_LIST_STORE(model), &ite);
gtk_list_store_set(GTK_LIST_STORE(model), &ite,
0, msg, -1);
g_free(msg);
}

cell = gtk_cell_renderer_text_new();
col = gtk_tree_view_column_new_with_attributes("messages",
cell,
"text",
0,
NULL);

gtk_tree_view_append_column(GTK_TREE_VIEW(tree),
GTK_TREE_VIEW_COLUMN(col));

return tree;
}

static gboolean cursor_changed(GtkWidget *widget,
gpointer data)
{
GtkTreeSelection *selection;
gint cnt = 0;

selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
cnt = gtk_tree_selection_count_selected_rows(selection) + 1;

g_print("count is %d\n", cnt);

return TRUE;
}

void create_window(void)
{
GtkWidget *window;
GtkWidget *hbox;
GtkWidget *vbox1;
GtkWidget *vbox2;
GtkWidget *button;
GtkWidget *separator;
GtkWidget *tree;
GtkTreeSelection *selection;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "tree view test");

gtk_container_set_border_width(GTK_CONTAINER(window), 5);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

hbox = gtk_hbox_new(FALSE, 0);
vbox1 = gtk_vbox_new(FALSE,0);
vbox2 = gtk_vbox_new(FALSE, 0);

gtk_container_add(GTK_CONTAINER(vbox1), hbox);

tree = create_tree();
gtk_widget_set_size_request(GTK_WIDGET(tree), 180, 200);

selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));

#ifdef USE_MULTI_SELECT
/* we can multi select */
gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
#endif /* USE_MULTI_SELECT */
g_signal_connect(G_OBJECT(tree), "cursor-changed",
G_CALLBACK(cursor_changed), NULL);

gtk_box_pack_start(GTK_BOX(hbox), tree, TRUE, TRUE, 0);

gtk_widget_show(tree);

gtk_widget_show(hbox);

gtk_container_add(GTK_CONTAINER(window), vbox1);
gtk_widget_show(vbox1);

separator = gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(vbox1), separator, FALSE, TRUE, 0);
gtk_widget_show(separator);

button = create_button(tree);
gtk_box_pack_start(GTK_BOX(vbox2), button, TRUE, TRUE, 0);
gtk_widget_show(button);

gtk_container_add(GTK_CONTAINER(vbox1), vbox2);
gtk_widget_show(vbox2);

gtk_widget_show(window);

}

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);

create_window();

gtk_main();

return 0;
}


スポンサーサイト

テーマ:英語日記 - ジャンル:学問・文化・芸術

この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://foobar.blog23.fc2.com/tb.php/164-3bc4170b
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。