]> Pileus Git - ~andy/gtk/commitdiff
Add infrastructure for GtkCalendar details. (#339540)
authorMathias Hasselmann <hasselmm@src.gnome.org>
Thu, 27 Dec 2007 20:41:08 +0000 (20:41 +0000)
committerMathias Hasselmann <hasselmm@src.gnome.org>
Thu, 27 Dec 2007 20:41:08 +0000 (20:41 +0000)
* gtk/gtkcalendar.c, gtk/gtkcalendar.h, gtk/gtk.symbols:
Add "detail-width-chars" and "detail-height-rows" properties,
and gtk_calendar_set_detail_func function.

svn path=/trunk/; revision=19251

ChangeLog
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gtk/gtk.symbols
gtk/gtkcalendar.c
gtk/gtkcalendar.h

index 45889a81851692fcb196448024ccdded8a8a4b9f..b10c42fec9926ba1b1319fa9051cb395ec882522 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-12-27  Mathias Hasselmann  <mathias@openismus.com>
+
+       Add infrastructure for GtkCalendar details. (#339540)
+
+       * gtk/gtkcalendar.c, gtk/gtkcalendar.h, gtk/gtk.symbols:
+       Add "detail-width-chars" and "detail-height-rows" properties,
+       and gtk_calendar_set_detail_func function.
+
 2007-12-27  Xan Lopez  <xan@gnome.org>
 
        * gtk/gtk.symbols: 
index ee848683e234230c7a65c54709bbf4ff3a8e7b52..b4f0c7ad32ed749d9a00920831269652dba987c8 100644 (file)
@@ -1,3 +1,7 @@
+2007-12-27  Mathias Hasselmann  <mathias@openismus.com>
+
+       * reference/gtk/gtk-sections.txt: Add new GtkCalendar symbols.
+
 2007-12-27  Xan Lopez  <xan@gnome.org>
 
        * gtk/gtk-sections.txt: Add gtk_border_new
index cc0051a1175ee3b89890011e94deba3c861da656..ffcb73527336227bcc79ce5ee705270ccd7f3839 100644 (file)
@@ -547,19 +547,34 @@ gtk_button_get_type
 <FILE>gtkcalendar</FILE>
 <TITLE>GtkCalendar</TITLE>
 GtkCalendar
+GtkCalendarDetailFunc
 GtkCalendarDisplayOptions
+
+<SUBSECTION>
 gtk_calendar_new
 gtk_calendar_select_month
 gtk_calendar_select_day
 gtk_calendar_mark_day
 gtk_calendar_unmark_day
 gtk_calendar_clear_marks
+
+<SUBSECTION>
 gtk_calendar_get_display_options
 gtk_calendar_set_display_options
-gtk_calendar_display_options
 gtk_calendar_get_date
+
+<SUBSECTION>
+gtk_calendar_set_detail_func
+gtk_calendar_get_detail_width_chars
+gtk_calendar_set_detail_width_chars
+gtk_calendar_get_detail_height_rows
+gtk_calendar_set_detail_height_rows
+
+<SUBSECTION>
+gtk_calendar_display_options
 gtk_calendar_freeze
 gtk_calendar_thaw
+
 <SUBSECTION Standard>
 GTK_CALENDAR
 GTK_IS_CALENDAR
index 71e1fb9b0b82498d26003d7b5a1220c967f8857b..f5de63591440d205f07c22eb987878036964aa10 100644 (file)
@@ -512,12 +512,17 @@ gtk_calendar_thaw
 #endif
 gtk_calendar_clear_marks
 gtk_calendar_get_date
+gtk_calendar_get_detail_height_rows
+gtk_calendar_get_detail_width_chars
 gtk_calendar_get_display_options
 gtk_calendar_get_type G_GNUC_CONST
 gtk_calendar_mark_day
 gtk_calendar_new
 gtk_calendar_select_day
 gtk_calendar_select_month
+gtk_calendar_set_detail_func
+gtk_calendar_set_detail_height_rows
+gtk_calendar_set_detail_width_chars
 gtk_calendar_set_display_options
 gtk_calendar_unmark_day
 #endif
index e5b11ae6dfe568d130fe4ac0c57b25ba7026c612..315713d2d8719d9a1316344c571a41f7cc538941 100644 (file)
@@ -232,6 +232,8 @@ enum
   PROP_SHOW_DAY_NAMES,
   PROP_NO_MONTH_CHANGE,
   PROP_SHOW_WEEK_NUMBERS,
+  PROP_DETAIL_WIDTH_CHARS,
+  PROP_DETAIL_HEIGHT_ROWS,
   PROP_LAST
 };
 
@@ -280,6 +282,15 @@ struct _GtkCalendarPrivate
 
   gint drag_start_x;
   gint drag_start_y;
+
+  /* Optional callback, used to display extra information for each day. */
+  GtkCalendarDetailFunc detail_func;
+  gpointer              detail_func_user_data;
+  GDestroyNotify        detail_func_destroy;
+
+  /* Size requistion for details provided by the hook. */
+  gint detail_height_rows;
+  gint detail_width_chars;
 };
 
 #define GTK_CALENDAR_GET_PRIVATE(widget)  (GTK_CALENDAR (widget)->priv)
