diff options
author | Carlos Soriano <csoriano@gnome.org> | 2016-02-01 15:32:29 +0100 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2016-02-03 16:33:55 +0100 |
commit | 543771728fb2a45feffd6f53235e4c4eaac87782 (patch) | |
tree | 6bbfa0fc34ea829add6a2168205a41c01476c0d2 /libnautilus-private | |
parent | eae4f547800077d9530eaeef073e9b78f235ac42 (diff) | |
download | nautilus-543771728fb2a45feffd6f53235e4c4eaac87782.tar.gz |
search: use range of dates
This was not implemented. We want to differenciate between a range of
days we want to search for and a specific date, as set on the mockups.
The calendar selector will be specific dates, whether the days selector
will be a "since".
Also on the way fix various things and code preferences.
Diffstat (limited to 'libnautilus-private')
-rw-r--r-- | libnautilus-private/nautilus-query.c | 65 | ||||
-rw-r--r-- | libnautilus-private/nautilus-query.h | 6 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-engine-model.c | 29 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-engine-simple.c | 23 | ||||
-rw-r--r-- | libnautilus-private/nautilus-search-engine-tracker.c | 32 | ||||
-rw-r--r-- | libnautilus-private/nautilus-ui-utilities.c | 26 | ||||
-rw-r--r-- | libnautilus-private/nautilus-ui-utilities.h | 4 |
7 files changed, 114 insertions, 71 deletions
diff --git a/libnautilus-private/nautilus-query.c b/libnautilus-private/nautilus-query.c index 402667a5d..2912847e2 100644 --- a/libnautilus-private/nautilus-query.c +++ b/libnautilus-private/nautilus-query.c @@ -39,7 +39,7 @@ struct _NautilusQuery { GFile *location; GList *mime_types; gboolean show_hidden; - GDateTime *datetime; + GPtrArray *date_range; NautilusQuerySearchType search_type; NautilusQuerySearchContent search_content; @@ -55,7 +55,7 @@ G_DEFINE_TYPE (NautilusQuery, nautilus_query, G_TYPE_OBJECT); enum { PROP_0, - PROP_DATE, + PROP_DATE_RANGE, PROP_LOCATION, PROP_MIMETYPES, PROP_RECURSIVE, @@ -76,7 +76,7 @@ finalize (GObject *object) g_free (query->text); g_strfreev (query->prepared_words); g_clear_object (&query->location); - g_clear_pointer (&query->datetime, g_date_time_unref); + g_clear_pointer (&query->date_range, g_ptr_array_unref); G_OBJECT_CLASS (nautilus_query_parent_class)->finalize (object); } @@ -90,8 +90,8 @@ nautilus_query_get_property (GObject *object, NautilusQuery *self = NAUTILUS_QUERY (object); switch (prop_id) { - case PROP_DATE: - g_value_set_boxed (value, self->datetime); + case PROP_DATE_RANGE: + g_value_set_pointer (value, self->date_range); break; case PROP_LOCATION: @@ -102,9 +102,9 @@ nautilus_query_get_property (GObject *object, g_value_set_pointer (value, self->mime_types); break; - case PROP_RECURSIVE: - g_value_set_boolean (value, self->recursive); - break; + case PROP_RECURSIVE: + g_value_set_boolean (value, self->recursive); + break; case PROP_SEARCH_TYPE: g_value_set_enum (value, self->search_type); @@ -136,8 +136,8 @@ nautilus_query_set_property (GObject *object, NautilusQuery *self = NAUTILUS_QUERY (object); switch (prop_id) { - case PROP_DATE: - nautilus_query_set_date (self, g_value_get_boxed (value)); + case PROP_DATE_RANGE: + nautilus_query_set_date_range (self, g_value_get_pointer (value)); break; case PROP_LOCATION: @@ -148,9 +148,9 @@ nautilus_query_set_property (GObject *object, nautilus_query_set_mime_types (self, g_value_get_pointer (value)); break; - case PROP_RECURSIVE: - nautilus_query_set_recursive (self, g_value_get_boolean (value)); - break; + case PROP_RECURSIVE: + nautilus_query_set_recursive (self, g_value_get_boolean (value)); + break; case PROP_SEARCH_TYPE: nautilus_query_set_search_type (self, g_value_get_enum (value)); @@ -183,18 +183,17 @@ nautilus_query_class_init (NautilusQueryClass *class) gobject_class->set_property = nautilus_query_set_property; /** - * NautilusQuery::date: + * NautilusQuery::date-range: * - * The initial date of the query. + * The date range of the query. * */ g_object_class_install_property (gobject_class, - PROP_DATE, - g_param_spec_boxed ("date", - "Date of the query", - "The initial date of the query", - G_TYPE_DATE_TIME, - G_PARAM_READWRITE)); + PROP_DATE_RANGE, + g_param_spec_pointer ("date-range", + "Date range of the query", + "The range date of the query", + G_PARAM_READWRITE)); /** * NautilusQuery::location: @@ -507,28 +506,26 @@ nautilus_query_set_search_type (NautilusQuery *query, } } -GDateTime* -nautilus_query_get_date (NautilusQuery *query) +GPtrArray* +nautilus_query_get_date_range (NautilusQuery *query) { g_return_val_if_fail (NAUTILUS_IS_QUERY (query), NULL); - return query->datetime; + return query->date_range; } void -nautilus_query_set_date (NautilusQuery *query, - GDateTime *date) +nautilus_query_set_date_range (NautilusQuery *query, + GPtrArray *date_range) { g_return_if_fail (NAUTILUS_IS_QUERY (query)); - if (query->datetime != date) { - g_clear_pointer (&query->datetime, g_date_time_unref); - if (date) { - query->datetime = g_date_time_ref (date); - } - - g_object_notify (G_OBJECT (query), "date"); + g_clear_pointer (&query->date_range, g_ptr_array_unref); + if (date_range) { + query->date_range = g_ptr_array_ref (date_range); } + + g_object_notify (G_OBJECT (query), "date-range"); } gboolean @@ -585,7 +582,7 @@ nautilus_query_is_empty (NautilusQuery *query) } - if (!query->datetime && + if (!query->date_range && (!query->text || (query->text && query->text[0] == '\0')) && !query->mime_types) { return TRUE; diff --git a/libnautilus-private/nautilus-query.h b/libnautilus-private/nautilus-query.h index b21d4926f..c872ea911 100644 --- a/libnautilus-private/nautilus-query.h +++ b/libnautilus-private/nautilus-query.h @@ -64,9 +64,9 @@ NautilusQuerySearchType nautilus_query_get_search_type (NautilusQuery *query); void nautilus_query_set_search_type (NautilusQuery *query, NautilusQuerySearchType type); -GDateTime* nautilus_query_get_date (NautilusQuery *query); -void nautilus_query_set_date (NautilusQuery *query, - GDateTime *date); +GPtrArray* nautilus_query_get_date_range (NautilusQuery *query); +void nautilus_query_set_date_range (NautilusQuery *query, + GPtrArray *date_range); gboolean nautilus_query_get_recursive (NautilusQuery *query); diff --git a/libnautilus-private/nautilus-search-engine-model.c b/libnautilus-private/nautilus-search-engine-model.c index 7f6d42ea7..8a6b7a265 100644 --- a/libnautilus-private/nautilus-search-engine-model.c +++ b/libnautilus-private/nautilus-search-engine-model.c @@ -129,11 +129,12 @@ model_directory_ready_cb (NautilusDirectory *directory, gdouble match; gboolean found; NautilusSearchHit *hit; - GDateTime *date; + GDateTime *initial_date; + GDateTime *end_date; + GPtrArray *date_range; files = nautilus_directory_get_file_list (directory); mime_types = nautilus_query_get_mime_types (model->details->query); - date = nautilus_query_get_date (model->details->query); hits = NULL; for (l = files; l != NULL; l = l->next) { @@ -155,28 +156,24 @@ model_directory_ready_cb (NautilusDirectory *directory, } } - if (found && date != NULL) { + date_range = nautilus_query_get_date_range (model->details->query); + if (found && date_range != NULL) { NautilusQuerySearchType type; - guint64 query_time, current_file_time; - + guint64 current_file_unix_time; type = nautilus_query_get_search_type (model->details->query); + initial_date = g_ptr_array_index (date_range, 0); + end_date = g_ptr_array_index (date_range, 1); if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) { - current_file_time = nautilus_file_get_atime (file); + current_file_unix_time = nautilus_file_get_atime (file); } else { - current_file_time = nautilus_file_get_mtime (file); + current_file_unix_time = nautilus_file_get_mtime (file); } - - query_time = g_date_time_to_unix (date); - - if (current_file_time == 0) { - /* Silently ignore errors */ - found = FALSE; - } else { - found = (query_time <= current_file_time); - } + found = nautilus_file_date_in_between (current_file_unix_time, + initial_date, + end_date); } if (found) { diff --git a/libnautilus-private/nautilus-search-engine-simple.c b/libnautilus-private/nautilus-search-engine-simple.c index 317b8f16d..e6deed9c1 100644 --- a/libnautilus-private/nautilus-search-engine-simple.c +++ b/libnautilus-private/nautilus-search-engine-simple.c @@ -213,6 +213,10 @@ visit_directory (GFile *dir, SearchThreadData *data) gboolean visited; guint64 atime; guint64 mtime; + GPtrArray *date_range; + GDateTime *initial_date; + GDateTime *end_date; + enumerator = g_file_enumerate_children (dir, data->mime_types != NULL ? @@ -257,11 +261,14 @@ visit_directory (GFile *dir, SearchThreadData *data) mtime = g_file_info_get_attribute_uint64 (info, "time::modified"); atime = g_file_info_get_attribute_uint64 (info, "time::access"); - if (found && nautilus_query_get_date (data->query) != NULL) { + + date_range = nautilus_query_get_date_range (data->query); + if (found && date_range != NULL) { NautilusQuerySearchType type; - guint64 current_file_time, query_time; - GDateTime *date; + guint64 current_file_time; + initial_date = g_ptr_array_index (date_range, 0); + end_date = g_ptr_array_index (date_range, 1); type = nautilus_query_get_search_type (data->query); if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) { @@ -269,13 +276,11 @@ visit_directory (GFile *dir, SearchThreadData *data) } else { current_file_time = mtime; } - - date = nautilus_query_get_date (data->query); - query_time = g_date_time_to_unix (date); - - found = (query_time <= current_file_time); + found = nautilus_file_date_in_between (current_file_time, + initial_date, + end_date); } - + if (found) { NautilusSearchHit *hit; GDateTime *date; diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c index 934805f26..ff0a35120 100644 --- a/libnautilus-private/nautilus-search-engine-tracker.c +++ b/libnautilus-private/nautilus-search-engine-tracker.c @@ -263,7 +263,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider) GList *mimetypes, *l; gint mime_count; gboolean recursive; - GDateTime *date; + GPtrArray *date_range; tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider); @@ -294,8 +294,6 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider) location = nautilus_query_get_location (tracker->details->query); location_uri = location ? g_file_get_uri (location) : NULL; mimetypes = nautilus_query_get_mime_types (tracker->details->query); - date = nautilus_query_get_date (tracker->details->query); - mime_count = g_list_length (mimetypes); sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn) nfo:fileLastModified(?urn) nfo:fileLastAccessed(?urn)\n" @@ -321,22 +319,38 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider) g_string_append_printf (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)), '%s')", search_text); - if (date != NULL) { + date_range = nautilus_query_get_date_range (tracker->details->query); + if (date_range) { NautilusQuerySearchType type; - gchar *date_format; + gchar *initial_date_format; + gchar *end_date_format; + GDateTime *initial_date; + GDateTime *end_date; + GDateTime *shifted_end_date; + + initial_date = g_ptr_array_index (date_range, 0); + end_date = g_ptr_array_index (date_range, 1); + /* As we do for other searches, we want to make the end date inclusive. + * For that, add a day to it */ + shifted_end_date = g_date_time_add_days (end_date, 1); type = nautilus_query_get_search_type (tracker->details->query); - date_format = g_date_time_format (date, "%Y-%m-%dT%H:%M:%S"); + initial_date_format = g_date_time_format (initial_date, "%Y-%m-%dT%H:%M:%S"); + end_date_format = g_date_time_format (shifted_end_date, "%Y-%m-%dT%H:%M:%S"); g_string_append (sparql, " && "); if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) { - g_string_append_printf (sparql, "?atime >= \"%s\"^^xsd:dateTime", date_format); + g_string_append_printf (sparql, "?atime >= \"%s\"^^xsd:dateTime", initial_date_format); + g_string_append_printf (sparql, " && ?atime <= \"%s\"^^xsd:dateTime", end_date_format); } else { - g_string_append_printf (sparql, "?mtime >= \"%s\"^^xsd:dateTime", date_format); + g_string_append_printf (sparql, "?mtime >= \"%s\"^^xsd:dateTime", initial_date_format); + g_string_append_printf (sparql, " && ?mtime <= \"%s\"^^xsd:dateTime", end_date_format); } - g_free (date_format); + + g_free (initial_date_format); + g_free (end_date_format); } if (mime_count > 0) { diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c index e57b157f9..98e07ac0b 100644 --- a/libnautilus-private/nautilus-ui-utilities.c +++ b/libnautilus-private/nautilus-ui-utilities.c @@ -326,3 +326,29 @@ nautilus_ui_frame_video (GdkPixbuf **pixbuf) 1, 1, GDK_INTERP_NEAREST, 255); } } + +gboolean +nautilus_file_date_in_between (guint64 unix_file_time, + GDateTime *initial_date, + GDateTime *end_date) +{ + GDateTime *date; + gboolean in_between; + + /* Silently ignore errors */ + if (unix_file_time == 0) + return FALSE; + + date = g_date_time_new_from_unix_local (unix_file_time); + + /* For the end date, we want to make end_date inclusive, + * for that the difference between the start of the day and the in_between + * has to be more than -1 day + */ + in_between = g_date_time_difference (date, initial_date) > 0 && + g_date_time_difference (end_date, date) / G_TIME_SPAN_DAY > -1; + + g_date_time_unref (date); + + return in_between; +} diff --git a/libnautilus-private/nautilus-ui-utilities.h b/libnautilus-private/nautilus-ui-utilities.h index 283293c70..b7943ed2c 100644 --- a/libnautilus-private/nautilus-ui-utilities.h +++ b/libnautilus-private/nautilus-ui-utilities.h @@ -47,4 +47,8 @@ char * nautilus_escape_action_name (const char *action_na void nautilus_ui_frame_image (GdkPixbuf **pixbuf); void nautilus_ui_frame_video (GdkPixbuf **pixbuf); +gboolean nautilus_file_date_in_between (guint64 file_unix_time, + GDateTime *initial_date, + GDateTime *end_date); + #endif /* NAUTILUS_UI_UTILITIES_H */ |