# HG changeset patch # User nadvornik # Date 1216672829 0 # Node ID ca8022a156ec41ef6a8634fad1b4ab3b17d2c8e7 # Parent f81a212e7642745afa5fbd88990efefbd052ab77 added notification handler to view_dir diff -r f81a212e7642 -r ca8022a156ec src/utilops.c --- a/src/utilops.c Mon Jul 21 08:31:43 2008 +0000 +++ b/src/utilops.c Mon Jul 21 20:40:29 2008 +0000 @@ -707,6 +707,7 @@ if ((internal && mkdir_utf8(ud->dir_fd->path, 0755)) || (!internal && ext_result)) { + file_data_increment_version(ud->dir_fd); file_data_send_notification(ud->dir_fd, NOTIFY_TYPE_REREAD); } else diff -r f81a212e7642 -r ca8022a156ec src/view_dir.c --- a/src/view_dir.c Mon Jul 21 08:31:43 2008 +0000 +++ b/src/view_dir.c Mon Jul 21 20:40:29 2008 +0000 @@ -26,6 +26,8 @@ #include "view_dir_list.h" #include "view_dir_tree.h" +static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data); + GtkRadioActionEntry menu_view_dir_radio_entries[] = { { "FolderList", NULL, N_("_List"), "L", NULL, DIRVIEW_LIST }, { "FolderTree", NULL, N_("_Tree"), "T", NULL, DIRVIEW_TREE }, @@ -35,6 +37,8 @@ { ViewDir *vd = data; + file_data_unregister_notify_func(vd_notify_cb, vd); + if (vd->popup) { g_signal_handlers_disconnect_matched(G_OBJECT(vd->popup), G_SIGNAL_MATCH_DATA, @@ -106,6 +110,8 @@ if (dir_fd) vd_set_fd(vd, dir_fd); + file_data_register_notify_func(vd_notify_cb, vd, NOTIFY_PRIORITY_HIGH); + gtk_widget_show(vd->view); return vd; @@ -219,18 +225,11 @@ new_path = g_build_filename(base, new, NULL); g_free(base); - if (file_util_rename_dir(fd, new_path, vd->view)) + file_util_rename_dir(fd, new_path, vd->view); + + if (vd->layout && vd->dir_fd != fd) { - - if (vd->type == DIRVIEW_TREE) vdtree_populate_path(vd, fd, TRUE, TRUE); - if (vd->layout && vd->dir_fd != fd) /* FIXME */ - { - layout_set_path(vd->layout, new_path); - } - else - { - if (vd->type == DIRVIEW_LIST) vd_refresh(vd); - } + layout_set_path(vd->layout, new_path); } g_free(new_path); @@ -506,31 +505,28 @@ static void vd_pop_menu_new_cb(GtkWidget *widget, gpointer data) { ViewDir *vd = data; - const gchar *path = NULL; - gchar *new_path; - gchar *buf; + FileData *dir_fd = NULL; switch(vd->type) { case DIRVIEW_LIST: { if (!vd->dir_fd) return; - path = vd->dir_fd->path; + dir_fd = vd->dir_fd; }; break; case DIRVIEW_TREE: { if (!vd->click_fd) return; - path = vd->click_fd->path; + dir_fd = vd->click_fd; }; break; } - buf = g_build_filename(path, _("new_folder"), NULL); - new_path = unique_filename(buf, NULL, NULL, FALSE); - g_free(buf); - if (!new_path) return; + file_util_create_dir(dir_fd, widget); +/* FIXME:*/ +#if 0 if (!mkdir_utf8(new_path, 0755)) { gchar *text; @@ -561,8 +557,7 @@ } vd_rename_by_data(vd, fd); } - - g_free(new_path); +#endif } static void vd_pop_menu_rename_cb(GtkWidget *widget, gpointer data) @@ -1039,3 +1034,58 @@ return ret; } + +static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data) +{ + ViewDir *vd = data; + gboolean refresh; + gchar *base; + + if (!isdir(fd->path) && isname(fd->path)) return; + + base = remove_level_from_path(fd->path); + + if (vd->type == DIRVIEW_LIST) + { + refresh = (fd == vd->dir_fd); + + if (!refresh) + { + refresh = (strcmp(base, vd->dir_fd->path) == 0); + } + + if (type == NOTIFY_TYPE_CHANGE && fd->change) + { + if (!refresh && fd->change->dest) + { + gchar *dest_base = remove_level_from_path(fd->change->dest); + refresh = (strcmp(dest_base, vd->dir_fd->path) == 0); + g_free(dest_base); + } + + if (!refresh && fd->change->source) + { + gchar *source_base = remove_level_from_path(fd->change->source); + refresh = (strcmp(source_base, vd->dir_fd->path) == 0); + g_free(source_base); + } + } + + if (refresh) vd_refresh(vd); + } + + if (vd->type == DIRVIEW_TREE) + { + GtkTreeIter iter; + FileData *base_fd = file_data_new_simple(base); + + if (vd_find_row(vd, base_fd, &iter)) + { + vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd); + } + + file_data_unref(base_fd); + } + + g_free(base); +} \ No newline at end of file diff -r f81a212e7642 -r ca8022a156ec src/view_dir_tree.c --- a/src/view_dir_tree.c Mon Jul 21 08:31:43 2008 +0000 +++ b/src/view_dir_tree.c Mon Jul 21 20:40:29 2008 +0000 @@ -41,8 +41,6 @@ -static gint vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gint force, FileData *target_fd); - /* *---------------------------------------------------------------------------- @@ -381,6 +379,7 @@ nd = g_new0(NodeData, 1); nd->fd = fd; + nd->version = fd->version; nd->expanded = FALSE; nd->last_update = time(NULL); @@ -418,7 +417,7 @@ } } -static gint vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gint force, FileData *target_fd) +gint vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gint force, FileData *target_fd) { GtkTreeModel *store; GList *list; @@ -446,7 +445,7 @@ vdtree_node_free(nd); return FALSE; } - if (!force && filetime(nd->fd->path) == nd->fd->date) return TRUE; + if (!force && nd->fd->version == nd->version) return TRUE; } vdtree_busy_push(vd); @@ -513,11 +512,11 @@ if (cnd) { old = g_list_remove(old, cnd); - if (cnd->expanded && cnd->fd->date != fd->date && + if (cnd->expanded && cnd->version != fd->version && vdtree_populate_path_by_iter(vd, &child, FALSE, target_fd)) { - cnd->fd->size = fd->size; - cnd->fd->date = fd->date; + gtk_tree_store_set(store, &child, DIR_COLUMN_NAME, fd->name, -1); + cnd->version = fd->version; } file_data_unref(fd); diff -r f81a212e7642 -r ca8022a156ec src/view_dir_tree.h --- a/src/view_dir_tree.h Mon Jul 21 08:31:43 2008 +0000 +++ b/src/view_dir_tree.h Mon Jul 21 20:40:29 2008 +0000 @@ -19,6 +19,7 @@ FileData *fd; gint expanded; time_t last_update; + gint version; }; ViewDir *vdtree_new(ViewDir *vd, FileData *dir_fd); @@ -30,6 +31,7 @@ const gchar *vdtree_row_get_path(ViewDir *vd, gint row); gint vdtree_find_row(ViewDir *vd, FileData *fd, GtkTreeIter *iter, GtkTreeIter *parent); +gint vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gint force, FileData *target_fd); FileData *vdtree_populate_path(ViewDir *vd, FileData *target_fd, gint expand, gint force); void vdtree_rename_by_data(ViewDir *vd, FileData *fd);