LINUX.ORG.RU

GTK+ TreeView


0

0

Есть функция, которая считывает наименование директорий и добавляет в TreeView.

gboolean 
load_folders_list(const gchar *device)
{
	GtkCellRenderer 	*renderer = NULL;
	GtkTreeStore 		*store = NULL;
	GtkTreeIter			root_iter;
	GtkTreeViewColumn	*column = NULL;
	gint				result = 0;
	gint				len = 0;
	gpointer			data = NULL;
	FILE 				*fp = NULL;
	gchar				file_name[MAX_BUFFER_SIZE];
	gchar 				line[MAX_BUFFER_SIZE];
	gchar 				folder_name[MAX_BUFFER_SIZE];
	gchar				*str_ptr = NULL;
	
	data = g_object_get_data (G_OBJECT(main_window), "folders_treeview");
	if (data == NULL || !GTK_IS_TREE_VIEW(data)) 
		return FALSE;

	gtk_tree_store_clear (GTK_TREE_VIEW (data));
	
	DEBUG ("Call obexftp...");
	result = call_system ("obexftp -b %s -l >~/.folders-list.xml", device);	
	DEBUG ("system(): result = %d", result);
	
	if (result != 0)
		return FALSE;
	
	memset (file_name, 0, MAX_BUFFER_SIZE);
	strcpy (file_name, getenv ("HOME"));
	strcat (file_name, "/.folders-list.xml");
	
	fp = fopen (file_name, "r+");
	if (fp == NULL)
	{
		ERROR ("Cann't open file '%s'", file_name);
		return FALSE;
	}
	
	renderer = gtk_cell_renderer_text_new ();
	store = gtk_tree_store_new (1, G_TYPE_STRING );

	column = gtk_tree_view_get_column (GTK_TREE_VIEW(data), 0);
	if (column == NULL)
	{
		column = gtk_tree_view_column_new_with_attributes (
			"Folder", renderer, "text", 0, NULL);		
		gtk_tree_view_column_set_title (column, "Folder name" );
		gtk_tree_view_append_column (GTK_TREE_VIEW (data), column);	
	}

	gtk_tree_store_set_column_types (GTK_TREE_VIEW (data), 1, G_TYPE_STRING);
	gtk_tree_store_append (store, &root_iter, NULL);
	gtk_tree_store_set (store, &root_iter, 0, "Folders", -1);	
	
	while (fgets (line, MAX_BUFFER_SIZE, fp))
	{
		len = strlen (line);
		while (line[len] == '\n' || line[len] == '\r' || line[len] == '\x00')
		{
			line[len] = '\x00';
			if (--len < 0) 
				break;
		}
		str_ptr = strstr (line, "<folder name=");
		if (str_ptr == NULL)
			continue;
		if (1 != sscanf (str_ptr, "<folder name=\"%[^\"]\"/>", folder_name))
			continue;
		DEBUG ("Folder name = %s", folder_name);
		append_folder_name (store, folder_name, root_iter);
	}

	fclose (fp);
	
	gtk_widget_queue_draw (GTK_WIDGET (data));
	
	return TRUE;
}

Но почему-то дерево (TreeView) пустое. В чем проблема? 

static GtkTreeIter
append_folder_name (GtkTreeStore *store, const gchar *folder_name, GtkTreeIter root_iter)
{
	GtkTreeIter   iter;
	
	gtk_tree_store_append (store, &iter, &root_iter);
	gtk_tree_store_set (store, &iter, 0, folder_name, -1);

	return iter;	
}

daemon73 ★★
() автор топика
Ответ на: комментарий от daemon73

Начнем хотя бы с этого

gtk_tree_store_clear (GTK_TREE_VIEW (data));

Есть TreeStore - то, где хранится данные. Есть TreeView, где они отображаются. Не нужно их путать, а вместо этого разобраться в вопросе.

Во-вторых, неправильно работающая программа пишет в консоль предупреждения. Их полезно читать.

В-третьих, желательно писать работающие примеры, а не куски функций. Потраченное на написание работающего примера время не потеряется, возможно, ошибка сама прояснится.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.