prefs_common.display_folder_unread) {
if (item->unread > 0)
- str = g_strdup_printf("%s (%d%s)", name, item->unread,
- add_unread_mark ? "+" : "");
+ str = g_strdup_printf("%s (%d%s%s)", name, item->unread,
+ add_unread_mark ? "+" : "",
+ item->unreadmarked > 0 ? "!":"");
else
str = g_strdup_printf("%s (+)", name);
gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
g_free(str);
- } else
- gtk_ctree_set_node_info(ctree, node, name, FOLDER_SPACING,
+ } else {
+ str = g_strdup_printf("%s%s", name,
+ item->unreadmarked > 0 ? " (!)":"");
+
+ gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
+ g_free(str);
+ }
g_free(name);
if (!item->parent) {
use_color =
(item->new > 0) ||
(add_unread_mark &&
- folderview_have_new_children(folderview, node));
+ folderview_have_new_children(folderview, node));
}
gtk_ctree_node_set_foreground(ctree, node, NULL);
olditem = gtk_ctree_node_get_row_data(ctree, folderview->opened);
if (olditem) {
/* will be null if we just moved the previously opened folder */
- folder_item_write_cache(olditem);
summary_save_prefs_to_folderitem(folderview->summaryview, olditem);
folder_item_close(olditem);
}
main_window_cursor_normal(folderview->mainwin);
STATUSBAR_POP(folderview->mainwin);
- alertpanel_error(_("Folder cound not be opened."));
+ alertpanel_error(_("Folder could not be opened."));
return;
}
#endif
}
+static void folderview_recollapse_nodes(FolderView *folderview, GtkCTreeNode *node)
+{
+ GSList *list = NULL;
+ GSList *done = NULL;
+ GtkCTree *ctree = GTK_CTREE(folderview->ctree);
+
+ for (list = folderview->nodes_to_recollapse; list != NULL; list = g_slist_next(list)) {
+ if (!gtkut_ctree_node_is_parent(GTK_CTREE_NODE(list->data), node)
+ && list->data != node) {
+ gtk_ctree_collapse(ctree, GTK_CTREE_NODE(list->data));
+ done = g_slist_append(done, GTK_CTREE_NODE(list->data));
+ }
+ }
+ for (list = done; list != NULL; list = g_slist_next(list)) {
+ folderview->nodes_to_recollapse = g_slist_remove(folderview->nodes_to_recollapse,
+ list->data);
+ }
+ g_slist_free(done);
+}
+
static gboolean folderview_drag_motion_cb(GtkWidget *widget,
GdkDragContext *context,
gint x,
}
+ if (acceptable || (src_item && src_item == item)) {
+ folderview_recollapse_nodes(folderview, node);
+ if (item->collapsed) {
+ gtk_ctree_expand(GTK_CTREE(widget), node);
+ folderview->nodes_to_recollapse = g_slist_append(
+ folderview->nodes_to_recollapse,
+ node);
+ }
+ }
+
if (acceptable) {
gtk_signal_handler_block_by_func
(GTK_OBJECT(widget),
/* comes from folderview */
char *source;
char *buf;
+ gint status;
GtkCTreeNode *src_node;
FolderItem *new_item, *src_parent;
}
node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
item = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node);
- src_item = folder_find_item_from_path(source);
+ src_item = folder_find_item_from_identifier(source);
- if (!src_item || src_item->stype != F_NORMAL) {
+ if (!item || !src_item || src_item->stype != F_NORMAL) {
gtk_drag_finish(drag_context, FALSE, FALSE, time);
return;
}
buf = g_strdup_printf(_("Moving %s to %s..."), src_item->name, item->name);
STATUSBAR_PUSH(folderview->mainwin, buf);
g_free(buf);
- main_window_cursor_wait(folderview->mainwin);
+ summary_clear_all(folderview->summaryview);
+ folderview->opened = NULL;
+ folderview->selected = NULL;
gtk_widget_set_sensitive(folderview->ctree, FALSE);
inc_lock();
- if ((new_item = folder_item_move_to(src_item, item)) != NULL) {
+ main_window_cursor_wait(folderview->mainwin);
+ if ((status = folder_item_move_to(src_item, item, &new_item)) == F_MOVE_OK) {
+ main_window_cursor_normal(folderview->mainwin);
gtk_drag_finish(drag_context, TRUE, TRUE, time);
if (src_node)
else
debug_print("can't remove src node: is null\n");
+ STATUSBAR_POP(folderview->mainwin);
folderview_create_folder_node_recursive(folderview, new_item);
folder_update_item(src_parent, TRUE);
- folder_update_item_recursive(new_item, TRUE);
+ folder_update_item_recursive(new_item, TRUE);
folderview_sort_folders(folderview,
gtk_ctree_find_by_row_data(GTK_CTREE(widget),
NULL, new_item->parent), new_item->folder);
- STATUSBAR_PUSH(folderview->mainwin, _("Done."));
- main_window_cursor_normal(folderview->mainwin);
- summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
- folderview->selected = NULL;
folderview_select(folderview, new_item);
} else {
- gtk_drag_finish(drag_context, FALSE, FALSE, time);
- STATUSBAR_PUSH(folderview->mainwin, _("Done."));
main_window_cursor_normal(folderview->mainwin);
+ gtk_drag_finish(drag_context, FALSE, FALSE, time);
+ STATUSBAR_POP(folderview->mainwin);
+ switch (status) {
+ case F_MOVE_FAILED_DEST_IS_PARENT:
+ alertpanel_error(_("Source and destination are the same."));
+ break;
+ case F_MOVE_FAILED_DEST_IS_CHILD:
+ alertpanel_error(_("Can't move a folder to one of its children."));
+ break;
+ default:
+ alertpanel_error(_("Move failed!"));
+ break;
+ }
}
inc_unlock();
gtk_widget_set_sensitive(folderview->ctree, TRUE);
- statusbar_pop_all();
}
+ folderview->nodes_to_recollapse = NULL;
}
static gint folderview_clist_compare(GtkCList *clist,
list = gtk_target_list_new(folderview_drag_types, 1);
+ folderview->nodes_to_recollapse = NULL; /* in case the last drag has been cancelled */
+
context = gtk_drag_begin(widget, list,
GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event);
gtk_drag_set_icon_default(context);
(GTK_CTREE(folderview->ctree),
GTK_CTREE_NODE(cur->data));
if (item) {
- source = g_strdup_printf ("FROM_OTHER_FOLDER%s", item->path);
+ source = g_strdup_printf ("FROM_OTHER_FOLDER%s", folder_item_get_identifier(item));
gtk_selection_data_set(selection_data,
selection_data->target, 8,
source, strlen(source));