Automatically expand any row activated

This commit is contained in:
Pierre Pronchery 2011-08-14 23:37:27 +00:00
parent 52d5423958
commit 68e041270b

View File

@ -38,6 +38,16 @@ typedef struct _Dirtree
GtkWidget * view; GtkWidget * view;
} Dirtree; } Dirtree;
enum _DirtreeColumn
{
DC_ICON,
DC_NAME,
DC_PATH,
DC_UPDATED
} DirtreeColumn;
#define DC_LAST DC_UPDATED
#define DC_COUNT (DC_LAST + 1)
/* prototypes */ /* prototypes */
static GtkWidget * _dirtree_init(BrowserPlugin * plugin); static GtkWidget * _dirtree_init(BrowserPlugin * plugin);
@ -104,11 +114,11 @@ static GtkWidget * _dirtree_init(BrowserPlugin * plugin)
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
/* backend store */ /* backend store */
dirtree->store = gtk_tree_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING, dirtree->store = gtk_tree_store_new(DC_COUNT, GDK_TYPE_PIXBUF,
G_TYPE_STRING, G_TYPE_BOOLEAN); G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
gtk_tree_store_insert(dirtree->store, &iter, NULL, -1); gtk_tree_store_insert(dirtree->store, &iter, NULL, -1);
gtk_tree_store_set(dirtree->store, &iter, 0, dirtree->folder, 1, "/", gtk_tree_store_set(dirtree->store, &iter, DC_ICON, dirtree->folder,
2, "/", 3, TRUE, -1); DC_NAME, "/", DC_PATH, "/", DC_UPDATED, TRUE, -1);
/* sorted store */ /* sorted store */
dirtree->sorted = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL( dirtree->sorted = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(
dirtree->store)); dirtree->store));
@ -255,9 +265,10 @@ static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
/* FIXME check if the node already exists */ /* FIXME check if the node already exists */
r = (q != NULL) ? g_filename_display_basename(q) : NULL; r = (q != NULL) ? g_filename_display_basename(q) : NULL;
gtk_tree_store_insert(dirtree->store, &iter, parent, -1); gtk_tree_store_insert(dirtree->store, &iter, parent, -1);
gtk_tree_store_set(dirtree->store, &iter, 0, dirtree->folder, gtk_tree_store_set(dirtree->store, &iter,
1, (r != NULL) ? r : de->d_name, 2, q, 3, TRUE, DC_ICON, dirtree->folder,
-1); DC_NAME, (r != NULL) ? r : de->d_name,
DC_PATH, q, DC_UPDATED, TRUE, -1);
if(recurse) if(recurse)
_dirtree_refresh_folder(plugin, &iter, q, NULL, _dirtree_refresh_folder(plugin, &iter, q, NULL,
(basename != NULL) ? TRUE : FALSE); (basename != NULL) ? TRUE : FALSE);
@ -276,7 +287,7 @@ static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
valid == TRUE; valid = (b == TRUE) valid == TRUE; valid = (b == TRUE)
? gtk_tree_model_iter_next(model, &iter) ? gtk_tree_model_iter_next(model, &iter)
: gtk_tree_store_remove(dirtree->store, &iter)) : gtk_tree_store_remove(dirtree->store, &iter))
gtk_tree_model_get(model, &iter, 3, &b, -1); gtk_tree_model_get(model, &iter, DC_UPDATED, &b, -1);
/* return the parent if appropriate */ /* return the parent if appropriate */
if(t != NULL) if(t != NULL)
{ {
@ -314,8 +325,9 @@ static void _dirtree_on_row_activated(GtkTreeView * view, GtkTreePath * path,
GtkTreeIter iter; GtkTreeIter iter;
gchar * location; gchar * location;
gtk_tree_view_expand_row(view, path, FALSE);
gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, 2, &location, -1); gtk_tree_model_get(model, &iter, DC_PATH, &location, -1);
plugin->helper->set_location(plugin->helper->browser, location); plugin->helper->set_location(plugin->helper->browser, location);
g_free(location); g_free(location);
} }
@ -335,7 +347,7 @@ static void _dirtree_on_row_expanded(GtkTreeView * view, GtkTreeIter * iter,
return; return;
gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT( gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(
dirtree->sorted), &child, iter); dirtree->sorted), &child, iter);
gtk_tree_model_get(model, &child, 2, &p, -1); gtk_tree_model_get(model, &child, DC_PATH, &p, -1);
_dirtree_refresh_folder(plugin, &child, p, NULL, TRUE); _dirtree_refresh_folder(plugin, &child, p, NULL, TRUE);
g_free(p); g_free(p);
} }