@@ -492,6 +503,38 @@ gtk_calendar_class_init (GtkCalendarClass *class)
                                                         FALSE,
                                                         GTK_PARAM_READWRITE));
 
+/**
+ * GtkCalendar:detail-width-chars:
+ *
+ * Width of a detail cell, in characters.
+ * A value of 0 allows any width. See gtk_calendar_set_detail_func().
+ *
+ * Since: 2.16
+ */
+  g_object_class_install_property (gobject_class,
+                                   PROP_DETAIL_WIDTH_CHARS,
+                                   g_param_spec_int ("detail-width-chars",
+                                                    P_("Details Width"),
+                                                    P_("Details width in characters"),
+                                                    0, 127, 0,
+                                                    GTK_PARAM_READWRITE));
+
+/**
+ * GtkCalendar:detail-height-rows:
+ *
+ * Height of a detail cell, in rows.
+ * A value of 0 allows any width. See gtk_calendar_set_detail_func().
+ *
+ * Since: 2.16
+ */
+  g_object_class_install_property (gobject_class,
+                                   PROP_DETAIL_HEIGHT_ROWS,
+                                   g_param_spec_int ("detail-height-rows",
+                                                    P_("Details Height"),
+                                                    P_("Details height in rows"),
+                                                    0, 127, 0,
+                                                    GTK_PARAM_READWRITE));
+
   gtk_calendar_signals[MONTH_CHANGED_SIGNAL] =
     g_signal_new (I_("month_changed"),
                  G_OBJECT_CLASS_TYPE (gobject_class),
@@ -1148,8 +1191,18 @@ gtk_calendar_finalize (GObject *object)
 static void
 gtk_calendar_destroy (GtkObject *object)
 {
+  GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (object);
+
   calendar_stop_spinning (GTK_CALENDAR (object));
   
+  /* Call the destroy function for the extra display callback: */
+  if (priv->detail_func_destroy && priv->detail_func_user_data)
+    {
+      priv->detail_func_destroy (priv->detail_func_user_data);
+      priv->detail_func_user_data = NULL;
+      priv->detail_func_destroy = NULL;
+    }
+
   GTK_OBJECT_CLASS (gtk_calendar_parent_class)->destroy (object);
 }
 
@@ -1220,6 +1273,14 @@ gtk_calendar_set_property (GObject      *object,
                                   GTK_CALENDAR_SHOW_WEEK_NUMBERS,
                                   g_value_get_boolean (value));
       break;
+    case PROP_DETAIL_WIDTH_CHARS:
+      gtk_calendar_set_detail_width_chars (calendar,
+                                           g_value_get_int (value));
+      break;
+    case PROP_DETAIL_HEIGHT_ROWS:
+      gtk_calendar_set_detail_height_rows (calendar,
+                                           g_value_get_int (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1232,9 +1293,8 @@ gtk_calendar_get_property (GObject      *object,
                           GValue       *value,
                           GParamSpec   *pspec)
 {
-  GtkCalendar *calendar;
-
-  calendar = GTK_CALENDAR (object);
+  GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (object);
+  GtkCalendar *calendar = GTK_CALENDAR (object);
 
   switch (prop_id) 
     {
@@ -1263,6 +1323,12 @@ gtk_calendar_get_property (GObject      *object,
       g_value_set_boolean (value, calendar_get_display_option (calendar,
                                                               GTK_CALENDAR_SHOW_WEEK_NUMBERS));
       break;
+    case PROP_DETAIL_WIDTH_CHARS:
+      g_value_set_int (value, priv->detail_width_chars);
+      break;
+    case PROP_DETAIL_HEIGHT_ROWS:
+      g_value_set_int (value, priv->detail_height_rows);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -3488,6 +3554,142 @@ gtk_calendar_get_date (GtkCalendar *calendar,
     *day = calendar->selected_day;
 }
 
+/**
+ * gtk_calendar_set_detail_func:
+ * @calendar: a #GtkCalendar.
+ * @func: a function providing details for each day.
+ * @data: data to pass to @func invokations.
+ * @destroy: a function for releasing @data.
+ *
+ * Installs a function which provides Pango markup with detail information
+ * for each day. Examples for such details are holidays or appointments. That
+ * information is shown below each day when #GtkCalendar:show-details is set.
+ * A tooltip containing with full detail information is provided, if the entire
+ * text should not fit into the details area, or if #GtkCalendar:show-details
+ * is not set.
+ *
+ * The size of the details area can be restricted by setting the
+ * #GtkCalendar:detail-width-chars and #GtkCalendar:detail-height-rows
+ * properties.
+ *
+ * Since: 2.16
+ */
+void
+gtk_calendar_set_detail_func (GtkCalendar           *calendar,
+                              GtkCalendarDetailFunc  func,
+                              gpointer               data,
+                              GDestroyNotify         destroy)
+{
+  GtkCalendarPrivate *priv;
+
+  g_return_if_fail (GTK_IS_CALENDAR (calendar));
+
+  priv = GTK_CALENDAR_GET_PRIVATE (calendar);
+
+  if (priv->detail_func_destroy)
+    priv->detail_func_destroy (priv->detail_func_user_data);
+
+  priv->detail_func = func;
+  priv->detail_func_user_data = data;
+  priv->detail_func_destroy = destroy;
+
+  gtk_widget_set_has_tooltip (GTK_WIDGET (calendar),
+                              NULL != priv->detail_func);
+  gtk_widget_queue_resize (GTK_WIDGET (calendar));
+}
+
+/**
+ * gtk_calendar_set_detail_width_chars:
+ * @calendar: a #GtkCalendar.
+ * @chars: detail width in characters.
+ *
+ * Updates the width of detail cells.
+ * See #GtkCalendar:detail-width-chars.
+ *
+ * Since: 2.16
+ */
+void
+gtk_calendar_set_detail_width_chars (GtkCalendar *calendar,
+                                     gint         chars)
+{
+  GtkCalendarPrivate *priv;
+
+  g_return_if_fail (GTK_IS_CALENDAR (calendar));
+
+  priv = GTK_CALENDAR_GET_PRIVATE (calendar);
+
+  if (chars != priv->detail_width_chars)
+    {
+      priv->detail_width_chars = chars;
+      g_object_notify (G_OBJECT (calendar), "detail-width-chars");
+      gtk_widget_queue_resize_no_redraw (GTK_WIDGET (calendar));
+    }
+}
+
+/**
+ * gtk_calendar_set_detail_height_rows:
+ * @calendar: a #GtkCalendar.
+ * @rows: detail height in rows.
+ *
+ * Updates the height of detail cells.
+ * See #GtkCalendar:detail-height-rows.
+ *
+ * Since: 2.16
+ */
+void
+gtk_calendar_set_detail_height_rows (GtkCalendar *calendar,
+                                     gint         rows)
+{
+  GtkCalendarPrivate *priv;
+
+  g_return_if_fail (GTK_IS_CALENDAR (calendar));
+
+  priv = GTK_CALENDAR_GET_PRIVATE (calendar);
+
+  if (rows != priv->detail_height_rows)
+    {
+      priv->detail_height_rows = rows;
+      g_object_notify (G_OBJECT (calendar), "detail-height-rows");
+      gtk_widget_queue_resize_no_redraw (GTK_WIDGET (calendar));
+    }
+}
+
+/**
+ * gtk_calendar_get_detail_width_chars:
+ * @calendar: a #GtkCalendar.
+ *
+ * Queries the width of detail cells, in characters.
+ * See #GtkCalendar:detail-width-chars.
+ *
+ * Since: 2.16
+ *
+ * Return value: The width of detail cells, in characters.
+ */
+gint
+gtk_calendar_get_detail_width_chars (GtkCalendar *calendar)
+{
+  g_return_val_if_fail (GTK_IS_CALENDAR (calendar), 0);
+  return GTK_CALENDAR_GET_PRIVATE (calendar)->detail_width_chars;
+}
+
+/**
+ * gtk_calendar_get_detail_height_rows:
+ * @calendar: a #GtkCalendar.
+ *
+ * Queries the height of detail cells, in rows.
+ * See #GtkCalendar:detail-width-chars.
+ *
+ * Since: 2.16
+ *
+ * Return value: The height of detail cells, in rows.
+ */
+gint
+gtk_calendar_get_detail_height_rows (GtkCalendar *calendar)
+{
+  g_return_val_if_fail (GTK_IS_CALENDAR (calendar), 0);
+  return GTK_CALENDAR_GET_PRIVATE (calendar)->detail_height_rows;
+}
+
 /**
  * gtk_calendar_freeze:
  * @calendar: a #GtkCalendar
index 3115e0ee0a6ab8b24cd0b2964e6dd3130a7239c1..c6a0afbd4a49c28c51eb054ff9ae202013a84caa 100644 (file)
@@ -60,6 +60,28 @@ typedef enum
   GTK_CALENDAR_WEEK_START_MONDAY       = 1 << 4
 } GtkCalendarDisplayOptions;
 
+/**
+ * GtkCalendarDetailFunc:
+ * @calendar: a #GtkCalendar.
+ * @year: the year for which details are needed.
+ * @month: the month for which details are needed.
+ * @day: the day of @month for which details are needed.
+ * @user_data: the data passed with gtk_calendar_set_detail_func().
+ *
+ * This kind of functions provide Pango markup with detail information for the
+ * specified day. Examples for such details are holidays or appointments. The
+ * function returns %NULL when no information is available.
+ *
+ * Since: 2.16
+ *
+ * Return value: Pango markup with details for the specified day, or %NULL.
+ */
+typedef G_CONST_RETURN gchar* (*GtkCalendarDetailFunc) (GtkCalendar *calendar,
+                                                        guint        year,
+                                                        guint        month,
+                                                        guint        day,
+                                                        gpointer     user_data);
+
 struct _GtkCalendar
 {
   GtkWidget widget;
@@ -143,6 +165,20 @@ void          gtk_calendar_get_date        (GtkCalendar *calendar,
                                         guint       *year,
                                         guint       *month,
                                         guint       *day);
+
+void       gtk_calendar_set_detail_func (GtkCalendar           *calendar,
+                                         GtkCalendarDetailFunc  func,
+                                         gpointer               data,
+                                         GDestroyNotify         destroy);
+
+void       gtk_calendar_set_detail_width_chars (GtkCalendar    *calendar,
+                                                gint            chars);
+void       gtk_calendar_set_detail_height_rows (GtkCalendar    *calendar,
+                                                gint            rows);
+
+gint       gtk_calendar_get_detail_width_chars (GtkCalendar    *calendar);
+gint       gtk_calendar_get_detail_height_rows (GtkCalendar    *calendar);
+
 #ifndef GTK_DISABLE_DEPRECATED
 void      gtk_calendar_freeze          (GtkCalendar *calendar);
 void      gtk_calendar_thaw            (GtkCalendar *calendar);