r1370 - trunk/src/target/OM-2007/applications/openmoko-today/src

dodji at sita.openmoko.org dodji at sita.openmoko.org
Thu Mar 15 12:53:00 CET 2007


Author: dodji
Date: 2007-03-15 12:52:57 +0100 (Thu, 15 Mar 2007)
New Revision: 1370

Modified:
   trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.c
   trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.h
Log:
Expose meaning signals, support on demand page switching

	* src/today-events-area.c,h: expose signals
	  event-added, event-selected, page-switched.
	  Make the internals use these.
          added today_events_area_switch_to_prev_page() and
	  today_events_area_switch_to_next_page().


Modified: trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.c	2007-03-15 11:08:51 UTC (rev 1369)
+++ trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.c	2007-03-15 11:52:57 UTC (rev 1370)
@@ -1,3 +1,5 @@
+/* vi:set sw=2: */
+
 /*
  *  Today - At a glance view of date, time, calender events, todo items and
  *  other images.
@@ -45,6 +47,16 @@
   int nb_events ;
 };
 
+enum TodayEventsAreaSignals
+{
+  EVENTS_ADDED_SIGNAL,
+  EVENT_SELECTED_SIGNAL,
+  PAGE_SWITCHED_SIGNAL,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] ;
+
 static void     today_events_area_finalize  (GObject *a_obj);
 static void     today_events_area_init      (TodayEventsArea *a_this);
 static void     clear_right_hand_side       (TodayEventsArea *a_this);
@@ -63,7 +75,8 @@
 static void     render_events_page_auto     (TodayEventsArea *a_this) ;
 static void     e_cal_component_list_free   (GList * list) ;
 static gchar*   icaltime_to_pretty_string   (const icaltimetype *timetype) ;
-static int      get_list_elem_index         (GList *a_elem) ;
+static void     event_selected_signal       (TodayEventsArea *a_this,
+                                             guint a_index) ;
 
 G_DEFINE_TYPE (TodayEventsArea, today_events_area, GTK_TYPE_TABLE)
 
@@ -75,6 +88,38 @@
   object_class = G_OBJECT_CLASS (a_class);
   object_class->finalize = today_events_area_finalize;
   g_type_class_add_private (object_class, sizeof (TodayEventsAreaPrivate));
+
+  a_class->event_selected = event_selected_signal ;
+
+  signals[EVENTS_ADDED_SIGNAL] =
+    g_signal_new ("event-added",
+                  TODAY_TYPE_EVENTS_AREA,
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (TodayEventsAreaClass, events_added),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__POINTER,
+                  G_TYPE_NONE,
+                  1, G_TYPE_POINTER) ;
+
+  signals[EVENT_SELECTED_SIGNAL] =
+    g_signal_new ("event-selected",
+                   TODAY_TYPE_EVENTS_AREA,
+                   G_SIGNAL_RUN_FIRST,
+                   G_STRUCT_OFFSET (TodayEventsAreaClass, event_selected),
+                   NULL, NULL,
+                   g_cclosure_marshal_VOID__UINT,
+                   G_TYPE_NONE,
+                   1, G_TYPE_UINT) ;
+
+  signals[PAGE_SWITCHED_SIGNAL] =
+    g_signal_new ("page-switched",
+                  TODAY_TYPE_EVENTS_AREA,
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (TodayEventsAreaClass, page_switched),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__UINT,
+                  G_TYPE_NONE,
+                  1, G_TYPE_UINT) ;
 }
 
 static void
@@ -123,7 +168,7 @@
     if (a_event_box) {/*keep compiler happy*/}
 
     if (a_button->type == GDK_BUTTON_PRESS)
-      today_events_area_select_next_event (a_area) ;
+      today_events_area_switch_to_next_page (a_area) ;
 
     return FALSE ;
 }
@@ -134,7 +179,6 @@
                                   TodayEventsArea *a_area)
 {
   int event_index = 0 ;
-  GList *event_elem = NULL ;
 
   g_return_val_if_fail (a_area && TODAY_IS_EVENTS_AREA (a_area), FALSE) ;
 
@@ -143,8 +187,9 @@
 
   event_index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (a_event_box),
                                                     "event-index")) ;
-  event_elem = g_list_nth (a_area->priv->events, event_index) ;
-  select_event (a_area, event_elem) ;
+  g_return_val_if_fail (event_index >= 0, FALSE) ;
+  g_signal_emit (G_OBJECT (a_area),
+                 signals[EVENT_SELECTED_SIGNAL], 0, event_index) ;
 
   return FALSE;
 }
@@ -157,6 +202,19 @@
  * <private api>
  **********************/
 
