X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fel-home-applet.c;h=3e6c0e32227e75ff41c135767f9536e7062b671f;hb=7b5d6ebb40d378a5e8ebd95e011112c8002c21d2;hp=4f7858e88f85ef4f5c25dffcd5869bdf866f9982;hpb=088a1f2ec81901d20535ba830133329bd29f60bb;p=conv-inbox diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 4f7858e..3e6c0e3 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,7 +52,11 @@ #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 FOOTER_HEIGHT 24 +#define FOOTER_HEIGHT_PRESS 48 /* approx, used only for checking clicks, bigger than controls */ +#define FOOTER_WIDTH C_WIDTH/5 + +#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT) #define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT) #define BOX_RADIOUS 10 @@ -65,6 +69,13 @@ #define NOTIFICATION_UI_DBUS_PATH "/org/freedesktop/Telepathy/Client/NotificationUI" #define NOTIFICATION_UI_DBUS_IFACE "com.nokia.RtcomNotificationUi" +typedef enum { + SELECTED_NONE, + SELECTED_HEADER, + SELECTED_BODY, + SELECTED_FOOTER +} WidgetActiveSelection; + struct _ELHomeAppletPrivate { RTComEl *eventlogger; @@ -80,8 +91,7 @@ struct _ELHomeAppletPrivate gchar *message; gint event_id; - gboolean active_body; - gboolean active_header; + WidgetActiveSelection active; guint unread_count; @@ -221,15 +231,19 @@ draw_text (cairo_t *cr, return result_surface; } -static void +static gboolean stop_scroll_anim (ELHomeAppletPrivate *priv) { - if (priv->scroll_anim_id > 0) { + gboolean result = priv->scroll_anim_id > 0; + + if (result) { g_source_remove (priv->scroll_anim_id); priv->scroll_anim_id = 0; priv->scroll_on_click = FALSE; gtk_widget_hide (priv->cut_message); } + + return result; } static void @@ -266,20 +280,28 @@ style_set_cb (GtkWidget *widget, } static void +reset_scroll (ELHomeApplet *self) +{ + ELHomeAppletPrivate *priv = self->priv; + + if (stop_scroll_anim (self->priv)) { + priv->scroll_on_click = TRUE;/* priv->scroll_offset; */ + priv->scroll_offset = 0; + if (priv->scroll_on_click) + gtk_widget_show (priv->cut_message); + } +} + +static void notify_on_current_desktop (GObject *object, GParamSpec *unused G_GNUC_UNUSED, ELHomeApplet *self) { - ELHomeAppletPrivate *priv = self->priv; gboolean on; g_object_get (object, "is-on-current-desktop", &on, NULL); if (!on) { - stop_scroll_anim (self->priv); - priv->scroll_on_click = priv->scroll_offset; - priv->scroll_offset = 0; - if (priv->scroll_on_click) - gtk_widget_show (priv->cut_message); + reset_scroll (self); gtk_widget_queue_draw (GTK_WIDGET (self)); } } @@ -289,9 +311,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); @@ -327,14 +347,18 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_close_path (cr); - if (priv->active_header) + switch (priv->active) { + case SELECTED_HEADER: cairo_set_source_rgba (cr, priv->active_color.red, priv->active_color.green, priv->active_color.blue, 0.8f); - else + break; + default: cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f); + } + cairo_fill (cr); cairo_move_to (cr, 0, HEADER_HEIGHT); @@ -347,21 +371,26 @@ 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); - if (priv->active_body) { + switch (priv->active) { + case SELECTED_BODY: cairo_pattern_add_color_stop_rgba (grad, 0.5f, priv->active_color.red, @@ -374,58 +403,86 @@ expose_event (GtkWidget *self, GdkEventExpose *event) priv->active_color.green/2, priv->active_color.blue/2, 0.8f); - } - else { + break; + default: cairo_pattern_add_color_stop_rgba (grad, 0.5f, 0.4f, 0.4f, 0.4f, 0.8f); cairo_pattern_add_color_stop_rgba (grad, 1.0f, 0.2f, 0.2f, 0.2f, 0.8f); } + 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); @@ -506,7 +563,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; @@ -550,6 +606,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, @@ -558,12 +615,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); @@ -581,8 +632,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); @@ -615,7 +664,6 @@ resolve_contact (ELHomeApplet *self) self, NULL); osso_abook_roster_start (priv->aggregator); - g_warning ("AGG STARTED"); } } @@ -647,7 +695,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; */ @@ -669,7 +716,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); @@ -689,11 +735,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) { @@ -779,11 +820,14 @@ static void update_unread_label (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - gchar *text; if (priv->unread_count > 0) { - text = g_strdup_printf ("%d", priv->unread_count); - gtk_label_set_text (GTK_LABEL (priv->unread), text); + gchar *text; + text = g_strdup_printf + ("%d*", + priv->unread_count); + + gtk_label_set_markup (GTK_LABEL (priv->unread), text); g_free (text); } else @@ -826,7 +870,6 @@ query_unread_events (RTComEl *el) static void read_event (ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; RTComElIter *it = NULL; @@ -908,7 +951,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, @@ -951,7 +994,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); @@ -1013,7 +1056,6 @@ button_press_event_cb (GtkWidget *widget, GdkEventButton *event, ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; if (priv->event_id > 0) { @@ -1021,10 +1063,14 @@ button_press_event_cb (GtkWidget *widget, if (priv->aggregator && osso_abook_waitable_is_ready (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL)) - priv->active_header = TRUE; + priv->active = SELECTED_HEADER; } + else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT_PRESS) && + event->x < FOOTER_WIDTH) + priv->active = SELECTED_FOOTER; else - priv->active_body = TRUE; + priv->active = SELECTED_BODY; + gtk_widget_queue_draw (widget); } @@ -1058,12 +1104,14 @@ create_temporary_contact_dialog (const gchar *remote_id, { GtkWidget *dialog = NULL; const gchar *vcard = NULL; + McAccount *account = NULL; if (account_id) { vcard = osso_abook_account_manager_get_vcard_field (NULL, account_id); + account = osso_abook_account_manager_lookup_by_name (NULL, account_id); } - if (vcard) { + if (vcard && account) { EVCardAttribute *attribute = e_vcard_attribute_new (NULL, vcard); e_vcard_attribute_add_value (attribute, remote_id); @@ -1071,7 +1119,7 @@ create_temporary_contact_dialog (const gchar *remote_id, (NULL, NULL, /*EBook *book,*/ attribute, - NULL /*McAccount *account*/); + account); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), @@ -1088,29 +1136,16 @@ button_release_event_cb (GtkWidget *widget, ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); - if (priv->active_body) { - priv->active_body = FALSE; - stop_scroll_anim (priv); - if (priv->scroll_on_click) { - priv->scroll_on_click = FALSE; - priv->scroll_anim_id = g_timeout_add (SCROLL_PERIOD, - (GSourceFunc)scroll_anim_cb, - self); - } - else { -#ifndef DEBUG_LAYOUT - /* mark_as_read (self); */ - open_conversation (self); -#endif - } - - gtk_widget_queue_draw (widget); - } - if (priv->active_header) { + switch (priv->active) { + case SELECTED_BODY: + reset_scroll (self); + open_conversation (self); + break; + case SELECTED_HEADER: { GtkWidget *dialog = NULL; - priv->active_header = FALSE; + + reset_scroll (self); if (priv->aggregator && priv->contact_id) dialog = create_contact_starter_dialog @@ -1124,10 +1159,26 @@ button_release_event_cb (GtkWidget *widget, if (dialog) gtk_widget_show (dialog); - - gtk_widget_queue_draw (widget); + } + break; + case SELECTED_FOOTER: + if (priv->scroll_on_click) { + priv->scroll_on_click = FALSE; + priv->scroll_anim_id = g_timeout_add (SCROLL_PERIOD, + (GSourceFunc)scroll_anim_cb, + self); + } + else +#ifndef DEBUG_LAYOUT + mark_as_read (self); +#endif + break; + default:; } + priv->active = SELECTED_NONE; + gtk_widget_queue_draw (widget); + return TRUE; } @@ -1138,17 +1189,18 @@ leave_notify_event_cb (GtkWidget *widget, { ELHomeAppletPrivate *priv = self->priv; - if (priv->active_body) { - priv->active_body = FALSE; - priv->active_header = FALSE; + switch (priv->active) { + case SELECTED_FOOTER: stop_scroll_anim (priv); + /* fall down */ + case SELECTED_HEADER: + case SELECTED_BODY: gtk_widget_queue_draw (widget); - } - if (priv->active_header) { - priv->active_header = FALSE; - gtk_widget_queue_draw (widget); + break; + default:; } + priv->active = SELECTED_NONE; return FALSE; } @@ -1165,13 +1217,9 @@ el_home_applet_init (ELHomeApplet *self) gtk_widget_set_app_paintable (GTK_WIDGET (self), TRUE); priv->unread = gtk_label_new ("12"); - hildon_helper_set_logical_color (priv->unread, - GTK_RC_FG, - 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, */ @@ -1228,7 +1276,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);