Add hildon_banner_show_custom_widget()
authorClaudio Saavedra <csaavedra@igalia.com>
Tue, 22 Sep 2009 12:14:40 +0000 (15:14 +0300)
committerClaudio Saavedra <csaavedra@igalia.com>
Wed, 23 Sep 2009 06:59:11 +0000 (09:59 +0300)
* doc/hildon-sections.txt: Add hildon_banner_show_custom_widget()
* examples/hildon-banner-example.c: (area_expose),
(custom_widget_new), (on_progress_idle): New example showing a custom widget.
* hildon/hildon-banner.c:
* hildon/hildon-banner.h: Add hildon_banner_show_custom_widget().

Fixes: NB#140140 (Allow custom widgets to be used in banners)

ChangeLog
doc/hildon-sections.txt
examples/hildon-banner-example.c
hildon/hildon-banner.c
hildon/hildon-banner.h

index de7f517..ea87822 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-09-23  Claudio Saavedra  <csaavedra@igalia.com>
+
+       * doc/hildon-sections.txt: Add hildon_banner_show_custom_widget()
+       * examples/hildon-banner-example.c: (area_expose),
+       (custom_widget_new), (on_progress_idle): New example showing a custom widget.
+       * hildon/hildon-banner.c:
+       * hildon/hildon-banner.h: Add hildon_banner_show_custom_widget().
+
+       Fixes: NB#140140 (Allow custom widgets to be used in banners)
+
 2009-09-18  Claudio Saavedra  <csaavedra@igalia.com>
 
        * examples/hildon-banner-example.c:
index 91d97a3..7f09abb 100644 (file)
@@ -611,6 +611,7 @@ hildon_banner_show_information_with_markup
 hildon_banner_show_information_override_dnd
 hildon_banner_show_animation
 hildon_banner_show_progress
+hildon_banner_show_custom_widget
 hildon_banner_set_text
 hildon_banner_set_markup
 hildon_banner_set_fraction
index a61158d..1d0b5aa 100644 (file)
  */
 
 #include                                        <hildon/hildon.h>
+#include                                        <cairo.h>
+
+static gboolean
+area_expose                                     (GtkWidget      *widget,
+                                                 GdkEventExpose *expose,
+                                                 gpointer        data)
+{
+    cairo_t *cr = gdk_cairo_create (GDK_DRAWABLE (widget->window));
+    gint width, height, x, y;
+    GError *error = NULL;
+
+    GdkPixbuf *pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+                                                  "statusarea_volumelevel2",
+                                                  HILDON_ICON_PIXEL_SIZE_STYLUS,
+                                                  0, &error);
+
+    gint v_margins = 15;
+    gint h_margins = 100;
+    gdouble fill_level = 0.4;
+
+    width = widget->allocation.width;
+    height = widget->allocation.height;
+    x = widget->allocation.x;
+    y = widget->allocation.y;
+
+    cairo_rectangle (cr, x + h_margins, y + v_margins,
+                     (width - 2 * h_margins)*fill_level,
+                     height - 2 * v_margins);
+    cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
+    cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+    cairo_fill (cr);
+
+    cairo_rectangle (cr, x + h_margins, y + v_margins,
+                     width - 2 * h_margins,
+                     height - 2 * v_margins);
+
+    cairo_set_line_width (cr, 2);
+    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+    cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+    cairo_stroke (cr);
+
+    gdk_cairo_set_source_pixbuf (cr, pixbuf, x,
+                                 y + (height - gdk_pixbuf_get_height (pixbuf))/2);
+    cairo_paint (cr);
+
+    cairo_destroy (cr);
+    g_object_unref (pixbuf);
+    return FALSE;
+}
+
+static GtkWidget *
+custom_widget_new (void)
+{
+    GtkWidget *area = gtk_event_box_new ();
+    GTK_WIDGET_SET_FLAGS (area, GTK_NO_WINDOW);
+    gtk_widget_set_size_request (area, 600, 50);
+    g_signal_connect (area, "expose-event",
+                      G_CALLBACK (area_expose),
+                      NULL);
+    return area;
+}
 
 #ifndef HILDON_DISABLE_DEPRECATED
 