+static void
+event_selected_signal (TodayEventsArea *a_this,
+                       guint a_index)
+{
+  GList *elem ;
+
+  g_return_if_fail (a_this && TODAY_IS_EVENTS_AREA (a_this)
+                    && a_this->priv) ;
+
+  elem = g_list_nth (a_this->priv->events, a_index) ;
+  select_event (a_this, elem) ;
+}
+
 /**
  * e_cal_component_list_free:
  * @list: the list ECalComooment to free
@@ -327,12 +385,18 @@
   {
     return NULL ;
   }
-  event_index = get_list_elem_index (a_event) ;
+  event_index = g_list_position (a_this->priv->events,
+                                 a_event) ;
   g_return_val_if_fail (event_index >= 0, NULL) ;
 
   a_this->priv->cur_event = a_event ;
   a_this->priv->cur_event_index = event_index ;
 
+  /*
+   * if the index of the current event is out of the range of the
+   * currently visible page, move the range of the page and re-render the
+   * page so that the current event becomes visible
+   */
   if ((a_this->priv->page_start_index + a_this->priv->max_visible_events
       <= a_this->priv->cur_event_index)
       ||
@@ -341,6 +405,7 @@
     render_events_page_auto (a_this) ;
   }
 
+  /*update the left hand side page info label*/
   update_paging_info (a_this) ;
 
   return a_event;
@@ -388,18 +453,6 @@
     return result ;
 }
 
-static int
-get_list_elem_index (GList *a_elem)
-{
-  int nb = -1 ;
-  GList *cur = NULL ;
-
-  for (cur = a_elem ; cur ; cur = cur->prev)
-    ++nb ;
-
-  return nb ;
-}
-
 static void
 render_event (TodayEventsArea *a_this,
               GList *a_event)
@@ -423,7 +476,7 @@
 
   event = a_event->data ;
   g_return_if_fail (E_IS_CAL_COMPONENT (event)) ;
-  event_index = get_list_elem_index (a_event) ;
+  event_index = g_list_position (a_this->priv->events, a_event) ;
   g_return_if_fail (event_index >= 0) ;
 
   /*get the event summary*/
@@ -461,6 +514,7 @@
 {
   GList *cur = NULL ;
   int nb_rendered = 0 ;
+  int prev_page_start_index = 0 ;
 
   g_return_if_fail (a_this
                     && TODAY_IS_EVENTS_AREA (a_this)
@@ -471,6 +525,8 @@
   if (!a_this->priv->events)
     return ;
 
+  prev_page_start_index = a_this->priv->page_start_index ;
+
   if (a_from)
   {
     a_this->priv->page_start = a_from ;
@@ -482,7 +538,7 @@
   g_return_if_fail (a_this->priv->page_start) ;
 
   a_this->priv->page_start_index =
-    get_list_elem_index (a_this->priv->page_start) ;
+    g_list_position (a_this->priv->events, a_this->priv->page_start) ;
 
   init_right_hand_side (a_this) ;
   for (cur = a_this->priv->page_start ;
@@ -491,14 +547,24 @@
   {
     render_event (a_this, cur) ;
   }
+
+  /*if we rendered a new page, tell the world about it*/
+  if (a_this->priv->page_start_index != prev_page_start_index)
+  {
+    int page_num = (a_this->priv->page_start_index+1) %
+                      a_this->priv->max_visible_events ;
+    g_signal_emit (G_OBJECT (a_this), signals[PAGE_SWITCHED_SIGNAL], 0,
+                   page_num) ;
+  }
 }
 
 static void
 render_events_page_auto (TodayEventsArea *a_this)
 {
-  int page_end=0 ;
-  int page_start=0 ;
+  int page_end = 0 ;
+  int page_start = 0 ;
   GList *from = NULL ;
+
   g_return_if_fail (a_this
                     && TODAY_IS_EVENTS_AREA (a_this)
                     && a_this->priv) ;
@@ -527,6 +593,7 @@
     }
   }
 
+  /*now we have a decent page range. We can just render the page*/
   from = g_list_nth (a_this->priv->events, page_start) ;
   g_return_if_fail (from) ;
   render_events_page (a_this, from) ;
@@ -631,6 +698,25 @@
 }
 
 ECalComponent*
+today_events_area_get_event_from_index (TodayEventsArea *a_this,
+                                        int a_index)
+{
+  GList *elem ;
+  g_return_val_if_fail (a_this &&
+                        TODAY_IS_EVENTS_AREA (a_this) &&
+                        a_this->priv,
+                        NULL);
+  g_return_val_if_fail (a_this->priv->events, NULL) ;
+
+  elem = g_list_nth (a_this->priv->events, a_index) ;
+  if (elem)
+  {
+    return elem->data ;
+  }
+  return NULL ;
+}
+
+ECalComponent*
 today_events_area_select_next_event (TodayEventsArea *a_this)
 {
   GList *result = NULL ;
@@ -669,28 +755,6 @@
   return result->data ;
 }
 
-ECalComponent*
-today_events_area_goto_next_page (TodayEventsArea *a_this)
-{
-  int start_index = 0 ;
-  GList *page_start = NULL, *event = NULL;
-
-  g_return_val_if_fail (a_this &&
-                        TODAY_IS_EVENTS_AREA (a_this) &&
-                        a_this->priv,
-                        NULL);
-
-  start_index = get_list_elem_index (a_this->priv->page_start) ;
-  start_index += a_this->priv->max_visible_events ;
-  page_start = g_list_nth (a_this->priv->events, start_index) ;
-  if (!page_start)
-    page_start = a_this->priv->events ;
-  event = select_event (a_this, page_start) ;
-  if (!event)
-    return NULL ;
-  return event->data ;
-}
-
 void
 today_events_area_set_max_visible_events (TodayEventsArea *a_this,
                                           int a_max)
@@ -713,6 +777,57 @@
   return a_this->priv->max_visible_events ;
 }
 
