From f32995882871ce0ecc0939b7842dc8171f91cc82 Mon Sep 17 00:00:00 2001 From: Artem Garmash Date: Wed, 13 Jan 2010 18:20:56 +0200 Subject: [PATCH] Draw footer unread button --- src/el-home-applet.c | 177 +++++++++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 81 deletions(-) diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 0a4d62f..8b3dc98 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -43,7 +43,7 @@ EL_TYPE_HOME_APPLET, ELHomeAppletPrivate)) #define BOX_WIDTH 352 -#define BOX_HEIGHT 276 +#define BOX_HEIGHT 284 #define CONTENT_OFFSET_X HILDON_MARGIN_HALF #define CONTENT_OFFSET_Y_TOP 4*HILDON_MARGIN_HALF @@ -52,10 +52,12 @@ #define C_HEIGHT (BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM)) #define HEADER_HEIGHT 48 -#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT) -#define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT) +#define FOOTER_HEIGHT 24 +#define FOOTER_HEIGHT_PRESS 48 /* approx, used only for checking clicks, bigger than controls */ +#define FOOTER_WIDTH C_WIDTH/4 -#define FOOTER_HEIGHT 26 /* approx, used only for checking clicks, bigger than controls */ +#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT) +#define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT) #define BOX_RADIOUS 10 @@ -297,9 +299,7 @@ expose_event (GtkWidget *self, GdkEventExpose *event) { ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; cairo_t *cr; - int message_height; - - message_height = C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT; + cairo_pattern_t *grad; cr = gdk_cairo_create (self->window); gdk_cairo_region (cr, event->region); @@ -359,19 +359,23 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_stroke (cr); /* draw body */ - cairo_move_to (cr, 0, HEADER_HEIGHT); - cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); - cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); - cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT); - cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS); - cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); - cairo_line_to (cr, 0, HEADER_HEIGHT); - cairo_close_path (cr); + if (!priv->message) { + cairo_move_to (cr, 0, HEADER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); + cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); + cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT); + cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS); + cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); + cairo_line_to (cr, 0, HEADER_HEIGHT); + cairo_close_path (cr); + } + else + cairo_rectangle (cr, 0, HEADER_HEIGHT, + C_WIDTH, MESSAGE_HEIGHT); /* draw body filling depending on (in)active state */ - cairo_pattern_t *grad; grad = cairo_pattern_create_linear (0, HEADER_HEIGHT, - 0, C_HEIGHT); + 0, C_HEIGHT - FOOTER_HEIGHT); switch (priv->active) { case SELECTED_BODY: @@ -398,48 +402,75 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_set_source (cr, grad); cairo_fill (cr); - /* cairo_set_source_rgba (cr, red, green, blue, 1.0f); */ - /* cairo_translate (cr, -CONTENT_OFFSET_X, -C_Y); */ - /* rounded_rectangle (cr, */ - /* CONTENT_OFFSET_X, */ - /* C_Y, */ - /* BOX_WIDTH - 2*CONTENT_OFFSET_X, */ - /* BOX_HEIGHT - 2*C_Y, */ - /* BOX_RADIOUS); */ - /* cairo_close_path (cr); */ - /* cairo_stroke (cr); */ - - /* draw message */ - if (!priv->message_surface) { - gint height; - - priv->message_surface = draw_text (cr, - priv->font_desc, - priv->message, - MESSAGE_WIDTH, - &height); - - priv->hidden_message_height = height - message_height; - priv->scroll_on_click = priv->hidden_message_height > 0; - if (priv->scroll_on_click) - gtk_widget_show (priv->cut_message); - } + cairo_pattern_destroy (grad); - cairo_rectangle (cr, - 2*CONTENT_OFFSET_X, - TEXT_Y_OFFSET, - MESSAGE_WIDTH, - message_height); - cairo_clip (cr); + if (priv->message) { + /* draw footer unread part bg */ + cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); + cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); + cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT); + cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); + cairo_close_path (cr); + + /* draw body filling depending on (in)active state */ + switch (priv->active) { + case SELECTED_FOOTER: + cairo_set_source_rgba (cr, + priv->active_color.red, + priv->active_color.green, + priv->active_color.blue, + 0.8f); + break; + default: + cairo_set_source_rgba (cr, 0.1f, 0.1f, 0.1f, 0.9f); + } + cairo_fill (cr); - cairo_set_source_surface (cr, - priv->message_surface, - 2*CONTENT_OFFSET_X, - TEXT_Y_OFFSET - priv->scroll_offset); - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_paint (cr); + /* draw footer received part bg */ + cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); + cairo_rel_line_to (cr, 0, FOOTER_HEIGHT); + cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0); + cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS); + cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS)); + cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0); + cairo_close_path (cr); + + cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f); + cairo_fill (cr); + + /* draw message */ + if (!priv->message_surface) { + gint height; + + priv->message_surface = draw_text (cr, + priv->font_desc, + priv->message, + MESSAGE_WIDTH, + &height); + + priv->hidden_message_height = height - MESSAGE_HEIGHT; + priv->scroll_on_click = priv->hidden_message_height > 0; + if (priv->scroll_on_click) + gtk_widget_show (priv->cut_message); + } + + cairo_rectangle (cr, + 2*CONTENT_OFFSET_X, + TEXT_Y_OFFSET, + MESSAGE_WIDTH, + MESSAGE_HEIGHT); + cairo_clip (cr); + + cairo_set_source_surface (cr, + priv->message_surface, + 2*CONTENT_OFFSET_X, + TEXT_Y_OFFSET - priv->scroll_offset); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); + } - cairo_pattern_destroy (grad); cairo_destroy (cr); return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event); @@ -520,7 +551,6 @@ aggregator_ready_cb (OssoABookWaitable *waitable, const GError *error, gpointer userdata) { - g_warning (G_STRFUNC); ELHomeApplet *self = EL_HOME_APPLET(userdata); ELHomeAppletPrivate *priv = self->priv; GList *contacts = NULL; @@ -564,6 +594,7 @@ aggregator_ready_cb (OssoABookWaitable *waitable, priv->contact = g_object_ref (OSSO_ABOOK_CONTACT (contacts->data)); gtk_label_set_text (GTK_LABEL (priv->sender), osso_abook_contact_get_display_name (priv->contact)); + avatar_image = osso_abook_avatar_get_image_rounded (OSSO_ABOOK_AVATAR (priv->contact), HILDON_ICON_PIXEL_SIZE_THUMB, @@ -572,11 +603,6 @@ aggregator_ready_cb (OssoABookWaitable *waitable, -1, priv->border_color); - g_warning ("contact's name %s\nid=%s\npid=%s", - osso_abook_contact_get_display_name (priv->contact), - osso_abook_contact_get_uid (priv->contact), - osso_abook_contact_get_persistent_uid (priv->contact)); - if (avatar_image) { gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar), avatar_image); @@ -594,8 +620,6 @@ resolve_contact (ELHomeApplet *self) EBookQuery *query = NULL; GError *error = NULL; - g_warning ("%s %s %s %s", G_STRFUNC, priv->contact_id, priv->local_id, priv->remote_id); - if (priv->local_id && priv->remote_id) { const gchar *vcard = osso_abook_account_manager_get_vcard_field (NULL, priv->local_id); @@ -628,7 +652,6 @@ resolve_contact (ELHomeApplet *self) self, NULL); osso_abook_roster_start (priv->aggregator); - g_warning ("AGG STARTED"); } } @@ -660,7 +683,6 @@ static void show_event (ELHomeApplet *self, RTComElIter *it) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); gchar *remote = NULL; gchar *received = NULL; /* const gchar *icon_name = NULL; */ @@ -682,7 +704,6 @@ show_event (ELHomeApplet *self, RTComElIter *it) rtcom_el_iter_dup_string (it, "remote-ebook-uid", &priv->contact_id); rtcom_el_iter_dup_string (it, "local-uid", &priv->local_id); - g_warning ("abook uid %s", priv->contact_id); } else if (priv->remote_id) { g_free (priv->remote_id); @@ -702,11 +723,6 @@ show_event (ELHomeApplet *self, RTComElIter *it) priv->event_id = -1; } - g_warning ("event_id=%d\nremote-uid=%s\nremote_name=%s", - priv->event_id, - priv->remote_id, - remote); - gtk_widget_hide (priv->avatar); if (priv->message) { @@ -839,7 +855,6 @@ query_unread_events (RTComEl *el) static void read_event (ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; RTComElIter *it = NULL; @@ -921,7 +936,7 @@ static void mark_as_read (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); + if (priv->event_id >= 0) { rtcom_el_set_read_event (priv->eventlogger, priv->event_id, @@ -964,7 +979,7 @@ static gboolean read_new_event (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); + read_event (self); priv->unread_count = query_unread_events (priv->eventlogger); update_unread_label (self); @@ -1026,7 +1041,6 @@ button_press_event_cb (GtkWidget *widget, GdkEventButton *event, ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; if (priv->event_id > 0) { @@ -1038,7 +1052,8 @@ button_press_event_cb (GtkWidget *widget, (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL)) priv->active = SELECTED_HEADER; } - else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT)) + else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT_PRESS) && + event->x < FOOTER_WIDTH) priv->active = SELECTED_FOOTER; else priv->active = SELECTED_BODY; @@ -1106,7 +1121,6 @@ button_release_event_cb (GtkWidget *widget, ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); switch (priv->active) { case SELECTED_BODY: @@ -1166,6 +1180,7 @@ leave_notify_event_cb (GtkWidget *widget, gtk_widget_queue_draw (widget); break; case SELECTED_HEADER: + case SELECTED_FOOTER: gtk_widget_queue_draw (widget); break; default:; @@ -1193,8 +1208,8 @@ el_home_applet_init (ELHomeApplet *self) GTK_STATE_NORMAL, "ActiveTextColor"); gtk_misc_set_alignment (GTK_MISC (priv->unread), - 1.0f, - 1.0f); + 0.0f, + 0.5f); hildon_helper_set_logical_font (priv->unread, "SmallSystemFont"); /* gtk_widget_set_size_request (priv->unread, */ /* -1, */ @@ -1251,7 +1266,7 @@ el_home_applet_init (ELHomeApplet *self) gtk_box_pack_start (GTK_BOX (hbox), priv->sender, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->avatar, FALSE, FALSE, 0); - footer = gtk_hbox_new (FALSE, 0); + footer = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT); gtk_box_pack_start (GTK_BOX (footer), priv->unread, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (footer), priv->cut_message, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (footer), priv->received, FALSE, FALSE, 0); -- 1.7.9.5