@@ -71,6 +132,13 @@ on_progress_clicked                             (GtkWidget *widget)
 
 #endif
 
+static void
+on_custom_clicked                             (GtkWidget *widget)
+{
+    GtkWidget *custom_widget = custom_widget_new ();
+    hildon_banner_show_custom_widget (widget, custom_widget);
+}
+
 int
 main                                            (int argc,
                                                  char **argv)
@@ -80,6 +148,7 @@ main                                            (int argc,
 #ifndef HILDON_DISABLE_DEPRECATED
     GtkWidget *button2, *button3;
 #endif
+    GtkWidget *button4;
 
     hildon_gtk_init (&argc, &argv);
 
@@ -97,6 +166,8 @@ main                                            (int argc,
     button3 = gtk_button_new_with_label ("Progress");
     g_signal_connect (button3, "clicked", G_CALLBACK (on_progress_clicked), NULL);
 #endif
+    button4 = gtk_button_new_with_label ("Custom");
+    g_signal_connect (button4, "clicked", G_CALLBACK (on_custom_clicked), NULL);
 
     vbox = gtk_vbox_new (6, FALSE);
     gtk_box_pack_start (GTK_BOX (vbox), button1, TRUE, TRUE, 0);
@@ -104,6 +175,7 @@ main                                            (int argc,
     gtk_box_pack_start (GTK_BOX (vbox), button2, TRUE, TRUE, 0);
     gtk_box_pack_start (GTK_BOX (vbox), button3, TRUE, TRUE, 0);
 #endif
+    gtk_box_pack_start (GTK_BOX (vbox), button4, TRUE, TRUE, 0);
 
     gtk_container_set_border_width (GTK_CONTAINER (window), 6);
     gtk_container_add (GTK_CONTAINER (window), vbox);
index 25151a4..0b57497 100644 (file)
@@ -1172,6 +1172,59 @@ hildon_banner_show_progress                     (GtkWidget *widget,
     return GTK_WIDGET (banner);   
 }
 
+
+/**
+ * hildon_banner_show_custom_widget:
+ * @widget: the #GtkWidget that wants to display a banner
+ * @custom_widget: a #GtkWidget to be placed inside the banner.
+ *
+ * Shows a banner displaying a user-defined widget.
+ *
+ * Returns: a new #HildonBanner
+ *
+ * Since: 2.2
+ **/
+GtkWidget *
+hildon_banner_show_custom_widget                (GtkWidget *widget,
+                                                 GtkWidget *custom_widget)
+{
+    HildonBanner *banner;
+    HildonBannerPrivate *priv;
+
+    g_return_val_if_fail (GTK_IS_WIDGET (custom_widget), NULL);
+
+    banner = hildon_banner_get_instance_for_widget (widget, TRUE);
+    priv = HILDON_BANNER_GET_PRIVATE (banner);
+    g_assert (priv);
+
+    g_return_val_if_fail (gtk_widget_get_parent (custom_widget) == NULL ||
+                          priv->main_item == custom_widget, NULL);
+
+    if (priv->main_item != custom_widget) {
+        GtkWidget *old_item = priv->main_item;
+
+        /* Remove old item */
+        if (old_item) {
+            g_object_ref (old_item);
+            gtk_container_remove (GTK_CONTAINER (priv->layout), old_item);
+        }
+
+        /* Add new item */
+        gtk_box_pack_start (GTK_BOX (priv->layout), custom_widget, FALSE, FALSE, 0);
+        priv->main_item = custom_widget;
+
+        if (old_item)
+            g_object_unref (old_item);
+    }
+
+    priv->name_suffix = "information";
+    hildon_banner_bind_style (banner);
+
+    reshow_banner (banner);
+
+    return GTK_WIDGET (banner);
+}
+
 /**
  * hildon_banner_set_text:
  * @self: a #HildonBanner widget
index 25eb607..d461efa 100644 (file)
@@ -115,6 +115,10 @@ void
 hildon_banner_set_timeout                       (HildonBanner *self,
                                                  guint timeout);
 
+GtkWidget *
+hildon_banner_show_custom_widget                (GtkWidget *widget,
+                                                 GtkWidget *custom_widget);
+
 G_END_DECLS
 
 #endif                                          /* __HILDON_BANNER_H__ */