+void
+today_events_area_switch_to_next_page (TodayEventsArea *a_this)
+{
+  GList *event_elem ;
+  int event_index ;
+
+  g_return_if_fail (a_this &&
+                    TODAY_IS_EVENTS_AREA (a_this) &&
+                    a_this->priv);
+  g_return_if_fail (a_this->priv->events) ;
+
+  if (a_this->priv->nb_events <= a_this->priv->max_visible_events)
+    return ;
+
+  event_index = a_this->priv->cur_event_index ;
+  event_index += a_this->priv->max_visible_events ;
+
+  event_elem = g_list_nth (a_this->priv->events, event_index) ;
+  if (!event_elem)
+    event_elem = a_this->priv->events ;
+
+  select_event (a_this, event_elem) ;
+}
+
+void
+today_events_area_switch_to_prev_page (TodayEventsArea *a_this)
+{
+  GList *event_elem ;
+  int event_index ;
+
+  g_return_if_fail (a_this &&
+                    TODAY_IS_EVENTS_AREA (a_this) &&
+                    a_this->priv);
+  g_return_if_fail (a_this->priv->events) ;
+
+  if (a_this->priv->nb_events <= a_this->priv->max_visible_events)
+    return ;
+
+  event_index = a_this->priv->cur_event_index ;
+  if (event_index > a_this->priv->max_visible_events)
+    event_index -= a_this->priv->max_visible_events ;
+  else
+    event_index = a_this->priv->nb_events - a_this->priv->max_visible_events-1;
+  event_index = MAX (event_index, 0) ;
+
+  event_elem = g_list_nth (a_this->priv->events, event_index) ;
+  g_return_if_fail (event_elem) ;
+
+  select_event (a_this, event_elem) ;
+}
+
 /**********************
  * </public api>
  **********************/

Modified: trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.h	2007-03-15 11:08:51 UTC (rev 1369)
+++ trunk/src/target/OM-2007/applications/openmoko-today/src/today-events-area.h	2007-03-15 11:52:57 UTC (rev 1370)
@@ -1,3 +1,5 @@
+/* vi:set sw=2: */
+
 /*
  *  Today - At a glance view of date, time, calender events, todo items and
  *  other images.
@@ -47,23 +49,34 @@
 
 struct _TodayEventsAreaClass {
   GtkTableClass parent_class;
+
+  /*
+   * <noticeable events>
+   */
+  void (*events_added) (TodayEventsArea *self, GList *events) ;
+  void (*event_selected) (TodayEventsArea *self, guint event_index) ;
+  void (*page_switched) (TodayEventsArea *self, guint page_index) ;
+  /*
+   * </noticeable events>
+   */
 };
 
 GType          today_events_area_get_type (void);
 GtkWidget*     today_events_area_new ();
-void           today_events_area_set_events (TodayEventsArea *a_this,
+void           today_events_area_set_events (TodayEventsArea *self,
                                              GList *a_events);
-GList*         today_events_area_get_events (TodayEventsArea *a_this);
-int            today_events_area_get_nb_events (TodayEventsArea *a_this);
-ECalComponent* today_events_area_get_cur_event (TodayEventsArea *a_this);
-int            today_events_area_get_cur_event_index (TodayEventsArea *a_this);
-ECalComponent* today_events_area_select_next_event (TodayEventsArea *a_this) ;
-ECalComponent* today_events_area_goto_next_page (TodayEventsArea *a_this) ;
-void           today_events_area_set_max_visible_events
-                                                    (TodayEventsArea *a_this,
-                                                     int a_max) ;
-int            today_events_area_get_max_visible_events
-                                                    (TodayEventsArea *a_this) ;
+GList*         today_events_area_get_events (TodayEventsArea *self);
+int            today_events_area_get_nb_events (TodayEventsArea *self);
+ECalComponent* today_events_area_get_cur_event (TodayEventsArea *self);
+int            today_events_area_get_cur_event_index (TodayEventsArea *self);
+ECalComponent* today_events_area_get_event_from_index (TodayEventsArea *self,
+                                                       int index) ;
+ECalComponent* today_events_area_select_next_event (TodayEventsArea *self) ;
+void           today_events_area_set_max_visible_events (TodayEventsArea *self,
+                                                         int max) ;
+int            today_events_area_get_max_visible_events (TodayEventsArea *self);
+void           today_events_area_switch_to_next_page (TodayEventsArea *self) ;
+void           today_events_area_switch_to_prev_page (TodayEventsArea *self) ;
 
 G_END_DECLS
 





More information about the commitlog mailing list