【发布时间】:2018-09-25 21:20:31
【问题描述】:
我最近在尝试在 GTK 中创建项目视图时遇到了一个问题。问题是我的程序不断删除文件并将其添加到项目目录中,但为了解决这些更改,需要清除并重新填充项目树视图的 TreeStore。当 TreeStore 被清除并重新填充时,TreeView 项目会折叠其所有标题。举个例子:
这是程序在 MainProject 下添加另一个名为“SubProject2”的文件夹之前的项目视图,清除 TreeModel,并用相同的目录重新填充它。
请注意,文件夹“SubProject2”已正确添加到“MainProject”下,但 TreeView 折叠了“MainProject”。
我当前用于重新填充 TreeView 的代码如下:
void populate_directory_tree_store(GtkTreeStore *treestore, const char *directory, GtkTreeIter *toplevel) {
DIR *dir;
struct dirent *entry;
GtkTreeIter child;
if (!(dir = opendir(directory)))
return;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
char path[1024];
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
snprintf(path, sizeof(path), "%s/%s", directory, entry->d_name);
gtk_tree_store_append(treestore, &child, toplevel);
gtk_tree_store_set(treestore, &child,
0, entry->d_name,
-1);
populate_directory_tree_store(treestore, path, &child);
}
else {
gtk_tree_store_append(treestore, &child, toplevel);
gtk_tree_store_set(treestore, &child,
0, entry->d_name,
-1);
}
}
closedir(dir);
}
每次更改项目目录时,我都会这样调用函数:
gtk_tree_store_clear(treestore);
populate_directory_tree_store(treestore, "C:\\Projects", &topIterator);
我曾考虑使用 libfswatch (located here) 之类的库来实时检测目录更改并随每次更改更改项目 TreeView,但它需要多线程。我不知道我是否忽略了 GtkTreeView 中的某些内容,但是这种微不足道的事情应该不会那么困难。如果您有任何问题或反馈,请发布。
谢谢你, 维卡斯
【问题讨论】: