[gnome-calendar/wip/flb/weather-forecast: 21/50] weather: steal a data point from tomorrow in case there is none for "today".



commit 75d007e58680c736b2058b3b8a9c4dc16321c92b
Author: Florian Brosch <flo brosch gmail com>
Date:   Sun Oct 15 21:58:57 2017 +0200

    weather: steal a data point from tomorrow in case there is none for "today".
    
    This commit also improves night/day icon selection.

 src/gcal-weather-service.c |   46 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 38 insertions(+), 8 deletions(-)
---
diff --git a/src/gcal-weather-service.c b/src/gcal-weather-service.c
index 7deebb4..ba68420 100644
--- a/src/gcal-weather-service.c
+++ b/src/gcal-weather-service.c
@@ -163,7 +163,8 @@ static gboolean on_timer_timeout                           (GcalWeatherService
 
 static gboolean get_time_day_start                         (GcalWeatherService  *self,
                                                             GDate               *ret_date,
-                                                            gint64              *ret_unix);
+                                                            gint64              *ret_unix,
+                                                            gint64              *ret_unix_exact);
 
 static inline gboolean get_gweather_temperature            (GWeatherInfo        *gwi,
                                                             gdouble             *temp);
@@ -472,8 +473,8 @@ get_icon_name_sortkey (const gchar *icon_name,
   gssize normalized_name_len;
 
   const GcalWeatherIconInfo icons[] =
-    { {"weather-clear",             FALSE},
-      {"weather-few-clouds",        FALSE},
+    { {"weather-clear",             TRUE},
+      {"weather-few-clouds",        TRUE},
       {"weather-overcast",          FALSE},
       {"weather-fog",               FALSE},
       {"weather-showers-scattered", FALSE},
@@ -543,7 +544,8 @@ gwc2str (GWeatherInfo *gwi)
 /* get_time_day_start:
  * @self: The #GcalWeatherService instance.
  * @date: (out) (not nullable): A #GDate that should be set to today.
- * @unix: (out) (not nullable): A UNIX time stamp that should be set to today
+ * @unix: (out) (not nullable): A UNIX time stamp that should be set to today.
+ * @ret_unix_exact (out) (not nullable): The exact date time this data point predicts.
  *
  * Provides current date in two different forms.
  *
@@ -552,7 +554,8 @@ gwc2str (GWeatherInfo *gwi)
 static gboolean
 get_time_day_start (GcalWeatherService *self,
                     GDate              *ret_date,
-                    gint64             *ret_unix)
+                    gint64             *ret_unix,
+                    gint64             *ret_unix_exact)
 {
   g_autoptr (GDateTime) now = NULL;
   g_autoptr (GDateTime) day = NULL;
@@ -561,6 +564,7 @@ get_time_day_start (GcalWeatherService *self,
   g_return_val_if_fail (self != NULL, FALSE);
   g_return_val_if_fail (ret_date != NULL, FALSE);
   g_return_val_if_fail (ret_unix != NULL, FALSE);
+  g_return_val_if_fail (ret_unix_exact != NULL, FALSE);
 
   now = (self->time_zone == NULL)
           ? g_date_time_new_now_local ()
@@ -579,6 +583,7 @@ get_time_day_start (GcalWeatherService *self,
                   g_date_time_get_year (day));
 
   *ret_unix = g_date_time_to_unix (day);
+  *ret_unix_exact = g_date_time_to_unix (now);
   return TRUE;
 }
 
@@ -691,8 +696,8 @@ compute_weather_info_data (GSList    *samples,
           temp_val = temp;
           temp_gwi = gwi;
         }
-  
-      if (gweather_info_is_daytime (gwi))      
+
+      if (gweather_info_is_daytime (gwi))
         has_daytime = TRUE;
     }
 
@@ -732,6 +737,10 @@ preprocess_gweather_reports (GcalWeatherService *self,
   GSList *iter;           /* unowned */
   GDate cur_gdate;
   glong today_unix;
+  glong unix_now;
+
+  GWeatherInfo *first_tomorrow = NULL; /* unowned */
+  glong         first_tomorrow_dtime = -1;
 
   g_return_val_if_fail (GCAL_IS_WEATHER_SERVICE (self), NULL);
 
@@ -749,7 +758,7 @@ preprocess_gweather_reports (GcalWeatherService *self,
   if (self->max_days <= 0)
     return NULL;
 
-  if (!get_time_day_start (self, &cur_gdate, &today_unix))
+  if (!get_time_day_start (self, &cur_gdate, &today_unix, &unix_now))
     return NULL;
 
   days = g_malloc0 (sizeof (GSList*) * self->max_days);
@@ -779,6 +788,12 @@ preprocess_gweather_reports (GcalWeatherService *self,
           bucket = (gwi_dtime - today_unix) / DAY_SECONDS;
           if (bucket >= 0 && bucket < self->max_days)
             days[bucket] = g_slist_prepend (days[bucket], gwi);
+
+          if (bucket == 1 && (first_tomorrow == NULL || first_tomorrow_dtime > gwi_dtime))
+            {
+              first_tomorrow_dtime = gwi_dtime;
+              first_tomorrow = gwi;
+            }
         }
       else
         {
@@ -786,6 +801,21 @@ preprocess_gweather_reports (GcalWeatherService *self,
         }
     }
 
+  if (days[0] == NULL && first_tomorrow != NULL)
+    {
+        /* There is no data point left for today.
+         * Lets borrow one.
+         */
+       glong secs_left_today;
+       glong secs_between;
+
+       secs_left_today = DAY_SECONDS - (unix_now - today_unix);
+       secs_between = first_tomorrow_dtime - unix_now;
+
+       if (secs_left_today < 90*60 && secs_between <= 180*60)
+         days[0] = g_slist_prepend (days[0], first_tomorrow);
+    }
+
   /* Produce GcalWeatherInfo for each bucket: */
   for (int i = 0; i < self->max_days; i++)
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]