summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2016-02-01 15:32:29 +0100
committerCarlos Soriano <csoriano@gnome.org>2016-02-03 16:33:55 +0100
commit543771728fb2a45feffd6f53235e4c4eaac87782 (patch)
tree6bbfa0fc34ea829add6a2168205a41c01476c0d2
parenteae4f547800077d9530eaeef073e9b78f235ac42 (diff)
downloadnautilus-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.
-rw-r--r--libnautilus-private/nautilus-query.c65
-rw-r--r--libnautilus-private/nautilus-query.h6
-rw-r--r--libnautilus-private/nautilus-search-engine-model.c29
-rw-r--r--libnautilus-private/nautilus-search-engine-simple.c23
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.c32
-rw-r--r--libnautilus-private/nautilus-ui-utilities.c26
-rw-r--r--libnautilus-private/nautilus-ui-utilities.h4
-rw-r--r--src/nautilus-query-editor.c22
-rw-r--r--src/nautilus-search-popover.c221
9 files changed, 250 insertions, 178 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 */
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c
index 66a6b05c3..57dbc8553 100644
--- a/src/nautilus-query-editor.c
+++ b/src/nautilus-query-editor.c
@@ -365,6 +365,22 @@ search_mode_changed_cb (GObject *editor,
}
static void
+search_popover_date_range_changed_cb (NautilusSearchPopover *popover,
+ GPtrArray *data,
+ NautilusQueryEditor *editor)
+{
+ NautilusQueryEditorPrivate *priv;
+
+ priv = nautilus_query_editor_get_instance_private (NAUTILUS_QUERY_EDITOR (editor));
+ if (!priv->query)
+ create_query (editor);
+
+ nautilus_query_set_date_range (priv->query, data);
+
+ nautilus_query_editor_changed (editor);
+}
+
+static void
search_popover_changed_cb (NautilusSearchPopover *popover,
NautilusSearchFilter filter,
gpointer data,
@@ -377,10 +393,6 @@ search_popover_changed_cb (NautilusSearchPopover *popover,
create_query (editor);
switch (filter) {
- case NAUTILUS_SEARCH_FILTER_DATE:
- nautilus_query_set_date (priv->query, data);
- break;
-
case NAUTILUS_SEARCH_FILTER_TYPE:
nautilus_query_set_mime_types (priv->query, data);
break;
@@ -452,6 +464,8 @@ setup_widgets (NautilusQueryEditor *editor)
G_CALLBACK (nautilus_query_editor_on_stop_search), editor);
g_signal_connect (priv->popover, "changed",
G_CALLBACK (search_popover_changed_cb), editor);
+ g_signal_connect (priv->popover, "date-range",
+ G_CALLBACK (search_popover_date_range_changed_cb), editor);
/* show everything */
gtk_widget_show_all (vbox);
diff --git a/src/nautilus-search-popover.c b/src/nautilus-search-popover.c
index 8a54edad6..ea580b6e3 100644
--- a/src/nautilus-search-popover.c
+++ b/src/nautilus-search-popover.c
@@ -50,7 +50,7 @@ struct _NautilusSearchPopover
const gchar* get_text_for_day (gint days);
static void emit_date_changes_for_day (NautilusSearchPopover *popover,
- gint days);
+ GPtrArray *date_range);
static void show_date_selection_widgets (NautilusSearchPopover *popover,
gboolean visible);
@@ -58,7 +58,7 @@ static void show_date_selection_widgets (NautilusSearch
static void show_other_types_dialog (NautilusSearchPopover *popover);
static void update_date_label (NautilusSearchPopover *popover,
- guint days);
+ GPtrArray *date_range);
G_DEFINE_TYPE (NautilusSearchPopover, nautilus_search_popover, GTK_TYPE_POPOVER)
@@ -70,6 +70,7 @@ enum {
enum {
CHANGED,
+ DATE_RANGE,
LAST_SIGNAL
};
@@ -226,68 +227,52 @@ static void
calendar_day_selected (GtkCalendar *calendar,
NautilusSearchPopover *popover)
{
- GDateTime *now;
- GDateTime *dt;
+ GDateTime *date;
guint year, month, day;
-
- now = g_date_time_new_now_local ();
+ GPtrArray *date_range;
gtk_calendar_get_date (calendar, &year, &month, &day);
- dt = g_date_time_new_local (year, month + 1, day, 0, 0, 0);
-
- if (g_date_time_compare (dt, now) < 1)
- {
- guint days;
+ date = g_date_time_new_local (year, month + 1, day, 0, 0, 0);
- days = g_date_time_difference (now, dt) / G_TIME_SPAN_DAY;
-
- if (days > 0)
- {
- update_date_label (popover, days);
- emit_date_changes_for_day (popover, days);
- }
- }
+ date_range = g_ptr_array_new_full (2, (GDestroyNotify) g_date_time_unref);
+ g_ptr_array_add (date_range, g_date_time_ref (date));
+ g_ptr_array_add (date_range, g_date_time_ref (date));
+ update_date_label (popover, date_range);
+ emit_date_changes_for_day (popover, date_range);
- g_date_time_unref (now);
- g_date_time_unref (dt);
+ g_ptr_array_unref (date_range);
+ g_date_time_unref (date);
}
+/* Range on dates are partially implemented. For now just use it for differentation
+ * between a exact day or a range of a first day until now.
+ */
static void
setup_date (NautilusSearchPopover *popover,
NautilusQuery *query)
{
- GDateTime *dt;
- GDateTime *now;
-
- now = g_date_time_new_now_local ();
- dt = nautilus_query_get_date (query);
-
- /* Update date */
- if (dt && g_date_time_compare (dt, now) < 1)
- {
- guint days;
+ GPtrArray *date_range;
+ GDateTime *date_initial;
- days = g_date_time_difference (now, dt) / G_TIME_SPAN_DAY;
+ date_range = nautilus_query_get_date_range (query);
- if (days > 0)
- {
- g_signal_handlers_block_by_func (popover->calendar, calendar_day_selected, popover);
+ if (date_range) {
+ date_initial = g_ptr_array_index (date_range, 0);
- gtk_calendar_select_month (GTK_CALENDAR (popover->calendar),
- g_date_time_get_month (dt) - 1,
- g_date_time_get_year (dt));
+ g_signal_handlers_block_by_func (popover->calendar, calendar_day_selected, popover);
- gtk_calendar_select_day (GTK_CALENDAR (popover->calendar),
- g_date_time_get_day_of_month (dt));
+ gtk_calendar_select_month (GTK_CALENDAR (popover->calendar),
+ g_date_time_get_month (date_initial) - 1,
+ g_date_time_get_year (date_initial));
- update_date_label (popover, days);
+ gtk_calendar_select_day (GTK_CALENDAR (popover->calendar),
+ g_date_time_get_day_of_month (date_initial));
- g_signal_handlers_unblock_by_func (popover->calendar, calendar_day_selected, popover);
- }
- }
+ update_date_label (popover, date_range);
- g_clear_pointer (&now, g_date_time_unref);
+ g_signal_handlers_unblock_by_func (popover->calendar, calendar_day_selected, popover);
+ }
}
static void
@@ -352,8 +337,7 @@ date_entry_activate (GtkEntry *entry,
if (gtk_entry_get_text_length (entry) > 0)
{
GDateTime *now;
- GDateTime *dt;
- guint days;
+ GDateTime *date_time;
GDate *date;
date = g_date_new ();
@@ -367,7 +351,7 @@ date_entry_activate (GtkEntry *entry,
}
now = g_date_time_new_now_local ();
- dt = g_date_time_new_local (g_date_get_year (date),
+ date_time = g_date_time_new_local (g_date_get_year (date),
g_date_get_month (date),
g_date_get_day (date),
0,
@@ -375,19 +359,22 @@ date_entry_activate (GtkEntry *entry,
0);
/* Future dates also silently fails */
- if (g_date_time_compare (dt, now) != 1)
+ if (g_date_time_compare (date_time, now) != 1)
{
- days = g_date_time_difference (now, dt) / G_TIME_SPAN_DAY;
- if (days > 0)
- {
- update_date_label (popover, days);
- show_date_selection_widgets (popover, FALSE);
- emit_date_changes_for_day (popover, days);
- }
+ GPtrArray *date_range;
+
+ date_range = g_ptr_array_new_full (2, (GDestroyNotify) g_date_time_unref);
+ g_ptr_array_add (date_range, g_date_time_ref (date_time));
+ g_ptr_array_add (date_range, g_date_time_ref (date_time));
+ update_date_label (popover, date_range);
+ show_date_selection_widgets (popover, FALSE);
+ emit_date_changes_for_day (popover, date_range);
+
+ g_ptr_array_unref (date_range);
}
g_date_time_unref (now);
- g_date_time_unref (dt);
+ g_date_time_unref (date_time);
g_date_free (date);
}
}
@@ -397,13 +384,25 @@ dates_listbox_row_activated (GtkListBox *listbox,
GtkListBoxRow *row,
NautilusSearchPopover *popover)
{
- gint days;
-
- days = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "days"));
+ GDateTime *date;
+ GDateTime *now;
+ GPtrArray *date_range = NULL;
- update_date_label (popover, days);
+ now = g_date_time_new_now_local ();
+ date = g_object_get_data (G_OBJECT (row), "date");
+ if (date)
+ {
+ date_range = g_ptr_array_new_full (2, (GDestroyNotify) g_date_time_unref);
+ g_ptr_array_add (date_range, g_date_time_ref (date));
+ g_ptr_array_add (date_range, g_date_time_ref (now));
+ }
+ update_date_label (popover, date_range);
show_date_selection_widgets (popover, FALSE);
- emit_date_changes_for_day (popover, days);
+ emit_date_changes_for_day (popover, date_range);
+
+ if (date_range)
+ g_ptr_array_unref (date_range);
+ g_date_time_unref (now);
}
static void
@@ -569,25 +568,9 @@ create_row_for_label (const gchar *text,
static void
emit_date_changes_for_day (NautilusSearchPopover *popover,
- gint days)
+ GPtrArray *date_range)
{
- GDateTime *dt;
-
- dt = NULL;
-
- if (days > 0)
- {
- GDateTime *now;
-
- now = g_date_time_new_now_local ();
- dt = g_date_time_add_days (now, -days);
-
- g_date_time_unref (now);
- }
-
- g_signal_emit (popover, signals[CHANGED], 0, NAUTILUS_SEARCH_FILTER_DATE, dt);
-
- g_clear_pointer (&dt, g_date_time_unref);
+ g_signal_emit_by_name (popover, "date-range", date_range, NULL);
}
static void
@@ -595,6 +578,7 @@ fill_fuzzy_dates_listbox (NautilusSearchPopover *popover)
{
GDateTime *maximum_dt, *now;
GtkWidget *row;
+ GDateTime *current_date;
gint days, max_days;
days = 0;
@@ -602,6 +586,7 @@ fill_fuzzy_dates_listbox (NautilusSearchPopover *popover)
maximum_dt = g_date_time_new_from_unix_local (0);
now = g_date_time_new_now_local ();
max_days = (g_date_time_get_year (now) - g_date_time_get_year (maximum_dt)) * 365;
+ current_date = g_date_time_new_now_local ();
/* This is a tricky loop. The main intention here is that each
* timeslice (day, week, month) have 2 or 3 entries. Years,
@@ -650,12 +635,21 @@ fill_fuzzy_dates_listbox (NautilusSearchPopover *popover)
label = g_strdup_printf (get_text_for_day (days), normalized);
- g_object_set_data (G_OBJECT (row), "days", GINT_TO_POINTER (days));
row = create_row_for_label (label, normalized == 1);
+ if (days != 0)
+ {
+ current_date = g_date_time_add_days (now, -days);
+ g_object_set_data (G_OBJECT (row), "date", g_date_time_ref (current_date));
+ }
+ else
+ {
+ g_object_set_data (G_OBJECT (row), "date", NULL);
+ }
gtk_container_add (GTK_CONTAINER (popover->dates_listbox), row);
g_free (label);
+ g_date_time_unref (current_date);
days += step;
}
@@ -836,38 +830,49 @@ show_other_types_dialog (NautilusSearchPopover *popover)
static void
update_date_label (NautilusSearchPopover *popover,
- guint days)
+ GPtrArray *date_range)
{
- if (days > 0)
+ if (date_range)
{
+ gint days;
+ GDateTime *initial_date;
+ GDateTime *end_date;
GDateTime *now;
- GDateTime *dt;
gchar *formatted_date;
gchar *label;
- guint n;
+ guint normalized;
- if (days < 7)
- {
- n = days;
- }
- else if (days < 30)
- {
- n = days / 7;
- }
- else if (days < 365)
+ now = g_date_time_new_now_local ();
+ initial_date = g_ptr_array_index (date_range, 0);
+ end_date = g_ptr_array_index (date_range, 1);
+ days = g_date_time_difference (end_date, initial_date) / G_TIME_SPAN_DAY;
+ formatted_date = g_date_time_format (initial_date, "%x");
+
+ if (days < 1)
{
- n = days / 30;
+ label = g_strdup (formatted_date);
}
else
{
- n = days / 365;
- }
-
- label = g_strdup_printf (get_text_for_day (days), n);
+ if (days < 7)
+ {
+ normalized = days;
+ }
+ else if (days < 30)
+ {
+ normalized = days / 7;
+ }
+ else if (days < 365)
+ {
+ normalized = days / 30;
+ }
+ else
+ {
+ normalized = days / 365;
+ }
- now = g_date_time_new_now_local ();
- dt = g_date_time_add_days (now, -days);
- formatted_date = g_date_time_format (dt, "%x");
+ label = g_strdup_printf (get_text_for_day (days), normalized);
+ }
gtk_entry_set_text (GTK_ENTRY (popover->date_entry), formatted_date);
@@ -875,7 +880,6 @@ update_date_label (NautilusSearchPopover *popover,
gtk_label_set_label (GTK_LABEL (popover->select_date_button_label), label);
g_date_time_unref (now);
- g_date_time_unref (dt);
g_free (formatted_date);
g_free (label);
}
@@ -985,6 +989,17 @@ nautilus_search_popover_class_init (NautilusSearchPopoverClass *klass)
NAUTILUS_TYPE_SEARCH_FILTER,
G_TYPE_POINTER);
+ signals[DATE_RANGE] = g_signal_new ("date-range",
+ NAUTILUS_TYPE_SEARCH_POPOVER,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+
/**
* NautilusSearchPopover::query:
*