Commit 87d96729 authored by Marcus Carlson's avatar Marcus Carlson Committed by Cosimo Cecchi

Adds Trashed On and Original Location as columns in List View

And also an 'Arrange by Trash Time' option in Icon View.

https://bugzilla.gnome.org/show_bug.cgi?id=89706
parent be643d69
......@@ -128,6 +128,20 @@ get_builtin_columns (void)
/* TODO: Change after string freeze over */
"description", _("Location"),
NULL));
columns = g_list_append (columns,
g_object_new (NAUTILUS_TYPE_COLUMN,
"name", "trashed_on",
"attribute", "trashed_on",
"label", _("Trashed On"),
"description", _("Date when file was moved to the Trash"),
NULL));
columns = g_list_append (columns,
g_object_new (NAUTILUS_TYPE_COLUMN,
"name", "trash_orig_path",
"attribute", "trash_orig_path",
"label", _("Original Location"),
"description", _("Original location of file before moved to the Trash"),
NULL));
return columns;
}
......
......@@ -40,7 +40,7 @@
#define NAUTILUS_FILE_TOP_LEFT_TEXT_MAXIMUM_BYTES 1024
#define NAUTILUS_FILE_DEFAULT_ATTRIBUTES \
"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path,metadata::*"
"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path,trash::deletion-date,metadata::*"
/* These are in the typical sort order. Known things come first, then
* things where we can't know, finally things where we don't yet know.
......@@ -226,6 +226,8 @@ struct NautilusFileDetails
eel_boolean_bit filesystem_readonly : 1;
eel_boolean_bit filesystem_use_preview : 2; /* GFilesystemPreviewType */
eel_boolean_bit filesystem_info_is_up_to_date : 1;
time_t trash_time; /* 0 is unknown */
};
typedef struct {
......
......@@ -130,6 +130,8 @@ static GQuark attribute_name_q,
attribute_deep_directory_count_q,
attribute_deep_total_count_q,
attribute_date_changed_q,
attribute_trashed_on_q,
attribute_trash_orig_path_q,
attribute_date_permissions_q,
attribute_permissions_q,
attribute_selinux_context_q,
......@@ -467,6 +469,7 @@ nautilus_file_clear_info (NautilusFile *file)
file->details->mtime = 0;
file->details->atime = 0;
file->details->ctime = 0;
file->details->trash_time = 0;
g_free (file->details->symlink_name);
file->details->symlink_name = NULL;
eel_ref_str_unref (file->details->mime_type);
......@@ -2052,6 +2055,9 @@ update_info_internal (NautilusFile *file,
goffset size;
int sort_order;
time_t atime, mtime, ctime;
time_t trash_time;
GTimeVal g_trash_time;
const char * time_string;
const char *symlink_name, *mime_type, *selinux_context, *name, *thumbnail_path;
GFileType file_type;
GIcon *icon;
......@@ -2415,6 +2421,17 @@ update_info_internal (NautilusFile *file,
file->details->filesystem_id = eel_ref_str_get_unique (filesystem_id);
}
trash_time = 0;
time_string = g_file_info_get_attribute_string (info, "trash::deletion-date");
if (time_string != NULL) {
g_time_val_from_iso8601 (time_string, &g_trash_time);
trash_time = g_trash_time.tv_sec;
}
if (file->details->trash_time != trash_time) {
changed = TRUE;
file->details->trash_time = trash_time;
}
trash_orig_path = g_file_info_get_attribute_byte_string (info, "trash::orig-path");
if (eel_strcmp (file->details->trash_orig_path, trash_orig_path) != 0) {
changed = TRUE;
......@@ -2668,6 +2685,9 @@ get_time (NautilusFile *file,
case NAUTILUS_DATE_TYPE_ACCESSED:
time = file->details->atime;
break;
case NAUTILUS_DATE_TYPE_TRASHED:
time = file->details->trash_time;
break;
default:
g_assert_not_reached ();
break;
......@@ -3182,6 +3202,12 @@ nautilus_file_compare_for_sort (NautilusFile *file_1,
result = compare_by_full_path (file_1, file_2);
}
break;
case NAUTILUS_FILE_SORT_BY_TRASHED_TIME:
result = compare_by_time (file_1, file_2, NAUTILUS_DATE_TYPE_TRASHED);
if (result == 0) {
result = compare_by_full_path (file_1, file_2);
}
break;
case NAUTILUS_FILE_SORT_BY_EMBLEMS:
/* GnomeVFS doesn't know squat about our emblems, so
* we handle comparing them here, before falling back
......@@ -3245,6 +3271,11 @@ nautilus_file_compare_for_sort_by_attribute_q (NautilusFile
NAUTILUS_FILE_SORT_BY_ATIME,
directories_first,
reversed);
} else if (attribute == attribute_trashed_on_q) {
return nautilus_file_compare_for_sort (file_1, file_2,
NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
directories_first,
reversed);
} else if (attribute == attribute_emblems_q) {
return nautilus_file_compare_for_sort (file_1, file_2,
NAUTILUS_FILE_SORT_BY_EMBLEMS,
......@@ -4340,6 +4371,7 @@ nautilus_file_get_date (NautilusFile *file,
g_return_val_if_fail (date_type == NAUTILUS_DATE_TYPE_CHANGED
|| date_type == NAUTILUS_DATE_TYPE_ACCESSED
|| date_type == NAUTILUS_DATE_TYPE_MODIFIED
|| date_type == NAUTILUS_DATE_TYPE_TRASHED
|| date_type == NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED, FALSE);
if (file == NULL) {
......@@ -4579,6 +4611,30 @@ nautilus_file_fit_modified_date_as_string (NautilusFile *file,
width, measure_callback, truncate_callback, measure_context);
}
static char *
nautilus_file_get_trash_original_file_parent_as_string (NautilusFile *file)
{
NautilusFile *orig_file, *parent;
GFile *location;
char *filename;
if (file->details->trash_orig_path != NULL) {
orig_file = nautilus_file_get_trash_original_file (file);
parent = nautilus_file_get_parent (orig_file);
location = nautilus_file_get_location (parent);
filename = g_file_get_parse_name (location);
g_object_unref (location);
nautilus_file_unref (parent);
nautilus_file_unref (orig_file);
return filename;
}
return NULL;
}
/**
* nautilus_file_get_date_as_string:
*
......@@ -6008,7 +6064,7 @@ nautilus_file_get_deep_directory_count_as_string (NautilusFile *file)
* set includes "name", "type", "mime_type", "size", "deep_size", "deep_directory_count",
* "deep_file_count", "deep_total_count", "date_modified", "date_changed", "date_accessed",
* "date_permissions", "owner", "group", "permissions", "octal_permissions", "uri", "where",
* "link_target", "volume", "free_space", "selinux_context"
* "link_target", "volume", "free_space", "selinux_context", "trashed_on", "trashed_orig_path"
*
* Returns: Newly allocated string ready to display to the user, or NULL
* if the value is unknown or @attribute_name is not supported.
......@@ -6046,6 +6102,9 @@ nautilus_file_get_string_attribute_q (NautilusFile *file, GQuark attribute_q)
if (attribute_q == attribute_deep_total_count_q) {
return nautilus_file_get_deep_total_count_as_string (file);
}
if (attribute_q == attribute_trash_orig_path_q) {
return nautilus_file_get_trash_original_file_parent_as_string (file);
}
if (attribute_q == attribute_date_modified_q) {
return nautilus_file_get_date_as_string (file,
NAUTILUS_DATE_TYPE_MODIFIED);
......@@ -6058,6 +6117,10 @@ nautilus_file_get_string_attribute_q (NautilusFile *file, GQuark attribute_q)
return nautilus_file_get_date_as_string (file,
NAUTILUS_DATE_TYPE_ACCESSED);
}
if (attribute_q == attribute_trashed_on_q) {
return nautilus_file_get_date_as_string (file,
NAUTILUS_DATE_TYPE_TRASHED);
}
if (attribute_q == attribute_date_permissions_q) {
return nautilus_file_get_date_as_string (file,
NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED);
......@@ -6183,6 +6246,14 @@ nautilus_file_get_string_attribute_with_default_q (NautilusFile *file, GQuark at
if (attribute_q == attribute_mime_type_q) {
return g_strdup (_("unknown MIME type"));
}
if (attribute_q == attribute_trashed_on_q) {
/* If n/a */
return g_strdup ("");
}
if (attribute_q == attribute_trash_orig_path_q) {
/* If n/a */
return g_strdup ("");
}
/* Fallback, use for both unknown attributes and attributes
* for which we have no more appropriate default.
......@@ -6204,6 +6275,7 @@ nautilus_file_is_date_sort_attribute_q (GQuark attribute_q)
attribute_q == attribute_accessed_date_q ||
attribute_q == attribute_date_accessed_q ||
attribute_q == attribute_date_changed_q ||
attribute_q == attribute_trashed_on_q ||
attribute_q == attribute_date_permissions_q) {
return TRUE;
}
......@@ -7916,6 +7988,8 @@ nautilus_file_class_init (NautilusFileClass *class)
attribute_deep_directory_count_q = g_quark_from_static_string ("deep_directory_count");
attribute_deep_total_count_q = g_quark_from_static_string ("deep_total_count");
attribute_date_changed_q = g_quark_from_static_string ("date_changed");
attribute_trashed_on_q = g_quark_from_static_string ("trashed_on");
attribute_trash_orig_path_q = g_quark_from_static_string ("trash_orig_path");
attribute_date_permissions_q = g_quark_from_static_string ("date_permissions");
attribute_permissions_q = g_quark_from_static_string ("permissions");
attribute_selinux_context_q = g_quark_from_static_string ("selinux_context");
......
......@@ -61,7 +61,8 @@ typedef enum {
NAUTILUS_FILE_SORT_BY_TYPE,
NAUTILUS_FILE_SORT_BY_MTIME,
NAUTILUS_FILE_SORT_BY_ATIME,
NAUTILUS_FILE_SORT_BY_EMBLEMS
NAUTILUS_FILE_SORT_BY_EMBLEMS,
NAUTILUS_FILE_SORT_BY_TRASHED_TIME
} NautilusFileSortType;
typedef enum {
......@@ -487,7 +488,8 @@ typedef enum {
NAUTILUS_DATE_TYPE_MODIFIED,
NAUTILUS_DATE_TYPE_CHANGED,
NAUTILUS_DATE_TYPE_ACCESSED,
NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED
NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED,
NAUTILUS_DATE_TYPE_TRASHED
} NautilusDateType;
typedef struct {
......
......@@ -312,6 +312,15 @@ vfs_file_get_date (NautilusFile *file,
*date = file->details->mtime;
}
return TRUE;
case NAUTILUS_DATE_TYPE_TRASHED:
/* Before we have info on a file, the date is unknown. */
if (file->details->trash_time == 0) {
return FALSE;
}
if (date != NULL) {
*date = file->details->trash_time;
}
return TRUE;
case NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED:
/* Before we have info on a file, the date is unknown. */
if (file->details->mtime == 0 || file->details->ctime == 0) {
......
......@@ -150,6 +150,13 @@ static const SortCriterion sort_criteria[] = {
"Sort by Emblems",
N_("by _Emblems"),
N_("Keep icons sorted by emblems in rows")
},
{
NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
"trashed",
"Sort by Trash Time",
N_("by T_rash Time"),
N_("Keep icons sorted by trash time in rows")
}
};
......@@ -1550,6 +1557,10 @@ static const GtkRadioActionEntry arrange_radio_entries[] = {
N_("By _Emblems"), NULL,
N_("Keep icons sorted by emblems in rows"),
NAUTILUS_FILE_SORT_BY_EMBLEMS },
{ "Sort by Trash Time", NULL,
N_("By T_rash Time"), NULL,
N_("Keep icons sorted by trash time in rows"),
NAUTILUS_FILE_SORT_BY_TRASHED_TIME },
};
static void
......
......@@ -16,6 +16,7 @@
<menuitem name="Sort by Type" action="Sort by Type"/>
<menuitem name="Sort by Modification Date" action="Sort by Modification Date"/>
<menuitem name="Sort by Emblems" action="Sort by Emblems"/>
<menuitem name="Sort by Trash Time" action="Sort by Trash Time"/>
</placeholder>
<separator name="Layout separator"/>
<menuitem name="Tighter Layout" action="Tighter Layout"/>
......@@ -38,6 +39,7 @@
<menuitem name="Sort by Type" action="Sort by Type"/>
<menuitem name="Sort by Modification Date" action="Sort by Modification Date"/>
<menuitem name="Sort by Emblems" action="Sort by Emblems"/>
<menuitem name="Sort by Trash Time" action="Sort by Trash Time"/>
</placeholder>
<separator name="Layout separator"/>
<menuitem name="Tighter Layout" action="Tighter Layout"/>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment